From bd607b14b6eeb1b1869d5891e6aed1140b9cd688 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Fri, 11 Oct 2024 09:41:23 +0300 Subject: feat(g4f/Provider/Blackbox.py): enhance model handling and add web search mode --- g4f/Provider/Blackbox.py | 112 ++++++++++++++++++++++++++++++++++++++++------- 1 file 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 -- cgit v1.2.3