diff options
Diffstat (limited to 'g4f/Provider/Liaobots.py')
-rw-r--r-- | g4f/Provider/Liaobots.py | 225 |
1 files changed, 117 insertions, 108 deletions
diff --git a/g4f/Provider/Liaobots.py b/g4f/Provider/Liaobots.py index 75ecf300..2034c34a 100644 --- a/g4f/Provider/Liaobots.py +++ b/g4f/Provider/Liaobots.py @@ -1,7 +1,7 @@ from __future__ import annotations import uuid - +import requests from aiohttp import ClientSession, BaseConnector from ..typing import AsyncResult, Messages @@ -9,89 +9,6 @@ from .base_provider import AsyncGeneratorProvider, ProviderModelMixin from .helper import get_connector from ..requests import raise_for_status -models = { - "gpt-4o": { - "context": "8K", - "id": "gpt-4o-free", - "maxLength": 31200, - "model": "ChatGPT", - "name": "GPT-4o-free", - "provider": "OpenAI", - "tokenLimit": 7800, - }, - "gpt-3.5-turbo": { - "id": "gpt-3.5-turbo", - "name": "GPT-3.5-Turbo", - "maxLength": 48000, - "tokenLimit": 14000, - "context": "16K", - }, - "gpt-4-turbo": { - "id": "gpt-4-turbo-preview", - "name": "GPT-4-Turbo", - "maxLength": 260000, - "tokenLimit": 126000, - "context": "128K", - }, - "gpt-4": { - "id": "gpt-4-plus", - "name": "GPT-4-Plus", - "maxLength": 130000, - "tokenLimit": 31000, - "context": "32K", - }, - "gpt-4-0613": { - "id": "gpt-4-0613", - "name": "GPT-4-0613", - "maxLength": 60000, - "tokenLimit": 15000, - "context": "16K", - }, - "gemini-pro": { - "id": "gemini-pro", - "name": "Gemini-Pro", - "maxLength": 120000, - "tokenLimit": 30000, - "context": "32K", - }, - "claude-3-opus-20240229": { - "id": "claude-3-opus-20240229", - "name": "Claude-3-Opus", - "maxLength": 800000, - "tokenLimit": 200000, - "context": "200K", - }, - "claude-3-sonnet-20240229": { - "id": "claude-3-sonnet-20240229", - "name": "Claude-3-Sonnet", - "maxLength": 800000, - "tokenLimit": 200000, - "context": "200K", - }, - "claude-2.1": { - "id": "claude-2.1", - "name": "Claude-2.1-200k", - "maxLength": 800000, - "tokenLimit": 200000, - "context": "200K", - }, - "claude-2.0": { - "id": "claude-2.0", - "name": "Claude-2.0-100k", - "maxLength": 400000, - "tokenLimit": 100000, - "context": "100K", - }, - "claude-instant-1": { - "id": "claude-instant-1", - "name": "Claude-instant-1", - "maxLength": 400000, - "tokenLimit": 100000, - "context": "100K", - } -} - - class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): url = "https://liaobots.site" working = True @@ -99,15 +16,68 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): supports_system_message = True supports_gpt_35_turbo = True supports_gpt_4 = True - default_model = "gpt-3.5-turbo" - models = list(models) + default_model = "gpt-4o" + models = None model_aliases = { - "claude-v2": "claude-2" + "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", + "claude-3-sonnet": "claude-3-sonnet-20240229", + "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 = {} + + return cls.models + + @classmethod async def create_async_generator( cls, model: str, @@ -129,6 +99,7 @@ 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)], @@ -144,20 +115,11 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): ) as response: await raise_for_status(response) try: - 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 + await cls.ensure_auth_code(session) 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) @@ -167,16 +129,7 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin): if chunk: yield chunk.decode(errors="ignore") except: - 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 + await cls.initialize_auth_code(session) async with session.post( "https://liaobots.work/api/chat", json=data, @@ -189,3 +142,59 @@ 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: + """ + Initialize the auth code by making the necessary login requests. + """ + 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 + @classmethod + async def ensure_auth_code(cls, session: ClientSession) -> None: + """ + Ensure the auth code is initialized, and if not, perform the initialization. + """ + 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 |