diff options
Diffstat (limited to 'g4f/Provider/Blackbox.py')
-rw-r--r-- | g4f/Provider/Blackbox.py | 187 |
1 files changed, 136 insertions, 51 deletions
diff --git a/g4f/Provider/Blackbox.py b/g4f/Provider/Blackbox.py index b074d28f..250ffe48 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 @@ -16,30 +17,64 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin): supports_stream = True supports_system_message = True supports_message_history = True - - default_model = 'blackbox' + + default_model = 'blackboxai' + image_models = ['ImageGeneration'] 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', + *image_models, ] 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 = { @@ -48,9 +83,39 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin): 'claude-sonnet-3.5': "claude-sonnet-3.5", } + 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': '@JavaScript 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", + "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 +137,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 +149,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,54 +159,58 @@ 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']}" - async with ClientSession(headers=headers) as session: - if image is not None: - messages[-1]["data"] = { - "fileText": image_name, - "imageBase64": to_data_uri(image) - } - - random_id = ''.join(random.choices(string.ascii_letters + string.digits, k=7)) - - data = { - "messages": messages, - "id": random_id, - "previewToken": None, - "userId": None, - "codeModelMode": True, - "agentMode": {}, - "trendingAgentMode": {}, - "userSelectedModel": None, - "userSystemPrompt": None, - "isMicMode": False, - "maxTokens": 1024, - "playgroundTopP": 0.9, - "playgroundTemperature": 0.5, - "isChromeExt": False, - "githubToken": None, - "clickedAnswer2": False, - "clickedAnswer3": False, - "clickedForceWebSearch": False, - "visitFromDelta": False, - "mobileClient": False, - "webSearchMode": False, + 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 } + 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, + } - 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] - + 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: 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 +219,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 |