diff --git a/Cargo.lock b/Cargo.lock index 6f214eb6fec..f1fd693c18d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2962,7 +2962,7 @@ dependencies = [ [[package]] name = "goose" -version = "1.19.0" +version = "1.19.1" dependencies = [ "agent-client-protocol-schema", "ahash", @@ -3053,7 +3053,7 @@ dependencies = [ [[package]] name = "goose-bench" -version = "1.19.0" +version = "1.19.1" dependencies = [ "anyhow", "async-trait", @@ -3076,7 +3076,7 @@ dependencies = [ [[package]] name = "goose-cli" -version = "1.19.0" +version = "1.19.1" dependencies = [ "agent-client-protocol-schema", "anstream", @@ -3132,7 +3132,7 @@ dependencies = [ [[package]] name = "goose-mcp" -version = "1.19.0" +version = "1.19.1" dependencies = [ "anyhow", "async-trait", @@ -3197,7 +3197,7 @@ dependencies = [ [[package]] name = "goose-server" -version = "1.19.0" +version = "1.19.1" dependencies = [ "anyhow", "async-trait", @@ -3243,7 +3243,7 @@ dependencies = [ [[package]] name = "goose-test" -version = "1.19.0" +version = "1.19.1" dependencies = [ "clap", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index ea49b40cb0d..d6a4e26ac0e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ resolver = "2" [workspace.package] edition = "2021" -version = "1.19.0" +version = "1.19.1" authors = ["Block "] license = "Apache-2.0" repository = "https://github.com/block/goose" diff --git a/crates/goose/src/providers/canonical/data/canonical_mapping_report.json b/crates/goose/src/providers/canonical/data/canonical_mapping_report.json index 254e37d87de..afb7cca299b 100644 --- a/crates/goose/src/providers/canonical/data/canonical_mapping_report.json +++ b/crates/goose/src/providers/canonical/data/canonical_mapping_report.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-01-06T00:31:30.015565735+00:00", + "timestamp": "2026-01-06T20:37:25.400825932+00:00", "unmapped_models": [ { "provider": "openai", @@ -2393,18 +2393,6 @@ "provider": "openrouter", "model": "meta-llama/llama-3.3-70b-instruct:free" }, - { - "provider": "openrouter", - "model": "microsoft/phi-3-medium-128k-instruct" - }, - { - "provider": "openrouter", - "model": "microsoft/phi-3-mini-128k-instruct" - }, - { - "provider": "openrouter", - "model": "microsoft/phi-3.5-mini-128k-instruct" - }, { "provider": "openrouter", "model": "minimax/minimax-m1" @@ -2707,44 +2695,6 @@ } ], "all_mappings": { - "anthropic": [ - { - "provider_model": "claude-3-5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku" - }, - { - "provider_model": "claude-3-7-sonnet-20250219", - "canonical_model": "anthropic/claude-3.7-sonnet" - }, - { - "provider_model": "claude-3-haiku-20240307", - "canonical_model": "anthropic/claude-3-haiku" - }, - { - "provider_model": "claude-haiku-4-5-20251001", - "canonical_model": "anthropic/claude-haiku-4.5" - }, - { - "provider_model": "claude-opus-4-1-20250805", - "canonical_model": "anthropic/claude-opus-4.1" - }, - { - "provider_model": "claude-opus-4-20250514", - "canonical_model": "anthropic/claude-opus-4" - }, - { - "provider_model": "claude-opus-4-5-20251101", - "canonical_model": "anthropic/claude-opus-4.5" - }, - { - "provider_model": "claude-sonnet-4-20250514", - "canonical_model": "anthropic/claude-sonnet-4" - }, - { - "provider_model": "claude-sonnet-4-5-20250929", - "canonical_model": "anthropic/claude-sonnet-4.5" - } - ], "openrouter": [ { "provider_model": "ai21/jamba-large-1.7", @@ -3679,6 +3629,44 @@ ], "tetrate": [], "xai": [], + "anthropic": [ + { + "provider_model": "claude-3-5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku" + }, + { + "provider_model": "claude-3-7-sonnet-20250219", + "canonical_model": "anthropic/claude-3.7-sonnet" + }, + { + "provider_model": "claude-3-haiku-20240307", + "canonical_model": "anthropic/claude-3-haiku" + }, + { + "provider_model": "claude-haiku-4-5-20251001", + "canonical_model": "anthropic/claude-haiku-4.5" + }, + { + "provider_model": "claude-opus-4-1-20250805", + "canonical_model": "anthropic/claude-opus-4.1" + }, + { + "provider_model": "claude-opus-4-20250514", + "canonical_model": "anthropic/claude-opus-4" + }, + { + "provider_model": "claude-opus-4-5-20251101", + "canonical_model": "anthropic/claude-opus-4.5" + }, + { + "provider_model": "claude-sonnet-4-20250514", + "canonical_model": "anthropic/claude-sonnet-4" + }, + { + "provider_model": "claude-sonnet-4-5-20250929", + "canonical_model": "anthropic/claude-sonnet-4.5" + } + ], "google": [ { "provider_model": "gemini-2.0-flash", @@ -3769,8 +3757,8 @@ "mapped_models": [ { "provider": "anthropic", - "model": "claude-opus-4-1-20250805", - "canonical": "anthropic/claude-opus-4.1" + "model": "claude-3-7-sonnet-20250219", + "canonical": "anthropic/claude-3.7-sonnet" }, { "provider": "anthropic", @@ -3782,11 +3770,21 @@ "model": "claude-sonnet-4-5-20250929", "canonical": "anthropic/claude-sonnet-4.5" }, + { + "provider": "anthropic", + "model": "claude-sonnet-4-20250514", + "canonical": "anthropic/claude-sonnet-4" + }, { "provider": "anthropic", "model": "claude-3-5-haiku-20241022", "canonical": "anthropic/claude-3.5-haiku" }, + { + "provider": "anthropic", + "model": "claude-haiku-4-5-20251001", + "canonical": "anthropic/claude-haiku-4.5" + }, { "provider": "anthropic", "model": "claude-opus-4-5-20251101", @@ -3799,113 +3797,113 @@ }, { "provider": "anthropic", - "model": "claude-sonnet-4-20250514", - "canonical": "anthropic/claude-sonnet-4" + "model": "claude-opus-4-1-20250805", + "canonical": "anthropic/claude-opus-4.1" }, { - "provider": "anthropic", - "model": "claude-3-7-sonnet-20250219", - "canonical": "anthropic/claude-3.7-sonnet" + "provider": "openai", + "model": "gpt-4-turbo-2024-04-09", + "canonical": "openai/gpt-4-turbo" }, { - "provider": "anthropic", - "model": "claude-haiku-4-5-20251001", - "canonical": "anthropic/claude-haiku-4.5" + "provider": "openai", + "model": "gpt-5-chat-latest", + "canonical": "openai/gpt-5-chat" }, { "provider": "openai", - "model": "gpt-4o-mini", - "canonical": "openai/gpt-4o-mini" + "model": "o3-deep-research-2025-06-26", + "canonical": "openai/o3-deep-research" }, { "provider": "openai", - "model": "gpt-5-pro", - "canonical": "openai/gpt-5-pro" + "model": "o1-pro", + "canonical": "openai/o1-pro" }, { "provider": "openai", - "model": "gpt-4o-audio-preview-2025-06-03", - "canonical": "openai/gpt-4o-audio" + "model": "gpt-3.5-turbo-instruct-0914", + "canonical": "openai/gpt-3.5-turbo-instruct" }, { "provider": "openai", - "model": "gpt-5.1-2025-11-13", - "canonical": "openai/gpt-5.1" + "model": "gpt-4.1", + "canonical": "openai/gpt-4.1" }, { "provider": "openai", - "model": "o3", - "canonical": "openai/o3" + "model": "gpt-5", + "canonical": "openai/gpt-5" }, { "provider": "openai", - "model": "gpt-3.5-turbo-instruct-0914", - "canonical": "openai/gpt-3.5-turbo-instruct" + "model": "gpt-5-nano-2025-08-07", + "canonical": "openai/gpt-5-nano" }, { "provider": "openai", - "model": "gpt-4-0613", - "canonical": "openai/gpt-4" + "model": "gpt-4-turbo", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openai", - "model": "o3-deep-research-2025-06-26", - "canonical": "openai/o3-deep-research" + "model": "gpt-4", + "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "gpt-4o-2024-11-20", - "canonical": "openai/gpt-4o" + "model": "gpt-5-nano", + "canonical": "openai/gpt-5-nano" }, { "provider": "openai", - "model": "codex-mini-latest", - "canonical": "openai/codex-mini" + "model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical": "openai/gpt-4o-mini-search" }, { "provider": "openai", - "model": "gpt-4-turbo", - "canonical": "openai/gpt-4-turbo" + "model": "gpt-5.1", + "canonical": "openai/gpt-5.1" }, { "provider": "openai", - "model": "o4-mini-2025-04-16", - "canonical": "openai/o4-mini" + "model": "gpt-5.2-2025-12-11", + "canonical": "openai/gpt-5.2" }, { "provider": "openai", - "model": "gpt-3.5-turbo-1106", - "canonical": "openai/gpt-3.5-turbo" + "model": "o1-2024-12-17", + "canonical": "openai/o1" }, { "provider": "openai", - "model": "gpt-5-2025-08-07", - "canonical": "openai/gpt-5" + "model": "gpt-4.1-2025-04-14", + "canonical": "openai/gpt-4.1" }, { "provider": "openai", - "model": "chatgpt-4o-latest", - "canonical": "openai/chatgpt-4o" + "model": "gpt-4o-audio-preview-2024-12-17", + "canonical": "openai/gpt-4o-audio" }, { "provider": "openai", - "model": "gpt-5.2-2025-12-11", - "canonical": "openai/gpt-5.2" + "model": "gpt-4-1106-preview", + "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "gpt-5-mini", - "canonical": "openai/gpt-5-mini" + "model": "gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" }, { "provider": "openai", - "model": "o4-mini-deep-research", - "canonical": "openai/o4-mini-deep-research" + "model": "o3-deep-research", + "canonical": "openai/o3-deep-research" }, { "provider": "openai", - "model": "o3-2025-04-16", - "canonical": "openai/o3" + "model": "gpt-4o-2024-08-06", + "canonical": "openai/gpt-4o" }, { "provider": "openai", @@ -3914,48 +3912,48 @@ }, { "provider": "openai", - "model": "gpt-4-1106-preview", - "canonical": "openai/gpt-4" + "model": "gpt-4o-search-preview-2025-03-11", + "canonical": "openai/gpt-4o-search" }, { "provider": "openai", - "model": "gpt-5-mini-2025-08-07", - "canonical": "openai/gpt-5-mini" + "model": "o1-pro-2025-03-19", + "canonical": "openai/o1-pro" }, { "provider": "openai", - "model": "gpt-4o-search-preview", - "canonical": "openai/gpt-4o-search" + "model": "gpt-4o", + "canonical": "openai/gpt-4o" }, { "provider": "openai", - "model": "gpt-5.1-codex-max", - "canonical": "openai/gpt-5.1-codex-max" + "model": "o4-mini", + "canonical": "openai/o4-mini" }, { "provider": "openai", - "model": "gpt-5.2", - "canonical": "openai/gpt-5.2" + "model": "gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openai", - "model": "gpt-5.2-pro-2025-12-11", - "canonical": "openai/gpt-5.2-pro" + "model": "gpt-4-turbo-preview", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openai", - "model": "o1-pro", - "canonical": "openai/o1-pro" + "model": "gpt-5-mini-2025-08-07", + "canonical": "openai/gpt-5-mini" }, { "provider": "openai", - "model": "gpt-5", - "canonical": "openai/gpt-5" + "model": "gpt-5-pro", + "canonical": "openai/gpt-5-pro" }, { "provider": "openai", - "model": "gpt-4-turbo-2024-04-09", - "canonical": "openai/gpt-4-turbo" + "model": "gpt-4-0613", + "canonical": "openai/gpt-4" }, { "provider": "openai", @@ -3964,53 +3962,53 @@ }, { "provider": "openai", - "model": "gpt-4.1", - "canonical": "openai/gpt-4.1" + "model": "gpt-5.1-codex", + "canonical": "openai/gpt-5.1-codex" }, { "provider": "openai", - "model": "o3-mini", - "canonical": "openai/o3-mini" + "model": "gpt-5.1-codex-max", + "canonical": "openai/gpt-5.1-codex-max" }, { "provider": "openai", - "model": "gpt-4o", - "canonical": "openai/gpt-4o" + "model": "gpt-5.1-codex-mini", + "canonical": "openai/gpt-5.1-codex-mini" }, { "provider": "openai", - "model": "gpt-4o-audio-preview", - "canonical": "openai/gpt-4o-audio" + "model": "gpt-4.1-nano", + "canonical": "openai/gpt-4.1-nano" }, { "provider": "openai", - "model": "o3-deep-research", - "canonical": "openai/o3-deep-research" + "model": "gpt-3.5-turbo-0125", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openai", - "model": "gpt-4.1-nano", - "canonical": "openai/gpt-4.1-nano" + "model": "gpt-4-0125-preview", + "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "gpt-5.1", - "canonical": "openai/gpt-5.1" + "model": "gpt-4o-mini-search-preview", + "canonical": "openai/gpt-4o-mini-search" }, { "provider": "openai", - "model": "gpt-5.1-codex", - "canonical": "openai/gpt-5.1-codex" + "model": "gpt-5.2", + "canonical": "openai/gpt-5.2" }, { "provider": "openai", - "model": "o4-mini", - "canonical": "openai/o4-mini" + "model": "o4-mini-deep-research-2025-06-26", + "canonical": "openai/o4-mini-deep-research" }, { "provider": "openai", - "model": "gpt-4.1-nano-2025-04-14", - "canonical": "openai/gpt-4.1-nano" + "model": "gpt-3.5-turbo", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openai", @@ -4019,133 +4017,133 @@ }, { "provider": "openai", - "model": "gpt-5.2-chat-latest", - "canonical": "openai/gpt-5.2-chat" + "model": "gpt-4o-search-preview", + "canonical": "openai/gpt-4o-search" }, { "provider": "openai", - "model": "gpt-4-0314", - "canonical": "openai/gpt-4" + "model": "gpt-3.5-turbo-instruct", + "canonical": "openai/gpt-3.5-turbo-instruct" }, { "provider": "openai", - "model": "gpt-4", - "canonical": "openai/gpt-4" + "model": "gpt-5.2-chat-latest", + "canonical": "openai/gpt-5.2-chat" }, { "provider": "openai", - "model": "gpt-4-turbo-preview", - "canonical": "openai/gpt-4-turbo" + "model": "o3", + "canonical": "openai/o3" }, { "provider": "openai", - "model": "gpt-3.5-turbo", - "canonical": "openai/gpt-3.5-turbo" + "model": "gpt-4.1-nano-2025-04-14", + "canonical": "openai/gpt-4.1-nano" }, { "provider": "openai", - "model": "gpt-5-chat-latest", - "canonical": "openai/gpt-5-chat" + "model": "gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" }, { "provider": "openai", - "model": "gpt-4-0125-preview", - "canonical": "openai/gpt-4" + "model": "o3-mini-2025-01-31", + "canonical": "openai/o3-mini" }, { "provider": "openai", - "model": "gpt-5-nano", - "canonical": "openai/gpt-5-nano" + "model": "gpt-4o-audio-preview", + "canonical": "openai/gpt-4o-audio" }, { "provider": "openai", - "model": "o1", - "canonical": "openai/o1" + "model": "codex-mini-latest", + "canonical": "openai/codex-mini" }, { "provider": "openai", - "model": "o1-2024-12-17", - "canonical": "openai/o1" + "model": "gpt-4.1-mini-2025-04-14", + "canonical": "openai/gpt-4.1-mini" }, { "provider": "openai", - "model": "o4-mini-deep-research-2025-06-26", - "canonical": "openai/o4-mini-deep-research" + "model": "o3-pro", + "canonical": "openai/o3-pro" }, { "provider": "openai", - "model": "gpt-4o-mini-search-preview", - "canonical": "openai/gpt-4o-mini-search" + "model": "gpt-5-2025-08-07", + "canonical": "openai/gpt-5" }, { "provider": "openai", - "model": "gpt-4o-2024-08-06", - "canonical": "openai/gpt-4o" + "model": "o4-mini-deep-research", + "canonical": "openai/o4-mini-deep-research" }, { "provider": "openai", - "model": "o1-pro-2025-03-19", - "canonical": "openai/o1-pro" + "model": "gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openai", - "model": "gpt-3.5-turbo-16k", - "canonical": "openai/gpt-3.5-turbo-16k" + "model": "o1", + "canonical": "openai/o1" }, { "provider": "openai", - "model": "gpt-5.1-codex-mini", - "canonical": "openai/gpt-5.1-codex-mini" + "model": "gpt-4o-audio-preview-2025-06-03", + "canonical": "openai/gpt-4o-audio" }, { "provider": "openai", - "model": "gpt-4.1-2025-04-14", - "canonical": "openai/gpt-4.1" + "model": "o3-2025-04-16", + "canonical": "openai/o3" }, { "provider": "openai", - "model": "gpt-4.1-mini-2025-04-14", - "canonical": "openai/gpt-4.1-mini" + "model": "gpt-5.2-pro", + "canonical": "openai/gpt-5.2-pro" }, { "provider": "openai", - "model": "o3-mini-2025-01-31", - "canonical": "openai/o3-mini" + "model": "gpt-3.5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" }, { "provider": "openai", - "model": "gpt-4o-mini-search-preview-2025-03-11", - "canonical": "openai/gpt-4o-mini-search" + "model": "gpt-3.5-turbo-1106", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openai", - "model": "gpt-4o-mini-2024-07-18", - "canonical": "openai/gpt-4o-mini" + "model": "gpt-4-0314", + "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "o3-pro-2025-06-10", - "canonical": "openai/o3-pro" + "model": "gpt-5-mini", + "canonical": "openai/gpt-5-mini" }, { "provider": "openai", - "model": "gpt-3.5-turbo-instruct", - "canonical": "openai/gpt-3.5-turbo-instruct" + "model": "gpt-5.2-pro-2025-12-11", + "canonical": "openai/gpt-5.2-pro" }, { "provider": "openai", - "model": "gpt-4o-search-preview-2025-03-11", - "canonical": "openai/gpt-4o-search" + "model": "o3-mini", + "canonical": "openai/o3-mini" }, { "provider": "openai", - "model": "gpt-4o-audio-preview-2024-12-17", - "canonical": "openai/gpt-4o-audio" + "model": "o3-pro-2025-06-10", + "canonical": "openai/o3-pro" }, { "provider": "openai", - "model": "o3-pro", - "canonical": "openai/o3-pro" + "model": "o4-mini-2025-04-16", + "canonical": "openai/o4-mini" }, { "provider": "openai", @@ -4154,138 +4152,138 @@ }, { "provider": "openai", - "model": "gpt-3.5-turbo-0125", - "canonical": "openai/gpt-3.5-turbo" + "model": "gpt-5.1-2025-11-13", + "canonical": "openai/gpt-5.1" }, { "provider": "openai", - "model": "gpt-5.2-pro", - "canonical": "openai/gpt-5.2-pro" + "model": "chatgpt-4o-latest", + "canonical": "openai/chatgpt-4o" }, { - "provider": "openai", - "model": "gpt-5-nano-2025-08-07", - "canonical": "openai/gpt-5-nano" + "provider": "openrouter", + "model": "mistralai/mistral-large-2512", + "canonical": "mistralai/mistral-large" }, { - "provider": "openai", - "model": "gpt-4o-2024-05-13", - "canonical": "openai/gpt-4o" + "provider": "openrouter", + "model": "anthropic/claude-opus-4.5", + "canonical": "anthropic/claude-opus-4.5" }, { "provider": "openrouter", - "model": "openai/gpt-4o-mini-2024-07-18", - "canonical": "openai/gpt-4o-mini" + "model": "openai/gpt-5-pro", + "canonical": "openai/gpt-5-pro" }, { "provider": "openrouter", - "model": "deepseek/deepseek-r1-distill-llama-70b", - "canonical": "deepseek/deepseek-r1-distill-llama-70b" + "model": "openai/o3-deep-research", + "canonical": "openai/o3-deep-research" }, { "provider": "openrouter", - "model": "qwen/qwen3-30b-a3b", - "canonical": "qwen/qwen3-30b-a3b" + "model": "deepseek/deepseek-r1", + "canonical": "deepseek/deepseek-r1" }, { "provider": "openrouter", - "model": "x-ai/grok-4-fast", - "canonical": "x-ai/grok-4-fast" + "model": "qwen/qwen3-vl-8b-thinking", + "canonical": "qwen/qwen3-vl-8b-thinking" }, { "provider": "openrouter", - "model": "qwen/qwen3-8b", - "canonical": "qwen/qwen3-8b" + "model": "qwen/qwq-32b", + "canonical": "qwen/qwq-32b" }, { "provider": "openrouter", - "model": "google/gemini-2.5-pro", - "canonical": "google/gemini-2.5-pro" + "model": "google/gemini-2.5-flash", + "canonical": "google/gemini-2.5-flash" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash-preview-09-2025", - "canonical": "google/gemini-2.5-flash" + "model": "mistralai/mistral-small-3.1-24b-instruct", + "canonical": "mistralai/mistral-small-3.1-24b-instruct" }, { "provider": "openrouter", - "model": "qwen/qwen-plus-2025-07-28:thinking", - "canonical": "qwen/qwen-plus-2025-07-28:thinking" + "model": "openai/gpt-5.2", + "canonical": "openai/gpt-5.2" }, { "provider": "openrouter", - "model": "qwen/qwen3-30b-a3b-instruct-2507", - "canonical": "qwen/qwen3-30b-a3b-instruct" + "model": "deepseek/deepseek-v3.2-exp", + "canonical": "deepseek/deepseek" }, { "provider": "openrouter", - "model": "qwen/qwen3-vl-8b-thinking", - "canonical": "qwen/qwen3-vl-8b-thinking" + "model": "openai/o3-mini", + "canonical": "openai/o3-mini" }, { "provider": "openrouter", - "model": "anthropic/claude-3.5-sonnet", - "canonical": "anthropic/claude-3.5-sonnet" + "model": "x-ai/grok-3-mini", + "canonical": "x-ai/grok-3-mini" }, { "provider": "openrouter", - "model": "deepseek/deepseek-v3.2", - "canonical": "deepseek/deepseek" + "model": "cohere/command-r-plus-08-2024", + "canonical": "cohere/command-r-plus-08" }, { "provider": "openrouter", - "model": "openai/gpt-4-0314", - "canonical": "openai/gpt-4" + "model": "openai/o4-mini", + "canonical": "openai/o4-mini" }, { "provider": "openrouter", - "model": "mistralai/voxtral-small-24b-2507", - "canonical": "mistralai/voxtral-small-24b" + "model": "qwen/qwen3-8b", + "canonical": "qwen/qwen3-8b" }, { "provider": "openrouter", - "model": "deepseek/deepseek-v3.1-terminus:exacto", - "canonical": "deepseek/deepseek-v3.1-terminus" + "model": "anthropic/claude-3.5-haiku", + "canonical": "anthropic/claude-3.5-haiku" }, { "provider": "openrouter", - "model": "mistralai/pixtral-large-2411", - "canonical": "mistralai/pixtral-large" + "model": "mistralai/ministral-8b-2512", + "canonical": "mistralai/ministral-8b" }, { "provider": "openrouter", - "model": "openai/gpt-5-image-mini", - "canonical": "openai/gpt-5-image-mini" + "model": "openai/gpt-5.1-codex-max", + "canonical": "openai/gpt-5.1-codex-max" }, { "provider": "openrouter", - "model": "openai/gpt-5-pro", - "canonical": "openai/gpt-5-pro" + "model": "openai/gpt-5.2-pro", + "canonical": "openai/gpt-5.2-pro" }, { "provider": "openrouter", - "model": "openai/o3-pro", - "canonical": "openai/o3-pro" + "model": "qwen/qwen3-30b-a3b-thinking-2507", + "canonical": "qwen/qwen3-30b-a3b-thinking" }, { "provider": "openrouter", - "model": "deepseek/deepseek-chat", - "canonical": "deepseek/deepseek-chat" + "model": "anthropic/claude-sonnet-4", + "canonical": "anthropic/claude-sonnet-4" }, { "provider": "openrouter", - "model": "mistralai/mistral-tiny", - "canonical": "mistralai/mistral-tiny" + "model": "google/gemini-3-pro-preview", + "canonical": "google/gemini-3-pro" }, { "provider": "openrouter", - "model": "google/gemma-3-27b-it", - "canonical": "google/gemma-3-27b-it" + "model": "deepseek/deepseek-v3.1-terminus", + "canonical": "deepseek/deepseek-v3.1-terminus" }, { "provider": "openrouter", - "model": "qwen/qwen3-coder-30b-a3b-instruct", - "canonical": "qwen/qwen3-coder-30b-a3b-instruct" + "model": "anthropic/claude-3.5-haiku-20241022", + "canonical": "anthropic/claude-3.5-haiku" }, { "provider": "openrouter", @@ -4294,43 +4292,38 @@ }, { "provider": "openrouter", - "model": "openai/gpt-4-turbo-preview", - "canonical": "openai/gpt-4-turbo" + "model": "deepseek/deepseek-chat", + "canonical": "deepseek/deepseek-chat" }, { "provider": "openrouter", - "model": "anthropic/claude-sonnet-4.5", - "canonical": "anthropic/claude-sonnet-4.5" + "model": "meta-llama/llama-3.1-8b-instruct", + "canonical": "meta-llama/llama-3.1-8b-instruct" }, { "provider": "openrouter", - "model": "openai/gpt-5-codex", - "canonical": "openai/gpt-5-codex" + "model": "openai/o4-mini-high", + "canonical": "openai/o4-mini-high" }, { "provider": "openrouter", - "model": "openai/gpt-4.1", - "canonical": "openai/gpt-4.1" + "model": "qwen/qwen3-32b", + "canonical": "qwen/qwen3-32b" }, { "provider": "openrouter", - "model": "ai21/jamba-mini-1.7", - "canonical": "ai21/jamba-mini-1.7" + "model": "mistralai/devstral-medium", + "canonical": "mistralai/devstral-medium" }, { "provider": "openrouter", - "model": "openai/gpt-5.1-codex-mini", - "canonical": "openai/gpt-5.1-codex-mini" + "model": "mistralai/mistral-small-3.2-24b-instruct", + "canonical": "mistralai/mistral-small-3.2-24b-instruct" }, { "provider": "openrouter", - "model": "qwen/qwen3-vl-30b-a3b-instruct", - "canonical": "qwen/qwen3-vl-30b-a3b-instruct" - }, - { - "provider": "openrouter", - "model": "qwen/qwen3-vl-30b-a3b-thinking", - "canonical": "qwen/qwen3-vl-30b-a3b-thinking" + "model": "qwen/qwen3-next-80b-a3b-instruct", + "canonical": "qwen/qwen3-next-80b-a3b-instruct" }, { "provider": "openrouter", @@ -4344,643 +4337,633 @@ }, { "provider": "openrouter", - "model": "openai/gpt-oss-120b", - "canonical": "openai/gpt-oss-120b" + "model": "openai/gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "qwen/qwen3-32b", - "canonical": "qwen/qwen3-32b" + "model": "mistralai/mistral-medium-3.1", + "canonical": "mistralai/mistral-medium-3.1" }, { "provider": "openrouter", - "model": "x-ai/grok-4.1-fast", - "canonical": "x-ai/grok-4.1-fast" + "model": "meta-llama/llama-3.3-70b-instruct", + "canonical": "meta-llama/llama-3.3-70b-instruct" }, { "provider": "openrouter", - "model": "mistralai/mistral-large", - "canonical": "mistralai/mistral-large" + "model": "qwen/qwen3-coder-plus", + "canonical": "qwen/qwen3-coder-plus" }, { "provider": "openrouter", - "model": "openai/o4-mini-high", - "canonical": "openai/o4-mini-high" + "model": "openai/gpt-5-mini", + "canonical": "openai/gpt-5-mini" }, { "provider": "openrouter", - "model": "qwen/qwen-plus-2025-07-28", + "model": "qwen/qwen-plus", "canonical": "qwen/qwen-plus" }, { "provider": "openrouter", - "model": "anthropic/claude-opus-4.5", - "canonical": "anthropic/claude-opus-4.5" + "model": "openai/o1", + "canonical": "openai/o1" }, { "provider": "openrouter", - "model": "qwen/qwen3-vl-8b-instruct", - "canonical": "qwen/qwen3-vl-8b-instruct" + "model": "mistralai/mistral-small-24b-instruct-2501", + "canonical": "mistralai/mistral-small-24b-instruct" }, { "provider": "openrouter", - "model": "openai/gpt-3.5-turbo-0613", - "canonical": "openai/gpt-3.5-turbo" + "model": "openai/gpt-5.2-chat", + "canonical": "openai/gpt-5.2-chat" }, { "provider": "openrouter", - "model": "openai/gpt-oss-20b", - "canonical": "openai/gpt-oss-20b" + "model": "qwen/qwen3-vl-30b-a3b-instruct", + "canonical": "qwen/qwen3-vl-30b-a3b-instruct" }, { "provider": "openrouter", - "model": "qwen/qwen-turbo", - "canonical": "qwen/qwen-turbo" + "model": "anthropic/claude-3.7-sonnet:thinking", + "canonical": "anthropic/claude-3.7-sonnet:thinking" }, { "provider": "openrouter", - "model": "google/gemini-2.0-flash-lite-001", - "canonical": "google/gemini-2.0-flash-lite" + "model": "mistralai/mistral-small-creative", + "canonical": "mistralai/mistral-small-creative" }, { "provider": "openrouter", - "model": "mistralai/devstral-small", - "canonical": "mistralai/devstral-small" + "model": "openai/gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "openai/gpt-5.2-chat", - "canonical": "openai/gpt-5.2-chat" + "model": "mistralai/pixtral-12b", + "canonical": "mistralai/pixtral-12b" }, { "provider": "openrouter", - "model": "openai/codex-mini", - "canonical": "openai/codex-mini" + "model": "openai/gpt-5", + "canonical": "openai/gpt-5" }, { "provider": "openrouter", - "model": "mistralai/mistral-medium-3.1", - "canonical": "mistralai/mistral-medium-3.1" + "model": "openai/gpt-oss-safeguard-20b", + "canonical": "openai/gpt-oss-safeguard-20b" }, { "provider": "openrouter", - "model": "openai/gpt-5-image", - "canonical": "openai/gpt-5-image" + "model": "openai/o3", + "canonical": "openai/o3" }, { "provider": "openrouter", - "model": "openai/gpt-5-mini", - "canonical": "openai/gpt-5-mini" + "model": "meta-llama/llama-3.1-70b-instruct", + "canonical": "meta-llama/llama-3.1-70b-instruct" }, { "provider": "openrouter", - "model": "qwen/qwen3-coder:exacto", - "canonical": "qwen/qwen3-coder" + "model": "openai/gpt-3.5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" }, { "provider": "openrouter", - "model": "qwen/qwen-vl-max", - "canonical": "qwen/qwen-vl-max" + "model": "openai/gpt-4-turbo-preview", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openrouter", - "model": "mistralai/devstral-medium", - "canonical": "mistralai/devstral-medium" + "model": "mistralai/mistral-medium-3", + "canonical": "mistralai/mistral-medium-3" }, { "provider": "openrouter", - "model": "openai/gpt-4.1-nano", - "canonical": "openai/gpt-4.1-nano" + "model": "mistralai/mistral-7b-instruct", + "canonical": "mistralai/mistral-7b-instruct" }, { "provider": "openrouter", - "model": "openai/gpt-5.2", - "canonical": "openai/gpt-5.2" + "model": "meta-llama/llama-3.1-405b-instruct", + "canonical": "meta-llama/llama-3.1-405b-instruct" }, { "provider": "openrouter", - "model": "openai/gpt-4o-audio-preview", - "canonical": "openai/gpt-4o-audio" + "model": "openai/gpt-4", + "canonical": "openai/gpt-4" }, { "provider": "openrouter", - "model": "mistralai/ministral-8b", - "canonical": "mistralai/ministral-8b" + "model": "mistralai/mixtral-8x7b-instruct", + "canonical": "mistralai/mixtral-8x7b-instruct" }, { "provider": "openrouter", - "model": "openai/gpt-5-nano", - "canonical": "openai/gpt-5-nano" + "model": "ai21/jamba-mini-1.7", + "canonical": "ai21/jamba-mini-1.7" }, { "provider": "openrouter", - "model": "qwen/qwen3-235b-a22b", - "canonical": "qwen/qwen3-235b-a22b" + "model": "qwen/qwen3-coder-30b-a3b-instruct", + "canonical": "qwen/qwen3-coder-30b-a3b-instruct" }, { "provider": "openrouter", - "model": "mistralai/mistral-saba", - "canonical": "mistralai/mistral-saba" + "model": "openai/gpt-4.1-mini", + "canonical": "openai/gpt-4.1-mini" }, { "provider": "openrouter", - "model": "openai/o1", - "canonical": "openai/o1" + "model": "qwen/qwen3-vl-8b-instruct", + "canonical": "qwen/qwen3-vl-8b-instruct" }, { "provider": "openrouter", - "model": "anthropic/claude-3.5-haiku", - "canonical": "anthropic/claude-3.5-haiku" + "model": "qwen/qwen3-coder-flash", + "canonical": "qwen/qwen3-coder-flash" }, { "provider": "openrouter", - "model": "mistralai/devstral-2512", - "canonical": "mistralai/devstral" + "model": "mistralai/pixtral-large-2411", + "canonical": "mistralai/pixtral-large" }, { "provider": "openrouter", - "model": "anthropic/claude-3.7-sonnet", - "canonical": "anthropic/claude-3.7-sonnet" + "model": "openai/gpt-4-turbo", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openrouter", - "model": "openai/gpt-5.1-chat", - "canonical": "openai/gpt-5.1-chat" + "model": "qwen/qwen3-vl-30b-a3b-thinking", + "canonical": "qwen/qwen3-vl-30b-a3b-thinking" }, { "provider": "openrouter", - "model": "anthropic/claude-3-haiku", - "canonical": "anthropic/claude-3-haiku" + "model": "x-ai/grok-code-fast-1", + "canonical": "x-ai/grok-code-fast-1" }, { "provider": "openrouter", - "model": "qwen/qwen-2.5-72b-instruct", - "canonical": "qwen/qwen-2.5-72b-instruct" + "model": "qwen/qwen3-30b-a3b-instruct-2507", + "canonical": "qwen/qwen3-30b-a3b-instruct" }, { "provider": "openrouter", - "model": "qwen/qwen3-coder", - "canonical": "qwen/qwen3-coder" + "model": "qwen/qwen-2.5-72b-instruct", + "canonical": "qwen/qwen-2.5-72b-instruct" }, { "provider": "openrouter", - "model": "openai/o3-mini", - "canonical": "openai/o3-mini" + "model": "deepseek/deepseek-r1-distill-llama-70b", + "canonical": "deepseek/deepseek-r1-distill-llama-70b" }, { "provider": "openrouter", - "model": "mistralai/mixtral-8x22b-instruct", - "canonical": "mistralai/mixtral-8x22b-instruct" + "model": "openai/gpt-4.1", + "canonical": "openai/gpt-4.1" }, { "provider": "openrouter", - "model": "qwen/qwen3-next-80b-a3b-thinking", - "canonical": "qwen/qwen3-next-80b-a3b-thinking" + "model": "qwen/qwen-turbo", + "canonical": "qwen/qwen-turbo" }, { "provider": "openrouter", - "model": "deepseek/deepseek-chat-v3-0324", - "canonical": "deepseek/deepseek-chat" + "model": "qwen/qwen-plus-2025-07-28:thinking", + "canonical": "qwen/qwen-plus-2025-07-28:thinking" }, { "provider": "openrouter", - "model": "mistralai/mistral-large-2411", - "canonical": "mistralai/mistral-large" + "model": "x-ai/grok-4", + "canonical": "x-ai/grok-4" }, { "provider": "openrouter", - "model": "mistralai/mistral-small-3.2-24b-instruct", - "canonical": "mistralai/mistral-small-3.2-24b-instruct" + "model": "deepseek/deepseek-chat-v3-0324", + "canonical": "deepseek/deepseek-chat" }, { "provider": "openrouter", - "model": "qwen/qwen3-vl-235b-a22b-instruct", - "canonical": "qwen/qwen3-vl-235b-a22b-instruct" + "model": "deepseek/deepseek-r1-0528", + "canonical": "deepseek/deepseek-r1" }, { "provider": "openrouter", - "model": "x-ai/grok-code-fast-1", - "canonical": "x-ai/grok-code-fast-1" + "model": "google/gemini-2.5-flash-preview-09-2025", + "canonical": "google/gemini-2.5-flash" }, { "provider": "openrouter", - "model": "qwen/qwen3-next-80b-a3b-instruct", - "canonical": "qwen/qwen3-next-80b-a3b-instruct" + "model": "deepseek/deepseek-v3.1-terminus:exacto", + "canonical": "deepseek/deepseek-v3.1-terminus" }, { "provider": "openrouter", - "model": "openai/gpt-oss-120b:exacto", - "canonical": "openai/gpt-oss-120b" + "model": "openai/gpt-5.1", + "canonical": "openai/gpt-5.1" }, { "provider": "openrouter", - "model": "qwen/qwen3-14b", - "canonical": "qwen/qwen3-14b" + "model": "qwen/qwen3-235b-a22b", + "canonical": "qwen/qwen3-235b-a22b" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite", - "canonical": "google/gemini-2.5-flash-lite" + "model": "mistralai/devstral-2512", + "canonical": "mistralai/devstral" }, { "provider": "openrouter", - "model": "qwen/qwen3-max", - "canonical": "qwen/qwen3-max" + "model": "openai/gpt-4o-audio-preview", + "canonical": "openai/gpt-4o-audio" }, { "provider": "openrouter", - "model": "openai/gpt-oss-safeguard-20b", - "canonical": "openai/gpt-oss-safeguard-20b" + "model": "x-ai/grok-4-fast", + "canonical": "x-ai/grok-4-fast" }, { "provider": "openrouter", - "model": "google/gemini-2.5-pro-preview-05-06", + "model": "google/gemini-2.5-pro-preview", "canonical": "google/gemini-2.5-pro" }, { "provider": "openrouter", - "model": "anthropic/claude-haiku-4.5", - "canonical": "anthropic/claude-haiku-4.5" + "model": "mistralai/ministral-14b-2512", + "canonical": "mistralai/ministral-14b" }, { "provider": "openrouter", - "model": "deepseek/deepseek-v3.1-terminus", - "canonical": "deepseek/deepseek-v3.1-terminus" + "model": "qwen/qwen3-235b-a22b-2507", + "canonical": "qwen/qwen3-235b-a22b" }, { "provider": "openrouter", - "model": "meta-llama/llama-4-scout", - "canonical": "meta-llama/llama-4-scout" + "model": "anthropic/claude-3.7-sonnet", + "canonical": "anthropic/claude-3.7-sonnet" }, { "provider": "openrouter", - "model": "openai/o4-mini-deep-research", - "canonical": "openai/o4-mini-deep-research" + "model": "mistralai/mistral-large-2407", + "canonical": "mistralai/mistral-large" }, { "provider": "openrouter", - "model": "deepseek/deepseek-v3.2-exp", - "canonical": "deepseek/deepseek" + "model": "mistralai/mistral-large", + "canonical": "mistralai/mistral-large" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical": "google/gemini-2.5-flash-lite" + "model": "openai/gpt-oss-20b", + "canonical": "openai/gpt-oss-20b" }, { "provider": "openrouter", - "model": "openai/o3-deep-research", - "canonical": "openai/o3-deep-research" + "model": "qwen/qwen3-vl-235b-a22b-thinking", + "canonical": "qwen/qwen3-vl-235b-a22b-thinking" }, { "provider": "openrouter", - "model": "google/gemini-2.0-flash-001", - "canonical": "google/gemini-2.0-flash" + "model": "anthropic/claude-haiku-4.5", + "canonical": "anthropic/claude-haiku-4.5" }, { "provider": "openrouter", - "model": "mistralai/mistral-small-3.1-24b-instruct", - "canonical": "mistralai/mistral-small-3.1-24b-instruct" + "model": "openai/gpt-oss-120b:exacto", + "canonical": "openai/gpt-oss-120b" }, { "provider": "openrouter", - "model": "anthropic/claude-3.5-haiku-20241022", - "canonical": "anthropic/claude-3.5-haiku" + "model": "qwen/qwen3-30b-a3b", + "canonical": "qwen/qwen3-30b-a3b" }, { "provider": "openrouter", - "model": "openai/gpt-4o", + "model": "openai/gpt-4o-2024-08-06", "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "anthropic/claude-3.7-sonnet:thinking", - "canonical": "anthropic/claude-3.7-sonnet:thinking" + "model": "qwen/qwen-max", + "canonical": "qwen/qwen-max" }, { "provider": "openrouter", - "model": "qwen/qwen3-coder-flash", - "canonical": "qwen/qwen3-coder-flash" + "model": "mistralai/mistral-tiny", + "canonical": "mistralai/mistral-tiny" }, { "provider": "openrouter", - "model": "mistralai/ministral-3b-2512", - "canonical": "mistralai/ministral-3b" + "model": "openai/gpt-3.5-turbo-0613", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openrouter", - "model": "openai/gpt-5", - "canonical": "openai/gpt-5" + "model": "mistralai/ministral-3b", + "canonical": "mistralai/ministral-3b" }, { "provider": "openrouter", - "model": "anthropic/claude-opus-4", - "canonical": "anthropic/claude-opus-4" + "model": "openai/gpt-5-nano", + "canonical": "openai/gpt-5-nano" }, { "provider": "openrouter", - "model": "openai/gpt-5.1-codex-max", - "canonical": "openai/gpt-5.1-codex-max" + "model": "google/gemini-2.5-flash-lite", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.1-405b-instruct", - "canonical": "meta-llama/llama-3.1-405b-instruct" + "model": "google/gemini-2.0-flash-001", + "canonical": "google/gemini-2.0-flash" }, { "provider": "openrouter", - "model": "openai/gpt-4o-mini", - "canonical": "openai/gpt-4o-mini" + "model": "openai/gpt-4-0314", + "canonical": "openai/gpt-4" }, { "provider": "openrouter", - "model": "qwen/qwen3-30b-a3b-thinking-2507", - "canonical": "qwen/qwen3-30b-a3b-thinking" + "model": "qwen/qwen-plus-2025-07-28", + "canonical": "qwen/qwen-plus" }, { "provider": "openrouter", - "model": "openai/o3-mini-high", - "canonical": "openai/o3-mini-high" + "model": "qwen/qwen3-14b", + "canonical": "qwen/qwen3-14b" }, { "provider": "openrouter", - "model": "meta-llama/llama-4-maverick", - "canonical": "meta-llama/llama-4-maverick" + "model": "meta-llama/llama-4-scout", + "canonical": "meta-llama/llama-4-scout" }, { "provider": "openrouter", - "model": "qwen/qwen-plus", - "canonical": "qwen/qwen-plus" + "model": "anthropic/claude-3.5-sonnet", + "canonical": "anthropic/claude-3.5-sonnet" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.1-70b-instruct", - "canonical": "meta-llama/llama-3.1-70b-instruct" + "model": "qwen/qwen3-max", + "canonical": "qwen/qwen3-max" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.1-8b-instruct", - "canonical": "meta-llama/llama-3.1-8b-instruct" + "model": "x-ai/grok-4.1-fast", + "canonical": "x-ai/grok-4.1-fast" }, { "provider": "openrouter", - "model": "google/gemini-2.5-pro-preview", - "canonical": "google/gemini-2.5-pro" + "model": "ai21/jamba-large-1.7", + "canonical": "ai21/jamba-large-1.7" }, { "provider": "openrouter", - "model": "openai/gpt-4o-2024-08-06", - "canonical": "openai/gpt-4o" + "model": "mistralai/mistral-nemo", + "canonical": "mistralai/mistral-nemo" }, { "provider": "openrouter", - "model": "meta-llama/llama-3-70b-instruct", - "canonical": "meta-llama/llama-3-70b-instruct" + "model": "x-ai/grok-3", + "canonical": "x-ai/grok-3" }, { "provider": "openrouter", - "model": "mistralai/mistral-large-2512", - "canonical": "mistralai/mistral-large" + "model": "mistralai/voxtral-small-24b-2507", + "canonical": "mistralai/voxtral-small-24b" }, { "provider": "openrouter", - "model": "mistralai/ministral-14b-2512", - "canonical": "mistralai/ministral-14b" + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "canonical": "qwen/qwen3-235b-a22b-thinking" }, { "provider": "openrouter", - "model": "openai/gpt-4", - "canonical": "openai/gpt-4" + "model": "openai/gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openrouter", - "model": "openai/gpt-4.1-mini", - "canonical": "openai/gpt-4.1-mini" + "model": "openai/gpt-5.1-codex", + "canonical": "openai/gpt-5.1-codex" }, { "provider": "openrouter", - "model": "cohere/command-r-plus-08-2024", - "canonical": "cohere/command-r-plus-08" + "model": "openai/gpt-5.1-chat", + "canonical": "openai/gpt-5.1-chat" }, { "provider": "openrouter", - "model": "qwen/qwen3-coder-plus", - "canonical": "qwen/qwen3-coder-plus" + "model": "openai/gpt-4o", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "qwen/qwen3-vl-235b-a22b-thinking", - "canonical": "qwen/qwen3-vl-235b-a22b-thinking" + "model": "openai/gpt-4o:extended", + "canonical": "openai/gpt-4o:extended" }, { "provider": "openrouter", - "model": "mistralai/mistral-small-24b-instruct-2501", - "canonical": "mistralai/mistral-small-24b-instruct" + "model": "openai/gpt-oss-120b", + "canonical": "openai/gpt-oss-120b" }, { "provider": "openrouter", - "model": "x-ai/grok-3", - "canonical": "x-ai/grok-3" + "model": "deepseek/deepseek-v3.2", + "canonical": "deepseek/deepseek" }, { "provider": "openrouter", - "model": "mistralai/ministral-8b-2512", - "canonical": "mistralai/ministral-8b" + "model": "anthropic/claude-sonnet-4.5", + "canonical": "anthropic/claude-sonnet-4.5" }, { "provider": "openrouter", - "model": "openai/gpt-5.1-codex", - "canonical": "openai/gpt-5.1-codex" + "model": "qwen/qwen3-next-80b-a3b-thinking", + "canonical": "qwen/qwen3-next-80b-a3b-thinking" }, { "provider": "openrouter", - "model": "openai/gpt-3.5-turbo", - "canonical": "openai/gpt-3.5-turbo" + "model": "mistralai/devstral-small", + "canonical": "mistralai/devstral-small" }, { "provider": "openrouter", - "model": "mistralai/pixtral-12b", - "canonical": "mistralai/pixtral-12b" + "model": "openai/o3-pro", + "canonical": "openai/o3-pro" }, { "provider": "openrouter", - "model": "google/gemini-3-flash-preview", - "canonical": "google/gemini-3-flash" + "model": "mistralai/ministral-8b", + "canonical": "mistralai/ministral-8b" }, { "provider": "openrouter", - "model": "openai/gpt-4-1106-preview", - "canonical": "openai/gpt-4" + "model": "mistralai/mistral-large-2411", + "canonical": "mistralai/mistral-large" }, { "provider": "openrouter", - "model": "openai/gpt-4o-2024-11-20", - "canonical": "openai/gpt-4o" + "model": "mistralai/mixtral-8x22b-instruct", + "canonical": "mistralai/mixtral-8x22b-instruct" }, { "provider": "openrouter", - "model": "deepseek/deepseek-r1", - "canonical": "deepseek/deepseek-r1" + "model": "qwen/qwen3-coder", + "canonical": "qwen/qwen3-coder" }, { "provider": "openrouter", - "model": "google/gemini-3-pro-preview", - "canonical": "google/gemini-3-pro" + "model": "google/gemini-2.5-pro-preview-05-06", + "canonical": "google/gemini-2.5-pro" }, { "provider": "openrouter", - "model": "cohere/command-r-08-2024", - "canonical": "cohere/command-r-08" + "model": "meta-llama/llama-4-maverick", + "canonical": "meta-llama/llama-4-maverick" }, { "provider": "openrouter", - "model": "ai21/jamba-large-1.7", - "canonical": "ai21/jamba-large-1.7" + "model": "openai/gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openrouter", - "model": "deepseek/deepseek-r1-0528", - "canonical": "deepseek/deepseek-r1" + "model": "qwen/qwen-vl-max", + "canonical": "qwen/qwen-vl-max" }, { "provider": "openrouter", - "model": "mistralai/mistral-nemo", - "canonical": "mistralai/mistral-nemo" + "model": "openai/gpt-5-codex", + "canonical": "openai/gpt-5-codex" }, { "provider": "openrouter", - "model": "mistralai/mixtral-8x7b-instruct", - "canonical": "mistralai/mixtral-8x7b-instruct" + "model": "openai/gpt-4.1-nano", + "canonical": "openai/gpt-4.1-nano" }, { "provider": "openrouter", - "model": "openai/gpt-4o-2024-05-13", - "canonical": "openai/gpt-4o" + "model": "google/gemini-3-flash-preview", + "canonical": "google/gemini-3-flash" }, { "provider": "openrouter", - "model": "openai/gpt-5.1", - "canonical": "openai/gpt-5.1" + "model": "openai/gpt-5-image-mini", + "canonical": "openai/gpt-5-image-mini" }, { "provider": "openrouter", - "model": "qwen/qwen3-235b-a22b-thinking-2507", - "canonical": "qwen/qwen3-235b-a22b-thinking" + "model": "meta-llama/llama-3.2-3b-instruct", + "canonical": "meta-llama/llama-3.2-3b-instruct" }, { "provider": "openrouter", - "model": "openai/gpt-4-turbo", - "canonical": "openai/gpt-4-turbo" + "model": "openai/codex-mini", + "canonical": "openai/codex-mini" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash", - "canonical": "google/gemini-2.5-flash" + "model": "google/gemini-2.5-pro", + "canonical": "google/gemini-2.5-pro" }, { "provider": "openrouter", - "model": "mistralai/mistral-small-creative", - "canonical": "mistralai/mistral-small-creative" + "model": "openai/gpt-5-image", + "canonical": "openai/gpt-5-image" }, { "provider": "openrouter", - "model": "qwen/qwen-max", - "canonical": "qwen/qwen-max" + "model": "anthropic/claude-3-haiku", + "canonical": "anthropic/claude-3-haiku" }, { "provider": "openrouter", - "model": "mistralai/ministral-3b", + "model": "mistralai/ministral-3b-2512", "canonical": "mistralai/ministral-3b" }, { "provider": "openrouter", - "model": "mistralai/mistral-medium-3", - "canonical": "mistralai/mistral-medium-3" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4o:extended", - "canonical": "openai/gpt-4o:extended" + "model": "openai/gpt-5.1-codex-mini", + "canonical": "openai/gpt-5.1-codex-mini" }, { "provider": "openrouter", - "model": "anthropic/claude-sonnet-4", - "canonical": "anthropic/claude-sonnet-4" + "model": "qwen/qwen3-coder:exacto", + "canonical": "qwen/qwen3-coder" }, { "provider": "openrouter", - "model": "qwen/qwq-32b", - "canonical": "qwen/qwq-32b" + "model": "google/gemini-2.0-flash-lite-001", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "openrouter", - "model": "mistralai/mistral-7b-instruct", - "canonical": "mistralai/mistral-7b-instruct" + "model": "deepseek/deepseek-chat-v3.1", + "canonical": "deepseek/deepseek-chat" }, { "provider": "openrouter", - "model": "openai/gpt-3.5-turbo-16k", - "canonical": "openai/gpt-3.5-turbo-16k" + "model": "mistralai/mistral-saba", + "canonical": "mistralai/mistral-saba" }, { "provider": "openrouter", - "model": "openai/gpt-5.2-pro", - "canonical": "openai/gpt-5.2-pro" + "model": "google/gemma-3-27b-it", + "canonical": "google/gemma-3-27b-it" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.2-3b-instruct", - "canonical": "meta-llama/llama-3.2-3b-instruct" + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "openrouter", - "model": "mistralai/mistral-large-2407", - "canonical": "mistralai/mistral-large" + "model": "anthropic/claude-opus-4", + "canonical": "anthropic/claude-opus-4" }, { "provider": "openrouter", - "model": "deepseek/deepseek-chat-v3.1", - "canonical": "deepseek/deepseek-chat" + "model": "openai/o4-mini-deep-research", + "canonical": "openai/o4-mini-deep-research" }, { "provider": "openrouter", - "model": "x-ai/grok-4", - "canonical": "x-ai/grok-4" + "model": "openai/gpt-3.5-turbo", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openrouter", - "model": "x-ai/grok-3-mini", - "canonical": "x-ai/grok-3-mini" + "model": "cohere/command-r-08-2024", + "canonical": "cohere/command-r-08" }, { "provider": "openrouter", - "model": "qwen/qwen3-235b-a22b-2507", - "canonical": "qwen/qwen3-235b-a22b" + "model": "meta-llama/llama-3-70b-instruct", + "canonical": "meta-llama/llama-3-70b-instruct" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.3-70b-instruct", - "canonical": "meta-llama/llama-3.3-70b-instruct" + "model": "qwen/qwen3-vl-235b-a22b-instruct", + "canonical": "qwen/qwen3-vl-235b-a22b-instruct" }, { "provider": "openrouter", - "model": "openai/o3", - "canonical": "openai/o3" + "model": "openai/gpt-4-1106-preview", + "canonical": "openai/gpt-4" }, { "provider": "openrouter", - "model": "openai/o4-mini", - "canonical": "openai/o4-mini" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-001", - "canonical": "google/gemini-2.0-flash" + "model": "openai/o3-mini-high", + "canonical": "openai/o3-mini-high" }, { "provider": "google", - "model": "gemini-2.0-flash-lite-preview", - "canonical": "google/gemini-2.0-flash-lite" + "model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "google", @@ -4989,23 +4972,23 @@ }, { "provider": "google", - "model": "gemini-2.0-flash-exp", + "model": "gemini-2.0-flash-001", "canonical": "google/gemini-2.0-flash" }, { "provider": "google", - "model": "gemini-2.5-flash-image", - "canonical": "google/gemini-2.5-flash-image" + "model": "gemini-3-pro-preview", + "canonical": "google/gemini-3-pro" }, { "provider": "google", - "model": "gemini-2.5-pro", - "canonical": "google/gemini-2.5-pro" + "model": "gemma-3n-e4b-it", + "canonical": "google/gemma-3n-e4b-it" }, { "provider": "google", - "model": "gemini-2.5-flash-lite-preview-09-2025", - "canonical": "google/gemini-2.5-flash-lite" + "model": "gemini-2.5-flash-preview-09-2025", + "canonical": "google/gemini-2.5-flash" }, { "provider": "google", @@ -5014,33 +4997,38 @@ }, { "provider": "google", - "model": "gemma-3-12b-it", - "canonical": "google/gemma-3-12b-it" + "model": "gemini-2.5-flash-image", + "canonical": "google/gemini-2.5-flash-image" }, { "provider": "google", - "model": "gemma-3n-e4b-it", - "canonical": "google/gemma-3n-e4b-it" + "model": "gemini-2.0-flash", + "canonical": "google/gemini-2.0-flash" }, { "provider": "google", - "model": "gemini-2.0-flash-lite-001", - "canonical": "google/gemini-2.0-flash-lite" + "model": "gemini-2.5-flash-lite", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "google", - "model": "gemini-2.5-flash-image-preview", - "canonical": "google/gemini-2.5-flash-image" + "model": "gemma-3-4b-it", + "canonical": "google/gemma-3-4b-it" }, { "provider": "google", - "model": "gemini-3-pro-image-preview", - "canonical": "google/gemini-3-pro-image" + "model": "gemini-2.0-flash-exp", + "canonical": "google/gemini-2.0-flash" }, { "provider": "google", - "model": "gemini-2.5-flash", - "canonical": "google/gemini-2.5-flash" + "model": "gemini-2.0-flash-lite-001", + "canonical": "google/gemini-2.0-flash-lite" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-lite-preview-02-05", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", @@ -5049,187 +5037,187 @@ }, { "provider": "google", - "model": "gemini-2.5-flash-lite", - "canonical": "google/gemini-2.5-flash-lite" + "model": "gemini-2.5-pro", + "canonical": "google/gemini-2.5-pro" }, { "provider": "google", - "model": "gemini-2.5-flash-preview-09-2025", - "canonical": "google/gemini-2.5-flash" + "model": "gemini-3-pro-image-preview", + "canonical": "google/gemini-3-pro-image" }, { "provider": "google", - "model": "gemini-2.0-flash-lite-preview-02-05", - "canonical": "google/gemini-2.0-flash-lite" + "model": "gemma-3-12b-it", + "canonical": "google/gemma-3-12b-it" }, { "provider": "google", - "model": "gemini-3-pro-preview", - "canonical": "google/gemini-3-pro" + "model": "gemini-2.0-flash-lite-preview", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", - "model": "gemini-2.0-flash", - "canonical": "google/gemini-2.0-flash" + "model": "gemini-2.5-flash", + "canonical": "google/gemini-2.5-flash" }, { "provider": "google", - "model": "gemma-3-4b-it", - "canonical": "google/gemma-3-4b-it" + "model": "gemini-2.5-flash-image-preview", + "canonical": "google/gemini-2.5-flash-image" } ], "model_counts": { + "tetrate": 0, "google": 50, "anthropic": 9, - "tetrate": 0, - "openai": 646, - "openrouter": 233, - "xai": 0 + "openrouter": 230, + "xai": 0, + "openai": 646 }, "canonical_models_used": [ - "openai/o1-pro", - "openai/gpt-5-mini", - "qwen/qwen3-vl-30b-a3b-instruct", - "mistralai/ministral-8b", - "openai/gpt-3.5-turbo-16k", - "anthropic/claude-opus-4", - "deepseek/deepseek-v3.1-terminus", - "qwen/qwen3-235b-a22b-thinking", - "google/gemini-3-pro-image", - "openai/o3-pro", - "mistralai/mixtral-8x22b-instruct", - "google/gemma-3-12b-it", - "qwen/qwen3-next-80b-a3b-instruct", + "mistralai/mistral-saba", + "openai/gpt-4o-audio", + "anthropic/claude-opus-4.1", + "google/gemini-2.5-flash", + "deepseek/deepseek-chat", "openai/o3", - "mistralai/mistral-7b-instruct", - "qwen/qwen-2.5-72b-instruct", - "anthropic/claude-sonnet-4", - "openai/gpt-5-codex", + "openai/gpt-5.1-chat", + "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-r1-distill-llama-70b", - "meta-llama/llama-3.1-70b-instruct", + "openai/gpt-5-codex", + "google/gemma-3-12b-it", + "meta-llama/llama-3-70b-instruct", + "qwen/qwen-plus-2025-07-28:thinking", + "qwen/qwen-max", + "openai/o3-deep-research", + "google/gemini-3-pro-image", + "openai/gpt-5", + "qwen/qwq-32b", + "x-ai/grok-4.1-fast", + "anthropic/claude-3-haiku", + "openai/o1-pro", "deepseek/deepseek-r1", - "openai/gpt-5.1-codex", - "openai/gpt-4o", - "qwen/qwen3-next-80b-a3b-thinking", - "openai/gpt-5.2-pro", - "qwen/qwen-vl-max", - "openai/gpt-4", "openai/gpt-4o-mini", - "qwen/qwen-plus", + "openai/o4-mini-deep-research", + "qwen/qwen3-32b", + "mistralai/ministral-14b", + "openai/gpt-4.1", + "openai/codex-mini", + "mistralai/codestral", + "anthropic/claude-3.5-sonnet", "openai/gpt-4o-mini-search", - "qwen/qwen3-30b-a3b-instruct", - "mistralai/pixtral-large", - "qwen/qwen3-14b", - "mistralai/mistral-small-3.1-24b-instruct", + "openai/gpt-5.2-pro", + "google/gemma-3-4b-it", + "anthropic/claude-opus-4.5", + "openai/o1", + "mistralai/ministral-8b", + "ai21/jamba-large-1.7", + "openai/gpt-4o:extended", + "anthropic/claude-sonnet-4", + "openai/gpt-3.5-turbo", "x-ai/grok-3", - "x-ai/grok-4.1-fast", - "google/gemini-3-pro", - "mistralai/mistral-medium-3", - "openai/o4-mini-high", - "openai/o3-deep-research", - "openai/gpt-4o-search", - "qwen/qwen3-vl-235b-a22b-thinking", - "ai21/jamba-mini-1.7", - "x-ai/grok-3-mini", - "meta-llama/llama-3.1-8b-instruct", - "openai/gpt-5.2", - "openai/gpt-5.1-codex-mini", + "qwen/qwen3-vl-8b-thinking", + "qwen/qwen3-next-80b-a3b-thinking", + "openai/gpt-oss-120b", + "meta-llama/llama-3.1-70b-instruct", + "openai/gpt-5-image-mini", + "openai/gpt-5.2-chat", "mistralai/ministral-3b", - "openai/gpt-4.1", - "x-ai/grok-4-fast", - "qwen/qwen-plus-2025-07-28:thinking", - "openai/gpt-5-image", - "google/gemini-2.5-flash", - "openai/gpt-4.1-mini", - "anthropic/claude-haiku-4.5", + "meta-llama/llama-3-8b-instruct", "openai/gpt-5.1-codex-max", + "qwen/qwen3-vl-235b-a22b-thinking", + "qwen/qwen-turbo", + "x-ai/grok-4-fast", + "qwen/qwen3-next-80b-a3b-instruct", + "openai/gpt-4", + "anthropic/claude-3.7-sonnet:thinking", + "qwen/qwen3-coder-30b-a3b-instruct", + "openai/gpt-5.1", + "mistralai/devstral-medium", + "openai/gpt-4o-search", + "openai/gpt-oss-20b", + "mistralai/pixtral-large", + "openai/gpt-5-pro", + "mistralai/mixtral-8x22b-instruct", "openai/gpt-oss-safeguard-20b", - "meta-llama/llama-3-8b-instruct", - "qwen/qwen3-vl-8b-thinking", - "openai/o4-mini", - "mistralai/mistral-medium-3.1", - "anthropic/claude-sonnet-4.5", - "openai/gpt-5", - "qwen/qwq-32b", - "mistralai/mistral-small-3.2-24b-instruct", - "mistralai/codestral", - "mistralai/voxtral-small-24b", - "meta-llama/llama-3.3-70b-instruct", - "cohere/command-r-plus-08", - "mistralai/ministral-14b", - "mistralai/mistral-nemo", "openai/chatgpt-4o", - "anthropic/claude-3-haiku", - "qwen/qwen3-32b", - "openai/o4-mini-deep-research", - "meta-llama/llama-3-70b-instruct", - "google/gemma-3n-e4b-it", - "mistralai/mistral-tiny", - "mistralai/devstral-medium", + "openai/o3-mini", + "qwen/qwen3-30b-a3b", + "qwen/qwen3-coder", + "cohere/command-r-08", + "mistralai/mistral-medium-3", + "mistralai/mistral-small-3.1-24b-instruct", + "anthropic/claude-3.7-sonnet", + "openai/gpt-3.5-turbo-16k", "openai/gpt-4-turbo", + "openai/gpt-5-chat", + "mistralai/mistral-7b-instruct", "qwen/qwen3-coder-flash", - "qwen/qwen3-vl-8b-instruct", - "meta-llama/llama-4-scout", - "qwen/qwen3-coder-plus", - "qwen/qwen-max", - "openai/gpt-oss-120b", - "openai/gpt-5.2-chat", + "google/gemini-2.5-flash-lite", + "openai/gpt-5-image", + "qwen/qwen3-vl-30b-a3b-thinking", + "openai/o3-pro", + "openai/gpt-5-mini", + "openai/o4-mini-high", + "mistralai/mistral-medium-3.1", "mistralai/mistral-small-creative", - "openai/gpt-5.1", - "deepseek/deepseek", - "x-ai/grok-4", - "mistralai/mistral-large", - "mistralai/mixtral-8x7b-instruct", - "anthropic/claude-3.7-sonnet", - "qwen/qwen3-8b", - "openai/gpt-4o:extended", - "anthropic/claude-3.5-sonnet", - "openai/gpt-5.1-chat", - "anthropic/claude-opus-4.5", + "qwen/qwen3-235b-a22b", + "qwen/qwen3-14b", + "qwen/qwen3-max", + "openai/o3-mini-high", + "qwen/qwen-vl-max", + "openai/gpt-4.1-mini", "google/gemini-2.5-flash-image", - "anthropic/claude-3.5-haiku", "meta-llama/llama-3.1-405b-instruct", - "openai/codex-mini", + "anthropic/claude-sonnet-4.5", "meta-llama/llama-4-maverick", - "openai/o3-mini", - "qwen/qwen3-30b-a3b-thinking", - "qwen/qwen3-coder-30b-a3b-instruct", - "google/gemma-3-4b-it", - "qwen/qwen3-coder", - "openai/gpt-3.5-turbo-instruct", - "qwen/qwen3-30b-a3b", - "anthropic/claude-opus-4.1", - "openai/gpt-5-chat", - "mistralai/mistral-saba", - "ai21/jamba-large-1.7", - "mistralai/devstral-small", - "google/gemini-2.5-flash-lite", - "openai/gpt-oss-20b", - "openai/gpt-5-pro", + "openai/o4-mini", + "qwen/qwen-plus", + "meta-llama/llama-3.3-70b-instruct", + "x-ai/grok-code-fast-1", + "qwen/qwen-2.5-72b-instruct", "google/gemini-2.0-flash-lite", - "openai/gpt-4.1-nano", - "openai/o1", - "openai/gpt-5-nano", - "qwen/qwen3-vl-30b-a3b-thinking", - "meta-llama/llama-3.2-3b-instruct", - "mistralai/devstral", - "qwen/qwen3-max", "google/gemma-3-27b-it", - "deepseek/deepseek-chat", - "mistralai/mistral-small-24b-instruct", - "cohere/command-r-08", - "anthropic/claude-3.7-sonnet:thinking", - "mistralai/pixtral-12b", - "qwen/qwen-turbo", + "openai/gpt-5.2", + "qwen/qwen3-vl-30b-a3b-instruct", + "ai21/jamba-mini-1.7", + "qwen/qwen3-8b", + "mistralai/voxtral-small-24b", + "anthropic/claude-3.5-haiku", + "mistralai/mixtral-8x7b-instruct", + "x-ai/grok-4", + "mistralai/devstral-small", "google/gemini-3-flash", - "openai/gpt-4o-audio", + "meta-llama/llama-3.2-3b-instruct", + "google/gemini-3-pro", + "deepseek/deepseek", + "meta-llama/llama-3.1-8b-instruct", + "mistralai/mistral-tiny", + "google/gemma-3n-e4b-it", + "openai/gpt-4o", + "mistralai/mistral-small-24b-instruct", + "openai/gpt-5-nano", + "x-ai/grok-3-mini", + "qwen/qwen3-30b-a3b-thinking", + "anthropic/claude-opus-4", "google/gemini-2.5-pro", - "google/gemini-2.0-flash", - "openai/o3-mini-high", + "openai/gpt-5.1-codex", + "cohere/command-r-plus-08", + "anthropic/claude-haiku-4.5", + "openai/gpt-3.5-turbo-instruct", + "mistralai/mistral-large", + "mistralai/pixtral-12b", + "meta-llama/llama-4-scout", + "mistralai/mistral-nemo", + "openai/gpt-5.1-codex-mini", "qwen/qwen3-vl-235b-a22b-instruct", - "x-ai/grok-code-fast-1", - "openai/gpt-3.5-turbo", - "qwen/qwen3-235b-a22b", - "openai/gpt-5-image-mini" + "google/gemini-2.0-flash", + "qwen/qwen3-vl-8b-instruct", + "openai/gpt-4.1-nano", + "qwen/qwen3-coder-plus", + "mistralai/devstral", + "mistralai/mistral-small-3.2-24b-instruct", + "qwen/qwen3-30b-a3b-instruct", + "qwen/qwen3-235b-a22b-thinking" ] } \ No newline at end of file diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index d539388d16e..e2c169ccd69 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -10,7 +10,7 @@ "license": { "name": "Apache-2.0" }, - "version": "1.19.0" + "version": "1.19.1" }, "paths": { "/action-required/tool-confirmation": { diff --git a/ui/desktop/package-lock.json b/ui/desktop/package-lock.json index e3e804d6f0c..f7bf2025dde 100644 --- a/ui/desktop/package-lock.json +++ b/ui/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "goose-app", - "version": "1.19.0", + "version": "1.19.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "goose-app", - "version": "1.19.0", + "version": "1.19.1", "license": "Apache-2.0", "dependencies": { "@ai-sdk/openai": "^2.0.76", diff --git a/ui/desktop/package.json b/ui/desktop/package.json index 61b2d626364..4374247ea44 100644 --- a/ui/desktop/package.json +++ b/ui/desktop/package.json @@ -1,7 +1,7 @@ { "name": "goose-app", "productName": "Goose", - "version": "1.19.0", + "version": "1.19.1", "description": "Goose App", "engines": { "node": "^22.17.1" diff --git a/ui/desktop/src/components/McpApps/useSandboxBridge.ts b/ui/desktop/src/components/McpApps/useSandboxBridge.ts index ba8bf69f049..f519f50bbe1 100644 --- a/ui/desktop/src/components/McpApps/useSandboxBridge.ts +++ b/ui/desktop/src/components/McpApps/useSandboxBridge.ts @@ -86,6 +86,21 @@ export function useSandboxBridge(options: SandboxBridgeOptions): SandboxBridgeRe case 'ui/notifications/initialized': isGuestInitializedRef.current = true; + // Send any pending tool data that arrived before initialization + if (toolInput) { + sendToSandbox({ + jsonrpc: '2.0', + method: 'ui/notifications/tool-input', + params: { arguments: toolInput.arguments }, + }); + } + if (toolResult) { + sendToSandbox({ + jsonrpc: '2.0', + method: 'ui/notifications/tool-result', + params: toolResult, + }); + } break; case 'ui/notifications/size-changed': { @@ -163,7 +178,16 @@ export function useSandboxBridge(options: SandboxBridgeOptions): SandboxBridgeRe } } }, - [resourceHtml, resourceCsp, resolvedTheme, sendToSandbox, onMcpRequest, onSizeChanged] + [ + resourceHtml, + resourceCsp, + resolvedTheme, + sendToSandbox, + onMcpRequest, + onSizeChanged, + toolInput, + toolResult, + ] ); useEffect(() => { diff --git a/ui/desktop/src/components/ToolCallWithResponse.tsx b/ui/desktop/src/components/ToolCallWithResponse.tsx index 77216979dd7..bfe8baeab78 100644 --- a/ui/desktop/src/components/ToolCallWithResponse.tsx +++ b/ui/desktop/src/components/ToolCallWithResponse.tsx @@ -1,6 +1,6 @@ import { ToolIconWithStatus, ToolCallStatus } from './ToolCallStatusIndicator'; import { getToolCallIcon } from '../utils/toolIconMapping'; -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useRef, useState, useMemo } from 'react'; import { Button } from './ui/button'; import { ToolCallArguments, ToolCallArgumentValue } from './ToolCallArguments'; import MarkdownContent from './MarkdownContent'; @@ -24,19 +24,21 @@ interface ToolGraphNode { depends_on: number[]; } +type UiMeta = { + ui?: { + resourceUri?: string; + }; +}; + type ToolResultWithMeta = { status?: string; value?: CallToolResponse & { - _meta?: { - 'ui/resourceUri'?: string; - }; + _meta?: UiMeta; }; }; type ToolRequestWithMeta = ToolRequestMessageContent & { - _meta?: { - 'ui/resourceUri'?: string; - }; + _meta?: UiMeta; toolCall: { status: 'success'; value: { @@ -71,40 +73,60 @@ function isEmbeddedResource(content: Content): content is EmbeddedResource { return 'resource' in content && typeof (content as Record).resource === 'object'; } -function maybeRenderMCPApp( - toolRequest: ToolRequestMessageContent, - toolResponse: ToolResponseMessageContent | undefined, - sessionId: string, - append?: (value: string) => void -): React.ReactNode { +interface McpAppWrapperProps { + toolRequest: ToolRequestMessageContent; + toolResponse?: ToolResponseMessageContent; + sessionId: string; + append?: (value: string) => void; +} + +function McpAppWrapper({ + toolRequest, + toolResponse, + sessionId, + append, +}: McpAppWrapperProps): React.ReactNode { const requestWithMeta = toolRequest as ToolRequestWithMeta; - let resourceUri = requestWithMeta._meta?.['ui/resourceUri']; + let resourceUri = requestWithMeta._meta?.ui?.resourceUri; if (!resourceUri && toolResponse) { const resultWithMeta = toolResponse.toolResult as ToolResultWithMeta; if (resultWithMeta?.status === 'success' && resultWithMeta.value) { - resourceUri = resultWithMeta.value._meta?.['ui/resourceUri']; + resourceUri = resultWithMeta.value._meta?.ui?.resourceUri; } } - if (!resourceUri) return null; - if (requestWithMeta.toolCall.status !== 'success') return null; + const extensionName = + requestWithMeta.toolCall.status === 'success' + ? requestWithMeta.toolCall.value.name.split('__')[0] + : ''; + + const toolArguments = + requestWithMeta.toolCall.status === 'success' + ? requestWithMeta.toolCall.value.arguments + : undefined; - const extensionName = requestWithMeta.toolCall.value.name.split('__')[0]; + // Memoize toolInput to prevent unnecessary re-renders + const toolInput = useMemo(() => ({ arguments: toolArguments || {} }), [toolArguments]); - let toolResult: CallToolResponse | undefined; - if (toolResponse) { + // Memoize toolResult to prevent unnecessary re-renders + const toolResult = useMemo(() => { + if (!toolResponse) return undefined; const resultWithMeta = toolResponse.toolResult as ToolResultWithMeta; if (resultWithMeta?.status === 'success' && resultWithMeta.value) { - toolResult = resultWithMeta.value; + return resultWithMeta.value; } - } + return undefined; + }, [toolResponse]); + + if (!resourceUri) return null; + if (requestWithMeta.toolCall.status !== 'success') return null; return (
{/* MCP UI — Inline */} - {toolResponse?.toolResult && + {!hasMcpAppResourceURI && + toolResponse?.toolResult && getToolResultContent(toolResponse.toolResult).map((content, index) => { const resourceContent = isEmbeddedResource(content) ? { ...content, type: 'resource' as const } @@ -181,7 +210,14 @@ export default function ToolCallWithResponse({ } })} - {sessionId && maybeRenderMCPApp(toolRequest, toolResponse, sessionId, append)} + {hasMcpAppResourceURI && sessionId && ( + + )} ); }