From f1683c8db83cee5805a6e103fca2c2551aae5086 Mon Sep 17 00:00:00 2001 From: kqlio67 Date: Sat, 31 Aug 2024 09:47:39 +0300 Subject: Comprehensive Updates and Enhancements Across Multiple Providers --- g4f/Provider/Liaobots.py | 270 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 193 insertions(+), 77 deletions(-) (limited to 'g4f/Provider/Liaobots.py') diff --git a/g4f/Provider/Liaobots.py b/g4f/Provider/Liaobots.py index 2034c34a..8a9f46b1 100644 --- a/g4f/Provider/Liaobots.py +++ b/g4f/Provider/Liaobots.py @@ -1,7 +1,6 @@ from __future__ import annotations import uuid -import requests from aiohttp import ClientSession, BaseConnector from ..typing import AsyncResult, Messages @@ -9,22 +8,170 @@ from .base_provider import AsyncGeneratorProvider, ProviderModelMixin from .helper import get_connector from ..requests import raise_for_status +models = { + "gpt-4o-mini-free": { + "id": "gpt-4o-mini-free", + "name": "GPT-4o-Mini-Free", + "model": "ChatGPT", + "provider": "OpenAI", + "maxLength": 31200, + "tokenLimit": 7800, + "context": "8K", + }, + "gpt-4o-mini": { + "id": "gpt-4o-mini", + "name": "GPT-4o-Mini", + "model": "ChatGPT", + "provider": "OpenAI", + "maxLength": 260000, + "tokenLimit": 126000, + "context": "128K", + }, + "gpt-4o-free": { + "id": "gpt-4o-free", + "name": "GPT-4o-free", + "model": "ChatGPT", + "provider": "OpenAI", + "maxLength": 31200, + "tokenLimit": 7800, + "context": "8K", + }, + "gpt-4-turbo-2024-04-09": { + "id": "gpt-4-turbo-2024-04-09", + "name": "GPT-4-Turbo", + "model": "ChatGPT", + "provider": "OpenAI", + "maxLength": 260000, + "tokenLimit": 126000, + "context": "128K", + }, + "gpt-4o-2024-08-06": { + "id": "gpt-4o-2024-08-06", + "name": "GPT-4o", + "model": "ChatGPT", + "provider": "OpenAI", + "maxLength": 260000, + "tokenLimit": 126000, + "context": "128K", + }, + "gpt-4-0613": { + "id": "gpt-4-0613", + "name": "GPT-4-0613", + "model": "ChatGPT", + "provider": "OpenAI", + "maxLength": 32000, + "tokenLimit": 7600, + "context": "8K", + }, + "claude-3-opus-20240229": { + "id": "claude-3-opus-20240229", + "name": "Claude-3-Opus", + "model": "Claude", + "provider": "Anthropic", + "maxLength": 800000, + "tokenLimit": 200000, + "context": "200K", + }, + "claude-3-opus-20240229-aws": { + "id": "claude-3-opus-20240229-aws", + "name": "Claude-3-Opus-Aws", + "model": "Claude", + "provider": "Anthropic", + "maxLength": 800000, + "tokenLimit": 200000, + "context": "200K", + }, + "claude-3-opus-20240229-gcp": { + "id": "claude-3-opus-20240229-gcp", + "name": "Claude-3-Opus-Gcp", + "model": "Claude", + "provider": "Anthropic", + "maxLength": 800000, + "tokenLimit": 200000, + "context": "200K", + }, + "claude-3-sonnet-20240229": { + "id": "claude-3-sonnet-20240229", + "name": "Claude-3-Sonnet", + "model": "Claude", + "provider": "Anthropic", + "maxLength": 800000, + "tokenLimit": 200000, + "context": "200K", + }, + "claude-3-5-sonnet-20240620": { + "id": "claude-3-5-sonnet-20240620", + "name": "Claude-3.5-Sonnet", + "model": "Claude", + "provider": "Anthropic", + "maxLength": 800000, + "tokenLimit": 200000, + "context": "200K", + }, + "claude-3-haiku-20240307": { + "id": "claude-3-haiku-20240307", + "name": "Claude-3-Haiku", + "model": "Claude", + "provider": "Anthropic", + "maxLength": 800000, + "tokenLimit": 200000, + "context": "200K", + }, + "claude-2.1": { + "id": "claude-2.1", + "name": "Claude-2.1-200k", + "model": "Claude", + "provider": "Anthropic", + "maxLength": 800000, + "tokenLimit": 200000, + "context": "200K", + }, + "gemini-1.0-pro-latest": { + "id": "gemini-1.0-pro-latest", + "name": "Gemini-Pro", + "model": "Gemini", + "provider": "Google", + "maxLength": 120000, + "tokenLimit": 30000, + "context": "32K", + }, + "gemini-1.5-flash-latest": { + "id": "gemini-1.5-flash-latest", + "name": "Gemini-1.5-Flash-1M", + "model": "Gemini", + "provider": "Google", + "maxLength": 4000000, + "tokenLimit": 1000000, + "context": "1024K", + }, + "gemini-1.5-pro-latest": { + "id": "gemini-1.5-pro-latest", + "name": "Gemini-1.5-Pro-1M", + "model": "Gemini", + "provider": "Google", + "maxLength": 4000000, + "tokenLimit": 1000000, + "context": "1024K", + }, +} + + class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): url = "https://liaobots.site" working = True supports_message_history = True supports_system_message = True - supports_gpt_35_turbo = True supports_gpt_4 = True default_model = "gpt-4o" - models = None + models = list(models.keys()) + model_aliases = { "gpt-4o-mini": "gpt-4o-mini-free", "gpt-4o": "gpt-4o-free", "gpt-4-turbo": "gpt-4-turbo-2024-04-09", "gpt-4o": "gpt-4o-2024-08-06", "gpt-4": "gpt-4-0613", - + "claude-3-opus": "claude-3-opus-20240229", "claude-3-opus": "claude-3-opus-20240229-aws", "claude-3-opus": "claude-3-opus-20240229-gcp", @@ -32,50 +179,32 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): "claude-3-5-sonnet": "claude-3-5-sonnet-20240620", "claude-3-haiku": "claude-3-haiku-20240307", "claude-2.1": "claude-2.1", - + "gemini-pro": "gemini-1.0-pro-latest", "gemini-flash": "gemini-1.5-flash-latest", "gemini-pro": "gemini-1.5-pro-latest", } + _auth_code = "" _cookie_jar = None @classmethod - def get_models(cls): - if cls.models is None: - url = 'https://liaobots.work/api/models' - headers = { - 'accept': '/', - 'accept-language': 'en-US,en;q=0.9', - 'content-type': 'application/json', - 'cookie': 'gkp2=ehnhUPJtkCgMmod8Sbxn', - 'origin': 'https://liaobots.work', - 'priority': 'u=1, i', - 'referer': 'https://liaobots.work/', - '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' - } - data = {'key': ''} - - response = requests.post(url, headers=headers, json=data) - - if response.status_code == 200: - try: - models_data = response.json() - cls.models = {model['id']: model for model in models_data} - except (ValueError, KeyError) as e: - print(f"Error processing JSON response: {e}") - cls.models = {} - else: - print(f"Request failed with status code: {response.status_code}") - cls.models = {} + def get_model(cls, model: str) -> str: + """ + Retrieve the internal model identifier based on the provided model name or alias. + """ + if model in cls.model_aliases: + model = cls.model_aliases[model] + if model not in models: + raise ValueError(f"Model '{model}' is not supported.") + return model - return cls.models + @classmethod + def is_supported(cls, model: str) -> bool: + """ + Check if the given model is supported. + """ + return model in models or model in cls.model_aliases @classmethod async def create_async_generator( @@ -87,6 +216,8 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): connector: BaseConnector = None, **kwargs ) -> AsyncResult: + model = cls.get_model(model) + headers = { "authority": "liaobots.com", "content-type": "application/json", @@ -99,10 +230,9 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): cookie_jar=cls._cookie_jar, connector=get_connector(connector, proxy, True) ) as session: - models = cls.get_models() data = { "conversationId": str(uuid.uuid4()), - "model": models[cls.get_model(model)], + "model": models[model], "messages": messages, "key": "", "prompt": kwargs.get("system_message", "You are a helpful assistant."), @@ -115,11 +245,20 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): ) as response: await raise_for_status(response) try: - await cls.ensure_auth_code(session) + async with session.post( + "https://liaobots.work/api/user", + json={"authcode": cls._auth_code}, + verify_ssl=False + ) as response: + await raise_for_status(response) + cls._auth_code = (await response.json(content_type=None))["authCode"] + if not cls._auth_code: + raise RuntimeError("Empty auth code") + cls._cookie_jar = session.cookie_jar async with session.post( "https://liaobots.work/api/chat", json=data, - headers={"x-auth-code": cls._auth_code}, + headers={"x-auth-code": cls._auth_code}, verify_ssl=False ) as response: await raise_for_status(response) @@ -129,7 +268,16 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): if chunk: yield chunk.decode(errors="ignore") except: - await cls.initialize_auth_code(session) + async with session.post( + "https://liaobots.work/api/user", + json={"authcode": "pTIQr4FTnVRfr"}, + verify_ssl=False + ) as response: + await raise_for_status(response) + cls._auth_code = (await response.json(content_type=None))["authCode"] + if not cls._auth_code: + raise RuntimeError("Empty auth code") + cls._cookie_jar = session.cookie_jar async with session.post( "https://liaobots.work/api/chat", json=data, @@ -142,24 +290,6 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): raise RuntimeError("Invalid session") if chunk: yield chunk.decode(errors="ignore") - @classmethod - def get_model(cls, model: str) -> str: - """ - Retrieve the internal model identifier based on the provided model name or alias. - """ - if model in cls.model_aliases: - model = cls.model_aliases[model] - models = cls.get_models() - if model not in models: - raise ValueError(f"Model '{model}' is not supported.") - return model - @classmethod - def is_supported(cls, model: str) -> bool: - """ - Check if the given model is supported. - """ - models = cls.get_models() - return model in models or model in cls.model_aliases @classmethod async def initialize_auth_code(cls, session: ClientSession) -> None: @@ -176,6 +306,7 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): if not cls._auth_code: raise RuntimeError("Empty auth code") cls._cookie_jar = session.cookie_jar + @classmethod async def ensure_auth_code(cls, session: ClientSession) -> None: """ @@ -183,18 +314,3 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): """ if not cls._auth_code: await cls.initialize_auth_code(session) - - @classmethod - async def refresh_auth_code(cls, session: ClientSession) -> None: - """ - Refresh the auth code by making a new request. - """ - await cls.initialize_auth_code(session) - - @classmethod - async def get_auth_code(cls, session: ClientSession) -> str: - """ - Get the current auth code, initializing it if necessary. - """ - await cls.ensure_auth_code(session) - return cls._auth_code \ No newline at end of file -- cgit v1.2.3