From 177169241b041d9230eb2f4bf5ab5449867efa10 Mon Sep 17 00:00:00 2001 From: David Tivris <163727302+tivris@users.noreply.github.com> Date: Thu, 2 Apr 2026 22:08:14 +0300 Subject: [PATCH 1/3] feat(provider): add Google AI Studio provider support Register google_ai_studio as a first-class provider using the OpenAI-compatible endpoint at generativelanguage.googleapis.com, allowing users to authenticate with GEMINI_API_KEY and access Gemini models directly without an OpenRouter intermediary. Closes #703 --- crates/forge_domain/src/provider.rs | 16 ++++ crates/forge_repo/src/provider/provider.json | 80 ++++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/crates/forge_domain/src/provider.rs b/crates/forge_domain/src/provider.rs index 93291e1ea3..d7435299f8 100644 --- a/crates/forge_domain/src/provider.rs +++ b/crates/forge_domain/src/provider.rs @@ -72,6 +72,7 @@ impl ProviderId { pub const OPENCODE_ZEN: ProviderId = ProviderId(Cow::Borrowed("opencode_zen")); pub const FIREWORKS_AI: ProviderId = ProviderId(Cow::Borrowed("fireworks-ai")); pub const NOVITA: ProviderId = ProviderId(Cow::Borrowed("novita")); + pub const GOOGLE_AI_STUDIO: ProviderId = ProviderId(Cow::Borrowed("google_ai_studio")); /// Returns all built-in provider IDs /// @@ -104,6 +105,7 @@ impl ProviderId { ProviderId::OPENCODE_ZEN, ProviderId::FIREWORKS_AI, ProviderId::NOVITA, + ProviderId::GOOGLE_AI_STUDIO, ] } @@ -129,6 +131,7 @@ impl ProviderId { "codex" => "Codex".to_string(), "fireworks-ai" => "FireworksAI".to_string(), "novita" => "Novita".to_string(), + "google_ai_studio" => "GoogleAIStudio".to_string(), _ => { // For other providers, use UpperCamelCase conversion use convert_case::{Case, Casing}; @@ -173,6 +176,7 @@ impl std::str::FromStr for ProviderId { "codex" => ProviderId::CODEX, "fireworks-ai" => ProviderId::FIREWORKS_AI, "novita" => ProviderId::NOVITA, + "google_ai_studio" => ProviderId::GOOGLE_AI_STUDIO, // For custom providers, use Cow::Owned to avoid memory leaks custom => ProviderId(Cow::Owned(custom.to_string())), }; @@ -544,6 +548,10 @@ mod tests { assert_eq!(ProviderId::IO_INTELLIGENCE.to_string(), "IOIntelligence"); assert_eq!(ProviderId::CODEX.to_string(), "Codex"); assert_eq!(ProviderId::FIREWORKS_AI.to_string(), "FireworksAI"); + assert_eq!( + ProviderId::GOOGLE_AI_STUDIO.to_string(), + "GoogleAIStudio" + ); } #[test] @@ -566,6 +574,14 @@ mod tests { assert!(built_in.contains(&ProviderId::CODEX)); assert!(built_in.contains(&ProviderId::OPENAI_RESPONSES_COMPATIBLE)); assert!(built_in.contains(&ProviderId::FIREWORKS_AI)); + assert!(built_in.contains(&ProviderId::GOOGLE_AI_STUDIO)); + } + + #[test] + fn test_google_ai_studio_from_str() { + let actual = ProviderId::from_str("google_ai_studio").unwrap(); + let expected = ProviderId::GOOGLE_AI_STUDIO; + assert_eq!(actual, expected); } #[test] diff --git a/crates/forge_repo/src/provider/provider.json b/crates/forge_repo/src/provider/provider.json index 2805c1f8a5..014995b4a4 100644 --- a/crates/forge_repo/src/provider/provider.json +++ b/crates/forge_repo/src/provider/provider.json @@ -1888,6 +1888,86 @@ ], "auth_methods": ["google_adc"] }, + { + "id": "google_ai_studio", + "api_key_vars": "GEMINI_API_KEY", + "url_param_vars": [], + "response_type": "OpenAI", + "url": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions", + "models": [ + { + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "description": "Most capable Gemini model with advanced reasoning", + "context_length": 1000000, + "tools_supported": true, + "supports_parallel_tool_calls": true, + "supports_reasoning": true, + "input_modalities": ["text", "image"] + }, + { + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "description": "Cost-efficient Gemini model optimized for high-volume, low latency use cases", + "context_length": 1000000, + "tools_supported": true, + "supports_parallel_tool_calls": true, + "supports_reasoning": true, + "input_modalities": ["text", "image"] + }, + { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "description": "Advanced Gemini model with strong reasoning capabilities", + "context_length": 1000000, + "tools_supported": true, + "supports_parallel_tool_calls": true, + "supports_reasoning": true, + "input_modalities": ["text", "image"] + }, + { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "description": "Fast Gemini model with thinking support", + "context_length": 1000000, + "tools_supported": true, + "supports_parallel_tool_calls": true, + "supports_reasoning": true, + "input_modalities": ["text", "image"] + }, + { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "description": "Powerful Gemini model for complex tasks with thinking", + "context_length": 1000000, + "tools_supported": true, + "supports_parallel_tool_calls": true, + "supports_reasoning": true, + "input_modalities": ["text", "image"] + }, + { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "description": "Fast and efficient Gemini model with thinking", + "context_length": 1000000, + "tools_supported": true, + "supports_parallel_tool_calls": true, + "supports_reasoning": true, + "input_modalities": ["text", "image"] + }, + { + "id": "gemini-2.0-flash", + "name": "Gemini 2.0 Flash", + "description": "Fast and versatile Gemini model", + "context_length": 1000000, + "tools_supported": true, + "supports_parallel_tool_calls": true, + "supports_reasoning": false, + "input_modalities": ["text", "image"] + } + ], + "auth_methods": ["api_key"] + }, { "id": "minimax", "api_key_vars": "MINIMAX_API_KEY", From baa6a5cc4fee7c0672ff3d428e43d5cf337f2d80 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 19:10:16 +0000 Subject: [PATCH 2/3] [autofix.ci] apply automated fixes --- crates/forge_domain/src/provider.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/forge_domain/src/provider.rs b/crates/forge_domain/src/provider.rs index d7435299f8..a65b43e416 100644 --- a/crates/forge_domain/src/provider.rs +++ b/crates/forge_domain/src/provider.rs @@ -548,10 +548,7 @@ mod tests { assert_eq!(ProviderId::IO_INTELLIGENCE.to_string(), "IOIntelligence"); assert_eq!(ProviderId::CODEX.to_string(), "Codex"); assert_eq!(ProviderId::FIREWORKS_AI.to_string(), "FireworksAI"); - assert_eq!( - ProviderId::GOOGLE_AI_STUDIO.to_string(), - "GoogleAIStudio" - ); + assert_eq!(ProviderId::GOOGLE_AI_STUDIO.to_string(), "GoogleAIStudio"); } #[test] From addffa51a2fcc0df02309c446b37c3eaae025041 Mon Sep 17 00:00:00 2001 From: Amit Singh Date: Fri, 3 Apr 2026 21:32:05 +0530 Subject: [PATCH 3/3] feat(provider): update google ai studio provider response type and url --- crates/forge_repo/src/provider/provider.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/forge_repo/src/provider/provider.json b/crates/forge_repo/src/provider/provider.json index 014995b4a4..73f59a6d65 100644 --- a/crates/forge_repo/src/provider/provider.json +++ b/crates/forge_repo/src/provider/provider.json @@ -1892,8 +1892,8 @@ "id": "google_ai_studio", "api_key_vars": "GEMINI_API_KEY", "url_param_vars": [], - "response_type": "OpenAI", - "url": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions", + "response_type": "Google", + "url": "https://generativelanguage.googleapis.com/v1beta", "models": [ { "id": "gemini-3.1-pro-preview",