summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--g4f/Provider/Blackbox.py112
1 files changed, 97 insertions, 15 deletions
diff --git a/g4f/Provider/Blackbox.py b/g4f/Provider/Blackbox.py
index b074d28f..3bc49dc4 100644
--- a/g4f/Provider/Blackbox.py
+++ b/g4f/Provider/Blackbox.py
@@ -3,6 +3,7 @@ from __future__ import annotations
import re
import random
import string
+import json
from aiohttp import ClientSession
from ..typing import AsyncResult, Messages, ImageType
@@ -17,40 +18,105 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
supports_system_message = True
supports_message_history = True
- default_model = 'blackbox'
+ default_model = 'blackboxai'
models = [
- 'blackbox',
- 'gemini-1.5-flash',
+ default_model,
+ 'blackboxai-pro',
+
"llama-3.1-8b",
'llama-3.1-70b',
'llama-3.1-405b',
- 'ImageGenerationLV45LJp',
+
'gpt-4o',
+
'gemini-pro',
+ 'gemini-1.5-flash',
+
'claude-sonnet-3.5',
+
+ 'PythonAgent',
+ 'JavaAgent',
+ 'JavaScriptAgent',
+ 'HTMLAgent',
+ 'GoogleCloudAgent',
+ 'AndroidDeveloper',
+ 'SwiftDeveloper',
+ 'Next.jsAgent',
+ 'MongoDBAgent',
+ 'PyTorchAgent',
+ 'ReactAgent',
+ 'XcodeAgent',
+ 'AngularJSAgent',
+ 'ImageGeneration',
]
agentMode = {
- 'ImageGenerationLV45LJp': {'mode': True, 'id': "ImageGenerationLV45LJp", 'name': "Image Generation"},
+ 'ImageGeneration': {'mode': True, 'id': "ImageGenerationLV45LJp", 'name': "Image Generation"},
}
trendingAgentMode = {
- "blackbox": {},
+ "blackboxai": {},
"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"},
'llama-3.1-405b': {'mode': True, 'id': "llama-3.1-405b"},
+ '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"},
}
userSelectedModel = {
"gpt-4o": "gpt-4o",
"gemini-pro": "gemini-pro",
'claude-sonnet-3.5': "claude-sonnet-3.5",
+ 'blackboxai-pro': "blackboxai-pro",
+ }
+
+ model_prefixes = {
+ 'gpt-4o': '@GPT-4o',
+ 'gemini-pro': '@Gemini-PRO',
+ 'claude-sonnet-3.5': '@Claude-Sonnet-3.5',
+
+ 'PythonAgent': '@Python Agent',
+ 'JavaAgent': '@Java Agent',
+ 'JavaScriptAgent': '@Java Agent',
+ '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",
+ "blackboxai-pro": f"{url}/?model=blackboxai-pro",
+ "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"
}
model_aliases = {
"gemini-flash": "gemini-1.5-flash",
- "flux": "ImageGenerationLV45LJp",
+ "claude-3.5-sonnet": "claude-sonnet-3.5",
+ "flux": "ImageGeneration",
}
@classmethod
@@ -72,6 +138,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
proxy: str = None,
image: ImageType = None,
image_name: str = None,
+ webSearchMode: bool = False,
**kwargs
) -> AsyncResult:
model = cls.get_model(model)
@@ -83,7 +150,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
"content-type": "application/json",
"origin": cls.url,
"pragma": "no-cache",
- "referer": f"{cls.url}/",
+ "referer": cls.model_referers.get(model, cls.url),
"sec-ch-ua": '"Not;A=Brand";v="24", "Chromium";v="128"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Linux"',
@@ -93,8 +160,8 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
}
- if model in cls.userSelectedModel:
- prefix = f"@{cls.userSelectedModel[model]}"
+ if model in cls.model_prefixes:
+ prefix = cls.model_prefixes[model]
if not messages[0]['content'].startswith(prefix):
messages[0]['content'] = f"{prefix} {messages[0]['content']}"
@@ -115,9 +182,8 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
"codeModelMode": True,
"agentMode": {},
"trendingAgentMode": {},
- "userSelectedModel": None,
- "userSystemPrompt": None,
"isMicMode": False,
+ "userSystemPrompt": None,
"maxTokens": 1024,
"playgroundTopP": 0.9,
"playgroundTemperature": 0.5,
@@ -128,7 +194,8 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
"clickedForceWebSearch": False,
"visitFromDelta": False,
"mobileClient": False,
- "webSearchMode": False,
+ "userSelectedModel": None,
+ "webSearchMode": webSearchMode,
}
if model in cls.agentMode:
@@ -140,7 +207,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
response.raise_for_status()
- if model == 'ImageGenerationLV45LJp':
+ if model == 'ImageGeneration':
response_text = await response.text()
url_match = re.search(r'https://storage\.googleapis\.com/[^\s\)]+', response_text)
if url_match:
@@ -149,9 +216,24 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
else:
raise Exception("Image URL not found in the response")
else:
+ full_response = ""
+ search_results_json = ""
async for chunk in response.content.iter_any():
if chunk:
decoded_chunk = chunk.decode()
decoded_chunk = re.sub(r'\$@\$v=[^$]+\$@\$', '', decoded_chunk)
if decoded_chunk.strip():
- yield decoded_chunk
+ 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