XFEstudio/gpt4free
feat(g4f): Major provider updates and new model support (#2437)
* refactor(g4f/Provider/Airforce.py): Enhance Airforce provider with dynamic model fetching * refactor(g4f/Provider/Blackbox.py): Enhance Blackbox AI provider configuration and streamline code * feat(g4f/Provider/RobocodersAPI.py): Add RobocodersAPI new async chat provider * refactor(g4f/client/__init__.py): Improve provider handling in async_generate method * refactor(g4f/models.py): Update provider configurations for multiple models * refactor(g4f/Provider/Blackbox.py): Streamline model configuration and improve response handling * feat(g4f/Provider/DDG.py): Enhance model support and improve conversation handling * refactor(g4f/Provider/Copilot.py): Enhance Copilot provider with model support * refactor(g4f/Provider/AmigoChat.py): update models and improve code structure * chore(g4f/Provider/not_working/AIUncensored.): move AIUncensored to not_working directory * chore(g4f/Provider/not_working/Allyfy.py): remove Allyfy provider * Update (g4f/Provider/not_working/AIUncensored.py g4f/Provider/not_working/__init__.py) * refactor(g4f/Provider/ChatGptEs.py): Implement format_prompt for message handling * refactor(g4f/Provider/Blackbox.py): Update message formatting and improve code structure * refactor(g4f/Provider/LLMPlayground.py): Enhance text generation and error handling * refactor(g4f/Provider/needs_auth/PollinationsAI.py): move PollinationsAI to needs_auth directory * refactor(g4f/Provider/Liaobots.py): Update Liaobots provider models and aliases * feat(g4f/Provider/DeepInfraChat.py): Add new DeepInfra models and aliases * Update (g4f/Provider/__init__.py) * Update (g4f/models.py) * g4f/models.py * Update g4f/models.py * Update g4f/Provider/LLMPlayground.py * Update (g4f/models.py g4f/Provider/Airforce.py g4f/Provider/__init__.py g4f/Provider/LLMPlayground.py) * Update g4f/Provider/__init__.py * Update (g4f/Provider/Airforce.py) --------- Co-authored-by: kqlio67 <kqlio67@users.noreply.github.com>
8d5d522c
代码差异
@@ -14,6 +14,19 @@ from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
from ..image import ImageResponse
from ..requests import StreamSession, raise_for_status
def split_message(message: str, max_length: int = 1000) -> list[str]:
"""Splits the message into parts up to (max_length)."""
chunks = []
while len(message) > max_length:
split_point = message.rfind(' ', 0, max_length)
if split_point == -1:
split_point = max_length
chunks.append(message[:split_point])
message = message[split_point:].strip()
if message:
chunks.append(message)
return chunks
class Airforce(AsyncGeneratorProvider, ProviderModelMixin):
url = "https://llmplayground.net"
api_endpoint_completions = "https://api.airforce/chat/completions"
@@ -84,6 +97,7 @@ class Airforce(AsyncGeneratorProvider, ProviderModelMixin):
# HuggingFaceH4
"zephyr-7b": "zephyr-7b-beta",
### imagine ###
"sdxl": "stable-diffusion-xl-base",
"sdxl": "stable-diffusion-xl-lightning",
@@ -125,7 +139,6 @@ class Airforce(AsyncGeneratorProvider, ProviderModelMixin):
"accept": "*/*",
"accept-language": "en-US,en;q=0.9",
"cache-control": "no-cache",
"origin": "https://llmplayground.net",
"user-agent": "Mozilla/5.0"
}
if seed is None:
@@ -167,35 +180,47 @@ class Airforce(AsyncGeneratorProvider, ProviderModelMixin):
"content-type": "application/json",
"user-agent": "Mozilla/5.0"
}
full_message = "\n".join(
[f"{msg['role'].capitalize()}: {msg['content']}" for msg in messages]
)
message_chunks = split_message(full_message, max_length=1000)
async with StreamSession(headers=headers, proxy=proxy) as session:
data = {
"messages": messages,
"model": model,
"max_tokens": max_tokens,
"temperature": temperature,
"top_p": top_p,
"stream": stream
}
async with session.post(cls.api_endpoint_completions, json=data) as response:
await raise_for_status(response)
content_type = response.headers.get('Content-Type', '').lower()
if 'application/json' in content_type:
json_data = await response.json()
if json_data.get("model") == "error":
raise RuntimeError(json_data['choices'][0]['message'].get('content', ''))
if stream:
async for line in response.iter_lines():
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', '')
if content:
yield cls._filter_content(content)
else:
json_data = await response.json()
content = json_data['choices'][0]['message']['content']
yield cls._filter_content(content)
full_response = ""
for chunk in message_chunks:
data = {
"messages": [{"role": "user", "content": chunk}],
"model": model,
"max_tokens": max_tokens,
"temperature": temperature,
"top_p": top_p,
"stream": stream
}
async with session.post(cls.api_endpoint_completions, json=data) as response:
await raise_for_status(response)
content_type = response.headers.get('Content-Type', '').lower()
if 'application/json' in content_type:
json_data = await response.json()
if json_data.get("model") == "error":
raise RuntimeError(json_data['choices'][0]['message'].get('content', ''))
if stream:
async for line in response.iter_lines():
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', '')
if content:
yield cls._filter_content(content)
else:
content = json_data['choices'][0]['message']['content']
full_response += cls._filter_content(content)
yield full_response
@classmethod
def _filter_content(cls, part_response: str) -> str:
@@ -210,4 +235,10 @@ class Airforce(AsyncGeneratorProvider, ProviderModelMixin):
'',
part_response
)
part_response = re.sub(
r"\[ERROR\] '\w{8}-\w{4}-\w{4}-\w{4}-\w{12}'", # any-uncensored
'',
part_response
)
return part_response
@@ -9,6 +9,69 @@ from ..image import ImageResponse
from ..requests import StreamSession, raise_for_status
from ..errors import ResponseStatusError
MODELS = {
'chat': {
'gpt-4o-2024-11-20': {'persona_id': "gpt"},
'gpt-4o': {'persona_id': "summarizer"},
'gpt-4o-mini': {'persona_id': "gemini-1-5-flash"},
'o1-preview-': {'persona_id': "openai-o-one"}, # Amigo, your balance is not enough to make the request, wait until 12 UTC or upgrade your plan
'o1-preview-2024-09-12-': {'persona_id': "orion"}, # Amigo, your balance is not enough to make the request, wait until 12 UTC or upgrade your plan
'o1-mini-': {'persona_id': "openai-o-one-mini"}, # Amigo, your balance is not enough to make the request, wait until 12 UTC or upgrade your plan
'meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo': {'persona_id': "llama-three-point-one"},
'meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo': {'persona_id': "llama-3-2"},
'codellama/CodeLlama-34b-Instruct-hf': {'persona_id': "codellama-CodeLlama-34b-Instruct-hf"},
'gemini-1.5-pro': {'persona_id': "gemini-1-5-pro"}, # Amigo, your balance is not enough to make the request, wait until 12 UTC or upgrade your plan
'gemini-1.5-flash': {'persona_id': "amigo"},
'claude-3-5-sonnet-20240620': {'persona_id': "claude"},
'claude-3-5-sonnet-20241022': {'persona_id': "clude-claude-3-5-sonnet-20241022"},
'claude-3-5-haiku-latest': {'persona_id': "3-5-haiku"},
'Qwen/Qwen2.5-72B-Instruct-Turbo': {'persona_id': "qwen-2-5"},
'google/gemma-2b-it': {'persona_id': "google-gemma-2b-it"},
'google/gemma-7b': {'persona_id': "google-gemma-7b"}, # Error handling AIML chat completion stream
'Gryphe/MythoMax-L2-13b': {'persona_id': "Gryphe-MythoMax-L2-13b"},
'mistralai/Mistral-7B-Instruct-v0.3': {'persona_id': "mistralai-Mistral-7B-Instruct-v0.1"},
'mistralai/mistral-tiny': {'persona_id': "mistralai-mistral-tiny"},
'mistralai/mistral-nemo': {'persona_id': "mistralai-mistral-nemo"},
'deepseek-ai/deepseek-llm-67b-chat': {'persona_id': "deepseek-ai-deepseek-llm-67b-chat"},
'databricks/dbrx-instruct': {'persona_id': "databricks-dbrx-instruct"},
'NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO': {'persona_id': "NousResearch-Nous-Hermes-2-Mixtral-8x7B-DPO"},
'x-ai/grok-beta': {'persona_id': "x-ai-grok-beta"},
'anthracite-org/magnum-v4-72b': {'persona_id': "anthracite-org-magnum-v4-72b"},
'cohere/command-r-plus': {'persona_id': "cohere-command-r-plus"},
'ai21/jamba-1-5-mini': {'persona_id': "ai21-jamba-1-5-mini"},
'zero-one-ai/Yi-34B': {'persona_id': "zero-one-ai-Yi-34B"} # Error handling AIML chat completion stream
},
'image': {
'flux-pro/v1.1': {'persona_id': "flux-1-1-pro"}, # Amigo, your balance is not enough to make the request, wait until 12 UTC or upgrade your plan
'flux-realism': {'persona_id': "flux-realism"},
'flux-pro': {'persona_id': "flux-pro"}, # Amigo, your balance is not enough to make the request, wait until 12 UTC or upgrade your plan
'flux-pro/v1.1-ultra': {'persona_id': "flux-pro-v1.1-ultra"}, # Amigo, your balance is not enough to make the request, wait until 12 UTC or upgrade your plan
'flux-pro/v1.1-ultra-raw': {'persona_id': "flux-pro-v1.1-ultra-raw"}, # Amigo, your balance is not enough to make the request, wait until 12 UTC or upgrade your plan
'flux/dev': {'persona_id': "flux-dev"},
'dalle-e-3': {'persona_id': "dalle-three"},
'recraft-v3': {'persona_id': "recraft"}
}
}
class AmigoChat(AsyncGeneratorProvider, ProviderModelMixin):
url = "https://amigochat.io/chat/"
chat_api_endpoint = "https://api.amigochat.io/v1/chat/completions"
@@ -17,58 +80,67 @@ class AmigoChat(AsyncGeneratorProvider, ProviderModelMixin):
supports_stream = True
supports_system_message = True
supports_message_history = True
default_model = 'gpt-4o-mini'
chat_models = [
'gpt-4o',
default_model,
'o1-preview',
'o1-mini',
'meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo',
'meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo',
'claude-3-sonnet-20240229',
'gemini-1.5-pro',
]
image_models = [
'flux-pro/v1.1',
'flux-realism',
'flux-pro',
'dalle-e-3',
]
models = [*chat_models, *image_models]
chat_models = list(MODELS['chat'].keys())
image_models = list(MODELS['image'].keys())
models = chat_models + image_models
model_aliases = {
"o1": "o1-preview",
### chat ###
"gpt-4o": "gpt-4o-2024-11-20",
"gpt-4o-mini": "gpt-4o-mini",
"llama-3.1-405b": "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo",
"llama-3.2-90b": "meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo",
"claude-3.5-sonnet": "claude-3-sonnet-20240229",
"gemini-pro": "gemini-1.5-pro",
"codellama-34b": "codellama/CodeLlama-34b-Instruct-hf",
"gemini-flash": "gemini-1.5-flash",
"claude-3.5-sonnet": "claude-3-5-sonnet-20240620",
"claude-3.5-sonnet": "claude-3-5-sonnet-20241022",
"claude-3.5-haiku": "claude-3-5-haiku-latest",
"qwen-2.5-72b": "Qwen/Qwen2.5-72B-Instruct-Turbo",
"gemma-2b": "google/gemma-2b-it",
"mythomax-13b": "Gryphe/MythoMax-L2-13b",
"mixtral-7b": "mistralai/Mistral-7B-Instruct-v0.3",
"mistral-tiny": "mistralai/mistral-tiny",
"mistral-nemo": "mistralai/mistral-nemo",
"deepseek-chat": "deepseek-ai/deepseek-llm-67b-chat",
"dbrx-instruct": "databricks/dbrx-instruct",
"mixtral-8x7b-dpo": "NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",
"grok-beta": "x-ai/grok-beta",
"magnum-72b": "anthracite-org/magnum-v4-72b",
"command-r-plus": "cohere/command-r-plus",
"jamba-mini": "ai21/jamba-1-5-mini",
### image ###
"flux-realism": "flux-realism",
"flux-dev": "flux/dev",
"flux-pro": "flux-pro/v1.1",
"dalle-3": "dalle-e-3",
}
persona_ids = {
'gpt-4o': "gpt",
'gpt-4o-mini': "amigo",
'o1-preview': "openai-o-one",
'o1-mini': "openai-o-one-mini",
'meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo': "llama-three-point-one",
'meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo': "llama-3-2",
'claude-3-sonnet-20240229': "claude",
'gemini-1.5-pro': "gemini-1-5-pro",
'flux-pro/v1.1': "flux-1-1-pro",
'flux-realism': "flux-realism",
'flux-pro': "flux-pro",
'dalle-e-3': "dalle-three",
}
@classmethod
def get_personaId(cls, model: str) -> str:
return cls.persona_ids[model]
if model in cls.chat_models:
return MODELS['chat'][model]['persona_id']
elif model in cls.image_models:
return MODELS['image'][model]['persona_id']
else:
raise ValueError(f"Unknown model: {model}")
@classmethod
async def create_async_generator(
@@ -110,7 +182,7 @@ class AmigoChat(AsyncGeneratorProvider, ProviderModelMixin):
"x-device-language": "en-US",
"x-device-platform": "web",
"x-device-uuid": device_uuid,
"x-device-version": "1.0.41"
"x-device-version": "1.0.42"
}
async with StreamSession(headers=headers, proxy=proxy) as session:
@@ -11,6 +11,8 @@ from ..typing import AsyncResult, Messages, ImageType
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
from ..image import ImageResponse, to_data_uri
from .helper import format_prompt
class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
label = "Blackbox AI"
url = "https://www.blackbox.ai"
@@ -37,7 +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-405"},
'llama-3.1-405b': {'mode': True, 'id': "llama-3.1-405"},
#
'Python Agent': {'mode': True, 'id': "Python Agent"},
'Java Agent': {'mode': True, 'id': "Java Agent"},
@@ -62,7 +64,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
'Go Agent': {'mode': True, 'id': "Go Agent"},
'Gitlab Agent': {'mode': True, 'id': "Gitlab Agent"},
'Git Agent': {'mode': True, 'id': "Git Agent"},
'Flask Agent': {'mode': True, 'id': "Flask Agent"},
'Flask Agent': {'mode': True, 'id': "Flask Agent"},
'Firebase Agent': {'mode': True, 'id': "Firebase Agent"},
'FastAPI Agent': {'mode': True, 'id': "FastAPI Agent"},
'Erlang Agent': {'mode': True, 'id': "Erlang Agent"},
@@ -165,6 +167,9 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
message_id = cls.generate_id()
messages = cls.add_prefix_to_messages(messages, model)
validated_value = await cls.fetch_validated()
formatted_message = format_prompt(messages)
messages = [{"id": message_id, "content": formatted_message, "role": "user"}]
if image is not None:
messages[-1]['data'] = {
@@ -56,6 +56,8 @@ class ChatGptEs(AsyncGeneratorProvider, ProviderModelMixin):
nonce_ = re.findall(r'data-nonce="(.+?)"', await initial_response.text())[0]
post_id = re.findall(r'data-post-id="(.+?)"', await initial_response.text())[0]
formatted_prompt = format_prompt(messages)
conversation_history = [
"Human: You are a helpful AI assistant. Please respond in the same language that the user uses in their message. Provide accurate, relevant and helpful information while maintaining a friendly and professional tone. If you're not sure about something, please acknowledge that and provide the best information you can while noting any uncertainties. Focus on being helpful while respecting the user's choice of language."
]
@@ -71,7 +73,7 @@ class ChatGptEs(AsyncGeneratorProvider, ProviderModelMixin):
'post_id': post_id,
'url': cls.url,
'action': 'wpaicg_chat_shortcode_message',
'message': messages[-1]['content'],
'message': formatted_prompt,
'bot_id': '0',
'chatbot_identity': 'shortcode',
'wpaicg_chat_client_id': os.urandom(5).hex(),
@@ -17,13 +17,13 @@ try:
except ImportError:
has_nodriver = False
from .base_provider import AbstractProvider, BaseConversation
from .base_provider import AbstractProvider, ProviderModelMixin, BaseConversation
from .helper import format_prompt
from ..typing import CreateResult, Messages, ImageType
from ..errors import MissingRequirementsError
from ..requests.raise_for_status import raise_for_status
from ..providers.asyncio import get_running_loop
from ..Provider.openai.har_file import NoValidHarFileError, get_headers, get_har_files
from .openai.har_file import NoValidHarFileError, get_headers
from ..requests import get_nodriver
from ..image import ImageResponse, to_bytes, is_accepted_format
from .. import debug
@@ -38,12 +38,16 @@ class Conversation(BaseConversation):
self.cookie_jar = cookie_jar
self.access_token = access_token
class Copilot(AbstractProvider):
class Copilot(AbstractProvider, ProviderModelMixin):
label = "Microsoft Copilot"
url = "https://copilot.microsoft.com"
working = True
supports_stream = True
default_model = "Copilot"
models = [default_model]
model_aliases = {
"gpt-4": "Copilot",
}
websocket_url = "wss://copilot.microsoft.com/c/api/chat?api-version=2"
conversation_url = f"{url}/c/api/conversations"
@@ -209,4 +213,4 @@ def readHAR():
if api_key is None:
raise NoValidHarFileError("No access token found in .har files")
return api_key, cookies
return api_key, cookies
@@ -18,7 +18,8 @@ MODELS = [
{"model":"claude-3-opus-20240229","modelName":"Claude 3","modelVariant":"Opus","modelStyleId":"claude-3-haiku","createdBy":"Anthropic","moderationLevel":"HIGH","isAvailable":1,"inputCharLimit":16e3,"settingId":"2"},
{"model":"claude-3-haiku-20240307","modelName":"Claude 3","modelVariant":"Haiku","modelStyleId":"claude-3-haiku","createdBy":"Anthropic","moderationLevel":"HIGH","isAvailable":0,"inputCharLimit":16e3,"settingId":"1"},
{"model":"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo","modelName":"Llama 3.1","modelVariant":"70B","modelStyleId":"llama-3","createdBy":"Meta","moderationLevel":"MEDIUM","isAvailable":0,"isOpenSource":0,"inputCharLimit":16e3,"settingId":"5"},
{"model":"mistralai/Mixtral-8x7B-Instruct-v0.1","modelName":"Mixtral","modelVariant":"8x7B","modelStyleId":"mixtral","createdBy":"Mistral AI","moderationLevel":"LOW","isAvailable":0,"isOpenSource":0,"inputCharLimit":16e3,"settingId":"6"}
{"model":"mistralai/Mixtral-8x7B-Instruct-v0.1","modelName":"Mixtral","modelVariant":"8x7B","modelStyleId":"mixtral","createdBy":"Mistral AI","moderationLevel":"LOW","isAvailable":0,"isOpenSource":0,"inputCharLimit":16e3,"settingId":"6"},
{"model":"Qwen/Qwen2.5-Coder-32B-Instruct","modelName":"Qwen 2.5 Coder","modelVariant":"32B","modelStyleId":"qwen","createdBy":"Alibaba Cloud","moderationLevel":"LOW","isAvailable":0,"isOpenSource":1,"inputCharLimit":16e3,"settingId":"90"}
]
class Conversation(BaseConversation):
@@ -29,7 +30,7 @@ class Conversation(BaseConversation):
self.model = model
class DDG(AsyncGeneratorProvider, ProviderModelMixin):
url = "https://duckduckgo.com"
url = "https://duckduckgo.com/aichat"
api_endpoint = "https://duckduckgo.com/duckchat/v1/chat"
working = True
supports_stream = True
@@ -42,7 +43,7 @@ class DDG(AsyncGeneratorProvider, ProviderModelMixin):
"claude-3-haiku": "claude-3-haiku-20240307",
"llama-3.1-70b": "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
"mixtral-8x7b": "mistralai/Mixtral-8x7B-Instruct-v0.1",
"gpt-4": "gpt-4o-mini"
"gpt-4": "gpt-4o-mini",
}
@classmethod
@@ -75,7 +76,9 @@ class DDG(AsyncGeneratorProvider, ProviderModelMixin):
if conversation is None:
conversation = Conversation(model)
is_new_conversation = True
debug.last_model = model
if conversation.vqd is None:
conversation.vqd = await cls.get_vqd(proxy, connector)
if not conversation.vqd:
@@ -87,24 +90,35 @@ class DDG(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',
'x-vqd-4': conversation.vqd,
}
async with ClientSession(headers=headers, connector=get_connector(connector, proxy)) as session:
if is_new_conversation:
conversation.message_history = [{"role": "user", "content": format_prompt(messages)}]
else:
conversation.message_history = [
*conversation.message_history,
messages[-2],
messages[-1]
]
if len(messages) >= 2:
conversation.message_history = [
*conversation.message_history,
messages[-2],
messages[-1]
]
elif len(messages) == 1:
conversation.message_history = [
*conversation.message_history,
messages[-1]
]
if return_conversation:
yield conversation
data = {
"model": conversation.model,
"messages": conversation.message_history
}
async with session.post(cls.api_endpoint, json=data) as response:
conversation.vqd = response.headers.get("x-vqd-4")
await raise_for_status(response)
async for line in response.content:
if line:
decoded_line = line.decode('utf-8')
@@ -117,4 +131,4 @@ class DDG(AsyncGeneratorProvider, ProviderModelMixin):
if 'message' in json_data:
yield json_data['message']
except json.JSONDecodeError:
pass
pass
@@ -20,12 +20,16 @@ class DeepInfraChat(AsyncGeneratorProvider, ProviderModelMixin):
default_model,
'microsoft/WizardLM-2-8x22B',
'Qwen/Qwen2.5-72B-Instruct',
'Qwen/Qwen2.5-Coder-32B-Instruct',
'nvidia/Llama-3.1-Nemotron-70B-Instruct',
]
model_aliases = {
"llama-3.1-8b": "meta-llama/Meta-Llama-3.1-8B-Instruct",
"llama-3.1-70b": "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
"wizardlm-2-8x22b": "microsoft/WizardLM-2-8x22B",
"qwen-2-72b": "Qwen/Qwen2.5-72B-Instruct",
"qwen-2.5-coder-32b": "Qwen2.5-Coder-32B-Instruct",
"nemotron-70b": "nvidia/Llama-3.1-Nemotron-70B-Instruct",
}
@@ -18,24 +18,6 @@ models = {
"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-4o-2024-08-06": {
"id": "gpt-4o-2024-08-06",
"name": "GPT-4o",
@@ -45,36 +27,36 @@ models = {
"tokenLimit": 126000,
"context": "128K",
},
"gpt-4-turbo-2024-04-09": {
"id": "gpt-4-turbo-2024-04-09",
"name": "GPT-4-Turbo",
"gpt-4o-mini-2024-07-18": {
"id": "gpt-4o-mini-2024-07-18",
"name": "GPT-4o-Mini",
"model": "ChatGPT",
"provider": "OpenAI",
"maxLength": 260000,
"tokenLimit": 126000,
"context": "128K",
},
"grok-beta": {
"id": "grok-beta",
"name": "Grok-Beta",
"model": "Grok",
"provider": "x.ai",
"o1-preview": {
"id": "o1-preview",
"name": "o1-preview",
"model": "o1",
"provider": "OpenAI",
"maxLength": 400000,
"tokenLimit": 100000,
"context": "100K",
"context": "128K",
},
"grok-2": {
"id": "grok-2",
"name": "Grok-2",
"model": "Grok",
"provider": "x.ai",
"o1-mini": {
"id": "o1-mini",
"name": "o1-mini",
"model": "o1",
"provider": "OpenAI",
"maxLength": 400000,
"tokenLimit": 100000,
"context": "100K",
"context": "128K",
},
"grok-2-mini": {
"id": "grok-2-mini",
"name": "Grok-2-mini",
"grok-beta": {
"id": "grok-beta",
"name": "Grok-Beta",
"model": "Grok",
"provider": "x.ai",
"maxLength": 400000,
@@ -90,15 +72,6 @@ models = {
"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-5-sonnet-20240620": {
"id": "claude-3-5-sonnet-20240620",
"name": "Claude-3.5-Sonnet",
@@ -126,18 +99,18 @@ models = {
"tokenLimit": 200000,
"context": "200K",
},
"claude-3-haiku-20240307": {
"id": "claude-3-haiku-20240307",
"name": "Claude-3-Haiku",
"claude-3-opus-20240229-t": {
"id": "claude-3-opus-20240229-t",
"name": "Claude-3-Opus-T",
"model": "Claude",
"provider": "Anthropic",
"maxLength": 800000,
"tokenLimit": 200000,
"context": "200K",
},
"claude-2.1": {
"id": "claude-2.1",
"name": "Claude-2.1-200k",
"claude-3-5-sonnet-20241022-t": {
"id": "claude-3-5-sonnet-20241022-t",
"name": "Claude-3.5-Sonnet-V2-T",
"model": "Claude",
"provider": "Anthropic",
"maxLength": 800000,
@@ -155,13 +128,13 @@ models = {
},
"gemini-1.5-pro-002": {
"id": "gemini-1.5-pro-002",
"name": "Gemini-1.5-Pro-1M",
"name": "Gemini-1.5-Pro-1M",
"model": "Gemini",
"provider": "Google",
"maxLength": 4000000,
"tokenLimit": 1000000,
"context": "1024K",
},
}
}
@@ -175,22 +148,19 @@ class Liaobots(AsyncGeneratorProvider, ProviderModelMixin):
model_aliases = {
"gpt-4o-mini": "gpt-4o-mini-free",
"gpt-4o": "gpt-4o-free",
"gpt-4o": "gpt-4o-2024-08-06",
"gpt-4-turbo": "gpt-4-turbo-2024-04-09",
"gpt-4": "gpt-4o-mini-free",
"gpt-4o-mini": "gpt-4o-mini-2024-07-18",
"gpt-4": "gpt-4o-2024-08-06",
"claude-3-opus": "claude-3-opus-20240229",
"claude-3-opus": "claude-3-opus-20240229-aws",
"claude-3-sonnet": "claude-3-sonnet-20240229",
"claude-3.5-sonnet": "claude-3-5-sonnet-20240620",
"claude-3.5-sonnet": "claude-3-5-sonnet-20241022",
"claude-3-haiku": "claude-3-haiku-20240307",
"claude-2.1": "claude-2.1",
"claude-3-sonnet": "claude-3-sonnet-20240229",
"claude-3-opus": "claude-3-opus-20240229-t",
"claude-3.5-sonnet": "claude-3-5-sonnet-20241022-t",
"gemini-flash": "gemini-1.5-flash-002",
"gemini-pro": "gemini-1.5-pro-002",
"gemini-pro": "gemini-1.5-pro-002"
}
_auth_code = ""
@@ -11,7 +11,6 @@ from .needs_auth import *
from .not_working import *
from .local import *
from .AIUncensored import AIUncensored
from .Airforce import Airforce
from .AmigoChat import AmigoChat
from .Blackbox import Blackbox
@@ -31,7 +30,6 @@ from .MagickPen import MagickPen
from .PerplexityLabs import PerplexityLabs
from .Pi import Pi
from .Pizzagpt import Pizzagpt
from .PollinationsAI import PollinationsAI
from .Prodia import Prodia
from .Reka import Reka
from .ReplicateHome import ReplicateHome
@@ -5,12 +5,12 @@ import random
import requests
from aiohttp import ClientSession
from ..typing import AsyncResult, Messages
from ..image import ImageResponse
from ..requests.raise_for_status import raise_for_status
from ..requests.aiohttp import get_connector
from .needs_auth.OpenaiAPI import OpenaiAPI
from .helper import format_prompt
from ...typing import AsyncResult, Messages
from ...image import ImageResponse
from ...requests.raise_for_status import raise_for_status
from ...requests.aiohttp import get_connector
from .OpenaiAPI import OpenaiAPI
from ..helper import format_prompt
class PollinationsAI(OpenaiAPI):
label = "Pollinations.AI"
@@ -66,4 +66,4 @@ class PollinationsAI(OpenaiAPI):
async for chunk in super().create_async_generator(
model, messages, api_base=api_base, proxy=proxy, **kwargs
):
yield chunk
yield chunk
@@ -17,6 +17,7 @@ from .OpenaiAPI import OpenaiAPI
from .OpenaiChat import OpenaiChat
from .PerplexityApi import PerplexityApi
from .Poe import Poe
from .PollinationsAI import PollinationsAI
from .Raycast import Raycast
from .Replicate import Replicate
from .Theb import Theb
@@ -6,9 +6,9 @@ from aiohttp import ClientSession, ClientError
import asyncio
from itertools import cycle
from ..typing import AsyncResult, Messages
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
from ..image import ImageResponse
from ...typing import AsyncResult, Messages
from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
from ...image import ImageResponse
class AIUncensored(AsyncGeneratorProvider, ProviderModelMixin):
url = "https://www.aiuncensored.info/ai_uncensored"
@@ -22,7 +22,7 @@ class AIUncensored(AsyncGeneratorProvider, ProviderModelMixin):
"https://twitterclone-i0wr.onrender.com/api/image",
"https://twitterclone-8wd1.onrender.com/api/image",
]
working = True
working = False
supports_stream = True
supports_system_message = True
supports_message_history = True