From 8fb9bd9b407099a8427ba9453999de00aca3ac1e Mon Sep 17 00:00:00 2001 From: Brian Sparker Date: Fri, 24 Jul 2026 13:16:29 -0400 Subject: [PATCH 01/15] docs: add You.com Search to Common MCP Servers Co-Authored-By: Claude Fable 5 --- cecli/website/docs/config/mcp.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cecli/website/docs/config/mcp.md b/cecli/website/docs/config/mcp.md index 550dd7c69d0..2374b362ea6 100644 --- a/cecli/website/docs/config/mcp.md +++ b/cecli/website/docs/config/mcp.md @@ -171,6 +171,22 @@ mcp-servers: url: https://mcp.deepwiki.com/mcp ``` +### You.com Search + +You.com MCP provides live web and news search with LLM-ready results, useful when the model needs current information — release notes, library docs, error messages — beyond its training cutoff, and as the search complement to `/web` (search first, then scrape the best result). The configuration below uses the free keyless profile (web search only, rate limited per IP), so it works with no signup; an [API key](https://you.com/docs/build-with-agents/mcp-server?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs) additionally unlocks page content extraction and cited multi-source research tools. + +```yaml +mcp-servers: + mcpServers: + youcom: + transport: http + url: https://api.you.com/mcp?profile=free + # With a You.com API key (unlocks you-contents and you-research): + # url: https://api.you.com/mcp + # headers: + # Authorization: "Bearer " +``` + ### Serena Serena MCP provides LSP support for the current project, offering code analysis, symbol navigation, and project-specific tooling. It runs as a local stdio server and provides context-aware development assistance directly within the IDE environment. From 4cb3f635b387afe34a01907ad01eaebd6f00307d Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 12:39:54 +0200 Subject: [PATCH 02/15] A shell command with a prompt does not output the command three times now (twice before, once after the prompt), but only once, in non-TUI mode. --- cecli/tools/command.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cecli/tools/command.py b/cecli/tools/command.py index 3a70a799277..f1e104cccce 100644 --- a/cecli/tools/command.py +++ b/cecli/tools/command.py @@ -210,7 +210,12 @@ async def execute( @classmethod async def _get_confirmation(cls, coder, command_string, background): - """Get user confirmation for command execution.""" + """Get user confirmation for command execution. + + NOTE: This does NOT print the command itself. The caller (format_output + via _print_tool_call_info) is responsible for displaying the command + before this runs. Do not print the command here or it will appear twice. + """ # Hash command for dict key lookup command_hash = cls._hash_command(command_string) @@ -231,8 +236,6 @@ async def _get_confirmation(cls, coder, command_string, background): if fnmatch.fnmatch(command_string, pattern): return True - formatted_command = coder.format_command_with_prefix(command_string) - if background: prompt = "Allow execution of this background command?" else: @@ -240,7 +243,6 @@ async def _get_confirmation(cls, coder, command_string, background): confirmed = await coder.io.confirm_ask( prompt, - subject=formatted_command, explicit_yes_required=True, allow_never=True, group_response="Command Tool", @@ -251,7 +253,6 @@ async def _get_confirmation(cls, coder, command_string, background): if command_hash not in cls.ALLOWED_SESSION_COMMANDS: session_allowed = await coder.io.confirm_ask( "Allow this command for the rest of the session?", - subject=formatted_command, ) cls.ALLOWED_SESSION_COMMANDS[command_hash] = session_allowed @@ -686,7 +687,7 @@ def format_output(cls, coder, mcp_server, tool_response): coder.io.tool_output(f"{color_start}Action:{color_end} {action}") elif command: coder.io.tool_output(f"{color_start}Command:{color_end}") - coder.io.tool_output(command) + coder.io.tool_output(coder.format_command_with_prefix(command)) coder.io.tool_output("") From db77221b23b468060b78cc7b24ca2e361ef18151 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 08:17:39 -0400 Subject: [PATCH 03/15] Bump Version --- cecli/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cecli/__init__.py b/cecli/__init__.py index 32e83040c50..45c3b410f3d 100644 --- a/cecli/__init__.py +++ b/cecli/__init__.py @@ -1,6 +1,6 @@ from packaging import version -__version__ = "1.0.1.dev" +__version__ = "1.0.2.dev" safe_version = __version__ try: From c3610d5145e8fe7ed2c17f538ca61a9f2227dcee Mon Sep 17 00:00:00 2001 From: Brian Sparker Date: Tue, 28 Jul 2026 10:15:41 -0400 Subject: [PATCH 04/15] docs: make You.com free tier explicit and mark as paid service Per maintainer review on #619: call out the keyless free tier (100 queries/day, you-search only) and the paid tier separately, and add a Paid Service marker to the section heading. --- cecli/website/docs/config/mcp.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cecli/website/docs/config/mcp.md b/cecli/website/docs/config/mcp.md index 2374b362ea6..2c6572732ba 100644 --- a/cecli/website/docs/config/mcp.md +++ b/cecli/website/docs/config/mcp.md @@ -171,9 +171,13 @@ mcp-servers: url: https://mcp.deepwiki.com/mcp ``` -### You.com Search +### You.com Search (Paid Service) -You.com MCP provides live web and news search with LLM-ready results, useful when the model needs current information — release notes, library docs, error messages — beyond its training cutoff, and as the search complement to `/web` (search first, then scrape the best result). The configuration below uses the free keyless profile (web search only, rate limited per IP), so it works with no signup; an [API key](https://you.com/docs/build-with-agents/mcp-server?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs) additionally unlocks page content extraction and cited multi-source research tools. +You.com MCP provides live web and news search with LLM-ready results, useful when the model needs current information — release notes, library docs, error messages — beyond its training cutoff, and as the search complement to `/web` (search first, then scrape the best result). + +**Free tier — no account, no API key.** The `?profile=free` endpoint used in the configuration below is limited to 100 queries per day (rate limited per IP) and exposes the `you-search` tool only. + +**Paid tier.** An [API key](https://you.com/platform?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs) raises the rate limit and unlocks the remaining tools: `you-contents` (page content extraction), `you-research` (cited multi-source research), `you-finance`, `you-discover`, and `you-balance`. Usage beyond the free allowance is pay-as-you-go — see [pricing](https://you.com/pricing?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs) and the [MCP server docs](https://you.com/docs/build-with-agents/mcp-server?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs). ```yaml mcp-servers: From df6c2116cfa222fa741a1b02c167ee7e06c819e7 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 15:16:12 -0400 Subject: [PATCH 05/15] #625: Specify encoding for config parsing --- cecli/helpers/config_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cecli/helpers/config_utils.py b/cecli/helpers/config_utils.py index d6342fd1f12..25305153d5f 100644 --- a/cecli/helpers/config_utils.py +++ b/cecli/helpers/config_utils.py @@ -23,7 +23,7 @@ def load_and_apply_cecli_conf_files( for config_file in existing_cecli_conf: try: - with open(config_file, "r") as f: + with open(config_file, "r", encoding="utf-8") as f: config_data = yaml.safe_load(f) if isinstance(config_data, dict): @@ -199,7 +199,7 @@ def read_and_merge_all_configs( for path in all_config_paths: if os.path.exists(path): try: - with open(path, "r") as f: + with open(path, "r", encoding="utf-8") as f: data = yaml.safe_load(f) if isinstance(data, dict): From cc1c08d5543fc6042216a8ab0e262e92004c5f3f Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 17:41:29 -0400 Subject: [PATCH 06/15] All pipes should be utf-8 --- cecli/main.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/cecli/main.py b/cecli/main.py index ed58802ff72..81dfdbbcba8 100644 --- a/cecli/main.py +++ b/cecli/main.py @@ -3,9 +3,28 @@ try: if sys.platform == "win32": - sys.stdout.reconfigure(encoding="utf-8") - sys.stderr.reconfigure(encoding="utf-8") -except Exception: + if sys.stdout is not None: + try: + sys.stdout.reconfigure(encoding="utf-8") + except AttributeError: + pass + + if sys.stderr is not None: + try: + sys.stderr.reconfigure(encoding="utf-8") + except AttributeError: + pass + + if sys.stdin is not None: + try: + sys.stdin.reconfigure(encoding="utf-8") + except AttributeError: + pass +except AttributeError: + # Happens if streams were overridden by a test framework or GUI (e.g., pythonw.exe) + pass +except sys.UnsupportedOperation: + # Happens in certain edge-case piping scenarios pass try: From feffc924dc37dc808e053efa299a01de1d2e9d80 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 18:36:31 -0400 Subject: [PATCH 07/15] Add fallback to charset normalizer for general safe_open method, update all open calls to use safe_open() in core program --- cecli/coders/base_coder.py | 3 +- cecli/commands/history_search.py | 3 +- cecli/commands/terminal_setup.py | 45 ++++----- cecli/commands/utils/save_load_manager.py | 6 +- cecli/commands/workspace.py | 3 +- cecli/decoding.py | 115 ++++++++++++++++++++++ cecli/diffs.py | 6 +- cecli/editor.py | 3 +- cecli/helpers/agents/config.py | 4 +- cecli/helpers/background_commands.py | 4 +- cecli/helpers/config_utils.py | 6 +- cecli/helpers/conversation/manager.py | 3 +- cecli/helpers/file_system/ignore.py | 4 +- cecli/helpers/file_system/service.py | 6 +- cecli/helpers/grep_ast/main.py | 4 +- cecli/helpers/lock_detect.py | 4 +- cecli/helpers/monorepo/config.py | 6 +- cecli/helpers/monorepo/workspace.py | 3 +- cecli/history.py | 3 +- cecli/hooks/registry.py | 3 +- cecli/io.py | 7 +- cecli/main.py | 17 +++- cecli/mcp/oauth.py | 8 +- cecli/mcp/server.py | 4 +- cecli/mcp/utils.py | 4 +- cecli/mdstream.py | 3 +- cecli/models.py | 9 +- cecli/onboarding.py | 3 +- cecli/prompts/utils/registry.py | 4 +- cecli/repo.py | 5 +- cecli/sessions.py | 3 +- cecli/tools/resource_manager.py | 3 +- cecli/tui/app.py | 3 +- cecli/watch.py | 3 +- requirements.txt | 3 +- requirements/common-constraints.txt | 6 +- requirements/requirements-help.txt | 2 +- requirements/requirements.in | 2 +- 38 files changed, 247 insertions(+), 76 deletions(-) create mode 100644 cecli/decoding.py diff --git a/cecli/coders/base_coder.py b/cecli/coders/base_coder.py index c16cf63cb92..82668419f3e 100755 --- a/cecli/coders/base_coder.py +++ b/cecli/coders/base_coder.py @@ -34,6 +34,7 @@ import cecli.prompts.utils.system as prompts from cecli import __version__, models, urls, utils from cecli.commands import Commands, SwitchCoderSignal +from cecli.decoding import safe_open from cecli.exceptions import LiteLLMExceptions from cecli.helpers import command_parser, coroutines, nested, responses from cecli.helpers.conversation import ConversationService, MessageTag @@ -3755,7 +3756,7 @@ async def show_send_output_stream(self, completion): completion, self.interrupt_event ): if self.args.debug: - with open(".cecli/logs/chunks.log", "a") as f: + with safe_open(".cecli/logs/chunks.log", "a") as f: print(chunk, file=f) # Check if confirmation is in progress and wait if needed diff --git a/cecli/commands/history_search.py b/cecli/commands/history_search.py index ce6643ffe93..f264b6af9c7 100644 --- a/cecli/commands/history_search.py +++ b/cecli/commands/history_search.py @@ -3,6 +3,7 @@ from cecli.commands.utils.base_command import BaseCommand from cecli.commands.utils.helpers import format_command_result +from cecli.decoding import safe_open from cecli.utils import run_fzf @@ -68,7 +69,7 @@ def parse_input_history_file(cls, file_path: str) -> List[str]: return [] try: - with open(file_path, "r") as f: + with safe_open(file_path, "r") as f: content = f.read() except (OSError, IOError): return [] diff --git a/cecli/commands/terminal_setup.py b/cecli/commands/terminal_setup.py index 5f605852f52..41963d78155 100644 --- a/cecli/commands/terminal_setup.py +++ b/cecli/commands/terminal_setup.py @@ -12,6 +12,7 @@ from cecli.commands.utils.base_command import BaseCommand from cecli.commands.utils.helpers import format_command_result +from cecli.decoding import safe_open class TerminalSetupCommand(BaseCommand): @@ -177,7 +178,7 @@ def _update_alacritty(cls, path, io, dry_run=False): data = { "keyboard": {"bindings": [{"key": "Return", "mods": "Shift", "chars": "\n"}]} } - with open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w", encoding="utf-8") as f: tomlkit.dump(data, f) io.tool_output("Created Alacritty config with shift+enter binding.") return True @@ -189,7 +190,7 @@ def _update_alacritty(cls, path, io, dry_run=False): io.tool_output(f"DRY-RUN: Would check Alacritty config at {path}") io.tool_output(f"DRY-RUN: Would add binding: {new_binding}") try: - with open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r", encoding="utf-8") as f: data = tomlkit.load(f) # Check if binding already exists @@ -222,7 +223,7 @@ def _update_alacritty(cls, path, io, dry_run=False): cls._backup_file(path, io) try: - with open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r", encoding="utf-8") as f: data = tomlkit.load(f) # Ensure keyboard section exists @@ -253,7 +254,7 @@ def _update_alacritty(cls, path, io, dry_run=False): data["keyboard"]["bindings"].append(new_binding) # Write back to file - with open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w", encoding="utf-8") as f: tomlkit.dump(data, f) io.tool_output("Updated Alacritty config.") @@ -280,7 +281,7 @@ def _update_kitty(cls, path, io, dry_run=False): else: io.tool_output(f"Creating Kitty config at {path}") # Create Kitty config with shift+enter binding - with open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w", encoding="utf-8") as f: f.write(cls.KITTY_BINDING) io.tool_output("Created Kitty config with shift+enter binding.") return True @@ -290,7 +291,7 @@ def _update_kitty(cls, path, io, dry_run=False): io.tool_output(f"DRY-RUN: Would append binding:\n{cls.KITTY_BINDING.strip()}") # Simulate checking for duplicates try: - with open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r", encoding="utf-8") as f: content = f.read() if "map shift+enter send_text all \\n" in content: io.tool_output("DRY-RUN: Kitty already configured.") @@ -304,14 +305,14 @@ def _update_kitty(cls, path, io, dry_run=False): cls._backup_file(path, io) - with open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r", encoding="utf-8") as f: content = f.read() if "map shift+enter send_text all \\n" in content: io.tool_output("Kitty already configured.") return False - with open(path, "a", encoding="utf-8") as f: + with safe_open(path, "a", encoding="utf-8") as f: f.write(cls.KITTY_BINDING) io.tool_output("Updated Kitty config.") return True @@ -336,7 +337,7 @@ def _update_konsole(cls, path, io, dry_run=False): return False try: - with open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r", encoding="utf-8") as f: content = f.read() import re @@ -359,7 +360,7 @@ def _update_konsole(cls, path, io, dry_run=False): cls._backup_file(path, io) new_content = re.sub(pattern, new_rule, content, flags=re.MULTILINE) - with open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w", encoding="utf-8") as f: f.write(new_content) io.tool_output("Updated Konsole keytab rule.") return True @@ -369,7 +370,7 @@ def _update_konsole(cls, path, io, dry_run=False): return True cls._backup_file(path, io) - with open(path, "a", encoding="utf-8") as f: + with safe_open(path, "a", encoding="utf-8") as f: f.write(f"\n{new_rule}\n") io.tool_output("Added Konsole Return+Shift rule.") return True @@ -399,7 +400,7 @@ def _update_windows_terminal(cls, path, io, dry_run=False): io.tool_output(f"Creating Windows Terminal config at {path}") # Create minimal Windows Terminal config with shift+enter binding data = {"actions": [cls.WT_ACTION], "keybindings": [cls.WT_KEYBINDING]} - with open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w", encoding="utf-8") as f: json.dump(data, f, indent=4) io.tool_output("Created Windows Terminal config with shift+enter binding.") return True @@ -412,7 +413,7 @@ def _update_windows_terminal(cls, path, io, dry_run=False): ) # Simulate checking for duplicates try: - with open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r", encoding="utf-8") as f: data = json.load(f) # Check if already configured @@ -451,7 +452,7 @@ def _update_windows_terminal(cls, path, io, dry_run=False): return False try: - with open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r", encoding="utf-8") as f: data = json.load(f) # Check if already configured @@ -493,7 +494,7 @@ def _update_windows_terminal(cls, path, io, dry_run=False): cls._backup_file(path, io) - with open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w", encoding="utf-8") as f: json.dump(data, f, indent=4) io.tool_output("Updated Windows Terminal config.") return True @@ -522,7 +523,7 @@ def _update_vscode(cls, path, io, dry_run=False): io.tool_output(f"Creating VS Code keybindings.json at {path}") # Create file with our binding data = [cls.VSCODE_SHIFT_ENTER_BINDING] - with open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w", encoding="utf-8") as f: json.dump(data, f, indent=4) io.tool_output("Created VS Code config with shift+enter binding.") return True @@ -536,7 +537,7 @@ def _update_vscode(cls, path, io, dry_run=False): # Simulate checking for duplicates try: content = "" - with open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r", encoding="utf-8") as f: content = f.read() # Strip comments before parsing @@ -580,7 +581,7 @@ def _update_vscode(cls, path, io, dry_run=False): try: content = "" - with open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r", encoding="utf-8") as f: content = f.read() # Strip comments before parsing @@ -618,7 +619,7 @@ def _update_vscode(cls, path, io, dry_run=False): data.append(cls.VSCODE_SHIFT_ENTER_BINDING) # Write back to file - with open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w", encoding="utf-8") as f: json.dump(data, f, indent=4) io.tool_output("Updated VS Code config.") @@ -647,7 +648,7 @@ def _update_vscode_settings(cls, keybindings_path, io, dry_run=False): try: if settings_path.exists(): content = "" - with open(settings_path, "r", encoding="utf-8") as f: + with safe_open(settings_path, "r", encoding="utf-8") as f: content = f.read() content_no_comments = cls._strip_json_comments(content) @@ -703,7 +704,7 @@ def _update_vscode_settings(cls, keybindings_path, io, dry_run=False): if settings_path.exists(): cls._backup_file(settings_path, io) content = "" - with open(settings_path, "r", encoding="utf-8") as f: + with safe_open(settings_path, "r", encoding="utf-8") as f: content = f.read() # Strip comments before parsing @@ -770,7 +771,7 @@ def _update_vscode_settings(cls, keybindings_path, io, dry_run=False): ] # Write back to file - with open(settings_path, "w", encoding="utf-8") as f: + with safe_open(settings_path, "w", encoding="utf-8") as f: json.dump(data, f, indent=4) io.tool_output("Updated VS Code settings.") diff --git a/cecli/commands/utils/save_load_manager.py b/cecli/commands/utils/save_load_manager.py index 82012f707a4..d704da7db6b 100644 --- a/cecli/commands/utils/save_load_manager.py +++ b/cecli/commands/utils/save_load_manager.py @@ -2,6 +2,8 @@ from pathlib import Path from typing import List +from cecli.decoding import safe_open + class SaveLoadManager: """Manager for saving and loading command files.""" @@ -35,7 +37,7 @@ def save_commands(self, filename: str) -> Path: # Ensure parent directory exists os.makedirs(filepath.parent, exist_ok=True) - with open(filepath, "w", encoding=self.io.encoding) as f: + with safe_open(filepath, "w", encoding=self.io.encoding) as f: f.write("/drop\n") # Write commands to add editable files for fname in sorted(self.coder.abs_fnames): @@ -68,7 +70,7 @@ def load_commands(self, filename: str) -> List[str]: filepath = self.resolve_filepath(filename) try: - with open(filepath, "r", encoding=self.io.encoding, errors="replace") as f: + with safe_open(filepath, "r", encoding=self.io.encoding, errors="replace") as f: commands = f.readlines() return [ cmd.strip() for cmd in commands if cmd.strip() and not cmd.strip().startswith("#") diff --git a/cecli/commands/workspace.py b/cecli/commands/workspace.py index f0fa3dda209..ba53f260fe5 100644 --- a/cecli/commands/workspace.py +++ b/cecli/commands/workspace.py @@ -1,6 +1,7 @@ import subprocess from cecli.commands.utils.base_command import BaseCommand +from cecli.decoding import safe_open class WorkspaceCommand(BaseCommand): @@ -26,7 +27,7 @@ async def execute(cls, io, coder, args, **kwargs): config = {} if metadata_path.exists(): try: - with open(metadata_path, "r") as f: + with safe_open(metadata_path, "r") as f: config = json.load(f) except Exception: pass diff --git a/cecli/decoding.py b/cecli/decoding.py new file mode 100644 index 00000000000..7f4e8c4c1d8 --- /dev/null +++ b/cecli/decoding.py @@ -0,0 +1,115 @@ +""" +Encoding-aware file operations with automatic encoding detection for reading +and configurable encoding for writing. + +Provides safe_open() as a drop-in replacement for built-in open() that handles +encoding intelligently on reads, smart_read() for direct file reading with +fallback encoding detection via charset_normalizer, and safe_write() for +writing files with a configurable default encoding. + +The module-level DEFAULT_ENCODING variable can be overridden at runtime +(e.g., from main.py) to set the preferred encoding for write operations. +""" + +import charset_normalizer + +# Global encoding setting used by safe_open() and safe_write() for write +# operations. Can be overridden at runtime from main.py or elsewhere. +DEFAULT_ENCODING = "utf-8" + + +def smart_read(filepath): + """ + Read a text file, automatically detecting the encoding if not UTF-8. + + Attempts a fast UTF-8 decode first using Python's optimized native + decoder. Falls back to charset_normalizer for legacy encodings (e.g. + GBK, Latin-1, Shift-JIS) when a UnicodeDecodeError is raised. + + Args: + filepath: Path to the file to read. + + Returns: + The file contents as a string. + + Raises: + ValueError: If the encoding cannot be determined. + FileNotFoundError: If the file does not exist. + """ + try: + # FAST PATH: Try standard UTF-8 first using Python's optimized + # native decoder — this handles the vast majority of modern files. + with open(filepath, "r", encoding="utf-8") as f: + return f.read() + + except UnicodeDecodeError: + # SLOW PATH: A decode error means this is likely a legacy encoding. + # Let the library read the raw bytes and guess the correct encoding. + results = charset_normalizer.from_path(filepath) + match = results.best() + + if match is None: + raise ValueError(f"Could not determine text encoding for {filepath}") + + return str(match) + + +def safe_write(filepath, content, encoding=None): + """ + Write string content to a file using the specified or default encoding. + + Args: + filepath: Path to the file to write. + content: The string content to write. + encoding: Encoding to use. Defaults to the module-level + DEFAULT_ENCODING if not provided. + + Returns: + The content that was written (for convenience / chaining). + """ + if encoding is None: + encoding = DEFAULT_ENCODING + + with open(filepath, "w", encoding=encoding) as f: + f.write(content) + + return content + + +def safe_open(filepath, mode="r", encoding=None, **kwargs): + """ + Open a file with intelligent encoding handling. + """ + # Binary modes — pass through to built-in open() unchanged. + if "b" in mode: + return open(filepath, mode, **kwargs) + + # If the user explicitly provided an encoding, respect it unconditionally. + if encoding is not None: + return open(filepath, mode, encoding=encoding, **kwargs) + + # Write / append modes (with no explicit encoding) — use DEFAULT_ENCODING. + # Note: We don't check for "r+" here because if a file is being read, + # we must detect its existing encoding first so we don't corrupt it. + if "w" in mode or "a" in mode or "x" in mode: + return open(filepath, mode, encoding=DEFAULT_ENCODING, **kwargs) + + # Read modes (and read/write "r+" modes) — Auto-detect the encoding. + try: + # FAST PATH: Try UTF-8 first by opening and reading a tiny chunk + with open(filepath, mode, encoding="utf-8", **kwargs) as f: + f.read(1) # Test if it raises a DecodeError + + # If we got here, UTF-8 is valid. Return a fresh file object. + return open(filepath, mode, encoding="utf-8", **kwargs) + + except UnicodeDecodeError: + # SLOW PATH: Detect encoding using charset_normalizer + results = charset_normalizer.from_path(filepath) + match = results.best() + + if match is None: + raise ValueError(f"Could not determine text encoding for {filepath}") + + # Return a real file object using the detected encoding + return open(filepath, mode, encoding=match.encoding, **kwargs) diff --git a/cecli/diffs.py b/cecli/diffs.py index 709810452a0..f203064ddaf 100644 --- a/cecli/diffs.py +++ b/cecli/diffs.py @@ -1,6 +1,8 @@ import difflib import sys +from cecli.decoding import safe_open + from .dump import dump # noqa: F401 @@ -11,10 +13,10 @@ def main(): file_orig, file_updated = sys.argv[1], sys.argv[2] - with open(file_orig, "r", encoding="utf-8") as f: + with safe_open(file_orig, "r", encoding="utf-8") as f: lines_orig = f.readlines() - with open(file_updated, "r", encoding="utf-8") as f: + with safe_open(file_updated, "r", encoding="utf-8") as f: lines_updated = f.readlines() for i in range(len(file_updated)): diff --git a/cecli/editor.py b/cecli/editor.py index 711254099d4..cc990fd8a7e 100644 --- a/cecli/editor.py +++ b/cecli/editor.py @@ -15,6 +15,7 @@ from rich.console import Console +from cecli.decoding import safe_open from cecli.dump import dump # noqa DEFAULT_EDITOR_NIX = "vi" @@ -132,7 +133,7 @@ def pipe_editor(input_data="", suffix=None, editor=None): command_str += " " + filepath subprocess.call(command_str, shell=True) - with open(filepath, "r") as f: + with safe_open(filepath, "r") as f: output_data = f.read() try: os.remove(filepath) diff --git a/cecli/helpers/agents/config.py b/cecli/helpers/agents/config.py index 16cbff4dc0f..1a90f7cd6fe 100644 --- a/cecli/helpers/agents/config.py +++ b/cecli/helpers/agents/config.py @@ -10,6 +10,8 @@ import yaml +from cecli.decoding import safe_open + @dataclass class SubAgentConfig: @@ -49,7 +51,7 @@ def parse_subagent_file(file_path: str) -> Optional[SubAgentConfig]: """ try: - with open(file_path, "r", encoding="utf-8") as f: + with safe_open(file_path, "r", encoding="utf-8") as f: content = f.read() except (FileNotFoundError, IOError, OSError) as e: raise ValueError(f"Cannot read file '{file_path}': {e}") diff --git a/cecli/helpers/background_commands.py b/cecli/helpers/background_commands.py index 83fe53968cd..7e21687d194 100644 --- a/cecli/helpers/background_commands.py +++ b/cecli/helpers/background_commands.py @@ -12,6 +12,8 @@ from collections import deque from typing import Dict, List, Optional, Tuple +from cecli.decoding import safe_open + try: import pty import termios @@ -783,7 +785,7 @@ def save_paginated_output( filename = f"{page_num}.txt" abs_path = os.path.join(abs_folder, filename) page_content = output[i * page_size : (i + 1) * page_size] - with open(abs_path, "w") as f: + with safe_open(abs_path, "w") as f: f.write(page_content) file_paths = [f"{folder_path}/{page_num}.txt" for page_num in range(1, num_pages + 1)] diff --git a/cecli/helpers/config_utils.py b/cecli/helpers/config_utils.py index 25305153d5f..2f2a93eb33c 100644 --- a/cecli/helpers/config_utils.py +++ b/cecli/helpers/config_utils.py @@ -6,6 +6,8 @@ import yaml +from cecli.decoding import safe_open + def load_and_apply_cecli_conf_files( cecli_conf_yml_files: List[str], args: Any, parser: Any @@ -23,7 +25,7 @@ def load_and_apply_cecli_conf_files( for config_file in existing_cecli_conf: try: - with open(config_file, "r", encoding="utf-8") as f: + with safe_open(config_file, "r", encoding="utf-8") as f: config_data = yaml.safe_load(f) if isinstance(config_data, dict): @@ -199,7 +201,7 @@ def read_and_merge_all_configs( for path in all_config_paths: if os.path.exists(path): try: - with open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r", encoding="utf-8") as f: data = yaml.safe_load(f) if isinstance(data, dict): diff --git a/cecli/helpers/conversation/manager.py b/cecli/helpers/conversation/manager.py index 3337d0b8949..ed7e644cda6 100644 --- a/cecli/helpers/conversation/manager.py +++ b/cecli/helpers/conversation/manager.py @@ -4,6 +4,7 @@ import weakref from typing import Any, Dict, List, Optional, Tuple, Union +from cecli.decoding import safe_open from cecli.helpers import nested from .base_message import BaseMessage @@ -354,7 +355,7 @@ def get_messages_dict( import os os.makedirs(".cecli/logs", exist_ok=True) - with open(".cecli/logs/conversation.log", "w") as f: + with safe_open(".cecli/logs/conversation.log", "w") as f: json.dump(messages_dict, f, indent=4, default=lambda o: "") # Add cache control headers when getting all messages (for LLM consumption) diff --git a/cecli/helpers/file_system/ignore.py b/cecli/helpers/file_system/ignore.py index 4d9afa40973..fb6f1209d8d 100644 --- a/cecli/helpers/file_system/ignore.py +++ b/cecli/helpers/file_system/ignore.py @@ -9,6 +9,8 @@ import pathspec +from cecli.decoding import safe_open + # Directories to always ignore (common noise sources) DEFAULT_IGNORE_DIRS = frozenset( { @@ -59,7 +61,7 @@ class FileIgnoreFilter: def __init__(self, cecli_ignore_path: str | None = None): self.cecli_ignore_spec = None if cecli_ignore_path and Path(cecli_ignore_path).is_file(): - with open(cecli_ignore_path) as f: + with safe_open(cecli_ignore_path) as f: self.cecli_ignore_spec = pathspec.PathSpec.from_lines( pathspec.patterns.GitWildMatchPattern, f ) diff --git a/cecli/helpers/file_system/service.py b/cecli/helpers/file_system/service.py index 478f683ad47..2f5e71beaef 100644 --- a/cecli/helpers/file_system/service.py +++ b/cecli/helpers/file_system/service.py @@ -12,6 +12,8 @@ import os +from cecli.decoding import safe_open + from .builders import GitBuilder, ScandirBuilder from .ignore import FileIgnoreFilter from .ngram_index import TrigramIndex @@ -276,7 +278,7 @@ def save(self, path: str) -> None: "build_hash": self._build_hash, "file_count": self.count(), } - with open(meta_path, "w") as f: + with safe_open(meta_path, "w") as f: json.dump(meta, f) def load(self, path: str) -> bool: @@ -294,7 +296,7 @@ def load(self, path: str) -> bool: try: # Load metadata - with open(meta_path) as f: + with safe_open(meta_path) as f: meta = json.load(f) self.root = meta["root"] diff --git a/cecli/helpers/grep_ast/main.py b/cecli/helpers/grep_ast/main.py index bcf187304d5..7d421045178 100644 --- a/cecli/helpers/grep_ast/main.py +++ b/cecli/helpers/grep_ast/main.py @@ -7,6 +7,8 @@ import pathspec +from cecli.decoding import safe_open + from .dump import dump # noqa: F401 from .grep_ast import TreeContext from .parsers import PARSERS @@ -79,7 +81,7 @@ def enumerate_files(fnames, spec, use_spec=False): def process_filename(filename, args): try: - with open(filename, "r", encoding=args.encoding) as file: + with safe_open(filename, "r", encoding=args.encoding) as file: code = file.read() except UnicodeDecodeError: return diff --git a/cecli/helpers/lock_detect.py b/cecli/helpers/lock_detect.py index 6eecd852c44..561b74eb21c 100644 --- a/cecli/helpers/lock_detect.py +++ b/cecli/helpers/lock_detect.py @@ -4,6 +4,8 @@ import time import traceback +from cecli.decoding import safe_open + # Set up logging to catch asyncio framework logs logging.basicConfig(level=logging.INFO) logging.getLogger("asyncio").setLevel(logging.DEBUG) @@ -19,7 +21,7 @@ def dump_stacks_to_file(filename="hang_dump.log", interval=5, max_prints=10): # Determine mode: "w" to overwrite/clear on the 11th print, "a" to append mode = "w" if print_count >= max_prints else "a" - with open(filename, mode, encoding="utf-8") as f: + with safe_open(filename, mode, encoding="utf-8") as f: if mode == "w": f.write(f"--- Log reset automatically after {max_prints} prints ---\n") print_count = 0 # Reset the counter diff --git a/cecli/helpers/monorepo/config.py b/cecli/helpers/monorepo/config.py index 281fe33c1b8..6fb4fdb29c2 100644 --- a/cecli/helpers/monorepo/config.py +++ b/cecli/helpers/monorepo/config.py @@ -4,6 +4,8 @@ import yaml +from cecli.decoding import safe_open + def resolve_workspace_config(config_arg: Optional[str] = None) -> Optional[Any]: """ @@ -39,7 +41,7 @@ def resolve_workspace_config(config_arg: Optional[str] = None) -> Optional[Any]: local_path = Path(local_name) if local_path.exists(): try: - with open(local_path, "r") as f: + with safe_open(local_path, "r") as f: loaded = yaml.safe_load(f) if loaded: workspace_conf = ( @@ -56,7 +58,7 @@ def resolve_workspace_config(config_arg: Optional[str] = None) -> Optional[Any]: global_path = Path.home() / ".cecli" / global_name if global_path.exists(): try: - with open(global_path, "r") as f: + with safe_open(global_path, "r") as f: loaded = yaml.safe_load(f) if loaded: workspace_conf = ( diff --git a/cecli/helpers/monorepo/workspace.py b/cecli/helpers/monorepo/workspace.py index 0482ff0d220..8011057c74b 100644 --- a/cecli/helpers/monorepo/workspace.py +++ b/cecli/helpers/monorepo/workspace.py @@ -2,6 +2,7 @@ from pathlib import Path from typing import Any, Dict +from cecli.decoding import safe_open from cecli.helpers.monorepo.project import Project @@ -39,7 +40,7 @@ def initialize(self) -> None: import json metadata_path = self.path / ".cecli-workspace.json" - with open(metadata_path, "w") as f: + with safe_open(metadata_path, "w") as f: json.dump(self.config, f, indent=2) def get_working_directory(self) -> Path: diff --git a/cecli/history.py b/cecli/history.py index df38797f331..abf2b1eb103 100644 --- a/cecli/history.py +++ b/cecli/history.py @@ -2,6 +2,7 @@ import cecli.prompts.utils.system as prompts from cecli import models +from cecli.decoding import safe_open from cecli.dump import dump # noqa: F401 @@ -160,7 +161,7 @@ def main(): model_list = [models.Model(name) for name in model_names] summarizer = ChatSummary(model_list) - with open(args.filename, "r") as f: + with safe_open(args.filename, "r") as f: text = f.read() summary = summarizer.summarize_chat_history_markdown(text) diff --git a/cecli/hooks/registry.py b/cecli/hooks/registry.py index cff8dfab3da..af547d1091a 100644 --- a/cecli/hooks/registry.py +++ b/cecli/hooks/registry.py @@ -5,6 +5,7 @@ import yaml +from cecli.decoding import safe_open from cecli.helpers.plugin_manager import load_module from .base import BaseHook, CommandHook @@ -112,7 +113,7 @@ def load_hooks_from_config(self, config_file: Path) -> List[str]: return [] try: - with open(config_file, "r") as f: + with safe_open(config_file, "r") as f: config = yaml.safe_load(f) except (yaml.YAMLError, IOError) as e: print(f"Warning: Could not load hook config from {config_file}: {e}") diff --git a/cecli/io.py b/cecli/io.py index 89e02462773..2eeb0b1f78e 100644 --- a/cecli/io.py +++ b/cecli/io.py @@ -41,6 +41,7 @@ from rich.text import Text from cecli.commands import SwitchCoderSignal +from cecli.decoding import safe_open from cecli.helpers import coroutines from cecli.helpers.threading import ThreadSafeEvent from cecli.report import update_error_prefix @@ -199,7 +200,7 @@ def tokenize(self): for fname in process_fnames: try: - with open(fname, "r", encoding=self.encoding) as f: + with safe_open(fname, "r", encoding=self.encoding) as f: content = f.read() except (FileNotFoundError, UnicodeDecodeError, IsADirectoryError): continue @@ -760,7 +761,7 @@ def write_text(self, filename, content, max_retries=5, initial_delay=0.1): delay = initial_delay for attempt in range(max_retries): try: - with open(str(filename), "w", encoding=self.encoding, newline=newline) as f: + with safe_open(str(filename), "w", encoding=self.encoding, newline=newline) as f: f.write(content) return # Successfully wrote the file except PermissionError as err: @@ -1224,7 +1225,7 @@ def edit_in_editor(self, content): editor = os.environ.get("EDITOR", "vi") subprocess.call([editor, tmpfile.name]) - with open(tmpfile.name, "r", encoding=self.encoding) as f: + with safe_open(tmpfile.name, "r", encoding=self.encoding) as f: edited = f.read() os.unlink(tmpfile.name) diff --git a/cecli/main.py b/cecli/main.py index 81dfdbbcba8..09e4e4739d9 100644 --- a/cecli/main.py +++ b/cecli/main.py @@ -106,11 +106,13 @@ def convert_yaml_to_json_string(value): def check_config_files_for_yes(config_files): + from cecli.decoding import safe_open + found = False for config_file in config_files: if Path(config_file).exists(): try: - with open(config_file, "r") as f: + with safe_open(config_file, "r") as f: for line in f: if line.strip().startswith("yes:"): print("Configuration error detected.") @@ -565,6 +567,7 @@ async def main_async( from cecli.coders import Coder from cecli.coders.base_coder import UnknownEditFormat from cecli.commands import Commands, ReloadProgramSignal, SwitchCoderSignal + from cecli.decoding import DEFAULT_ENCODING, safe_open # noqa from cecli.deprecated_args import handle_deprecated_model_args from cecli.format_settings import format_settings, scrub_sensitive_info from cecli.helpers import config_utils @@ -627,7 +630,7 @@ async def main_async( _tmp_fd, _tmp_cfg = tempfile.mkstemp(suffix=".yml", prefix="cecli_merged_") os.close(_tmp_fd) - with open(_tmp_cfg, "w") as f: + with safe_open(_tmp_cfg, "w") as f: yaml.dump(merged_config, f) parser = get_parser([_tmp_cfg], git_root) @@ -680,7 +683,7 @@ async def main_async( _tmp_fd, _tmp_cfg = tempfile.mkstemp(suffix=".yml", prefix="cecli_merged_") os.close(_tmp_fd) - with open(_tmp_cfg, "w") as f: + with safe_open(_tmp_cfg, "w") as f: yaml.dump(merged_config, f) parser = get_parser([_tmp_cfg], git_root) @@ -693,6 +696,9 @@ async def main_async( set_args_error_data(args) + # Override the module-level default encoding with the resolved config value + DEFAULT_ENCODING = args.encoding # noqa + # ── Normalize array fields ───────────────────────────────────────── # (previously done inside load_and_apply_cecli_conf_files) for key in DEEP_MERGE_LIST_FIELDS: @@ -1556,6 +1562,7 @@ def get_io(pretty): def is_first_run_of_new_version(io, verbose=False): """Check if this is the first run of a new version/executable combination""" from cecli import __version__ + from cecli.decoding import safe_open from cecli.helpers.file_searcher import handle_core_files installs_file = handle_core_files(Path.home() / ".cecli" / "installs.json") @@ -1569,7 +1576,7 @@ def is_first_run_of_new_version(io, verbose=False): io.tool_output(f"Installs file: {installs_file}") try: if installs_file.exists(): - with open(installs_file, "r") as f: + with safe_open(installs_file, "r") as f: installs = json.load(f) if verbose: io.tool_output("Installs file exists and loaded") @@ -1581,7 +1588,7 @@ def is_first_run_of_new_version(io, verbose=False): if is_first_run: installs[str(key)] = True installs_file.parent.mkdir(parents=True, exist_ok=True) - with open(installs_file, "w") as f: + with safe_open(installs_file, "w") as f: json.dump(installs, f, indent=4) return is_first_run except Exception as e: diff --git a/cecli/mcp/oauth.py b/cecli/mcp/oauth.py index 82611c61462..50df4b83d08 100644 --- a/cecli/mcp/oauth.py +++ b/cecli/mcp/oauth.py @@ -12,6 +12,8 @@ from mcp.client.auth import TokenStorage from mcp.shared.auth import OAuthClientInformationFull, OAuthToken +from cecli.decoding import safe_open + def create_oauth_callback_server( port, path="/callback" @@ -137,7 +139,7 @@ def load_mcp_oauth_tokens(): return {} try: - with open(token_file, "r", encoding="utf-8") as f: + with safe_open(token_file, "r", encoding="utf-8") as f: # File might be empty return json.load(f) or {} except Exception: @@ -151,7 +153,7 @@ def save_mcp_oauth_token(server_name, token_data): token_file = get_token_file_path() try: - with open(token_file, "w", encoding="utf-8") as f: + with safe_open(token_file, "w", encoding="utf-8") as f: json.dump(tokens, f, indent=2) # Set restrictive permissions (owner read/write only) os.chmod(token_file, 0o600) @@ -163,7 +165,7 @@ def save_mcp_oauth_tokens(tokens_dict): """Save all OAuth tokens to file.""" token_file = get_token_file_path() try: - with open(token_file, "w", encoding="utf-8") as f: + with safe_open(token_file, "w", encoding="utf-8") as f: json.dump(tokens_dict, f, indent=2) # Set restrictive permissions (owner read/write only) os.chmod(token_file, 0o600) diff --git a/cecli/mcp/server.py b/cecli/mcp/server.py index da3a4f40bfb..79eda91176f 100644 --- a/cecli/mcp/server.py +++ b/cecli/mcp/server.py @@ -15,6 +15,8 @@ from mcp.client.streamable_http import streamable_http_client from mcp.shared.auth import OAuthClientMetadata +from cecli.decoding import safe_open + from .oauth import ( FileBasedTokenStorage, create_oauth_callback_server, @@ -103,7 +105,7 @@ async def connect(self): try: os.makedirs(".cecli/logs/", exist_ok=True) - with open(".cecli/logs/mcp-errors.log", "w") as err_file: + with safe_open(".cecli/logs/mcp-errors.log", "w") as err_file: stdio_transport = await self.exit_stack.enter_async_context( stdio_client(server_params, errlog=err_file) ) diff --git a/cecli/mcp/utils.py b/cecli/mcp/utils.py index fe150a98cbe..977f67c3d7b 100644 --- a/cecli/mcp/utils.py +++ b/cecli/mcp/utils.py @@ -5,6 +5,8 @@ import socketserver from pathlib import Path +from cecli.decoding import safe_open + from .server import McpServer @@ -132,7 +134,7 @@ def _parse_mcp_servers_from_file(file_path, io, verbose=False, mcp_transport="st resolved_file_path = _resolve_mcp_config_path(file_path, io, verbose) try: - with open(resolved_file_path, "r") as f: + with safe_open(resolved_file_path, "r") as f: json_string = f.read() if verbose: diff --git a/cecli/mdstream.py b/cecli/mdstream.py index 679ab2c2254..2bc0cbc4a63 100755 --- a/cecli/mdstream.py +++ b/cecli/mdstream.py @@ -11,6 +11,7 @@ from rich.syntax import Syntax from rich.text import Text +from cecli.decoding import safe_open from cecli.dump import dump # noqa: F401 _text_prefix = """ @@ -229,7 +230,7 @@ def find_minimal_suffix(self, text, match_lines=50): if __name__ == "__main__": - with open("cecli/io.py", "r") as f: + with safe_open("cecli/io.py", "r") as f: code = f.read() _text = _text_prefix + code + _text_suffix _text = _text * 10 diff --git a/cecli/models.py b/cecli/models.py index 77f52c88827..3e302a1ec7b 100644 --- a/cecli/models.py +++ b/cecli/models.py @@ -13,6 +13,7 @@ from PIL import Image from cecli import __version__ +from cecli.decoding import safe_open from cecli.dump import dump from cecli.exceptions import LiteLLMExceptions from cecli.helpers import coroutines, nested @@ -383,7 +384,7 @@ def load_from_file(cls, git_root, model_overrides_fname, io, verbose=False): for fname in model_overrides_files: try: if Path(fname).exists(): - with open(fname, "r") as f: + with safe_open(fname, "r") as f: content = yaml.safe_load(f) if content: for model_name, tags in content.items(): @@ -1530,7 +1531,7 @@ def _log_messages(self, messages, name="message"): Log conversation messages to a JSON file. """ os.makedirs(".cecli/logs/messages", exist_ok=True) - with open(f".cecli/logs/messages/{name}-{time.time()}.log", "w") as f: + with safe_open(f".cecli/logs/messages/{name}-{time.time()}.log", "w") as f: json.dump( messages, f, indent=4, ensure_ascii=False, default=lambda o: "" ) @@ -1542,7 +1543,7 @@ def _log_request(self, model_call_dict): os.makedirs(".cecli/logs/litellm", exist_ok=True) log_file_path = f".cecli/logs/litellm/request-{time.time()}.log" - with open(log_file_path, "a", encoding="utf-8") as f: + with safe_open(log_file_path, "a", encoding="utf-8") as f: json.dump( model_call_dict, f, @@ -1561,7 +1562,7 @@ def register_models(model_settings_fnames): if not Path(model_settings_fname).read_text().strip(): continue try: - with open(model_settings_fname, "r") as model_settings_file: + with safe_open(model_settings_fname, "r") as model_settings_file: model_settings_list = yaml.safe_load(model_settings_file) for model_settings_dict in model_settings_list: model_settings = ModelSettings(**model_settings_dict) diff --git a/cecli/onboarding.py b/cecli/onboarding.py index dbe0ae48e0c..cb44de8fb48 100644 --- a/cecli/onboarding.py +++ b/cecli/onboarding.py @@ -9,6 +9,7 @@ import requests from cecli import urls +from cecli.decoding import safe_open from cecli.io import InputOutput from cecli.mcp import find_available_port, generate_pkce_codes @@ -261,7 +262,7 @@ def run_server(): config_dir = os.path.expanduser("~/.cecli") os.makedirs(config_dir, exist_ok=True) key_file = os.path.join(config_dir, "oauth-keys.env") - with open(key_file, "a", encoding="utf-8") as f: + with safe_open(key_file, "a", encoding="utf-8") as f: f.write(f'OPENROUTER_API_KEY="{api_key}"\n') io.tool_warning("cecli will load the OpenRouter key automatically in future sessions.") io.tool_output() diff --git a/cecli/prompts/utils/registry.py b/cecli/prompts/utils/registry.py index e44a8a71fcc..98c4f081759 100644 --- a/cecli/prompts/utils/registry.py +++ b/cecli/prompts/utils/registry.py @@ -15,6 +15,8 @@ import importlib_resources import yaml +from cecli.decoding import safe_open + class PromptObject: def __init__(self, prompts_dict): @@ -48,7 +50,7 @@ def _load_yaml_file(file_name: str) -> Dict[str, Any]: file_path = os.path.abspath(file_name) if os.path.exists(file_path): - with open(file_path, "r", encoding="utf-8") as f: + with safe_open(file_path, "r", encoding="utf-8") as f: file_content = f.read() return yaml.safe_load(file_content) or {} else: diff --git a/cecli/repo.py b/cecli/repo.py index d0170d762a9..7d052f58cc1 100644 --- a/cecli/repo.py +++ b/cecli/repo.py @@ -24,6 +24,7 @@ import cecli.prompts.utils.system as prompts from cecli import utils +from cecli.decoding import safe_open from .dump import dump # noqa: F401 @@ -778,7 +779,7 @@ def get_workspace_files(self): return self.get_tracked_files() try: - with open(metadata_path, "r") as f: + with safe_open(metadata_path, "r") as f: config = json.load(f) except Exception: return self.get_tracked_files() @@ -903,7 +904,7 @@ def _get_gitignore_spec(self, dir_path): gitignore_path = dir_path / ".gitignore" if gitignore_path.is_file(): try: - with open(gitignore_path, "r") as f: + with safe_open(gitignore_path, "r") as f: patterns = [ line.rstrip("\n") for line in f if line.strip() and not line.startswith("#") ] diff --git a/cecli/sessions.py b/cecli/sessions.py index 969bb816638..fd84871523e 100644 --- a/cecli/sessions.py +++ b/cecli/sessions.py @@ -6,6 +6,7 @@ from typing import Dict, List, Optional from cecli import models +from cecli.decoding import safe_open from cecli.helpers import crypto as session_crypto from cecli.helpers.conversation import ConversationService, MessageTag @@ -202,7 +203,7 @@ def _write_session_file(self, session_file: Path, session_data: dict) -> bool: return False session_file.write_bytes(session_crypto.encrypt_session_dict(session_data, key)) else: - with open(session_file, "w", encoding="utf-8") as f: + with safe_open(session_file, "w", encoding="utf-8") as f: json.dump(session_data, f, indent=2) return True except session_crypto.SessionCryptoError as e: diff --git a/cecli/tools/resource_manager.py b/cecli/tools/resource_manager.py index a507601cc1b..7ff6ed0d656 100644 --- a/cecli/tools/resource_manager.py +++ b/cecli/tools/resource_manager.py @@ -7,6 +7,7 @@ iter_all_coders, update_server_registration, ) +from cecli.decoding import safe_open from cecli.helpers.background_commands import BackgroundCommandManager from cecli.tools.utils.base_tool import BaseTool from cecli.tools.utils.helpers import ToolError, parse_arg_as_list @@ -410,7 +411,7 @@ def _create(cls, coder, file_path): os.makedirs(os.path.dirname(abs_path), exist_ok=True) # Create an empty file - with open(abs_path, "w", encoding="utf-8"): + with safe_open(abs_path, "w", encoding="utf-8"): pass # Add the file to editable context diff --git a/cecli/tui/app.py b/cecli/tui/app.py index 9471ee81596..0686a135e75 100644 --- a/cecli/tui/app.py +++ b/cecli/tui/app.py @@ -16,6 +16,7 @@ from textual.theme import Theme from cecli import __version__ +from cecli.decoding import safe_open from cecli.editor import pipe_editor from cecli.helpers import queues from cecli.helpers.agents.service import AgentService @@ -1405,7 +1406,7 @@ def _extract_symbols(self) -> set[str]: for fname in files_to_process: try: - with open(fname, "r", encoding="utf-8", errors="ignore") as f: + with safe_open(fname, "r", encoding="utf-8", errors="ignore") as f: content = f.read() lexer = guess_lexer_for_filename(fname, content) diff --git a/cecli/watch.py b/cecli/watch.py index e4c508cd8a9..068253d17c2 100644 --- a/cecli/watch.py +++ b/cecli/watch.py @@ -6,6 +6,7 @@ from pathspec import PathSpec from pathspec.patterns import GitWildMatchPattern +from cecli.decoding import safe_open from cecli.dump import dump # noqa from cecli.watch_prompts import watch_ask_prompt, watch_code_prompt @@ -55,7 +56,7 @@ def load_gitignores(gitignore_paths: list[Path]) -> Optional[PathSpec]: for path in gitignore_paths: if path.exists(): try: - with open(path, "r", encoding="utf-8", errors="ignore") as f: + with safe_open(path, "r", encoding="utf-8", errors="ignore") as f: patterns.extend(f.readlines()) except Exception: pass # Ignore files that can't be read diff --git a/requirements.txt b/requirements.txt index 4d1c6569201..58e6b26c294 100644 --- a/requirements.txt +++ b/requirements.txt @@ -51,9 +51,10 @@ cffi==2.0.0 # cryptography # sounddevice # soundfile -charset-normalizer==3.4.4 +charset-normalizer==3.4.9 # via # -c requirements/common-constraints.txt + # -r requirements/requirements.in # requests click==8.3.1 # via diff --git a/requirements/common-constraints.txt b/requirements/common-constraints.txt index d3109f02ed9..306a605a58a 100644 --- a/requirements/common-constraints.txt +++ b/requirements/common-constraints.txt @@ -46,8 +46,10 @@ cffi==2.0.0 # soundfile cfgv==3.5.0 # via pre-commit -charset-normalizer==3.4.4 - # via requests +charset-normalizer==3.4.9 + # via + # -r requirements/requirements.in + # requests click==8.3.1 # via # litellm diff --git a/requirements/requirements-help.txt b/requirements/requirements-help.txt index 193ed2fdd07..9ecb75a35f5 100644 --- a/requirements/requirements-help.txt +++ b/requirements/requirements-help.txt @@ -39,7 +39,7 @@ certifi==2025.11.12 # httpcore # httpx # requests -charset-normalizer==3.4.4 +charset-normalizer==3.4.9 # via # -c requirements/common-constraints.txt # requests diff --git a/requirements/requirements.in b/requirements/requirements.in index dfd06d8a2fb..c69f47393a0 100644 --- a/requirements/requirements.in +++ b/requirements/requirements.in @@ -7,7 +7,7 @@ oslex>=0.1.3 pexpect>=4.9.0 psutil>=7.0.0 watchfiles>=1.1.0 - +charset-normalizer>=3.4.7 # git GitPython>=3.1.45 pathspec>=0.12.1 From a3ea98313a8a2d985be638c87cea17911d85ee7f Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 18:52:11 -0400 Subject: [PATCH 08/15] Remove overriding encodings globally --- cecli/coders/base_coder.py | 2 +- cecli/commands/terminal_setup.py | 44 +++++++++++------------ cecli/commands/utils/save_load_manager.py | 4 +-- cecli/diffs.py | 4 +-- cecli/helpers/agents/config.py | 2 +- cecli/helpers/config_utils.py | 4 +-- cecli/helpers/file_system/service.py | 4 +-- cecli/helpers/grep_ast/main.py | 2 +- cecli/helpers/lock_detect.py | 2 +- cecli/io.py | 12 +++---- cecli/mcp/oauth.py | 6 ++-- cecli/models.py | 2 +- cecli/onboarding.py | 2 +- cecli/prompts/utils/registry.py | 2 +- cecli/sessions.py | 2 +- cecli/tools/resource_manager.py | 2 +- cecli/tui/app.py | 2 +- cecli/voice.py | 4 ++- cecli/watch.py | 2 +- 19 files changed, 53 insertions(+), 51 deletions(-) diff --git a/cecli/coders/base_coder.py b/cecli/coders/base_coder.py index 82668419f3e..48c51e03801 100755 --- a/cecli/coders/base_coder.py +++ b/cecli/coders/base_coder.py @@ -1430,7 +1430,7 @@ def get_images_message(self, fnames): if not mime_type: continue - with open(fname, "rb") as image_file: + with safe_open(fname, "rb") as image_file: encoded_string = base64.b64encode(image_file.read()).decode("utf-8") image_url = f"data:{mime_type};base64,{encoded_string}" rel_fname = self.get_rel_fname(fname) diff --git a/cecli/commands/terminal_setup.py b/cecli/commands/terminal_setup.py index 41963d78155..bfd6a94a767 100644 --- a/cecli/commands/terminal_setup.py +++ b/cecli/commands/terminal_setup.py @@ -178,7 +178,7 @@ def _update_alacritty(cls, path, io, dry_run=False): data = { "keyboard": {"bindings": [{"key": "Return", "mods": "Shift", "chars": "\n"}]} } - with safe_open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w") as f: tomlkit.dump(data, f) io.tool_output("Created Alacritty config with shift+enter binding.") return True @@ -190,7 +190,7 @@ def _update_alacritty(cls, path, io, dry_run=False): io.tool_output(f"DRY-RUN: Would check Alacritty config at {path}") io.tool_output(f"DRY-RUN: Would add binding: {new_binding}") try: - with safe_open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r") as f: data = tomlkit.load(f) # Check if binding already exists @@ -223,7 +223,7 @@ def _update_alacritty(cls, path, io, dry_run=False): cls._backup_file(path, io) try: - with safe_open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r") as f: data = tomlkit.load(f) # Ensure keyboard section exists @@ -254,7 +254,7 @@ def _update_alacritty(cls, path, io, dry_run=False): data["keyboard"]["bindings"].append(new_binding) # Write back to file - with safe_open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w") as f: tomlkit.dump(data, f) io.tool_output("Updated Alacritty config.") @@ -281,7 +281,7 @@ def _update_kitty(cls, path, io, dry_run=False): else: io.tool_output(f"Creating Kitty config at {path}") # Create Kitty config with shift+enter binding - with safe_open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w") as f: f.write(cls.KITTY_BINDING) io.tool_output("Created Kitty config with shift+enter binding.") return True @@ -291,7 +291,7 @@ def _update_kitty(cls, path, io, dry_run=False): io.tool_output(f"DRY-RUN: Would append binding:\n{cls.KITTY_BINDING.strip()}") # Simulate checking for duplicates try: - with safe_open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r") as f: content = f.read() if "map shift+enter send_text all \\n" in content: io.tool_output("DRY-RUN: Kitty already configured.") @@ -305,14 +305,14 @@ def _update_kitty(cls, path, io, dry_run=False): cls._backup_file(path, io) - with safe_open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r") as f: content = f.read() if "map shift+enter send_text all \\n" in content: io.tool_output("Kitty already configured.") return False - with safe_open(path, "a", encoding="utf-8") as f: + with safe_open(path, "a") as f: f.write(cls.KITTY_BINDING) io.tool_output("Updated Kitty config.") return True @@ -337,7 +337,7 @@ def _update_konsole(cls, path, io, dry_run=False): return False try: - with safe_open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r") as f: content = f.read() import re @@ -360,7 +360,7 @@ def _update_konsole(cls, path, io, dry_run=False): cls._backup_file(path, io) new_content = re.sub(pattern, new_rule, content, flags=re.MULTILINE) - with safe_open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w") as f: f.write(new_content) io.tool_output("Updated Konsole keytab rule.") return True @@ -370,7 +370,7 @@ def _update_konsole(cls, path, io, dry_run=False): return True cls._backup_file(path, io) - with safe_open(path, "a", encoding="utf-8") as f: + with safe_open(path, "a") as f: f.write(f"\n{new_rule}\n") io.tool_output("Added Konsole Return+Shift rule.") return True @@ -400,7 +400,7 @@ def _update_windows_terminal(cls, path, io, dry_run=False): io.tool_output(f"Creating Windows Terminal config at {path}") # Create minimal Windows Terminal config with shift+enter binding data = {"actions": [cls.WT_ACTION], "keybindings": [cls.WT_KEYBINDING]} - with safe_open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w") as f: json.dump(data, f, indent=4) io.tool_output("Created Windows Terminal config with shift+enter binding.") return True @@ -413,7 +413,7 @@ def _update_windows_terminal(cls, path, io, dry_run=False): ) # Simulate checking for duplicates try: - with safe_open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r") as f: data = json.load(f) # Check if already configured @@ -452,7 +452,7 @@ def _update_windows_terminal(cls, path, io, dry_run=False): return False try: - with safe_open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r") as f: data = json.load(f) # Check if already configured @@ -494,7 +494,7 @@ def _update_windows_terminal(cls, path, io, dry_run=False): cls._backup_file(path, io) - with safe_open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w") as f: json.dump(data, f, indent=4) io.tool_output("Updated Windows Terminal config.") return True @@ -523,7 +523,7 @@ def _update_vscode(cls, path, io, dry_run=False): io.tool_output(f"Creating VS Code keybindings.json at {path}") # Create file with our binding data = [cls.VSCODE_SHIFT_ENTER_BINDING] - with safe_open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w") as f: json.dump(data, f, indent=4) io.tool_output("Created VS Code config with shift+enter binding.") return True @@ -537,7 +537,7 @@ def _update_vscode(cls, path, io, dry_run=False): # Simulate checking for duplicates try: content = "" - with safe_open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r") as f: content = f.read() # Strip comments before parsing @@ -581,7 +581,7 @@ def _update_vscode(cls, path, io, dry_run=False): try: content = "" - with safe_open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r") as f: content = f.read() # Strip comments before parsing @@ -619,7 +619,7 @@ def _update_vscode(cls, path, io, dry_run=False): data.append(cls.VSCODE_SHIFT_ENTER_BINDING) # Write back to file - with safe_open(path, "w", encoding="utf-8") as f: + with safe_open(path, "w") as f: json.dump(data, f, indent=4) io.tool_output("Updated VS Code config.") @@ -648,7 +648,7 @@ def _update_vscode_settings(cls, keybindings_path, io, dry_run=False): try: if settings_path.exists(): content = "" - with safe_open(settings_path, "r", encoding="utf-8") as f: + with safe_open(settings_path, "r") as f: content = f.read() content_no_comments = cls._strip_json_comments(content) @@ -704,7 +704,7 @@ def _update_vscode_settings(cls, keybindings_path, io, dry_run=False): if settings_path.exists(): cls._backup_file(settings_path, io) content = "" - with safe_open(settings_path, "r", encoding="utf-8") as f: + with safe_open(settings_path, "r") as f: content = f.read() # Strip comments before parsing @@ -771,7 +771,7 @@ def _update_vscode_settings(cls, keybindings_path, io, dry_run=False): ] # Write back to file - with safe_open(settings_path, "w", encoding="utf-8") as f: + with safe_open(settings_path, "w") as f: json.dump(data, f, indent=4) io.tool_output("Updated VS Code settings.") diff --git a/cecli/commands/utils/save_load_manager.py b/cecli/commands/utils/save_load_manager.py index d704da7db6b..bf2ca101959 100644 --- a/cecli/commands/utils/save_load_manager.py +++ b/cecli/commands/utils/save_load_manager.py @@ -37,7 +37,7 @@ def save_commands(self, filename: str) -> Path: # Ensure parent directory exists os.makedirs(filepath.parent, exist_ok=True) - with safe_open(filepath, "w", encoding=self.io.encoding) as f: + with safe_open(filepath, "w") as f: f.write("/drop\n") # Write commands to add editable files for fname in sorted(self.coder.abs_fnames): @@ -70,7 +70,7 @@ def load_commands(self, filename: str) -> List[str]: filepath = self.resolve_filepath(filename) try: - with safe_open(filepath, "r", encoding=self.io.encoding, errors="replace") as f: + with safe_open(filepath, "r", errors="replace") as f: commands = f.readlines() return [ cmd.strip() for cmd in commands if cmd.strip() and not cmd.strip().startswith("#") diff --git a/cecli/diffs.py b/cecli/diffs.py index f203064ddaf..19be646e5f9 100644 --- a/cecli/diffs.py +++ b/cecli/diffs.py @@ -13,10 +13,10 @@ def main(): file_orig, file_updated = sys.argv[1], sys.argv[2] - with safe_open(file_orig, "r", encoding="utf-8") as f: + with safe_open(file_orig, "r") as f: lines_orig = f.readlines() - with safe_open(file_updated, "r", encoding="utf-8") as f: + with safe_open(file_updated, "r") as f: lines_updated = f.readlines() for i in range(len(file_updated)): diff --git a/cecli/helpers/agents/config.py b/cecli/helpers/agents/config.py index 1a90f7cd6fe..2a07f7812cb 100644 --- a/cecli/helpers/agents/config.py +++ b/cecli/helpers/agents/config.py @@ -51,7 +51,7 @@ def parse_subagent_file(file_path: str) -> Optional[SubAgentConfig]: """ try: - with safe_open(file_path, "r", encoding="utf-8") as f: + with safe_open(file_path, "r") as f: content = f.read() except (FileNotFoundError, IOError, OSError) as e: raise ValueError(f"Cannot read file '{file_path}': {e}") diff --git a/cecli/helpers/config_utils.py b/cecli/helpers/config_utils.py index 2f2a93eb33c..14f375e50e8 100644 --- a/cecli/helpers/config_utils.py +++ b/cecli/helpers/config_utils.py @@ -25,7 +25,7 @@ def load_and_apply_cecli_conf_files( for config_file in existing_cecli_conf: try: - with safe_open(config_file, "r", encoding="utf-8") as f: + with safe_open(config_file, "r") as f: config_data = yaml.safe_load(f) if isinstance(config_data, dict): @@ -201,7 +201,7 @@ def read_and_merge_all_configs( for path in all_config_paths: if os.path.exists(path): try: - with safe_open(path, "r", encoding="utf-8") as f: + with safe_open(path, "r") as f: data = yaml.safe_load(f) if isinstance(data, dict): diff --git a/cecli/helpers/file_system/service.py b/cecli/helpers/file_system/service.py index 2f5e71beaef..2965490859e 100644 --- a/cecli/helpers/file_system/service.py +++ b/cecli/helpers/file_system/service.py @@ -268,7 +268,7 @@ def save(self, path: str) -> None: if self.trie_index: self.trie_index.save(trie_path) if self.trigram_index: - with open(ngram_path, "wb") as f: + with safe_open(ngram_path, "wb") as f: pickle.dump(self.trigram_index, f) # Store metadata for cache validation @@ -310,7 +310,7 @@ def load(self, path: str) -> bool: return False # Load ngram index - with open(ngram_path, "rb") as f: + with safe_open(ngram_path, "rb") as f: self.trigram_index = pickle.load(f) # Check if cache is stale diff --git a/cecli/helpers/grep_ast/main.py b/cecli/helpers/grep_ast/main.py index 7d421045178..59bb887f7c7 100644 --- a/cecli/helpers/grep_ast/main.py +++ b/cecli/helpers/grep_ast/main.py @@ -81,7 +81,7 @@ def enumerate_files(fnames, spec, use_spec=False): def process_filename(filename, args): try: - with safe_open(filename, "r", encoding=args.encoding) as file: + with safe_open(filename, "r") as file: code = file.read() except UnicodeDecodeError: return diff --git a/cecli/helpers/lock_detect.py b/cecli/helpers/lock_detect.py index 561b74eb21c..7e719a1090d 100644 --- a/cecli/helpers/lock_detect.py +++ b/cecli/helpers/lock_detect.py @@ -21,7 +21,7 @@ def dump_stacks_to_file(filename="hang_dump.log", interval=5, max_prints=10): # Determine mode: "w" to overwrite/clear on the 11th print, "a" to append mode = "w" if print_count >= max_prints else "a" - with safe_open(filename, mode, encoding="utf-8") as f: + with safe_open(filename, mode) as f: if mode == "w": f.write(f"--- Log reset automatically after {max_prints} prints ---\n") print_count = 0 # Reset the counter diff --git a/cecli/io.py b/cecli/io.py index 2eeb0b1f78e..ce996a73772 100644 --- a/cecli/io.py +++ b/cecli/io.py @@ -200,7 +200,7 @@ def tokenize(self): for fname in process_fnames: try: - with safe_open(fname, "r", encoding=self.encoding) as f: + with safe_open(fname, "r") as f: content = f.read() except (FileNotFoundError, UnicodeDecodeError, IsADirectoryError): continue @@ -689,7 +689,7 @@ def _get_style(self): def read_image(self, filename): try: - with open(str(filename), "rb") as image_file: + with safe_open(str(filename), "rb") as image_file: encoded_string = base64.b64encode(image_file.read()) return encoded_string.decode("utf-8") except OSError as err: @@ -710,7 +710,7 @@ def read_text(self, filename, silent=False): return self.read_image(filename) try: - with open(str(filename), "r", encoding=self.encoding) as f: + with safe_open(str(filename), "r") as f: return f.read() except FileNotFoundError: if not silent: @@ -732,7 +732,7 @@ def read_text(self, filename, silent=False): def _detect_newline(self, filename): try: - with open(filename, "rb") as f: + with safe_open(filename, "rb") as f: chunk = f.read(1024) if b"\r\n" in chunk: return "\r\n" @@ -761,7 +761,7 @@ def write_text(self, filename, content, max_retries=5, initial_delay=0.1): delay = initial_delay for attempt in range(max_retries): try: - with safe_open(str(filename), "w", encoding=self.encoding, newline=newline) as f: + with safe_open(str(filename), "w", newline=newline) as f: f.write(content) return # Successfully wrote the file except PermissionError as err: @@ -1225,7 +1225,7 @@ def edit_in_editor(self, content): editor = os.environ.get("EDITOR", "vi") subprocess.call([editor, tmpfile.name]) - with safe_open(tmpfile.name, "r", encoding=self.encoding) as f: + with safe_open(tmpfile.name, "r") as f: edited = f.read() os.unlink(tmpfile.name) diff --git a/cecli/mcp/oauth.py b/cecli/mcp/oauth.py index 50df4b83d08..ec5390f77b5 100644 --- a/cecli/mcp/oauth.py +++ b/cecli/mcp/oauth.py @@ -139,7 +139,7 @@ def load_mcp_oauth_tokens(): return {} try: - with safe_open(token_file, "r", encoding="utf-8") as f: + with safe_open(token_file, "r") as f: # File might be empty return json.load(f) or {} except Exception: @@ -153,7 +153,7 @@ def save_mcp_oauth_token(server_name, token_data): token_file = get_token_file_path() try: - with safe_open(token_file, "w", encoding="utf-8") as f: + with safe_open(token_file, "w") as f: json.dump(tokens, f, indent=2) # Set restrictive permissions (owner read/write only) os.chmod(token_file, 0o600) @@ -165,7 +165,7 @@ def save_mcp_oauth_tokens(tokens_dict): """Save all OAuth tokens to file.""" token_file = get_token_file_path() try: - with safe_open(token_file, "w", encoding="utf-8") as f: + with safe_open(token_file, "w") as f: json.dump(tokens_dict, f, indent=2) # Set restrictive permissions (owner read/write only) os.chmod(token_file, 0o600) diff --git a/cecli/models.py b/cecli/models.py index 3e302a1ec7b..4c66c838dc4 100644 --- a/cecli/models.py +++ b/cecli/models.py @@ -1543,7 +1543,7 @@ def _log_request(self, model_call_dict): os.makedirs(".cecli/logs/litellm", exist_ok=True) log_file_path = f".cecli/logs/litellm/request-{time.time()}.log" - with safe_open(log_file_path, "a", encoding="utf-8") as f: + with safe_open(log_file_path, "a") as f: json.dump( model_call_dict, f, diff --git a/cecli/onboarding.py b/cecli/onboarding.py index cb44de8fb48..0e55b0d8879 100644 --- a/cecli/onboarding.py +++ b/cecli/onboarding.py @@ -262,7 +262,7 @@ def run_server(): config_dir = os.path.expanduser("~/.cecli") os.makedirs(config_dir, exist_ok=True) key_file = os.path.join(config_dir, "oauth-keys.env") - with safe_open(key_file, "a", encoding="utf-8") as f: + with safe_open(key_file, "a") as f: f.write(f'OPENROUTER_API_KEY="{api_key}"\n') io.tool_warning("cecli will load the OpenRouter key automatically in future sessions.") io.tool_output() diff --git a/cecli/prompts/utils/registry.py b/cecli/prompts/utils/registry.py index 98c4f081759..bd307ef4cda 100644 --- a/cecli/prompts/utils/registry.py +++ b/cecli/prompts/utils/registry.py @@ -50,7 +50,7 @@ def _load_yaml_file(file_name: str) -> Dict[str, Any]: file_path = os.path.abspath(file_name) if os.path.exists(file_path): - with safe_open(file_path, "r", encoding="utf-8") as f: + with safe_open(file_path, "r") as f: file_content = f.read() return yaml.safe_load(file_content) or {} else: diff --git a/cecli/sessions.py b/cecli/sessions.py index fd84871523e..cea4f718f88 100644 --- a/cecli/sessions.py +++ b/cecli/sessions.py @@ -203,7 +203,7 @@ def _write_session_file(self, session_file: Path, session_data: dict) -> bool: return False session_file.write_bytes(session_crypto.encrypt_session_dict(session_data, key)) else: - with safe_open(session_file, "w", encoding="utf-8") as f: + with safe_open(session_file, "w") as f: json.dump(session_data, f, indent=2) return True except session_crypto.SessionCryptoError as e: diff --git a/cecli/tools/resource_manager.py b/cecli/tools/resource_manager.py index 7ff6ed0d656..aedc10cc203 100644 --- a/cecli/tools/resource_manager.py +++ b/cecli/tools/resource_manager.py @@ -411,7 +411,7 @@ def _create(cls, coder, file_path): os.makedirs(os.path.dirname(abs_path), exist_ok=True) # Create an empty file - with safe_open(abs_path, "w", encoding="utf-8"): + with safe_open(abs_path, "w"): pass # Add the file to editable context diff --git a/cecli/tui/app.py b/cecli/tui/app.py index 0686a135e75..ec062ceda49 100644 --- a/cecli/tui/app.py +++ b/cecli/tui/app.py @@ -1406,7 +1406,7 @@ def _extract_symbols(self) -> set[str]: for fname in files_to_process: try: - with safe_open(fname, "r", encoding="utf-8", errors="ignore") as f: + with safe_open(fname, "r", errors="ignore") as f: content = f.read() lexer = guess_lexer_for_filename(fname, content) diff --git a/cecli/voice.py b/cecli/voice.py index be0013f5a11..8b8a5933aab 100644 --- a/cecli/voice.py +++ b/cecli/voice.py @@ -4,6 +4,8 @@ import tempfile from concurrent.futures import ProcessPoolExecutor +from cecli.decoding import safe_open + class Voice: def __init__(self, audio_format="wav", device_name=None): @@ -76,7 +78,7 @@ def callback(indata, frames, time, status): file.write(q.get()) # 3. Transcription - with open(temp_path, "rb") as fh: + with safe_open(temp_path, "rb") as fh: print("\nTranscribing...") transcript = litellm.transcription( model="whisper-1", file=fh, prompt=history, language=language diff --git a/cecli/watch.py b/cecli/watch.py index 068253d17c2..412e7cffffe 100644 --- a/cecli/watch.py +++ b/cecli/watch.py @@ -56,7 +56,7 @@ def load_gitignores(gitignore_paths: list[Path]) -> Optional[PathSpec]: for path in gitignore_paths: if path.exists(): try: - with safe_open(path, "r", encoding="utf-8", errors="ignore") as f: + with safe_open(path, "r", errors="ignore") as f: patterns.extend(f.readlines()) except Exception: pass # Ignore files that can't be read From d772234be4b43cde22134e5e274cf88d2d0b1b27 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 19:32:33 -0400 Subject: [PATCH 09/15] Non unicode files are no decode-able --- tests/basic/test_coder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/basic/test_coder.py b/tests/basic/test_coder.py index 872503b8e50..f36b656d962 100644 --- a/tests/basic/test_coder.py +++ b/tests/basic/test_coder.py @@ -528,7 +528,7 @@ async def mock_send(*args, **kwargs): # Call the run method again with a message await coder.run(with_message="hi") - assert len(coder.abs_fnames) == 1 + assert len(coder.abs_fnames) == 2 async def test_choose_fence(self): # Create a few temporary files From c5145dbd561096708d7c2bf6a450b680641bfff6 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 19:34:04 -0400 Subject: [PATCH 10/15] #624 (kind of): Add more robust error messaging in io_proxy for these crashes --- cecli/helpers/io_proxy.py | 22 +++++++++++++++++++++- cecli/io.py | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/cecli/helpers/io_proxy.py b/cecli/helpers/io_proxy.py index 3f79ec6e8a4..bc6ce8aa475 100644 --- a/cecli/helpers/io_proxy.py +++ b/cecli/helpers/io_proxy.py @@ -10,6 +10,9 @@ import weakref from typing import TYPE_CHECKING, Any, Generic, TypeVar +from cecli.report import update_error_prefix +from cecli.signals import ReloadProgramSignal, SwitchCoderSignal + T = TypeVar("T") @@ -218,7 +221,24 @@ async def stop_output_task(self): try: task.cancel() await task - except (asyncio.CancelledError, Exception): + except ( + asyncio.CancelledError, + EOFError, + ReloadProgramSignal, + SystemExit, + SwitchCoderSignal, + ): + pass + except ( + Exception, + IndexError, + RuntimeError, + ): + import traceback + + traceback_str = traceback.format_exc() + update_error_prefix(traceback_str) + update_error_prefix(str(task)) pass state["output_task"] = None diff --git a/cecli/io.py b/cecli/io.py index ce996a73772..3659580adfc 100644 --- a/cecli/io.py +++ b/cecli/io.py @@ -40,11 +40,11 @@ from rich.style import Style as RichStyle from rich.text import Text -from cecli.commands import SwitchCoderSignal from cecli.decoding import safe_open from cecli.helpers import coroutines from cecli.helpers.threading import ThreadSafeEvent from cecli.report import update_error_prefix +from cecli.signals import ReloadProgramSignal, SwitchCoderSignal from .dump import dump # noqa: F401 from .editor import pipe_editor @@ -1136,6 +1136,7 @@ async def stop_output_task(self): except ( asyncio.CancelledError, EOFError, + ReloadProgramSignal, SystemExit, SwitchCoderSignal, ): From b1b4a0316ae1aba43f993693ac8d242ef76552d3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 19:46:25 -0400 Subject: [PATCH 11/15] Alphabetize MCP servers in documentation --- cecli/website/docs/config/mcp.md | 85 ++++++++++++++++---------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/cecli/website/docs/config/mcp.md b/cecli/website/docs/config/mcp.md index 2c6572732ba..5de4e1dd493 100644 --- a/cecli/website/docs/config/mcp.md +++ b/cecli/website/docs/config/mcp.md @@ -147,6 +147,24 @@ For more information about specific MCP servers and their capabilities, refer to Here are some commonly used MCP servers that can enhance cecli's capabilities: +### Chrome DevTools + +Chrome DevTools MCP provides browser automation and debugging capabilities through Chrome's DevTools Protocol, enabling web page interaction, network monitoring, and performance analysis. It connects to a running Chrome instance and offers tools for web development testing and automation. Note: the configuration below requires you to start chrome with remote debugging enabled before +starting the coding agent. + +```yaml +mcp-servers: + mcpServers: + chrome-devtools: + transport: stdio + command: npx + args: [ + "chrome-devtools-mcp@latest", + "--browser-url", + "http://127.0.0.1:9222" + ] +``` + ### Context7 Context7 MCP provides up-to-date, version-specific documentation and code examples directly from the source into your LLM prompts, eliminating outdated information and hallucinations. It offers a streamlined integration experience with built-in caching mechanisms and is optimized for explorative agentic workflows. @@ -171,24 +189,25 @@ mcp-servers: url: https://mcp.deepwiki.com/mcp ``` -### You.com Search (Paid Service) - -You.com MCP provides live web and news search with LLM-ready results, useful when the model needs current information — release notes, library docs, error messages — beyond its training cutoff, and as the search complement to `/web` (search first, then scrape the best result). -**Free tier — no account, no API key.** The `?profile=free` endpoint used in the configuration below is limited to 100 queries per day (rate limited per IP) and exposes the `you-search` tool only. +### GitHub -**Paid tier.** An [API key](https://you.com/platform?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs) raises the rate limit and unlocks the remaining tools: `you-contents` (page content extraction), `you-research` (cited multi-source research), `you-finance`, `you-discover`, and `you-balance`. Usage beyond the free allowance is pay-as-you-go — see [pricing](https://you.com/pricing?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs) and the [MCP server docs](https://you.com/docs/build-with-agents/mcp-server?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs). +GitHub MCP provides access to GitHub repositories, issues, pull requests, and other GitHub resources. It enables AI models to interact with GitHub data, read repository contents, and perform various GitHub operations. The server runs in a Docker container and requires a GitHub Personal Access Token for authentication. ```yaml mcp-servers: mcpServers: - youcom: - transport: http - url: https://api.you.com/mcp?profile=free - # With a You.com API key (unlocks you-contents and you-research): - # url: https://api.you.com/mcp - # headers: - # Authorization: "Bearer " + github: + transport: stdio + command: "docker" + args: [ + "run", + "-i", + "--rm", + "-e", + "GITHUB_PERSONAL_ACCESS_TOKEN=", + "ghcr.io/github/github-mcp-server" + ] ``` ### Serena @@ -213,40 +232,22 @@ mcp-servers: ] ``` -### Chrome DevTools - -Chrome DevTools MCP provides browser automation and debugging capabilities through Chrome's DevTools Protocol, enabling web page interaction, network monitoring, and performance analysis. It connects to a running Chrome instance and offers tools for web development testing and automation. Note: the configuration below requires you to start chrome with remote debugging enabled before -starting the coding agent. +### You.com Search (Paid Service) -```yaml -mcp-servers: - mcpServers: - chrome-devtools: - transport: stdio - command: npx - args: [ - "chrome-devtools-mcp@latest", - "--browser-url", - "http://127.0.0.1:9222" - ] -``` +You.com MCP provides live web and news search with LLM-ready results, useful when the model needs current information — release notes, library docs, error messages — beyond its training cutoff, and as the search complement to `/web` (search first, then scrape the best result). -### GitHub +**Free tier — no account, no API key.** The `?profile=free` endpoint used in the configuration below is limited to 100 queries per day (rate limited per IP) and exposes the `you-search` tool only. -GitHub MCP provides access to GitHub repositories, issues, pull requests, and other GitHub resources. It enables AI models to interact with GitHub data, read repository contents, and perform various GitHub operations. The server runs in a Docker container and requires a GitHub Personal Access Token for authentication. +**Paid tier.** An [API key](https://you.com/platform?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs) raises the rate limit and unlocks the remaining tools: `you-contents` (page content extraction), `you-research` (cited multi-source research), `you-finance`, `you-discover`, and `you-balance`. Usage beyond the free allowance is pay-as-you-go — see [pricing](https://you.com/pricing?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs) and the [MCP server docs](https://you.com/docs/build-with-agents/mcp-server?utm_source=cecli-dev-cecli&utm_medium=oss_integration&utm_campaign=2026-07-oss-integrations&utm_content=docs). ```yaml mcp-servers: mcpServers: - github: - transport: stdio - command: "docker" - args: [ - "run", - "-i", - "--rm", - "-e", - "GITHUB_PERSONAL_ACCESS_TOKEN=", - "ghcr.io/github/github-mcp-server" - ] -``` + youcom: + transport: http + url: https://api.you.com/mcp?profile=free + # With a You.com API key (unlocks you-contents and you-research): + # url: https://api.you.com/mcp + # headers: + # Authorization: "Bearer " +``` \ No newline at end of file From 0e5d4ac61585a165ca2738d3522342682b242564 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 20:02:44 -0400 Subject: [PATCH 12/15] #597: Propogate LLM API error calls to exit command --- cecli/coders/base_coder.py | 5 ++++- cecli/main.py | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cecli/coders/base_coder.py b/cecli/coders/base_coder.py index 48c51e03801..8ec70e7c8c7 100755 --- a/cecli/coders/base_coder.py +++ b/cecli/coders/base_coder.py @@ -246,6 +246,7 @@ def total_cached_tokens(self, value): model_kwargs = {} cost_multiplier = 1 stop_on_empty = True + error_code = None # Task coordination state variables input_running = False @@ -1874,7 +1875,7 @@ async def run_one(self, user_message, preproc): if not self.commands.is_command(user_message): ConversationService.get_chunks(self).flush_removals() self.last_user_message = user_message - + self.error_code = None # Fire memorizer after each user request # if self.auto_memory and self.edit_format not in ["subagent"]: # from cecli.helpers.memory.utils import invoke_memorizer @@ -3649,6 +3650,7 @@ async def send(self, messages, model=None, functions=None, tools=None): self.calculate_and_show_tokens_and_cost(messages, completion) except litellm_ex.exceptions_tuple() as err: + self.error_code = 1 ex_info = litellm_ex.get_ex_info(err) if ex_info.name == "ContextWindowExceededError": # Still calculate costs for context window errors @@ -3656,6 +3658,7 @@ async def send(self, messages, model=None, functions=None, tools=None): self.calculate_and_show_tokens_and_cost(messages, completion) raise except (KeyboardInterrupt, asyncio.CancelledError) as kbi: + self.error_code = 130 # apparently standard? self.keyboard_interrupt() raise kbi finally: diff --git a/cecli/main.py b/cecli/main.py index 09e4e4739d9..8e76c2ea411 100644 --- a/cecli/main.py +++ b/cecli/main.py @@ -1714,6 +1714,10 @@ async def task(message, setting=None, env=None, force_git_root=None, return_code async def graceful_exit(coder=None, exit_code=0): sys.settrace(None) + + if getattr(coder, "error_code", None) is not None: + exit_code = coder.error_code + if coder: if hasattr(coder, "_autosave_future"): await coder._autosave_future From 124fe649c3c7d31f3e1f01662d66d7396939fb57 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jul 2026 20:05:34 -0400 Subject: [PATCH 13/15] Update model-metadata.json --- cecli/resources/model-metadata.json | 4784 +++++++++++++++++++-------- 1 file changed, 3409 insertions(+), 1375 deletions(-) diff --git a/cecli/resources/model-metadata.json b/cecli/resources/model-metadata.json index 4af6e04ffc7..6e1d71f5e43 100644 --- a/cecli/resources/model-metadata.json +++ b/cecli/resources/model-metadata.json @@ -217,7 +217,8 @@ "supports_pdf_input": true, "supports_prompt_caching": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "prompt_cache_min_tokens": 2048 }, "anthropic.claude-3-5-sonnet-20240620-v1:0": { "input_cost_per_token": 0.000003, @@ -236,8 +237,6 @@ "output_cost_per_token_above_200k_tokens": 0.00003, "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, "cache_read_input_token_cost_above_200k_tokens": 6e-7, - "cache_creation_input_token_cost_above_1hr": 0.0000075, - "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.000015, "cache_creation_input_token_cost": 0.00000375, "cache_read_input_token_cost": 3e-7 }, @@ -262,9 +261,7 @@ "input_cost_per_token_above_200k_tokens": 0.000006, "output_cost_per_token_above_200k_tokens": 0.00003, "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, - "cache_read_input_token_cost_above_200k_tokens": 6e-7, - "cache_creation_input_token_cost_above_1hr": 0.0000075, - "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.000015 + "cache_read_input_token_cost_above_200k_tokens": 6e-7 }, "anthropic.claude-3-7-sonnet-20240620-v1:0": { "cache_creation_input_token_cost": 0.0000045, @@ -370,6 +367,7 @@ "search_context_size_medium": 0.01 }, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -384,7 +382,9 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 0.00000125, @@ -407,7 +407,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "anthropic.claude-haiku-4-5@20251001": { "cache_creation_input_token_cost": 0.00000125, @@ -431,7 +433,9 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_streaming": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "anthropic.claude-instant-v1": { "input_cost_per_token": 8e-7, @@ -481,7 +485,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-opus-4-20250514-v1:0": { "cache_creation_input_token_cost": 0.00001875, @@ -506,7 +511,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-opus-4-5-20251101-v1:0": { "cache_creation_input_token_cost": 0.00000625, @@ -535,9 +541,12 @@ "supports_vision": true, "supports_native_structured_output": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "high" + "bedrock_output_config_effort_ceiling": "high", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "anthropic.claude-opus-4-6-v1": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -565,9 +574,13 @@ "supports_native_structured_output": true, "supports_output_config": true, "supports_max_reasoning_effort": true, - "bedrock_output_config_effort_ceiling": "max" + "bedrock_output_config_effort_ceiling": "max", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -597,9 +610,14 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 }, "anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -615,7 +633,43 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 0.00000625, + "cache_creation_input_token_cost_above_1hr": 0.00001, + "cache_read_input_token_cost": 5e-7, + "input_cost_per_token": 0.000005, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000025, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -630,7 +684,8 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 }, "anthropic.claude-sonnet-4-20250514-v1:0": { "cache_creation_input_token_cost": 0.00000375, @@ -659,7 +714,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "bedrock_converse_supports_strict_tools": false, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.00000375, @@ -691,9 +748,12 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000375, "cache_creation_input_token_cost_above_1hr": 0.000006, "cache_read_input_token_cost": 3e-7, @@ -720,7 +780,45 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "anthropic.claude-sonnet-5": { + "cache_creation_input_token_cost": 0.0000025, + "cache_creation_input_token_cost_above_1hr": 0.000004, + "cache_read_input_token_cost": 2e-7, + "input_cost_per_token": 0.000002, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.00001, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-v1": { "input_cost_per_token": 0.000008, @@ -1022,7 +1120,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "apac.anthropic.claude-sonnet-4-20250514-v1:0": { "cache_creation_input_token_cost": 0.00000375, @@ -1051,7 +1151,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "bedrock_converse_supports_strict_tools": false, + "prompt_cache_min_tokens": 1024 }, "au.anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 0.000001375, @@ -1073,9 +1175,12 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "au.anthropic.claude-opus-4-6-v1": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.000006875, "cache_creation_input_token_cost_above_1hr": 0.000011, "cache_read_input_token_cost": 5.5e-7, @@ -1103,9 +1208,13 @@ "supports_native_structured_output": true, "supports_output_config": true, "supports_max_reasoning_effort": true, - "bedrock_output_config_effort_ceiling": "max" + "bedrock_output_config_effort_ceiling": "max", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "au.anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.000006875, "cache_creation_input_token_cost_above_1hr": 0.000011, "cache_read_input_token_cost": 5.5e-7, @@ -1135,9 +1244,14 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 }, "au.anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 0.000006875, "cache_creation_input_token_cost_above_1hr": 0.000011, "cache_read_input_token_cost": 5.5e-7, @@ -1153,7 +1267,43 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "au.anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 0.000006875, + "cache_creation_input_token_cost_above_1hr": 0.000011, + "cache_read_input_token_cost": 5.5e-7, + "input_cost_per_token": 0.0000055, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.0000275, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1168,7 +1318,8 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 }, "au.anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.000004125, @@ -1200,9 +1351,12 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "au.anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.000004125, "cache_creation_input_token_cost_above_1hr": 0.0000066, "cache_read_input_token_cost": 3.3e-7, @@ -1229,7 +1383,45 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "au.anthropic.claude-sonnet-5": { + "cache_creation_input_token_cost": 0.00000275, + "cache_creation_input_token_cost_above_1hr": 0.0000044, + "cache_read_input_token_cost": 2.2e-7, + "input_cost_per_token": 0.0000022, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000011, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "azure/command-r-plus": { "input_cost_per_token": 0.000003, @@ -1322,74 +1514,105 @@ "supports_tool_choice": true, "supports_vision": true }, - "azure/eu/gpt-4o-mini-realtime-preview-2024-12-17": { - "cache_creation_input_audio_token_cost": 3.3e-7, - "cache_read_input_token_cost": 3.3e-7, - "input_cost_per_audio_token": 0.000011, - "input_cost_per_token": 6.6e-7, + "azure/eu/gpt-5-2025-08-07": { + "cache_read_input_token_cost": 1.375e-7, + "input_cost_per_token": 0.000001375, "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.000022, - "output_cost_per_token": 0.00000264, - "supports_audio_input": true, - "supports_audio_output": true, + "output_cost_per_token": 0.000011, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": true }, - "azure/eu/gpt-4o-realtime-preview-2024-10-01": { - "cache_creation_input_audio_token_cost": 0.000022, - "cache_read_input_token_cost": 0.00000275, - "input_cost_per_audio_token": 0.00011, - "input_cost_per_token": 0.0000055, + "azure/eu/gpt-5-mini-2025-08-07": { + "cache_read_input_token_cost": 2.75e-8, + "input_cost_per_token": 2.75e-7, "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.00022, - "output_cost_per_token": 0.000022, - "supports_audio_input": true, - "supports_audio_output": true, + "output_cost_per_token": 0.0000022, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": true }, - "azure/eu/gpt-4o-realtime-preview-2024-12-17": { - "cache_read_input_audio_token_cost": 0.0000025, - "cache_read_input_token_cost": 0.00000275, - "input_cost_per_audio_token": 0.000044, - "input_cost_per_token": 0.0000055, + "azure/eu/gpt-5-nano-2025-08-07": { + "cache_read_input_token_cost": 5.5e-9, + "input_cost_per_token": 5.5e-8, "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.00008, - "output_cost_per_token": 0.000022, + "output_cost_per_token": 4.4e-7, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], "supported_modalities": [ "text", - "audio" + "image" ], "supported_output_modalities": [ - "text", - "audio" + "text" ], - "supports_audio_input": true, - "supports_audio_output": true, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": true }, - "azure/eu/gpt-5-2025-08-07": { - "cache_read_input_token_cost": 1.375e-7, - "input_cost_per_token": 0.000001375, + "azure/eu/gpt-5.1": { + "cache_read_input_token_cost": 1.4e-7, + "input_cost_per_token": 0.00000138, "litellm_provider": "azure", "max_input_tokens": 272000, "max_output_tokens": 128000, @@ -1406,7 +1629,8 @@ "image" ], "supported_output_modalities": [ - "text" + "text", + "image" ], "supports_function_calling": true, "supports_native_streaming": true, @@ -1417,17 +1641,18 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_none_reasoning_effort": true }, - "azure/eu/gpt-5-mini-2025-08-07": { - "cache_read_input_token_cost": 2.75e-8, - "input_cost_per_token": 2.75e-7, + "azure/eu/gpt-5.1-chat": { + "cache_read_input_token_cost": 1.4e-7, + "input_cost_per_token": 0.00000138, "litellm_provider": "azure", - "max_input_tokens": 272000, + "max_input_tokens": 128000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 0.0000022, + "output_cost_per_token": 0.000011, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -1438,7 +1663,8 @@ "image" ], "supported_output_modalities": [ - "text" + "text", + "image" ], "supports_function_calling": true, "supports_native_streaming": true, @@ -1449,17 +1675,21 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_none_reasoning_effort": true }, - "azure/eu/gpt-5-nano-2025-08-07": { - "cache_read_input_token_cost": 5.5e-9, - "input_cost_per_token": 5.5e-8, + "azure/eu/gpt-5.4": { + "cache_read_input_token_cost": 2.8e-7, + "cache_read_input_token_cost_priority": 5.5e-7, + "input_cost_per_token": 0.00000275, + "input_cost_per_token_priority": 0.0000055, + "output_cost_per_token": 0.0000165, + "output_cost_per_token_priority": 0.000033, "litellm_provider": "azure", - "max_input_tokens": 272000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 4.4e-7, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -1483,15 +1713,18 @@ "supports_tool_choice": true, "supports_vision": true }, - "azure/eu/gpt-5.1": { - "cache_read_input_token_cost": 1.4e-7, - "input_cost_per_token": 0.00000138, + "azure/eu/gpt-5.4-2026-03-05": { + "cache_read_input_token_cost": 2.8e-7, + "cache_read_input_token_cost_priority": 5.5e-7, + "input_cost_per_token": 0.00000275, + "input_cost_per_token_priority": 0.0000055, + "output_cost_per_token": 0.0000165, + "output_cost_per_token_priority": 0.000033, "litellm_provider": "azure", - "max_input_tokens": 272000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 0.000011, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -1502,9 +1735,46 @@ "image" ], "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "azure/eu/gpt-5.5": { + "cache_read_input_token_cost": 5.5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.0000011, + "cache_read_input_token_cost_priority": 0.00000138, + "input_cost_per_token": 0.0000055, + "input_cost_per_token_above_272k_tokens": 0.000011, + "input_cost_per_token_priority": 0.00001375, + "output_cost_per_token": 0.000033, + "output_cost_per_token_above_272k_tokens": 0.0000495, + "output_cost_per_token_priority": 0.0000825, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ "text", "image" ], + "supported_output_modalities": [ + "text" + ], "supports_function_calling": true, "supports_native_streaming": true, "supports_parallel_function_calling": true, @@ -1515,17 +1785,26 @@ "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true, - "supports_none_reasoning_effort": true + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, - "azure/eu/gpt-5.1-chat": { - "cache_read_input_token_cost": 1.4e-7, - "input_cost_per_token": 0.00000138, + "azure/eu/gpt-5.5-2026-04-23": { + "cache_read_input_token_cost": 5.5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.0000011, + "cache_read_input_token_cost_priority": 0.00000138, + "input_cost_per_token": 0.0000055, + "input_cost_per_token_above_272k_tokens": 0.000011, + "input_cost_per_token_priority": 0.00001375, + "output_cost_per_token": 0.000033, + "output_cost_per_token_above_272k_tokens": 0.0000495, + "output_cost_per_token_priority": 0.0000825, "litellm_provider": "azure", - "max_input_tokens": 128000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 0.000011, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -1536,9 +1815,89 @@ "image" ], "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, + "azure/eu/gpt-5.6": { + "cache_read_input_token_cost": 5.5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.0000011, + "cache_read_input_token_cost_priority": 0.000001375, + "input_cost_per_token": 0.0000055, + "input_cost_per_token_above_272k_tokens": 0.000011, + "input_cost_per_token_priority": 0.00001375, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000033, + "output_cost_per_token_above_272k_tokens": 0.0000495, + "output_cost_per_token_priority": 0.0000825, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/eu/gpt-5.6-luna": { + "cache_read_input_token_cost": 1.1e-7, + "cache_read_input_token_cost_above_272k_tokens": 2.2e-7, + "cache_read_input_token_cost_priority": 2.75e-7, + "input_cost_per_token": 0.0000011, + "input_cost_per_token_above_272k_tokens": 0.0000022, + "input_cost_per_token_priority": 0.00000275, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.0000066, + "output_cost_per_token_above_272k_tokens": 0.0000099, + "output_cost_per_token_priority": 0.0000165, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ "text", "image" ], + "supported_output_modalities": [ + "text" + ], "supports_function_calling": true, "supports_native_streaming": true, "supports_parallel_function_calling": true, @@ -1549,7 +1908,94 @@ "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true, - "supports_none_reasoning_effort": true + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/eu/gpt-5.6-sol": { + "cache_read_input_token_cost": 5.5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.0000011, + "cache_read_input_token_cost_priority": 0.000001375, + "input_cost_per_token": 0.0000055, + "input_cost_per_token_above_272k_tokens": 0.000011, + "input_cost_per_token_priority": 0.00001375, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000033, + "output_cost_per_token_above_272k_tokens": 0.0000495, + "output_cost_per_token_priority": 0.0000825, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/eu/gpt-5.6-terra": { + "cache_read_input_token_cost": 2.75e-7, + "cache_read_input_token_cost_above_272k_tokens": 5.5e-7, + "cache_read_input_token_cost_priority": 6.875e-7, + "input_cost_per_token": 0.00000275, + "input_cost_per_token_above_272k_tokens": 0.0000055, + "input_cost_per_token_priority": 0.000006875, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.0000165, + "output_cost_per_token_above_272k_tokens": 0.00002475, + "output_cost_per_token_priority": 0.00004125, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, "azure/eu/o1-2024-12-17": { "cache_read_input_token_cost": 0.00000825, @@ -2321,71 +2767,39 @@ "supports_tool_choice": true, "supports_vision": false }, - "azure/gpt-4o-mini-realtime-preview-2024-12-17": { - "cache_creation_input_audio_token_cost": 3e-7, - "cache_read_input_token_cost": 3e-7, - "input_cost_per_audio_token": 0.00001, - "input_cost_per_token": 6e-7, - "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.00002, - "output_cost_per_token": 0.0000024, - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, - "azure/gpt-4o-realtime-preview-2024-10-01": { - "cache_creation_input_audio_token_cost": 0.00002, - "cache_read_input_token_cost": 0.0000025, - "input_cost_per_audio_token": 0.0001, - "input_cost_per_token": 0.000005, - "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.0002, - "output_cost_per_token": 0.00002, - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, - "azure/gpt-4o-realtime-preview-2024-12-17": { - "cache_read_input_token_cost": 0.0000025, - "input_cost_per_audio_token": 0.00004, - "input_cost_per_token": 0.000005, + "azure/gpt-5": { + "cache_read_input_token_cost": 1.25e-7, + "input_cost_per_token": 0.00000125, "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.00008, - "output_cost_per_token": 0.00002, + "output_cost_per_token": 0.00001, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], "supported_modalities": [ "text", - "audio" + "image" ], "supported_output_modalities": [ - "text", - "audio" + "text" ], - "supports_audio_input": true, - "supports_audio_output": true, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": true }, - "azure/gpt-5": { + "azure/gpt-5-2025-08-07": { "cache_read_input_token_cost": 1.25e-7, "input_cost_per_token": 0.00000125, "litellm_provider": "azure", @@ -2417,48 +2831,16 @@ "supports_tool_choice": true, "supports_vision": true }, - "azure/gpt-5-2025-08-07": { + "azure/gpt-5-chat": { "cache_read_input_token_cost": 1.25e-7, "input_cost_per_token": 0.00000125, "litellm_provider": "azure", - "max_input_tokens": 272000, - "max_output_tokens": 128000, - "max_tokens": 128000, + "max_input_tokens": 128000, + "max_output_tokens": 16384, + "max_tokens": 16384, "mode": "chat", "output_cost_per_token": 0.00001, - "supported_endpoints": [ - "/v1/chat/completions", - "/v1/batch", - "/v1/responses" - ], - "supported_modalities": [ - "text", - "image" - ], - "supported_output_modalities": [ - "text" - ], - "supports_function_calling": true, - "supports_native_streaming": true, - "supports_parallel_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_system_messages": true, - "supports_tool_choice": true, - "supports_vision": true - }, - "azure/gpt-5-chat": { - "cache_read_input_token_cost": 1.25e-7, - "input_cost_per_token": 0.00000125, - "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 16384, - "max_tokens": 16384, - "mode": "chat", - "output_cost_per_token": 0.00001, - "source": "https://azure.microsoft.com/en-us/blog/gpt-5-in-azure-ai-foundry-the-future-of-ai-apps-and-agents-starts-here/", + "source": "https://azure.microsoft.com/en-us/blog/gpt-5-in-azure-ai-foundry-the-future-of-ai-apps-and-agents-starts-here/", "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -2709,7 +3091,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_none_reasoning_effort": true, "supports_minimal_reasoning_effort": true @@ -2851,7 +3232,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "azure/gpt-5.2-chat": { @@ -2954,7 +3334,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "azure/gpt-5.4": { @@ -2996,7 +3375,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "azure/gpt-5.4-2026-03-05": { @@ -3038,7 +3416,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "azure/gpt-5.4-mini": { @@ -3071,7 +3448,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -3107,7 +3483,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -3143,7 +3518,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -3179,7 +3553,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -3224,7 +3597,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -3270,198 +3642,281 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, - "azure/gpt-audio-1.5-2026-02-23": { - "input_cost_per_audio_token": 0.00004, - "input_cost_per_token": 0.0000025, + "azure/gpt-5.6": { + "cache_read_input_token_cost": 5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.000001, + "cache_read_input_token_cost_priority": 0.000001, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000002, + "input_cost_per_token": 0.000005, + "input_cost_per_token_above_272k_tokens": 0.00001, + "input_cost_per_token_priority": 0.00001, + "input_cost_per_token_above_272k_tokens_priority": 0.00002, "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 16384, - "max_tokens": 16384, + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.00008, - "output_cost_per_token": 0.00001, + "output_cost_per_token": 0.00003, + "output_cost_per_token_above_272k_tokens": 0.000045, + "output_cost_per_token_priority": 0.00006, + "output_cost_per_token_above_272k_tokens_priority": 0.00009, "supported_endpoints": [ - "/v1/chat/completions" + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" ], "supported_modalities": [ "text", - "audio" + "image" ], "supported_output_modalities": [ - "text", - "audio" + "text" ], "supports_function_calling": true, "supports_native_streaming": true, "supports_parallel_function_calling": true, - "supports_prompt_caching": false, - "supports_reasoning": false, - "supports_response_schema": false, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": false + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, - "azure/gpt-audio-2025-08-28": { - "input_cost_per_audio_token": 0.00004, - "input_cost_per_token": 0.0000025, + "azure/gpt-5.6-luna": { + "cache_read_input_token_cost": 1e-7, + "cache_read_input_token_cost_above_272k_tokens": 2e-7, + "cache_read_input_token_cost_priority": 2e-7, + "cache_read_input_token_cost_above_272k_tokens_priority": 4e-7, + "input_cost_per_token": 0.000001, + "input_cost_per_token_above_272k_tokens": 0.000002, + "input_cost_per_token_priority": 0.000002, + "input_cost_per_token_above_272k_tokens_priority": 0.000004, "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 16384, - "max_tokens": 16384, + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.00008, - "output_cost_per_token": 0.00001, + "output_cost_per_token": 0.000006, + "output_cost_per_token_above_272k_tokens": 0.000009, + "output_cost_per_token_priority": 0.000012, + "output_cost_per_token_above_272k_tokens_priority": 0.000018, "supported_endpoints": [ - "/v1/chat/completions" + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" ], "supported_modalities": [ "text", - "audio" + "image" ], "supported_output_modalities": [ - "text", - "audio" + "text" ], "supports_function_calling": true, "supports_native_streaming": true, "supports_parallel_function_calling": true, - "supports_prompt_caching": false, - "supports_reasoning": false, - "supports_response_schema": false, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": false + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, - "azure/gpt-audio-mini-2025-10-06": { - "input_cost_per_audio_token": 0.00001, - "input_cost_per_token": 6e-7, + "azure/gpt-5.6-sol": { + "cache_read_input_token_cost": 5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.000001, + "cache_read_input_token_cost_priority": 0.000001, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000002, + "input_cost_per_token": 0.000005, + "input_cost_per_token_above_272k_tokens": 0.00001, + "input_cost_per_token_priority": 0.00001, + "input_cost_per_token_above_272k_tokens_priority": 0.00002, "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 16384, - "max_tokens": 16384, + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.00002, - "output_cost_per_token": 0.0000024, + "output_cost_per_token": 0.00003, + "output_cost_per_token_above_272k_tokens": 0.000045, + "output_cost_per_token_priority": 0.00006, + "output_cost_per_token_above_272k_tokens_priority": 0.00009, "supported_endpoints": [ - "/v1/chat/completions" + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" ], "supported_modalities": [ "text", - "audio" + "image" ], "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/gpt-5.6-terra": { + "cache_read_input_token_cost": 2.5e-7, + "cache_read_input_token_cost_above_272k_tokens": 5e-7, + "cache_read_input_token_cost_priority": 5e-7, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000001, + "input_cost_per_token": 0.0000025, + "input_cost_per_token_above_272k_tokens": 0.000005, + "input_cost_per_token_priority": 0.000005, + "input_cost_per_token_above_272k_tokens_priority": 0.00001, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000015, + "output_cost_per_token_above_272k_tokens": 0.0000225, + "output_cost_per_token_priority": 0.00003, + "output_cost_per_token_above_272k_tokens_priority": 0.000045, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ "text", - "audio" + "image" + ], + "supported_output_modalities": [ + "text" ], "supports_function_calling": true, "supports_native_streaming": true, "supports_parallel_function_calling": true, - "supports_prompt_caching": false, - "supports_reasoning": false, - "supports_response_schema": false, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": false + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, - "azure/gpt-realtime-1.5-2026-02-23": { - "cache_creation_input_audio_token_cost": 0.000004, - "cache_read_input_token_cost": 0.000004, - "input_cost_per_audio_token": 0.000032, - "input_cost_per_image": 0.000005, - "input_cost_per_token": 0.000004, + "azure/gpt-audio-1.5-2026-02-23": { + "input_cost_per_audio_token": 0.00004, + "input_cost_per_token": 0.0000025, "litellm_provider": "azure", - "max_input_tokens": 32000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_input_tokens": 128000, + "max_output_tokens": 16384, + "max_tokens": 16384, "mode": "chat", - "output_cost_per_audio_token": 0.000064, - "output_cost_per_token": 0.000016, + "output_cost_per_audio_token": 0.00008, + "output_cost_per_token": 0.00001, "supported_endpoints": [ - "/v1/realtime" + "/v1/chat/completions" ], "supported_modalities": [ "text", - "image", "audio" ], "supported_output_modalities": [ "text", "audio" ], - "supports_audio_input": true, - "supports_audio_output": true, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": false, + "supports_response_schema": false, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false }, - "azure/gpt-realtime-2025-08-28": { - "cache_creation_input_audio_token_cost": 0.000004, - "cache_read_input_token_cost": 0.000004, - "input_cost_per_audio_token": 0.000032, - "input_cost_per_image": 0.000005, - "input_cost_per_token": 0.000004, + "azure/gpt-audio-2025-08-28": { + "input_cost_per_audio_token": 0.00004, + "input_cost_per_token": 0.0000025, "litellm_provider": "azure", - "max_input_tokens": 32000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_input_tokens": 128000, + "max_output_tokens": 16384, + "max_tokens": 16384, "mode": "chat", - "output_cost_per_audio_token": 0.000064, - "output_cost_per_token": 0.000016, + "output_cost_per_audio_token": 0.00008, + "output_cost_per_token": 0.00001, "supported_endpoints": [ - "/v1/realtime" + "/v1/chat/completions" ], "supported_modalities": [ "text", - "image", "audio" ], "supported_output_modalities": [ "text", "audio" ], - "supports_audio_input": true, - "supports_audio_output": true, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": false, + "supports_response_schema": false, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false }, - "azure/gpt-realtime-mini-2025-10-06": { - "cache_creation_input_audio_token_cost": 3e-7, - "cache_read_input_token_cost": 6e-8, + "azure/gpt-audio-mini-2025-10-06": { "input_cost_per_audio_token": 0.00001, - "input_cost_per_image": 8e-7, "input_cost_per_token": 6e-7, "litellm_provider": "azure", - "max_input_tokens": 32000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_input_tokens": 128000, + "max_output_tokens": 16384, + "max_tokens": 16384, "mode": "chat", "output_cost_per_audio_token": 0.00002, "output_cost_per_token": 0.0000024, "supported_endpoints": [ - "/v1/realtime" + "/v1/chat/completions" ], "supported_modalities": [ "text", - "image", "audio" ], "supported_output_modalities": [ "text", "audio" ], - "supports_audio_input": true, - "supports_audio_output": true, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": false, + "supports_response_schema": false, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false }, "azure/mistral-large-2402": { "input_cost_per_token": 0.000008, @@ -3950,71 +4405,6 @@ "supports_tool_choice": true, "supports_vision": true }, - "azure/us/gpt-4o-mini-realtime-preview-2024-12-17": { - "cache_creation_input_audio_token_cost": 3.3e-7, - "cache_read_input_token_cost": 3.3e-7, - "input_cost_per_audio_token": 0.000011, - "input_cost_per_token": 6.6e-7, - "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.000022, - "output_cost_per_token": 0.00000264, - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, - "azure/us/gpt-4o-realtime-preview-2024-10-01": { - "cache_creation_input_audio_token_cost": 0.000022, - "cache_read_input_token_cost": 0.00000275, - "input_cost_per_audio_token": 0.00011, - "input_cost_per_token": 0.0000055, - "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.00022, - "output_cost_per_token": 0.000022, - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, - "azure/us/gpt-4o-realtime-preview-2024-12-17": { - "cache_read_input_audio_token_cost": 0.0000025, - "cache_read_input_token_cost": 0.00000275, - "input_cost_per_audio_token": 0.000044, - "input_cost_per_token": 0.0000055, - "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.00008, - "output_cost_per_token": 0.000022, - "supported_modalities": [ - "text", - "audio" - ], - "supported_output_modalities": [ - "text", - "audio" - ], - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, "azure/us/gpt-5-2025-08-07": { "cache_read_input_token_cost": 1.375e-7, "input_cost_per_token": 0.000001375, @@ -4179,6 +4569,325 @@ "supports_vision": true, "supports_none_reasoning_effort": true }, + "azure/us/gpt-5.4": { + "cache_read_input_token_cost": 2.8e-7, + "cache_read_input_token_cost_priority": 5.5e-7, + "input_cost_per_token": 0.00000275, + "input_cost_per_token_priority": 0.0000055, + "output_cost_per_token": 0.0000165, + "output_cost_per_token_priority": 0.000033, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "azure/us/gpt-5.4-2026-03-05": { + "cache_read_input_token_cost": 2.8e-7, + "cache_read_input_token_cost_priority": 5.5e-7, + "input_cost_per_token": 0.00000275, + "input_cost_per_token_priority": 0.0000055, + "output_cost_per_token": 0.0000165, + "output_cost_per_token_priority": 0.000033, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "azure/us/gpt-5.5": { + "cache_read_input_token_cost": 5.5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.0000011, + "cache_read_input_token_cost_priority": 0.00000138, + "input_cost_per_token": 0.0000055, + "input_cost_per_token_above_272k_tokens": 0.000011, + "input_cost_per_token_priority": 0.00001375, + "output_cost_per_token": 0.000033, + "output_cost_per_token_above_272k_tokens": 0.0000495, + "output_cost_per_token_priority": 0.0000825, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/us/gpt-5.5-2026-04-23": { + "cache_read_input_token_cost": 5.5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.0000011, + "cache_read_input_token_cost_priority": 0.00000138, + "input_cost_per_token": 0.0000055, + "input_cost_per_token_above_272k_tokens": 0.000011, + "input_cost_per_token_priority": 0.00001375, + "output_cost_per_token": 0.000033, + "output_cost_per_token_above_272k_tokens": 0.0000495, + "output_cost_per_token_priority": 0.0000825, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, + "azure/us/gpt-5.6": { + "cache_read_input_token_cost": 5.5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.0000011, + "cache_read_input_token_cost_priority": 0.000001375, + "input_cost_per_token": 0.0000055, + "input_cost_per_token_above_272k_tokens": 0.000011, + "input_cost_per_token_priority": 0.00001375, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000033, + "output_cost_per_token_above_272k_tokens": 0.0000495, + "output_cost_per_token_priority": 0.0000825, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/us/gpt-5.6-luna": { + "cache_read_input_token_cost": 1.1e-7, + "cache_read_input_token_cost_above_272k_tokens": 2.2e-7, + "cache_read_input_token_cost_priority": 2.75e-7, + "input_cost_per_token": 0.0000011, + "input_cost_per_token_above_272k_tokens": 0.0000022, + "input_cost_per_token_priority": 0.00000275, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.0000066, + "output_cost_per_token_above_272k_tokens": 0.0000099, + "output_cost_per_token_priority": 0.0000165, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/us/gpt-5.6-sol": { + "cache_read_input_token_cost": 5.5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.0000011, + "cache_read_input_token_cost_priority": 0.000001375, + "input_cost_per_token": 0.0000055, + "input_cost_per_token_above_272k_tokens": 0.000011, + "input_cost_per_token_priority": 0.00001375, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000033, + "output_cost_per_token_above_272k_tokens": 0.0000495, + "output_cost_per_token_priority": 0.0000825, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/us/gpt-5.6-terra": { + "cache_read_input_token_cost": 2.75e-7, + "cache_read_input_token_cost_above_272k_tokens": 5.5e-7, + "cache_read_input_token_cost_priority": 6.875e-7, + "input_cost_per_token": 0.00000275, + "input_cost_per_token_above_272k_tokens": 0.0000055, + "input_cost_per_token_priority": 0.000006875, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.0000165, + "output_cost_per_token_above_272k_tokens": 0.00002475, + "output_cost_per_token_priority": 0.00004125, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, "azure/us/o1-2024-12-17": { "cache_read_input_token_cost": 0.00000825, "input_cost_per_token": 0.0000165, @@ -4577,6 +5286,7 @@ "supports_reasoning": true }, "azure_ai/claude-fable-5": { + "supports_mid_conversation_system": true, "input_cost_per_token": 0.00001, "output_cost_per_token": 0.00005, "litellm_provider": "azure_ai", @@ -4671,10 +5381,11 @@ "supports_output_config": true }, "azure_ai/claude-opus-4-6": { + "supports_adaptive_thinking": true, "input_cost_per_token": 0.000005, "output_cost_per_token": 0.000025, "litellm_provider": "azure_ai", - "max_input_tokens": 200000, + "max_input_tokens": 1000000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -4699,10 +5410,11 @@ "supports_max_reasoning_effort": true }, "azure_ai/claude-opus-4-7": { + "supports_adaptive_thinking": true, "input_cost_per_token": 0.000005, "output_cost_per_token": 0.000025, "litellm_provider": "azure_ai", - "max_input_tokens": 200000, + "max_input_tokens": 1000000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -4728,10 +5440,12 @@ "supports_max_reasoning_effort": true }, "azure_ai/claude-opus-4-8": { + "supports_mid_conversation_system": true, + "supports_adaptive_thinking": true, "input_cost_per_token": 0.000005, "output_cost_per_token": 0.000025, "litellm_provider": "azure_ai", - "max_input_tokens": 200000, + "max_input_tokens": 1000000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -4743,7 +5457,6 @@ "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, - "supports_adaptive_thinking": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -4757,6 +5470,38 @@ "supports_xhigh_reasoning_effort": true, "supports_max_reasoning_effort": true }, + "azure_ai/claude-opus-5": { + "supports_mid_conversation_system": true, + "supports_adaptive_thinking": true, + "input_cost_per_token": 0.000005, + "output_cost_per_token": 0.000025, + "litellm_provider": "azure_ai", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "cache_creation_input_token_cost": 0.00000625, + "cache_creation_input_token_cost_above_1hr": 0.00001, + "cache_read_input_token_cost": 5e-7, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 512 + }, "azure_ai/claude-sonnet-4-5": { "cache_creation_input_token_cost": 0.00000375, "cache_creation_input_token_cost_above_1hr": 0.000006, @@ -4779,6 +5524,7 @@ "supports_vision": true }, "azure_ai/claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000375, "cache_creation_input_token_cost_above_1hr": 0.000006, "cache_read_input_token_cost": 3e-7, @@ -4801,6 +5547,37 @@ "supports_vision": true, "supports_output_config": true }, + "azure_ai/claude-sonnet-5": { + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 0.0000025, + "cache_creation_input_token_cost_above_1hr": 0.000004, + "cache_read_input_token_cost": 2e-7, + "input_cost_per_token": 0.000002, + "litellm_provider": "azure_ai", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.00001, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true + }, "azure_ai/deepseek-r1": { "input_cost_per_token": 0.00000135, "litellm_provider": "azure_ai", @@ -4974,7 +5751,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -5021,7 +5797,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -5068,7 +5843,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -5115,7 +5889,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -5162,7 +5935,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -5209,7 +5981,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -5256,7 +6027,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -5303,7 +6073,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -6980,7 +7749,9 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_pdf_input": true + "supports_pdf_input": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "bedrock/us-gov-east-1/anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.0000045, @@ -7002,7 +7773,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "bedrock/us-gov-east-1/claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.0000045, @@ -7024,7 +7797,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "bedrock/us-gov-east-1/meta.llama3-70b-instruct-v1:0": { "input_cost_per_token": 0.00000265, @@ -7160,7 +7935,9 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_pdf_input": true + "supports_pdf_input": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "bedrock/us-gov-west-1/anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.0000045, @@ -7182,7 +7959,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "bedrock/us-gov-west-1/claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.0000045, @@ -7204,7 +7983,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "bedrock/us-gov-west-1/meta.llama3-70b-instruct-v1:0": { "input_cost_per_token": 0.00000265, @@ -7468,7 +8249,8 @@ "supports_pdf_input": true, "supports_prompt_caching": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "prompt_cache_min_tokens": 2048 }, "bedrock_mantle/google.gemma-4-26b-a4b": { "input_cost_per_token": 1.3e-7, @@ -7595,6 +8377,27 @@ "supports_response_schema": true, "supports_tool_choice": true }, + "bedrock_mantle/xai.grok-4.3": { + "use_openai_responses_path": true, + "input_cost_per_token": 0.00000125, + "output_cost_per_token": 0.0000025, + "cache_read_input_token_cost": 2e-7, + "litellm_provider": "bedrock_mantle", + "max_input_tokens": 131072, + "max_output_tokens": 16384, + "max_tokens": 16384, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true, + "source": "https://aws.amazon.com/bedrock/pricing/" + }, "cerebras/gpt-oss-120b": { "input_cost_per_token": 3.5e-7, "litellm_provider": "cerebras", @@ -7856,7 +8659,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-4-sonnet-20250514": { "cache_creation_input_token_cost": 0.00000375, @@ -7886,7 +8690,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "prompt_cache_min_tokens": 1024 }, "claude-fable-5": { "cache_creation_input_token_cost": 0.0000125, @@ -7920,7 +8725,8 @@ "provider_specific_entry": { "us": 1.1 }, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 512 }, "claude-haiku-4-5": { "cache_creation_input_token_cost": 0.00000125, @@ -7941,7 +8747,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 4096 }, "claude-haiku-4-5-20251001": { "cache_creation_input_token_cost": 0.00000125, @@ -7962,7 +8769,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 4096 }, "claude-opus-4-1": { "cache_creation_input_token_cost": 0.00001875, @@ -7987,8 +8795,10 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-opus-4-1-20250805": { "cache_creation_input_token_cost": 0.00001875, @@ -8014,8 +8824,10 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-opus-4-20250514": { "cache_creation_input_token_cost": 0.00001875, @@ -8042,7 +8854,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-opus-4-5": { "cache_creation_input_token_cost": 0.00000625, @@ -8067,9 +8880,11 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, "supports_vision": true, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 4096 }, "claude-opus-4-5-20251101": { "cache_creation_input_token_cost": 0.00000625, @@ -8094,9 +8909,11 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, "supports_vision": true, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 4096 }, "claude-opus-4-6": { "cache_creation_input_token_cost": 0.00000625, @@ -8122,6 +8939,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, "supports_vision": true, "provider_specific_entry": { @@ -8129,7 +8947,9 @@ "fast": 6 }, "supports_output_config": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "supports_speed": true, + "prompt_cache_min_tokens": 4096 }, "claude-opus-4-6-20260205": { "cache_creation_input_token_cost": 0.00000625, @@ -8155,6 +8975,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, "supports_vision": true, "provider_specific_entry": { @@ -8162,7 +8983,9 @@ "fast": 6 }, "supports_max_reasoning_effort": true, - "supports_output_config": true + "supports_output_config": true, + "supports_speed": true, + "prompt_cache_min_tokens": 4096 }, "claude-opus-4-7": { "cache_creation_input_token_cost": 0.00000625, @@ -8188,6 +9011,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_sampling_params": false, "supports_tool_choice": true, "supports_vision": true, @@ -8197,7 +9021,9 @@ "us": 1.1, "fast": 6 }, - "supports_output_config": true + "supports_output_config": true, + "supports_speed": true, + "prompt_cache_min_tokens": 2048 }, "claude-opus-4-7-20260416": { "cache_creation_input_token_cost": 0.00000625, @@ -8223,6 +9049,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_sampling_params": false, "supports_tool_choice": true, "supports_vision": true, @@ -8232,7 +9059,9 @@ "us": 1.1, "fast": 6 }, - "supports_output_config": true + "supports_output_config": true, + "supports_speed": true, + "prompt_cache_min_tokens": 2048 }, "claude-opus-4-8": { "cache_creation_input_token_cost": 0.00000625, @@ -8258,6 +9087,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_sampling_params": false, "supports_tool_choice": true, "supports_vision": true, @@ -8267,7 +9097,47 @@ "us": 1.1, "fast": 2 }, - "supports_output_config": true + "supports_output_config": true, + "supports_speed": true, + "prompt_cache_min_tokens": 1024 + }, + "claude-opus-5": { + "cache_creation_input_token_cost": 0.00000625, + "cache_creation_input_token_cost_above_1hr": 0.00001, + "cache_read_input_token_cost": 5e-7, + "input_cost_per_token": 0.000005, + "litellm_provider": "anthropic", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000025, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_native_structured_output": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "provider_specific_entry": { + "us": 1.1, + "fast": 2 + }, + "supports_output_config": true, + "supports_speed": true, + "prompt_cache_min_tokens": 512 }, "claude-sonnet-4-20250514": { "deprecation_date": "2026-05-14", @@ -8298,7 +9168,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-sonnet-4-5": { "cache_creation_input_token_cost": 0.00000375, @@ -8328,8 +9199,10 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-sonnet-4-5-20250929": { "cache_creation_input_token_cost": 0.00000375, @@ -8359,9 +9232,11 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "prompt_cache_min_tokens": 1024 }, "claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.00000375, @@ -8387,7 +9262,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "claude-sonnet-4-6": { "cache_creation_input_token_cost": 0.00000375, @@ -8413,10 +9290,114 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_tool_choice": true, "supports_vision": true, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 1024 + }, + "claude-sonnet-5": { + "cache_creation_input_token_cost": 0.0000025, + "cache_creation_input_token_cost_above_1hr": 0.000004, + "cache_read_input_token_cost": 2e-7, + "input_cost_per_token": 0.000002, + "litellm_provider": "anthropic", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.00001, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "provider_specific_entry": { + "us": 1.1 + }, + "supports_output_config": true, + "prompt_cache_min_tokens": 1024 + }, + "cloudflare/@cf/aisingapore/gemma-sea-lion-v4-27b-it": { + "input_cost_per_token": 3.51e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 5.55e-7 + }, + "cloudflare/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b": { + "input_cost_per_token": 4.97e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 80000, + "max_output_tokens": 80000, + "max_tokens": 80000, + "mode": "chat", + "output_cost_per_token": 0.000004881, + "supports_reasoning": true + }, + "cloudflare/@cf/google/gemma-2b-it-lora": { + "input_cost_per_token": 0, + "litellm_provider": "cloudflare", + "max_input_tokens": 8192, + "max_output_tokens": 8192, + "max_tokens": 8192, + "mode": "chat", + "output_cost_per_token": 0 + }, + "cloudflare/@cf/google/gemma-4-26b-a4b-it": { + "input_cost_per_token": 1e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 256000, + "max_output_tokens": 256000, + "max_tokens": 256000, + "mode": "chat", + "output_cost_per_token": 3e-7, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/google/gemma-7b-it-lora": { + "input_cost_per_token": 0, + "litellm_provider": "cloudflare", + "max_input_tokens": 3500, + "max_output_tokens": 3500, + "max_tokens": 3500, + "mode": "chat", + "output_cost_per_token": 0 + }, + "cloudflare/@cf/ibm-granite/granite-4.0-h-micro": { + "input_cost_per_token": 1.7e-8, + "litellm_provider": "cloudflare", + "max_input_tokens": 131000, + "max_output_tokens": 131000, + "max_tokens": 131000, + "mode": "chat", + "output_cost_per_token": 1.12e-7, + "supports_function_calling": true + }, + "cloudflare/@cf/meta-llama/llama-2-7b-chat-hf-lora": { + "input_cost_per_token": 0, + "litellm_provider": "cloudflare", + "max_input_tokens": 8192, + "max_output_tokens": 8192, + "max_tokens": 8192, + "mode": "chat", + "output_cost_per_token": 0 }, "cloudflare/@cf/meta/llama-2-7b-chat-fp16": { "input_cost_per_token": 0.000001923, @@ -8436,6 +9417,72 @@ "mode": "chat", "output_cost_per_token": 0.000001923 }, + "cloudflare/@cf/meta/llama-3.1-8b-instruct-fp8": { + "input_cost_per_token": 1.52e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 32000, + "max_output_tokens": 32000, + "max_tokens": 32000, + "mode": "chat", + "output_cost_per_token": 2.87e-7 + }, + "cloudflare/@cf/meta/llama-3.2-11b-vision-instruct": { + "input_cost_per_token": 4.85e-8, + "litellm_provider": "cloudflare", + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 6.76e-7, + "supports_vision": true + }, + "cloudflare/@cf/meta/llama-3.2-1b-instruct": { + "input_cost_per_token": 2.7e-8, + "litellm_provider": "cloudflare", + "max_input_tokens": 60000, + "max_output_tokens": 60000, + "max_tokens": 60000, + "mode": "chat", + "output_cost_per_token": 2.01e-7 + }, + "cloudflare/@cf/meta/llama-3.2-3b-instruct": { + "input_cost_per_token": 5.09e-8, + "litellm_provider": "cloudflare", + "max_input_tokens": 80000, + "max_output_tokens": 80000, + "max_tokens": 80000, + "mode": "chat", + "output_cost_per_token": 3.35e-7 + }, + "cloudflare/@cf/meta/llama-3.3-70b-instruct-fp8-fast": { + "input_cost_per_token": 2.93e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 24000, + "max_output_tokens": 24000, + "max_tokens": 24000, + "mode": "chat", + "output_cost_per_token": 0.000002253, + "supports_function_calling": true + }, + "cloudflare/@cf/meta/llama-4-scout-17b-16e-instruct": { + "input_cost_per_token": 2.7e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 131000, + "max_output_tokens": 131000, + "max_tokens": 131000, + "mode": "chat", + "output_cost_per_token": 8.5e-7, + "supports_function_calling": true + }, + "cloudflare/@cf/meta/llama-guard-3-8b": { + "input_cost_per_token": 4.84e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 3e-8 + }, "cloudflare/@cf/mistral/mistral-7b-instruct-v0.1": { "input_cost_per_token": 0.000001923, "litellm_provider": "cloudflare", @@ -8445,6 +9492,135 @@ "mode": "chat", "output_cost_per_token": 0.000001923 }, + "cloudflare/@cf/mistral/mistral-7b-instruct-v0.2-lora": { + "input_cost_per_token": 0, + "litellm_provider": "cloudflare", + "max_input_tokens": 15000, + "max_output_tokens": 15000, + "max_tokens": 15000, + "mode": "chat", + "output_cost_per_token": 0 + }, + "cloudflare/@cf/mistralai/mistral-small-3.1-24b-instruct": { + "input_cost_per_token": 3.51e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 5.55e-7, + "supports_function_calling": true + }, + "cloudflare/@cf/moonshotai/kimi-k2.6": { + "cache_read_input_token_cost": 1.6e-7, + "input_cost_per_token": 9.5e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 0.000004, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/moonshotai/kimi-k2.7-code": { + "cache_read_input_token_cost": 1.9e-7, + "input_cost_per_token": 9.5e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 0.000004, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/nvidia/nemotron-3-120b-a12b": { + "input_cost_per_token": 5e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 256000, + "max_output_tokens": 256000, + "max_tokens": 256000, + "mode": "chat", + "output_cost_per_token": 0.0000015, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/openai/gpt-oss-120b": { + "input_cost_per_token": 3.5e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 7.5e-7, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/openai/gpt-oss-20b": { + "input_cost_per_token": 2e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3e-7, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/qwen/qwen2.5-coder-32b-instruct": { + "input_cost_per_token": 6.6e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 32768, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 0.000001 + }, + "cloudflare/@cf/qwen/qwen3-30b-a3b-fp8": { + "input_cost_per_token": 5.09e-8, + "litellm_provider": "cloudflare", + "max_input_tokens": 32768, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 3.35e-7, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/qwen/qwq-32b": { + "input_cost_per_token": 6.6e-7, + "litellm_provider": "cloudflare", + "max_input_tokens": 24000, + "max_output_tokens": 24000, + "max_tokens": 24000, + "mode": "chat", + "output_cost_per_token": 0.000001, + "supports_reasoning": true + }, + "cloudflare/@cf/zai-org/glm-4.7-flash": { + "input_cost_per_token": 6.05e-8, + "litellm_provider": "cloudflare", + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 4e-7, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/zai-org/glm-5.2": { + "cache_read_input_token_cost": 2.6e-7, + "input_cost_per_token": 0.0000014, + "litellm_provider": "cloudflare", + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 0.0000044, + "supports_function_calling": true, + "supports_reasoning": true + }, "cloudflare/@hf/thebloke/codellama-7b-instruct-awq": { "input_cost_per_token": 0.000001923, "litellm_provider": "cloudflare", @@ -8714,6 +9890,40 @@ "supports_system_messages": true, "supports_tool_choice": true }, + "darkbloom/gemma-4-26b": { + "input_cost_per_token": 3e-8, + "litellm_provider": "darkbloom", + "max_input_tokens": 131072, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 1.65e-7, + "source": "https://www.darkbloom.dev/", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "darkbloom/gpt-oss-20b": { + "input_cost_per_token": 1.45e-8, + "litellm_provider": "darkbloom", + "max_input_tokens": 131072, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 7e-8, + "source": "https://www.darkbloom.dev/", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, "dashscope/qwen-coder": { "input_cost_per_token": 3e-7, "litellm_provider": "dashscope", @@ -10751,6 +11961,7 @@ "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_prompt_caching": true, + "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, @@ -10776,6 +11987,7 @@ "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_prompt_caching": true, + "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, @@ -10935,6 +12147,7 @@ "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_prompt_caching": true, + "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, @@ -10960,6 +12173,7 @@ "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_prompt_caching": true, + "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, @@ -11057,7 +12271,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "cache_read_input_token_cost": 2.5e-8, - "cache_creation_input_token_cost": 3.125e-7 + "cache_creation_input_token_cost": 3.125e-7, + "prompt_cache_min_tokens": 2048 }, "eu.anthropic.claude-3-5-sonnet-20240620-v1:0": { "input_cost_per_token": 0.000003, @@ -11178,6 +12393,7 @@ "search_context_size_medium": 0.01 }, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -11192,7 +12408,9 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 0.000001375, @@ -11216,7 +12434,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "eu.anthropic.claude-opus-4-1-20250805-v1:0": { "cache_creation_input_token_cost": 0.00001875, @@ -11241,7 +12461,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-opus-4-20250514-v1:0": { "cache_creation_input_token_cost": 0.00001875, @@ -11266,7 +12487,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-opus-4-5-20251101-v1:0": { "cache_creation_input_token_cost": 0.00000625, @@ -11294,9 +12516,12 @@ "supports_vision": true, "supports_native_structured_output": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "high" + "bedrock_output_config_effort_ceiling": "high", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "eu.anthropic.claude-opus-4-6-v1": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.000006875, "cache_creation_input_token_cost_above_1hr": 0.000011, "cache_read_input_token_cost": 5.5e-7, @@ -11324,9 +12549,13 @@ "supports_native_structured_output": true, "supports_output_config": true, "supports_max_reasoning_effort": true, - "bedrock_output_config_effort_ceiling": "max" + "bedrock_output_config_effort_ceiling": "max", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "eu.anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.000006875, "cache_creation_input_token_cost_above_1hr": 0.000011, "cache_read_input_token_cost": 5.5e-7, @@ -11356,9 +12585,14 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 }, "eu.anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 0.000006875, "cache_creation_input_token_cost_above_1hr": 0.000011, "cache_read_input_token_cost": 5.5e-7, @@ -11374,7 +12608,43 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "eu.anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 0.000006875, + "cache_creation_input_token_cost_above_1hr": 0.000011, + "cache_read_input_token_cost": 5.5e-7, + "input_cost_per_token": 0.0000055, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.0000275, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -11389,7 +12659,8 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 }, "eu.anthropic.claude-sonnet-4-20250514-v1:0": { "cache_creation_input_token_cost": 0.00000375, @@ -11418,7 +12689,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "bedrock_converse_supports_strict_tools": false, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.000004125, @@ -11450,9 +12723,12 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.000004125, "cache_creation_input_token_cost_above_1hr": 0.0000066, "cache_read_input_token_cost": 3.3e-7, @@ -11479,7 +12755,45 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "eu.anthropic.claude-sonnet-5": { + "cache_creation_input_token_cost": 0.00000275, + "cache_creation_input_token_cost_above_1hr": 0.0000044, + "cache_read_input_token_cost": 2.2e-7, + "input_cost_per_token": 0.0000022, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000011, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "eu.deepseek.v3.2": { "input_cost_per_token": 7.4e-7, @@ -12320,7 +13634,7 @@ "supports_vision": false }, "fireworks_ai/accounts/fireworks/models/glm-5p2": { - "cache_read_input_token_cost": 2.6e-7, + "cache_read_input_token_cost": 1.4e-7, "input_cost_per_token": 0.0000014, "litellm_provider": "fireworks_ai", "max_input_tokens": 1048576, @@ -14133,7 +15447,7 @@ "supports_vision": false }, "fireworks_ai/glm-5p2": { - "cache_read_input_token_cost": 2.6e-7, + "cache_read_input_token_cost": 1.4e-7, "input_cost_per_token": 0.0000014, "litellm_provider": "fireworks_ai", "max_input_tokens": 1048576, @@ -14541,15 +15855,9 @@ "input_cost_per_audio_token": 7e-7, "input_cost_per_token": 1e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 4e-7, "source": "https://ai.google.dev/pricing#2_0flash", @@ -14586,15 +15894,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 1.5e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 6e-7, "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", @@ -14629,14 +15931,8 @@ "input_cost_per_audio_token": 7.5e-8, "input_cost_per_token": 7.5e-8, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 50, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 3e-7, "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-2.0-flash", @@ -14670,14 +15966,8 @@ "input_cost_per_audio_token": 7.5e-8, "input_cost_per_token": 7.5e-8, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 50, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 3e-7, "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-2.0-flash", @@ -14709,7 +15999,6 @@ "input_cost_per_token": 0.00000125, "input_cost_per_token_above_200k_tokens": 0.0000025, "litellm_provider": "vertex_ai-language-models", - "max_images_per_prompt": 3000, "max_input_tokens": 128000, "max_output_tokens": 64000, "max_tokens": 64000, @@ -14735,15 +16024,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 3e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000025, "output_cost_per_token": 0.0000025, @@ -14779,7 +16062,6 @@ "search_context_size_medium": 0.035, "search_context_size_high": 0.035 }, - "supports_service_tier": true, "supports_image_size": false }, "gemini-2.5-flash-image": { @@ -14787,15 +16069,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 3e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 32768, "max_output_tokens": 32768, "max_tokens": 32768, - "max_pdf_size_mb": 30, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "image_generation", "output_cost_per_image": 0.039, "output_cost_per_image_token": 0.00003, @@ -14830,7 +16106,6 @@ "supports_vision": true, "supports_web_search": false, "tpm": 8000000, - "supports_service_tier": true, "supports_image_size": false }, "gemini-2.5-flash-lite": { @@ -14838,15 +16113,9 @@ "input_cost_per_audio_token": 3e-7, "input_cost_per_token": 1e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-7, "output_cost_per_token": 4e-7, @@ -14882,7 +16151,6 @@ "search_context_size_medium": 0.035, "search_context_size_high": 0.035 }, - "supports_service_tier": true, "supports_image_size": false }, "gemini-2.5-flash-lite-preview-06-17": { @@ -14891,15 +16159,9 @@ "input_cost_per_audio_token": 5e-7, "input_cost_per_token": 1e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-7, "output_cost_per_token": 4e-7, @@ -14942,15 +16204,9 @@ "input_cost_per_audio_token": 3e-7, "input_cost_per_token": 1e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-7, "output_cost_per_token": 4e-7, @@ -15010,7 +16266,8 @@ "audio" ], "supports_audio_input": true, - "supports_audio_output": true + "supports_audio_output": true, + "gemini_native_audio": true }, "gemini-2.5-flash-native-audio-preview-09-2025": { "input_cost_per_audio_token": 0.000001, @@ -15034,7 +16291,8 @@ "audio" ], "supports_audio_input": true, - "supports_audio_output": true + "supports_audio_output": true, + "gemini_native_audio": true }, "gemini-2.5-flash-native-audio-preview-12-2025": { "input_cost_per_audio_token": 0.000001, @@ -15058,22 +16316,17 @@ "audio" ], "supports_audio_input": true, - "supports_audio_output": true + "supports_audio_output": true, + "gemini_native_audio": true }, "gemini-2.5-flash-preview-09-2025": { "cache_read_input_token_cost": 7.5e-8, "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 3e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000025, "output_cost_per_token": 0.0000025, @@ -15118,15 +16371,9 @@ "input_cost_per_token": 0.00000125, "input_cost_per_token_above_200k_tokens": 0.0000025, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.00001, "output_cost_per_token_above_200k_tokens": 0.000015, @@ -15159,8 +16406,7 @@ "search_context_size_low": 0.035, "search_context_size_medium": 0.035, "search_context_size_high": 0.035 - }, - "supports_service_tier": true + } }, "gemini-2.5-pro-preview-tts": { "cache_read_input_token_cost": 1.25e-7, @@ -15169,15 +16415,9 @@ "input_cost_per_token": 0.00000125, "input_cost_per_token_above_200k_tokens": 0.0000025, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.00001, "output_cost_per_token_above_200k_tokens": 0.000015, @@ -15208,15 +16448,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 5e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.000003, "output_cost_per_token": 0.000003, @@ -15252,7 +16486,46 @@ "input_cost_per_audio_token_priority": 0.0000018, "output_cost_per_token_priority": 0.0000054, "cache_read_input_token_cost_priority": 9e-8, - "supports_service_tier": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "gemini-3-pro-image": { + "input_cost_per_image": 0.0011, + "input_cost_per_token": 0.000002, + "input_cost_per_token_batches": 0.000001, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.134, + "output_cost_per_image_token": 0.00012, + "output_cost_per_token": 0.000012, + "output_cost_per_token_batches": 0.000006, + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3-pro-image", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text", + "image" + ], + "supports_function_calling": false, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_vision": true, + "supports_web_search": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -15298,8 +16571,7 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" }, "gemini-3-pro-preview": { "deprecation_date": "2026-03-26", @@ -15310,15 +16582,9 @@ "input_cost_per_token_above_200k_tokens": 0.000004, "input_cost_per_token_batches": 0.000001, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.000012, "output_cost_per_token_above_200k_tokens": 0.000018, @@ -15356,7 +16622,44 @@ "output_cost_per_token_above_200k_tokens_priority": 0.0000324, "cache_read_input_token_cost_priority": 3.6e-7, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7, - "supports_service_tier": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "gemini-3.1-flash-image": { + "input_cost_per_image": 0.00056, + "input_cost_per_token": 5e-7, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.0672, + "output_cost_per_image_token": 0.00006, + "output_cost_per_token": 0.000003, + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text", + "image" + ], + "supports_function_calling": false, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_vision": true, + "supports_web_search": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -15404,9 +16707,7 @@ }, "gemini-3.1-flash-lite": { "cache_read_input_token_cost": 2.5e-8, - "cache_read_input_token_cost_batches": 1.25e-8, "cache_read_input_token_cost_flex": 1.25e-8, - "cache_read_input_token_cost_per_audio_token": 5e-8, "cache_read_input_token_cost_priority": 4.5e-8, "input_cost_per_audio_token": 5e-7, "input_cost_per_token": 2.5e-7, @@ -15414,15 +16715,9 @@ "input_cost_per_token_flex": 1.25e-7, "input_cost_per_token_priority": 4.5e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000015, "output_cost_per_token": 0.0000015, @@ -15446,8 +16741,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -15466,24 +16759,16 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" }, "gemini-3.1-flash-lite-preview": { "cache_read_input_token_cost": 2.5e-8, - "cache_read_input_token_cost_per_audio_token": 5e-8, "input_cost_per_audio_token": 5e-7, "input_cost_per_token": 2.5e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000015, "output_cost_per_token": 0.0000015, @@ -15504,8 +16789,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -15524,8 +16807,7 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" }, "gemini-3.1-flash-live-preview": { "input_cost_per_audio_token": 0.000003, @@ -15557,7 +16839,8 @@ "supports_audio_output": true, "supports_function_calling": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "gemini_audio_only_live": true }, "gemini-3.1-pro-preview": { "cache_read_input_token_cost": 2e-7, @@ -15567,15 +16850,9 @@ "input_cost_per_token_above_200k_tokens": 0.000004, "input_cost_per_token_batches": 0.000001, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.000012, "output_cost_per_token_above_200k_tokens": 0.000018, @@ -15609,13 +16886,63 @@ "supports_web_search": true, "supports_url_context": true, "supports_native_streaming": true, - "input_cost_per_token_priority": 0.0000036, - "input_cost_per_token_above_200k_tokens_priority": 0.0000072, - "output_cost_per_token_priority": 0.0000216, - "output_cost_per_token_above_200k_tokens_priority": 0.0000324, - "cache_read_input_token_cost_priority": 3.6e-7, - "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7, - "supports_service_tier": true, + "input_cost_per_token_priority": 0.0000036, + "input_cost_per_token_above_200k_tokens_priority": 0.0000072, + "output_cost_per_token_priority": 0.0000216, + "output_cost_per_token_above_200k_tokens_priority": 0.0000324, + "cache_read_input_token_cost_priority": 3.6e-7, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "gemini-3.1-pro-preview-customtools": { + "cache_read_input_token_cost": 2e-7, + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token": 0.000002, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_token": 0.000012, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006, + "output_cost_per_image": 0.00012, + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_url_context": true, + "supports_native_streaming": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -15623,29 +16950,77 @@ }, "web_search_billing_unit": "per_query" }, - "gemini-3.1-pro-preview-customtools": { - "cache_read_input_token_cost": 2e-7, - "cache_read_input_token_cost_above_200k_tokens": 4e-7, - "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, - "input_cost_per_token": 0.000002, - "input_cost_per_token_above_200k_tokens": 0.000004, - "input_cost_per_token_batches": 0.000001, + "gemini-3.5-flash": { + "cache_read_input_token_cost": 1.5e-7, + "input_cost_per_audio_token": 0.000001, + "input_cost_per_token": 0.0000015, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 1048576, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "output_cost_per_reasoning_token": 0.000009, + "output_cost_per_token": 0.000009, + "source": "https://ai.google.dev/pricing/gemini-3", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_output": false, + "supports_audio_input": true, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_native_streaming": true, + "input_cost_per_token_priority": 0.0000027, + "input_cost_per_audio_token_priority": 0.0000018, + "output_cost_per_token_priority": 0.0000162, + "cache_read_input_token_cost_priority": 2.7e-7, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "gemini-3.5-flash-lite": { + "cache_read_input_token_cost": 3e-8, + "cache_read_input_token_cost_flex": 2e-8, + "cache_read_input_token_cost_priority": 5e-8, + "input_cost_per_token": 3e-7, + "input_cost_per_token_batches": 1.5e-7, + "input_cost_per_token_flex": 1.5e-7, + "input_cost_per_token_priority": 5.4e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", - "output_cost_per_token": 0.000012, - "output_cost_per_token_above_200k_tokens": 0.000018, - "output_cost_per_token_batches": 0.000006, - "output_cost_per_image": 0.00012, - "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "output_cost_per_reasoning_token": 0.0000025, + "output_cost_per_token": 0.0000025, + "output_cost_per_token_batches": 0.00000125, + "output_cost_per_token_flex": 0.00000125, + "output_cost_per_token_priority": 0.0000045, + "source": "https://ai.google.dev/gemini-api/docs/pricing", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -15661,17 +17036,19 @@ "text" ], "supports_audio_input": true, + "supports_audio_output": false, "supports_function_calling": true, + "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, + "supports_url_context": true, "supports_video_input": true, "supports_vision": true, "supports_web_search": true, - "supports_url_context": true, "supports_native_streaming": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, @@ -15680,23 +17057,21 @@ }, "web_search_billing_unit": "per_query" }, - "gemini-3.5-flash": { + "gemini-3.6-flash": { "cache_read_input_token_cost": 1.5e-7, - "input_cost_per_audio_token": 0.000001, + "cache_read_input_token_cost_flex": 7.5e-8, "input_cost_per_token": 0.0000015, + "input_cost_per_token_batches": 7.5e-7, + "input_cost_per_token_flex": 7.5e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, - "max_output_tokens": 65535, - "max_pdf_size_mb": 30, - "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, + "max_output_tokens": 65536, + "max_tokens": 65536, "mode": "chat", - "output_cost_per_reasoning_token": 0.000009, - "output_cost_per_token": 0.000009, + "output_cost_per_reasoning_token": 0.0000075, + "output_cost_per_token": 0.0000075, + "output_cost_per_token_batches": 0.00000375, + "output_cost_per_token_flex": 0.00000375, "source": "https://ai.google.dev/pricing/gemini-3", "supported_endpoints": [ "/v1/chat/completions", @@ -15728,10 +17103,8 @@ "supports_web_search": true, "supports_native_streaming": true, "input_cost_per_token_priority": 0.0000027, - "input_cost_per_audio_token_priority": 0.0000018, - "output_cost_per_token_priority": 0.0000162, + "output_cost_per_token_priority": 0.0000135, "cache_read_input_token_cost_priority": 2.7e-7, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -15744,15 +17117,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 3e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000025, "output_cost_per_token": 0.0000025, @@ -15796,15 +17163,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 3e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000025, "output_cost_per_token": 0.0000025, @@ -15848,15 +17209,9 @@ "input_cost_per_audio_token": 3e-7, "input_cost_per_token": 1e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-7, "output_cost_per_token": 4e-7, @@ -15895,21 +17250,46 @@ "search_context_size_high": 0.035 } }, + "gemini-omni-flash-preview": { + "input_cost_per_audio_token": 0.0000015, + "input_cost_per_token": 0.0000015, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 1048576, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "output_cost_per_reasoning_token": 0.000009, + "output_cost_per_token": 0.000009, + "output_cost_per_video_token": 0.0000175, + "source": "https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/omni-flash-preview", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text", + "video" + ], + "supports_audio_input": true, + "supports_reasoning": true, + "supports_system_messages": true, + "supports_video_input": true, + "supports_vision": true + }, "gemini-pro-latest": { "cache_read_input_token_cost": 1.25e-7, "cache_read_input_token_cost_above_200k_tokens": 2.5e-7, "input_cost_per_token": 0.00000125, "input_cost_per_token_above_200k_tokens": 0.0000025, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.00001, "output_cost_per_token_above_200k_tokens": 0.000015, @@ -16029,15 +17409,9 @@ "input_cost_per_audio_token": 7e-7, "input_cost_per_token": 1e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 4e-7, "rpm": 10000, @@ -16075,15 +17449,9 @@ "input_cost_per_audio_token": 7e-7, "input_cost_per_token": 1e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 4e-7, "rpm": 10000, @@ -16119,14 +17487,8 @@ "input_cost_per_audio_token": 7.5e-8, "input_cost_per_token": 7.5e-8, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 50, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 3e-7, "rpm": 4000, @@ -16161,14 +17523,8 @@ "input_cost_per_audio_token": 7.5e-8, "input_cost_per_token": 7.5e-8, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 50, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 3e-7, "rpm": 4000, @@ -16201,7 +17557,6 @@ "input_cost_per_token": 0.00000125, "input_cost_per_token_above_200k_tokens": 0.0000025, "litellm_provider": "gemini", - "max_images_per_prompt": 3000, "max_input_tokens": 128000, "max_output_tokens": 64000, "max_tokens": 64000, @@ -16233,15 +17588,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 3e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000025, "output_cost_per_token": 0.0000025, @@ -16279,7 +17628,6 @@ "search_context_size_medium": 0.035, "search_context_size_high": 0.035 }, - "supports_service_tier": true, "supports_image_size": false }, "gemini/gemini-2.5-flash-image": { @@ -16287,16 +17635,10 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 3e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, "supports_reasoning": false, - "max_images_per_prompt": 3000, "max_input_tokens": 32768, "max_output_tokens": 32768, "max_tokens": 32768, - "max_pdf_size_mb": 30, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "image_generation", "output_cost_per_image": 0.039, "output_cost_per_image_token": 0.00003, @@ -16336,7 +17678,6 @@ "search_context_size_medium": 0.035, "search_context_size_high": 0.035 }, - "supports_service_tier": true, "supports_image_size": false }, "gemini/gemini-2.5-flash-lite": { @@ -16344,15 +17685,9 @@ "input_cost_per_audio_token": 3e-7, "input_cost_per_token": 1e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-7, "output_cost_per_token": 4e-7, @@ -16390,7 +17725,6 @@ "search_context_size_medium": 0.035, "search_context_size_high": 0.035 }, - "supports_service_tier": true, "supports_image_size": false }, "gemini/gemini-2.5-flash-lite-preview-06-17": { @@ -16399,15 +17733,9 @@ "input_cost_per_audio_token": 5e-7, "input_cost_per_token": 1e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-7, "output_cost_per_token": 4e-7, @@ -16452,15 +17780,9 @@ "input_cost_per_audio_token": 3e-7, "input_cost_per_token": 1e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-7, "output_cost_per_token": 4e-7, @@ -16524,7 +17846,8 @@ "supports_audio_input": true, "supports_audio_output": true, "tpm": 250000, - "rpm": 10 + "rpm": 10, + "gemini_native_audio": true }, "gemini/gemini-2.5-flash-native-audio-preview-09-2025": { "input_cost_per_audio_token": 0.000001, @@ -16550,7 +17873,8 @@ "supports_audio_input": true, "supports_audio_output": true, "tpm": 250000, - "rpm": 10 + "rpm": 10, + "gemini_native_audio": true }, "gemini/gemini-2.5-flash-native-audio-preview-12-2025": { "input_cost_per_audio_token": 0.000001, @@ -16576,22 +17900,17 @@ "supports_audio_input": true, "supports_audio_output": true, "tpm": 250000, - "rpm": 10 + "rpm": 10, + "gemini_native_audio": true }, "gemini/gemini-2.5-flash-preview-09-2025": { "cache_read_input_token_cost": 7.5e-8, "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 3e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000025, "output_cost_per_token": 0.0000025, @@ -16639,15 +17958,9 @@ "input_cost_per_token_priority": 0.00000125, "input_cost_per_token_above_200k_tokens_priority": 0.0000025, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.00001, "output_cost_per_token_above_200k_tokens": 0.000015, @@ -16655,7 +17968,6 @@ "output_cost_per_token_above_200k_tokens_priority": 0.000015, "rpm": 2000, "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", - "supports_service_tier": true, "supported_endpoints": [ "/v1/chat/completions", "/v1/completions" @@ -16694,15 +18006,9 @@ "input_cost_per_token": 0.00000125, "input_cost_per_token_above_200k_tokens": 0.0000025, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.00001, "output_cost_per_token_above_200k_tokens": 0.000015, @@ -16734,15 +18040,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 5e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.000003, "output_cost_per_token": 0.000003, @@ -16780,7 +18080,6 @@ "input_cost_per_audio_token_priority": 0.0000018, "output_cost_per_token_priority": 0.0000054, "cache_read_input_token_cost_priority": 9e-8, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -16788,6 +18087,49 @@ }, "web_search_billing_unit": "per_query" }, + "gemini/gemini-3-pro-image": { + "input_cost_per_image": 0.0011, + "input_cost_per_token": 0.000002, + "input_cost_per_token_batches": 0.000001, + "litellm_provider": "gemini", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.134, + "output_cost_per_image_token": 0.00012, + "output_cost_per_token": 0.000012, + "rpm": 1000, + "tpm": 4000000, + "output_cost_per_token_batches": 0.000006, + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3-pro-image", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text", + "image" + ], + "supports_function_calling": false, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_vision": true, + "supports_web_search": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query", + "supports_reasoning": false + }, "gemini/gemini-3-pro-image-preview": { "input_cost_per_image": 0.0011, "input_cost_per_token": 0.000002, @@ -16819,6 +18161,7 @@ ], "supports_function_calling": false, "supports_prompt_caching": true, + "supports_reasoning": false, "supports_response_schema": true, "supports_system_messages": true, "supports_vision": true, @@ -16828,8 +18171,7 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" }, "gemini/gemini-3-pro-preview": { "deprecation_date": "2026-03-09", @@ -16839,15 +18181,9 @@ "input_cost_per_token_above_200k_tokens": 0.000004, "input_cost_per_token_batches": 0.000001, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.000012, "output_cost_per_token_above_200k_tokens": 0.000018, @@ -16886,7 +18222,48 @@ "output_cost_per_token_above_200k_tokens_priority": 0.0000324, "cache_read_input_token_cost_priority": 3.6e-7, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7, - "supports_service_tier": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "gemini/gemini-3.1-flash-image": { + "input_cost_per_token": 2.5e-7, + "input_cost_per_token_batches": 1.25e-7, + "litellm_provider": "gemini", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.045, + "output_cost_per_image_token": 0.00006, + "output_cost_per_token": 0.0000015, + "output_cost_per_token_batches": 7.5e-7, + "rpm": 1000, + "tpm": 4000000, + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3.1-flash-image", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text", + "image" + ], + "supports_function_calling": false, + "supports_prompt_caching": true, + "supports_reasoning": false, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_vision": true, + "supports_web_search": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -16904,7 +18281,6 @@ "mode": "image_generation", "output_cost_per_image": 0.045, "output_cost_per_image_token": 0.00006, - "output_cost_per_image_token_batches": 0.00003, "output_cost_per_token": 0.0000015, "output_cost_per_token_batches": 7.5e-7, "rpm": 1000, @@ -16925,6 +18301,7 @@ ], "supports_function_calling": false, "supports_prompt_caching": true, + "supports_reasoning": false, "supports_response_schema": true, "supports_system_messages": true, "supports_vision": true, @@ -16938,9 +18315,7 @@ }, "gemini/gemini-3.1-flash-lite": { "cache_read_input_token_cost": 2.5e-8, - "cache_read_input_token_cost_batches": 1.25e-8, "cache_read_input_token_cost_flex": 1.25e-8, - "cache_read_input_token_cost_per_audio_token": 5e-8, "cache_read_input_token_cost_priority": 4.5e-8, "input_cost_per_audio_token": 5e-7, "input_cost_per_token": 2.5e-7, @@ -16948,15 +18323,9 @@ "input_cost_per_token_flex": 1.25e-7, "input_cost_per_token_priority": 4.5e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000015, "output_cost_per_token": 0.0000015, @@ -16981,8 +18350,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -17002,24 +18369,16 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" }, "gemini/gemini-3.1-flash-lite-preview": { "cache_read_input_token_cost": 2.5e-8, - "cache_read_input_token_cost_per_audio_token": 5e-8, "input_cost_per_audio_token": 5e-7, "input_cost_per_token": 2.5e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000015, "output_cost_per_token": 0.0000015, @@ -17041,8 +18400,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -17062,8 +18419,7 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" }, "gemini/gemini-3.1-flash-live-preview": { "input_cost_per_audio_token": 0.000003, @@ -17097,7 +18453,8 @@ "supports_vision": true, "supports_web_search": true, "tpm": 250000, - "rpm": 10 + "rpm": 10, + "gemini_audio_only_live": true }, "gemini/gemini-3.1-pro-preview": { "cache_read_input_token_cost": 2e-7, @@ -17106,15 +18463,9 @@ "input_cost_per_token_above_200k_tokens": 0.000004, "input_cost_per_token_batches": 0.000001, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.000012, "output_cost_per_token_above_200k_tokens": 0.000018, @@ -17155,7 +18506,6 @@ "output_cost_per_token_above_200k_tokens_priority": 0.0000324, "cache_read_input_token_cost_priority": 3.6e-7, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -17163,28 +18513,76 @@ }, "web_search_billing_unit": "per_query" }, - "gemini/gemini-3.1-pro-preview-customtools": { - "cache_read_input_token_cost": 2e-7, - "cache_read_input_token_cost_above_200k_tokens": 4e-7, - "input_cost_per_token": 0.000002, - "input_cost_per_token_above_200k_tokens": 0.000004, - "input_cost_per_token_batches": 0.000001, + "gemini/gemini-3.1-pro-preview-customtools": { + "cache_read_input_token_cost": 2e-7, + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "input_cost_per_token": 0.000002, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "litellm_provider": "gemini", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_token": 0.000012, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006, + "rpm": 2000, + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-3.1-pro-preview", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_url_context": true, + "supports_native_streaming": true, + "tpm": 800000, + "input_cost_per_token_priority": 0.0000036, + "input_cost_per_token_above_200k_tokens_priority": 0.0000072, + "output_cost_per_token_priority": 0.0000216, + "output_cost_per_token_above_200k_tokens_priority": 0.0000324, + "cache_read_input_token_cost_priority": 3.6e-7, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "gemini/gemini-3.5-flash": { + "cache_read_input_token_cost": 1.5e-7, + "input_cost_per_audio_token": 0.000001, + "input_cost_per_token": 0.0000015, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, - "max_output_tokens": 65536, - "max_pdf_size_mb": 30, - "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, + "max_output_tokens": 65535, + "max_tokens": 65535, "mode": "chat", - "output_cost_per_token": 0.000012, - "output_cost_per_token_above_200k_tokens": 0.000018, - "output_cost_per_token_batches": 0.000006, + "output_cost_per_reasoning_token": 0.000009, + "output_cost_per_token": 0.000009, "rpm": 2000, - "source": "https://ai.google.dev/gemini-api/docs/models#gemini-3.1-pro-preview", + "source": "https://ai.google.dev/pricing/gemini-3", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -17199,27 +18597,26 @@ "supported_output_modalities": [ "text" ], + "supports_audio_output": false, "supports_audio_input": true, "supports_function_calling": true, + "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, + "supports_url_context": true, "supports_video_input": true, "supports_vision": true, "supports_web_search": true, - "supports_url_context": true, "supports_native_streaming": true, "tpm": 800000, - "input_cost_per_token_priority": 0.0000036, - "input_cost_per_token_above_200k_tokens_priority": 0.0000072, - "output_cost_per_token_priority": 0.0000216, - "output_cost_per_token_above_200k_tokens_priority": 0.0000324, - "cache_read_input_token_cost_priority": 3.6e-7, - "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7, - "supports_service_tier": true, + "input_cost_per_token_priority": 0.0000027, + "input_cost_per_audio_token_priority": 0.0000018, + "output_cost_per_token_priority": 0.0000162, + "cache_read_input_token_cost_priority": 2.7e-7, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -17227,23 +18624,78 @@ }, "web_search_billing_unit": "per_query" }, - "gemini/gemini-3.5-flash": { + "gemini/gemini-3.5-flash-lite": { + "cache_read_input_token_cost": 3e-8, + "cache_read_input_token_cost_flex": 2e-8, + "cache_read_input_token_cost_priority": 5e-8, + "input_cost_per_token": 3e-7, + "input_cost_per_token_batches": 1.5e-7, + "input_cost_per_token_flex": 1.5e-7, + "input_cost_per_token_priority": 5.4e-7, + "litellm_provider": "gemini", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_reasoning_token": 0.0000025, + "output_cost_per_token": 0.0000025, + "output_cost_per_token_batches": 0.00000125, + "output_cost_per_token_flex": 0.00000125, + "output_cost_per_token_priority": 0.0000045, + "rpm": 15, + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_audio_output": false, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_native_streaming": true, + "tpm": 250000, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "gemini/gemini-3.6-flash": { "cache_read_input_token_cost": 1.5e-7, - "input_cost_per_audio_token": 0.000001, + "cache_read_input_token_cost_flex": 7.5e-8, "input_cost_per_token": 0.0000015, + "input_cost_per_token_batches": 7.5e-7, + "input_cost_per_token_flex": 7.5e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, - "max_output_tokens": 65535, - "max_pdf_size_mb": 30, - "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, + "max_output_tokens": 65536, + "max_tokens": 65536, "mode": "chat", - "output_cost_per_reasoning_token": 0.000009, - "output_cost_per_token": 0.000009, + "output_cost_per_reasoning_token": 0.0000075, + "output_cost_per_token": 0.0000075, + "output_cost_per_token_batches": 0.00000375, + "output_cost_per_token_flex": 0.00000375, "rpm": 2000, "source": "https://ai.google.dev/pricing/gemini-3", "supported_endpoints": [ @@ -17277,10 +18729,8 @@ "supports_native_streaming": true, "tpm": 800000, "input_cost_per_token_priority": 0.0000027, - "input_cost_per_audio_token_priority": 0.0000018, - "output_cost_per_token_priority": 0.0000162, + "output_cost_per_token_priority": 0.0000135, "cache_read_input_token_cost_priority": 2.7e-7, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -17292,15 +18742,9 @@ "input_cost_per_token": 0, "input_cost_per_token_above_128k_tokens": 0, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "metadata": { "notes": "Rate limits not documented for gemini-exp-1114. Assuming same as gemini-1.5-pro.", "supports_tool_choice": true @@ -17321,15 +18765,9 @@ "input_cost_per_token": 0, "input_cost_per_token_above_128k_tokens": 0, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 2097152, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "metadata": { "notes": "Rate limits not documented for gemini-exp-1206. Assuming same as gemini-1.5-pro.", "supports_tool_choice": true @@ -17351,15 +18789,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 3e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000025, "output_cost_per_token": 0.0000025, @@ -17403,15 +18835,9 @@ "input_cost_per_audio_token": 3e-7, "input_cost_per_token": 1e-7, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-7, "output_cost_per_token": 4e-7, @@ -17478,21 +18904,48 @@ "tpm": 250000, "rpm": 10 }, + "gemini/gemini-omni-flash-preview": { + "input_cost_per_audio_token": 0.0000015, + "input_cost_per_token": 0.0000015, + "litellm_provider": "gemini", + "max_input_tokens": 1048576, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "output_cost_per_reasoning_token": 0.000009, + "output_cost_per_token": 0.000009, + "output_cost_per_video_token": 0.0000175, + "rpm": 2000, + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text", + "video" + ], + "supports_audio_input": true, + "supports_reasoning": true, + "supports_system_messages": true, + "supports_video_input": true, + "supports_vision": true, + "tpm": 800000 + }, "gemini/gemini-pro-latest": { "cache_read_input_token_cost": 1.25e-7, "cache_read_input_token_cost_above_200k_tokens": 2.5e-7, "input_cost_per_token": 0.00000125, "input_cost_per_token_above_200k_tokens": 0.0000025, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.00001, "output_cost_per_token_above_200k_tokens": 0.000015, @@ -17741,6 +19194,7 @@ "supports_output_config": true }, "github_copilot/claude-opus-4.6-fast": { + "supports_adaptive_thinking": true, "litellm_provider": "github_copilot", "max_input_tokens": 128000, "max_output_tokens": 16000, @@ -18066,6 +19520,7 @@ "search_context_size_medium": 0.01 }, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -18080,7 +19535,9 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "global.anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 0.00000125, @@ -18103,7 +19560,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "global.anthropic.claude-opus-4-5-20251101-v1:0": { "cache_creation_input_token_cost": 0.00000625, @@ -18132,9 +19591,12 @@ "supports_vision": true, "supports_native_structured_output": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "high" + "bedrock_output_config_effort_ceiling": "high", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "global.anthropic.claude-opus-4-6-v1": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -18162,9 +19624,13 @@ "supports_native_structured_output": true, "supports_output_config": true, "supports_max_reasoning_effort": true, - "bedrock_output_config_effort_ceiling": "max" + "bedrock_output_config_effort_ceiling": "max", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "global.anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -18194,9 +19660,14 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 }, "global.anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -18212,7 +19683,43 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "global.anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 0.00000625, + "cache_creation_input_token_cost_above_1hr": 0.00001, + "cache_read_input_token_cost": 5e-7, + "input_cost_per_token": 0.000005, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000025, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -18227,7 +19734,8 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 }, "global.anthropic.claude-sonnet-4-20250514-v1:0": { "cache_creation_input_token_cost": 0.00000375, @@ -18256,7 +19764,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "bedrock_converse_supports_strict_tools": false, + "prompt_cache_min_tokens": 1024 }, "global.anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.00000375, @@ -18288,9 +19798,12 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "global.anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000375, "cache_creation_input_token_cost_above_1hr": 0.000006, "cache_read_input_token_cost": 3e-7, @@ -18317,7 +19830,45 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "global.anthropic.claude-sonnet-5": { + "cache_creation_input_token_cost": 0.0000025, + "cache_creation_input_token_cost_above_1hr": 0.000004, + "cache_read_input_token_cost": 2e-7, + "input_cost_per_token": 0.000002, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.00001, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "gmi/MiniMaxAI/MiniMax-M2.1": { "input_cost_per_token": 3e-7, @@ -18712,8 +20263,6 @@ "output_cost_per_token": 0.000008, "output_cost_per_token_batches": 0.000004, "output_cost_per_token_priority": 0.000014, - "regional_processing_uplift_multiplier_eu": 1.1, - "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -18734,7 +20283,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -18769,7 +20317,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -18787,8 +20334,6 @@ "output_cost_per_token": 0.0000016, "output_cost_per_token_batches": 8e-7, "output_cost_per_token_priority": 0.0000028, - "regional_processing_uplift_multiplier_eu": 1.1, - "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -18809,7 +20354,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -18844,7 +20388,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -18862,8 +20405,6 @@ "output_cost_per_token": 4e-7, "output_cost_per_token_batches": 2e-7, "output_cost_per_token_priority": 8e-7, - "regional_processing_uplift_multiplier_eu": 1.1, - "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -18884,7 +20425,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4.1-nano-2025-04-14": { @@ -18918,7 +20458,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o": { @@ -18935,8 +20474,6 @@ "output_cost_per_token": 0.00001, "output_cost_per_token_batches": 0.000005, "output_cost_per_token_priority": 0.000017, - "regional_processing_uplift_multiplier_eu": 1.1, - "regional_processing_uplift_multiplier_us": 1.1, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -18944,7 +20481,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o-2024-05-13": { @@ -18978,8 +20514,6 @@ "mode": "chat", "output_cost_per_token": 0.00001, "output_cost_per_token_batches": 0.000005, - "regional_processing_uplift_multiplier_eu": 1.1, - "regional_processing_uplift_multiplier_us": 1.1, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -18987,7 +20521,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o-2024-11-20": { @@ -19001,8 +20534,6 @@ "mode": "chat", "output_cost_per_token": 0.00001, "output_cost_per_token_batches": 0.000005, - "regional_processing_uplift_multiplier_eu": 1.1, - "regional_processing_uplift_multiplier_us": 1.1, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -19010,7 +20541,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o-audio-preview": { @@ -19078,8 +20608,6 @@ "output_cost_per_token": 6e-7, "output_cost_per_token_batches": 3e-7, "output_cost_per_token_priority": 0.000001, - "regional_processing_uplift_multiplier_eu": 1.1, - "regional_processing_uplift_multiplier_us": 1.1, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -19087,7 +20615,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o-mini-2024-07-18": { @@ -19113,7 +20640,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o-mini-audio-preview": { @@ -19150,44 +20676,6 @@ "supports_system_messages": true, "supports_tool_choice": true }, - "gpt-4o-mini-realtime-preview": { - "cache_creation_input_audio_token_cost": 3e-7, - "cache_read_input_token_cost": 3e-7, - "input_cost_per_audio_token": 0.00001, - "input_cost_per_token": 6e-7, - "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.00002, - "output_cost_per_token": 0.0000024, - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, - "gpt-4o-mini-realtime-preview-2024-12-17": { - "cache_creation_input_audio_token_cost": 3e-7, - "cache_read_input_token_cost": 3e-7, - "input_cost_per_audio_token": 0.00001, - "input_cost_per_token": 6e-7, - "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.00002, - "output_cost_per_token": 0.0000024, - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, "gpt-4o-mini-search-preview": { "cache_read_input_token_cost": 7.5e-8, "input_cost_per_token": 1.5e-7, @@ -19234,60 +20722,6 @@ "supports_tool_choice": true, "supports_vision": true }, - "gpt-4o-realtime-preview": { - "cache_read_input_token_cost": 0.0000025, - "input_cost_per_audio_token": 0.00004, - "input_cost_per_token": 0.000005, - "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.00008, - "output_cost_per_token": 0.00002, - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, - "gpt-4o-realtime-preview-2024-12-17": { - "cache_read_input_token_cost": 0.0000025, - "input_cost_per_audio_token": 0.00004, - "input_cost_per_token": 0.000005, - "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.00008, - "output_cost_per_token": 0.00002, - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, - "gpt-4o-realtime-preview-2025-06-03": { - "cache_read_input_token_cost": 0.0000025, - "input_cost_per_audio_token": 0.00004, - "input_cost_per_token": 0.000005, - "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.00008, - "output_cost_per_token": 0.00002, - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, "gpt-4o-search-preview": { "cache_read_input_token_cost": 0.00000125, "input_cost_per_token": 0.0000025, @@ -19349,8 +20783,6 @@ "output_cost_per_token": 0.00001, "output_cost_per_token_flex": 0.000005, "output_cost_per_token_priority": 0.00002, - "regional_processing_uplift_multiplier_eu": 1.1, - "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -19372,7 +20804,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -19415,7 +20846,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -19507,8 +20937,6 @@ "output_cost_per_token": 0.000002, "output_cost_per_token_flex": 0.000001, "output_cost_per_token_priority": 0.0000036, - "regional_processing_uplift_multiplier_eu": 1.1, - "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -19530,7 +20958,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -19573,7 +21000,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -19590,8 +21016,6 @@ "max_input_tokens": 272000, "max_output_tokens": 128000, "max_tokens": 128000, - "regional_processing_uplift_multiplier_eu": 1.1, - "regional_processing_uplift_multiplier_us": 1.1, "mode": "chat", "output_cost_per_token": 4e-7, "output_cost_per_token_flex": 2e-7, @@ -19737,7 +21161,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -19777,7 +21200,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -19857,7 +21279,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -19898,7 +21319,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -20001,6 +21421,8 @@ "output_cost_per_token_flex": 0.0000075, "output_cost_per_token_batches": 0.0000075, "output_cost_per_token_priority": 0.00003, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -20022,7 +21444,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_none_reasoning_effort": true, "supports_xhigh_reasoning_effort": true, @@ -20048,6 +21469,8 @@ "output_cost_per_token_flex": 0.0000075, "output_cost_per_token_batches": 0.0000075, "output_cost_per_token_priority": 0.00003, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -20069,20 +21492,18 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-5.4-mini": { "cache_read_input_token_cost": 7.5e-8, "cache_read_input_token_cost_flex": 3.75e-8, - "cache_read_input_token_cost_batches": 3.75e-8, "cache_read_input_token_cost_priority": 1.5e-7, "input_cost_per_token": 7.5e-7, "input_cost_per_token_flex": 3.75e-7, "input_cost_per_token_batches": 3.75e-7, "input_cost_per_token_priority": 0.0000015, "litellm_provider": "openai", - "max_input_tokens": 272000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -20090,6 +21511,8 @@ "output_cost_per_token_flex": 0.00000225, "output_cost_per_token_batches": 0.00000225, "output_cost_per_token_priority": 0.000009, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -20111,7 +21534,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -20121,14 +21543,13 @@ "gpt-5.4-mini-2026-03-17": { "cache_read_input_token_cost": 7.5e-8, "cache_read_input_token_cost_flex": 3.75e-8, - "cache_read_input_token_cost_batches": 3.75e-8, "cache_read_input_token_cost_priority": 1.5e-7, "input_cost_per_token": 7.5e-7, "input_cost_per_token_flex": 3.75e-7, "input_cost_per_token_batches": 3.75e-7, "input_cost_per_token_priority": 0.0000015, "litellm_provider": "openai", - "max_input_tokens": 272000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -20136,6 +21557,8 @@ "output_cost_per_token_flex": 0.00000225, "output_cost_per_token_batches": 0.00000225, "output_cost_per_token_priority": 0.000009, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -20157,7 +21580,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -20167,18 +21589,19 @@ "gpt-5.4-nano": { "cache_read_input_token_cost": 2e-8, "cache_read_input_token_cost_flex": 1e-8, - "cache_read_input_token_cost_batches": 1e-8, "input_cost_per_token": 2e-7, "input_cost_per_token_flex": 1e-7, "input_cost_per_token_batches": 1e-7, "litellm_provider": "openai", - "max_input_tokens": 272000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", "output_cost_per_token": 0.00000125, "output_cost_per_token_flex": 6.25e-7, "output_cost_per_token_batches": 6.25e-7, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -20200,7 +21623,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -20210,18 +21632,19 @@ "gpt-5.4-nano-2026-03-17": { "cache_read_input_token_cost": 2e-8, "cache_read_input_token_cost_flex": 1e-8, - "cache_read_input_token_cost_batches": 1e-8, "input_cost_per_token": 2e-7, "input_cost_per_token_flex": 1e-7, "input_cost_per_token_batches": 1e-7, "litellm_provider": "openai", - "max_input_tokens": 272000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", "output_cost_per_token": 0.00000125, "output_cost_per_token_flex": 6.25e-7, "output_cost_per_token_batches": 6.25e-7, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -20243,7 +21666,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -20270,6 +21692,8 @@ "output_cost_per_token_flex": 0.000015, "output_cost_per_token_batches": 0.000015, "output_cost_per_token_priority": 0.00006, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -20291,7 +21715,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -20318,6 +21741,8 @@ "output_cost_per_token_flex": 0.000015, "output_cost_per_token_batches": 0.000015, "output_cost_per_token_priority": 0.00006, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -20339,200 +21764,234 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, "supports_xhigh_reasoning_effort": true, "supports_minimal_reasoning_effort": false }, - "gpt-audio": { - "input_cost_per_audio_token": 0.000032, - "input_cost_per_token": 0.0000025, + "gpt-5.6": { + "cache_creation_input_token_cost": 0.00000625, + "cache_creation_input_token_cost_above_272k_tokens": 0.0000125, + "cache_creation_input_token_cost_flex": 0.000003125, + "cache_creation_input_token_cost_priority": 0.0000125, + "cache_read_input_token_cost": 5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.000001, + "cache_read_input_token_cost_flex": 2.5e-7, + "cache_read_input_token_cost_priority": 0.000001, + "input_cost_per_token": 0.000005, + "input_cost_per_token_above_272k_tokens": 0.00001, + "input_cost_per_token_batches": 0.0000025, + "input_cost_per_token_flex": 0.0000025, + "input_cost_per_token_priority": 0.00001, "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 16384, - "max_tokens": 16384, + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.000064, - "output_cost_per_token": 0.00001, + "output_cost_per_token": 0.00003, + "output_cost_per_token_above_272k_tokens": 0.000045, + "output_cost_per_token_batches": 0.000015, + "output_cost_per_token_flex": 0.000015, + "output_cost_per_token_priority": 0.00006, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", - "/v1/responses", - "/v1/realtime", - "/v1/batch" - ], - "supported_modalities": [ - "text", - "audio" - ], - "supported_output_modalities": [ - "text", - "audio" - ], - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_native_streaming": true, - "supports_parallel_function_calling": true, - "supports_prompt_caching": false, - "supports_reasoning": false, - "supports_response_schema": false, - "supports_system_messages": true, - "supports_tool_choice": true, - "supports_vision": false - }, - "gpt-audio-1.5": { - "input_cost_per_audio_token": 0.000032, - "input_cost_per_token": 0.0000025, - "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 16384, - "max_tokens": 16384, - "mode": "chat", - "output_cost_per_audio_token": 0.000064, - "output_cost_per_token": 0.00001, - "supported_endpoints": [ - "/v1/chat/completions" + "/v1/batch", + "/v1/responses" ], "supported_modalities": [ "text", - "audio" + "image" ], "supported_output_modalities": [ - "text", - "audio" + "text" ], - "supports_audio_input": true, - "supports_audio_output": true, "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, "supports_native_streaming": true, + "supports_none_reasoning_effort": true, "supports_parallel_function_calling": true, - "supports_prompt_caching": false, - "supports_reasoning": false, - "supports_response_schema": false, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": false + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true }, - "gpt-audio-2025-08-28": { - "input_cost_per_audio_token": 0.000032, - "input_cost_per_token": 0.0000025, + "gpt-5.6-luna": { + "cache_creation_input_token_cost": 0.00000125, + "cache_creation_input_token_cost_above_272k_tokens": 0.0000025, + "cache_creation_input_token_cost_flex": 6.25e-7, + "cache_creation_input_token_cost_priority": 0.0000025, + "cache_read_input_token_cost": 1e-7, + "cache_read_input_token_cost_above_272k_tokens": 2e-7, + "cache_read_input_token_cost_flex": 5e-8, + "cache_read_input_token_cost_priority": 2e-7, + "input_cost_per_token": 0.000001, + "input_cost_per_token_above_272k_tokens": 0.000002, + "input_cost_per_token_batches": 5e-7, + "input_cost_per_token_flex": 5e-7, + "input_cost_per_token_priority": 0.000002, "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 16384, - "max_tokens": 16384, + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.000064, - "output_cost_per_token": 0.00001, + "output_cost_per_token": 0.000006, + "output_cost_per_token_above_272k_tokens": 0.000009, + "output_cost_per_token_batches": 0.000003, + "output_cost_per_token_flex": 0.000003, + "output_cost_per_token_priority": 0.000012, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", - "/v1/responses", - "/v1/realtime", - "/v1/batch" + "/v1/batch", + "/v1/responses" ], "supported_modalities": [ "text", - "audio" + "image" ], "supported_output_modalities": [ - "text", - "audio" + "text" ], - "supports_audio_input": true, - "supports_audio_output": true, "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, "supports_native_streaming": true, + "supports_none_reasoning_effort": true, "supports_parallel_function_calling": true, - "supports_prompt_caching": false, - "supports_reasoning": false, - "supports_response_schema": false, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": false + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true }, - "gpt-audio-mini": { - "input_cost_per_audio_token": 0.00001, - "input_cost_per_token": 6e-7, + "gpt-5.6-sol": { + "cache_creation_input_token_cost": 0.00000625, + "cache_creation_input_token_cost_above_272k_tokens": 0.0000125, + "cache_creation_input_token_cost_flex": 0.000003125, + "cache_creation_input_token_cost_priority": 0.0000125, + "cache_read_input_token_cost": 5e-7, + "cache_read_input_token_cost_above_272k_tokens": 0.000001, + "cache_read_input_token_cost_flex": 2.5e-7, + "cache_read_input_token_cost_priority": 0.000001, + "input_cost_per_token": 0.000005, + "input_cost_per_token_above_272k_tokens": 0.00001, + "input_cost_per_token_batches": 0.0000025, + "input_cost_per_token_flex": 0.0000025, + "input_cost_per_token_priority": 0.00001, "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 16384, - "max_tokens": 16384, + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.00002, - "output_cost_per_token": 0.0000024, + "output_cost_per_token": 0.00003, + "output_cost_per_token_above_272k_tokens": 0.000045, + "output_cost_per_token_batches": 0.000015, + "output_cost_per_token_flex": 0.000015, + "output_cost_per_token_priority": 0.00006, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", - "/v1/responses", - "/v1/realtime", - "/v1/batch" + "/v1/batch", + "/v1/responses" ], "supported_modalities": [ "text", - "audio" + "image" ], "supported_output_modalities": [ - "text", - "audio" + "text" ], - "supports_audio_input": true, - "supports_audio_output": true, "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, "supports_native_streaming": true, + "supports_none_reasoning_effort": true, "supports_parallel_function_calling": true, - "supports_prompt_caching": false, - "supports_reasoning": false, - "supports_response_schema": false, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": false + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true }, - "gpt-audio-mini-2025-10-06": { - "input_cost_per_audio_token": 0.00001, - "input_cost_per_token": 6e-7, + "gpt-5.6-terra": { + "cache_creation_input_token_cost": 0.000003125, + "cache_creation_input_token_cost_above_272k_tokens": 0.00000625, + "cache_creation_input_token_cost_flex": 0.0000015625, + "cache_creation_input_token_cost_priority": 0.00000625, + "cache_read_input_token_cost": 2.5e-7, + "cache_read_input_token_cost_above_272k_tokens": 5e-7, + "cache_read_input_token_cost_flex": 1.25e-7, + "cache_read_input_token_cost_priority": 5e-7, + "input_cost_per_token": 0.0000025, + "input_cost_per_token_above_272k_tokens": 0.000005, + "input_cost_per_token_batches": 0.00000125, + "input_cost_per_token_flex": 0.00000125, + "input_cost_per_token_priority": 0.000005, "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 16384, - "max_tokens": 16384, + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_audio_token": 0.00002, - "output_cost_per_token": 0.0000024, + "output_cost_per_token": 0.000015, + "output_cost_per_token_above_272k_tokens": 0.0000225, + "output_cost_per_token_batches": 0.0000075, + "output_cost_per_token_flex": 0.0000075, + "output_cost_per_token_priority": 0.00003, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", - "/v1/responses", - "/v1/realtime", - "/v1/batch" + "/v1/batch", + "/v1/responses" ], "supported_modalities": [ "text", - "audio" + "image" ], "supported_output_modalities": [ - "text", - "audio" + "text" ], - "supports_audio_input": true, - "supports_audio_output": true, "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, "supports_native_streaming": true, + "supports_none_reasoning_effort": true, "supports_parallel_function_calling": true, - "supports_prompt_caching": false, - "supports_reasoning": false, - "supports_response_schema": false, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": false + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true }, - "gpt-audio-mini-2025-12-15": { - "input_cost_per_audio_token": 0.00001, - "input_cost_per_token": 6e-7, + "gpt-audio": { + "input_cost_per_audio_token": 0.000032, + "input_cost_per_token": 0.0000025, "litellm_provider": "openai", "max_input_tokens": 128000, "max_output_tokens": 16384, "max_tokens": 16384, "mode": "chat", - "output_cost_per_audio_token": 0.00002, - "output_cost_per_token": 0.0000024, + "output_cost_per_audio_token": 0.000064, + "output_cost_per_token": 0.00001, "supported_endpoints": [ "/v1/chat/completions", "/v1/responses", @@ -20559,89 +22018,21 @@ "supports_tool_choice": true, "supports_vision": false }, - "gpt-realtime": { - "cache_creation_input_audio_token_cost": 4e-7, - "cache_read_input_token_cost": 4e-7, - "input_cost_per_audio_token": 0.000032, - "input_cost_per_image": 0.000005, - "input_cost_per_token": 0.000004, - "litellm_provider": "openai", - "max_input_tokens": 32000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.000064, - "output_cost_per_token": 0.000016, - "supported_endpoints": [ - "/v1/realtime" - ], - "supported_modalities": [ - "text", - "image", - "audio" - ], - "supported_output_modalities": [ - "text", - "audio" - ], - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, - "gpt-realtime-1.5": { - "cache_creation_input_audio_token_cost": 4e-7, - "cache_read_input_token_cost": 4e-7, - "input_cost_per_audio_token": 0.000032, - "input_cost_per_image": 0.000005, - "input_cost_per_token": 0.000004, - "litellm_provider": "openai", - "max_input_tokens": 32000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 0.000064, - "output_cost_per_token": 0.000016, - "supported_endpoints": [ - "/v1/realtime" - ], - "supported_modalities": [ - "text", - "image", - "audio" - ], - "supported_output_modalities": [ - "text", - "audio" - ], - "supports_audio_input": true, - "supports_audio_output": true, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, - "gpt-realtime-2": { - "cache_creation_input_audio_token_cost": 4e-7, - "cache_read_input_token_cost": 4e-7, + "gpt-audio-1.5": { "input_cost_per_audio_token": 0.000032, - "input_cost_per_image": 0.000005, - "input_cost_per_token": 0.000004, + "input_cost_per_token": 0.0000025, "litellm_provider": "openai", - "max_input_tokens": 32000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_input_tokens": 128000, + "max_output_tokens": 16384, + "max_tokens": 16384, "mode": "chat", "output_cost_per_audio_token": 0.000064, - "output_cost_per_token": 0.000016, + "output_cost_per_token": 0.00001, "supported_endpoints": [ - "/v1/realtime" + "/v1/chat/completions" ], "supported_modalities": [ "text", - "image", "audio" ], "supported_output_modalities": [ @@ -20651,29 +22042,33 @@ "supports_audio_input": true, "supports_audio_output": true, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": false, + "supports_response_schema": false, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false }, - "gpt-realtime-2025-08-28": { - "cache_creation_input_audio_token_cost": 4e-7, - "cache_read_input_token_cost": 4e-7, + "gpt-audio-2025-08-28": { "input_cost_per_audio_token": 0.000032, - "input_cost_per_image": 0.000005, - "input_cost_per_token": 0.000004, + "input_cost_per_token": 0.0000025, "litellm_provider": "openai", - "max_input_tokens": 32000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_input_tokens": 128000, + "max_output_tokens": 16384, + "max_tokens": 16384, "mode": "chat", "output_cost_per_audio_token": 0.000064, - "output_cost_per_token": 0.000016, + "output_cost_per_token": 0.00001, "supported_endpoints": [ - "/v1/realtime" + "/v1/chat/completions", + "/v1/responses", + "/v1/realtime", + "/v1/batch" ], "supported_modalities": [ "text", - "image", "audio" ], "supported_output_modalities": [ @@ -20683,28 +22078,33 @@ "supports_audio_input": true, "supports_audio_output": true, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": false, + "supports_response_schema": false, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false }, - "gpt-realtime-mini": { - "cache_creation_input_audio_token_cost": 3e-7, - "cache_read_input_audio_token_cost": 3e-7, + "gpt-audio-mini": { "input_cost_per_audio_token": 0.00001, "input_cost_per_token": 6e-7, "litellm_provider": "openai", "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_output_tokens": 16384, + "max_tokens": 16384, "mode": "chat", "output_cost_per_audio_token": 0.00002, "output_cost_per_token": 0.0000024, "supported_endpoints": [ - "/v1/realtime" + "/v1/chat/completions", + "/v1/responses", + "/v1/realtime", + "/v1/batch" ], "supported_modalities": [ "text", - "image", "audio" ], "supported_output_modalities": [ @@ -20714,30 +22114,33 @@ "supports_audio_input": true, "supports_audio_output": true, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": false, + "supports_response_schema": false, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false }, - "gpt-realtime-mini-2025-10-06": { - "cache_creation_input_audio_token_cost": 3e-7, - "cache_read_input_audio_token_cost": 3e-7, - "cache_read_input_token_cost": 6e-8, + "gpt-audio-mini-2025-10-06": { "input_cost_per_audio_token": 0.00001, - "input_cost_per_image": 8e-7, "input_cost_per_token": 6e-7, "litellm_provider": "openai", "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_output_tokens": 16384, + "max_tokens": 16384, "mode": "chat", "output_cost_per_audio_token": 0.00002, "output_cost_per_token": 0.0000024, "supported_endpoints": [ - "/v1/realtime" + "/v1/chat/completions", + "/v1/responses", + "/v1/realtime", + "/v1/batch" ], "supported_modalities": [ "text", - "image", "audio" ], "supported_output_modalities": [ @@ -20747,30 +22150,33 @@ "supports_audio_input": true, "supports_audio_output": true, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": false, + "supports_response_schema": false, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false }, - "gpt-realtime-mini-2025-12-15": { - "cache_creation_input_audio_token_cost": 3e-7, - "cache_read_input_audio_token_cost": 3e-7, - "cache_read_input_token_cost": 6e-8, + "gpt-audio-mini-2025-12-15": { "input_cost_per_audio_token": 0.00001, - "input_cost_per_image": 8e-7, "input_cost_per_token": 6e-7, "litellm_provider": "openai", "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, + "max_output_tokens": 16384, + "max_tokens": 16384, "mode": "chat", "output_cost_per_audio_token": 0.00002, "output_cost_per_token": 0.0000024, "supported_endpoints": [ - "/v1/realtime" + "/v1/chat/completions", + "/v1/responses", + "/v1/realtime", + "/v1/batch" ], "supported_modalities": [ "text", - "image", "audio" ], "supported_output_modalities": [ @@ -20780,9 +22186,14 @@ "supports_audio_input": true, "supports_audio_output": true, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": false, + "supports_response_schema": false, "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false }, "gradient_ai/alibaba-qwen3-32b": { "litellm_provider": "gradient_ai", @@ -21504,9 +22915,12 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "jp.anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, "cache_creation_input_token_cost": 0.000006875, "cache_read_input_token_cost": 5.5e-7, "input_cost_per_token": 0.0000055, @@ -21521,6 +22935,7 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_adaptive_thinking": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -21532,10 +22947,84 @@ "supports_tool_choice": true, "supports_vision": true, "supports_xhigh_reasoning_effort": true, - "tool_use_system_prompt_tokens": 346, "supports_native_structured_output": true, "supports_max_reasoning_effort": true, - "supports_minimal_reasoning_effort": true + "supports_minimal_reasoning_effort": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 + }, + "jp.anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 0.000006875, + "cache_creation_input_token_cost_above_1hr": 0.000011, + "cache_read_input_token_cost": 5.5e-7, + "input_cost_per_token": 0.0000055, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.0000275, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "jp.anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 0.000006875, + "cache_creation_input_token_cost_above_1hr": 0.000011, + "cache_read_input_token_cost": 5.5e-7, + "input_cost_per_token": 0.0000055, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.0000275, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 }, "jp.anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.000004125, @@ -21567,9 +23056,12 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "jp.anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.000004125, "cache_creation_input_token_cost_above_1hr": 0.0000066, "cache_read_input_token_cost": 3.3e-7, @@ -21596,7 +23088,45 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "jp.anthropic.claude-sonnet-5": { + "cache_creation_input_token_cost": 0.00000275, + "cache_creation_input_token_cost_above_1hr": 0.0000044, + "cache_read_input_token_cost": 2.2e-7, + "input_cost_per_token": 0.0000022, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000011, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "kimi-k2-thinking-251104": { "input_cost_per_token": 0, @@ -22445,6 +23975,42 @@ "supports_function_calling": true, "supports_tool_choice": false }, + "meta/muse-spark-1.1": { + "cache_read_input_token_cost": 1.5e-7, + "input_cost_per_token": 0.00000125, + "litellm_provider": "meta", + "max_input_tokens": 1048576, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 0.00000425, + "source": "https://dev.meta.ai/docs/getting-started/pricing-rate-limits", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses", + "/v1/messages" + ], + "supported_modalities": [ + "text", + "image", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_minimal_reasoning_effort": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true + }, "meta_llama/Llama-3.3-70B-Instruct": { "litellm_provider": "meta_llama", "max_input_tokens": 128000, @@ -23252,6 +24818,37 @@ "supports_response_schema": true, "supports_tool_choice": true }, + "mistral/mistral-medium-2508": { + "input_cost_per_token": 4e-7, + "litellm_provider": "mistral", + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 0.000002, + "source": "https://mistral.ai/news/mistral-medium-3", + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "mistral/mistral-medium-2604": { + "input_cost_per_token": 0.0000015, + "litellm_provider": "mistral", + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 0.0000075, + "source": "https://docs.mistral.ai/models/model-cards/mistral-medium-3-5-26-04", + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, "mistral/mistral-medium-3-1-2508": { "input_cost_per_token": 4e-7, "litellm_provider": "mistral", @@ -23278,20 +24875,23 @@ "source": "https://docs.mistral.ai/models/model-cards/mistral-medium-3-5-26-04", "supports_assistant_prefill": true, "supports_function_calling": true, + "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true }, "mistral/mistral-medium-latest": { - "input_cost_per_token": 4e-7, + "input_cost_per_token": 0.0000015, "litellm_provider": "mistral", - "max_input_tokens": 131072, - "max_output_tokens": 131072, - "max_tokens": 131072, + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, "mode": "chat", - "output_cost_per_token": 0.000002, + "output_cost_per_token": 0.0000075, + "source": "https://docs.mistral.ai/models/model-cards/mistral-medium-3-5-26-04", "supports_assistant_prefill": true, "supports_function_calling": true, + "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true @@ -25472,7 +27072,6 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -25505,7 +27104,6 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -25633,7 +27231,6 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -25653,7 +27250,6 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -26558,6 +28154,7 @@ "supports_output_config": true }, "openrouter/anthropic/claude-opus-4.6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_read_input_token_cost": 5e-7, "input_cost_per_token": 0.000005, @@ -26577,6 +28174,7 @@ "supports_vision": true }, "openrouter/anthropic/claude-opus-4.7": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_read_input_token_cost": 5e-7, "input_cost_per_token": 0.000005, @@ -26645,6 +28243,7 @@ "supports_vision": true }, "openrouter/anthropic/claude-sonnet-4.6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000375, "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, "cache_read_input_token_cost": 3e-7, @@ -26781,15 +28380,9 @@ "input_cost_per_audio_token": 7e-7, "input_cost_per_token": 1e-7, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 4e-7, "supports_audio_output": true, @@ -26803,15 +28396,9 @@ "input_cost_per_audio_token": 7e-7, "input_cost_per_token": 3e-7, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.0000025, "supports_audio_output": true, @@ -26826,15 +28413,9 @@ "input_cost_per_audio_token": 7e-7, "input_cost_per_token": 0.00000125, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.00001, "supports_audio_output": true, @@ -26849,15 +28430,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 5e-7, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.000003, "output_cost_per_token": 0.000003, @@ -26899,15 +28474,9 @@ "input_cost_per_token_above_200k_tokens": 0.000004, "input_cost_per_token_batches": 0.000001, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.000012, "output_cost_per_token_above_200k_tokens": 0.000018, @@ -26940,19 +28509,12 @@ }, "openrouter/google/gemini-3.1-flash-lite": { "cache_read_input_token_cost": 2.5e-8, - "cache_read_input_token_cost_per_audio_token": 5e-8, "input_cost_per_audio_token": 5e-7, "input_cost_per_token": 2.5e-7, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000015, "output_cost_per_token": 0.0000015, @@ -26974,8 +28536,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -26992,19 +28552,12 @@ }, "openrouter/google/gemini-3.1-flash-lite-preview": { "cache_read_input_token_cost": 2.5e-8, - "cache_read_input_token_cost_per_audio_token": 5e-8, "input_cost_per_audio_token": 5e-7, "input_cost_per_token": 2.5e-7, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000015, "output_cost_per_token": 0.0000015, @@ -27026,8 +28579,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -28018,6 +29569,22 @@ "supports_reasoning": true, "supports_tool_choice": true }, + "openrouter/z-ai/glm-5.1": { + "input_cost_per_token": 0.00000105, + "output_cost_per_token": 0.0000035, + "cache_read_input_token_cost": 5.25e-7, + "cache_creation_input_token_cost": 0, + "litellm_provider": "openrouter", + "max_input_tokens": 202752, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "source": "https://openrouter.ai/z-ai/glm-5.1", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true + }, "ovhcloud/DeepSeek-R1-Distill-Llama-70B": { "input_cost_per_token": 6.7e-7, "litellm_provider": "ovhcloud", @@ -29196,6 +30763,7 @@ "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/DeepSeek-R1-Distill-Llama-70B": { + "deprecation_date": "2026-03-20", "input_cost_per_token": 7e-7, "litellm_provider": "sambanova", "max_input_tokens": 131072, @@ -29206,6 +30774,7 @@ "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/DeepSeek-V3-0324": { + "deprecation_date": "2026-04-14", "input_cost_per_token": 0.000003, "litellm_provider": "sambanova", "max_input_tokens": 32768, @@ -29219,6 +30788,19 @@ "supports_tool_choice": true }, "sambanova/DeepSeek-V3.1": { + "max_tokens": 131072, + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "input_cost_per_token": 0.000003, + "output_cost_per_token": 0.0000045, + "litellm_provider": "sambanova", + "mode": "chat", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "source": "https://cloud.sambanova.ai/plans/pricing" + }, + "sambanova/DeepSeek-V3.2": { "max_tokens": 32768, "max_input_tokens": 32768, "max_output_tokens": 32768, @@ -29228,7 +30810,6 @@ "mode": "chat", "supports_function_calling": true, "supports_tool_choice": true, - "supports_reasoning": true, "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/Llama-4-Maverick-17B-128E-Instruct": { @@ -29249,6 +30830,7 @@ "supports_vision": true }, "sambanova/Llama-4-Scout-17B-16E-Instruct": { + "deprecation_date": "2025-06-19", "input_cost_per_token": 4e-7, "litellm_provider": "sambanova", "max_input_tokens": 8192, @@ -29265,6 +30847,7 @@ "supports_tool_choice": true }, "sambanova/Meta-Llama-3.1-405B-Instruct": { + "deprecation_date": "2025-06-25", "input_cost_per_token": 0.000005, "litellm_provider": "sambanova", "max_input_tokens": 16384, @@ -29278,6 +30861,7 @@ "supports_tool_choice": true }, "sambanova/Meta-Llama-3.1-8B-Instruct": { + "deprecation_date": "2026-04-14", "input_cost_per_token": 1e-7, "litellm_provider": "sambanova", "max_input_tokens": 16384, @@ -29291,6 +30875,7 @@ "supports_tool_choice": true }, "sambanova/Meta-Llama-3.2-1B-Instruct": { + "deprecation_date": "2025-06-25", "input_cost_per_token": 4e-8, "litellm_provider": "sambanova", "max_input_tokens": 16384, @@ -29301,6 +30886,7 @@ "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/Meta-Llama-3.2-3B-Instruct": { + "deprecation_date": "2025-06-25", "input_cost_per_token": 8e-8, "litellm_provider": "sambanova", "max_input_tokens": 4096, @@ -29324,6 +30910,7 @@ "supports_tool_choice": true }, "sambanova/Meta-Llama-Guard-3-8B": { + "deprecation_date": "2025-06-25", "input_cost_per_token": 3e-7, "litellm_provider": "sambanova", "max_input_tokens": 16384, @@ -29334,19 +30921,20 @@ "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/MiniMax-M2.7": { - "input_cost_per_token": 3e-7, + "input_cost_per_token": 6e-7, "litellm_provider": "sambanova", - "max_input_tokens": 204800, + "max_input_tokens": 196608, "max_output_tokens": 131072, "max_tokens": 131072, "mode": "chat", - "output_cost_per_token": 0.0000012, + "output_cost_per_token": 0.0000024, "source": "https://cloud.sambanova.ai/plans/pricing", "supports_function_calling": true, "supports_reasoning": true, "supports_tool_choice": true }, "sambanova/QwQ-32B": { + "deprecation_date": "2025-06-25", "input_cost_per_token": 5e-7, "litellm_provider": "sambanova", "max_input_tokens": 16384, @@ -29357,6 +30945,7 @@ "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/Qwen2-Audio-7B-Instruct": { + "deprecation_date": "2025-06-19", "input_cost_per_token": 5e-7, "litellm_provider": "sambanova", "max_input_tokens": 4096, @@ -29368,6 +30957,7 @@ "supports_audio_input": true }, "sambanova/Qwen3-32B": { + "deprecation_date": "2026-04-06", "input_cost_per_token": 4e-7, "litellm_provider": "sambanova", "max_input_tokens": 8192, @@ -29380,12 +30970,23 @@ "supports_reasoning": true, "supports_tool_choice": true }, + "sambanova/gemma-4-31B-it": { + "max_tokens": 131072, + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "input_cost_per_token": 3.8e-7, + "output_cost_per_token": 0.00000115, + "litellm_provider": "sambanova", + "mode": "chat", + "supports_vision": true, + "source": "https://cloud.sambanova.ai/plans/pricing" + }, "sambanova/gpt-oss-120b": { "max_tokens": 131072, "max_input_tokens": 131072, "max_output_tokens": 131072, - "input_cost_per_token": 0.000003, - "output_cost_per_token": 0.0000045, + "input_cost_per_token": 2.2e-7, + "output_cost_per_token": 5.9e-7, "litellm_provider": "sambanova", "mode": "chat", "supports_function_calling": true, @@ -29654,6 +31255,7 @@ "supports_response_schema": true }, "snowflake/claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "max_tokens": 16384, "max_input_tokens": 200000, "max_output_tokens": 16384, @@ -29923,6 +31525,58 @@ "supports_function_calling": true, "supports_system_messages": true }, + "tencent/deepseek-v4-flash": { + "cache_creation_input_token_cost": 0, + "cache_read_input_token_cost": 2.8e-9, + "input_cost_per_token": 1.4e-7, + "input_cost_per_token_cache_hit": 2.8e-9, + "litellm_provider": "tencent", + "max_input_tokens": 1000000, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "output_cost_per_token": 2.8e-7, + "source": "https://www.tencentcloud.com/products/tokenhub", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_vision": false + }, + "tencent/deepseek-v4-pro": { + "cache_creation_input_token_cost": 0, + "cache_read_input_token_cost": 3.625e-9, + "input_cost_per_token": 4.35e-7, + "input_cost_per_token_cache_hit": 3.625e-9, + "litellm_provider": "tencent", + "max_input_tokens": 1000000, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "output_cost_per_token": 8.7e-7, + "source": "https://www.tencentcloud.com/products/tokenhub", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_vision": false + }, "tensormesh/MiniMaxAI/MiniMax-M2.5": { "litellm_provider": "tensormesh", "mode": "chat", @@ -30515,7 +32169,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "us.amazon.nova-2-lite-v1:0": { "cache_read_input_token_cost": 8.25e-8, @@ -30622,7 +32278,8 @@ "supports_pdf_input": true, "supports_prompt_caching": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "prompt_cache_min_tokens": 2048 }, "us.anthropic.claude-3-5-sonnet-20240620-v1:0": { "input_cost_per_token": 0.000003, @@ -30743,6 +32400,7 @@ "search_context_size_medium": 0.01 }, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -30757,7 +32415,9 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "us.anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 0.000001375, @@ -30780,7 +32440,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "us.anthropic.claude-opus-4-1-20250805-v1:0": { "cache_creation_input_token_cost": 0.00001875, @@ -30805,7 +32467,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "us.anthropic.claude-opus-4-20250514-v1:0": { "cache_creation_input_token_cost": 0.00001875, @@ -30830,7 +32493,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "us.anthropic.claude-opus-4-5-20251101-v1:0": { "cache_creation_input_token_cost": 0.000006875, @@ -30859,9 +32523,12 @@ "supports_vision": true, "supports_native_structured_output": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "high" + "bedrock_output_config_effort_ceiling": "high", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "us.anthropic.claude-opus-4-6-v1": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.000006875, "cache_creation_input_token_cost_above_1hr": 0.000011, "cache_read_input_token_cost": 5.5e-7, @@ -30889,9 +32556,13 @@ "supports_native_structured_output": true, "supports_output_config": true, "supports_max_reasoning_effort": true, - "bedrock_output_config_effort_ceiling": "max" + "bedrock_output_config_effort_ceiling": "max", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "us.anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.000006875, "cache_creation_input_token_cost_above_1hr": 0.000011, "cache_read_input_token_cost": 5.5e-7, @@ -30921,9 +32592,14 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 }, "us.anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 0.000006875, "cache_creation_input_token_cost_above_1hr": 0.000011, "cache_read_input_token_cost": 5.5e-7, @@ -30939,7 +32615,43 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "us.anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 0.000006875, + "cache_creation_input_token_cost_above_1hr": 0.000011, + "cache_read_input_token_cost": 5.5e-7, + "input_cost_per_token": 0.0000055, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.0000275, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -30954,7 +32666,8 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 }, "us.anthropic.claude-sonnet-4-20250514-v1:0": { "cache_creation_input_token_cost": 0.00000375, @@ -30983,7 +32696,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "bedrock_converse_supports_strict_tools": false, + "prompt_cache_min_tokens": 1024 }, "us.anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 0.000004125, @@ -31015,9 +32730,12 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "us.anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.000004125, "cache_creation_input_token_cost_above_1hr": 0.0000066, "cache_read_input_token_cost": 3.3e-7, @@ -31044,7 +32762,45 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "us.anthropic.claude-sonnet-5": { + "cache_creation_input_token_cost": 0.00000275, + "cache_creation_input_token_cost_above_1hr": 0.0000044, + "cache_read_input_token_cost": 2.2e-7, + "input_cost_per_token": 0.0000022, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000011, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "us.deepseek.r1-v1:0": { "input_cost_per_token": 0.00000135, @@ -31613,6 +33369,7 @@ "supports_output_config": true }, "vercel_ai_gateway/anthropic/claude-opus-4.6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_read_input_token_cost": 5e-7, "input_cost_per_token": 0.000005, @@ -32616,6 +34373,7 @@ "supports_vision": true }, "vertex_ai/claude-fable-5": { + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 0.0000125, "cache_creation_input_token_cost_above_1hr": 0.00002, "cache_read_input_token_cost": 0.000001, @@ -32646,6 +34404,7 @@ "supports_max_reasoning_effort": true }, "vertex_ai/claude-fable-5@default": { + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 0.0000125, "cache_creation_input_token_cost_above_1hr": 0.00002, "cache_read_input_token_cost": 0.000001, @@ -32695,7 +34454,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_native_streaming": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-haiku-4-5@20251001": { "cache_creation_input_token_cost": 0.00000125, @@ -32717,7 +34477,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_native_streaming": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-opus-4": { "cache_creation_input_token_cost": 0.00001875, @@ -32743,7 +34504,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-opus-4-1": { "cache_creation_input_token_cost": 0.00001875, @@ -32806,7 +34568,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-opus-4-5@20251101": { "cache_creation_input_token_cost": 0.00000625, @@ -32834,9 +34597,11 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_streaming": true, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-opus-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -32862,9 +34627,11 @@ "supports_tool_choice": true, "supports_vision": true, "supports_output_config": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-opus-4-6@default": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -32890,9 +34657,11 @@ "supports_tool_choice": true, "supports_vision": true, "supports_output_config": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-opus-4-7": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -32919,9 +34688,75 @@ "supports_tool_choice": true, "supports_vision": true, "supports_xhigh_reasoning_effort": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 2048 }, "vertex_ai/claude-opus-4-7@default": { + "supports_adaptive_thinking": true, + "cache_creation_input_token_cost": 0.00000625, + "cache_creation_input_token_cost_above_1hr": 0.00001, + "cache_read_input_token_cost": 5e-7, + "input_cost_per_token": 0.000005, + "litellm_provider": "vertex_ai-anthropic_models", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000025, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 2048 + }, + "vertex_ai/claude-opus-4-8": { + "supports_mid_conversation_system": true, + "supports_adaptive_thinking": true, + "cache_creation_input_token_cost": 0.00000625, + "cache_creation_input_token_cost_above_1hr": 0.00001, + "cache_read_input_token_cost": 5e-7, + "input_cost_per_token": 0.000005, + "litellm_provider": "vertex_ai-anthropic_models", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.000025, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 1024 + }, + "vertex_ai/claude-opus-4-8@default": { + "supports_mid_conversation_system": true, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -32948,39 +34783,39 @@ "supports_tool_choice": true, "supports_vision": true, "supports_xhigh_reasoning_effort": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 1024 }, - "vertex_ai/claude-opus-4-8": { - "cache_creation_input_token_cost": 0.00000625, - "cache_creation_input_token_cost_above_1hr": 0.00001, - "cache_read_input_token_cost": 5e-7, - "input_cost_per_token": 0.000005, + "vertex_ai/claude-opus-4@20250514": { + "cache_creation_input_token_cost": 0.00001875, + "cache_creation_input_token_cost_above_1hr": 0.00003, + "cache_read_input_token_cost": 0.0000015, + "input_cost_per_token": 0.000015, "litellm_provider": "vertex_ai-anthropic_models", - "max_input_tokens": 1000000, - "max_output_tokens": 128000, - "max_tokens": 128000, + "max_input_tokens": 200000, + "max_output_tokens": 32000, + "max_tokens": 32000, "mode": "chat", - "output_cost_per_token": 0.000025, + "output_cost_per_token": 0.000075, "search_context_cost_per_query": { "search_context_size_high": 0.01, "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, - "supports_adaptive_thinking": true, - "supports_assistant_prefill": false, + "supports_assistant_prefill": true, "supports_computer_use": true, "supports_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, - "supports_sampling_params": false, "supports_tool_choice": true, "supports_vision": true, - "supports_xhigh_reasoning_effort": true, - "supports_max_reasoning_effort": true + "prompt_cache_min_tokens": 1024 }, - "vertex_ai/claude-opus-4-8@default": { + "vertex_ai/claude-opus-5": { + "supports_mid_conversation_system": true, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000625, "cache_creation_input_token_cost_above_1hr": 0.00001, "cache_read_input_token_cost": 5e-7, @@ -32996,7 +34831,6 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, - "supports_adaptive_thinking": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -33008,33 +34842,40 @@ "supports_tool_choice": true, "supports_vision": true, "supports_xhigh_reasoning_effort": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 512 }, - "vertex_ai/claude-opus-4@20250514": { - "cache_creation_input_token_cost": 0.00001875, - "cache_creation_input_token_cost_above_1hr": 0.00003, - "cache_read_input_token_cost": 0.0000015, - "input_cost_per_token": 0.000015, + "vertex_ai/claude-opus-5@default": { + "supports_mid_conversation_system": true, + "supports_adaptive_thinking": true, + "cache_creation_input_token_cost": 0.00000625, + "cache_creation_input_token_cost_above_1hr": 0.00001, + "cache_read_input_token_cost": 5e-7, + "input_cost_per_token": 0.000005, "litellm_provider": "vertex_ai-anthropic_models", - "max_input_tokens": 200000, - "max_output_tokens": 32000, - "max_tokens": 32000, + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 0.000075, + "output_cost_per_token": 0.000025, "search_context_cost_per_query": { "search_context_size_high": 0.01, "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, - "supports_assistant_prefill": true, + "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_sampling_params": false, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 512 }, "vertex_ai/claude-sonnet-4": { "cache_creation_input_token_cost": 0.00000375, @@ -33064,7 +34905,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-sonnet-4-5": { "cache_creation_input_token_cost": 0.00000375, @@ -33091,7 +34933,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-sonnet-4-5@20250929": { "cache_creation_input_token_cost": 0.00000375, @@ -33119,9 +34962,11 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_streaming": true + "supports_native_streaming": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000375, "cache_creation_input_token_cost_above_1hr": 0.000006, "cache_read_input_token_cost": 3e-7, @@ -33147,9 +34992,11 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-sonnet-4-6@default": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 0.00000375, "cache_creation_input_token_cost_above_1hr": 0.000006, "cache_read_input_token_cost": 3e-7, @@ -33175,7 +35022,8 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-sonnet-4@20250514": { "cache_creation_input_token_cost": 0.00000375, @@ -33205,7 +35053,72 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 + }, + "vertex_ai/claude-sonnet-5": { + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 0.0000025, + "cache_creation_input_token_cost_above_1hr": 0.000004, + "cache_read_input_token_cost": 2e-7, + "input_cost_per_token": 0.000002, + "litellm_provider": "vertex_ai-anthropic_models", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.00001, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 1024 + }, + "vertex_ai/claude-sonnet-5@default": { + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 0.0000025, + "cache_creation_input_token_cost_above_1hr": 0.000004, + "cache_read_input_token_cost": 2e-7, + "input_cost_per_token": 0.000002, + "litellm_provider": "vertex_ai-anthropic_models", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 0.00001, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/codestral-2": { "input_cost_per_token": 3e-7, @@ -33323,15 +35236,9 @@ "input_cost_per_audio_token": 0.000001, "input_cost_per_token": 3e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 32768, "max_output_tokens": 32768, "max_tokens": 32768, - "max_pdf_size_mb": 30, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "image_generation", "output_cost_per_image": 0.039, "output_cost_per_image_token": 0.00003, @@ -33359,6 +35266,7 @@ "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, + "supports_reasoning": false, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, @@ -33373,15 +35281,9 @@ "input_cost_per_token": 5e-7, "input_cost_per_audio_token": 0.000001, "litellm_provider": "vertex_ai", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.000003, "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", @@ -33415,7 +35317,6 @@ "input_cost_per_audio_token_priority": 0.0000018, "output_cost_per_token_priority": 0.0000054, "cache_read_input_token_cost_priority": 9e-8, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -33431,15 +35332,9 @@ "input_cost_per_token_above_200k_tokens": 0.000004, "input_cost_per_token_batches": 0.000001, "litellm_provider": "vertex_ai", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.000012, "output_cost_per_token_above_200k_tokens": 0.000018, @@ -33477,7 +35372,6 @@ "output_cost_per_token_above_200k_tokens_priority": 0.0000324, "cache_read_input_token_cost_priority": 3.6e-7, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -33487,9 +35381,7 @@ }, "vertex_ai/gemini-3.1-flash-lite": { "cache_read_input_token_cost": 2.5e-8, - "cache_read_input_token_cost_batches": 1.25e-8, "cache_read_input_token_cost_flex": 1.25e-8, - "cache_read_input_token_cost_per_audio_token": 5e-8, "cache_read_input_token_cost_priority": 4.5e-8, "input_cost_per_audio_token": 5e-7, "input_cost_per_token": 2.5e-7, @@ -33497,15 +35389,9 @@ "input_cost_per_token_flex": 1.25e-7, "input_cost_per_token_priority": 4.5e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000015, "output_cost_per_token": 0.0000015, @@ -33529,8 +35415,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -33549,24 +35433,16 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" }, "vertex_ai/gemini-3.1-flash-lite-preview": { "cache_read_input_token_cost": 2.5e-8, - "cache_read_input_token_cost_per_audio_token": 5e-8, "input_cost_per_audio_token": 5e-7, "input_cost_per_token": 2.5e-7, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.0000015, "output_cost_per_token": 0.0000015, @@ -33587,8 +35463,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -33617,15 +35491,9 @@ "input_cost_per_token_above_200k_tokens": 0.000004, "input_cost_per_token_batches": 0.000001, "litellm_provider": "vertex_ai", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.000012, "output_cost_per_token_above_200k_tokens": 0.000018, @@ -33665,7 +35533,6 @@ "output_cost_per_token_above_200k_tokens_priority": 0.0000324, "cache_read_input_token_cost_priority": 3.6e-7, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -33681,15 +35548,9 @@ "input_cost_per_token_above_200k_tokens": 0.000004, "input_cost_per_token_batches": 0.000001, "litellm_provider": "vertex_ai", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 0.000012, "output_cost_per_token_above_200k_tokens": 0.000018, @@ -33729,7 +35590,6 @@ "output_cost_per_token_above_200k_tokens_priority": 0.0000324, "cache_read_input_token_cost_priority": 3.6e-7, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -33742,15 +35602,9 @@ "input_cost_per_token": 0.0000015, "input_cost_per_audio_token": 0.000001, "litellm_provider": "vertex_ai", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 0.000009, "output_cost_per_token": 0.000009, @@ -33787,7 +35641,115 @@ "input_cost_per_audio_token_priority": 0.0000018, "output_cost_per_token_priority": 0.0000162, "cache_read_input_token_cost_priority": 2.7e-7, - "supports_service_tier": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "vertex_ai/gemini-3.5-flash-lite": { + "cache_read_input_token_cost": 3e-8, + "cache_read_input_token_cost_flex": 2e-8, + "cache_read_input_token_cost_priority": 5e-8, + "input_cost_per_token": 3e-7, + "input_cost_per_token_batches": 1.5e-7, + "input_cost_per_token_flex": 1.5e-7, + "input_cost_per_token_priority": 5.4e-7, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_reasoning_token": 0.0000025, + "output_cost_per_token": 0.0000025, + "output_cost_per_token_batches": 0.00000125, + "output_cost_per_token_flex": 0.00000125, + "output_cost_per_token_priority": 0.0000045, + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_audio_output": false, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_native_streaming": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "vertex_ai/gemini-3.6-flash": { + "cache_read_input_token_cost": 1.5e-7, + "cache_read_input_token_cost_flex": 7.5e-8, + "input_cost_per_token": 0.0000015, + "input_cost_per_token_batches": 7.5e-7, + "input_cost_per_token_flex": 7.5e-7, + "litellm_provider": "vertex_ai", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_reasoning_token": 0.0000075, + "output_cost_per_token": 0.0000075, + "output_cost_per_token_batches": 0.00000375, + "output_cost_per_token_flex": 0.00000375, + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_native_streaming": true, + "input_cost_per_token_priority": 0.0000027, + "output_cost_per_token_priority": 0.0000135, + "cache_read_input_token_cost_priority": 2.7e-7, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -35633,6 +37595,48 @@ "supports_vision": true, "supports_web_search": true }, + "xai/grok-4.5": { + "cache_read_input_token_cost": 5e-7, + "cache_read_input_token_cost_above_200k_tokens": 0.000001, + "input_cost_per_token": 0.000002, + "input_cost_per_token_above_200k_tokens": 0.000004, + "litellm_provider": "xai", + "max_input_tokens": 500000, + "max_output_tokens": 500000, + "max_tokens": 500000, + "mode": "chat", + "output_cost_per_token": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.000012, + "source": "https://docs.x.ai/docs/models", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, + "xai/grok-4.5-latest": { + "cache_read_input_token_cost": 5e-7, + "cache_read_input_token_cost_above_200k_tokens": 0.000001, + "input_cost_per_token": 0.000002, + "input_cost_per_token_above_200k_tokens": 0.000004, + "litellm_provider": "xai", + "max_input_tokens": 500000, + "max_output_tokens": 500000, + "max_tokens": 500000, + "mode": "chat", + "output_cost_per_token": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.000012, + "source": "https://docs.x.ai/docs/models", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, "xai/grok-beta": { "input_cost_per_token": 0.000005, "litellm_provider": "xai", @@ -35857,6 +37861,21 @@ "supports_tool_choice": true, "source": "https://docs.z.ai/guides/overview/pricing" }, + "zai/glm-4.7-flash": { + "cache_creation_input_token_cost": 0, + "cache_read_input_token_cost": 0, + "input_cost_per_token": 0, + "output_cost_per_token": 0, + "litellm_provider": "zai", + "max_input_tokens": 200000, + "max_output_tokens": 128000, + "mode": "chat", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true, + "source": "https://docs.z.ai/guides/overview/pricing" + }, "zai/glm-5": { "cache_creation_input_token_cost": 0, "cache_read_input_token_cost": 2e-7, @@ -35886,5 +37905,20 @@ "supports_reasoning": true, "supports_tool_choice": true, "source": "https://docs.z.ai/guides/overview/pricing" + }, + "zai/glm-5.1": { + "cache_creation_input_token_cost": 0, + "cache_read_input_token_cost": 2.6e-7, + "input_cost_per_token": 0.0000014, + "output_cost_per_token": 0.0000044, + "litellm_provider": "zai", + "max_input_tokens": 200000, + "max_output_tokens": 128000, + "mode": "chat", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true, + "source": "https://docs.z.ai/guides/overview/pricing" } } \ No newline at end of file From 5388f069864dbd6ac8542b2d5c2485dcbc527c32 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 29 Jul 2026 01:32:38 -0400 Subject: [PATCH 14/15] Outside of git roots, and outside of home folders allow for searches of reasonable breadth and depth into file system, update in efficient iterator --- cecli/helpers/file_system/builders.py | 92 ++++++++++++++++++--------- cecli/tui/app.py | 29 ++++++--- 2 files changed, 81 insertions(+), 40 deletions(-) diff --git a/cecli/helpers/file_system/builders.py b/cecli/helpers/file_system/builders.py index ee057d00b79..f126081429f 100644 --- a/cecli/helpers/file_system/builders.py +++ b/cecli/helpers/file_system/builders.py @@ -110,41 +110,71 @@ class ScandirBuilder: @staticmethod def collect( root: str, - ignore_filter: FileIgnoreFilter | None = None, + ignore_filter: "FileIgnoreFilter | None" = None, + max_files: int = 65536, # 2^14 hard limit + max_depth: int = 5, # 5 levels deep limit ) -> list[str]: """ - Walk filesystem collecting files relative to root. - - Prunes ignored directories during walk (never descends into them), - avoiding wasted I/O on subtrees like ``node_modules/``. - - Args: - root: Root directory to scan - ignore_filter: Optional ignore rules for filtering - - Returns: - Sorted list of root-relative paths (POSIX-style) + Walk filesystem collecting files relative to root using Breadth-First Search. + Highly optimized: lazy iteration, single-pass evaluation, and raw string paths. """ paths = [] - root_path = Path(root).resolve() - - for dirpath, dirnames, filenames in os.walk(root_path): - rel_dir = os.path.relpath(dirpath, root) - - # Prune ignored directories in-place (os.walk obeys this) - if ignore_filter: - dirnames[:] = [ - d - for d in dirnames - if not ignore_filter.is_dir_ignored(os.path.join(rel_dir, d)) - ] - - for filename in filenames: - rel_path = os.path.join(rel_dir, filename) if rel_dir != "." else filename - if ignore_filter and ignore_filter.is_file_ignored(rel_path): - continue - # Normalize to POSIX-style paths - paths.append(rel_path.replace(os.sep, "/")) + + # Only use pathlib for initial resolution, then stick to raw strings for speed + root_path_obj = Path(root).resolve() + root_path_str = str(root_path_obj) + + path_parts = [part.lower() for part in root_path_obj.parts] + is_subfolder_of_user = "home" in path_parts[:-1] or "users" in path_parts[:-1] + + # Queue: (absolute_path_string, relative_posix_path, current_depth) + dirs_to_scan = [(root_path_str, ".", 0)] + path_count = 0 + + while dirs_to_scan: + next_dirs = [] + + for current_path, rel_dir, depth in dirs_to_scan: + try: + # Keep it as an iterator; do NOT cast to list() + with os.scandir(current_path) as it: + file_count = 0 + + # Single pass through the directory contents + for entry in it: + # --- Handle Directories --- + if entry.is_dir(follow_symlinks=False): + if depth < max_depth: + child_rel_path = entry.name if rel_dir == "." else f"{rel_dir}/{entry.name}" + + if ignore_filter and ignore_filter.is_dir_ignored(child_rel_path): + continue + + # Append the raw string path, avoiding slow pathlib instantiations + next_dirs.append((entry.path, child_rel_path, depth + 1)) + + # --- Handle Files --- + elif entry.is_file(follow_symlinks=False): + # Short-circuit if we hit the 64 file cap (saves ignore_filter overhead) + if not is_subfolder_of_user and file_count >= 256: + continue + + child_rel_path = entry.name if rel_dir == "." else f"{rel_dir}/{entry.name}" + + if ignore_filter and ignore_filter.is_file_ignored(child_rel_path): + continue + + paths.append(child_rel_path) + file_count += 1 + path_count += 1 + + # Global safety hard-stop + if not is_subfolder_of_user and path_count >= max_files: + return sorted(paths) + except PermissionError: + continue # Skip folders we don't have read access to + + dirs_to_scan = next_dirs return sorted(paths) diff --git a/cecli/tui/app.py b/cecli/tui/app.py index ec062ceda49..3a00ef01c45 100644 --- a/cecli/tui/app.py +++ b/cecli/tui/app.py @@ -1430,20 +1430,27 @@ def _get_symbol_completions(self, prefix: str) -> list[str]: should_sort = True if prefix: - matches = self._get_path_completions(prefix) - matches.extend(sorted([s for s in symbols if prefix_lower in s.lower()])) + matches, matches_set = self._get_path_completions(prefix) + # Use a set to efficiently filter out symbols already in matches + for s in symbols: + if prefix_lower in s.lower() and s not in matches_set: + matches.append(s) + matches_set.add(s) should_sort = False else: matches = list(symbols) - matches = list(dict.fromkeys(matches)) return matches[:50] if not should_sort else sorted(matches)[:50] - def _get_path_completions(self, prefix: str) -> list[str]: + def _get_path_completions(self, prefix: str) -> tuple[list[str], set[str]]: """Get filesystem path completions relative to coder root. Uses FileSystemService when available for efficient trie/trigram lookups, with fallback to legacy filesystem iteration. + + Returns: + tuple[list[str], set[str]]: A tuple of (ordered_list, fast_lookup_set) + containing the matched path completions. """ coder = self.worker.coder root = Path(coder.root) if hasattr(coder, "root") else Path.cwd() @@ -1462,7 +1469,8 @@ def _get_path_completions(self, prefix: str) -> list[str]: matches = fs.search(prefix, threshold=0.1) if matches: - return matches if is_fuzzy else sorted(matches) + result = sorted(matches) if not is_fuzzy else matches + return result, set(result) except Exception: pass @@ -1493,7 +1501,8 @@ def _get_path_completions(self, prefix: str) -> list[str]: except (PermissionError, OSError): pass - return sorted(completions) + result = sorted(completions) + return result, set(result) def _get_suggestions(self, text: str) -> list[str]: """Get completion suggestions for given text.""" @@ -1550,7 +1559,7 @@ def _get_suggestions(self, text: str) -> list[str]: # Check if this command needs path-based completion if cmd_name in self.PATH_COMPLETION_COMMANDS: - suggestions = self._get_path_completions(arg_prefix) + suggestions, suggestions_set = self._get_path_completions(arg_prefix) # For /read-only and /read-only-stub, also include add completions if cmd_name in {"/add", "/read-only", "/read-only-stub"}: try: @@ -1558,8 +1567,10 @@ def _get_suggestions(self, text: str) -> list[str]: commands.get_completions(cmd_name, coder=active_coder) or [] ) for c in add_completions: - if arg_prefix_lower in str(c).lower() and str(c) not in suggestions: - suggestions.append(str(c)) + c_str = str(c) + if arg_prefix_lower in c_str.lower() and c_str not in suggestions_set: + suggestions.append(c_str) + suggestions_set.add(c_str) except Exception: pass else: From 22851917567315b00affa3069aa8164acb9ddf99 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 29 Jul 2026 01:40:33 -0400 Subject: [PATCH 15/15] Fix formatting --- cecli/helpers/file_system/builders.py | 36 ++++++++++++++++----------- cecli/tui/app.py | 5 +++- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/cecli/helpers/file_system/builders.py b/cecli/helpers/file_system/builders.py index f126081429f..5389ea50ef8 100644 --- a/cecli/helpers/file_system/builders.py +++ b/cecli/helpers/file_system/builders.py @@ -112,62 +112,68 @@ def collect( root: str, ignore_filter: "FileIgnoreFilter | None" = None, max_files: int = 65536, # 2^14 hard limit - max_depth: int = 5, # 5 levels deep limit + max_depth: int = 5, # 5 levels deep limit ) -> list[str]: """ Walk filesystem collecting files relative to root using Breadth-First Search. Highly optimized: lazy iteration, single-pass evaluation, and raw string paths. """ paths = [] - + # Only use pathlib for initial resolution, then stick to raw strings for speed root_path_obj = Path(root).resolve() root_path_str = str(root_path_obj) path_parts = [part.lower() for part in root_path_obj.parts] is_subfolder_of_user = "home" in path_parts[:-1] or "users" in path_parts[:-1] - + # Queue: (absolute_path_string, relative_posix_path, current_depth) dirs_to_scan = [(root_path_str, ".", 0)] path_count = 0 while dirs_to_scan: next_dirs = [] - + for current_path, rel_dir, depth in dirs_to_scan: try: # Keep it as an iterator; do NOT cast to list() with os.scandir(current_path) as it: file_count = 0 - + # Single pass through the directory contents for entry in it: # --- Handle Directories --- if entry.is_dir(follow_symlinks=False): if depth < max_depth: - child_rel_path = entry.name if rel_dir == "." else f"{rel_dir}/{entry.name}" - - if ignore_filter and ignore_filter.is_dir_ignored(child_rel_path): + child_rel_path = ( + entry.name if rel_dir == "." else f"{rel_dir}/{entry.name}" + ) + + if ignore_filter and ignore_filter.is_dir_ignored( + child_rel_path + ): continue - + # Append the raw string path, avoiding slow pathlib instantiations next_dirs.append((entry.path, child_rel_path, depth + 1)) - + # --- Handle Files --- elif entry.is_file(follow_symlinks=False): # Short-circuit if we hit the 64 file cap (saves ignore_filter overhead) if not is_subfolder_of_user and file_count >= 256: continue - - child_rel_path = entry.name if rel_dir == "." else f"{rel_dir}/{entry.name}" - + + child_rel_path = ( + entry.name if rel_dir == "." else f"{rel_dir}/{entry.name}" + ) + if ignore_filter and ignore_filter.is_file_ignored(child_rel_path): continue - + paths.append(child_rel_path) file_count += 1 path_count += 1 - + # Global safety hard-stop if not is_subfolder_of_user and path_count >= max_files: return sorted(paths) diff --git a/cecli/tui/app.py b/cecli/tui/app.py index 3a00ef01c45..991d94bc19e 100644 --- a/cecli/tui/app.py +++ b/cecli/tui/app.py @@ -1568,7 +1568,10 @@ def _get_suggestions(self, text: str) -> list[str]: ) for c in add_completions: c_str = str(c) - if arg_prefix_lower in c_str.lower() and c_str not in suggestions_set: + if ( + arg_prefix_lower in c_str.lower() + and c_str not in suggestions_set + ): suggestions.append(c_str) suggestions_set.add(c_str) except Exception: