from dataclasses import dataclass from typing import Literal, TypedDict from openai.types import AudioModel STTModels = AudioModel TTSModels = Literal["tts-1", "tts-1-hd", "gpt-4o-mini-tts"] TTSVoices = Literal[ "alloy", "ash", "ballad", "coral", "echo", "fable", "onyx", "nova", "sage", "shimmer", ] DalleModels = Literal["dall-e-2", "dall-e-3"] ChatModels = Literal[ "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-chat-latest", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.1", "gpt-5.1-chat-latest", "gpt-5", "gpt-5-chat-latest", "gpt-5-mini", "gpt-5-nano", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-4o-2024-05-13", "gpt-4o-mini", "gpt-4o-mini-2024-07-18", "gpt-4-turbo", "gpt-4-turbo-2024-04-09", "gpt-4-turbo-preview", "gpt-4-0125-preview", "gpt-4-1106-preview", "gpt-4-vision-preview", "gpt-4-1106-vision-preview", "gpt-4", "gpt-4-0314", "gpt-4-0613", "gpt-4-32k", "gpt-4-32k-0314", "gpt-4-32k-0613", "gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-0301", "gpt-3.5-turbo-0613", "gpt-3.5-turbo-1106", "gpt-3.5-turbo-16k-0613", ] RealtimeModels = Literal[ "gpt-realtime", "gpt-realtime-1.5", "gpt-realtime-2", "gpt-realtime-2025-08-28", "gpt-4o-realtime-preview", ] EmbeddingModels = Literal[ "text-embedding-ada-002", "text-embedding-3-small", "text-embedding-3-large" ] AssistantTools = Literal["code_interpreter", "file_search", "function"] # adapters for OpenAI-compatible LLMs TelnyxChatModels = Literal[ "meta-llama/Meta-Llama-3.1-8B-Instruct", "meta-llama/Meta-Llama-3.1-70B-Instruct", ] NebiusChatModels = Literal[ "meta-llama/Meta-Llama-3.1-70B-Instruct", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama/Llama-3.3-8B-Instruct", "meta-llama/Meta-Llama-3.1-405B-Instruct", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "moonshotai/Kimi-K2-Instruct", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "NousResearch/Hermes-4-405B", "NousResearch/Hermes-4-70B", "zai-org/GLM-4.5", "zai-org/GLM-4.5-Air", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-V3", "deepseek-ai/DeepSeek-V3-0324", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B", "Qwen/Qwen3-32B", "Qwen/Qwen3-30B-A3B", "Qwen/Qwen3-4B-fast", "Qwen/Qwen3-14B", "Qwen/Qwen2.5-Coder-7B", "Qwen/Qwen2.5-Coder-32B-Instruct", "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1", "mistralai/Mistral-Nemo-Instruct-2407", "google/gemma-2-2b-it", ] CerebrasChatModels = Literal[ "llama3.1-8b", "llama-3.3-70b", "llama-4-scout-17b-16e-instruct", "llama-4-maverick-17b-128e-instruct", "qwen-3-32b", "qwen-3-235b-a22b-instruct-2507", "qwen-3-235b-a22b-thinking-2507", "qwen-3-coder-480b", "gpt-oss-120b", ] PerplexityChatModels = Literal[ "llama-3.1-sonar-small-128k-online", "llama-3.1-sonar-small-128k-chat", "llama-3.1-sonar-large-128k-online", "llama-3.1-sonar-large-128k-chat", "llama-3.1-8b-instruct", "llama-3.1-70b-instruct", ] DeepSeekChatModels = Literal[ "deepseek-coder", "deepseek-chat", ] CometAPIChatModels = Literal[ # GPT series "gpt-5-chat-latest", "gpt-5", "gpt-5-pro", "gpt-5-nano", "gpt-4.1", "gpt-4o-mini", "o4-mini-2025-04-16", "o3-pro-2025-06-10", "chatgpt-4o-latest", # Claude series "claude-sonnet-4-5-20250929", "claude-opus-4-1-20250805", "claude-opus-4-1-20250805-thinking", "claude-sonnet-4-20250514", "claude-sonnet-4-20250514-thinking", "claude-3-7-sonnet-latest", "claude-3-5-haiku-latest", # Gemini series "gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.0-flash", # Grok series "grok-4-0709", "grok-4-fast-non-reasoning", "grok-4-fast-reasoning", # DeepSeek series "deepseek-v3.1", "deepseek-v3", "deepseek-r1-0528", "deepseek-chat", "deepseek-reasoner", # Qwen series "qwen3-30b-a3b", "qwen3-coder-plus-2025-07-22", ] VertexModels = Literal[ "google/gemini-2.0-flash-exp", "google/gemini-1.5-flash", "google/gemini-1.5-pro", "google/gemini-1.0-pro-vision", "google/gemini-1.0-pro-vision-001", "google/gemini-1.0-pro-002", "google/gemini-1.0-pro-001", "google/gemini-1.0-pro", ] TogetherChatModels = Literal[ "Austism/chronos-hermes-13b", "Gryphe/MythoMax-L2-13b", "NousResearch/Nous-Capybara-7B-V1p9", "NousResearch/Nous-Hermes-2-Mistral-7B-DPO", "NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO", "NousResearch/Nous-Hermes-2-Mixtral-8x7B-SFT", "NousResearch/Nous-Hermes-2-Yi-34B", "NousResearch/Nous-Hermes-Llama2-13b", "NousResearch/Nous-Hermes-llama-2-7b", "Open-Orca/Mistral-7B-OpenOrca", "Qwen/Qwen1.5-0.5B-Chat", "Qwen/Qwen1.5-1.8B-Chat", "Qwen/Qwen1.5-110B-Chat", "Qwen/Qwen1.5-14B-Chat", "Qwen/Qwen1.5-32B-Chat", "Qwen/Qwen1.5-4B-Chat", "Qwen/Qwen1.5-72B-Chat", "Qwen/Qwen1.5-7B-Chat", "Qwen/Qwen2-72B-Instruct", "Snowflake/snowflake-arctic-instruct", "Undi95/ReMM-SLERP-L2-13B", "Undi95/Toppy-M-7B", "WizardLM/WizardLM-13B-V1.2", "allenai/OLMo-7B", "allenai/OLMo-7B-Instruct", "allenai/OLMo-7B-Twin-2T", "codellama/CodeLlama-13b-Instruct-hf", "codellama/CodeLlama-34b-Instruct-hf", "codellama/CodeLlama-70b-Instruct-hf", "codellama/CodeLlama-7b-Instruct-hf", "cognitivecomputations/dolphin-2.5-mixtral-8x7b", "databricks/dbrx-instruct", "deepseek-ai/deepseek-coder-33b-instruct", "deepseek-ai/deepseek-llm-67b-chat", "garage-bAInd/Platypus2-70B-instruct", "google/gemma-2-27b-it", "google/gemma-2-9b-it", "google/gemma-2b-it", "google/gemma-7b-it", "lmsys/vicuna-13b-v1.5", "lmsys/vicuna-7b-v1.5", "meta-llama/Llama-2-13b-chat-hf", "meta-llama/Llama-2-70b-chat-hf", "meta-llama/Llama-2-7b-chat-hf", "meta-llama/Llama-3-70b-chat-hf", "meta-llama/Llama-3-8b-chat-hf", "meta-llama/Meta-Llama-3-70B-Instruct-Lite", "meta-llama/Meta-Llama-3-70B-Instruct-Turbo", "meta-llama/Meta-Llama-3-8B-Instruct-Lite", "meta-llama/Meta-Llama-3-8B-Instruct-Turbo", "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", "meta-llama/Llama-3.3-70B-Instruct-Turbo", "mistralai/Mistral-7B-Instruct-v0.1", "mistralai/Mistral-7B-Instruct-v0.2", "mistralai/Mistral-7B-Instruct-v0.3", "mistralai/Mixtral-8x22B-Instruct-v0.1", "mistralai/Mixtral-8x7B-Instruct-v0.1", "openchat/openchat-3.5-1210", "snorkelai/Snorkel-Mistral-PairRM-DPO", "teknium/OpenHermes-2-Mistral-7B", "teknium/OpenHermes-2p5-Mistral-7B", "togethercomputer/Llama-2-7B-32K-Instruct", "togethercomputer/RedPajama-INCITE-7B-Chat", "togethercomputer/RedPajama-INCITE-Chat-3B-v1", "togethercomputer/StripedHyena-Nous-7B", "togethercomputer/alpaca-7b", "upstage/SOLAR-10.7B-Instruct-v1.0", "zero-one-ai/Yi-34B-Chat", ] OctoChatModels = Literal[ "meta-llama-3-70b-instruct", "meta-llama-3.1-405b-instruct", "meta-llama-3.1-70b-instruct", "meta-llama-3.1-8b-instruct", "mistral-7b-instruct", "mixtral-8x7b-instruct", "wizardlm-2-8x22bllamaguard-2-7b", ] XAIChatModels = Literal[ "grok-3", "grok-3-fast", "grok-3-mini", "grok-3-mini-fast", "grok-2-vision-1212", "grok-2-image-1212", "grok-2-1212", ] SambaNovaChatModels = Literal[ "DeepSeek-R1-0528", "DeepSeek-V3-0324", "DeepSeek-V3.1", "DeepSeek-R1-Distill-Llama-70B", "Meta-Llama-3.3-70B-Instruct", "Meta-Llama-3.1-8B-Instruct", "Llama-4-Maverick-17B-128E-Instruct", "gpt-oss-120b", "Qwen3-235B-A22B-Instruct-2507", "Qwen3-32B", "Llama-3.3-Swallow-70B-Instruct-v0.4", "E5-Mistral-7B-Instruct", ] def _supports_reasoning_effort(model: ChatModels | str) -> bool: return model in [ "gpt-5.4", "gpt-5.4-mini", "gpt-5.2", "gpt-5.1", "gpt-5", "gpt-5-mini", "gpt-5-nano", ] @dataclass class OpenRouterWebPlugin: """OpenRouter web search plugin configuration""" max_results: int = 5 search_prompt: str | None = None id: str = "web" class OpenRouterProviderPreferences(TypedDict, total=False): """OpenRouter provider routing preferences.""" order: list[str] allow_fallbacks: bool require_parameters: bool data_collection: Literal["allow", "deny"] only: list[str] ignore: list[str] quantizations: list[str] sort: Literal["price", "throughput", "latency"] max_price: dict[str, float]