feat(g4f/Provider/Blackbox.py): enhance model handling and add web search mode

This commit is contained in:
kqlio67 2024-10-11 09:41:23 +03:00
parent f63d1566cf
commit bd607b14b6

View File

@ -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