From d806c8cdc6f152addabba57647e38e61c614b86c Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:16:23 +0300 Subject: feat(g4f/models.py): enhance and update model configurations --- g4f/models.py | 180 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 120 insertions(+), 60 deletions(-) (limited to 'g4f') diff --git a/g4f/models.py b/g4f/models.py index 2940b96a..31cd4003 100644 --- a/g4f/models.py +++ b/g4f/models.py @@ -9,10 +9,8 @@ from .Provider import ( Allyfy, Bing, Binjie, - Bixin123, Blackbox, ChatGpt, - Chatgpt4o, Chatgpt4Online, ChatGptEs, ChatgptFree, @@ -80,12 +78,16 @@ default = Model( ReplicateHome, Upstage, Blackbox, - Bixin123, Binjie, Free2GPT, MagickPen, DeepInfraChat, LiteIcoding, + Airforce, + ChatHub, + Nexra, + ChatGptEs, + ChatHub, ]) ) @@ -106,7 +108,7 @@ gpt_35_turbo = Model( name = 'gpt-3.5-turbo', base_provider = 'OpenAI', best_provider = IterListProvider([ - Allyfy, Nexra, Bixin123, Airforce, + Allyfy, Nexra, Airforce, Liaobots, ]) ) @@ -115,7 +117,7 @@ gpt_4o = Model( name = 'gpt-4o', base_provider = 'OpenAI', best_provider = IterListProvider([ - Liaobots, Nexra, Airforce, Chatgpt4o, ChatGptEs, + Liaobots, Nexra, ChatGptEs, Airforce, OpenaiChat ]) ) @@ -133,7 +135,7 @@ gpt_4_turbo = Model( name = 'gpt-4-turbo', base_provider = 'OpenAI', best_provider = IterListProvider([ - Nexra, Bixin123, Liaobots, Airforce, Bing + Nexra, Liaobots, Airforce, Bing ]) ) @@ -141,9 +143,8 @@ gpt_4 = Model( name = 'gpt-4', base_provider = 'OpenAI', best_provider = IterListProvider([ - Nexra, Binjie, Airforce, - gpt_4_turbo.best_provider, gpt_4o.best_provider, gpt_4o_mini.best_provider, - Chatgpt4Online, Bing, OpenaiChat, + Nexra, Binjie, Airforce, Chatgpt4Online, Bing, OpenaiChat, + gpt_4_turbo.best_provider, gpt_4o.best_provider, gpt_4o_mini.best_provider ]) ) @@ -205,7 +206,7 @@ llama_3_1_70b = Model( llama_3_1_405b = Model( name = "llama-3.1-405b", base_provider = "Meta Llama", - best_provider = IterListProvider([Blackbox, DeepInfraChat, Airforce]) + best_provider = IterListProvider([DeepInfraChat, Airforce]) ) llama_3_1 = Model( @@ -214,12 +215,38 @@ llama_3_1 = Model( best_provider = IterListProvider([Nexra, llama_3_1_8b.best_provider, llama_3_1_70b.best_provider, llama_3_1_405b.best_provider,]) ) +# llama 3.2 +llama_3_2_11b = Model( + name = "llama-3.2-11b", + base_provider = "Meta Llama", + best_provider = IterListProvider([HuggingChat, HuggingFace]) +) + +llama_3_2_90b = Model( + name = "llama-3.2-90b", + base_provider = "Meta Llama", + best_provider = IterListProvider([Airforce]) +) + +# llamaguard +llamaguard_7b = Model( + name = "llamaguard-7b", + base_provider = "Meta Llama", + best_provider = IterListProvider([Airforce]) +) + +llamaguard_2_8b = Model( + name = "llamaguard-2-8b", + base_provider = "Meta Llama", + best_provider = IterListProvider([Airforce]) +) + ### Mistral ### mistral_7b = Model( name = "mistral-7b", base_provider = "Mistral", - best_provider = IterListProvider([HuggingChat, DeepInfraChat, Airforce, HuggingFace, DeepInfra]) + best_provider = IterListProvider([DeepInfraChat, Airforce, HuggingFace, DeepInfra]) ) mixtral_8x7b = Model( @@ -245,7 +272,13 @@ mistral_nemo = Model( mixtral_8x7b_dpo = Model( name = "mixtral-8x7b-dpo", base_provider = "NousResearch", - best_provider = Airforce + best_provider = IterListProvider([Airforce]) +) + +yi_34b = Model( + name = "yi-34b", + base_provider = "NousResearch", + best_provider = IterListProvider([Airforce]) ) hermes_3 = Model( @@ -310,49 +343,56 @@ gemma_2b = Model( ]) ) +# gemma 2 +gemma_2_27b = Model( + name = 'gemma-2-27b', + base_provider = 'Google', + best_provider = Airforce +) + gemma_2 = Model( name = 'gemma-2', base_provider = 'Google', - best_provider = ChatHub + best_provider = IterListProvider([ + ChatHub, + gemma_2_27b.best_provider, + ]) ) ### Anthropic ### -claude_2 = Model( - name = 'claude-2', - base_provider = 'Anthropic', - best_provider = You -) - -claude_2_0 = Model( - name = 'claude-2.0', +claude_2_1 = Model( + name = 'claude-2.1', base_provider = 'Anthropic', best_provider = Liaobots ) -claude_2_1 = Model( - name = 'claude-2.1', +claude_2 = Model( + name = 'claude-2', base_provider = 'Anthropic', - best_provider = Liaobots + best_provider = IterListProvider([ + You, + claude_2_1.best_provider, + ]) ) # claude 3 claude_3_opus = Model( name = 'claude-3-opus', base_provider = 'Anthropic', - best_provider = Liaobots + best_provider = IterListProvider([Airforce, Liaobots]) ) claude_3_sonnet = Model( name = 'claude-3-sonnet', base_provider = 'Anthropic', - best_provider = Liaobots + best_provider = IterListProvider([Airforce, Liaobots]) ) claude_3_haiku = Model( name = 'claude-3-haiku', base_provider = 'Anthropic', - best_provider = IterListProvider([DDG, Liaobots]) + best_provider = IterListProvider([DDG, Airforce, Liaobots]) ) claude_3 = Model( @@ -367,7 +407,7 @@ claude_3 = Model( claude_3_5_sonnet = Model( name = 'claude-3.5-sonnet', base_provider = 'Anthropic', - best_provider = IterListProvider([Blackbox, Liaobots]) + best_provider = IterListProvider([Blackbox, Airforce, Liaobots]) ) claude_3_5 = Model( @@ -417,15 +457,22 @@ command_r_plus = Model( sparkdesk_v1_1 = Model( name = 'sparkdesk-v1.1', base_provider = 'iFlytek', - best_provider = IterListProvider([FreeChatgpt, Airforce]) + best_provider = IterListProvider([FreeChatgpt]) ) ### Qwen ### +# qwen 1 +qwen_1_5_7b = Model( + name = 'qwen-1.5-7b', + base_provider = 'Qwen', + best_provider = Airforce +) + qwen_1_5_14b = Model( name = 'qwen-1.5-14b', base_provider = 'Qwen', - best_provider = FreeChatgpt + best_provider = IterListProvider([FreeChatgpt, Airforce]) ) qwen_1_5_72b = Model( @@ -440,22 +487,17 @@ qwen_1_5_110b = Model( best_provider = Airforce ) +# qwen 2 qwen_2_72b = Model( name = 'qwen-2-72b', base_provider = 'Qwen', best_provider = IterListProvider([DeepInfraChat, HuggingChat, Airforce, HuggingFace]) ) -qwen_turbo = Model( - name = 'qwen-turbo', - base_provider = 'Qwen', - best_provider = Bixin123 -) - qwen = Model( name = 'qwen', base_provider = 'Qwen', - best_provider = IterListProvider([Nexra, qwen_1_5_14b.best_provider, qwen_1_5_72b.best_provider, qwen_1_5_110b.best_provider, qwen_2_72b.best_provider, qwen_turbo.best_provider]) + best_provider = IterListProvider([Nexra, qwen_1_5_14b.best_provider, qwen_1_5_72b.best_provider, qwen_1_5_110b.best_provider, qwen_2_72b.best_provider]) ) @@ -488,13 +530,6 @@ yi_1_5_9b = Model( best_provider = FreeChatgpt ) -yi_34b = Model( - name = 'yi-34b', - base_provider = '01-ai', - best_provider = Airforce -) - - ### Upstage ### solar_1_mini = Model( name = 'solar-1-mini', @@ -542,14 +577,6 @@ wizardlm_2_8x22b = Model( best_provider = IterListProvider([DeepInfraChat, Airforce]) ) -### Together ### -sh_n_7b = Model( - name = 'sh-n-7b', - base_provider = 'Together', - best_provider = Airforce -) - - ### Yorickvp ### llava_13b = Model( name = 'llava-13b', @@ -611,7 +638,8 @@ grok_2_mini = Model( best_provider = Liaobots ) -# Perplexity AI + +### Perplexity AI ### sonar_online = Model( name = 'sonar-online', base_provider = 'Perplexity AI', @@ -625,6 +653,22 @@ sonar_chat = Model( ) +### Gryphe ### +mythomax_l2_13b = Model( + name = 'mythomax-l2-13b', + base_provider = 'Gryphe', + best_provider = IterListProvider([Airforce]) +) + + +### Pawan ### +cosmosrp = Model( + name = 'cosmosrp', + base_provider = 'Pawan', + best_provider = IterListProvider([Airforce]) +) + + ############# ### Image ### @@ -654,6 +698,7 @@ playground_v2_5 = Model( ) + ### Flux AI ### flux = Model( name = 'flux', @@ -805,6 +850,14 @@ class ModelUtils: 'llama-3.1-8b': llama_3_1_8b, 'llama-3.1-70b': llama_3_1_70b, 'llama-3.1-405b': llama_3_1_405b, + +# llama-3.2 +'llama-3.2-11b': llama_3_2_11b, +'llama-3.2-90b': llama_3_2_90b, + +# llamaguard +'llamaguard-7b': llamaguard_7b, +'llamaguard-2-8b': llamaguard_2_8b, ### Mistral ### @@ -835,12 +888,14 @@ class ModelUtils: 'gemma-2b': gemma_2b, 'gemma-2b-9b': gemma_2b_9b, 'gemma-2b-27b': gemma_2b_27b, + +# gemma-2 'gemma-2': gemma_2, +'gemma-2-27b': gemma_2_27b, ### Anthropic ### 'claude-2': claude_2, -'claude-2.0': claude_2_0, 'claude-2.1': claude_2_1, # claude 3 @@ -880,11 +935,11 @@ class ModelUtils: ### Qwen ### 'qwen': qwen, +'qwen-1.5-7b': qwen_1_5_7b, 'qwen-1.5-14b': qwen_1_5_14b, 'qwen-1.5-72b': qwen_1_5_72b, 'qwen-1.5-110b': qwen_1_5_110b, 'qwen-2-72b': qwen_2_72b, -'qwen-turbo': qwen_turbo, ### Zhipu AI ### @@ -908,11 +963,7 @@ class ModelUtils: ### DeepSeek ### 'deepseek': deepseek, - - -### Together ### -'sh-n-7b': sh_n_7b, - + ### Yorickvp ### 'llava-13b': llava_13b, @@ -947,9 +998,18 @@ class ModelUtils: 'grok-2': grok_2, 'grok-2-mini': grok_2_mini, + ### Perplexity AI ### 'sonar-online': sonar_online, 'sonar-chat': sonar_chat, + + +### Gryphe ### +'mythomax-l2-13b': sonar_chat, + + +### Pawan ### +'cosmosrp': cosmosrp, -- cgit v1.2.3 From 29f4fcb4b086585f4f7c77a22f4e60a575962ee9 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:22:43 +0300 Subject: feat(g4f/client/async_client.py): improve async generator handling and logging --- g4f/client/async_client.py | 151 ++++++++++++++++++++++++++++----------------- 1 file changed, 95 insertions(+), 56 deletions(-) (limited to 'g4f') diff --git a/g4f/client/async_client.py b/g4f/client/async_client.py index 9caa74b2..b4d52a60 100644 --- a/g4f/client/async_client.py +++ b/g4f/client/async_client.py @@ -33,6 +33,12 @@ except NameError: except StopAsyncIteration: raise StopIteration +async def safe_aclose(generator): + try: + await generator.aclose() + except Exception as e: + logging.warning(f"Error while closing generator: {e}") + async def iter_response( response: AsyncIterator[str], stream: bool, @@ -45,48 +51,56 @@ async def iter_response( completion_id = ''.join(random.choices(string.ascii_letters + string.digits, k=28)) idx = 0 - async for chunk in response: - if isinstance(chunk, FinishReason): - finish_reason = chunk.reason - break - elif isinstance(chunk, BaseConversation): - yield chunk - continue + try: + async for chunk in response: + if isinstance(chunk, FinishReason): + finish_reason = chunk.reason + break + elif isinstance(chunk, BaseConversation): + yield chunk + continue - content += str(chunk) - idx += 1 + content += str(chunk) + idx += 1 - if max_tokens is not None and idx >= max_tokens: - finish_reason = "length" + if max_tokens is not None and idx >= max_tokens: + finish_reason = "length" - first, content, chunk = find_stop(stop, content, chunk if stream else None) + first, content, chunk = find_stop(stop, content, chunk if stream else None) - if first != -1: - finish_reason = "stop" + if first != -1: + finish_reason = "stop" - if stream: - yield ChatCompletionChunk(chunk, None, completion_id, int(time.time())) + if stream: + yield ChatCompletionChunk(chunk, None, completion_id, int(time.time())) - if finish_reason is not None: - break + if finish_reason is not None: + break - finish_reason = "stop" if finish_reason is None else finish_reason + finish_reason = "stop" if finish_reason is None else finish_reason - if stream: - yield ChatCompletionChunk(None, finish_reason, completion_id, int(time.time())) - else: - if response_format is not None and "type" in response_format: - if response_format["type"] == "json_object": - content = filter_json(content) - yield ChatCompletion(content, finish_reason, completion_id, int(time.time())) + if stream: + yield ChatCompletionChunk(None, finish_reason, completion_id, int(time.time())) + else: + if response_format is not None and "type" in response_format: + if response_format["type"] == "json_object": + content = filter_json(content) + yield ChatCompletion(content, finish_reason, completion_id, int(time.time())) + finally: + if hasattr(response, 'aclose'): + await safe_aclose(response) async def iter_append_model_and_provider(response: AsyncIterator) -> AsyncIterator: last_provider = None - async for chunk in response: - last_provider = get_last_provider(True) if last_provider is None else last_provider - chunk.model = last_provider.get("model") - chunk.provider = last_provider.get("name") - yield chunk + try: + async for chunk in response: + last_provider = get_last_provider(True) if last_provider is None else last_provider + chunk.model = last_provider.get("model") + chunk.provider = last_provider.get("name") + yield chunk + finally: + if hasattr(response, 'aclose'): + await safe_aclose(response) class AsyncClient(BaseClient): def __init__( @@ -158,8 +172,6 @@ class Completions: response = iter_append_model_and_provider(response) return response if stream else await anext(response) - - class Chat: completions: Completions @@ -168,14 +180,18 @@ class Chat: async def iter_image_response(response: AsyncIterator) -> Union[ImagesResponse, None]: logging.info("Starting iter_image_response") - async for chunk in response: - logging.info(f"Processing chunk: {chunk}") - if isinstance(chunk, ImageProviderResponse): - logging.info("Found ImageProviderResponse") - return ImagesResponse([Image(image) for image in chunk.get_list()]) - - logging.warning("No ImageProviderResponse found in the response") - return None + try: + async for chunk in response: + logging.info(f"Processing chunk: {chunk}") + if isinstance(chunk, ImageProviderResponse): + logging.info("Found ImageProviderResponse") + return ImagesResponse([Image(image) for image in chunk.get_list()]) + + logging.warning("No ImageProviderResponse found in the response") + return None + finally: + if hasattr(response, 'aclose'): + await safe_aclose(response) async def create_image(client: AsyncClient, provider: ProviderType, prompt: str, model: str = "", **kwargs) -> AsyncIterator: logging.info(f"Creating image with provider: {provider}, model: {model}, prompt: {prompt}") @@ -220,12 +236,25 @@ class Images: if isinstance(provider, type) and issubclass(provider, AsyncGeneratorProvider): logging.info("Using AsyncGeneratorProvider") messages = [{"role": "user", "content": prompt}] - async for response in provider.create_async_generator(model, messages, **kwargs): - if isinstance(response, ImageResponse): - return self._process_image_response(response) - elif isinstance(response, str): - image_response = ImageResponse([response], prompt) - return self._process_image_response(image_response) + generator = None + try: + generator = provider.create_async_generator(model, messages, **kwargs) + async for response in generator: + logging.debug(f"Received response: {type(response)}") + if isinstance(response, ImageResponse): + return self._process_image_response(response) + elif isinstance(response, str): + image_response = ImageResponse([response], prompt) + return self._process_image_response(image_response) + except RuntimeError as e: + if "async generator ignored GeneratorExit" in str(e): + logging.warning("Generator ignored GeneratorExit, handling gracefully") + else: + raise + finally: + if generator and hasattr(generator, 'aclose'): + await safe_aclose(generator) + logging.info("AsyncGeneratorProvider processing completed") elif hasattr(provider, 'create'): logging.info("Using provider's create method") async_create = asyncio.iscoroutinefunction(provider.create) @@ -241,7 +270,7 @@ class Images: return self._process_image_response(image_response) elif hasattr(provider, 'create_completion'): logging.info("Using provider's create_completion method") - response = await create_image(provider, prompt, model, **kwargs) + response = await create_image(self.client, provider, prompt, model, **kwargs) async for chunk in response: if isinstance(chunk, ImageProviderResponse): logging.info("Found ImageProviderResponse") @@ -277,12 +306,24 @@ class Images: if isinstance(provider, type) and issubclass(provider, AsyncGeneratorProvider): messages = [{"role": "user", "content": "create a variation of this image"}] image_data = to_data_uri(image) - async for response in provider.create_async_generator(model, messages, image=image_data, **kwargs): - if isinstance(response, ImageResponse): - return self._process_image_response(response) - elif isinstance(response, str): - image_response = ImageResponse([response], "Image variation") - return self._process_image_response(image_response) + generator = None + try: + generator = provider.create_async_generator(model, messages, image=image_data, **kwargs) + async for response in generator: + if isinstance(response, ImageResponse): + return self._process_image_response(response) + elif isinstance(response, str): + image_response = ImageResponse([response], "Image variation") + return self._process_image_response(image_response) + except RuntimeError as e: + if "async generator ignored GeneratorExit" in str(e): + logging.warning("Generator ignored GeneratorExit in create_variation, handling gracefully") + else: + raise + finally: + if generator and hasattr(generator, 'aclose'): + await safe_aclose(generator) + logging.info("AsyncGeneratorProvider processing completed in create_variation") elif hasattr(provider, 'create_variation'): if asyncio.iscoroutinefunction(provider.create_variation): response = await provider.create_variation(image, **kwargs) @@ -296,5 +337,3 @@ class Images: return self._process_image_response(image_response) else: raise ValueError(f"Provider {provider} does not support image variation") - - raise NoImageResponseError("Failed to create image variation") -- cgit v1.2.3 From 6bf4c4bc37b71a7833b5450c5c66de6fdfa0eda3 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:25:26 +0300 Subject: refactor(g4f/Provider/Airforce.py): enhance Airforce provider functionality --- g4f/Provider/Airforce.py | 492 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 332 insertions(+), 160 deletions(-) (limited to 'g4f') diff --git a/g4f/Provider/Airforce.py b/g4f/Provider/Airforce.py index 51f8ba55..986281a6 100644 --- a/g4f/Provider/Airforce.py +++ b/g4f/Provider/Airforce.py @@ -1,76 +1,200 @@ from __future__ import annotations - -from aiohttp import ClientSession, ClientResponseError +import random import json +from aiohttp import ClientSession from ..typing import AsyncResult, Messages from .base_provider import AsyncGeneratorProvider, ProviderModelMixin from ..image import ImageResponse -from .helper import format_prompt -from ..errors import ResponseStatusError + +def split_long_message(message: str, max_length: int = 4000) -> list[str]: + return [message[i:i+max_length] for i in range(0, len(message), max_length)] class Airforce(AsyncGeneratorProvider, ProviderModelMixin): + label = "Airforce" url = "https://api.airforce" - text_api_endpoint = "https://api.airforce/chat/completions" image_api_endpoint = "https://api.airforce/imagine2" + text_api_endpoint = "https://api.airforce/chat/completions" working = True + + default_model = 'llama-3-70b-chat' + supports_gpt_35_turbo = True supports_gpt_4 = True supports_stream = True supports_system_message = True supports_message_history = True - default_model = 'llama-3-70b-chat' + text_models = [ - # Open source models - 'llama-2-13b-chat', - 'llama-3-70b-chat', - 'llama-3-70b-chat-turbo', - 'llama-3-70b-chat-lite', - 'llama-3-8b-chat', - 'llama-3-8b-chat-turbo', - 'llama-3-8b-chat-lite', - 'llama-3.1-405b-turbo', - 'llama-3.1-70b-turbo', - 'llama-3.1-8b-turbo', - 'LlamaGuard-2-8b', - 'Llama-Guard-7b', - 'Meta-Llama-Guard-3-8B', - 'Mixtral-8x7B-Instruct-v0.1', - 'Mixtral-8x22B-Instruct-v0.1', - 'Mistral-7B-Instruct-v0.1', - 'Mistral-7B-Instruct-v0.2', - 'Mistral-7B-Instruct-v0.3', - 'Qwen1.5-72B-Chat', - 'Qwen1.5-110B-Chat', - 'Qwen2-72B-Instruct', - 'gemma-2b-it', - 'gemma-2-9b-it', - 'gemma-2-27b-it', - 'dbrx-instruct', - 'deepseek-llm-67b-chat', - 'Nous-Hermes-2-Mixtral-8x7B-DPO', - 'Nous-Hermes-2-Yi-34B', - 'WizardLM-2-8x22B', - 'SOLAR-10.7B-Instruct-v1.0', - 'StripedHyena-Nous-7B', - 'sparkdesk', - - # Other models - 'chatgpt-4o-latest', - 'gpt-4', - 'gpt-4-turbo', - 'gpt-4o-mini-2024-07-18', - 'gpt-4o-mini', - 'gpt-4o', - 'gpt-3.5-turbo', - 'gpt-3.5-turbo-0125', - 'gpt-3.5-turbo-1106', - 'gpt-3.5-turbo-16k', - 'gpt-3.5-turbo-0613', - 'gpt-3.5-turbo-16k-0613', - 'gemini-1.5-flash', - 'gemini-1.5-pro', + # anthorpic + 'claude-3-haiku-20240307', + 'claude-3-sonnet-20240229', + 'claude-3-5-sonnet-20240620', + 'claude-3-opus-20240229', + + # openai + 'chatgpt-4o-latest', + 'gpt-4', + #'gpt-4-0613', + 'gpt-4-turbo', + 'gpt-4o-mini-2024-07-18', + 'gpt-4o-mini', + 'gpt-3.5-turbo', + 'gpt-3.5-turbo-0125', + 'gpt-3.5-turbo-1106', + #'gpt-3.5-turbo-16k', # No response from the API. + #'gpt-3.5-turbo-0613', # No response from the API. + #'gpt-3.5-turbo-16k-0613', # No response from the API. + 'gpt-4o', + #'o1-mini', # No response from the API. + + # meta-llama + 'llama-3-70b-chat', + 'llama-3-70b-chat-turbo', + 'llama-3-8b-chat', + 'llama-3-8b-chat-turbo', + 'llama-3-70b-chat-lite', + 'llama-3-8b-chat-lite', + #'llama-2-70b-chat', # Failed to load response after multiple retries. + 'llama-2-13b-chat', + #'llama-2-7b-chat', # Failed to load response after multiple retries. + 'llama-3.1-405b-turbo', + 'llama-3.1-70b-turbo', + 'llama-3.1-8b-turbo', + 'LlamaGuard-2-8b', + 'Llama-Guard-7b', + 'Llama-3.2-90B-Vision-Instruct-Turbo', + + # codellama + #'CodeLlama-7b-Python-hf', # Failed to load response after multiple retries. + #'CodeLlama-7b-Python', + #'CodeLlama-13b-Python-hf', # Failed to load response after multiple retries. + #'CodeLlama-34b-Python-hf', # Failed to load response after multiple retries. + #'CodeLlama-70b-Python-hf', # Failed to load response after multiple retries. + + # 01-ai + #'Yi-34B-Chat', # Failed to load response after multiple retries. + #'Yi-34B', # Failed to load response after multiple retries. + #'Yi-6B', # Failed to load response after multiple retries. + + # mistral-ai + #'Mixtral-8x7B-v0.1', + #'Mixtral-8x22B', # Failed to load response after multiple retries. + 'Mixtral-8x7B-Instruct-v0.1', + 'Mixtral-8x22B-Instruct-v0.1', + 'Mistral-7B-Instruct-v0.1', + 'Mistral-7B-Instruct-v0.2', + 'Mistral-7B-Instruct-v0.3', + + # openchat + #'openchat-3.5', # Failed to load response after multiple retries. + + # wizardlm + #'WizardLM-13B-V1.2', # Failed to load response after multiple retries. + #'WizardCoder-Python-34B-V1.0', # Failed to load response after multiple retries. + + # qwen + #'Qwen1.5-0.5B-Chat', # Failed to load response after multiple retries. + #'Qwen1.5-1.8B-Chat', # Failed to load response after multiple retries. + #'Qwen1.5-4B-Chat', # Failed to load response after multiple retries. + 'Qwen1.5-7B-Chat', + 'Qwen1.5-14B-Chat', + 'Qwen1.5-72B-Chat', + 'Qwen1.5-110B-Chat', + 'Qwen2-72B-Instruct', + + # google + 'gemma-2b-it', + #'gemma-7b-it', # Failed to load response after multiple retries. + #'gemma-2b', # Failed to load response after multiple retries. + #'gemma-7b', # Failed to load response after multiple retries. + 'gemma-2-9b-it', # fix bug + 'gemma-2-27b-it', + + # gemini + 'gemini-1.5-flash', + 'gemini-1.5-pro', + + # databricks + 'dbrx-instruct', + + # lmsys + #'vicuna-7b-v1.5', # Failed to load response after multiple retries. + #'vicuna-13b-v1.5', # Failed to load response after multiple retries. + + # cognitivecomputations + #'dolphin-2.5-mixtral-8x7b', # Failed to load response after multiple retries. + + # deepseek-ai + #'deepseek-coder-33b-instruct', # No response from the API. + #'deepseek-coder-67b-instruct', # Failed to load response after multiple retries. + 'deepseek-llm-67b-chat', + + # NousResearch + #'Nous-Capybara-7B-V1p9', # Failed to load response after multiple retries. + 'Nous-Hermes-2-Mixtral-8x7B-DPO', + #'Nous-Hermes-2-Mixtral-8x7B-SFT', # Failed to load response after multiple retries. + #'Nous-Hermes-llama-2-7b', # Failed to load response after multiple retries. + #'Nous-Hermes-Llama2-13b', # Failed to load response after multiple retries. + 'Nous-Hermes-2-Yi-34B', + + # Open-Orca + #'Mistral-7B-OpenOrca', # Failed to load response after multiple retries. + + # togethercomputer + #'alpaca-7b', # Failed to load response after multiple retries. + + # teknium + #'OpenHermes-2-Mistral-7B', # Failed to load response after multiple retries. + #'OpenHermes-2.5-Mistral-7B', # Failed to load response after multiple retries. + + # microsoft + 'WizardLM-2-8x22B', + + # Nexusflow + #'NexusRaven-V2-13B', # Failed to load response after multiple retries. + + # Phind + #'Phind-CodeLlama-34B-v2', # Failed to load response after multiple retries. + + # Snoflake + #'snowflake-arctic-instruct', # No response from the API. + + # upstage + 'SOLAR-10.7B-Instruct-v1.0', + + # togethercomputer + #'StripedHyena-Hessian-7B', # Failed to load response after multiple retries. + #'StripedHyena-Nous-7B', # Failed to load response after multiple retries. + #'Llama-2-7B-32K-Instruct', # Failed to load response after multiple retries. + #'CodeLlama-13b-Instruct', # No response from the API. + #'evo-1-131k-base', # Failed to load response after multiple retries. + #'OLMo-7B-Instruct', # Failed to load response after multiple retries. + + # garage-bAInd + #'Platypus2-70B-instruct', # Failed to load response after multiple retries. + + # snorkelai + #'Snorkel-Mistral-PairRM-DPO', # Failed to load response after multiple retries. + + # Undi95 + #'ReMM-SLERP-L2-13B', # Failed to load response after multiple retries. + + # Gryphe + 'MythoMax-L2-13b', + + # Autism + #'chronos-hermes-13b', # Failed to load response after multiple retries. + + # Undi95 + #'Toppy-M-7B', # Failed to load response after multiple retries. + + # iFlytek + #'sparkdesk', # Failed to load response after multiple retries. + + # pawan + 'cosmosrp', + ] - image_models = [ 'flux', 'flux-realism', @@ -85,158 +209,206 @@ class Airforce(AsyncGeneratorProvider, ProviderModelMixin): models = [ *text_models, - *image_models + *image_models, ] model_aliases = { - # Open source models - "llama-2-13b": "llama-2-13b-chat", + # anthorpic + "claude-3-haiku": "claude-3-haiku-20240307", + "claude-3-sonnet": "claude-3-sonnet-20240229", + "claude-3-5-sonnet": "claude-3-5-sonnet-20240620", + "claude-3-opus": "claude-3-opus-20240229", + + # openai + "gpt-4o": "chatgpt-4o-latest", + "gpt-4o-mini": "gpt-4o-mini-2024-07-18", + "gpt-3.5-turbo": "gpt-3.5-turbo-0125", + "gpt-3.5-turbo": "gpt-3.5-turbo-1106", + + # meta-llama "llama-3-70b": "llama-3-70b-chat", "llama-3-70b": "llama-3-70b-chat-turbo", - "llama-3-70b": "llama-3-70b-chat-lite", "llama-3-8b": "llama-3-8b-chat", "llama-3-8b": "llama-3-8b-chat-turbo", + "llama-3-70b": "llama-3-70b-chat-lite", "llama-3-8b": "llama-3-8b-chat-lite", + "llama-2-13b": "llama-2-13b-chat", "llama-3.1-405b": "llama-3.1-405b-turbo", "llama-3.1-70b": "llama-3.1-70b-turbo", "llama-3.1-8b": "llama-3.1-8b-turbo", + "llamaguard-2-8b": "LlamaGuard-2-8b", + "llamaguard-7b": "Llama-Guard-7b", + "llama-3.2-90b": "Llama-3.2-90B-Vision-Instruct-Turbo", + + # mistral-ai "mixtral-8x7b": "Mixtral-8x7B-Instruct-v0.1", "mixtral-8x22b": "Mixtral-8x22B-Instruct-v0.1", "mistral-7b": "Mistral-7B-Instruct-v0.1", "mistral-7b": "Mistral-7B-Instruct-v0.2", "mistral-7b": "Mistral-7B-Instruct-v0.3", - "mixtral-8x7b-dpo": "Nous-Hermes-2-Mixtral-8x7B-DPO", + + # qwen + "qwen-1.5-7b": "Qwen1.5-7B-Chat", + "qwen-1.5-14b": "Qwen1.5-14B-Chat", "qwen-1.5-72b": "Qwen1.5-72B-Chat", "qwen-1.5-110b": "Qwen1.5-110B-Chat", "qwen-2-72b": "Qwen2-72B-Instruct", + + # google "gemma-2b": "gemma-2b-it", - "gemma-2b-9b": "gemma-2-9b-it", - "gemma-2b-27b": "gemma-2-27b-it", + "gemma-2-9b": "gemma-2-9b-it", + "gemma-2-27b": "gemma-2-27b-it", + + # gemini + "gemini-flash": "gemini-1.5-flash", + "gemini-pro": "gemini-1.5-pro", + + # deepseek-ai "deepseek": "deepseek-llm-67b-chat", + + # NousResearch + "mixtral-8x7b-dpo": "Nous-Hermes-2-Mixtral-8x7B-DPO", "yi-34b": "Nous-Hermes-2-Yi-34B", + + # microsoft "wizardlm-2-8x22b": "WizardLM-2-8x22B", - "solar-10-7b": "SOLAR-10.7B-Instruct-v1.0", - "sh-n-7b": "StripedHyena-Nous-7B", - "sparkdesk-v1.1": "sparkdesk", - # Other models - "gpt-4o": "chatgpt-4o-latest", - "gpt-4o-mini": "gpt-4o-mini-2024-07-18", - "gpt-3.5-turbo": "gpt-3.5-turbo-0125", - "gpt-3.5-turbo": "gpt-3.5-turbo-1106", - "gpt-3.5-turbo": "gpt-3.5-turbo-16k", - "gpt-3.5-turbo": "gpt-3.5-turbo-0613", - "gpt-3.5-turbo": "gpt-3.5-turbo-16k-0613", - "gemini-flash": "gemini-1.5-flash", - "gemini-pro": "gemini-1.5-pro", + # upstage + "solar-10.7b": "SOLAR-10.7B-Instruct-v1.0", - # Image models - "dalle-3": "dall-e-3", + # Gryphe + "mythomax-l2-13b": "MythoMax-L2-13b", } + @classmethod + def get_model(cls, model: str) -> str: + if model in cls.models: + return model + elif model in cls.model_aliases: + return cls.model_aliases.get(model, cls.default_model) + else: + return cls.default_model + @classmethod async def create_async_generator( cls, model: str, messages: Messages, proxy: str = None, + seed: int = None, + size: str = "1:1", + stream: bool = False, **kwargs ) -> AsyncResult: model = cls.get_model(model) - + + # If the model is an image model, use the image API + if model in cls.image_models: + async for result in cls._generate_image(model, messages, proxy, seed, size): + yield result + # If the model is a text model, use the text API + elif model in cls.text_models: + async for result in cls._generate_text(model, messages, proxy, stream): + yield result + + @classmethod + async def _generate_image( + cls, + model: str, + messages: Messages, + proxy: str = None, + seed: int = None, + size: str = "1:1", + **kwargs + ) -> AsyncResult: headers = { "accept": "*/*", "accept-language": "en-US,en;q=0.9", - "content-type": "application/json", - "origin": "https://api.airforce", - "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36", - "authorization": "Bearer null", "cache-control": "no-cache", - "pragma": "no-cache", - "priority": "u=1, i", - "referer": "https://llmplayground.net/", - "sec-ch-ua": '"Not;A=Brand";v="24", "Chromium";v="128"', - "sec-ch-ua-mobile": "?0", - "sec-ch-ua-platform": '"Linux"', - "sec-fetch-dest": "empty", - "sec-fetch-mode": "cors", - "sec-fetch-site": "cross-site", + "origin": "https://llmplayground.net", + "user-agent": "Mozilla/5.0" } - if model in cls.image_models: - async for item in cls.generate_image(model, messages, headers, proxy, **kwargs): - yield item - else: - async for item in cls.generate_text(model, messages, headers, proxy, **kwargs): - yield item + if seed is None: + seed = random.randint(0, 100000) - @classmethod - async def generate_text(cls, model: str, messages: Messages, headers: dict, proxy: str, **kwargs) -> AsyncResult: - async with ClientSession() as session: - data = { - "messages": [{"role": "user", "content": message['content']} for message in messages], + # Assume the first message is the prompt for the image + prompt = messages[0]['content'] + + async with ClientSession(headers=headers) as session: + params = { "model": model, - "max_tokens": kwargs.get('max_tokens', 4096), - "temperature": kwargs.get('temperature', 1), - "top_p": kwargs.get('top_p', 1), - "stream": True + "prompt": prompt, + "size": size, + "seed": seed } + async with session.get(f"{cls.image_api_endpoint}", params=params, proxy=proxy) as response: + response.raise_for_status() + content_type = response.headers.get('Content-Type', '').lower() - try: - async with session.post(cls.text_api_endpoint, json=data, headers=headers, proxy=proxy) as response: - response.raise_for_status() - async for line in response.content: - if line: - line = line.decode('utf-8').strip() - if line.startswith("data: "): - if line == "data: [DONE]": - break - try: - data = json.loads(line[6:]) - if 'choices' in data and len(data['choices']) > 0: - delta = data['choices'][0].get('delta', {}) - if 'content' in delta: - content = delta['content'] - if "One message exceeds the 1000chars per message limit" in content: - raise ResponseStatusError( - "Message too long", - 400, - "Please try a shorter message." - ) - yield content - except json.JSONDecodeError: - continue - except ResponseStatusError as e: - raise e - except Exception as e: - raise ResponseStatusError(str(e), 500, "An unexpected error occurred") + if 'application/json' in content_type: + async for chunk in response.content.iter_chunked(1024): + if chunk: + yield chunk.decode('utf-8') + elif 'image' in content_type: + image_data = b"" + async for chunk in response.content.iter_chunked(1024): + if chunk: + image_data += chunk + image_url = f"{cls.image_api_endpoint}?model={model}&prompt={prompt}&size={size}&seed={seed}" + alt_text = f"Generated image for prompt: {prompt}" + yield ImageResponse(images=image_url, alt=alt_text) @classmethod - async def generate_image(cls, model: str, messages: Messages, headers: dict, proxy: str, **kwargs) -> AsyncResult: - prompt = messages[-1]['content'] if messages else "" - params = { - "prompt": prompt, - "size": kwargs.get("size", "1:1"), - "seed": kwargs.get("seed"), - "model": model + async def _generate_text( + cls, + model: str, + messages: Messages, + proxy: str = None, + stream: bool = False, + **kwargs + ) -> AsyncResult: + headers = { + "accept": "*/*", + "accept-language": "en-US,en;q=0.9", + "authorization": "Bearer missing api key", + "content-type": "application/json", + "user-agent": "Mozilla/5.0" } - params = {k: v for k, v in params.items() if v is not None} - try: - async with ClientSession(headers=headers) as session: - async with session.get(cls.image_api_endpoint, params=params, proxy=proxy) as response: + async with ClientSession(headers=headers) as session: + formatted_prompt = cls._format_messages(messages) + prompt_parts = split_long_message(formatted_prompt) + full_response = "" + + for part in prompt_parts: + data = { + "messages": [{"role": "user", "content": part}], + "model": model, + "max_tokens": 4096, + "temperature": 1, + "top_p": 1, + "stream": stream + } + async with session.post(cls.text_api_endpoint, json=data, proxy=proxy) as response: response.raise_for_status() - content = await response.read() - - if response.content_type.startswith('image/'): - image_url = str(response.url) - yield ImageResponse(image_url, prompt) + part_response = "" + if stream: + async for line in response.content: + if line: + line = line.decode('utf-8').strip() + if line.startswith("data: ") and line != "data: [DONE]": + json_data = json.loads(line[6:]) + content = json_data['choices'][0]['delta'].get('content', '') + part_response += content else: - try: - text = content.decode('utf-8', errors='ignore') - raise ResponseStatusError("Image generation failed", response.status, text) - except Exception as decode_error: - raise ResponseStatusError("Decoding error", 500, str(decode_error)) - except ClientResponseError as e: - raise ResponseStatusError(f"HTTP {e.status}", e.status, e.message) - except Exception as e: - raise ResponseStatusError("Unexpected error", 500, str(e)) + json_data = await response.json() + content = json_data['choices'][0]['message']['content'] + part_response = content + + full_response += part_response + yield full_response + + @classmethod + def _format_messages(cls, messages: Messages) -> str: + """Formats messages for text generation.""" + return " ".join([msg['content'] for msg in messages]) -- cgit v1.2.3 From 2103ea87b5b67deffd7d58611d9254cb1d816ffa Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:27:14 +0300 Subject: refactor(g4f/Provider/Airforce.py): enhance Airforce provider functionality-2 --- g4f/Provider/Airforce.py | 1 - 1 file changed, 1 deletion(-) (limited to 'g4f') diff --git a/g4f/Provider/Airforce.py b/g4f/Provider/Airforce.py index 986281a6..e2b4be21 100644 --- a/g4f/Provider/Airforce.py +++ b/g4f/Provider/Airforce.py @@ -10,7 +10,6 @@ def split_long_message(message: str, max_length: int = 4000) -> list[str]: return [message[i:i+max_length] for i in range(0, len(message), max_length)] class Airforce(AsyncGeneratorProvider, ProviderModelMixin): - label = "Airforce" url = "https://api.airforce" image_api_endpoint = "https://api.airforce/imagine2" text_api_endpoint = "https://api.airforce/chat/completions" -- cgit v1.2.3 From 8ab55107c84c91ff47c23ecba21526c01c98df14 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:29:03 +0300 Subject: fix(g4f/Provider/Allyfy.py): update API endpoint to full URL --- g4f/Provider/Allyfy.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'g4f') diff --git a/g4f/Provider/Allyfy.py b/g4f/Provider/Allyfy.py index 8733b1ec..eb202a4f 100644 --- a/g4f/Provider/Allyfy.py +++ b/g4f/Provider/Allyfy.py @@ -9,8 +9,8 @@ from .helper import format_prompt class Allyfy(AsyncGeneratorProvider): - url = "https://chatbot.allyfy.chat" - api_endpoint = "/api/v1/message/stream/super/chat" + url = "https://allyfy.chat" + api_endpoint = "https://chatbot.allyfy.chat/api/v1/message/stream/super/chat" working = True supports_gpt_35_turbo = True @@ -53,7 +53,7 @@ class Allyfy(AsyncGeneratorProvider): "packageName": "com.cch.allyfy.webh", } } - async with session.post(f"{cls.url}{cls.api_endpoint}", json=data, proxy=proxy) as response: + async with session.post(f"{cls.api_endpoint}", json=data, proxy=proxy) as response: response.raise_for_status() full_response = [] async for line in response.content: -- cgit v1.2.3 From d9e71dad7bb6b738bc7529c7d76bd9c0abb5e8a9 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:31:38 +0300 Subject: feat(g4f/Provider/ChatGpt.py): enhance error handling and add debugging --- g4f/Provider/ChatGpt.py | 51 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 15 deletions(-) (limited to 'g4f') diff --git a/g4f/Provider/ChatGpt.py b/g4f/Provider/ChatGpt.py index fc34fc2b..37ad17d8 100644 --- a/g4f/Provider/ChatGpt.py +++ b/g4f/Provider/ChatGpt.py @@ -134,11 +134,22 @@ class ChatGpt(AbstractProvider, ProviderModelMixin): } response = session.post('https://chatgpt.com/backend-anon/sentinel/chat-requirements', - headers=headers, json={'p': pow_req}).json() + headers=headers, json={'p': pow_req}) - turnstile = response.get('turnstile', {}) + # Додана перевірка на статус відповідей, якщо "незвична активність" + if response.status_code != 200: + print(f"Request failed with status: {response.status_code}") + print(f"Response content: {response.content}") + return + + response_data = response.json() + if "detail" in response_data and "Unusual activity" in response_data["detail"]: + print(f"Blocked due to unusual activity: {response_data['detail']}") + return + + turnstile = response_data.get('turnstile', {}) turnstile_required = turnstile.get('required') - pow_conf = response.get('proofofwork', {}) + pow_conf = response_data.get('proofofwork', {}) if turnstile_required: turnstile_dx = turnstile.get('dx') @@ -146,7 +157,7 @@ class ChatGpt(AbstractProvider, ProviderModelMixin): headers = headers | { 'openai-sentinel-turnstile-token' : turnstile_token, - 'openai-sentinel-chat-requirements-token': response.get('token'), + 'openai-sentinel-chat-requirements-token': response_data.get('token'), 'openai-sentinel-proof-token' : get_answer_token( pow_conf.get('seed'), pow_conf.get('difficulty'), config ) @@ -187,20 +198,30 @@ class ChatGpt(AbstractProvider, ProviderModelMixin): 'screen_width': random.randint(1200, 2000), }, } + + # Додав паузу між запитами для уникнення блокувань через частоту + time.sleep(2) response = session.post('https://chatgpt.com/backend-anon/conversation', headers=headers, json=json_data, stream=True) - + replace = '' for line in response.iter_lines(): if line: - if 'DONE' in line.decode(): - break - - data = json.loads(line.decode()[6:]) - if data.get('message').get('author').get('role') == 'assistant': - tokens = (data.get('message').get('content').get('parts')[0]) - - yield tokens.replace(replace, '') - - replace = tokens + decoded_line = line.decode() + print(f"Received line: {decoded_line}") # Debugging output + if decoded_line.startswith('data:'): + json_string = decoded_line[6:] # Extract JSON part after 'data:' + if json_string.strip(): # Check if there's actual content + try: + data = json.loads(json_string) + except json.JSONDecodeError as e: + print(f"Error decoding JSON: {e}, content: {json_string}") + continue + + if data.get('message').get('author').get('role') == 'assistant': + tokens = (data.get('message').get('content').get('parts')[0]) + + yield tokens.replace(replace, '') + + replace = tokens -- cgit v1.2.3 From 7ac7dea13fa3a285cd87a7257ef3354ed4006360 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:40:04 +0300 Subject: feat(g4f/Provider/HuggingChat.py): add support for new model --- g4f/Provider/HuggingChat.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'g4f') diff --git a/g4f/Provider/HuggingChat.py b/g4f/Provider/HuggingChat.py index e6f70bed..30e97d7d 100644 --- a/g4f/Provider/HuggingChat.py +++ b/g4f/Provider/HuggingChat.py @@ -17,6 +17,7 @@ class HuggingChat(AbstractProvider, ProviderModelMixin): 'meta-llama/Meta-Llama-3.1-70B-Instruct', 'CohereForAI/c4ai-command-r-plus-08-2024', 'Qwen/Qwen2.5-72B-Instruct', + 'meta-llama/Llama-3.2-11B-Vision-Instruct', 'NousResearch/Hermes-3-Llama-3.1-8B', 'mistralai/Mistral-Nemo-Instruct-2407', 'microsoft/Phi-3.5-mini-instruct', @@ -26,6 +27,7 @@ class HuggingChat(AbstractProvider, ProviderModelMixin): "llama-3.1-70b": "meta-llama/Meta-Llama-3.1-70B-Instruct", "command-r-plus": "CohereForAI/c4ai-command-r-plus-08-2024", "qwen-2-72b": "Qwen/Qwen2.5-72B-Instruct", + "llama-3.2-11b": "meta-llama/Llama-3.2-11B-Vision-Instruct", "hermes-3": "NousResearch/Hermes-3-Llama-3.1-8B", "mistral-nemo": "mistralai/Mistral-Nemo-Instruct-2407", "phi-3.5-mini": "microsoft/Phi-3.5-mini-instruct", -- cgit v1.2.3 From 6cd599b1c604a8221370c18923e7a0f86892b2b1 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:43:06 +0300 Subject: refactor(g4f/Provider/__init__.py): remove Bixin123 import --- g4f/Provider/__init__.py | 1 - 1 file changed, 1 deletion(-) (limited to 'g4f') diff --git a/g4f/Provider/__init__.py b/g4f/Provider/__init__.py index 82cb9ff2..c2b21481 100644 --- a/g4f/Provider/__init__.py +++ b/g4f/Provider/__init__.py @@ -19,7 +19,6 @@ from .Aura import Aura from .Bing import Bing from .BingCreateImages import BingCreateImages from .Binjie import Binjie -from .Bixin123 import Bixin123 from .Blackbox import Blackbox from .ChatGot import ChatGot from .ChatGpt import ChatGpt -- cgit v1.2.3 From 11d3076fd75f709a9b51d1bee7b852a156ff02d9 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:44:59 +0300 Subject: feat(g4f/Provider/Liaobots.py): add support for GPT-3.5-Turbo model --- g4f/Provider/Liaobots.py | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'g4f') diff --git a/g4f/Provider/Liaobots.py b/g4f/Provider/Liaobots.py index b292020e..00c54600 100644 --- a/g4f/Provider/Liaobots.py +++ b/g4f/Provider/Liaobots.py @@ -9,6 +9,15 @@ from .helper import get_connector from ..requests import raise_for_status models = { + "gpt-3.5-turbo": { + "id": "gpt-3.5-turbo", + "name": "GPT-3.5-Turbo", + "model": "ChatGPT", + "provider": "OpenAI", + "maxLength": 48000, + "tokenLimit": 14000, + "context": "16K", + }, "gpt-4o-mini-free": { "id": "gpt-4o-mini-free", "name": "GPT-4o-Mini-Free", -- cgit v1.2.3 From 9b5f992162f5174930d96e7e9bcf5e60fb2f9630 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:47:36 +0300 Subject: refactor(g4f/Provider/LiteIcoding.py): encode bearer tokens and add decoding --- g4f/Provider/LiteIcoding.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'g4f') diff --git a/g4f/Provider/LiteIcoding.py b/g4f/Provider/LiteIcoding.py index 1b568e80..bf8f9ba8 100644 --- a/g4f/Provider/LiteIcoding.py +++ b/g4f/Provider/LiteIcoding.py @@ -1,12 +1,11 @@ from __future__ import annotations - -from aiohttp import ClientSession, ClientResponseError +import base64 import re +from aiohttp import ClientSession, ClientResponseError from ..typing import AsyncResult, Messages from .base_provider import AsyncGeneratorProvider, ProviderModelMixin from .helper import format_prompt - class LiteIcoding(AsyncGeneratorProvider, ProviderModelMixin): url = "https://lite.icoding.ink" api_endpoint = "/api/v1/gpt/message" @@ -27,18 +26,20 @@ class LiteIcoding(AsyncGeneratorProvider, ProviderModelMixin): } bearer_tokens = [ - "aa3020ee873e40cb8b3f515a0708ebc4", - "5d69cd271b144226ac1199b3c849a566", - "62977f48a95844f8853a953679401850", - "d815b091959e42dd8b7871dfaf879485" + "NWQ2OWNkMjcxYjE0NDIyNmFjMTE5OWIzYzg0OWE1NjY=", + "ZDgxNWIwOTU5NTk0ZTRkZDhiNzg3MWRmYWY4Nzk0ODU=" ] current_token_index = 0 + @classmethod + def decode_token(cls, encoded_token: str) -> str: + return base64.b64decode(encoded_token).decode('utf-8') + @classmethod def get_next_bearer_token(cls): - token = cls.bearer_tokens[cls.current_token_index] + encoded_token = cls.bearer_tokens[cls.current_token_index] cls.current_token_index = (cls.current_token_index + 1) % len(cls.bearer_tokens) - return token + return cls.decode_token(encoded_token) @classmethod async def create_async_generator( @@ -95,9 +96,11 @@ class LiteIcoding(AsyncGeneratorProvider, ProviderModelMixin): response.raise_for_status() buffer = "" full_response = "" + def decode_content(data): bytes_array = bytes([int(b, 16) ^ 255 for b in data.split()]) return bytes_array.decode('utf-8') + async for chunk in response.content.iter_any(): if chunk: buffer += chunk.decode() -- cgit v1.2.3 From 96035435b4f8c6ed8df4246f4bf3627817f474d7 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 00:49:11 +0300 Subject: fix(g4f/Provider/MagickPen.py): update API credentials fetching URL --- g4f/Provider/MagickPen.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'g4f') diff --git a/g4f/Provider/MagickPen.py b/g4f/Provider/MagickPen.py index b6a47417..c15a59f5 100644 --- a/g4f/Provider/MagickPen.py +++ b/g4f/Provider/MagickPen.py @@ -24,21 +24,18 @@ class MagickPen(AsyncGeneratorProvider, ProviderModelMixin): @classmethod async def fetch_api_credentials(cls) -> tuple: - url = "https://magickpen.com/_nuxt/9e47cd7579e60a9d1f13.js" + url = "https://magickpen.com/_nuxt/bf709a9ce19f14e18116.js" async with ClientSession() as session: async with session.get(url) as response: text = await response.text() - # Extract the necessary values from the file pattern = r'"X-API-Secret":"(\w+)"' match = re.search(pattern, text) X_API_SECRET = match.group(1) if match else None - # Generate timestamp and nonce - timestamp = str(int(time.time() * 1000)) # in milliseconds + timestamp = str(int(time.time() * 1000)) nonce = str(random.random()) - # Generate the signature s = ["TGDBU9zCgM", timestamp, nonce] s.sort() signature_string = ''.join(s) -- cgit v1.2.3 From 1e859b683dcab7d384e3e2f5c26f8512366a59f5 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 01:03:05 +0300 Subject: refactor(g4f/Provider/Blackbox.py): update model names and adjust payload --- g4f/Provider/Blackbox.py | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) (limited to 'g4f') diff --git a/g4f/Provider/Blackbox.py b/g4f/Provider/Blackbox.py index 3e183076..456bcd2d 100644 --- a/g4f/Provider/Blackbox.py +++ b/g4f/Provider/Blackbox.py @@ -23,20 +23,11 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin): 'gemini-1.5-flash', "llama-3.1-8b", 'llama-3.1-70b', - 'llama-3.1-405b', 'ImageGenerationLV45LJp', - 'GPT-4o', - 'Gemini-PRO', - 'Claude-Sonnet-3.5', + 'gpt-4o', + 'gemini-pro', + 'claude-sonnet-3.5', ] - - model_aliases = { - "gemini-flash": "gemini-1.5-flash", - "flux": "ImageGenerationLV45LJp", - "gpt-4o": "GPT-4o", - "gemini-pro": "Gemini-PRO", - "claude-3.5-sonnet": "Claude-Sonnet-3.5", - } agentMode = { 'ImageGenerationLV45LJp': {'mode': True, 'id': "ImageGenerationLV45LJp", 'name': "Image Generation"}, @@ -47,13 +38,17 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin): "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"}, } userSelectedModel = { - "GPT-4o": "GPT-4o", - "Gemini-PRO": "Gemini-PRO", - 'Claude-Sonnet-3.5': "Claude-Sonnet-3.5", + "gpt-4o": "gpt-4o", + "gemini-pro": "gemini-pro", + 'claude-sonnet-3.5': "claude-sonnet-3.5", + } + + model_aliases = { + "gemini-flash": "gemini-1.5-flash", + "flux": "ImageGenerationLV45LJp", } @classmethod @@ -119,8 +114,9 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin): "agentMode": {}, "trendingAgentMode": {}, "userSelectedModel": None, + "userSystemPrompt": None, "isMicMode": False, - "maxTokens": 99999999, + "maxTokens": 1024, "playgroundTopP": 0.9, "playgroundTemperature": 0.5, "isChromeExt": False, -- cgit v1.2.3 From 410b46d30832d6ef251cf99da67d76a813c9c935 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 01:05:26 +0300 Subject: refactor(g4f/Provider/Bixin123.py): remove Bixin123 provider --- g4f/Provider/Bixin123.py | 94 ------------------------------------------------ 1 file changed, 94 deletions(-) delete mode 100644 g4f/Provider/Bixin123.py (limited to 'g4f') diff --git a/g4f/Provider/Bixin123.py b/g4f/Provider/Bixin123.py deleted file mode 100644 index 081064f9..00000000 --- a/g4f/Provider/Bixin123.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import annotations - -from aiohttp import ClientSession -import json -import random -from .base_provider import AsyncGeneratorProvider, ProviderModelMixin -from ..typing import AsyncResult, Messages -from .helper import format_prompt - -class Bixin123(AsyncGeneratorProvider, ProviderModelMixin): - url = "https://chat.bixin123.com" - api_endpoint = "https://chat.bixin123.com/api/chatgpt/chat-process" - working = True - supports_gpt_35_turbo = True - supports_gpt_4 = True - - default_model = 'gpt-3.5-turbo-0125' - models = ['gpt-3.5-turbo', 'gpt-3.5-turbo-0125', 'gpt-3.5-turbo-16k-0613', 'gpt-4-turbo', 'qwen-turbo'] - - model_aliases = { - "gpt-3.5-turbo": "gpt-3.5-turbo-0125", - "gpt-3.5-turbo": "gpt-3.5-turbo-16k-0613", - } - - @classmethod - def get_model(cls, model: str) -> str: - if model in cls.models: - return model - elif model in cls.model_aliases: - return cls.model_aliases[model] - else: - return cls.default_model - - @classmethod - def generate_fingerprint(cls) -> str: - return str(random.randint(100000000, 999999999)) - - @classmethod - async def create_async_generator( - cls, - model: str, - messages: Messages, - proxy: str = None, - **kwargs - ) -> AsyncResult: - model = cls.get_model(model) - - headers = { - "accept": "application/json, text/plain, */*", - "accept-language": "en-US,en;q=0.9", - "cache-control": "no-cache", - "content-type": "application/json", - "fingerprint": cls.generate_fingerprint(), - "origin": cls.url, - "pragma": "no-cache", - "priority": "u=1, i", - "referer": f"{cls.url}/chat", - "sec-ch-ua": '"Chromium";v="127", "Not)A;Brand";v="99"', - "sec-ch-ua-mobile": "?0", - "sec-ch-ua-platform": '"Linux"', - "sec-fetch-dest": "empty", - "sec-fetch-mode": "cors", - "sec-fetch-site": "same-origin", - "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36", - "x-website-domain": "chat.bixin123.com", - } - - async with ClientSession(headers=headers) as session: - prompt = format_prompt(messages) - data = { - "prompt": prompt, - "options": { - "usingNetwork": False, - "file": "" - } - } - async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response: - response.raise_for_status() - response_text = await response.text() - - lines = response_text.strip().split("\n") - last_json = None - for line in reversed(lines): - try: - last_json = json.loads(line) - break - except json.JSONDecodeError: - pass - - if last_json: - text = last_json.get("text", "") - yield text - else: - yield "" -- cgit v1.2.3 From cba121daac8a0365fc192a901d8d3023f13fa535 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 01:15:38 +0300 Subject: feat(g4f/Provider/ChatGpt.py): enhance error handling and add debugging 2 --- g4f/Provider/ChatGpt.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'g4f') diff --git a/g4f/Provider/ChatGpt.py b/g4f/Provider/ChatGpt.py index 37ad17d8..b5a78b9a 100644 --- a/g4f/Provider/ChatGpt.py +++ b/g4f/Provider/ChatGpt.py @@ -136,7 +136,6 @@ class ChatGpt(AbstractProvider, ProviderModelMixin): response = session.post('https://chatgpt.com/backend-anon/sentinel/chat-requirements', headers=headers, json={'p': pow_req}) - # Додана перевірка на статус відповідей, якщо "незвична активність" if response.status_code != 200: print(f"Request failed with status: {response.status_code}") print(f"Response content: {response.content}") @@ -199,7 +198,6 @@ class ChatGpt(AbstractProvider, ProviderModelMixin): }, } - # Додав паузу між запитами для уникнення блокувань через частоту time.sleep(2) response = session.post('https://chatgpt.com/backend-anon/conversation', @@ -209,10 +207,10 @@ class ChatGpt(AbstractProvider, ProviderModelMixin): for line in response.iter_lines(): if line: decoded_line = line.decode() - print(f"Received line: {decoded_line}") # Debugging output + print(f"Received line: {decoded_line}") if decoded_line.startswith('data:'): - json_string = decoded_line[6:] # Extract JSON part after 'data:' - if json_string.strip(): # Check if there's actual content + json_string = decoded_line[6:] + if json_string.strip(): try: data = json.loads(json_string) except json.JSONDecodeError as e: -- cgit v1.2.3 From 80503af1041c3eda0664073e62911dd569832603 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 13:25:56 +0300 Subject: feat(g4f/Provider/Blackbox.py): add support for llama-3.1-405b model --- g4f/Provider/Blackbox.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'g4f') diff --git a/g4f/Provider/Blackbox.py b/g4f/Provider/Blackbox.py index 456bcd2d..b074d28f 100644 --- a/g4f/Provider/Blackbox.py +++ b/g4f/Provider/Blackbox.py @@ -23,6 +23,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin): 'gemini-1.5-flash', "llama-3.1-8b", 'llama-3.1-70b', + 'llama-3.1-405b', 'ImageGenerationLV45LJp', 'gpt-4o', 'gemini-pro', @@ -38,6 +39,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin): "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"}, } userSelectedModel = { -- cgit v1.2.3 From 8b73fa926d2b8a2a4ac844b053df695d6fd2ad8e Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Thu, 3 Oct 2024 13:27:40 +0300 Subject: feat(g4f/models.py): enhance llama_3_1_405b with Blackbox provider --- g4f/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'g4f') diff --git a/g4f/models.py b/g4f/models.py index 31cd4003..f1d50922 100644 --- a/g4f/models.py +++ b/g4f/models.py @@ -206,7 +206,7 @@ llama_3_1_70b = Model( llama_3_1_405b = Model( name = "llama-3.1-405b", base_provider = "Meta Llama", - best_provider = IterListProvider([DeepInfraChat, Airforce]) + best_provider = IterListProvider([DeepInfraChat, Blackbox, Airforce]) ) llama_3_1 = Model( -- cgit v1.2.3