diff --git a/.github/workflows/bundle-desktop-windows.yml b/.github/workflows/bundle-desktop-windows.yml index e82ab3d5ad4b..a657c11af581 100644 --- a/.github/workflows/bundle-desktop-windows.yml +++ b/.github/workflows/bundle-desktop-windows.yml @@ -1,6 +1,7 @@ name: "Bundle Desktop (Windows)" on: + workflow_dispatch: workflow_call: inputs: version: diff --git a/Cargo.lock b/Cargo.lock index b351444a38b5..cea87f982e1e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4170,7 +4170,7 @@ dependencies = [ [[package]] name = "goose" -version = "1.24.0" +version = "1.25.0" dependencies = [ "ahash", "anyhow", @@ -4266,7 +4266,7 @@ dependencies = [ [[package]] name = "goose-acp" -version = "1.24.0" +version = "1.25.0" dependencies = [ "agent-client-protocol-schema", "anyhow", @@ -4301,7 +4301,7 @@ dependencies = [ [[package]] name = "goose-cli" -version = "1.24.0" +version = "1.25.0" dependencies = [ "anstream", "anyhow", @@ -4351,7 +4351,7 @@ dependencies = [ [[package]] name = "goose-mcp" -version = "1.24.0" +version = "1.25.0" dependencies = [ "anyhow", "base64 0.22.1", @@ -4400,7 +4400,7 @@ dependencies = [ [[package]] name = "goose-server" -version = "1.24.0" +version = "1.25.0" dependencies = [ "anyhow", "axum 0.8.8", @@ -4446,7 +4446,7 @@ dependencies = [ [[package]] name = "goose-test" -version = "1.24.0" +version = "1.25.0" dependencies = [ "clap", "serde_json", @@ -4454,7 +4454,7 @@ dependencies = [ [[package]] name = "goose-test-support" -version = "1.24.0" +version = "1.25.0" dependencies = [ "axum 0.7.9", "rmcp 0.15.0", diff --git a/Cargo.toml b/Cargo.toml index 193a49791431..e3f344ff1d79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ resolver = "2" [workspace.package] edition = "2021" -version = "1.24.0" +version = "1.25.0" authors = ["Block "] license = "Apache-2.0" repository = "https://github.com/block/goose" diff --git a/crates/goose-mcp/src/developer/rmcp_developer.rs b/crates/goose-mcp/src/developer/rmcp_developer.rs index e77b5b6883ae..006c5a9c175a 100644 --- a/crates/goose-mcp/src/developer/rmcp_developer.rs +++ b/crates/goose-mcp/src/developer/rmcp_developer.rs @@ -21,6 +21,8 @@ use rmcp::{ const WORKING_DIR_HEADER: &str = "agent-working-dir"; const SESSION_ID_HEADER: &str = "agent-session-id"; +pub const WORKING_DIR_PLACEHOLDER: &str = "{{WORKING_DIR}}"; + fn extract_working_dir_from_meta(meta: &Meta) -> Option { meta.0 .get(WORKING_DIR_HEADER) @@ -242,8 +244,6 @@ pub struct DeveloperServer { impl ServerHandler for DeveloperServer { #[allow(clippy::too_many_lines)] fn get_info(&self) -> ServerInfo { - // Get base instructions and working directory - let cwd = std::env::current_dir().expect("should have a current working dir"); let os = std::env::consts::OS; let in_container = Self::is_definitely_container(); @@ -268,7 +268,7 @@ impl ServerHandler for DeveloperServer { {container_info} "#, os=os, - cwd=cwd.to_string_lossy(), + cwd=WORKING_DIR_PLACEHOLDER, container_info=if in_container { "container: true" } else { "" }, }, _ => { @@ -295,7 +295,7 @@ impl ServerHandler for DeveloperServer { {container_info} "#, os=os, - cwd=cwd.to_string_lossy(), + cwd=WORKING_DIR_PLACEHOLDER, shell=shell_info, container_info=if in_container { "container: true" } else { "" }, } diff --git a/crates/goose-mcp/src/lib.rs b/crates/goose-mcp/src/lib.rs index f9c47a5b8203..e1077683c982 100644 --- a/crates/goose-mcp/src/lib.rs +++ b/crates/goose-mcp/src/lib.rs @@ -20,6 +20,7 @@ pub mod tutorial; pub use autovisualiser::AutoVisualiserRouter; pub use computercontroller::ComputerControllerServer; pub use developer::rmcp_developer::DeveloperServer; +pub use developer::rmcp_developer::WORKING_DIR_PLACEHOLDER; pub use memory::MemoryServer; pub use tutorial::TutorialServer; diff --git a/crates/goose-server/src/routes/recipe_utils.rs b/crates/goose-server/src/routes/recipe_utils.rs index ba068b732273..800283ddb46a 100644 --- a/crates/goose-server/src/routes/recipe_utils.rs +++ b/crates/goose-server/src/routes/recipe_utils.rs @@ -10,7 +10,9 @@ use crate::state::AppState; use anyhow::Result; use axum::http::StatusCode; use goose::agents::Agent; -use goose::recipe::build_recipe::{build_recipe_from_template, RecipeError}; +use goose::recipe::build_recipe::{ + build_recipe_from_template, resolve_sub_recipe_path, RecipeError, +}; use goose::recipe::local_recipes::{get_recipe_library_dir, list_local_recipes}; use goose::recipe::validate_recipe::validate_recipe_template_from_content; use goose::recipe::Recipe; @@ -44,13 +46,23 @@ pub fn short_id_from_path(path: &str) -> String { pub fn get_all_recipes_manifests() -> Result> { let recipes_with_path = list_local_recipes()?; let mut recipe_manifests_with_path = Vec::new(); - for (file_path, recipe) in recipes_with_path { + for (file_path, mut recipe) in recipes_with_path { let Ok(last_modified) = fs::metadata(file_path.clone()) .map(|m| chrono::DateTime::::from(m.modified().unwrap()).to_rfc3339()) else { continue; }; + if let Some(recipe_dir) = file_path.parent() { + if let Some(ref mut sub_recipes) = recipe.sub_recipes { + for sr in sub_recipes.iter_mut() { + if let Ok(resolved) = resolve_sub_recipe_path(&sr.path, recipe_dir) { + sr.path = resolved; + } + } + } + } + let manifest_with_path = RecipeManifest { id: short_id_from_path(file_path.to_string_lossy().as_ref()), recipe, @@ -126,10 +138,22 @@ pub async fn get_recipe_file_path_by_id( pub async fn load_recipe_by_id(state: &AppState, id: &str) -> Result { let path = get_recipe_file_path_by_id(state, id).await?; - Recipe::from_file_path(&path).map_err(|err| ErrorResponse { + let mut recipe = Recipe::from_file_path(&path).map_err(|err| ErrorResponse { message: format!("Failed to load recipe: {}", err), status: StatusCode::INTERNAL_SERVER_ERROR, - }) + })?; + + if let Some(recipe_dir) = path.parent() { + if let Some(ref mut sub_recipes) = recipe.sub_recipes { + for sr in sub_recipes.iter_mut() { + if let Ok(resolved) = resolve_sub_recipe_path(&sr.path, recipe_dir) { + sr.path = resolved; + } + } + } + } + + Ok(recipe) } pub async fn build_recipe_with_parameter_values( diff --git a/crates/goose/src/agents/agent.rs b/crates/goose/src/agents/agent.rs index 71fcb7931359..cce38d2922e3 100644 --- a/crates/goose/src/agents/agent.rs +++ b/crates/goose/src/agents/agent.rs @@ -646,7 +646,7 @@ impl Agent { } match agent_ref - .add_extension(config_clone, &session_id_clone) + .add_extension_inner(config_clone, &session_id_clone) .await { Ok(_) => ExtensionLoadResult { @@ -668,13 +668,43 @@ impl Agent { }) .collect::>(); - futures::future::join_all(extension_futures).await + let results = futures::future::join_all(extension_futures).await; + + // Persist once after all extensions are loaded + if results.iter().any(|r| r.success) { + if let Err(e) = self.persist_extension_state(&session_id).await { + warn!("Failed to persist extension state after bulk load: {}", e); + } + } + + results } pub async fn add_extension( &self, extension: ExtensionConfig, session_id: &str, + ) -> ExtensionResult<()> { + self.add_extension_inner(extension, session_id).await?; + + // Persist extension state after successful add + self.persist_extension_state(session_id) + .await + .map_err(|e| { + error!("Failed to persist extension state: {}", e); + crate::agents::extension::ExtensionError::SetupError(format!( + "Failed to persist extension state: {}", + e + )) + })?; + + Ok(()) + } + + async fn add_extension_inner( + &self, + extension: ExtensionConfig, + session_id: &str, ) -> ExtensionResult<()> { let session = self .config @@ -728,17 +758,6 @@ impl Agent { } } - // Persist extension state after successful add - self.persist_extension_state(session_id) - .await - .map_err(|e| { - error!("Failed to persist extension state: {}", e); - crate::agents::extension::ExtensionError::SetupError(format!( - "Failed to persist extension state: {}", - e - )) - })?; - Ok(()) } @@ -1695,7 +1714,15 @@ impl Agent { ) -> Result { tracing::info!("Starting recipe creation with {} messages", messages.len()); - let extensions_info = self.extension_manager.get_extensions_info().await; + let session = self + .config + .session_manager + .get_session(session_id, false) + .await?; + let extensions_info = self + .extension_manager + .get_extensions_info(&session.working_dir) + .await; tracing::debug!("Retrieved {} extensions info", extensions_info.len()); let (extension_count, tool_count) = self .extension_manager diff --git a/crates/goose/src/agents/extension_manager.rs b/crates/goose/src/agents/extension_manager.rs index 456bc9697e6d..d16f01b2181b 100644 --- a/crates/goose/src/agents/extension_manager.rs +++ b/crates/goose/src/agents/extension_manager.rs @@ -716,17 +716,17 @@ impl ExtensionManager { } /// Get extensions info for building the system prompt - pub async fn get_extensions_info(&self) -> Vec { + pub async fn get_extensions_info(&self, working_dir: &std::path::Path) -> Vec { + let working_dir_str = working_dir.to_string_lossy(); self.extensions .lock() .await .iter() .map(|(name, ext)| { - ExtensionInfo::new( - name, - ext.get_instructions().unwrap_or_default().as_str(), - ext.supports_resources(), - ) + let instructions = ext.get_instructions().unwrap_or_default(); + let instructions = + instructions.replace(goose_mcp::WORKING_DIR_PLACEHOLDER, &working_dir_str); + ExtensionInfo::new(name, &instructions, ext.supports_resources()) }) .collect() } diff --git a/crates/goose/src/agents/reply_parts.rs b/crates/goose/src/agents/reply_parts.rs index 54e6d81ae8ed..a220a843a657 100644 --- a/crates/goose/src/agents/reply_parts.rs +++ b/crates/goose/src/agents/reply_parts.rs @@ -162,7 +162,10 @@ impl Agent { tools.sort_by(|a, b| a.name.cmp(&b.name)); // Prepare system prompt - let extensions_info = self.extension_manager.get_extensions_info().await; + let extensions_info = self + .extension_manager + .get_extensions_info(working_dir) + .await; let (extension_count, tool_count) = self .extension_manager .get_extension_and_tool_counts(session_id) 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 3d928d316f28..410f09dfdac3 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-02-13T17:38:00.310507+00:00", + "timestamp": "2026-02-17T00:41:09.305757654+00:00", "unmapped_models": [ { "provider": "anthropic", @@ -9,278 +9,6 @@ "provider": "anthropic", "model": "claude-churro-eap-cc" }, - { - "provider": "databricks", - "model": "baxen-migration-demo" - }, - { - "provider": "databricks", - "model": "big-hack" - }, - { - "provider": "databricks", - "model": "case-history-checker" - }, - { - "provider": "databricks", - "model": "case_history_hackweek" - }, - { - "provider": "databricks", - "model": "claude-3-5-sonnet-2" - }, - { - "provider": "databricks", - "model": "claude-4" - }, - { - "provider": "databricks", - "model": "claude-haiku" - }, - { - "provider": "databricks", - "model": "claude-opus" - }, - { - "provider": "databricks", - "model": "claude-sonnet" - }, - { - "provider": "databricks", - "model": "cmg-test-iris" - }, - { - "provider": "databricks", - "model": "codellama-7b-hf-ift" - }, - { - "provider": "databricks", - "model": "column-mapping-model-endpoint" - }, - { - "provider": "databricks", - "model": "column-mapping-model-endpoint-v2" - }, - { - "provider": "databricks", - "model": "databricks-bge-large-en" - }, - { - "provider": "databricks", - "model": "databricks-gemini-3-flash" - }, - { - "provider": "databricks", - "model": "databricks-gemini-3-pro" - }, - { - "provider": "databricks", - "model": "databricks-gemma-3-12b" - }, - { - "provider": "databricks", - "model": "databricks-gpt-oss-120b" - }, - { - "provider": "databricks", - "model": "databricks-gpt-oss-20b" - }, - { - "provider": "databricks", - "model": "databricks-gte-large-en" - }, - { - "provider": "databricks", - "model": "databricks-llama-4-maverick" - }, - { - "provider": "databricks", - "model": "databricks-meta-llama-3-1-405b-instruct" - }, - { - "provider": "databricks", - "model": "databricks-meta-llama-3-1-8b-instruct" - }, - { - "provider": "databricks", - "model": "dummy-model-ml-gp-endpoint" - }, - { - "provider": "databricks", - "model": "e5-large-v2" - }, - { - "provider": "databricks", - "model": "gemini-2-5-pro-exp" - }, - { - "provider": "databricks", - "model": "gemini-pro" - }, - { - "provider": "databricks", - "model": "goose" - }, - { - "provider": "databricks", - "model": "goose-cerebras-glm-4-6" - }, - { - "provider": "databricks", - "model": "goose-gemini-3-pro" - }, - { - "provider": "databricks", - "model": "goose-gpt-oss" - }, - { - "provider": "databricks", - "model": "gpt-3-5-turbo-16k" - }, - { - "provider": "databricks", - "model": "gpt-3-5-turbo-instruct" - }, - { - "provider": "databricks", - "model": "gpt-4-0125-preview" - }, - { - "provider": "databricks", - "model": "gpt-4-vision-preview" - }, - { - "provider": "databricks", - "model": "gpt-5-mini-high" - }, - { - "provider": "databricks", - "model": "gpt-vision" - }, - { - "provider": "databricks", - "model": "hackweek-snowflake-gpt-query-generator" - }, - { - "provider": "databricks", - "model": "headless-goose" - }, - { - "provider": "databricks", - "model": "icg-poc" - }, - { - "provider": "databricks", - "model": "invoice_parser_test" - }, - { - "provider": "databricks", - "model": "jina-reranker-v1-turbo-en" - }, - { - "provider": "databricks", - "model": "korhan-openai-test" - }, - { - "provider": "databricks", - "model": "korhan-openai-wrapper" - }, - { - "provider": "databricks", - "model": "lfc_mml_er_bge_m3" - }, - { - "provider": "databricks", - "model": "moderation" - }, - { - "provider": "databricks", - "model": "o3-cdd-autopilot" - }, - { - "provider": "databricks", - "model": "optimized-llama2-7b" - }, - { - "provider": "databricks", - "model": "opus-mt-en-es" - }, - { - "provider": "databricks", - "model": "opus-mt-en-fr" - }, - { - "provider": "databricks", - "model": "opus-mt-en-ja" - }, - { - "provider": "databricks", - "model": "opus-mt-es-en" - }, - { - "provider": "databricks", - "model": "opus-mt-fr-en" - }, - { - "provider": "databricks", - "model": "opus-mt-ja-en" - }, - { - "provider": "databricks", - "model": "p2p-device-recovery-classify" - }, - { - "provider": "databricks", - "model": "picasso_embeddings" - }, - { - "provider": "databricks", - "model": "pii-redactor" - }, - { - "provider": "databricks", - "model": "pii-redactor-prod" - }, - { - "provider": "databricks", - "model": "prime_model" - }, - { - "provider": "databricks", - "model": "reportiq_selector_1" - }, - { - "provider": "databricks", - "model": "reportiq_selector_md_file" - }, - { - "provider": "databricks", - "model": "snowflake-gpt-query-generator-v3" - }, - { - "provider": "databricks", - "model": "sq-bank-statement-classifier" - }, - { - "provider": "databricks", - "model": "sq-bank-statement-parser" - }, - { - "provider": "databricks", - "model": "support-article-intent-mapping" - }, - { - "provider": "databricks", - "model": "text-embedding-3-large" - }, - { - "provider": "databricks", - "model": "text-embedding-3-small" - }, - { - "provider": "databricks", - "model": "text-embedding-ada-002" - }, { "provider": "google", "model": "aqa" @@ -2905,10 +2633,6 @@ "provider": "openrouter", "model": "meta-llama/llama-4-scout" }, - { - "provider": "openrouter", - "model": "minimax/minimax-m2.5" - }, { "provider": "openrouter", "model": "mistralai/ministral-14b-2512" @@ -3207,27 +2931,27 @@ }, { "provider": "openrouter", - "model": "qwen/qwq-32b" + "model": "qwen/qwen3.5-397b-a17b" }, { "provider": "openrouter", - "model": "relace/relace-search" + "model": "qwen/qwen3.5-plus-02-15" }, { "provider": "openrouter", - "model": "sao10k/l3-euryale-70b" + "model": "qwen/qwq-32b" }, { "provider": "openrouter", - "model": "sao10k/l3.1-euryale-70b" + "model": "relace/relace-search" }, { "provider": "openrouter", - "model": "stepfun/step-3.5-flash" + "model": "sao10k/l3-euryale-70b" }, { "provider": "openrouter", - "model": "stepfun/step-3.5-flash:free" + "model": "sao10k/l3.1-euryale-70b" }, { "provider": "openrouter", @@ -3257,10 +2981,6 @@ "provider": "openrouter", "model": "z-ai/glm-4.6v" }, - { - "provider": "openrouter", - "model": "z-ai/glm-5" - }, { "provider": "tetrate", "model": "deepinfra/MiniMaxAI/MiniMax-M2" @@ -3579,2141 +3299,1202 @@ ], "aws_bedrock": [], "azure_openai": [], - "databricks": [ + "databricks": [], + "gcp_vertex_ai": [], + "google": [ { - "provider_model": "claude-3-5-haiku", - "canonical_model": "anthropic/claude-3.5-haiku" + "provider_model": "gemini-2.0-flash", + "canonical_model": "google/gemini-2.0-flash" }, { - "provider_model": "claude-3-5-sonnet", - "canonical_model": "anthropic/claude-3.5-sonnet" + "provider_model": "gemini-2.0-flash-lite", + "canonical_model": "google/gemini-2.0-flash-lite" }, { - "provider_model": "claude-3-7-sonnet", - "canonical_model": "anthropic/claude-3.7-sonnet" + "provider_model": "gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash" }, { - "provider_model": "claude-4-opus", - "canonical_model": "anthropic/claude-opus-4" + "provider_model": "gemini-2.5-flash-image", + "canonical_model": "google/gemini-2.5-flash-image" }, { - "provider_model": "code-review-gpt-5", - "canonical_model": "openai/gpt-5" + "provider_model": "gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite" }, { - "provider_model": "code-review-gpt-5-mini", - "canonical_model": "openai/gpt-5-mini" + "provider_model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite-preview-09" }, { - "provider_model": "databricks-claude-3-7-sonnet", - "canonical_model": "anthropic/claude-3.7-sonnet" + "provider_model": "gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-preview-09" }, { - "provider_model": "databricks-claude-haiku-4-5", - "canonical_model": "anthropic/claude-haiku-4.5" + "provider_model": "gemini-2.5-flash-preview-tts", + "canonical_model": "google/gemini-2.5-flash-preview-tts" }, { - "provider_model": "databricks-claude-opus-4-1", - "canonical_model": "anthropic/claude-opus-4.1" + "provider_model": "gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro" }, { - "provider_model": "databricks-claude-opus-4-5", - "canonical_model": "anthropic/claude-opus-4.5" + "provider_model": "gemini-2.5-pro-preview-tts", + "canonical_model": "google/gemini-2.5-pro-preview-tts" }, { - "provider_model": "databricks-claude-opus-4-6", - "canonical_model": "anthropic/claude-opus-4.6" + "provider_model": "gemini-3-flash-preview", + "canonical_model": "google/gemini-3-flash-preview" }, { - "provider_model": "databricks-claude-sonnet-4", - "canonical_model": "anthropic/claude-sonnet-4" + "provider_model": "gemini-3-pro-preview", + "canonical_model": "google/gemini-3-pro-preview" }, { - "provider_model": "databricks-claude-sonnet-4-5", - "canonical_model": "anthropic/claude-sonnet-4.5" + "provider_model": "gemini-embedding-001", + "canonical_model": "google/gemini-embedding-001" }, { - "provider_model": "databricks-gemini-2-5-flash", - "canonical_model": "google/gemini-2.5-flash" + "provider_model": "gemini-flash-latest", + "canonical_model": "google/gemini-flash" }, { - "provider_model": "databricks-gemini-2-5-pro", - "canonical_model": "google/gemini-2.5-pro" - }, + "provider_model": "gemini-flash-lite-latest", + "canonical_model": "google/gemini-flash-lite" + } + ], + "openai": [ { - "provider_model": "databricks-gpt-5", - "canonical_model": "openai/gpt-5" + "provider_model": "gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo" }, { - "provider_model": "databricks-gpt-5-1", - "canonical_model": "openai/gpt-5.1" + "provider_model": "gpt-3.5-turbo-0125", + "canonical_model": "openai/gpt-3.5-turbo" }, { - "provider_model": "databricks-gpt-5-1-codex-max", - "canonical_model": "openai/gpt-5.1-codex-max" + "provider_model": "gpt-3.5-turbo-1106", + "canonical_model": "openai/gpt-3.5-turbo" }, { - "provider_model": "databricks-gpt-5-1-codex-mini", - "canonical_model": "openai/gpt-5.1-codex-mini" + "provider_model": "gpt-4", + "canonical_model": "openai/gpt-4" }, { - "provider_model": "databricks-gpt-5-2", - "canonical_model": "openai/gpt-5.2" + "provider_model": "gpt-4-0314", + "canonical_model": "openai/gpt-4" }, { - "provider_model": "databricks-gpt-5-2-codex", - "canonical_model": "openai/gpt-5.2-codex" + "provider_model": "gpt-4-0613", + "canonical_model": "openai/gpt-4" }, { - "provider_model": "databricks-gpt-5-mini", - "canonical_model": "openai/gpt-5-mini" + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo" }, { - "provider_model": "databricks-gpt-5-nano", - "canonical_model": "openai/gpt-5-nano" + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo" }, { - "provider_model": "databricks-meta-llama-3-3-70b-instruct", - "canonical_model": "meta-llama/llama-3.3-70b-instruct" + "provider_model": "gpt-4.1", + "canonical_model": "openai/gpt-4.1" }, { - "provider_model": "gemini-1-5-flash", - "canonical_model": "google/gemini-1.5-flash" + "provider_model": "gpt-4.1-2025-04-14", + "canonical_model": "openai/gpt-4.1" }, { - "provider_model": "gemini-1-5-pro", - "canonical_model": "google/gemini-1.5-pro" + "provider_model": "gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini" }, { - "provider_model": "gemini-2-0-flash", - "canonical_model": "google/gemini-2.0-flash" + "provider_model": "gpt-4.1-mini-2025-04-14", + "canonical_model": "openai/gpt-4.1-mini" }, { - "provider_model": "gemini-2-5-flash", - "canonical_model": "google/gemini-2.5-flash" + "provider_model": "gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano" }, { - "provider_model": "gemini-2-5-flash-latest", - "canonical_model": "google/gemini-2.5-flash" + "provider_model": "gpt-4.1-nano-2025-04-14", + "canonical_model": "openai/gpt-4.1-nano" }, { - "provider_model": "gemini-2-5-pro", - "canonical_model": "google/gemini-2.5-pro" + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o" }, { - "provider_model": "gemini-flash-lite-latest", - "canonical_model": "google/gemini-flash-lite" + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o" }, { - "provider_model": "goose-claude-3-5-sonnet", - "canonical_model": "anthropic/claude-3.5-sonnet" + "provider_model": "gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o" }, { - "provider_model": "goose-claude-3-7-sonnet", - "canonical_model": "anthropic/claude-3.7-sonnet" + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o" }, { - "provider_model": "goose-claude-4-5-haiku", - "canonical_model": "anthropic/claude-haiku-4.5" + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini" }, { - "provider_model": "goose-claude-4-5-opus", - "canonical_model": "anthropic/claude-opus-4.5" + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini" }, { - "provider_model": "goose-claude-4-5-sonnet", - "canonical_model": "anthropic/claude-sonnet-4.5" + "provider_model": "gpt-5", + "canonical_model": "openai/gpt-5" }, { - "provider_model": "goose-claude-4-6-opus", - "canonical_model": "anthropic/claude-opus-4.6" + "provider_model": "gpt-5-2025-08-07", + "canonical_model": "openai/gpt-5" }, { - "provider_model": "goose-claude-4-opus", - "canonical_model": "anthropic/claude-opus-4" + "provider_model": "gpt-5-chat-latest", + "canonical_model": "openai/gpt-5-chat" }, { - "provider_model": "goose-claude-4-sonnet", - "canonical_model": "anthropic/claude-sonnet-4" + "provider_model": "gpt-5-codex", + "canonical_model": "openai/gpt-5-codex" }, { - "provider_model": "goose-claude-4-sonnet-bedrock", - "canonical_model": "anthropic/claude-sonnet-4" + "provider_model": "gpt-5-mini", + "canonical_model": "openai/gpt-5-mini" }, { - "provider_model": "goose-gemini-2-5-pro", - "canonical_model": "google/gemini-2.5-pro" + "provider_model": "gpt-5-mini-2025-08-07", + "canonical_model": "openai/gpt-5-mini" }, { - "provider_model": "goose-gpt-4-1", - "canonical_model": "openai/gpt-4.1" + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano" }, { - "provider_model": "goose-gpt-4o", - "canonical_model": "openai/gpt-4o" + "provider_model": "gpt-5-nano-2025-08-07", + "canonical_model": "openai/gpt-5-nano" }, { - "provider_model": "goose-gpt-5", - "canonical_model": "openai/gpt-5" + "provider_model": "gpt-5-pro", + "canonical_model": "openai/gpt-5-pro" }, { - "provider_model": "goose-gpt-5-2", - "canonical_model": "openai/gpt-5.2" + "provider_model": "gpt-5-pro-2025-10-06", + "canonical_model": "openai/gpt-5-pro" }, { - "provider_model": "goose-o1", - "canonical_model": "openai/o1" + "provider_model": "gpt-5.1", + "canonical_model": "openai/gpt-5.1" }, { - "provider_model": "goose-o3", - "canonical_model": "openai/o3" + "provider_model": "gpt-5.1-2025-11-13", + "canonical_model": "openai/gpt-5.1" }, { - "provider_model": "goose-o4-mini", - "canonical_model": "openai/o4-mini" + "provider_model": "gpt-5.1-chat-latest", + "canonical_model": "openai/gpt-5.1-chat" }, { - "provider_model": "gpt-3-5-turbo", - "canonical_model": "openai/gpt-3.5-turbo" + "provider_model": "gpt-5.1-codex", + "canonical_model": "openai/gpt-5.1-codex" }, { - "provider_model": "gpt-3-5-turbo-0125", - "canonical_model": "openai/gpt-3.5-turbo" + "provider_model": "gpt-5.1-codex-max", + "canonical_model": "openai/gpt-5.1-codex-max" }, { - "provider_model": "gpt-4", - "canonical_model": "openai/gpt-4" + "provider_model": "gpt-5.1-codex-mini", + "canonical_model": "openai/gpt-5.1-codex-mini" }, { - "provider_model": "gpt-4-1-2025-04-14", - "canonical_model": "openai/gpt-4.1" + "provider_model": "gpt-5.2", + "canonical_model": "openai/gpt-5.2" }, { - "provider_model": "gpt-4-1-mini", - "canonical_model": "openai/gpt-4.1-mini" + "provider_model": "gpt-5.2-2025-12-11", + "canonical_model": "openai/gpt-5.2" }, { - "provider_model": "gpt-4-1-nano", - "canonical_model": "openai/gpt-4.1-nano" + "provider_model": "gpt-5.2-chat-latest", + "canonical_model": "openai/gpt-5.2-chat" }, { - "provider_model": "gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo" + "provider_model": "gpt-5.2-codex", + "canonical_model": "openai/gpt-5.2-codex" }, { - "provider_model": "gpt-4-turbo-2024-04-09", - "canonical_model": "openai/gpt-4-turbo" + "provider_model": "gpt-5.2-pro", + "canonical_model": "openai/gpt-5.2-pro" }, { - "provider_model": "gpt-4o", - "canonical_model": "openai/gpt-4o" + "provider_model": "gpt-5.2-pro-2025-12-11", + "canonical_model": "openai/gpt-5.2-pro" }, { - "provider_model": "gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o" + "provider_model": "o1", + "canonical_model": "openai/o1" }, { - "provider_model": "gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o" + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1" }, { - "provider_model": "gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini" + "provider_model": "o1-pro", + "canonical_model": "openai/o1-pro" }, { - "provider_model": "gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini" + "provider_model": "o1-pro-2025-03-19", + "canonical_model": "openai/o1-pro" }, { - "provider_model": "gpt-5", - "canonical_model": "openai/gpt-5" + "provider_model": "o3", + "canonical_model": "openai/o3" }, { - "provider_model": "gpt-5-nano", - "canonical_model": "openai/gpt-5-nano" + "provider_model": "o3-2025-04-16", + "canonical_model": "openai/o3" }, { - "provider_model": "headless-goose-claude-4-sonnet", - "canonical_model": "anthropic/claude-sonnet-4" + "provider_model": "o3-deep-research", + "canonical_model": "openai/o3-deep-research" }, { - "provider_model": "headless-goose-o3-mini", - "canonical_model": "openai/o3-mini" + "provider_model": "o3-deep-research-2025-06-26", + "canonical_model": "openai/o3-deep-research" }, { - "provider_model": "kgoose-cashapp-claude-4-sonnet", - "canonical_model": "anthropic/claude-sonnet-4" + "provider_model": "o3-mini", + "canonical_model": "openai/o3-mini" }, { - "provider_model": "kgoose-cashapp-claude-sonnet-4-5", - "canonical_model": "anthropic/claude-sonnet-4.5" + "provider_model": "o3-mini-2025-01-31", + "canonical_model": "openai/o3-mini" }, { - "provider_model": "kgoose-claude-4-sonnet", - "canonical_model": "anthropic/claude-sonnet-4" + "provider_model": "o3-pro", + "canonical_model": "openai/o3-pro" }, { - "provider_model": "kgoose-claude-haiku-4-5", - "canonical_model": "anthropic/claude-haiku-4.5" + "provider_model": "o3-pro-2025-06-10", + "canonical_model": "openai/o3-pro" }, { - "provider_model": "kgoose-claude-sonnet-4-5", - "canonical_model": "anthropic/claude-sonnet-4.5" + "provider_model": "o4-mini", + "canonical_model": "openai/o4-mini" }, { - "provider_model": "kgoose-gemini-2-5-flash", - "canonical_model": "google/gemini-2.5-flash" + "provider_model": "o4-mini-2025-04-16", + "canonical_model": "openai/o4-mini" }, { - "provider_model": "kgoose-gpt-4-1", - "canonical_model": "openai/gpt-4.1" + "provider_model": "o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research" }, { - "provider_model": "kgoose-gpt-4-1-mini", - "canonical_model": "openai/gpt-4.1-mini" + "provider_model": "o4-mini-deep-research-2025-06-26", + "canonical_model": "openai/o4-mini-deep-research" }, { - "provider_model": "kgoose-gpt-4-1-nano", - "canonical_model": "openai/gpt-4.1-nano" + "provider_model": "text-embedding-3-large", + "canonical_model": "openai/text-embedding-3-large" }, { - "provider_model": "kgoose-gpt-4o", - "canonical_model": "openai/gpt-4o" + "provider_model": "text-embedding-3-small", + "canonical_model": "openai/text-embedding-3-small" }, { - "provider_model": "kgoose-gpt-5", - "canonical_model": "openai/gpt-5" - }, + "provider_model": "text-embedding-ada-002", + "canonical_model": "openai/text-embedding-ada-002" + } + ], + "openrouter": [ { - "provider_model": "kgoose-gpt-5-mini", - "canonical_model": "openai/gpt-5-mini" + "provider_model": "anthropic/claude-3.5-haiku", + "canonical_model": "openrouter/anthropic/claude-3.5-haiku" }, { - "provider_model": "kgoose-gpt-5-nano", - "canonical_model": "openai/gpt-5-nano" + "provider_model": "anthropic/claude-3.7-sonnet", + "canonical_model": "openrouter/anthropic/claude-3.7-sonnet" }, { - "provider_model": "kgoose-o3", - "canonical_model": "openai/o3" + "provider_model": "anthropic/claude-haiku-4.5", + "canonical_model": "openrouter/anthropic/claude-haiku-4.5" }, { - "provider_model": "kgoose-o4-mini", - "canonical_model": "openai/o4-mini" + "provider_model": "anthropic/claude-opus-4", + "canonical_model": "openrouter/anthropic/claude-opus-4" }, { - "provider_model": "ng-tools-claude-haiku-3-5", - "canonical_model": "anthropic/claude-3.5-haiku" + "provider_model": "anthropic/claude-opus-4.1", + "canonical_model": "openrouter/anthropic/claude-opus-4.1" }, { - "provider_model": "ng-tools-claude-opus-4", - "canonical_model": "anthropic/claude-opus-4" + "provider_model": "anthropic/claude-opus-4.5", + "canonical_model": "openrouter/anthropic/claude-opus-4.5" }, { - "provider_model": "ng-tools-claude-opus-4-1", - "canonical_model": "anthropic/claude-opus-4.1" + "provider_model": "anthropic/claude-opus-4.6", + "canonical_model": "openrouter/anthropic/claude-opus-4.6" }, { - "provider_model": "ng-tools-claude-sonnet-3-7", - "canonical_model": "anthropic/claude-3.7-sonnet" + "provider_model": "anthropic/claude-sonnet-4", + "canonical_model": "openrouter/anthropic/claude-sonnet-4" }, { - "provider_model": "ng-tools-claude-sonnet-4", - "canonical_model": "anthropic/claude-sonnet-4" + "provider_model": "anthropic/claude-sonnet-4.5", + "canonical_model": "openrouter/anthropic/claude-sonnet-4.5" }, { - "provider_model": "ng-tools-gpt-5-nano", - "canonical_model": "openai/gpt-5-nano" + "provider_model": "arcee-ai/trinity-large-preview:free", + "canonical_model": "openrouter/arcee-ai/trinity-large-preview:free" }, { - "provider_model": "ng-tools-int-claude-sonnet-4-5", - "canonical_model": "anthropic/claude-sonnet-4.5" + "provider_model": "arcee-ai/trinity-mini:free", + "canonical_model": "openrouter/arcee-ai/trinity-mini:free" }, { - "provider_model": "o1", - "canonical_model": "openai/o1" + "provider_model": "deepseek/deepseek-chat-v3-0324", + "canonical_model": "openrouter/deepseek/deepseek-chat-v3" }, { - "provider_model": "o1-2024-12-17", - "canonical_model": "openai/o1" + "provider_model": "deepseek/deepseek-chat-v3.1", + "canonical_model": "openrouter/deepseek/deepseek-chat-v3.1" }, { - "provider_model": "o1-mini", - "canonical_model": "openai/o1-mini" + "provider_model": "deepseek/deepseek-v3.1-terminus", + "canonical_model": "openrouter/deepseek/deepseek-v3.1-terminus" }, { - "provider_model": "o1-preview", - "canonical_model": "openai/o1-preview" + "provider_model": "deepseek/deepseek-v3.1-terminus:exacto", + "canonical_model": "openrouter/deepseek/deepseek-v3.1-terminus:exacto" }, { - "provider_model": "o3", - "canonical_model": "openai/o3" + "provider_model": "deepseek/deepseek-v3.2", + "canonical_model": "openrouter/deepseek/deepseek-v3.2" }, { - "provider_model": "o3-mini", - "canonical_model": "openai/o3-mini" + "provider_model": "google/gemini-2.0-flash-001", + "canonical_model": "openrouter/google/gemini-2.0-flash-001" }, { - "provider_model": "raml-claude-opus-4-5", - "canonical_model": "anthropic/claude-opus-4.5" + "provider_model": "google/gemini-2.5-flash", + "canonical_model": "openrouter/google/gemini-2.5-flash" }, { - "provider_model": "raml-claude-sonnet-4-5", - "canonical_model": "anthropic/claude-sonnet-4.5" - } - ], - "gcp_vertex_ai": [], - "google": [ - { - "provider_model": "gemini-2.0-flash", - "canonical_model": "google/gemini-2.0-flash" + "provider_model": "google/gemini-2.5-flash-lite", + "canonical_model": "openrouter/google/gemini-2.5-flash-lite" }, { - "provider_model": "gemini-2.0-flash-lite", - "canonical_model": "google/gemini-2.0-flash-lite" + "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "openrouter/google/gemini-2.5-flash-lite-preview-09" }, { - "provider_model": "gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash" + "provider_model": "google/gemini-2.5-flash-preview-09-2025", + "canonical_model": "openrouter/google/gemini-2.5-flash-preview-09" }, { - "provider_model": "gemini-2.5-flash-image", - "canonical_model": "google/gemini-2.5-flash-image" + "provider_model": "google/gemini-2.5-pro", + "canonical_model": "openrouter/google/gemini-2.5-pro" }, { - "provider_model": "gemini-2.5-flash-lite", - "canonical_model": "google/gemini-2.5-flash-lite" + "provider_model": "google/gemini-2.5-pro-preview-05-06", + "canonical_model": "openrouter/google/gemini-2.5-pro-preview-05-06" }, { - "provider_model": "gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-lite-preview-09" + "provider_model": "google/gemini-3-flash-preview", + "canonical_model": "openrouter/google/gemini-3-flash-preview" }, { - "provider_model": "gemini-2.5-flash-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-preview-09" + "provider_model": "google/gemini-3-pro-preview", + "canonical_model": "openrouter/google/gemini-3-pro-preview" }, { - "provider_model": "gemini-2.5-flash-preview-tts", - "canonical_model": "google/gemini-2.5-flash-preview-tts" + "provider_model": "google/gemma-3-27b-it", + "canonical_model": "openrouter/google/gemma-3-27b-it" }, { - "provider_model": "gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro" + "provider_model": "google/gemma-3-27b-it:free", + "canonical_model": "openrouter/google/gemma-3-27b-it:free" }, { - "provider_model": "gemini-2.5-pro-preview-tts", - "canonical_model": "google/gemini-2.5-pro-preview-tts" + "provider_model": "meta-llama/llama-3.3-70b-instruct:free", + "canonical_model": "openrouter/meta-llama/llama-3.3-70b-instruct:free" }, { - "provider_model": "gemini-3-flash-preview", - "canonical_model": "google/gemini-3-flash-preview" + "provider_model": "minimax/minimax-m1", + "canonical_model": "openrouter/minimax/minimax-m1" }, { - "provider_model": "gemini-3-pro-preview", - "canonical_model": "google/gemini-3-pro-preview" + "provider_model": "minimax/minimax-m2", + "canonical_model": "openrouter/minimax/minimax-m2" }, { - "provider_model": "gemini-embedding-001", - "canonical_model": "google/gemini-embedding-001" + "provider_model": "minimax/minimax-m2.1", + "canonical_model": "openrouter/minimax/minimax-m2.1" }, { - "provider_model": "gemini-flash-latest", - "canonical_model": "google/gemini-flash" + "provider_model": "minimax/minimax-m2.5", + "canonical_model": "openrouter/minimax/minimax-m2.5" }, { - "provider_model": "gemini-flash-lite-latest", - "canonical_model": "google/gemini-flash-lite" - } - ], - "openai": [ - { - "provider_model": "gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo" + "provider_model": "mistralai/codestral-2508", + "canonical_model": "openrouter/mistralai/codestral" }, { - "provider_model": "gpt-3.5-turbo-0125", - "canonical_model": "openai/gpt-3.5-turbo" + "provider_model": "mistralai/devstral-2512", + "canonical_model": "openrouter/mistralai/devstral" }, { - "provider_model": "gpt-3.5-turbo-1106", - "canonical_model": "openai/gpt-3.5-turbo" + "provider_model": "mistralai/devstral-medium", + "canonical_model": "openrouter/mistralai/devstral-medium" }, { - "provider_model": "gpt-4", - "canonical_model": "openai/gpt-4" + "provider_model": "mistralai/devstral-small", + "canonical_model": "openrouter/mistralai/devstral-small" }, { - "provider_model": "gpt-4-0314", - "canonical_model": "openai/gpt-4" + "provider_model": "mistralai/mistral-medium-3", + "canonical_model": "openrouter/mistralai/mistral-medium-3" }, { - "provider_model": "gpt-4-0613", - "canonical_model": "openai/gpt-4" + "provider_model": "mistralai/mistral-medium-3.1", + "canonical_model": "openrouter/mistralai/mistral-medium-3.1" }, { - "provider_model": "gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo" + "provider_model": "mistralai/mistral-small-3.1-24b-instruct", + "canonical_model": "openrouter/mistralai/mistral-small-3.1-24b-instruct" }, { - "provider_model": "gpt-4-turbo-2024-04-09", - "canonical_model": "openai/gpt-4-turbo" + "provider_model": "mistralai/mistral-small-3.2-24b-instruct", + "canonical_model": "openrouter/mistralai/mistral-small-3.2-24b-instruct" }, { - "provider_model": "gpt-4.1", - "canonical_model": "openai/gpt-4.1" + "provider_model": "moonshotai/kimi-k2", + "canonical_model": "openrouter/moonshotai/kimi-k2" }, { - "provider_model": "gpt-4.1-2025-04-14", - "canonical_model": "openai/gpt-4.1" + "provider_model": "moonshotai/kimi-k2-0905", + "canonical_model": "openrouter/moonshotai/kimi-k2" }, { - "provider_model": "gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini" + "provider_model": "moonshotai/kimi-k2-0905:exacto", + "canonical_model": "openrouter/moonshotai/kimi-k2-0905:exacto" }, { - "provider_model": "gpt-4.1-mini-2025-04-14", - "canonical_model": "openai/gpt-4.1-mini" + "provider_model": "moonshotai/kimi-k2-thinking", + "canonical_model": "openrouter/moonshotai/kimi-k2-thinking" }, { - "provider_model": "gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano" + "provider_model": "moonshotai/kimi-k2.5", + "canonical_model": "openrouter/moonshotai/kimi-k2.5" }, { - "provider_model": "gpt-4.1-nano-2025-04-14", - "canonical_model": "openai/gpt-4.1-nano" + "provider_model": "nousresearch/hermes-4-70b", + "canonical_model": "openrouter/nousresearch/hermes-4-70b" }, { - "provider_model": "gpt-4o", - "canonical_model": "openai/gpt-4o" + "provider_model": "nvidia/nemotron-3-nano-30b-a3b:free", + "canonical_model": "openrouter/nvidia/nemotron-3-nano-30b-a3b:free" }, { - "provider_model": "gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o" + "provider_model": "nvidia/nemotron-nano-12b-v2-vl:free", + "canonical_model": "openrouter/nvidia/nemotron-nano-12b-v2-vl:free" }, { - "provider_model": "gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o" + "provider_model": "nvidia/nemotron-nano-9b-v2", + "canonical_model": "openrouter/nvidia/nemotron-nano-9b-v2" }, { - "provider_model": "gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o" + "provider_model": "nvidia/nemotron-nano-9b-v2:free", + "canonical_model": "openrouter/nvidia/nemotron-nano-9b-v2:free" }, { - "provider_model": "gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini" + "provider_model": "openai/gpt-4.1", + "canonical_model": "openrouter/openai/gpt-4.1" }, { - "provider_model": "gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini" + "provider_model": "openai/gpt-4.1-mini", + "canonical_model": "openrouter/openai/gpt-4.1-mini" }, { - "provider_model": "gpt-5", - "canonical_model": "openai/gpt-5" + "provider_model": "openai/gpt-4o-mini", + "canonical_model": "openrouter/openai/gpt-4o-mini" }, { - "provider_model": "gpt-5-2025-08-07", - "canonical_model": "openai/gpt-5" + "provider_model": "openai/gpt-4o-mini-2024-07-18", + "canonical_model": "openrouter/openai/gpt-4o-mini" }, { - "provider_model": "gpt-5-chat-latest", - "canonical_model": "openai/gpt-5-chat" + "provider_model": "openai/gpt-5", + "canonical_model": "openrouter/openai/gpt-5" }, { - "provider_model": "gpt-5-codex", - "canonical_model": "openai/gpt-5-codex" + "provider_model": "openai/gpt-5-codex", + "canonical_model": "openrouter/openai/gpt-5-codex" }, { - "provider_model": "gpt-5-mini", - "canonical_model": "openai/gpt-5-mini" + "provider_model": "openai/gpt-5-image", + "canonical_model": "openrouter/openai/gpt-5-image" }, { - "provider_model": "gpt-5-mini-2025-08-07", - "canonical_model": "openai/gpt-5-mini" + "provider_model": "openai/gpt-5-mini", + "canonical_model": "openrouter/openai/gpt-5-mini" }, { - "provider_model": "gpt-5-nano", - "canonical_model": "openai/gpt-5-nano" + "provider_model": "openai/gpt-5-nano", + "canonical_model": "openrouter/openai/gpt-5-nano" }, { - "provider_model": "gpt-5-nano-2025-08-07", - "canonical_model": "openai/gpt-5-nano" + "provider_model": "openai/gpt-5-pro", + "canonical_model": "openrouter/openai/gpt-5-pro" }, { - "provider_model": "gpt-5-pro", - "canonical_model": "openai/gpt-5-pro" + "provider_model": "openai/gpt-5.1", + "canonical_model": "openrouter/openai/gpt-5.1" }, { - "provider_model": "gpt-5-pro-2025-10-06", - "canonical_model": "openai/gpt-5-pro" + "provider_model": "openai/gpt-5.1-chat", + "canonical_model": "openrouter/openai/gpt-5.1-chat" }, { - "provider_model": "gpt-5.1", - "canonical_model": "openai/gpt-5.1" + "provider_model": "openai/gpt-5.1-codex", + "canonical_model": "openrouter/openai/gpt-5.1-codex" }, { - "provider_model": "gpt-5.1-2025-11-13", - "canonical_model": "openai/gpt-5.1" + "provider_model": "openai/gpt-5.1-codex-max", + "canonical_model": "openrouter/openai/gpt-5.1-codex-max" }, { - "provider_model": "gpt-5.1-chat-latest", - "canonical_model": "openai/gpt-5.1-chat" + "provider_model": "openai/gpt-5.1-codex-mini", + "canonical_model": "openrouter/openai/gpt-5.1-codex-mini" }, { - "provider_model": "gpt-5.1-codex", - "canonical_model": "openai/gpt-5.1-codex" + "provider_model": "openai/gpt-5.2", + "canonical_model": "openrouter/openai/gpt-5.2" }, { - "provider_model": "gpt-5.1-codex-max", - "canonical_model": "openai/gpt-5.1-codex-max" + "provider_model": "openai/gpt-5.2-chat", + "canonical_model": "openrouter/openai/gpt-5.2-chat" }, { - "provider_model": "gpt-5.1-codex-mini", - "canonical_model": "openai/gpt-5.1-codex-mini" + "provider_model": "openai/gpt-5.2-codex", + "canonical_model": "openrouter/openai/gpt-5.2-codex" }, { - "provider_model": "gpt-5.2", - "canonical_model": "openai/gpt-5.2" + "provider_model": "openai/gpt-5.2-pro", + "canonical_model": "openrouter/openai/gpt-5.2-pro" }, { - "provider_model": "gpt-5.2-2025-12-11", - "canonical_model": "openai/gpt-5.2" + "provider_model": "openai/gpt-oss-120b", + "canonical_model": "openrouter/openai/gpt-oss-120b" }, { - "provider_model": "gpt-5.2-chat-latest", - "canonical_model": "openai/gpt-5.2-chat" + "provider_model": "openai/gpt-oss-120b:exacto", + "canonical_model": "openrouter/openai/gpt-oss-120b:exacto" }, { - "provider_model": "gpt-5.2-codex", - "canonical_model": "openai/gpt-5.2-codex" + "provider_model": "openai/gpt-oss-120b:free", + "canonical_model": "openrouter/openai/gpt-oss-120b:free" }, { - "provider_model": "gpt-5.2-pro", - "canonical_model": "openai/gpt-5.2-pro" + "provider_model": "openai/gpt-oss-20b", + "canonical_model": "openrouter/openai/gpt-oss-20b" }, { - "provider_model": "gpt-5.2-pro-2025-12-11", - "canonical_model": "openai/gpt-5.2-pro" + "provider_model": "openai/gpt-oss-20b:free", + "canonical_model": "openrouter/openai/gpt-oss-20b:free" }, { - "provider_model": "o1", - "canonical_model": "openai/o1" + "provider_model": "openai/gpt-oss-safeguard-20b", + "canonical_model": "openrouter/openai/gpt-oss-safeguard-20b" }, { - "provider_model": "o1-2024-12-17", - "canonical_model": "openai/o1" + "provider_model": "openai/o4-mini", + "canonical_model": "openrouter/openai/o4-mini" }, { - "provider_model": "o1-pro", - "canonical_model": "openai/o1-pro" + "provider_model": "qwen/qwen3-235b-a22b-thinking-2507", + "canonical_model": "openrouter/qwen/qwen3-235b-a22b-thinking" }, { - "provider_model": "o1-pro-2025-03-19", - "canonical_model": "openai/o1-pro" + "provider_model": "qwen/qwen3-30b-a3b-instruct-2507", + "canonical_model": "openrouter/qwen/qwen3-30b-a3b-instruct" }, { - "provider_model": "o3", - "canonical_model": "openai/o3" + "provider_model": "qwen/qwen3-30b-a3b-thinking-2507", + "canonical_model": "openrouter/qwen/qwen3-30b-a3b-thinking" }, { - "provider_model": "o3-2025-04-16", - "canonical_model": "openai/o3" + "provider_model": "qwen/qwen3-4b:free", + "canonical_model": "openrouter/qwen/qwen3-4b:free" }, { - "provider_model": "o3-deep-research", - "canonical_model": "openai/o3-deep-research" + "provider_model": "qwen/qwen3-coder", + "canonical_model": "openrouter/qwen/qwen3-coder" }, { - "provider_model": "o3-deep-research-2025-06-26", - "canonical_model": "openai/o3-deep-research" + "provider_model": "qwen/qwen3-coder-30b-a3b-instruct", + "canonical_model": "openrouter/qwen/qwen3-coder-30b-a3b-instruct" }, { - "provider_model": "o3-mini", - "canonical_model": "openai/o3-mini" + "provider_model": "qwen/qwen3-coder-flash", + "canonical_model": "openrouter/qwen/qwen3-coder-flash" }, { - "provider_model": "o3-mini-2025-01-31", - "canonical_model": "openai/o3-mini" + "provider_model": "qwen/qwen3-coder:exacto", + "canonical_model": "openrouter/qwen/qwen3-coder:exacto" }, { - "provider_model": "o3-pro", - "canonical_model": "openai/o3-pro" + "provider_model": "qwen/qwen3-coder:free", + "canonical_model": "openrouter/qwen/qwen3-coder:free" }, { - "provider_model": "o3-pro-2025-06-10", - "canonical_model": "openai/o3-pro" + "provider_model": "qwen/qwen3-max", + "canonical_model": "openrouter/qwen/qwen3-max" }, { - "provider_model": "o4-mini", - "canonical_model": "openai/o4-mini" + "provider_model": "qwen/qwen3-next-80b-a3b-instruct", + "canonical_model": "openrouter/qwen/qwen3-next-80b-a3b-instruct" }, { - "provider_model": "o4-mini-2025-04-16", - "canonical_model": "openai/o4-mini" + "provider_model": "qwen/qwen3-next-80b-a3b-instruct:free", + "canonical_model": "openrouter/qwen/qwen3-next-80b-a3b-instruct:free" }, { - "provider_model": "o4-mini-deep-research", - "canonical_model": "openai/o4-mini-deep-research" + "provider_model": "qwen/qwen3-next-80b-a3b-thinking", + "canonical_model": "openrouter/qwen/qwen3-next-80b-a3b-thinking" }, { - "provider_model": "o4-mini-deep-research-2025-06-26", - "canonical_model": "openai/o4-mini-deep-research" + "provider_model": "stepfun/step-3.5-flash", + "canonical_model": "openrouter/stepfun/step-3.5-flash" }, { - "provider_model": "text-embedding-3-large", - "canonical_model": "openai/text-embedding-3-large" + "provider_model": "stepfun/step-3.5-flash:free", + "canonical_model": "openrouter/stepfun/step-3.5-flash:free" }, { - "provider_model": "text-embedding-3-small", - "canonical_model": "openai/text-embedding-3-small" + "provider_model": "x-ai/grok-3", + "canonical_model": "openrouter/x-ai/grok-3" }, { - "provider_model": "text-embedding-ada-002", - "canonical_model": "openai/text-embedding-ada-002" - } - ], - "openrouter": [ - { - "provider_model": "anthropic/claude-3.5-haiku", - "canonical_model": "openrouter/anthropic/claude-3.5-haiku" + "provider_model": "x-ai/grok-3-beta", + "canonical_model": "openrouter/x-ai/grok-3-beta" }, { - "provider_model": "anthropic/claude-3.7-sonnet", - "canonical_model": "openrouter/anthropic/claude-3.7-sonnet" + "provider_model": "x-ai/grok-3-mini", + "canonical_model": "openrouter/x-ai/grok-3-mini" }, { - "provider_model": "anthropic/claude-haiku-4.5", - "canonical_model": "openrouter/anthropic/claude-haiku-4.5" + "provider_model": "x-ai/grok-3-mini-beta", + "canonical_model": "openrouter/x-ai/grok-3-mini-beta" }, { - "provider_model": "anthropic/claude-opus-4", - "canonical_model": "openrouter/anthropic/claude-opus-4" + "provider_model": "x-ai/grok-4", + "canonical_model": "openrouter/x-ai/grok-4" }, { - "provider_model": "anthropic/claude-opus-4.1", - "canonical_model": "openrouter/anthropic/claude-opus-4.1" + "provider_model": "x-ai/grok-4-fast", + "canonical_model": "openrouter/x-ai/grok-4-fast" }, { - "provider_model": "anthropic/claude-opus-4.5", - "canonical_model": "openrouter/anthropic/claude-opus-4.5" + "provider_model": "x-ai/grok-4.1-fast", + "canonical_model": "openrouter/x-ai/grok-4.1-fast" }, { - "provider_model": "anthropic/claude-opus-4.6", - "canonical_model": "openrouter/anthropic/claude-opus-4.6" + "provider_model": "x-ai/grok-code-fast-1", + "canonical_model": "openrouter/x-ai/grok-code-fast-1" }, { - "provider_model": "anthropic/claude-sonnet-4", - "canonical_model": "openrouter/anthropic/claude-sonnet-4" + "provider_model": "xiaomi/mimo-v2-flash", + "canonical_model": "openrouter/xiaomi/mimo-v2-flash" }, { - "provider_model": "anthropic/claude-sonnet-4.5", - "canonical_model": "openrouter/anthropic/claude-sonnet-4.5" + "provider_model": "z-ai/glm-4.5", + "canonical_model": "openrouter/z-ai/glm-4.5" }, { - "provider_model": "arcee-ai/trinity-large-preview:free", - "canonical_model": "openrouter/arcee-ai/trinity-large-preview:free" + "provider_model": "z-ai/glm-4.5-air", + "canonical_model": "openrouter/z-ai/glm-4.5-air" }, { - "provider_model": "arcee-ai/trinity-mini:free", - "canonical_model": "openrouter/arcee-ai/trinity-mini:free" + "provider_model": "z-ai/glm-4.5-air:free", + "canonical_model": "openrouter/z-ai/glm-4.5-air:free" }, { - "provider_model": "deepseek/deepseek-chat-v3-0324", - "canonical_model": "openrouter/deepseek/deepseek-chat-v3" + "provider_model": "z-ai/glm-4.5v", + "canonical_model": "openrouter/z-ai/glm-4.5v" }, { - "provider_model": "deepseek/deepseek-chat-v3.1", - "canonical_model": "openrouter/deepseek/deepseek-chat-v3.1" + "provider_model": "z-ai/glm-4.6", + "canonical_model": "openrouter/z-ai/glm-4.6" }, { - "provider_model": "deepseek/deepseek-v3.1-terminus", - "canonical_model": "openrouter/deepseek/deepseek-v3.1-terminus" + "provider_model": "z-ai/glm-4.6:exacto", + "canonical_model": "openrouter/z-ai/glm-4.6:exacto" }, { - "provider_model": "deepseek/deepseek-v3.1-terminus:exacto", - "canonical_model": "openrouter/deepseek/deepseek-v3.1-terminus:exacto" + "provider_model": "z-ai/glm-4.7", + "canonical_model": "openrouter/z-ai/glm-4.7" }, { - "provider_model": "deepseek/deepseek-v3.2", - "canonical_model": "openrouter/deepseek/deepseek-v3.2" + "provider_model": "z-ai/glm-4.7-flash", + "canonical_model": "openrouter/z-ai/glm-4.7-flash" }, { - "provider_model": "google/gemini-2.0-flash-001", - "canonical_model": "openrouter/google/gemini-2.0-flash-001" + "provider_model": "z-ai/glm-5", + "canonical_model": "openrouter/z-ai/glm-5" + } + ], + "tetrate": [ + { + "provider_model": "claude-3-5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku" }, { - "provider_model": "google/gemini-2.5-flash", - "canonical_model": "openrouter/google/gemini-2.5-flash" + "provider_model": "claude-3-5-haiku-latest", + "canonical_model": "anthropic/claude-3.5-haiku" }, { - "provider_model": "google/gemini-2.5-flash-lite", - "canonical_model": "openrouter/google/gemini-2.5-flash-lite" + "provider_model": "claude-3-7-sonnet-20250219", + "canonical_model": "anthropic/claude-3.7-sonnet" }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "openrouter/google/gemini-2.5-flash-lite-preview-09" + "provider_model": "claude-3-7-sonnet-latest", + "canonical_model": "anthropic/claude-3.7-sonnet" }, { - "provider_model": "google/gemini-2.5-flash-preview-09-2025", - "canonical_model": "openrouter/google/gemini-2.5-flash-preview-09" + "provider_model": "claude-3-haiku-20240307", + "canonical_model": "anthropic/claude-3-haiku" }, { - "provider_model": "google/gemini-2.5-pro", - "canonical_model": "openrouter/google/gemini-2.5-pro" + "provider_model": "claude-3-opus-20240229", + "canonical_model": "anthropic/claude-3-opus" }, { - "provider_model": "google/gemini-2.5-pro-preview-05-06", - "canonical_model": "openrouter/google/gemini-2.5-pro-preview-05-06" + "provider_model": "claude-haiku-4-5", + "canonical_model": "anthropic/claude-haiku-4.5" }, { - "provider_model": "google/gemini-3-flash-preview", - "canonical_model": "openrouter/google/gemini-3-flash-preview" + "provider_model": "claude-haiku-4-5-20251001", + "canonical_model": "anthropic/claude-haiku-4.5" }, { - "provider_model": "google/gemini-3-pro-preview", - "canonical_model": "openrouter/google/gemini-3-pro-preview" + "provider_model": "claude-opus-4-0", + "canonical_model": "anthropic/claude-opus-4.0" }, { - "provider_model": "google/gemma-3-27b-it", - "canonical_model": "openrouter/google/gemma-3-27b-it" + "provider_model": "claude-opus-4-1", + "canonical_model": "anthropic/claude-opus-4.1" }, { - "provider_model": "google/gemma-3-27b-it:free", - "canonical_model": "openrouter/google/gemma-3-27b-it:free" + "provider_model": "claude-opus-4-1-20250805", + "canonical_model": "anthropic/claude-opus-4.1" }, { - "provider_model": "meta-llama/llama-3.3-70b-instruct:free", - "canonical_model": "openrouter/meta-llama/llama-3.3-70b-instruct:free" + "provider_model": "claude-opus-4-20250514", + "canonical_model": "anthropic/claude-opus-4" }, { - "provider_model": "minimax/minimax-m1", - "canonical_model": "openrouter/minimax/minimax-m1" + "provider_model": "claude-opus-4-5", + "canonical_model": "anthropic/claude-opus-4.5" }, { - "provider_model": "minimax/minimax-m2", - "canonical_model": "openrouter/minimax/minimax-m2" + "provider_model": "claude-opus-4-5-20251101", + "canonical_model": "anthropic/claude-opus-4.5" }, { - "provider_model": "minimax/minimax-m2.1", - "canonical_model": "openrouter/minimax/minimax-m2.1" + "provider_model": "claude-opus-4-6", + "canonical_model": "anthropic/claude-opus-4.6" }, { - "provider_model": "mistralai/codestral-2508", - "canonical_model": "openrouter/mistralai/codestral" + "provider_model": "claude-sonnet-4-0", + "canonical_model": "anthropic/claude-sonnet-4.0" }, { - "provider_model": "mistralai/devstral-2512", - "canonical_model": "openrouter/mistralai/devstral" + "provider_model": "claude-sonnet-4-20250514", + "canonical_model": "anthropic/claude-sonnet-4" }, { - "provider_model": "mistralai/devstral-medium", - "canonical_model": "openrouter/mistralai/devstral-medium" + "provider_model": "claude-sonnet-4-5", + "canonical_model": "anthropic/claude-sonnet-4.5" }, { - "provider_model": "mistralai/devstral-small", - "canonical_model": "openrouter/mistralai/devstral-small" + "provider_model": "claude-sonnet-4-5-20250929", + "canonical_model": "anthropic/claude-sonnet-4.5" }, { - "provider_model": "mistralai/mistral-medium-3", - "canonical_model": "openrouter/mistralai/mistral-medium-3" + "provider_model": "deepinfra/anthropic/claude-3-7-sonnet-latest", + "canonical_model": "anthropic/claude-3.7-sonnet" }, { - "provider_model": "mistralai/mistral-medium-3.1", - "canonical_model": "openrouter/mistralai/mistral-medium-3.1" + "provider_model": "deepinfra/anthropic/claude-4-opus", + "canonical_model": "anthropic/claude-opus-4" }, { - "provider_model": "mistralai/mistral-small-3.1-24b-instruct", - "canonical_model": "openrouter/mistralai/mistral-small-3.1-24b-instruct" + "provider_model": "deepinfra/anthropic/claude-4-sonnet", + "canonical_model": "anthropic/claude-sonnet-4" }, { - "provider_model": "mistralai/mistral-small-3.2-24b-instruct", - "canonical_model": "openrouter/mistralai/mistral-small-3.2-24b-instruct" + "provider_model": "deepinfra/google/gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash" }, { - "provider_model": "moonshotai/kimi-k2", - "canonical_model": "openrouter/moonshotai/kimi-k2" + "provider_model": "deepinfra/google/gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro" }, { - "provider_model": "moonshotai/kimi-k2-0905", - "canonical_model": "openrouter/moonshotai/kimi-k2" + "provider_model": "gemini-2.0-flash", + "canonical_model": "google/gemini-2.0-flash" }, { - "provider_model": "moonshotai/kimi-k2-0905:exacto", - "canonical_model": "openrouter/moonshotai/kimi-k2-0905:exacto" + "provider_model": "gemini-2.0-flash-lite", + "canonical_model": "google/gemini-2.0-flash-lite" }, { - "provider_model": "moonshotai/kimi-k2-thinking", - "canonical_model": "openrouter/moonshotai/kimi-k2-thinking" + "provider_model": "gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash" }, { - "provider_model": "moonshotai/kimi-k2.5", - "canonical_model": "openrouter/moonshotai/kimi-k2.5" + "provider_model": "gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite" }, { - "provider_model": "nousresearch/hermes-4-70b", - "canonical_model": "openrouter/nousresearch/hermes-4-70b" + "provider_model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite-preview-09" }, { - "provider_model": "nvidia/nemotron-3-nano-30b-a3b:free", - "canonical_model": "openrouter/nvidia/nemotron-3-nano-30b-a3b:free" + "provider_model": "gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-preview-09" }, { - "provider_model": "nvidia/nemotron-nano-12b-v2-vl:free", - "canonical_model": "openrouter/nvidia/nemotron-nano-12b-v2-vl:free" + "provider_model": "gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro" }, { - "provider_model": "nvidia/nemotron-nano-9b-v2", - "canonical_model": "openrouter/nvidia/nemotron-nano-9b-v2" + "provider_model": "gemini-3-pro-preview", + "canonical_model": "google/gemini-3-pro-preview" }, { - "provider_model": "nvidia/nemotron-nano-9b-v2:free", - "canonical_model": "openrouter/nvidia/nemotron-nano-9b-v2:free" + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo" }, { - "provider_model": "openai/gpt-4.1", - "canonical_model": "openrouter/openai/gpt-4.1" + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo" }, { - "provider_model": "openai/gpt-4.1-mini", - "canonical_model": "openrouter/openai/gpt-4.1-mini" + "provider_model": "gpt-4.1", + "canonical_model": "openai/gpt-4.1" }, { - "provider_model": "openai/gpt-4o-mini", - "canonical_model": "openrouter/openai/gpt-4o-mini" + "provider_model": "gpt-4.1-2025-04-14", + "canonical_model": "openai/gpt-4.1" }, { - "provider_model": "openai/gpt-4o-mini-2024-07-18", - "canonical_model": "openrouter/openai/gpt-4o-mini" + "provider_model": "gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini" }, { - "provider_model": "openai/gpt-5", - "canonical_model": "openrouter/openai/gpt-5" + "provider_model": "gpt-4.1-mini-2025-04-14", + "canonical_model": "openai/gpt-4.1-mini" }, { - "provider_model": "openai/gpt-5-codex", - "canonical_model": "openrouter/openai/gpt-5-codex" + "provider_model": "gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano" }, { - "provider_model": "openai/gpt-5-image", - "canonical_model": "openrouter/openai/gpt-5-image" + "provider_model": "gpt-4.1-nano-2025-04-14", + "canonical_model": "openai/gpt-4.1-nano" }, { - "provider_model": "openai/gpt-5-mini", - "canonical_model": "openrouter/openai/gpt-5-mini" + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o" }, { - "provider_model": "openai/gpt-5-nano", - "canonical_model": "openrouter/openai/gpt-5-nano" + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o" }, { - "provider_model": "openai/gpt-5-pro", - "canonical_model": "openrouter/openai/gpt-5-pro" + "provider_model": "gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o" }, { - "provider_model": "openai/gpt-5.1", - "canonical_model": "openrouter/openai/gpt-5.1" + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o" }, { - "provider_model": "openai/gpt-5.1-chat", - "canonical_model": "openrouter/openai/gpt-5.1-chat" + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini" }, { - "provider_model": "openai/gpt-5.1-codex", - "canonical_model": "openrouter/openai/gpt-5.1-codex" + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini" }, { - "provider_model": "openai/gpt-5.1-codex-max", - "canonical_model": "openrouter/openai/gpt-5.1-codex-max" + "provider_model": "gpt-5", + "canonical_model": "openai/gpt-5" }, { - "provider_model": "openai/gpt-5.1-codex-mini", - "canonical_model": "openrouter/openai/gpt-5.1-codex-mini" + "provider_model": "gpt-5-2025-08-07", + "canonical_model": "openai/gpt-5" }, { - "provider_model": "openai/gpt-5.2", - "canonical_model": "openrouter/openai/gpt-5.2" + "provider_model": "gpt-5-chat-latest", + "canonical_model": "openai/gpt-5-chat" }, { - "provider_model": "openai/gpt-5.2-chat", - "canonical_model": "openrouter/openai/gpt-5.2-chat" - }, - { - "provider_model": "openai/gpt-5.2-codex", - "canonical_model": "openrouter/openai/gpt-5.2-codex" - }, - { - "provider_model": "openai/gpt-5.2-pro", - "canonical_model": "openrouter/openai/gpt-5.2-pro" - }, - { - "provider_model": "openai/gpt-oss-120b", - "canonical_model": "openrouter/openai/gpt-oss-120b" - }, - { - "provider_model": "openai/gpt-oss-120b:exacto", - "canonical_model": "openrouter/openai/gpt-oss-120b:exacto" - }, - { - "provider_model": "openai/gpt-oss-120b:free", - "canonical_model": "openrouter/openai/gpt-oss-120b:free" - }, - { - "provider_model": "openai/gpt-oss-20b", - "canonical_model": "openrouter/openai/gpt-oss-20b" - }, - { - "provider_model": "openai/gpt-oss-20b:free", - "canonical_model": "openrouter/openai/gpt-oss-20b:free" - }, - { - "provider_model": "openai/gpt-oss-safeguard-20b", - "canonical_model": "openrouter/openai/gpt-oss-safeguard-20b" - }, - { - "provider_model": "openai/o4-mini", - "canonical_model": "openrouter/openai/o4-mini" - }, - { - "provider_model": "qwen/qwen3-235b-a22b-thinking-2507", - "canonical_model": "openrouter/qwen/qwen3-235b-a22b-thinking" - }, - { - "provider_model": "qwen/qwen3-30b-a3b-instruct-2507", - "canonical_model": "openrouter/qwen/qwen3-30b-a3b-instruct" - }, - { - "provider_model": "qwen/qwen3-30b-a3b-thinking-2507", - "canonical_model": "openrouter/qwen/qwen3-30b-a3b-thinking" - }, - { - "provider_model": "qwen/qwen3-4b:free", - "canonical_model": "openrouter/qwen/qwen3-4b:free" - }, - { - "provider_model": "qwen/qwen3-coder", - "canonical_model": "openrouter/qwen/qwen3-coder" - }, - { - "provider_model": "qwen/qwen3-coder-30b-a3b-instruct", - "canonical_model": "openrouter/qwen/qwen3-coder-30b-a3b-instruct" - }, - { - "provider_model": "qwen/qwen3-coder-flash", - "canonical_model": "openrouter/qwen/qwen3-coder-flash" - }, - { - "provider_model": "qwen/qwen3-coder:exacto", - "canonical_model": "openrouter/qwen/qwen3-coder:exacto" - }, - { - "provider_model": "qwen/qwen3-coder:free", - "canonical_model": "openrouter/qwen/qwen3-coder:free" - }, - { - "provider_model": "qwen/qwen3-max", - "canonical_model": "openrouter/qwen/qwen3-max" - }, - { - "provider_model": "qwen/qwen3-next-80b-a3b-instruct", - "canonical_model": "openrouter/qwen/qwen3-next-80b-a3b-instruct" - }, - { - "provider_model": "qwen/qwen3-next-80b-a3b-instruct:free", - "canonical_model": "openrouter/qwen/qwen3-next-80b-a3b-instruct:free" - }, - { - "provider_model": "qwen/qwen3-next-80b-a3b-thinking", - "canonical_model": "openrouter/qwen/qwen3-next-80b-a3b-thinking" - }, - { - "provider_model": "tngtech/tng-r1t-chimera:free", - "canonical_model": "openrouter/tngtech/tng-r1t-chimera:free" - }, - { - "provider_model": "x-ai/grok-3", - "canonical_model": "openrouter/x-ai/grok-3" - }, - { - "provider_model": "x-ai/grok-3-beta", - "canonical_model": "openrouter/x-ai/grok-3-beta" - }, - { - "provider_model": "x-ai/grok-3-mini", - "canonical_model": "openrouter/x-ai/grok-3-mini" - }, - { - "provider_model": "x-ai/grok-3-mini-beta", - "canonical_model": "openrouter/x-ai/grok-3-mini-beta" - }, - { - "provider_model": "x-ai/grok-4", - "canonical_model": "openrouter/x-ai/grok-4" - }, - { - "provider_model": "x-ai/grok-4-fast", - "canonical_model": "openrouter/x-ai/grok-4-fast" - }, - { - "provider_model": "x-ai/grok-4.1-fast", - "canonical_model": "openrouter/x-ai/grok-4.1-fast" - }, - { - "provider_model": "x-ai/grok-code-fast-1", - "canonical_model": "openrouter/x-ai/grok-code-fast-1" - }, - { - "provider_model": "xiaomi/mimo-v2-flash", - "canonical_model": "openrouter/xiaomi/mimo-v2-flash" - }, - { - "provider_model": "z-ai/glm-4.5", - "canonical_model": "openrouter/z-ai/glm-4.5" - }, - { - "provider_model": "z-ai/glm-4.5-air", - "canonical_model": "openrouter/z-ai/glm-4.5-air" - }, - { - "provider_model": "z-ai/glm-4.5-air:free", - "canonical_model": "openrouter/z-ai/glm-4.5-air:free" - }, - { - "provider_model": "z-ai/glm-4.5v", - "canonical_model": "openrouter/z-ai/glm-4.5v" - }, - { - "provider_model": "z-ai/glm-4.6", - "canonical_model": "openrouter/z-ai/glm-4.6" - }, - { - "provider_model": "z-ai/glm-4.6:exacto", - "canonical_model": "openrouter/z-ai/glm-4.6:exacto" - }, - { - "provider_model": "z-ai/glm-4.7", - "canonical_model": "openrouter/z-ai/glm-4.7" - }, - { - "provider_model": "z-ai/glm-4.7-flash", - "canonical_model": "openrouter/z-ai/glm-4.7-flash" - } - ], - "tetrate": [ - { - "provider_model": "claude-3-5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku" - }, - { - "provider_model": "claude-3-5-haiku-latest", - "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-7-sonnet-latest", - "canonical_model": "anthropic/claude-3.7-sonnet" - }, - { - "provider_model": "claude-3-haiku-20240307", - "canonical_model": "anthropic/claude-3-haiku" - }, - { - "provider_model": "claude-3-opus-20240229", - "canonical_model": "anthropic/claude-3-opus" - }, - { - "provider_model": "claude-haiku-4-5", - "canonical_model": "anthropic/claude-haiku-4.5" - }, - { - "provider_model": "claude-haiku-4-5-20251001", - "canonical_model": "anthropic/claude-haiku-4.5" + "provider_model": "gpt-5-mini", + "canonical_model": "openai/gpt-5-mini" }, { - "provider_model": "claude-opus-4-0", - "canonical_model": "anthropic/claude-opus-4.0" + "provider_model": "gpt-5-mini-2025-08-07", + "canonical_model": "openai/gpt-5-mini" }, { - "provider_model": "claude-opus-4-1", - "canonical_model": "anthropic/claude-opus-4.1" + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano" }, { - "provider_model": "claude-opus-4-1-20250805", - "canonical_model": "anthropic/claude-opus-4.1" + "provider_model": "gpt-5-nano-2025-08-07", + "canonical_model": "openai/gpt-5-nano" }, { - "provider_model": "claude-opus-4-20250514", - "canonical_model": "anthropic/claude-opus-4" + "provider_model": "gpt-5.1", + "canonical_model": "openai/gpt-5.1" }, { - "provider_model": "claude-opus-4-5", - "canonical_model": "anthropic/claude-opus-4.5" + "provider_model": "gpt-5.1-2025-11-13", + "canonical_model": "openai/gpt-5.1" }, { - "provider_model": "claude-opus-4-5-20251101", - "canonical_model": "anthropic/claude-opus-4.5" + "provider_model": "gpt-5.1-chat-latest", + "canonical_model": "openai/gpt-5.1-chat" }, { - "provider_model": "claude-opus-4-6", - "canonical_model": "anthropic/claude-opus-4.6" + "provider_model": "gpt-5.2", + "canonical_model": "openai/gpt-5.2" }, { - "provider_model": "claude-sonnet-4-0", - "canonical_model": "anthropic/claude-sonnet-4.0" + "provider_model": "gpt-5.2-2025-12-11", + "canonical_model": "openai/gpt-5.2" }, { - "provider_model": "claude-sonnet-4-20250514", - "canonical_model": "anthropic/claude-sonnet-4" + "provider_model": "o1", + "canonical_model": "openai/o1" }, { - "provider_model": "claude-sonnet-4-5", - "canonical_model": "anthropic/claude-sonnet-4.5" + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1" }, { - "provider_model": "claude-sonnet-4-5-20250929", - "canonical_model": "anthropic/claude-sonnet-4.5" + "provider_model": "o3", + "canonical_model": "openai/o3" }, { - "provider_model": "deepinfra/anthropic/claude-3-7-sonnet-latest", - "canonical_model": "anthropic/claude-3.7-sonnet" + "provider_model": "o3-2025-04-16", + "canonical_model": "openai/o3" }, { - "provider_model": "deepinfra/anthropic/claude-4-opus", - "canonical_model": "anthropic/claude-opus-4" + "provider_model": "o3-mini", + "canonical_model": "openai/o3-mini" }, { - "provider_model": "deepinfra/anthropic/claude-4-sonnet", - "canonical_model": "anthropic/claude-sonnet-4" + "provider_model": "o3-mini-2025-01-31", + "canonical_model": "openai/o3-mini" }, { - "provider_model": "deepinfra/google/gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash" + "provider_model": "o4-mini", + "canonical_model": "openai/o4-mini" }, - { - "provider_model": "deepinfra/google/gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro" - }, - { - "provider_model": "gemini-2.0-flash", - "canonical_model": "google/gemini-2.0-flash" - }, - { - "provider_model": "gemini-2.0-flash-lite", - "canonical_model": "google/gemini-2.0-flash-lite" - }, - { - "provider_model": "gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash" - }, - { - "provider_model": "gemini-2.5-flash-lite", - "canonical_model": "google/gemini-2.5-flash-lite" - }, - { - "provider_model": "gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-lite-preview-09" - }, - { - "provider_model": "gemini-2.5-flash-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-preview-09" - }, - { - "provider_model": "gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro" - }, - { - "provider_model": "gemini-3-pro-preview", - "canonical_model": "google/gemini-3-pro-preview" - }, - { - "provider_model": "gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo" - }, - { - "provider_model": "gpt-4-turbo-2024-04-09", - "canonical_model": "openai/gpt-4-turbo" - }, - { - "provider_model": "gpt-4.1", - "canonical_model": "openai/gpt-4.1" - }, - { - "provider_model": "gpt-4.1-2025-04-14", - "canonical_model": "openai/gpt-4.1" - }, - { - "provider_model": "gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini" - }, - { - "provider_model": "gpt-4.1-mini-2025-04-14", - "canonical_model": "openai/gpt-4.1-mini" - }, - { - "provider_model": "gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano" - }, - { - "provider_model": "gpt-4.1-nano-2025-04-14", - "canonical_model": "openai/gpt-4.1-nano" - }, - { - "provider_model": "gpt-4o", - "canonical_model": "openai/gpt-4o" - }, - { - "provider_model": "gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o" - }, - { - "provider_model": "gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o" - }, - { - "provider_model": "gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o" - }, - { - "provider_model": "gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini" - }, - { - "provider_model": "gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini" - }, - { - "provider_model": "gpt-5", - "canonical_model": "openai/gpt-5" - }, - { - "provider_model": "gpt-5-2025-08-07", - "canonical_model": "openai/gpt-5" - }, - { - "provider_model": "gpt-5-chat-latest", - "canonical_model": "openai/gpt-5-chat" - }, - { - "provider_model": "gpt-5-mini", - "canonical_model": "openai/gpt-5-mini" - }, - { - "provider_model": "gpt-5-mini-2025-08-07", - "canonical_model": "openai/gpt-5-mini" - }, - { - "provider_model": "gpt-5-nano", - "canonical_model": "openai/gpt-5-nano" - }, - { - "provider_model": "gpt-5-nano-2025-08-07", - "canonical_model": "openai/gpt-5-nano" - }, - { - "provider_model": "gpt-5.1", - "canonical_model": "openai/gpt-5.1" - }, - { - "provider_model": "gpt-5.1-2025-11-13", - "canonical_model": "openai/gpt-5.1" - }, - { - "provider_model": "gpt-5.1-chat-latest", - "canonical_model": "openai/gpt-5.1-chat" - }, - { - "provider_model": "gpt-5.2", - "canonical_model": "openai/gpt-5.2" - }, - { - "provider_model": "gpt-5.2-2025-12-11", - "canonical_model": "openai/gpt-5.2" - }, - { - "provider_model": "o1", - "canonical_model": "openai/o1" - }, - { - "provider_model": "o1-2024-12-17", - "canonical_model": "openai/o1" - }, - { - "provider_model": "o3", - "canonical_model": "openai/o3" - }, - { - "provider_model": "o3-2025-04-16", - "canonical_model": "openai/o3" - }, - { - "provider_model": "o3-mini", - "canonical_model": "openai/o3-mini" - }, - { - "provider_model": "o3-mini-2025-01-31", - "canonical_model": "openai/o3-mini" - }, - { - "provider_model": "o4-mini", - "canonical_model": "openai/o4-mini" - }, - { - "provider_model": "o4-mini-2025-04-16", - "canonical_model": "openai/o4-mini" - }, - { - "provider_model": "xai/grok-2-vision", - "canonical_model": "x-ai/grok-2-vision" - }, - { - "provider_model": "xai/grok-2-vision-1212", - "canonical_model": "x-ai/grok-2-vision" - }, - { - "provider_model": "xai/grok-2-vision-latest", - "canonical_model": "x-ai/grok-2-vision" - }, - { - "provider_model": "xai/grok-3", - "canonical_model": "x-ai/grok-3" - }, - { - "provider_model": "xai/grok-3-fast", - "canonical_model": "x-ai/grok-3-fast" - }, - { - "provider_model": "xai/grok-3-fast-latest", - "canonical_model": "x-ai/grok-3-fast" - }, - { - "provider_model": "xai/grok-3-latest", - "canonical_model": "x-ai/grok-3" - }, - { - "provider_model": "xai/grok-3-mini", - "canonical_model": "x-ai/grok-3-mini" - }, - { - "provider_model": "xai/grok-3-mini-fast", - "canonical_model": "x-ai/grok-3-mini-fast" - }, - { - "provider_model": "xai/grok-3-mini-fast-latest", - "canonical_model": "x-ai/grok-3-mini-fast" - }, - { - "provider_model": "xai/grok-3-mini-latest", - "canonical_model": "x-ai/grok-3-mini" - }, - { - "provider_model": "xai/grok-4", - "canonical_model": "x-ai/grok-4" - }, - { - "provider_model": "xai/grok-4-0709", - "canonical_model": "x-ai/grok-4" - }, - { - "provider_model": "xai/grok-4-fast", - "canonical_model": "x-ai/grok-4-fast" - }, - { - "provider_model": "xai/grok-4-fast-non-reasoning", - "canonical_model": "x-ai/grok-4-fast-non" - }, - { - "provider_model": "xai/grok-4-fast-non-reasoning-latest", - "canonical_model": "x-ai/grok-4-fast-non" - }, - { - "provider_model": "xai/grok-4-fast-reasoning", - "canonical_model": "x-ai/grok-4-fast" - }, - { - "provider_model": "xai/grok-4-fast-reasoning-latest", - "canonical_model": "x-ai/grok-4-fast" - }, - { - "provider_model": "xai/grok-4-latest", - "canonical_model": "x-ai/grok-4" - }, - { - "provider_model": "xai/grok-code-fast-1", - "canonical_model": "x-ai/grok-code-fast-1" - }, - { - "provider_model": "xai/grok-code-fast-1-0825", - "canonical_model": "x-ai/grok-code-fast-1" - } - ], - "venice": [], - "xai": [ - { - "provider_model": "grok-2-vision-1212", - "canonical_model": "x-ai/grok-2-vision" - }, - { - "provider_model": "grok-3", - "canonical_model": "x-ai/grok-3" - }, - { - "provider_model": "grok-3-mini", - "canonical_model": "x-ai/grok-3-mini" - }, - { - "provider_model": "grok-4-0709", - "canonical_model": "x-ai/grok-4" - }, - { - "provider_model": "grok-4-1-fast-non-reasoning", - "canonical_model": "x-ai/grok-4.1-fast-non" - }, - { - "provider_model": "grok-4-1-fast-reasoning", - "canonical_model": "x-ai/grok-4.1-fast" - }, - { - "provider_model": "grok-4-fast-non-reasoning", - "canonical_model": "x-ai/grok-4-fast-non" - }, - { - "provider_model": "grok-4-fast-reasoning", - "canonical_model": "x-ai/grok-4-fast" - }, - { - "provider_model": "grok-code-fast-1", - "canonical_model": "x-ai/grok-code-fast-1" - } - ] - }, - "mapped_models": [ - { - "provider": "anthropic", - "model": "claude-3-5-haiku-20241022", - "canonical": "anthropic/claude-3.5-haiku", - "recommended": true - }, - { - "provider": "anthropic", - "model": "claude-3-7-sonnet-20250219", - "canonical": "anthropic/claude-3.7-sonnet", - "recommended": true - }, - { - "provider": "anthropic", - "model": "claude-3-haiku-20240307", - "canonical": "anthropic/claude-3-haiku", - "recommended": true - }, - { - "provider": "anthropic", - "model": "claude-haiku-4-5-20251001", - "canonical": "anthropic/claude-haiku-4.5", - "recommended": true - }, - { - "provider": "anthropic", - "model": "claude-opus-4-1-20250805", - "canonical": "anthropic/claude-opus-4.1", - "recommended": true - }, - { - "provider": "anthropic", - "model": "claude-opus-4-20250514", - "canonical": "anthropic/claude-opus-4", - "recommended": true - }, - { - "provider": "anthropic", - "model": "claude-opus-4-5-20251101", - "canonical": "anthropic/claude-opus-4.5", - "recommended": true - }, - { - "provider": "anthropic", - "model": "claude-opus-4-6", - "canonical": "anthropic/claude-opus-4.6", - "recommended": true - }, - { - "provider": "anthropic", - "model": "claude-sonnet-4-20250514", - "canonical": "anthropic/claude-sonnet-4", - "recommended": true - }, - { - "provider": "anthropic", - "model": "claude-sonnet-4-5-20250929", - "canonical": "anthropic/claude-sonnet-4.5", - "recommended": true - }, - { - "provider": "databricks", - "model": "claude-3-5-haiku", - "canonical": "anthropic/claude-3.5-haiku", - "recommended": true - }, - { - "provider": "databricks", - "model": "claude-3-5-sonnet", - "canonical": "anthropic/claude-3.5-sonnet", - "recommended": true - }, - { - "provider": "databricks", - "model": "claude-3-7-sonnet", - "canonical": "anthropic/claude-3.7-sonnet", - "recommended": true - }, - { - "provider": "databricks", - "model": "claude-4-opus", - "canonical": "anthropic/claude-opus-4", - "recommended": true - }, - { - "provider": "databricks", - "model": "code-review-gpt-5", - "canonical": "openai/gpt-5", - "recommended": true - }, - { - "provider": "databricks", - "model": "code-review-gpt-5-mini", - "canonical": "openai/gpt-5-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-claude-3-7-sonnet", - "canonical": "anthropic/claude-3.7-sonnet", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-claude-haiku-4-5", - "canonical": "anthropic/claude-haiku-4.5", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-claude-opus-4-1", - "canonical": "anthropic/claude-opus-4.1", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-claude-opus-4-5", - "canonical": "anthropic/claude-opus-4.5", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-claude-opus-4-6", - "canonical": "anthropic/claude-opus-4.6", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-claude-sonnet-4", - "canonical": "anthropic/claude-sonnet-4", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-claude-sonnet-4-5", - "canonical": "anthropic/claude-sonnet-4.5", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-gemini-2-5-flash", - "canonical": "google/gemini-2.5-flash", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-gemini-2-5-pro", - "canonical": "google/gemini-2.5-pro", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-gpt-5", - "canonical": "openai/gpt-5", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-gpt-5-1", - "canonical": "openai/gpt-5.1", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-gpt-5-1-codex-max", - "canonical": "openai/gpt-5.1-codex-max", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-gpt-5-1-codex-mini", - "canonical": "openai/gpt-5.1-codex-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-gpt-5-2", - "canonical": "openai/gpt-5.2", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-gpt-5-2-codex", - "canonical": "openai/gpt-5.2-codex", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-gpt-5-mini", - "canonical": "openai/gpt-5-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-gpt-5-nano", - "canonical": "openai/gpt-5-nano", - "recommended": true - }, - { - "provider": "databricks", - "model": "databricks-meta-llama-3-3-70b-instruct", - "canonical": "meta-llama/llama-3.3-70b-instruct", - "recommended": true - }, - { - "provider": "databricks", - "model": "gemini-1-5-flash", - "canonical": "google/gemini-1.5-flash", - "recommended": true - }, - { - "provider": "databricks", - "model": "gemini-1-5-pro", - "canonical": "google/gemini-1.5-pro", - "recommended": true - }, - { - "provider": "databricks", - "model": "gemini-2-0-flash", - "canonical": "google/gemini-2.0-flash", - "recommended": true - }, - { - "provider": "databricks", - "model": "gemini-2-5-flash", - "canonical": "google/gemini-2.5-flash", - "recommended": true - }, - { - "provider": "databricks", - "model": "gemini-2-5-flash-latest", - "canonical": "google/gemini-2.5-flash", - "recommended": true - }, - { - "provider": "databricks", - "model": "gemini-2-5-pro", - "canonical": "google/gemini-2.5-pro", - "recommended": true - }, - { - "provider": "databricks", - "model": "gemini-flash-lite-latest", - "canonical": "google/gemini-flash-lite", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-claude-3-5-sonnet", - "canonical": "anthropic/claude-3.5-sonnet", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-claude-3-7-sonnet", - "canonical": "anthropic/claude-3.7-sonnet", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-claude-4-5-haiku", - "canonical": "anthropic/claude-haiku-4.5", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-claude-4-5-opus", - "canonical": "anthropic/claude-opus-4.5", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-claude-4-5-sonnet", - "canonical": "anthropic/claude-sonnet-4.5", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-claude-4-6-opus", - "canonical": "anthropic/claude-opus-4.6", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-claude-4-opus", - "canonical": "anthropic/claude-opus-4", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-claude-4-sonnet", - "canonical": "anthropic/claude-sonnet-4", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-claude-4-sonnet-bedrock", - "canonical": "anthropic/claude-sonnet-4", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-gemini-2-5-pro", - "canonical": "google/gemini-2.5-pro", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-gpt-4-1", - "canonical": "openai/gpt-4.1", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-gpt-4o", - "canonical": "openai/gpt-4o", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-gpt-5", - "canonical": "openai/gpt-5", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-gpt-5-2", - "canonical": "openai/gpt-5.2", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-o1", - "canonical": "openai/o1", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-o3", - "canonical": "openai/o3", - "recommended": true - }, - { - "provider": "databricks", - "model": "goose-o4-mini", - "canonical": "openai/o4-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-3-5-turbo", - "canonical": "openai/gpt-3.5-turbo", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-3-5-turbo-0125", - "canonical": "openai/gpt-3.5-turbo", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4", - "canonical": "openai/gpt-4", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4-1-2025-04-14", - "canonical": "openai/gpt-4.1", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4-1-mini", - "canonical": "openai/gpt-4.1-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4-1-nano", - "canonical": "openai/gpt-4.1-nano", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4-turbo", - "canonical": "openai/gpt-4-turbo", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4-turbo-2024-04-09", - "canonical": "openai/gpt-4-turbo", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4o", - "canonical": "openai/gpt-4o", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4o-2024-05-13", - "canonical": "openai/gpt-4o", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4o-2024-11-20", - "canonical": "openai/gpt-4o", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4o-mini", - "canonical": "openai/gpt-4o-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-4o-mini-2024-07-18", - "canonical": "openai/gpt-4o-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-5", - "canonical": "openai/gpt-5", - "recommended": true - }, - { - "provider": "databricks", - "model": "gpt-5-nano", - "canonical": "openai/gpt-5-nano", - "recommended": true - }, - { - "provider": "databricks", - "model": "headless-goose-claude-4-sonnet", - "canonical": "anthropic/claude-sonnet-4", - "recommended": true - }, - { - "provider": "databricks", - "model": "headless-goose-o3-mini", - "canonical": "openai/o3-mini", - "recommended": true - }, + { + "provider_model": "o4-mini-2025-04-16", + "canonical_model": "openai/o4-mini" + }, + { + "provider_model": "xai/grok-2-vision", + "canonical_model": "x-ai/grok-2-vision" + }, + { + "provider_model": "xai/grok-2-vision-1212", + "canonical_model": "x-ai/grok-2-vision" + }, + { + "provider_model": "xai/grok-2-vision-latest", + "canonical_model": "x-ai/grok-2-vision" + }, + { + "provider_model": "xai/grok-3", + "canonical_model": "x-ai/grok-3" + }, + { + "provider_model": "xai/grok-3-fast", + "canonical_model": "x-ai/grok-3-fast" + }, + { + "provider_model": "xai/grok-3-fast-latest", + "canonical_model": "x-ai/grok-3-fast" + }, + { + "provider_model": "xai/grok-3-latest", + "canonical_model": "x-ai/grok-3" + }, + { + "provider_model": "xai/grok-3-mini", + "canonical_model": "x-ai/grok-3-mini" + }, + { + "provider_model": "xai/grok-3-mini-fast", + "canonical_model": "x-ai/grok-3-mini-fast" + }, + { + "provider_model": "xai/grok-3-mini-fast-latest", + "canonical_model": "x-ai/grok-3-mini-fast" + }, + { + "provider_model": "xai/grok-3-mini-latest", + "canonical_model": "x-ai/grok-3-mini" + }, + { + "provider_model": "xai/grok-4", + "canonical_model": "x-ai/grok-4" + }, + { + "provider_model": "xai/grok-4-0709", + "canonical_model": "x-ai/grok-4" + }, + { + "provider_model": "xai/grok-4-fast", + "canonical_model": "x-ai/grok-4-fast" + }, + { + "provider_model": "xai/grok-4-fast-non-reasoning", + "canonical_model": "x-ai/grok-4-fast-non" + }, + { + "provider_model": "xai/grok-4-fast-non-reasoning-latest", + "canonical_model": "x-ai/grok-4-fast-non" + }, + { + "provider_model": "xai/grok-4-fast-reasoning", + "canonical_model": "x-ai/grok-4-fast" + }, + { + "provider_model": "xai/grok-4-fast-reasoning-latest", + "canonical_model": "x-ai/grok-4-fast" + }, + { + "provider_model": "xai/grok-4-latest", + "canonical_model": "x-ai/grok-4" + }, + { + "provider_model": "xai/grok-code-fast-1", + "canonical_model": "x-ai/grok-code-fast-1" + }, + { + "provider_model": "xai/grok-code-fast-1-0825", + "canonical_model": "x-ai/grok-code-fast-1" + } + ], + "venice": [], + "xai": [ + { + "provider_model": "grok-2-vision-1212", + "canonical_model": "x-ai/grok-2-vision" + }, + { + "provider_model": "grok-3", + "canonical_model": "x-ai/grok-3" + }, + { + "provider_model": "grok-3-mini", + "canonical_model": "x-ai/grok-3-mini" + }, + { + "provider_model": "grok-4-0709", + "canonical_model": "x-ai/grok-4" + }, + { + "provider_model": "grok-4-1-fast-non-reasoning", + "canonical_model": "x-ai/grok-4.1-fast-non" + }, + { + "provider_model": "grok-4-1-fast-reasoning", + "canonical_model": "x-ai/grok-4.1-fast" + }, + { + "provider_model": "grok-4-fast-non-reasoning", + "canonical_model": "x-ai/grok-4-fast-non" + }, + { + "provider_model": "grok-4-fast-reasoning", + "canonical_model": "x-ai/grok-4-fast" + }, + { + "provider_model": "grok-code-fast-1", + "canonical_model": "x-ai/grok-code-fast-1" + } + ] + }, + "mapped_models": [ { - "provider": "databricks", - "model": "kgoose-cashapp-claude-4-sonnet", - "canonical": "anthropic/claude-sonnet-4", + "provider": "anthropic", + "model": "claude-3-5-haiku-20241022", + "canonical": "anthropic/claude-3.5-haiku", "recommended": true }, { - "provider": "databricks", - "model": "kgoose-cashapp-claude-sonnet-4-5", - "canonical": "anthropic/claude-sonnet-4.5", + "provider": "anthropic", + "model": "claude-3-7-sonnet-20250219", + "canonical": "anthropic/claude-3.7-sonnet", "recommended": true }, { - "provider": "databricks", - "model": "kgoose-claude-4-sonnet", - "canonical": "anthropic/claude-sonnet-4", + "provider": "anthropic", + "model": "claude-3-haiku-20240307", + "canonical": "anthropic/claude-3-haiku", "recommended": true }, { - "provider": "databricks", - "model": "kgoose-claude-haiku-4-5", + "provider": "anthropic", + "model": "claude-haiku-4-5-20251001", "canonical": "anthropic/claude-haiku-4.5", "recommended": true }, { - "provider": "databricks", - "model": "kgoose-claude-sonnet-4-5", - "canonical": "anthropic/claude-sonnet-4.5", - "recommended": true - }, - { - "provider": "databricks", - "model": "kgoose-gemini-2-5-flash", - "canonical": "google/gemini-2.5-flash", - "recommended": true - }, - { - "provider": "databricks", - "model": "kgoose-gpt-4-1", - "canonical": "openai/gpt-4.1", - "recommended": true - }, - { - "provider": "databricks", - "model": "kgoose-gpt-4-1-mini", - "canonical": "openai/gpt-4.1-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "kgoose-gpt-4-1-nano", - "canonical": "openai/gpt-4.1-nano", - "recommended": true - }, - { - "provider": "databricks", - "model": "kgoose-gpt-4o", - "canonical": "openai/gpt-4o", - "recommended": true - }, - { - "provider": "databricks", - "model": "kgoose-gpt-5", - "canonical": "openai/gpt-5", - "recommended": true - }, - { - "provider": "databricks", - "model": "kgoose-gpt-5-mini", - "canonical": "openai/gpt-5-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "kgoose-gpt-5-nano", - "canonical": "openai/gpt-5-nano", - "recommended": true - }, - { - "provider": "databricks", - "model": "kgoose-o3", - "canonical": "openai/o3", - "recommended": true - }, - { - "provider": "databricks", - "model": "kgoose-o4-mini", - "canonical": "openai/o4-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "ng-tools-claude-haiku-3-5", - "canonical": "anthropic/claude-3.5-haiku", + "provider": "anthropic", + "model": "claude-opus-4-1-20250805", + "canonical": "anthropic/claude-opus-4.1", "recommended": true }, { - "provider": "databricks", - "model": "ng-tools-claude-opus-4", + "provider": "anthropic", + "model": "claude-opus-4-20250514", "canonical": "anthropic/claude-opus-4", "recommended": true }, { - "provider": "databricks", - "model": "ng-tools-claude-opus-4-1", - "canonical": "anthropic/claude-opus-4.1", + "provider": "anthropic", + "model": "claude-opus-4-5-20251101", + "canonical": "anthropic/claude-opus-4.5", "recommended": true }, { - "provider": "databricks", - "model": "ng-tools-claude-sonnet-3-7", - "canonical": "anthropic/claude-3.7-sonnet", + "provider": "anthropic", + "model": "claude-opus-4-6", + "canonical": "anthropic/claude-opus-4.6", "recommended": true }, { - "provider": "databricks", - "model": "ng-tools-claude-sonnet-4", + "provider": "anthropic", + "model": "claude-sonnet-4-20250514", "canonical": "anthropic/claude-sonnet-4", "recommended": true }, { - "provider": "databricks", - "model": "ng-tools-gpt-5-nano", - "canonical": "openai/gpt-5-nano", - "recommended": true - }, - { - "provider": "databricks", - "model": "ng-tools-int-claude-sonnet-4-5", - "canonical": "anthropic/claude-sonnet-4.5", - "recommended": true - }, - { - "provider": "databricks", - "model": "o1", - "canonical": "openai/o1", - "recommended": true - }, - { - "provider": "databricks", - "model": "o1-2024-12-17", - "canonical": "openai/o1", - "recommended": true - }, - { - "provider": "databricks", - "model": "o1-mini", - "canonical": "openai/o1-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "o1-preview", - "canonical": "openai/o1-preview", - "recommended": true - }, - { - "provider": "databricks", - "model": "o3", - "canonical": "openai/o3", - "recommended": true - }, - { - "provider": "databricks", - "model": "o3-mini", - "canonical": "openai/o3-mini", - "recommended": true - }, - { - "provider": "databricks", - "model": "raml-claude-opus-4-5", - "canonical": "anthropic/claude-opus-4.5", - "recommended": true - }, - { - "provider": "databricks", - "model": "raml-claude-sonnet-4-5", + "provider": "anthropic", + "model": "claude-sonnet-4-5-20250929", "canonical": "anthropic/claude-sonnet-4.5", "recommended": true }, @@ -6359,6 +5140,12 @@ "canonical": "openrouter/minimax/minimax-m2.1", "recommended": true }, + { + "provider": "openrouter", + "model": "minimax/minimax-m2.5", + "canonical": "openrouter/minimax/minimax-m2.5", + "recommended": true + }, { "provider": "openrouter", "model": "mistralai/codestral-2508", @@ -6703,8 +5490,14 @@ }, { "provider": "openrouter", - "model": "tngtech/tng-r1t-chimera:free", - "canonical": "openrouter/tngtech/tng-r1t-chimera:free", + "model": "stepfun/step-3.5-flash", + "canonical": "openrouter/stepfun/step-3.5-flash", + "recommended": true + }, + { + "provider": "openrouter", + "model": "stepfun/step-3.5-flash:free", + "canonical": "openrouter/stepfun/step-3.5-flash:free", "recommended": true }, { @@ -6809,6 +5602,12 @@ "canonical": "openrouter/z-ai/glm-4.7-flash", "recommended": true }, + { + "provider": "openrouter", + "model": "z-ai/glm-5", + "canonical": "openrouter/z-ai/glm-5", + "recommended": true + }, { "provider": "tetrate", "model": "claude-3-5-haiku-20241022", @@ -7390,11 +6189,11 @@ "anthropic": 12, "aws_bedrock": 0, "azure_openai": 0, - "databricks": 163, + "databricks": 0, "gcp_vertex_ai": 0, "google": 45, "openai": 652, - "openrouter": 230, + "openrouter": 231, "tetrate": 151, "venice": 0, "xai": 13 @@ -7403,7 +6202,6 @@ "anthropic/claude-3-haiku", "anthropic/claude-3-opus", "anthropic/claude-3.5-haiku", - "anthropic/claude-3.5-sonnet", "anthropic/claude-3.7-sonnet", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", @@ -7414,8 +6212,6 @@ "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.0", "anthropic/claude-sonnet-4.5", - "google/gemini-1.5-flash", - "google/gemini-1.5-pro", "google/gemini-2.0-flash", "google/gemini-2.0-flash-lite", "google/gemini-2.5-flash", @@ -7431,7 +6227,6 @@ "google/gemini-embedding-001", "google/gemini-flash", "google/gemini-flash-lite", - "meta-llama/llama-3.3-70b-instruct", "openai/gpt-3.5-turbo", "openai/gpt-4", "openai/gpt-4-turbo", @@ -7456,8 +6251,6 @@ "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/o1", - "openai/o1-mini", - "openai/o1-preview", "openai/o1-pro", "openai/o3", "openai/o3-deep-research", @@ -7499,6 +6292,7 @@ "openrouter/minimax/minimax-m1", "openrouter/minimax/minimax-m2", "openrouter/minimax/minimax-m2.1", + "openrouter/minimax/minimax-m2.5", "openrouter/mistralai/codestral", "openrouter/mistralai/devstral", "openrouter/mistralai/devstral-medium", @@ -7554,7 +6348,8 @@ "openrouter/qwen/qwen3-next-80b-a3b-instruct", "openrouter/qwen/qwen3-next-80b-a3b-instruct:free", "openrouter/qwen/qwen3-next-80b-a3b-thinking", - "openrouter/tngtech/tng-r1t-chimera:free", + "openrouter/stepfun/step-3.5-flash", + "openrouter/stepfun/step-3.5-flash:free", "openrouter/x-ai/grok-3", "openrouter/x-ai/grok-3-beta", "openrouter/x-ai/grok-3-mini", @@ -7572,6 +6367,7 @@ "openrouter/z-ai/glm-4.6:exacto", "openrouter/z-ai/glm-4.7", "openrouter/z-ai/glm-4.7-flash", + "openrouter/z-ai/glm-5", "x-ai/grok-2-vision", "x-ai/grok-3", "x-ai/grok-3-fast", diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index 0d2320e51728..6751c25b382e 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -985,6 +985,35 @@ "output": 81920 } }, + { + "id": "amazon-bedrock/deepseek.v3.2-v1:0", + "name": "DeepSeek-V3.2", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "open_weights": true, + "cost": { + "input": 0.62, + "output": 1.85 + }, + "limit": { + "context": 163840, + "output": 81920 + } + }, { "id": "amazon-bedrock/eu.anthropic.claude-haiku-4.5-20251001-v1:0", "name": "Claude Haiku 4.5 (EU)", @@ -6090,6 +6119,35 @@ "output": 4000 } }, + { + "id": "cohere/command-r7b-arabic-02", + "name": "Command R7B Arabic", + "family": "command-r", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06-01", + "release_date": "2025-02-27", + "last_updated": "2025-02-27", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "open_weights": true, + "cost": { + "input": 0.0375, + "output": 0.15 + }, + "limit": { + "context": 128000, + "output": 4000 + } + }, { "id": "deepseek/deepseek-chat", "name": "DeepSeek Chat", @@ -6810,6 +6868,35 @@ "output": 131072 } }, + { + "id": "google-vertex/zai-org/glm-5-maas", + "name": "GLM-5", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2026-02-11", + "last_updated": "2026-02-11", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "open_weights": true, + "cost": { + "input": 1.0, + "output": 3.2, + "cache_read": 0.1 + }, + "limit": { + "context": 204800, + "output": 131072 + } + }, { "id": "google/gemini-1.5-flash", "name": "Gemini 1.5 Flash", @@ -13276,6 +13363,33 @@ "output": 100000 } }, + { + "id": "openrouter/openrouter/aurora-alpha", + "name": "Aurora Alpha", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2026-02-09", + "last_updated": "2026-02-09", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "open_weights": false, + "cost": { + "input": 0.0, + "output": 0.0 + }, + "limit": { + "context": 128000, + "output": 50000 + } + }, { "id": "openrouter/openrouter/sherlock-dash-alpha", "name": "Sherlock Dash Alpha", @@ -14065,6 +14179,68 @@ "output": 262144 } }, + { + "id": "openrouter/qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B", + "family": "qwen", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "open_weights": true, + "cost": { + "input": 0.6, + "output": 3.6 + }, + "limit": { + "context": 262144, + "output": 65536 + } + }, + { + "id": "openrouter/qwen/qwen3.5-plus-02-15", + "name": "Qwen3.5 Plus 2026-02-15", + "family": "qwen", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "open_weights": false, + "cost": { + "input": 0.4, + "output": 2.4 + }, + "limit": { + "context": 1000000, + "output": 65536 + } + }, { "id": "openrouter/qwen/qwq-32b:free", "name": "QwQ 32B (free)", diff --git a/crates/goose/src/recipe/build_recipe/mod.rs b/crates/goose/src/recipe/build_recipe/mod.rs index 7c7e91518bcc..ddd7be58de49 100644 --- a/crates/goose/src/recipe/build_recipe/mod.rs +++ b/crates/goose/src/recipe/build_recipe/mod.rs @@ -153,7 +153,7 @@ where Ok((param_map, missing_params)) } -fn resolve_sub_recipe_path( +pub fn resolve_sub_recipe_path( sub_recipe_path: &str, parent_recipe_dir: &Path, ) -> Result { diff --git a/crates/goose/tests/providers.rs b/crates/goose/tests/providers.rs index 68e81de4bccc..6efb78d083aa 100644 --- a/crates/goose/tests/providers.rs +++ b/crates/goose/tests/providers.rs @@ -119,7 +119,10 @@ impl ProviderTester { .await .expect("get_prefixed_tools failed"); - let info = self.extension_manager.get_extensions_info().await; + let info = self + .extension_manager + .get_extensions_info(std::path::Path::new(".")) + .await; let system = PromptManager::new() .builder() .with_extensions(info.into_iter()) diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index 7ec30838f87f..d6c5b7e4da75 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -10,7 +10,7 @@ "license": { "name": "Apache-2.0" }, - "version": "1.24.0" + "version": "1.25.0" }, "paths": { "/action-required/tool-confirmation": { diff --git a/ui/desktop/package-lock.json b/ui/desktop/package-lock.json index 50127d4567ac..3394f8a20c7e 100644 --- a/ui/desktop/package-lock.json +++ b/ui/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "goose-app", - "version": "1.24.0", + "version": "1.25.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "goose-app", - "version": "1.24.0", + "version": "1.25.0", "license": "Apache-2.0", "dependencies": { "@mcp-ui/client": "^6.1.0", diff --git a/ui/desktop/package.json b/ui/desktop/package.json index 78b2f52914bf..4c4e10f77190 100644 --- a/ui/desktop/package.json +++ b/ui/desktop/package.json @@ -1,7 +1,7 @@ { "name": "goose-app", "productName": "Goose", - "version": "1.24.0", + "version": "1.25.0", "description": "Goose App", "engines": { "node": "^24.10.0", diff --git a/ui/desktop/src/components/bottom_menu/BottomMenuExtensionSelection.tsx b/ui/desktop/src/components/bottom_menu/BottomMenuExtensionSelection.tsx index 468121086f61..221baab1a9ac 100644 --- a/ui/desktop/src/components/bottom_menu/BottomMenuExtensionSelection.tsx +++ b/ui/desktop/src/components/bottom_menu/BottomMenuExtensionSelection.tsx @@ -33,6 +33,11 @@ export const BottomMenuExtensionSelection = ({ sessionId }: BottomMenuExtensionS const { extensionsList: allExtensions } = useConfig(); const isHubView = !sessionId; + useEffect(() => { + setIsSessionExtensionsLoaded(false); + setSessionExtensions([]); + }, [sessionId]); + useEffect(() => { const handleExtensionsLoaded = () => { setRefreshTrigger((prev) => prev + 1); @@ -53,8 +58,11 @@ export const BottomMenuExtensionSelection = ({ sessionId }: BottomMenuExtensionS }; }, []); - // Fetch session-specific extensions or use global defaults useEffect(() => { + if (refreshTrigger === 0 && !isOpen) { + return; + } + const fetchExtensions = async () => { if (!sessionId) { return; @@ -75,7 +83,6 @@ export const BottomMenuExtensionSelection = ({ sessionId }: BottomMenuExtensionS } }; - setIsSessionExtensionsLoaded(false); fetchExtensions(); }, [sessionId, isOpen, refreshTrigger]); diff --git a/ui/desktop/src/hooks/useChatStream.ts b/ui/desktop/src/hooks/useChatStream.ts index aa0d1497b68a..ef78641c7736 100644 --- a/ui/desktop/src/hooks/useChatStream.ts +++ b/ui/desktop/src/hooks/useChatStream.ts @@ -433,6 +433,7 @@ export function useChatStream({ }, }, }); + window.dispatchEvent(new CustomEvent(AppEvents.SESSION_EXTENSIONS_LOADED)); onSessionLoaded?.(); return; } diff --git a/ui/desktop/src/platform/windows/bin/install-node.cmd b/ui/desktop/src/platform/windows/bin/install-node.cmd deleted file mode 100644 index 26abe9b09b03..000000000000 --- a/ui/desktop/src/platform/windows/bin/install-node.cmd +++ /dev/null @@ -1,37 +0,0 @@ -@echo off -setlocal enabledelayedexpansion - -REM Check if Node.js is installed in Program Files -if exist "C:\Program Files\nodejs\node.exe" ( - echo Node.js found in Program Files - set "NODE_EXE=C:\Program Files\nodejs\node.exe" - goto :found -) - -REM Check if Node.js is installed in Program Files (x86) -if exist "C:\Program Files (x86)\nodejs\node.exe" ( - echo "Node.js found in Program Files (x86)" - set "NODE_EXE=C:\Program Files (x86)\nodejs\node.exe" - goto :found -) - -echo Node.js not found in standard locations, installing... - -REM Download Node.js MSI installer -powershell -Command "& {[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest -Uri '%1' -OutFile '%TEMP%\node-setup.msi'}" - -REM Install Node.js silently -msiexec /i "%TEMP%\node-setup.msi" /qn - -REM Wait a bit for installation to complete -timeout /t 5 /nobreak - -REM Clean up -del "%TEMP%\node-setup.msi" - -REM Set path to installed Node.js -set "NODE_EXE=C:\Program Files\nodejs\node.exe" - -:found -echo Using Node.js: %NODE_EXE% -exit /b 0 diff --git a/ui/desktop/src/platform/windows/bin/npx.cmd b/ui/desktop/src/platform/windows/bin/npx.cmd index 7c019e5ffe82..c297b146671d 100644 --- a/ui/desktop/src/platform/windows/bin/npx.cmd +++ b/ui/desktop/src/platform/windows/bin/npx.cmd @@ -1,31 +1,45 @@ @ECHO OFF SETLOCAL EnableDelayedExpansion -SET "SCRIPT_DIR=%~dp0" +SET "NODE_VERSION=22.14.0" +SET "GOOSE_NODE_DIR=%LOCALAPPDATA%\Goose\node" -REM Try to find Node.js in standard locations first -if exist "C:\Program Files\nodejs\npx.cmd" ( - "C:\Program Files\nodejs\npx.cmd" %* - exit /b %errorlevel% +REM === Check for previously downloaded portable Node.js (matching version) === +if exist "%GOOSE_NODE_DIR%\node-v%NODE_VERSION%.installed" ( + SET "PATH=%GOOSE_NODE_DIR%;!PATH!" + "%GOOSE_NODE_DIR%\npx.cmd" %* + exit /b !errorlevel! ) -if exist "C:\Program Files (x86)\nodejs\npx.cmd" ( - "C:\Program Files (x86)\nodejs\npx.cmd" %* - exit /b %errorlevel% -) +REM === Download portable Node.js === +echo [Goose] Node.js not found. Downloading portable Node.js v%NODE_VERSION%... 1>&2 + +SET "NODE_ZIP=%TEMP%\goose-node-%NODE_VERSION%.zip" +SET "NODE_EXTRACT=%TEMP%\goose-node-extract" -REM If Node.js not found, run installer -call "%SCRIPT_DIR%install-node.cmd" "https://nodejs.org/dist/v23.10.0/node-v23.10.0-x64.msi" +powershell -NoProfile -Command "$ProgressPreference='SilentlyContinue'; try { [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; Invoke-WebRequest -Uri 'https://nodejs.org/dist/v%NODE_VERSION%/node-v%NODE_VERSION%-win-x64.zip' -OutFile '%NODE_ZIP%' -UseBasicParsing; Expand-Archive -Path '%NODE_ZIP%' -DestinationPath '%NODE_EXTRACT%' -Force; exit 0 } catch { Write-Error $_.Exception.Message; exit 1 }" if errorlevel 1 ( - echo Failed to install Node.js + echo [Goose] ERROR: Failed to download Node.js. Please install manually from https://nodejs.org/ 1>&2 + del "%NODE_ZIP%" >nul 2>&1 exit /b 1 ) -REM Try using the newly installed Node.js -if exist "C:\Program Files\nodejs\npx.cmd" ( - "C:\Program Files\nodejs\npx.cmd" %* - exit /b %errorlevel% +REM Clean previous version and install to Goose directory +rmdir /s /q "%GOOSE_NODE_DIR%" >nul 2>&1 +mkdir "%GOOSE_NODE_DIR%" >nul 2>&1 +xcopy /s /e /q /y "%NODE_EXTRACT%\node-v%NODE_VERSION%-win-x64\*" "%GOOSE_NODE_DIR%\" >nul 2>&1 + +REM Clean up +del "%NODE_ZIP%" >nul 2>&1 +rmdir /s /q "%NODE_EXTRACT%" >nul 2>&1 + +if exist "%GOOSE_NODE_DIR%\npx.cmd" ( + echo.>"%GOOSE_NODE_DIR%\node-v%NODE_VERSION%.installed" + SET "PATH=%GOOSE_NODE_DIR%;!PATH!" + echo [Goose] Node.js v%NODE_VERSION% ready. 1>&2 + "%GOOSE_NODE_DIR%\npx.cmd" %* + exit /b !errorlevel! ) -echo Failed to find npx after Node.js installation +echo [Goose] ERROR: Installation failed. Please install Node.js manually from https://nodejs.org/ 1>&2 exit /b 1 diff --git a/ui/desktop/src/utils/winShims.ts b/ui/desktop/src/utils/winShims.ts index 058591724a16..7b8170dadd21 100644 --- a/ui/desktop/src/utils/winShims.ts +++ b/ui/desktop/src/utils/winShims.ts @@ -21,7 +21,7 @@ export async function ensureWinShims(): Promise { await fs.promises.mkdir(tgtDir, { recursive: true }); // Copy command-line tools, NOT goosed.exe (which should always be used locally) - const shims = ['uvx.exe', 'uv.exe', 'npx.cmd', 'install-node.cmd']; + const shims = ['uvx.exe', 'uv.exe', 'npx.cmd']; await Promise.all( shims.map(async (shim) => {