From 6e57d245d2f92779be33b5c3c094920ce74bc886 Mon Sep 17 00:00:00 2001 From: Alex Hancock Date: Mon, 11 May 2026 20:41:16 -0400 Subject: [PATCH] feat(providers): add vercel ai gateway (#9144) --- .../goose/src/config/declarative_providers.rs | 17 ++ .../declarative/vercel_ai_gateway.json | 165 ++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 crates/goose/src/providers/declarative/vercel_ai_gateway.json diff --git a/crates/goose/src/config/declarative_providers.rs b/crates/goose/src/config/declarative_providers.rs index 35314401bd..5eac6104f8 100644 --- a/crates/goose/src/config/declarative_providers.rs +++ b/crates/goose/src/config/declarative_providers.rs @@ -688,6 +688,23 @@ mod tests { assert_eq!(config.models[0].context_limit, 131072); } + #[test] + fn test_vercel_ai_gateway_json_deserializes() { + let json = include_str!("../providers/declarative/vercel_ai_gateway.json"); + let config: DeclarativeProviderConfig = + serde_json::from_str(json).expect("vercel_ai_gateway.json should parse"); + assert_eq!(config.name, "vercel_ai_gateway"); + assert_eq!(config.display_name, "Vercel AI Gateway"); + assert!(matches!(config.engine, ProviderEngine::OpenAI)); + assert_eq!(config.api_key_env, "AI_GATEWAY_API_KEY"); + assert_eq!( + config.base_url, + "https://ai-gateway.vercel.sh/v1/chat/completions" + ); + assert_eq!(config.supports_streaming, Some(true)); + assert!(!config.models.is_empty()); + } + #[test] fn test_validate_provider_id_rejects_legacy_punctuation_for_new_ids() { assert!(validate_provider_id("custom_z.ai").is_err()); diff --git a/crates/goose/src/providers/declarative/vercel_ai_gateway.json b/crates/goose/src/providers/declarative/vercel_ai_gateway.json new file mode 100644 index 0000000000..4e32d05b05 --- /dev/null +++ b/crates/goose/src/providers/declarative/vercel_ai_gateway.json @@ -0,0 +1,165 @@ +{ + "name": "vercel_ai_gateway", + "engine": "openai", + "display_name": "Vercel AI Gateway", + "description": "Unified gateway to OpenAI, Anthropic, Google, xAI, and many more frontier models via Vercel AI Gateway", + "api_key_env": "AI_GATEWAY_API_KEY", + "base_url": "https://ai-gateway.vercel.sh/v1/chat/completions", + "models": [ + { + "name": "anthropic/claude-sonnet-4.6", + "context_limit": 1000000, + "input_token_cost": 0.000003, + "output_token_cost": 0.000015, + "currency": "USD" + }, + { + "name": "anthropic/claude-sonnet-4.5", + "context_limit": 1000000, + "input_token_cost": 0.000003, + "output_token_cost": 0.000015, + "currency": "USD" + }, + { + "name": "anthropic/claude-opus-4.6", + "context_limit": 1000000, + "input_token_cost": 0.000005, + "output_token_cost": 0.000025, + "currency": "USD" + }, + { + "name": "anthropic/claude-opus-4.5", + "context_limit": 200000, + "input_token_cost": 0.000005, + "output_token_cost": 0.000025, + "currency": "USD" + }, + { + "name": "anthropic/claude-haiku-4.5", + "context_limit": 200000, + "input_token_cost": 0.000001, + "output_token_cost": 0.000005, + "currency": "USD" + }, + { + "name": "openai/gpt-5", + "context_limit": 400000, + "input_token_cost": 0.00000125, + "output_token_cost": 0.00001, + "currency": "USD" + }, + { + "name": "openai/gpt-5-codex", + "context_limit": 400000, + "input_token_cost": 0.00000125, + "output_token_cost": 0.00001, + "currency": "USD" + }, + { + "name": "openai/gpt-5-mini", + "context_limit": 400000, + "input_token_cost": 0.00000025, + "output_token_cost": 0.000002, + "currency": "USD" + }, + { + "name": "openai/gpt-5.1-codex", + "context_limit": 400000, + "input_token_cost": 0.00000125, + "output_token_cost": 0.00001, + "currency": "USD" + }, + { + "name": "openai/gpt-4.1", + "context_limit": 1047576, + "input_token_cost": 0.000002, + "output_token_cost": 0.000008, + "currency": "USD" + }, + { + "name": "openai/gpt-4o", + "context_limit": 128000, + "input_token_cost": 0.0000025, + "output_token_cost": 0.00001, + "currency": "USD" + }, + { + "name": "openai/o3", + "context_limit": 200000, + "input_token_cost": 0.000002, + "output_token_cost": 0.000008, + "currency": "USD" + }, + { + "name": "openai/o4-mini", + "context_limit": 200000, + "input_token_cost": 0.0000011, + "output_token_cost": 0.0000044, + "currency": "USD" + }, + { + "name": "google/gemini-3-pro-preview", + "context_limit": 1000000, + "input_token_cost": 0.000002, + "output_token_cost": 0.000012, + "currency": "USD" + }, + { + "name": "google/gemini-2.5-pro", + "context_limit": 1048576, + "input_token_cost": 0.00000125, + "output_token_cost": 0.00001, + "currency": "USD" + }, + { + "name": "google/gemini-2.5-flash", + "context_limit": 1000000, + "input_token_cost": 0.0000003, + "output_token_cost": 0.0000025, + "currency": "USD" + }, + { + "name": "xai/grok-4", + "context_limit": 256000, + "input_token_cost": 0.000003, + "output_token_cost": 0.000015, + "currency": "USD" + }, + { + "name": "xai/grok-4-fast-reasoning", + "context_limit": 2000000, + "input_token_cost": 0.0000002, + "output_token_cost": 0.0000005, + "currency": "USD" + }, + { + "name": "xai/grok-code-fast-1", + "context_limit": 256000, + "input_token_cost": 0.0000002, + "output_token_cost": 0.0000015, + "currency": "USD" + }, + { + "name": "deepseek/deepseek-v3.1", + "context_limit": 163840, + "input_token_cost": 0.00000056, + "output_token_cost": 0.00000168, + "currency": "USD" + }, + { + "name": "moonshotai/kimi-k2-thinking", + "context_limit": 262114, + "input_token_cost": 0.0000006, + "output_token_cost": 0.0000025, + "currency": "USD" + }, + { + "name": "zai/glm-4.6", + "context_limit": 200000, + "input_token_cost": 0.0000006, + "output_token_cost": 0.0000022, + "currency": "USD" + } + ], + "supports_streaming": true +}