From bfc7707cd54475dafbc09f603f9d6bb34fdf8c9d Mon Sep 17 00:00:00 2001 From: Ammar Date: Fri, 19 Sep 2025 21:49:51 +0300 Subject: [PATCH 1/3] Qwen add media --- g4f/Provider/Qwen.py | 178 +++++-- g4f/Provider/needs_auth/LMArena.py | 763 +++++++++++++++-------------- 2 files changed, 543 insertions(+), 398 deletions(-) diff --git a/g4f/Provider/Qwen.py b/g4f/Provider/Qwen.py index 41a425db..46274896 100644 --- a/g4f/Provider/Qwen.py +++ b/g4f/Provider/Qwen.py @@ -5,16 +5,49 @@ import json import re import uuid from time import time +from typing import Literal, Optional import aiohttp from ..errors import RateLimitError -from ..typing import AsyncResult, Messages -from ..providers.response import JsonConversation, Reasoning, Usage +from ..typing import AsyncResult, Messages, MediaListType +from ..providers.response import JsonConversation, Reasoning, Usage, ImageResponse, FinishReason from ..requests import sse_stream from .base_provider import AsyncGeneratorProvider, ProviderModelMixin from .helper import get_last_user_message from .. import debug +try: + import curl_cffi + + has_curl_cffi = True +except ImportError: + has_curl_cffi = False + +text_models = [ + 'qwen3-max-preview', 'qwen-plus-2025-09-11', 'qwen3-235b-a22b', 'qwen3-coder-plus', 'qwen3-30b-a3b', + 'qwen3-coder-30b-a3b-instruct', 'qwen-max-latest', 'qwen-plus-2025-01-25', 'qwq-32b', 'qwen-turbo-2025-02-11', + 'qwen2.5-omni-7b', 'qvq-72b-preview-0310', 'qwen2.5-vl-32b-instruct', 'qwen2.5-14b-instruct-1m', + 'qwen2.5-coder-32b-instruct', 'qwen2.5-72b-instruct'] + +image_models = [ + 'qwen3-max-preview', 'qwen-plus-2025-09-11', 'qwen3-235b-a22b', 'qwen3-coder-plus', 'qwen3-30b-a3b', + 'qwen3-coder-30b-a3b-instruct', 'qwen-max-latest', 'qwen-plus-2025-01-25', 'qwen-turbo-2025-02-11', + 'qwen2.5-omni-7b', 'qwen2.5-vl-32b-instruct', 'qwen2.5-14b-instruct-1m', 'qwen2.5-coder-32b-instruct', + 'qwen2.5-72b-instruct'] + +vision_models = [ + 'qwen3-max-preview', 'qwen-plus-2025-09-11', 'qwen3-235b-a22b', 'qwen3-coder-plus', 'qwen3-30b-a3b', + 'qwen3-coder-30b-a3b-instruct', 'qwen-max-latest', 'qwen-plus-2025-01-25', 'qwen-turbo-2025-02-11', + 'qwen2.5-omni-7b', 'qvq-72b-preview-0310', 'qwen2.5-vl-32b-instruct', 'qwen2.5-14b-instruct-1m', + 'qwen2.5-coder-32b-instruct', 'qwen2.5-72b-instruct'] + +models = [ + 'qwen3-max-preview', 'qwen-plus-2025-09-11', 'qwen3-235b-a22b', 'qwen3-coder-plus', 'qwen3-30b-a3b', + 'qwen3-coder-30b-a3b-instruct', 'qwen-max-latest', 'qwen-plus-2025-01-25', 'qwq-32b', 'qwen-turbo-2025-02-11', + 'qwen2.5-omni-7b', 'qvq-72b-preview-0310', 'qwen2.5-vl-32b-instruct', 'qwen2.5-14b-instruct-1m', + 'qwen2.5-coder-32b-instruct', 'qwen2.5-72b-instruct'] + + class Qwen(AsyncGeneratorProvider, ProviderModelMixin): """ Provider for Qwen's chat service (chat.qwen.ai), with configurable @@ -26,42 +59,69 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): supports_stream = True supports_message_history = False + _models_loaded = True # Complete list of models, extracted from the API - models = [ - "qwen3-max-preview", - "qwen3-235b-a22b", - "qwen3-coder-plus", - "qwen3-30b-a3b", - "qwen3-coder-30b-a3b-instruct", - "qwen-max-latest", - "qwen-plus-2025-01-25", - "qwq-32b", - "qwen-turbo-2025-02-11", - "qwen2.5-omni-7b", - "qvq-72b-preview-0310", - "qwen2.5-vl-32b-instruct", - "qwen2.5-14b-instruct-1m", - "qwen2.5-coder-32b-instruct", - "qwen2.5-72b-instruct", - ] + image_models = image_models + text_models = text_models + vision_models = vision_models + models = models default_model = "qwen3-235b-a22b" _midtoken: str = None _midtoken_uses: int = 0 + @classmethod + def get_models(cls) -> list[str]: + if not cls._models_loaded and has_curl_cffi: + response = curl_cffi.get(f"{cls.url}/api/models") + if response.ok: + models = response.json().get("data", []) + cls.text_models = [model["id"] for model in models if "t2t" in model["info"]["meta"]["chat_type"]] + + cls.image_models = [ + model["id"] for model in models if + "image_edit" in model["info"]["meta"]["chat_type"] or "t2i" in model["info"]["meta"]["chat_type"] + ] + + cls.vision_models = [model["id"] for model in models if model["info"]["meta"]["capabilities"]["vision"]] + + cls.models = [model["id"] for model in models] + cls.default_model = cls.models[0] + cls._models_loaded = True + + else: + debug.log(f"Failed to load models from {cls.url}: {response.status_code} {response.reason}") + return cls.models + @classmethod async def create_async_generator( - cls, - model: str, - messages: Messages, - conversation: JsonConversation = None, - proxy: str = None, - timeout: int = 120, - stream: bool = True, - enable_thinking: bool = True, - **kwargs + cls, + model: str, + messages: Messages, + media: MediaListType = None, + conversation: JsonConversation = None, + proxy: str = None, + timeout: int = 120, + stream: bool = True, + enable_thinking: bool = True, + chat_type: Literal[ + "t2t", "search", "artifacts", "web_dev", "deep_research", "t2i", "image_edit", "t2v" + ] = "t2t", + image_size: Optional[Literal["1:1", "4:3", "3:4", "16:9", "9:16"]] = None, + **kwargs ) -> AsyncResult: - + """ + chat_type: + DeepResearch = "deep_research" + Artifacts = "artifacts" + WebSearch = "search" + ImageGeneration = "t2i" + ImageEdit = "image_edit" + VideoGeneration = "t2v" + Txt2Txt = "t2t" + WebDev = "web_dev" + """ + model_name = cls.get_model(model) headers = { @@ -94,7 +154,8 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): raise RuntimeError("Failed to extract bx-umidtoken.") cls._midtoken = match.group(1) cls._midtoken_uses = 1 - debug.log(f"[Qwen] INFO: New midtoken obtained. Use count: {cls._midtoken_uses}. Midtoken: {cls._midtoken}") + debug.log( + f"[Qwen] INFO: New midtoken obtained. Use count: {cls._midtoken_uses}. Midtoken: {cls._midtoken}") else: cls._midtoken_uses += 1 debug.log(f"[Qwen] INFO: Reusing midtoken. Use count: {cls._midtoken_uses}") @@ -109,11 +170,11 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): "title": "New Chat", "models": [model_name], "chat_mode": "normal", - "chat_type": "t2t", + "chat_type": chat_type, "timestamp": int(time() * 1000) } async with session.post( - f'{cls.url}/api/v2/chats/new', json=chat_payload, headers=req_headers, proxy=proxy + f'{cls.url}/api/v2/chats/new', json=chat_payload, headers=req_headers, proxy=proxy ) as resp: resp.raise_for_status() data = await resp.json() @@ -124,7 +185,31 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): cookies={key: value for key, value in resp.cookies.items()}, parent_id=None ) - + files = [] + if media: + for index, (_file, file_name) in enumerate(media): + file_class: Literal["default", "vision", "video", "audio", "document"] = "vision" + _type: Literal["file", "image", "video", "audio"] = "image" + file_type = "image/jpeg" + showType: Literal["file", "image", "video", "audio"] = "image" + + if isinstance(_file, str) and _file.startswith('http'): + if chat_type == "image_edit": + file_class = "vision" + _type = "image" + file_type = "image" + showType = "image" + + files.append( + { + "type": _type, + "name": file_name, + "file_type": file_type, + "showType": showType, + "file_class": file_class, # "document" + "url": _file + } + ) msg_payload = { "stream": stream, "incremental_output": stream, @@ -140,9 +225,9 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): "role": "user", "content": prompt, "user_action": "chat", - "files": [], + "files": files, "models": [model_name], - "chat_type": "t2t", + "chat_type": chat_type, "feature_config": { "thinking_enabled": enable_thinking, "output_schema": "phase", @@ -150,18 +235,20 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): }, "extra": { "meta": { - "subChatType": "t2t" + "subChatType": chat_type } }, - "sub_chat_type": "t2t", + "sub_chat_type": chat_type, "parent_id": None } ] } + if image_size: + msg_payload["size"] = image_size async with session.post( - f'{cls.url}/api/v2/chat/completions?chat_id={conversation.chat_id}', json=msg_payload, - headers=req_headers, proxy=proxy, timeout=timeout, cookies=conversation.cookies + f'{cls.url}/api/v2/chat/completions?chat_id={conversation.chat_id}', json=msg_payload, + headers=req_headers, proxy=proxy, timeout=timeout, cookies=conversation.cookies ) as resp: first_line = await resp.content.readline() line_str = first_line.decode().strip() @@ -182,10 +269,18 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): delta = choices[0].get("delta", {}) phase = delta.get("phase") content = delta.get("content") + status = delta.get("status") + extra = delta.get("extra", {}) if phase == "think" and not thinking_started: thinking_started = True elif phase == "answer" and thinking_started: thinking_started = False + elif phase == "image_gen" and status == "typing": + yield ImageResponse([content], "", extra) + continue + elif phase == "image_gen" and status == "finished": + yield FinishReason(status) + if content: yield Reasoning(content) if thinking_started else content except (json.JSONDecodeError, KeyError, IndexError): @@ -198,13 +293,14 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): is_rate_limit = (isinstance(e, aiohttp.ClientResponseError) and e.status == 429) or \ ("RateLimited" in str(e)) if is_rate_limit: - debug.log(f"[Qwen] WARNING: Rate limit detected (attempt {attempt + 1}/5). Invalidating current midtoken.") + debug.log( + f"[Qwen] WARNING: Rate limit detected (attempt {attempt + 1}/5). Invalidating current midtoken.") cls._midtoken = None cls._midtoken_uses = 0 + conversation = None await asyncio.sleep(2) continue else: raise e raise RateLimitError("The Qwen provider reached the request limit after 5 attempts.") - diff --git a/g4f/Provider/needs_auth/LMArena.py b/g4f/Provider/needs_auth/LMArena.py index e7966c8c..0683e92d 100644 --- a/g4f/Provider/needs_auth/LMArena.py +++ b/g4f/Provider/needs_auth/LMArena.py @@ -10,12 +10,14 @@ import json try: import curl_cffi + has_curl_cffi = True except ImportError: has_curl_cffi = False try: import nodriver + has_nodriver = True except ImportError: has_nodriver = False @@ -25,405 +27,445 @@ from ...requests import StreamSession, get_args_from_nodriver, raise_for_status, from ...errors import ModelNotFoundError, CloudflareError, MissingAuthError, MissingRequirementsError from ...providers.response import FinishReason, Usage, JsonConversation, ImageResponse, Reasoning from ...tools.media import merge_media -from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin,AuthFileMixin +from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin from ..helper import get_last_user_message from ... import debug models = [ - {'id': '983bc566-b783-4d28-b24c-3c8b08eb1086', 'publicName': 'gpt-5-high', 'organization': 'openai', - 'provider': 'openai', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, + {'id': '812c93cc-5f88-4cff-b9ca-c11a26599b0e', 'publicName': 'qwen3-max-preview', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, {'id': 'e884e85b-c998-44d8-b38d-db42a300a318', 'publicName': 'gemini-2.5-flash-image-preview (nano-banana)', - 'organization': 'google', 'provider': 'google-genai', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': True, 'requiresUpload': False}}, - 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '4b11c78c-08c8-461c-938e-5fc97d56a40d', 'publicName': 'gpt-5-chat', 'organization': 'openai', - 'provider': 'openai', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, + 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, 'organization': 'google', + 'provider': 'google-genai'}, {'id': '4b11c78c-08c8-461c-938e-5fc97d56a40d', 'publicName': 'gpt-5-chat', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, + 'outputCapabilities': {'text': True}}, 'organization': 'openai', + 'provider': 'openai'}, {'id': '2ec9f1a6-126f-4c65-a102-15ac401dcea4', 'publicName': 'imagen-4.0-generate-preview-06-06', - 'organization': 'google', 'provider': 'googleVertex', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': 'eb90ae46-a73a-4f27-be8b-40f090592c9a', 'publicName': 'flux-1-kontext-dev', 'organization': 'bfl', - 'provider': 'bfl', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': False}}, - 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': 'ee116d12-64d6-48a8-88e5-b2d06325cdd2', 'publicName': 'claude-opus-4-20250514', 'organization': 'anthropic', - 'provider': 'googleVertexAnthropic', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'google', 'provider': 'googleVertex'}, + {'id': 'eb90ae46-a73a-4f27-be8b-40f090592c9a', 'publicName': 'flux-1-kontext-dev', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': False}}, + 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, 'organization': 'bfl', + 'provider': 'bfl'}, {'id': 'ee116d12-64d6-48a8-88e5-b2d06325cdd2', 'publicName': 'claude-opus-4-20250514', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'anthropic', 'provider': 'googleVertexAnthropic'}, + {'id': 'e2d9d353-6dbe-4414-bf87-bd289d523726', 'publicName': 'gemini-2.5-pro', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'google', 'provider': 'google'}, + {'id': '983bc566-b783-4d28-b24c-3c8b08eb1086', 'publicName': 'gpt-5-high', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'openai'}, + {'id': 'cb0f1e24-e8e9-4745-aabc-b926ffde7475', 'publicName': 'o3-2025-04-16', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'openai'}, + {'id': 'ce2092c1-28d4-4d42-a1e0-6b061dfe0b20', 'publicName': 'gemini-2.5-flash', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'google', 'provider': 'google'}, + {'id': '9513524d-882e-4350-b31e-e4584440c2c8', 'publicName': 'chatgpt-4o-latest-20250326', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'openai'}, + {'id': '7a55108b-b997-4cff-a72f-5aa83beee918', 'publicName': 'gemini-2.0-flash-001', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'google', 'provider': 'google'}, + {'id': 'f44e280a-7914-43ca-a25d-ecfcc5d48d09', 'publicName': 'claude-3-5-sonnet-20241022', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'anthropic', 'provider': 'googleVertexAnthropic'}, + {'id': 'c28823c1-40fd-4eaf-9825-e28f11d1f8b2', 'publicName': 'llama-4-scout-17b-16e-instruct', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'meta', 'provider': 'fireworks'}, + {'id': '9217ac2d-91bc-4391-aa07-b8f9e2cf11f2', 'publicName': 'menlo', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}}, + {'id': '49bd7403-c7fd-4d91-9829-90a91906ad6c', 'publicName': 'llama-4-maverick-03-26-experimental', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'meta', 'provider': 'meta'}, + {'id': '14e9311c-94d2-40c2-8c54-273947e208b0', 'publicName': 'gpt-4.1-2025-04-14', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'openai'}, + {'id': '885976d3-d178-48f5-a3f4-6e13e0718872', 'publicName': 'qwq-32b', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, + {'id': '69f5d38a-45f5-4d3a-9320-b866a4035ed9', 'publicName': 'mistral-small-3.1-24b-instruct-2503', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'mistral', 'provider': 'mistral'}, + {'id': '789e245f-eafe-4c72-b563-d135e93988fc', 'publicName': 'gemma-3-27b-it', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'google', 'provider': 'google'}, + {'id': '42015285-534d-4e6b-9a9a-9061c2f73e1c', 'publicName': 'x1-1-preview-0915', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'e2d9d353-6dbe-4414-bf87-bd289d523726', 'publicName': 'gemini-2.5-pro', 'organization': 'google', - 'provider': 'google', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'ce2092c1-28d4-4d42-a1e0-6b061dfe0b20', 'publicName': 'gemini-2.5-flash', 'organization': 'google', - 'provider': 'google', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'cb0f1e24-e8e9-4745-aabc-b926ffde7475', 'publicName': 'o3-2025-04-16', 'organization': 'openai', - 'provider': 'openai', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '9513524d-882e-4350-b31e-e4584440c2c8', 'publicName': 'chatgpt-4o-latest-20250326', 'organization': 'openai', - 'provider': 'openai', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'b6a05a03-88db-4d2b-bb10-41ddea0f27d6', 'publicName': 'catalina', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '0f785ba1-efcb-472d-961e-69f7b251c7e3', 'publicName': 'command-a-03-2025', 'organization': 'cohere', - 'provider': 'cohere', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '6a5437a7-c786-467b-b701-17b0bc8c8231', 'publicName': 'gpt-4.1-mini-2025-04-14', 'organization': 'openai', - 'provider': 'openai', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'a14546b5-d78d-4cf6-bb61-ab5b8510a9d6', 'publicName': 'amazon.nova-pro-v1:0', 'organization': 'amazon', - 'provider': 'amazonBedrock', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'c680645e-efac-4a81-b0af-da16902b2541', 'publicName': 'o3-mini', 'organization': 'openai', - 'provider': 'openai', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '7699c8d4-0742-42f9-a117-d10e84688dab', 'publicName': 'grok-3-mini-beta', 'organization': 'xai', - 'provider': 'xaiPublic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '79af9ac3-f361-40db-85ea-f0bdbdc76f84', 'publicName': 'phantom-0821-1', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'f1102bbf-34ca-468f-a9fc-14bcf63f315b', 'publicName': 'o4-mini-2025-04-16', 'organization': 'openai', - 'provider': 'openai', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, + {'id': '0f785ba1-efcb-472d-961e-69f7b251c7e3', 'publicName': 'command-a-03-2025', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'cohere', 'provider': 'cohere'}, + {'id': '6a5437a7-c786-467b-b701-17b0bc8c8231', 'publicName': 'gpt-4.1-mini-2025-04-14', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'openai'}, + {'id': 'a14546b5-d78d-4cf6-bb61-ab5b8510a9d6', 'publicName': 'amazon.nova-pro-v1:0', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'amazon', 'provider': 'amazonBedrock'}, + {'id': 'c680645e-efac-4a81-b0af-da16902b2541', 'publicName': 'o3-mini', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'openai'}, + {'id': '7699c8d4-0742-42f9-a117-d10e84688dab', 'publicName': 'grok-3-mini-beta', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, 'organization': 'xai', + 'provider': 'xaiPublic'}, {'id': 'b88e983b-9459-473d-8bf1-753932f1679a', 'publicName': 'kimi-k2-0905-preview', + 'capabilities': {'inputCapabilities': {'text': True}, + 'outputCapabilities': {'text': True}}, 'organization': 'moonshot', + 'provider': 'moonshot'}, + {'id': 'f1102bbf-34ca-468f-a9fc-14bcf63f315b', 'publicName': 'o4-mini-2025-04-16', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'openai'}, {'id': '04ec9a17-c597-49df-acf0-963da275c246', 'publicName': 'gemini-2.5-flash-lite-preview-06-17-thinking', - 'organization': 'google', 'provider': 'google', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'google', 'provider': 'google'}, {'id': 'd799a034-0ab6-48c1-817a-62e591143f39', 'publicName': 'amazon-nova-experimental-chat-05-14', - 'organization': 'amazon', 'provider': 'amazon', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'amazon', 'provider': 'amazon'}, {'id': 'be98fcfd-345c-4ae1-9a82-a19123ebf1d2', 'publicName': 'claude-3-7-sonnet-20250219-thinking-32k', - 'organization': 'anthropic', 'provider': 'googleVertexAnthropic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'anthropic', 'provider': 'googleVertexAnthropic'}, {'id': 'f6fbf06c-532c-4c8a-89c7-f3ddcfb34bd1', 'publicName': 'claude-3-5-haiku-20241022', - 'organization': 'anthropic', 'provider': 'googleVertexAnthropic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '27b9f8c6-3ee1-464a-9479-a8b3c2a48fd4', 'publicName': 'mistral-medium-2505', 'organization': 'mistral', - 'provider': 'mistral', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'anthropic', 'provider': 'googleVertexAnthropic'}, + {'id': '27b9f8c6-3ee1-464a-9479-a8b3c2a48fd4', 'publicName': 'mistral-medium-2505', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'mistral', 'provider': 'mistral'}, + {'id': '51ad1d79-61e2-414c-99e3-faeb64bb6b1b', 'publicName': 'imagen-3.0-generate-002', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'google', 'provider': 'googleVertex'}, + {'id': '2f5253e4-75be-473c-bcfc-baeb3df0f8ad', 'publicName': 'deepseek-v3-0324', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'deepseek', 'provider': 'fireworks'}, + {'id': 'b88d5814-1d20-49cc-9eb6-e362f5851661', 'publicName': 'recraft-v3', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'Recraft', 'provider': 'fal'}, + {'id': '6337f479-2fc8-4311-a76b-8c957765cd68', 'publicName': 'magistral-medium-2506', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'mistral', 'provider': 'mistral'}, + {'id': 'b4a681ed-df4e-476f-89c6-a992a5783e60', 'publicName': 'EB45-turbo-vl-0906', 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '51ad1d79-61e2-414c-99e3-faeb64bb6b1b', 'publicName': 'imagen-3.0-generate-002', 'organization': 'google', - 'provider': 'googleVertex', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '2f5253e4-75be-473c-bcfc-baeb3df0f8ad', 'publicName': 'deepseek-v3-0324', 'organization': 'deepseek', - 'provider': 'fireworks', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '36e4900d-5df2-46e1-9bd3-ef4028ab50b0', 'publicName': 'velocilux', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '6337f479-2fc8-4311-a76b-8c957765cd68', 'publicName': 'magistral-medium-2506', 'organization': 'mistral', - 'provider': 'mistral', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '34ee5a83-8d85-4d8b-b2c1-3b3413e9ed98', 'publicName': 'ideogram-v2', 'organization': 'Ideogram', - 'provider': 'replicate', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '17e31227-36d7-4a7a-943a-7ebffa3a00eb', 'publicName': 'photon', 'organization': 'luma-ai', - 'provider': 'replicate', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, + {'id': 'e7c9fa2d-6f5d-40eb-8305-0980b11c7cab', 'publicName': 'photon', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'luma-ai', 'provider': 'fal'}, + {'id': 'ac44dd10-0666-451c-b824-386ccfea7bcc', 'publicName': 'claude-sonnet-4-20250514', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'anthropic', 'provider': 'googleVertexAnthropic'}, {'id': 'b5ad3ab7-fc56-4ecd-8921-bd56b55c1159', 'publicName': 'llama-4-maverick-17b-128e-instruct', - 'organization': 'meta', 'provider': 'fireworks', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '9a066f6a-7205-4325-8d0b-d81cc4b049c0', 'publicName': 'qwen3-30b-a3b', 'organization': 'alibaba', - 'provider': 'alibaba', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'meta', 'provider': 'fireworks'}, + {'id': '9a066f6a-7205-4325-8d0b-d81cc4b049c0', 'publicName': 'qwen3-30b-a3b', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, {'id': '39b185cb-aba9-4232-99ea-074883a5ccd4', 'publicName': 'stephen-v2', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '2595a594-fa54-4299-97cd-2d7380d21c80', 'publicName': 'qwen3-235b-a22b', 'organization': 'alibaba', - 'provider': 'alibaba', + {'id': '2595a594-fa54-4299-97cd-2d7380d21c80', 'publicName': 'qwen3-235b-a22b', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, + {'id': 'dcbd7897-5a37-4a34-93f1-76a24c7bb028', 'publicName': 'llama-3.3-70b-instruct', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'meta', 'provider': 'fireworks'}, + {'id': '8d1f38a1-51a6-4030-ae4b-e19fb503e4fa', 'publicName': 'x1-turbo-0906', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'dcbd7897-5a37-4a34-93f1-76a24c7bb028', 'publicName': 'llama-3.3-70b-instruct', 'organization': 'meta', - 'provider': 'fireworks', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '34c89088-1c15-4cff-96fd-52ced7a4d5a9', 'publicName': 'cogitolux', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'ac44dd10-0666-451c-b824-386ccfea7bcc', 'publicName': 'claude-sonnet-4-20250514', - 'organization': 'anthropic', 'provider': 'googleVertexAnthropic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '38abc02f-5cf2-49d1-a243-b2eb75ca3cc8', 'publicName': 'potato', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'c5a11495-081a-4dc6-8d9a-64a4fd6f7bbc', 'publicName': 'claude-3-7-sonnet-20250219', - 'organization': 'anthropic', 'provider': 'googleVertexAnthropic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '87e8d160-049e-4b4e-adc4-7f2511348539', 'publicName': 'minimax-m1', 'organization': 'minimax', - 'provider': 'minimax', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'bb97bc68-131c-4ea4-a59e-03a6252de0d2', 'publicName': 'dall-e-3', 'organization': 'openai', - 'provider': 'openai', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': 'b70ab012-18e7-4d6f-a887-574e05de6c20', 'publicName': 'recraft-v3', 'organization': 'Recraft', - 'provider': 'replicate', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, {'id': 'a8d1d310-e485-4c50-8f27-4bff18292a99', 'publicName': 'qwen3-30b-a3b-instruct-2507', - 'organization': 'alibaba', 'provider': 'alibaba', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, + {'id': 'c5a11495-081a-4dc6-8d9a-64a4fd6f7bbc', 'publicName': 'claude-3-7-sonnet-20250219', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'anthropic', 'provider': 'googleVertexAnthropic'}, + {'id': '87e8d160-049e-4b4e-adc4-7f2511348539', 'publicName': 'minimax-m1', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'minimax', 'provider': 'minimax'}, + {'id': 'bb97bc68-131c-4ea4-a59e-03a6252de0d2', 'publicName': 'dall-e-3', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'openai', 'provider': 'openai'}, {'id': '4653dded-a46b-442a-a8fe-9bb9730e2453', 'publicName': 'claude-sonnet-4-20250514-thinking-32k', - 'organization': 'anthropic', 'provider': 'googleVertexAnthropic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'eb5da04f-9b28-406b-bf06-4539158c66ef', 'publicName': 'anonymous-bot-0514', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'anthropic', 'provider': 'googleVertexAnthropic'}, {'id': '1a400d9a-f61c-4bc2-89b4-a9b7e77dff12', 'publicName': 'qwen3-235b-a22b-no-thinking', - 'organization': 'alibaba', 'provider': 'alibaba', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '896a3848-ae03-4651-963b-7d8f54b61ae8', 'publicName': 'gemma-3n-e4b-it', 'organization': 'google', - 'provider': 'google', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '9e8525b7-fe50-4e50-bf7f-ad1d3d205d3c', 'publicName': 'flux-1.1-pro', 'organization': 'Black Forest Labs', - 'provider': 'replicate', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, {'id': '3b5e9593-3dc0-4492-a3da-19784c4bde75', 'publicName': 'claude-opus-4-20250514-thinking-16k', - 'organization': 'anthropic', 'provider': 'googleVertexAnthropic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'anthropic', 'provider': 'googleVertexAnthropic'}, {'id': 'e3c9ea42-5f42-496b-bc80-c7e8ee5653cc', 'publicName': 'stephen-vision-csfix', 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'bbad1d17-6aa5-4321-949c-d11fb6289241', 'publicName': 'mistral-small-2506', 'organization': 'mistral', - 'provider': 'mistral', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'f7e2ed7a-f0b9-40ef-853a-20036e747232', 'publicName': 'ideogram-v3-quality', 'organization': 'Ideogram', - 'provider': 'replicate', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '149619f1-f1d5-45fd-a53e-7d790f156f20', 'publicName': 'grok-3-mini-high', 'organization': 'xai', - 'provider': 'xaiPublic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'b9edb8e9-4e98-49e7-8aaf-ae67e9797a11', 'publicName': 'grok-4-0709', 'organization': 'xai', - 'provider': 'openrouter', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '24145149-86c9-4690-b7c9-79c7db216e5c', 'publicName': 'ppl-sonar-reasoning-pro-high', - 'organization': 'perplexity', 'provider': 'perplexity', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}}, - {'id': '0dde746c-3dbc-42be-b8f5-f38bd1595baa', 'publicName': 'seedream-3', 'organization': 'bytedance', - 'provider': 'replicate', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '812c93cc-5f88-4cff-b9ca-c11a26599b0e', 'publicName': 'qwen-max-2025-08-15', 'organization': 'alibaba', - 'provider': 'alibaba', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '25bcb878-749e-49f4-ac05-de84d964bcee', 'publicName': 'claude-opus-4-search', 'organization': 'anthropic', - 'provider': 'anthropicSearch', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}}, - {'id': 'b222be23-bd55-4b20-930b-a30cc84d3afd', 'publicName': 'gemini-2.5-pro-grounding', 'organization': 'google', - 'provider': 'googleVertex', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}}, - {'id': 'd079ef40-3b20-4c58-ab5e-243738dbada5', 'publicName': 'glm-4.5', 'organization': 'zai', 'provider': 'zai', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'fbe08e9a-3805-4f9f-a085-7bc38e4b51d1', 'publicName': 'o3-search', 'organization': 'openai', - 'provider': 'openaiResponses', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}}, - {'id': 'c8711485-d061-4a00-94d2-26c31b840a3d', 'publicName': 'ppl-sonar-pro-high', 'organization': 'perplexity', - 'provider': 'perplexity', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}}, - {'id': '96ae95fd-b70d-49c3-91cc-b58c7da1090b', 'publicName': 'claude-opus-4-1-20250805', - 'organization': 'anthropic', 'provider': 'googleVertexAnthropic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '68b6f90d-9dd5-4995-97d0-7ea13c0c82ba', 'publicName': 'Bailing-Lite-250220', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '51a47cc6-5ef9-4ac7-a59c-4009230d7564', 'publicName': 'gemini-2.5-pro-grounding-exp', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'ec3beb4b-7229-4232-bab9-670ee52dd711', 'publicName': 'gpt-oss-20b', 'organization': 'openai', - 'provider': 'fireworks', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '6fe1ec40-3219-4c33-b3e7-0e65658b4194', 'publicName': 'qwen-vl-max-2025-08-13', 'organization': 'alibaba', - 'provider': 'alibaba', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '80caa6ac-05cd-4403-88e1-ef0164c8b1a8', 'publicName': 'veo3', 'organization': 'google', - 'provider': 'googleVertex', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}}, - {'id': '1b677c7e-49dd-4045-9ce0-d1aedcb9bbbc', 'publicName': 'veo3-fast', 'organization': 'google', - 'provider': 'googleVertex', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}}, - {'id': '08d8dcc6-2ab5-45ae-9bf1-353480f1f7ee', 'publicName': 'veo2', 'organization': 'google', - 'provider': 'googleVertex', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}}, - {'id': '7a3626fc-4e64-4c9e-821f-b449a4b43b6a', 'publicName': 'kimi-k2-0711-preview', 'organization': 'moonshot', - 'provider': 'moonshot', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'ee7cb86e-8601-4585-b1d0-7c7380f8f6f4', 'publicName': 'qwen3-235b-a22b-instruct-2507', - 'organization': 'alibaba', 'provider': 'alibaba', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '5b3383a9-6bca-4f71-8210-78895c9d84d5', 'publicName': 'ray2', 'organization': 'luma-ai', 'provider': 'fal', + {'id': 'bbad1d17-6aa5-4321-949c-d11fb6289241', 'publicName': 'mistral-small-2506', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'mistral', 'provider': 'mistral'}, + {'id': 'bf03b5bb-8b4e-4a36-a893-0b2809f1daec', 'publicName': 'hailuo-02-standard', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, - 'outputCapabilities': {'video': True}}}, - {'id': '6ee9f901-17b5-4fbe-9cc2-13c16497c23b', 'publicName': 'gpt-oss-120b', 'organization': 'openai', - 'provider': 'fireworks', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '5a3b3520-c87d-481f-953c-1364687b6e8f', 'publicName': 'lucid-origin', 'organization': 'leonardo-ai', - 'provider': 'leonardo-ai', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '6e855f13-55d7-4127-8656-9168a9f4dcc0', 'publicName': 'gpt-image-1', 'organization': 'openai', - 'provider': 'customOpenai', + 'outputCapabilities': {'video': True}}, 'organization': 'minimax', 'provider': 'fal'}, + {'id': '149619f1-f1d5-45fd-a53e-7d790f156f20', 'publicName': 'grok-3-mini-high', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, 'organization': 'xai', + 'provider': 'xaiPublic'}, {'id': 'b222be23-bd55-4b20-930b-a30cc84d3afd', 'publicName': 'gemini-2.5-pro-grounding', + 'capabilities': {'inputCapabilities': {'text': True}, + 'outputCapabilities': {'search': True}}, 'organization': 'google', + 'provider': 'googleVertex'}, + {'id': 'c8711485-d061-4a00-94d2-26c31b840a3d', 'publicName': 'ppl-sonar-pro-high', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}, + 'organization': 'perplexity', 'provider': 'perplexity'}, + {'id': '24145149-86c9-4690-b7c9-79c7db216e5c', 'publicName': 'ppl-sonar-reasoning-pro-high', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}, + 'organization': 'perplexity', 'provider': 'perplexity'}, + {'id': '55069e04-a634-4d98-8765-95113b945f5e', 'publicName': 'hailuo-02-pro', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'minimax', 'provider': 'fal'}, + {'id': '25bcb878-749e-49f4-ac05-de84d964bcee', 'publicName': 'claude-opus-4-search', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}, + 'organization': 'anthropic', 'provider': 'anthropicSearch'}, + {'id': 'b9edb8e9-4e98-49e7-8aaf-ae67e9797a11', 'publicName': 'grok-4-0709', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'xai', 'provider': 'openrouter'}, + {'id': 'd079ef40-3b20-4c58-ab5e-243738dbada5', 'publicName': 'glm-4.5', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, 'organization': 'zai', + 'provider': 'zai'}, {'id': 'fbe08e9a-3805-4f9f-a085-7bc38e4b51d1', 'publicName': 'o3-search', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}, + 'organization': 'openai', 'provider': 'openaiResponses'}, + {'id': '69f90b32-01dc-43e1-8c48-bf494f8f4f38', 'publicName': 'gpt-image-1-high-fidelity', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': True, 'requiresUpload': False}}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '1ea13a81-93a7-4804-bcdd-693cd72e302d', 'publicName': 'step-3', 'organization': 'stepfun', - 'provider': 'stepfun', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'af033cbd-ec6c-42cc-9afa-e227fc12efe8', 'publicName': 'qwen3-coder-480b-a35b-instruct', - 'organization': 'Alibaba', 'provider': 'alibaba', + {'id': '80caa6ac-05cd-4403-88e1-ef0164c8b1a8', 'publicName': 'veo3', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'google', 'provider': 'googleVertex'}, + {'id': '7a3626fc-4e64-4c9e-821f-b449a4b43b6a', 'publicName': 'kimi-k2-0711-preview', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'moonshot', 'provider': 'moonshot'}, + {'id': '68b6f90d-9dd5-4995-97d0-7ea13c0c82ba', 'publicName': 'Bailing-Lite-250220', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + {'id': 'ec3beb4b-7229-4232-bab9-670ee52dd711', 'publicName': 'gpt-oss-20b', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'fireworks'}, + {'id': '96ae95fd-b70d-49c3-91cc-b58c7da1090b', 'publicName': 'claude-opus-4-1-20250805', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'anthropic', 'provider': 'googleVertexAnthropic'}, + {'id': 'e652c45e-8699-4392-94f0-7834e7464137', 'publicName': 'hailuo-02-standard', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'minimax', 'provider': 'fal'}, {'id': '08d8dcc6-2ab5-45ae-9bf1-353480f1f7ee', 'publicName': 'veo2', + 'capabilities': { + 'inputCapabilities': {'text': True, 'image': True}, + 'outputCapabilities': {'video': True}}, + 'organization': 'google', 'provider': 'googleVertex'}, + {'id': '51a47cc6-5ef9-4ac7-a59c-4009230d7564', 'publicName': 'gemini-2.5-pro-grounding-exp', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + {'id': '1b677c7e-49dd-4045-9ce0-d1aedcb9bbbc', 'publicName': 'veo3-fast', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'google', 'provider': 'googleVertex'}, + {'id': '6fe1ec40-3219-4c33-b3e7-0e65658b4194', 'publicName': 'qwen-vl-max-2025-08-13', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, + {'id': '527e3f88-c13f-404c-92b4-0dcf7eeb61e6', 'publicName': 'hailuo-02-pro', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, + 'outputCapabilities': {'video': True}}, 'organization': 'minimax', 'provider': 'fal'}, + {'id': '58060613-41dc-478b-97a0-6d9c4f0c722a', 'publicName': 'hailuo-02-fast', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, + 'outputCapabilities': {'video': True}}, 'organization': 'minimax', 'provider': 'fal'}, + {'id': '5a3b3520-c87d-481f-953c-1364687b6e8f', 'publicName': 'lucid-origin', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'leonardo-ai', 'provider': 'leonardo-ai'}, + {'id': '6ee9f901-17b5-4fbe-9cc2-13c16497c23b', 'publicName': 'gpt-oss-120b', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'fireworks'}, + {'id': '5b3383a9-6bca-4f71-8210-78895c9d84d5', 'publicName': 'ray2', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, + 'outputCapabilities': {'video': True}}, 'organization': 'luma-ai', 'provider': 'fal'}, + {'id': 'ee7cb86e-8601-4585-b1d0-7c7380f8f6f4', 'publicName': 'qwen3-235b-a22b-instruct-2507', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, + {'id': '6e855f13-55d7-4127-8656-9168a9f4dcc0', 'publicName': 'gpt-image-1', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': True, 'requiresUpload': False}}, + 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, 'organization': 'openai', + 'provider': 'customOpenai'}, {'id': '28a8f330-3554-448c-9f32-2c0a08ec6477', 'publicName': 'flux-1-kontext-pro', + 'capabilities': { + 'inputCapabilities': {'text': True, 'image': {'multipleImages': False}}, + 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'bfl', 'provider': 'bfl'}, {'id': 'f8aec69d-e077-4ed1-99be-d34f48559bbf', 'publicName': 'imagen-4.0-ultra-generate-preview-06-06', - 'organization': 'google', 'provider': 'googleVertex', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': 'a071b843-0fc2-4fcf-b644-023509635452', 'publicName': 'veo3-audio', 'organization': 'google', - 'provider': 'googleVertex', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}}, - {'id': '7bfb254a-5d32-4ce2-b6dc-2c7faf1d5fe8', 'publicName': 'glm-4.5-air', 'organization': 'zai', - 'provider': 'zai', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'google', 'provider': 'googleVertex'}, + {'id': '1ea13a81-93a7-4804-bcdd-693cd72e302d', 'publicName': 'step-3', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'stepfun', 'provider': 'stepfun'}, + {'id': '217158f9-793e-4ffe-a197-6de9448432fc', 'publicName': 'ray2', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'luma-ai', 'provider': 'fal'}, + {'id': 'a071b843-0fc2-4fcf-b644-023509635452', 'publicName': 'veo3-audio', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'google', 'provider': 'googleVertex'}, {'id': '48fe3167-5680-4903-9ab5-2f0b9dc05815', 'publicName': 'nightride-on', 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, {'id': '638fb8b8-1037-4ee5-bfba-333392575a5d', 'publicName': 'EB45-vision', 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'c822ec98-38e9-4e43-a434-982eb534824f', 'publicName': 'nightride-on-v2', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '86d767b0-2574-4e47-a256-a22bcace9f56', 'publicName': 'grok-4-search', 'organization': 'xai', - 'provider': 'xaiSearch', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}}, - {'id': '27035fb8-a25b-4ec9-8410-34be18328afd', 'publicName': 'mistral-medium-2508', 'organization': 'mistral', - 'provider': 'mistral', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '16b8e53a-cc7b-4608-a29a-20d4dac77cf2', 'publicName': 'qwen3-235b-a22b-thinking-2507', - 'organization': 'alibaba', 'provider': 'alibaba', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '217158f9-793e-4ffe-a197-6de9448432fc', 'publicName': 'ray2', 'organization': 'luma-ai', 'provider': 'fal', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}}, {'id': '69bbf7d4-9f44-447e-a868-abc4f7a31810', 'publicName': 'gemini-2.0-flash-preview-image-generation', - 'organization': 'google', 'provider': 'google', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': True, 'requiresUpload': False}}, - 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': 'ba99b6cb-e981-48f4-a5be-ace516ee2731', 'publicName': 'hailuo-02-standard', 'organization': 'minimax', - 'provider': 'minimax', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}}, - {'id': 'e705b65f-82cd-40cb-9630-d9e6ca92d06f', 'publicName': 'seedance-v1-pro', 'organization': 'bytedance', - 'provider': 'fal', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}}, - {'id': 'f1a5a6ab-e1b1-4247-88ac-49395291c1e3', 'publicName': 'not-a-new-model', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, 'organization': 'google', + 'provider': 'google'}, {'id': 'c822ec98-38e9-4e43-a434-982eb534824f', 'publicName': 'nightride-on-v2', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, + 'outputCapabilities': {'text': True}}}, + {'id': 'af033cbd-ec6c-42cc-9afa-e227fc12efe8', 'publicName': 'qwen3-coder-480b-a35b-instruct', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'Alibaba', 'provider': 'alibaba'}, + {'id': '86d767b0-2574-4e47-a256-a22bcace9f56', 'publicName': 'grok-4-search', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}, + 'organization': 'xai', 'provider': 'xaiSearch'}, + {'id': '16b8e53a-cc7b-4608-a29a-20d4dac77cf2', 'publicName': 'qwen3-235b-a22b-thinking-2507', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, + {'id': '7bfb254a-5d32-4ce2-b6dc-2c7faf1d5fe8', 'publicName': 'glm-4.5-air', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, 'organization': 'zai', + 'provider': 'zai'}, {'id': '27035fb8-a25b-4ec9-8410-34be18328afd', 'publicName': 'mistral-medium-2508', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, + 'outputCapabilities': {'text': True}}, 'organization': 'mistral', + 'provider': 'mistral'}, + {'id': 'e705b65f-82cd-40cb-9630-d9e6ca92d06f', 'publicName': 'seedance-v1-pro', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'bytedance', 'provider': 'fal'}, + {'id': '9fe82ee1-c84f-417f-b0e7-cab4ae4cf3f3', 'publicName': 'qwen-image-prompt-extend', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, + {'id': 'df1cd509-605b-43fe-978e-7546126cc5d2', 'publicName': 'seedream-4-high-res', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, + 'outputCapabilities': {'web': False, 'code': False, 'text': False, + 'image': {'aspectRatios': ['1:1']}, 'video': False, 'search': False}}, + 'organization': 'bytedance', 'provider': 'bytedance'}, + {'id': '0862885e-ef53-4d0d-b9c4-4c8f68f453ce', 'publicName': 'diffbot-small-xl', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}, + 'organization': 'diffbot', 'provider': 'diffbot'}, {'id': 'c15b93ed-e87b-467f-8f9f-d830fd7aa54d', 'publicName': 'lmarena-internal-test-only', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '0862885e-ef53-4d0d-b9c4-4c8f68f453ce', 'publicName': 'diffbot-small-xl', 'organization': 'diffbot', - 'provider': 'diffbot', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}}, - {'id': 'ad6e8b44-d4e0-4544-85d4-ad05b83b0bf2', 'publicName': 'spuddle', + {'id': '30dfdea7-b4bc-4dab-8515-5d93917c7f4f', 'publicName': 'deepseek-v3.1', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'deepseek', 'provider': 'deepseek'}, + {'id': 'f1a5a6ab-e1b1-4247-88ac-49395291c1e3', 'publicName': 'not-a-new-model', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '43390b9c-cf16-4e4e-a1be-3355bb5b6d5e', 'publicName': 'flux-1-kontext-pro', 'organization': 'bfl', - 'provider': 'fal', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': False}}, - 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '30dfdea7-b4bc-4dab-8515-5d93917c7f4f', 'publicName': 'deepseek-v3.1', 'organization': 'deepseek', - 'provider': 'deepseek', + {'id': '73378be5-cdba-49e7-b3d0-027949871aa6', 'publicName': 'ideogram-v3-quality', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'Ideogram', 'provider': 'fal'}, + {'id': '9bbbca46-b6c2-4919-83a8-87ef1c559c4e', 'publicName': 'veo3-fast-audio', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'google', 'provider': 'googleVertex'}, + {'id': 'd63b03fb-8bc8-4ed8-9a50-6ccb683ac2b1', 'publicName': 'kling-v2.1-master', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'kling', 'provider': 'fal'}, + {'id': '86de5aea-fc0c-4c36-b65a-7afc443a32d2', 'publicName': 'pika-v2.2', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'pika', 'provider': 'fal'}, + {'id': '4ddc4e52-2867-49b6-a603-5aab24a566ca', 'publicName': 'seedance-v1-pro', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, + 'outputCapabilities': {'video': True}}, 'organization': 'bytedance', 'provider': 'fal'}, + {'id': '4c8dde6e-1b2c-45b9-91c3-413b2ceafffb', 'publicName': 'seedance-v1-lite', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, + 'outputCapabilities': {'video': True}}, 'organization': 'bytedance', 'provider': 'fal'}, + {'id': 'ea96cfc8-953a-4c3c-a229-1107c55b7479', 'publicName': 'kling-v2.1-standard', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, + 'outputCapabilities': {'video': True}}, 'organization': 'kling', 'provider': 'fal'}, + {'id': '5fd3caa8-fe4c-41a5-a22c-0025b58f4b42', 'publicName': 'gpt-5-mini-high', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'openai'}, + {'id': 'cff3fc67-4207-4dff-967f-f4de61115836', 'publicName': 'deepseek-v3.1-thinking', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'deepseek', 'provider': 'deepseek'}, + {'id': 'c3d0e5c8-f4b3-417a-8cb8-2ccf757d3869', 'publicName': 'sora', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'openai', 'provider': 'azureOpenAI'}, + {'id': 'f1a2eb6f-fc30-4806-9e00-1efd0d73cbc4', 'publicName': 'claude-opus-4-1-20250805-thinking-16k', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'anthropic', 'provider': 'googleVertexAnthropic'}, + {'id': 'e9dd5a96-c066-48b0-869f-eb762030b5ed', 'publicName': 'EB45-turbo', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '9fe82ee1-c84f-417f-b0e7-cab4ae4cf3f3', 'publicName': 'qwen-image-prompt-extend', 'organization': 'alibaba', - 'provider': 'alibaba', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '86de5aea-fc0c-4c36-b65a-7afc443a32d2', 'publicName': 'pika-v2.2', 'organization': 'pika', 'provider': 'fal', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}}, + {'id': 'd8771262-8248-4372-90d5-eb41910db034', 'publicName': 'seedream-3', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'bytedance', 'provider': 'fal'}, {'id': '0633b1ef-289f-49d4-a834-3d475a25e46b', 'publicName': 'flux-1-kontext-max', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': False}}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': 'f1a2eb6f-fc30-4806-9e00-1efd0d73cbc4', 'publicName': 'claude-opus-4-1-20250805-thinking-16k', - 'organization': 'anthropic', 'provider': 'googleVertexAnthropic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'e9dd5a96-c066-48b0-869f-eb762030b5ed', 'publicName': 'EB45-turbo', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '9bbbca46-b6c2-4919-83a8-87ef1c559c4e', 'publicName': 'veo3-fast-audio', 'organization': 'google', - 'provider': 'googleVertex', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}}, - {'id': 'cff3fc67-4207-4dff-967f-f4de61115836', 'publicName': 'deepseek-v3.1-thinking', 'organization': 'deepseek', - 'provider': 'deepseek', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '5fd3caa8-fe4c-41a5-a22c-0025b58f4b42', 'publicName': 'gpt-5-mini-high', 'organization': 'openai', - 'provider': 'openai', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '9dab0475-a0cc-4524-84a2-3fd25aa8c768', 'publicName': 'glm-4.5v', 'organization': 'zai', 'provider': 'zai', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '8afbc476-52af-4ebc-aa33-2ffdd7e19153', 'publicName': 'hailuo-02-pro', 'organization': 'minimax', - 'provider': 'minimax', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'video': True}}}, - {'id': 'd63b03fb-8bc8-4ed8-9a50-6ccb683ac2b1', 'publicName': 'kling-v2.1-master', 'organization': 'kling', - 'provider': 'fal', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}}, - {'id': '4c8dde6e-1b2c-45b9-91c3-413b2ceafffb', 'publicName': 'seedance-v1-lite', 'organization': 'bytedance', - 'provider': 'fal', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, - 'outputCapabilities': {'video': True}}}, - {'id': 'ea96cfc8-953a-4c3c-a229-1107c55b7479', 'publicName': 'kling-v2.1-standard', 'organization': 'kling', - 'provider': 'fal', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, - 'outputCapabilities': {'video': True}}}, - {'id': '4ddc4e52-2867-49b6-a603-5aab24a566ca', 'publicName': 'seedance-v1-pro', 'organization': 'bytedance', - 'provider': 'fal', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, - 'outputCapabilities': {'video': True}}}, - {'id': 'c3d0e5c8-f4b3-417a-8cb8-2ccf757d3869', 'publicName': 'sora', 'organization': 'openai', - 'provider': 'azureOpenAI', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}}, - {'id': 'd942b564-191c-41c5-ae22-400a930a2cfe', 'publicName': 'claude-opus-4-1-search', 'organization': 'anthropic', - 'provider': 'anthropicSearch', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}}, - {'id': '2dc249b3-98da-44b4-8d1e-6666346a8012', 'publicName': 'gpt-5-nano-high', 'organization': 'openai', - 'provider': 'openai', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'f9b9f030-9ebc-4765-bf76-c64a82a72dfd', 'publicName': 'pika-v2.2', 'organization': 'pika', 'provider': 'fal', + {'id': '9dab0475-a0cc-4524-84a2-3fd25aa8c768', 'publicName': 'glm-4.5v', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'zai', 'provider': 'zai'}, + {'id': 'f9b9f030-9ebc-4765-bf76-c64a82a72dfd', 'publicName': 'pika-v2.2', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, - 'outputCapabilities': {'video': True}}}, - {'id': 'ee39672b-d216-4bf4-b639-00469c4f886d', 'publicName': 'qwen-image-edit', 'organization': 'alibaba', - 'provider': 'fal', + 'outputCapabilities': {'video': True}}, 'organization': 'pika', 'provider': 'fal'}, + {'id': '2dc249b3-98da-44b4-8d1e-6666346a8012', 'publicName': 'gpt-5-nano-high', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'openai'}, + {'id': 'd942b564-191c-41c5-ae22-400a930a2cfe', 'publicName': 'claude-opus-4-1-search', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}, + 'organization': 'anthropic', 'provider': 'anthropicSearch'}, + {'id': '995cf221-af30-466d-a809-8e0985f83649', 'publicName': 'qwen-image-edit', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': False, 'requiresUpload': True}}, - 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': 'd14d9b23-1e46-4659-b157-a3804ba7e2ef', 'publicName': 'gpt-5-search', 'organization': 'openai', - 'provider': 'openaiResponses', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}}, - {'id': '2e1af1cb-8443-4f3e-8d60-113992bfb491', 'publicName': 'hunyuan-turbos-20250416', 'organization': 'tencent', - 'provider': 'tencent', + 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, 'organization': 'alibaba', + 'provider': 'alibaba'}, {'id': '6c98ce8c-41d1-42cd-b2e3-292c6519add5', 'publicName': 'redwood', + 'capabilities': {'inputCapabilities': {'text': True}, + 'outputCapabilities': {'text': True}}}, + {'id': '24d647d0-7945-442d-b323-08ca04e9e288', 'publicName': 'sorting-hat', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '23848331-9f93-404f-85f0-3c3b4ece177e', 'publicName': 'mai-1-preview', 'organization': 'microsoft-ai', - 'provider': 'microsoftAi', + {'id': '13ce11ba-def2-4c80-a70b-b0b2c14d293e', 'publicName': 'seedance-v1-lite', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'bytedance', 'provider': 'fal'}, + {'id': 'd14d9b23-1e46-4659-b157-a3804ba7e2ef', 'publicName': 'gpt-5-search', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'search': True}}, + 'organization': 'openai', 'provider': 'openaiResponses'}, + {'id': '19ad5f04-38c6-48ae-b826-f7d5bbfd79f7', 'publicName': 'gpt-5-high-new-system-prompt', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'openai', 'provider': 'openai'}, + {'id': '9af435c8-1f53-4b78-a400-c1f5e9fe09b0', 'publicName': 'leepwal', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'c382b9c6-d31b-488e-86c1-e84d8427eb30', 'publicName': 'hailuo-02-fast', 'organization': 'minimax', - 'provider': 'minimax', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, - 'outputCapabilities': {'video': True}}}, - {'id': '13ce11ba-def2-4c80-a70b-b0b2c14d293e', 'publicName': 'seedance-v1-lite', 'organization': 'bytedance', - 'provider': 'fal', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}}, - {'id': 'e4e58f18-c04f-47cd-8d11-4b2ece7b617e', 'publicName': 'nano-banana', - 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': True, 'requiresUpload': False}}, - 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '0754baa1-ab91-42d0-ba74-522aa8e5b8e2', 'publicName': 'runway-gen4-turbo', 'organization': 'runway', - 'provider': 'replicate', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, - 'outputCapabilities': {'video': True}}}, - {'id': 'efdb7e05-2091-4e88-af9e-4ea6168d2f85', 'publicName': 'kling-v2.1-master', 'organization': 'kling', - 'provider': 'fal', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, - 'outputCapabilities': {'video': True}}}, + {'id': 'f2f8176d-7a8c-4f4b-a9db-d78df3e81d10', 'publicName': 'route66', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + {'id': '23848331-9f93-404f-85f0-3c3b4ece177e', 'publicName': 'mai-1-preview', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'microsoft-ai', 'provider': 'microsoftAi'}, + {'id': 'efdb7e05-2091-4e88-af9e-4ea6168d2f85', 'publicName': 'kling-v2.1-master', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, + 'outputCapabilities': {'video': True}}, 'organization': 'kling', 'provider': 'fal'}, + {'id': '0754baa1-ab91-42d0-ba74-522aa8e5b8e2', 'publicName': 'runway-gen4-turbo', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, + 'outputCapabilities': {'video': True}}, 'organization': 'runway', 'provider': 'replicate'}, + {'id': 'f4809219-14a8-47fe-9705-8685085513e7', 'publicName': 'mochi-v1', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'genmo', 'provider': 'fal'}, {'id': 'e2969ebb-6450-4bc4-87c9-bbdcf95840da', 'publicName': 'seededit-3.0', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': False, 'requiresUpload': True}}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': 'f4809219-14a8-47fe-9705-8685085513e7', 'publicName': 'mochi-v1', 'organization': 'genmo', 'provider': 'fal', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}}, + {'id': '5e8e32e9-3a83-40ea-83a3-53ae65729998', 'publicName': 'oceanreef', + 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, + {'id': '463197ea-34f1-418e-b685-917015a004ab', 'publicName': 'phantom-0903-4', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + {'id': 'f6c8aadb-1835-4dfe-9217-bc95cdfc8fa8', 'publicName': 'anonymous-925', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, + {'id': '351fe482-eb6c-4536-857b-909e16c0bf52', 'publicName': 'qwen3-next-80b-a3b-instruct', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, + {'id': '73cf8705-98c8-4b75-8d04-e3746e1c1565', 'publicName': 'qwen3-next-80b-a3b-thinking', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'alibaba', 'provider': 'alibaba'}, + {'id': 'a9a26426-5377-4efa-bef9-de71e29ad943', 'publicName': 'hunyuan-image-2.1', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}, + 'organization': 'tencent', 'provider': 'fal'}, + {'id': '6fcbe051-f521-4dc7-8986-c429eb6191bf', 'publicName': 'longcat-flash-chat', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}, + 'organization': 'meituan', 'provider': 'meituan'}, + {'id': '3a91bb37-39fb-471c-8aa2-a89b98d280d0', 'publicName': 'wan-v2.2-a14b', + 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, + 'outputCapabilities': {'video': True}}, 'organization': 'alibaba', 'provider': 'fal'}, + {'id': '264e6e2f-b66a-4e27-a859-8145ff32d6f6', 'publicName': 'wan-v2.2-a14b', + 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}, + 'organization': 'alibaba', 'provider': 'fal'}, {'id': '32bff2df-00e6-409b-ad3f-bfbad87cc49f', 'publicName': 'hidream-e1.1', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'multipleImages': False, 'requiresUpload': True}}, 'outputCapabilities': {'image': {'aspectRatios': ['1:1']}}}}, - {'id': '264e6e2f-b66a-4e27-a859-8145ff32d6f6', 'publicName': 'wan-v2.2-a14b', 'organization': 'alibaba', - 'provider': 'fal', 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'video': True}}}, - {'id': '7a55108b-b997-4cff-a72f-5aa83beee918', 'publicName': 'gemini-2.0-flash-001', 'organization': 'google', - 'provider': 'google', + {'id': '7ece181a-912c-455f-9b83-11b0e1cdfae9', 'publicName': 'oceanstone', 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '3a91bb37-39fb-471c-8aa2-a89b98d280d0', 'publicName': 'wan-v2.2-a14b', 'organization': 'alibaba', - 'provider': 'fal', 'capabilities': {'inputCapabilities': {'text': True, 'image': {'requiresUpload': True}}, - 'outputCapabilities': {'video': True}}}, - {'id': 'f44e280a-7914-43ca-a25d-ecfcc5d48d09', 'publicName': 'claude-3-5-sonnet-20241022', - 'organization': 'anthropic', 'provider': 'googleVertexAnthropic', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'bd2c8278-af7a-4ec3-84db-0a426c785564', 'publicName': 'grok-3-preview-02-24', 'organization': 'xai', - 'provider': 'xaiPrivate', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': 'c28823c1-40fd-4eaf-9825-e28f11d1f8b2', 'publicName': 'llama-4-scout-17b-16e-instruct', - 'organization': 'meta', 'provider': 'fireworks', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '230a568c-9e39-4dbf-9bd8-a7e130111b4f', 'publicName': 'phantom-0822-1', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '49bd7403-c7fd-4d91-9829-90a91906ad6c', 'publicName': 'llama-4-maverick-03-26-experimental', - 'organization': 'meta', 'provider': 'meta', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '885976d3-d178-48f5-a3f4-6e13e0718872', 'publicName': 'qwq-32b', 'organization': 'alibaba', - 'provider': 'alibaba', - 'capabilities': {'inputCapabilities': {'text': True}, 'outputCapabilities': {'text': True}}}, - {'id': '69f5d38a-45f5-4d3a-9320-b866a4035ed9', 'publicName': 'mistral-small-3.1-24b-instruct-2503', - 'organization': 'mistral', 'provider': 'mistral', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '789e245f-eafe-4c72-b563-d135e93988fc', 'publicName': 'gemma-3-27b-it', 'organization': 'google', - 'provider': 'google', - 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}, - {'id': '14e9311c-94d2-40c2-8c54-273947e208b0', 'publicName': 'gpt-4.1-2025-04-14', 'organization': 'openai', - 'provider': 'openai', + {'id': 'f23d6df4-4395-4404-897f-bdedc909e783', 'publicName': 'raptor', 'capabilities': {'inputCapabilities': {'text': True, 'image': True}, 'outputCapabilities': {'text': True}}}] -text_models = {model["publicName"]: model["id"] for model in models if "text" in model["capabilities"]["outputCapabilities"]} -image_models = {model["publicName"]: model["id"] for model in models if "image" in model["capabilities"]["outputCapabilities"]} +text_models = {model["publicName"]: model["id"] for model in models if + "text" in model["capabilities"]["outputCapabilities"]} +image_models = {model["publicName"]: model["id"] for model in models if + "image" in model["capabilities"]["outputCapabilities"]} vision_models = [model["publicName"] for model in models if "image" in model["capabilities"]["inputCapabilities"]] if has_nodriver: - async def click_trunstile(page: nodriver.Tab, element = 'document.getElementById("cf-turnstile")'): + async def click_trunstile(page: nodriver.Tab, element='document.getElementById("cf-turnstile")'): for _ in range(3): size = None for idx in range(15): @@ -438,6 +480,7 @@ if has_nodriver: break debug.log("Finished clicking trunstile.") + class LMArena(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin): label = "LMArena" url = "https://lmarena.ai" @@ -477,11 +520,15 @@ class LMArena(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin): if response.ok: for line in response.text.splitlines(): if "initialModels" in line: - line = line.split("initialModels", maxsplit=1)[-1].split("initialModelAId")[0][3:-3].replace('\\', '') + line = line.split("initialModels", maxsplit=1)[-1].split("initialModelAId")[0][ + 3:-3].replace('\\', '') models = json.loads(line) - cls.text_models = {model["publicName"]: model["id"] for model in models if "text" in model["capabilities"]["outputCapabilities"]} - cls.image_models = {model["publicName"]: model["id"] for model in models if "image" in model["capabilities"]["outputCapabilities"]} - cls.vision_models = [model["publicName"] for model in models if "image" in model["capabilities"]["inputCapabilities"]] + cls.text_models = {model["publicName"]: model["id"] for model in models if + "text" in model["capabilities"]["outputCapabilities"]} + cls.image_models = {model["publicName"]: model["id"] for model in models if + "image" in model["capabilities"]["outputCapabilities"]} + cls.vision_models = [model["publicName"] for model in models if + "image" in model["capabilities"]["inputCapabilities"]] cls.models = list(cls.text_models) + list(cls.image_models) cls.default_model = list(cls.text_models.keys())[0] cls._models_loaded = True @@ -494,14 +541,14 @@ class LMArena(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin): @classmethod async def create_async_generator( - cls, - model: str, - messages: Messages, - conversation: JsonConversation = None, - media: MediaListType = None, - proxy: str = None, - timeout: int = None, - **kwargs + cls, + model: str, + messages: Messages, + conversation: JsonConversation = None, + media: MediaListType = None, + proxy: str = None, + timeout: int = None, + **kwargs ) -> AsyncResult: if cls.share_url is None: cls.share_url = os.getenv("G4F_SHARE_URL") @@ -540,6 +587,7 @@ class LMArena(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin): await asyncio.sleep(1) while not await page.evaluate('document.querySelector(\'textarea\')'): await asyncio.sleep(1) + args = await get_args_from_nodriver(cls.url, proxy=proxy, callback=callback) with cache_file.open("w") as f: json.dump(args, f) @@ -630,9 +678,9 @@ class LMArena(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin): try: async with StreamSession(**args, timeout=timeout) as session: async with session.post( - cls.api_endpoint, - json=data, - proxy=proxy + cls.api_endpoint, + json=data, + proxy=proxy ) as response: await raise_for_status(response) args["cookies"] = merge_cookies(args["cookies"], response) @@ -673,6 +721,7 @@ class LMArena(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin): with cache_file.open("w") as f: f.write(json.dumps(args)) + def get_content_type(url: str) -> str: if url.endswith(".webp"): return "image/webp" From 4e5c26fd60d8b9a9a09b84a111012ddcd49389c2 Mon Sep 17 00:00:00 2001 From: hlohaus <983577+hlohaus@users.noreply.github.com> Date: Sun, 21 Sep 2025 11:40:54 +0200 Subject: [PATCH 2/3] Remove unused import and update sse_stream function signature for consistency --- g4f/Provider/Blackbox.py | 1 - g4f/Provider/Qwen.py | 47 ++++++++++++++++++++-------------------- g4f/requests/__init__.py | 3 +-- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/g4f/Provider/Blackbox.py b/g4f/Provider/Blackbox.py index 3c38f686..ed4632bc 100644 --- a/g4f/Provider/Blackbox.py +++ b/g4f/Provider/Blackbox.py @@ -8,7 +8,6 @@ import random import string from pathlib import Path from typing import Optional -from datetime import datetime, timedelta from ..typing import AsyncResult, Messages, MediaListType from ..requests.raise_for_status import raise_for_status diff --git a/g4f/Provider/Qwen.py b/g4f/Provider/Qwen.py index 46274896..4d347fc8 100644 --- a/g4f/Provider/Qwen.py +++ b/g4f/Provider/Qwen.py @@ -12,6 +12,7 @@ from ..errors import RateLimitError from ..typing import AsyncResult, Messages, MediaListType from ..providers.response import JsonConversation, Reasoning, Usage, ImageResponse, FinishReason from ..requests import sse_stream +from ..tools.media import merge_media from .base_provider import AsyncGeneratorProvider, ProviderModelMixin from .helper import get_last_user_message from .. import debug @@ -60,7 +61,6 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): supports_message_history = False _models_loaded = True - # Complete list of models, extracted from the API image_models = image_models text_models = text_models vision_models = vision_models @@ -88,6 +88,8 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): cls.models = [model["id"] for model in models] cls.default_model = cls.models[0] cls._models_loaded = True + cls.live += 1 + debug.log(f"Loaded {len(cls.models)} models from {cls.url}") else: debug.log(f"Failed to load models from {cls.url}: {response.status_code} {response.reason}") @@ -95,20 +97,20 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): @classmethod async def create_async_generator( - cls, - model: str, - messages: Messages, - media: MediaListType = None, - conversation: JsonConversation = None, - proxy: str = None, - timeout: int = 120, - stream: bool = True, - enable_thinking: bool = True, - chat_type: Literal[ - "t2t", "search", "artifacts", "web_dev", "deep_research", "t2i", "image_edit", "t2v" - ] = "t2t", - image_size: Optional[Literal["1:1", "4:3", "3:4", "16:9", "9:16"]] = None, - **kwargs + cls, + model: str, + messages: Messages, + media: MediaListType = None, + conversation: JsonConversation = None, + proxy: str = None, + timeout: int = 120, + stream: bool = True, + enable_thinking: bool = True, + chat_type: Literal[ + "t2t", "search", "artifacts", "web_dev", "deep_research", "t2i", "image_edit", "t2v" + ] = "t2t", + aspect_ratio: Optional[Literal["1:1", "4:3", "3:4", "16:9", "9:16"]] = None, + **kwargs ) -> AsyncResult: """ chat_type: @@ -164,7 +166,6 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): req_headers['bx-umidtoken'] = cls._midtoken req_headers['bx-v'] = '2.5.31' message_id = str(uuid.uuid4()) - parent_id = None if conversation is None: chat_payload = { "title": "New Chat", @@ -186,8 +187,9 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): parent_id=None ) files = [] + media = list(merge_media(media)) if media: - for index, (_file, file_name) in enumerate(media): + for _file, file_name in media: file_class: Literal["default", "vision", "video", "audio", "document"] = "vision" _type: Literal["file", "image", "video", "audio"] = "image" file_type = "image/jpeg" @@ -206,7 +208,7 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): "name": file_name, "file_type": file_type, "showType": showType, - "file_class": file_class, # "document" + "file_class": file_class, "url": _file } ) @@ -243,8 +245,8 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): } ] } - if image_size: - msg_payload["size"] = image_size + if aspect_ratio: + msg_payload["size"] = aspect_ratio async with session.post( f'{cls.url}/api/v2/chat/completions?chat_id={conversation.chat_id}', json=msg_payload, @@ -276,11 +278,10 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin): elif phase == "answer" and thinking_started: thinking_started = False elif phase == "image_gen" and status == "typing": - yield ImageResponse([content], "", extra) + yield ImageResponse(content, prompt, extra) continue elif phase == "image_gen" and status == "finished": - yield FinishReason(status) - + yield FinishReason("stop") if content: yield Reasoning(content) if thinking_started else content except (json.JSONDecodeError, KeyError, IndexError): diff --git a/g4f/requests/__init__.py b/g4f/requests/__init__.py index 5ca26513..650caa6f 100644 --- a/g4f/requests/__init__.py +++ b/g4f/requests/__init__.py @@ -113,7 +113,6 @@ async def get_args_from_nodriver( await callback(page) for c in await page.send(nodriver.cdp.network.get_cookies([url])): cookies[c.name] = c.value - await page.close() stop_browser() return { "impersonate": "chrome", @@ -219,7 +218,7 @@ async def get_nodriver( BrowserConfig.stop_browser = on_stop return browser, on_stop -async def sse_stream(iter_lines: Iterator[bytes]) -> AsyncIterator[dict]: +async def sse_stream(iter_lines: AsyncIterator[bytes]) -> AsyncIterator[dict]: if hasattr(iter_lines, "content"): iter_lines = iter_lines.content elif hasattr(iter_lines, "iter_lines"): From bb02eeb48128e6533bfc3afc80813a27d5676836 Mon Sep 17 00:00:00 2001 From: hlohaus <983577+hlohaus@users.noreply.github.com> Date: Sun, 21 Sep 2025 11:55:29 +0200 Subject: [PATCH 3/3] Add model alias for Kimi-K2-Instruct and update best_provider references --- g4f/Provider/DeepInfra.py | 2 ++ g4f/Provider/PollinationsAI.py | 3 +++ g4f/Provider/needs_auth/hf/models.py | 1 + g4f/models.py | 4 ++-- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/g4f/Provider/DeepInfra.py b/g4f/Provider/DeepInfra.py index 2be91be2..1295d78a 100644 --- a/g4f/Provider/DeepInfra.py +++ b/g4f/Provider/DeepInfra.py @@ -77,6 +77,8 @@ class DeepInfra(OpenaiTemplate): "qwen-3-32b": "Qwen/Qwen3-32B", "qwen-3-235b": "Qwen/Qwen3-235B-A22B", "qwq-32b": "Qwen/QwQ-32B", + + "moonshotai/Kimi-K2-Instruct": "moonshotai/Kimi-K2-Instruct-0905", } @classmethod diff --git a/g4f/Provider/PollinationsAI.py b/g4f/Provider/PollinationsAI.py index 985ef881..e1adb9a0 100644 --- a/g4f/Provider/PollinationsAI.py +++ b/g4f/Provider/PollinationsAI.py @@ -88,6 +88,7 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin): vision_models = [default_vision_model] _models_loaded = False model_aliases = { + "openai-fast": "gpt-4.1-nano", "llama-4-scout": "llamascout", "deepseek-r1": "deepseek-reasoning", "sdxl-turbo": "turbo", @@ -105,6 +106,8 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin): alias = model.get("name") if (model.get("aliases")): alias = model.get("aliases")[0] + elif alias in cls.model_aliases: + alias = cls.model_aliases[alias] return alias.replace("-instruct", "").replace("qwen-", "qwen").replace("qwen", "qwen-") if not cls._models_loaded: try: diff --git a/g4f/Provider/needs_auth/hf/models.py b/g4f/Provider/needs_auth/hf/models.py index d4cf3dda..b12d788c 100644 --- a/g4f/Provider/needs_auth/hf/models.py +++ b/g4f/Provider/needs_auth/hf/models.py @@ -32,6 +32,7 @@ model_aliases = { "llama-3.2-11b": "meta-llama/Llama-3.2-11B-Vision-Instruct", "mistral-nemo": "mistralai/Mistral-Nemo-Instruct-2407", "phi-3.5-mini": "microsoft/Phi-3.5-mini-instruct", + "moonshotai/Kimi-K2-Instruct": "moonshotai/Kimi-K2-Instruct-0905", ### Used in other providers ### "qwen-2-vl-7b": "Qwen/Qwen2-VL-7B-Instruct", "gemma-2-27b": "google/gemma-2-27b-it", diff --git a/g4f/models.py b/g4f/models.py index 4e577ebf..0e34c312 100644 --- a/g4f/models.py +++ b/g4f/models.py @@ -271,7 +271,7 @@ o4_mini_high = Model( gpt_4_1 = Model( name = 'gpt-4.1', base_provider = 'OpenAI', - best_provider = IterListProvider([PollinationsAI, OpenaiChat]) + best_provider = IterListProvider([OpenaiChat]) ) gpt_4_1_mini = Model( @@ -283,7 +283,7 @@ gpt_4_1_mini = Model( gpt_4_1_nano = Model( name = 'gpt-4.1-nano', base_provider = 'OpenAI', - best_provider = IterListProvider([Blackbox]) + best_provider = IterListProvider([Blackbox, PollinationsAI]) ) gpt_4_5 = Model(