2024-04-12 22:00:57 +03:00
|
|
|
from __future__ import annotations
|
|
|
|
|
2024-07-08 23:49:38 +03:00
|
|
|
import re
|
2024-09-13 00:00:44 +03:00
|
|
|
import random
|
|
|
|
import string
|
2024-10-11 09:41:23 +03:00
|
|
|
import json
|
2024-09-05 09:58:28 +03:00
|
|
|
from aiohttp import ClientSession
|
2024-04-12 22:00:57 +03:00
|
|
|
|
2024-05-19 00:13:57 +03:00
|
|
|
from ..typing import AsyncResult, Messages, ImageType
|
2024-09-12 23:20:02 +03:00
|
|
|
from ..image import ImageResponse, to_data_uri
|
2024-07-08 23:49:38 +03:00
|
|
|
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
|
2024-04-12 22:00:57 +03:00
|
|
|
|
2024-07-08 23:49:38 +03:00
|
|
|
class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
|
2024-04-12 22:00:57 +03:00
|
|
|
url = "https://www.blackbox.ai"
|
2024-09-12 23:20:02 +03:00
|
|
|
api_endpoint = "https://www.blackbox.ai/api/chat"
|
2024-04-12 22:00:57 +03:00
|
|
|
working = True
|
2024-09-12 23:20:02 +03:00
|
|
|
supports_stream = True
|
|
|
|
supports_system_message = True
|
|
|
|
supports_message_history = True
|
2024-10-12 22:56:06 +03:00
|
|
|
|
2024-10-11 09:41:23 +03:00
|
|
|
default_model = 'blackboxai'
|
2024-10-15 12:36:08 +03:00
|
|
|
image_models = ['ImageGeneration']
|
2024-08-29 09:03:32 +03:00
|
|
|
models = [
|
2024-10-11 09:41:23 +03:00
|
|
|
default_model,
|
|
|
|
'blackboxai-pro',
|
2024-08-29 09:03:32 +03:00
|
|
|
"llama-3.1-8b",
|
|
|
|
'llama-3.1-70b',
|
2024-10-03 13:25:56 +03:00
|
|
|
'llama-3.1-405b',
|
2024-10-03 01:03:05 +03:00
|
|
|
'gpt-4o',
|
|
|
|
'gemini-pro',
|
2024-10-11 09:41:23 +03:00
|
|
|
'gemini-1.5-flash',
|
2024-10-03 01:03:05 +03:00
|
|
|
'claude-sonnet-3.5',
|
2024-10-11 09:41:23 +03:00
|
|
|
'PythonAgent',
|
|
|
|
'JavaAgent',
|
|
|
|
'JavaScriptAgent',
|
|
|
|
'HTMLAgent',
|
|
|
|
'GoogleCloudAgent',
|
|
|
|
'AndroidDeveloper',
|
|
|
|
'SwiftDeveloper',
|
|
|
|
'Next.jsAgent',
|
|
|
|
'MongoDBAgent',
|
|
|
|
'PyTorchAgent',
|
|
|
|
'ReactAgent',
|
|
|
|
'XcodeAgent',
|
|
|
|
'AngularJSAgent',
|
2024-10-15 12:36:08 +03:00
|
|
|
*image_models,
|
2024-08-29 09:03:32 +03:00
|
|
|
]
|
2024-09-24 13:23:53 +03:00
|
|
|
|
|
|
|
agentMode = {
|
2024-10-11 09:41:23 +03:00
|
|
|
'ImageGeneration': {'mode': True, 'id': "ImageGenerationLV45LJp", 'name': "Image Generation"},
|
2024-09-24 13:23:53 +03:00
|
|
|
}
|
2024-09-05 09:58:28 +03:00
|
|
|
|
2024-09-24 13:23:53 +03:00
|
|
|
trendingAgentMode = {
|
2024-10-11 09:41:23 +03:00
|
|
|
"blackboxai": {},
|
2024-09-05 09:58:28 +03:00
|
|
|
"gemini-1.5-flash": {'mode': True, 'id': 'Gemini'},
|
|
|
|
"llama-3.1-8b": {'mode': True, 'id': "llama-3.1-8b"},
|
|
|
|
'llama-3.1-70b': {'mode': True, 'id': "llama-3.1-70b"},
|
2024-10-03 13:25:56 +03:00
|
|
|
'llama-3.1-405b': {'mode': True, 'id': "llama-3.1-405b"},
|
2024-10-11 09:41:23 +03:00
|
|
|
'blackboxai-pro': {'mode': True, 'id': "BLACKBOXAI-PRO"},
|
|
|
|
'PythonAgent': {'mode': True, 'id': "Python Agent"},
|
|
|
|
'JavaAgent': {'mode': True, 'id': "Java Agent"},
|
|
|
|
'JavaScriptAgent': {'mode': True, 'id': "JavaScript Agent"},
|
|
|
|
'HTMLAgent': {'mode': True, 'id': "HTML Agent"},
|
|
|
|
'GoogleCloudAgent': {'mode': True, 'id': "Google Cloud Agent"},
|
|
|
|
'AndroidDeveloper': {'mode': True, 'id': "Android Developer"},
|
|
|
|
'SwiftDeveloper': {'mode': True, 'id': "Swift Developer"},
|
|
|
|
'Next.jsAgent': {'mode': True, 'id': "Next.js Agent"},
|
|
|
|
'MongoDBAgent': {'mode': True, 'id': "MongoDB Agent"},
|
|
|
|
'PyTorchAgent': {'mode': True, 'id': "PyTorch Agent"},
|
|
|
|
'ReactAgent': {'mode': True, 'id': "React Agent"},
|
|
|
|
'XcodeAgent': {'mode': True, 'id': "Xcode Agent"},
|
|
|
|
'AngularJSAgent': {'mode': True, 'id': "AngularJS Agent"},
|
2024-09-24 13:23:53 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
userSelectedModel = {
|
2024-10-03 01:03:05 +03:00
|
|
|
"gpt-4o": "gpt-4o",
|
|
|
|
"gemini-pro": "gemini-pro",
|
|
|
|
'claude-sonnet-3.5': "claude-sonnet-3.5",
|
2024-10-11 09:41:23 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
model_prefixes = {
|
|
|
|
'gpt-4o': '@GPT-4o',
|
|
|
|
'gemini-pro': '@Gemini-PRO',
|
|
|
|
'claude-sonnet-3.5': '@Claude-Sonnet-3.5',
|
|
|
|
'PythonAgent': '@Python Agent',
|
|
|
|
'JavaAgent': '@Java Agent',
|
2024-10-12 22:56:06 +03:00
|
|
|
'JavaScriptAgent': '@JavaScript Agent',
|
2024-10-11 09:41:23 +03:00
|
|
|
'HTMLAgent': '@HTML Agent',
|
|
|
|
'GoogleCloudAgent': '@Google Cloud Agent',
|
|
|
|
'AndroidDeveloper': '@Android Developer',
|
|
|
|
'SwiftDeveloper': '@Swift Developer',
|
|
|
|
'Next.jsAgent': '@Next.js Agent',
|
|
|
|
'MongoDBAgent': '@MongoDB Agent',
|
|
|
|
'PyTorchAgent': '@PyTorch Agent',
|
|
|
|
'ReactAgent': '@React Agent',
|
|
|
|
'XcodeAgent': '@Xcode Agent',
|
|
|
|
'AngularJSAgent': '@AngularJS Agent',
|
|
|
|
'blackboxai-pro': '@BLACKBOXAI-PRO',
|
|
|
|
'ImageGeneration': '@Image Generation',
|
|
|
|
}
|
|
|
|
|
|
|
|
model_referers = {
|
|
|
|
"blackboxai": f"{url}/?model=blackboxai",
|
|
|
|
"gpt-4o": f"{url}/?model=gpt-4o",
|
|
|
|
"gemini-pro": f"{url}/?model=gemini-pro",
|
|
|
|
"claude-sonnet-3.5": f"{url}/?model=claude-sonnet-3.5"
|
2024-10-03 01:03:05 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
model_aliases = {
|
|
|
|
"gemini-flash": "gemini-1.5-flash",
|
2024-10-11 09:41:23 +03:00
|
|
|
"claude-3.5-sonnet": "claude-sonnet-3.5",
|
|
|
|
"flux": "ImageGeneration",
|
2024-09-05 09:58:28 +03:00
|
|
|
}
|
|
|
|
|
2024-08-31 09:47:39 +03:00
|
|
|
@classmethod
|
|
|
|
def get_model(cls, model: str) -> str:
|
|
|
|
if model in cls.models:
|
|
|
|
return model
|
2024-09-24 13:23:53 +03:00
|
|
|
elif model in cls.userSelectedModel:
|
|
|
|
return model
|
2024-08-31 09:47:39 +03:00
|
|
|
elif model in cls.model_aliases:
|
|
|
|
return cls.model_aliases[model]
|
|
|
|
else:
|
|
|
|
return cls.default_model
|
|
|
|
|
2024-04-12 22:00:57 +03:00
|
|
|
@classmethod
|
|
|
|
async def create_async_generator(
|
|
|
|
cls,
|
|
|
|
model: str,
|
|
|
|
messages: Messages,
|
2024-09-12 23:20:02 +03:00
|
|
|
proxy: str = None,
|
|
|
|
image: ImageType = None,
|
|
|
|
image_name: str = None,
|
2024-10-11 09:41:23 +03:00
|
|
|
webSearchMode: bool = False,
|
2024-04-12 22:00:57 +03:00
|
|
|
**kwargs
|
2024-09-12 23:20:02 +03:00
|
|
|
) -> AsyncResult:
|
|
|
|
model = cls.get_model(model)
|
|
|
|
|
2024-04-12 22:00:57 +03:00
|
|
|
headers = {
|
2024-09-12 23:20:02 +03:00
|
|
|
"accept": "*/*",
|
|
|
|
"accept-language": "en-US,en;q=0.9",
|
|
|
|
"cache-control": "no-cache",
|
|
|
|
"content-type": "application/json",
|
|
|
|
"origin": cls.url,
|
|
|
|
"pragma": "no-cache",
|
2024-10-15 15:19:43 +03:00
|
|
|
"priority": "u=1, i",
|
2024-10-11 09:41:23 +03:00
|
|
|
"referer": cls.model_referers.get(model, cls.url),
|
2024-10-15 15:19:43 +03:00
|
|
|
"sec-ch-ua": '"Chromium";v="129", "Not=A?Brand";v="8"',
|
2024-09-12 23:20:02 +03:00
|
|
|
"sec-ch-ua-mobile": "?0",
|
|
|
|
"sec-ch-ua-platform": '"Linux"',
|
|
|
|
"sec-fetch-dest": "empty",
|
|
|
|
"sec-fetch-mode": "cors",
|
|
|
|
"sec-fetch-site": "same-origin",
|
2024-10-15 15:19:43 +03:00
|
|
|
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
|
2024-04-12 22:00:57 +03:00
|
|
|
}
|
2024-09-24 13:23:53 +03:00
|
|
|
|
2024-10-11 09:41:23 +03:00
|
|
|
if model in cls.model_prefixes:
|
|
|
|
prefix = cls.model_prefixes[model]
|
2024-09-24 13:23:53 +03:00
|
|
|
if not messages[0]['content'].startswith(prefix):
|
|
|
|
messages[0]['content'] = f"{prefix} {messages[0]['content']}"
|
2024-09-12 23:20:02 +03:00
|
|
|
|
2024-10-12 22:56:06 +03:00
|
|
|
random_id = ''.join(random.choices(string.ascii_letters + string.digits, k=7))
|
|
|
|
messages[-1]['id'] = random_id
|
|
|
|
messages[-1]['role'] = 'user'
|
|
|
|
|
|
|
|
if image is not None:
|
|
|
|
messages[-1]['data'] = {
|
|
|
|
'fileText': '',
|
|
|
|
'imageBase64': to_data_uri(image),
|
|
|
|
'title': image_name
|
2024-04-12 22:00:57 +03:00
|
|
|
}
|
2024-10-12 22:56:06 +03:00
|
|
|
messages[-1]['content'] = 'FILE:BB\n$#$\n\n$#$\n' + messages[-1]['content']
|
|
|
|
|
|
|
|
data = {
|
|
|
|
"messages": messages,
|
|
|
|
"id": random_id,
|
|
|
|
"previewToken": None,
|
|
|
|
"userId": None,
|
|
|
|
"codeModelMode": True,
|
|
|
|
"agentMode": {},
|
|
|
|
"trendingAgentMode": {},
|
|
|
|
"isMicMode": False,
|
|
|
|
"userSystemPrompt": None,
|
|
|
|
"maxTokens": 1024,
|
|
|
|
"playgroundTopP": 0.9,
|
|
|
|
"playgroundTemperature": 0.5,
|
|
|
|
"isChromeExt": False,
|
|
|
|
"githubToken": None,
|
|
|
|
"clickedAnswer2": False,
|
|
|
|
"clickedAnswer3": False,
|
|
|
|
"clickedForceWebSearch": False,
|
|
|
|
"visitFromDelta": False,
|
|
|
|
"mobileClient": False,
|
|
|
|
"userSelectedModel": None,
|
|
|
|
"webSearchMode": webSearchMode,
|
|
|
|
}
|
2024-07-08 23:49:38 +03:00
|
|
|
|
2024-10-12 22:56:06 +03:00
|
|
|
if model in cls.agentMode:
|
|
|
|
data["agentMode"] = cls.agentMode[model]
|
|
|
|
elif model in cls.trendingAgentMode:
|
|
|
|
data["trendingAgentMode"] = cls.trendingAgentMode[model]
|
|
|
|
elif model in cls.userSelectedModel:
|
|
|
|
data["userSelectedModel"] = cls.userSelectedModel[model]
|
|
|
|
|
|
|
|
async with ClientSession(headers=headers) as session:
|
2024-09-12 23:20:02 +03:00
|
|
|
async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
|
2024-04-12 22:00:57 +03:00
|
|
|
response.raise_for_status()
|
2024-10-11 09:41:23 +03:00
|
|
|
if model == 'ImageGeneration':
|
2024-09-12 23:20:02 +03:00
|
|
|
response_text = await response.text()
|
|
|
|
url_match = re.search(r'https://storage\.googleapis\.com/[^\s\)]+', response_text)
|
|
|
|
if url_match:
|
|
|
|
image_url = url_match.group(0)
|
|
|
|
yield ImageResponse(image_url, alt=messages[-1]['content'])
|
|
|
|
else:
|
|
|
|
raise Exception("Image URL not found in the response")
|
|
|
|
else:
|
2024-10-11 09:41:23 +03:00
|
|
|
full_response = ""
|
|
|
|
search_results_json = ""
|
2024-10-15 15:19:43 +03:00
|
|
|
async for chunk, _ in response.content.iter_chunks():
|
2024-09-12 23:20:02 +03:00
|
|
|
if chunk:
|
|
|
|
decoded_chunk = chunk.decode()
|
2024-09-24 13:23:53 +03:00
|
|
|
decoded_chunk = re.sub(r'\$@\$v=[^$]+\$@\$', '', decoded_chunk)
|
2024-09-25 08:01:39 +03:00
|
|
|
if decoded_chunk.strip():
|
2024-10-11 09:41:23 +03:00
|
|
|
if '$~~~$' in decoded_chunk:
|
|
|
|
search_results_json += decoded_chunk
|
|
|
|
else:
|
|
|
|
full_response += decoded_chunk
|
|
|
|
yield decoded_chunk
|
|
|
|
|
|
|
|
if data["webSearchMode"] and search_results_json:
|
|
|
|
match = re.search(r'\$~~~\$(.*?)\$~~~\$', search_results_json, re.DOTALL)
|
|
|
|
if match:
|
|
|
|
search_results = json.loads(match.group(1))
|
|
|
|
formatted_results = "\n\n**Sources:**\n"
|
|
|
|
for i, result in enumerate(search_results[:5], 1):
|
|
|
|
formatted_results += f"{i}. [{result['title']}]({result['link']})\n"
|
|
|
|
yield formatted_results
|