Add Google Gemini provider support
- Add GeminiProvider with streaming and native tool calling - Support gemini-2.5-pro, gemini-2.0-flash, gemini-1.5-pro/flash models - Model-specific context window detection (1M-2M tokens) - Message conversion: assistant -> model role mapping - System messages extracted to system_instruction field - Tool schema conversion with functionCall/functionResponse parts - SSE streaming with JSON array buffer parsing - 8 unit tests for conversion and parsing logic - Register provider in g3-core and validate in g3-cli
This commit is contained in:
@@ -708,6 +708,18 @@ impl<W: UiWriter> Agent<W> {
|
||||
16384 // Conservative default for other Databricks models
|
||||
}
|
||||
}
|
||||
"gemini" => {
|
||||
// Gemini models - use provider's context_window_size()
|
||||
if let Some(ctx_size) = provider.context_window_size() {
|
||||
debug!(
|
||||
"Using context window size {} from Gemini provider",
|
||||
ctx_size
|
||||
);
|
||||
ctx_size
|
||||
} else {
|
||||
1_000_000 // Default for Gemini models
|
||||
}
|
||||
}
|
||||
_ => config.agent.fallback_default_max_tokens as u32,
|
||||
};
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ pub async fn register_providers(
|
||||
register_openai_providers(config, providers_to_register, &mut registry)?;
|
||||
register_openai_compatible_providers(config, providers_to_register, &mut registry)?;
|
||||
register_anthropic_providers(config, providers_to_register, &mut registry)?;
|
||||
register_gemini_providers(config, providers_to_register, &mut registry)?;
|
||||
register_databricks_providers(config, providers_to_register, &mut registry).await?;
|
||||
|
||||
// Set default provider
|
||||
@@ -162,6 +163,27 @@ fn register_anthropic_providers(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Register Gemini providers from configuration.
|
||||
fn register_gemini_providers(
|
||||
config: &Config,
|
||||
providers_to_register: &[String],
|
||||
registry: &mut ProviderRegistry,
|
||||
) -> Result<()> {
|
||||
for (name, gemini_config) in &config.providers.gemini {
|
||||
if should_register(providers_to_register, "gemini", name) {
|
||||
let gemini_provider = g3_providers::GeminiProvider::new_with_name(
|
||||
format!("gemini.{}", name),
|
||||
gemini_config.api_key.clone(),
|
||||
Some(gemini_config.model.clone()),
|
||||
gemini_config.max_tokens,
|
||||
gemini_config.temperature,
|
||||
)?;
|
||||
registry.register(gemini_provider);
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Register Databricks providers from configuration.
|
||||
///
|
||||
/// This is async because OAuth authentication requires async operations.
|
||||
|
||||
Reference in New Issue
Block a user