fix: Pass Google AI API key in HTTP header, not query param (#3192)

This commit is contained in:
Salvatore Testa
2025-07-02 15:39:21 +02:00
committed by GitHub
parent ea978df888
commit ecbd71920d
+9 -6
View File
@@ -8,6 +8,7 @@ use crate::providers::utils::{
}; };
use anyhow::Result; use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use axum::http::HeaderMap;
use mcp_core::tool::Tool; use mcp_core::tool::Tool;
use reqwest::Client; use reqwest::Client;
use serde_json::Value; use serde_json::Value;
@@ -51,7 +52,6 @@ pub struct GoogleProvider {
#[serde(skip)] #[serde(skip)]
client: Client, client: Client,
host: String, host: String,
api_key: String,
model: ModelConfig, model: ModelConfig,
} }
@@ -70,14 +70,18 @@ impl GoogleProvider {
.get_param("GOOGLE_HOST") .get_param("GOOGLE_HOST")
.unwrap_or_else(|_| GOOGLE_API_HOST.to_string()); .unwrap_or_else(|_| GOOGLE_API_HOST.to_string());
let mut headers = HeaderMap::new();
headers.insert("CONTENT_TYPE", "application/json".parse()?);
headers.insert("x-goog-api-key", api_key.parse()?);
let client = Client::builder() let client = Client::builder()
.timeout(Duration::from_secs(600)) .timeout(Duration::from_secs(600))
.default_headers(headers)
.build()?; .build()?;
Ok(Self { Ok(Self {
client, client,
host, host,
api_key,
model, model,
}) })
} }
@@ -88,8 +92,8 @@ impl GoogleProvider {
let url = base_url let url = base_url
.join(&format!( .join(&format!(
"v1beta/models/{}:generateContent?key={}", "v1beta/models/{}:generateContent",
self.model.model_name, self.api_key self.model.model_name
)) ))
.map_err(|e| { .map_err(|e| {
ProviderError::RequestFailed(format!("Failed to construct endpoint URL: {e}")) ProviderError::RequestFailed(format!("Failed to construct endpoint URL: {e}"))
@@ -103,7 +107,6 @@ impl GoogleProvider {
let response = self let response = self
.client .client
.post(url.clone()) // Clone the URL for each retry .post(url.clone()) // Clone the URL for each retry
.header("CONTENT_TYPE", "application/json")
.json(&payload) .json(&payload)
.send() .send()
.await; .await;
@@ -192,7 +195,7 @@ impl Provider for GoogleProvider {
/// Fetch supported models from Google Generative Language API; returns Err on failure, Ok(None) if not present /// Fetch supported models from Google Generative Language API; returns Err on failure, Ok(None) if not present
async fn fetch_supported_models_async(&self) -> Result<Option<Vec<String>>, ProviderError> { async fn fetch_supported_models_async(&self) -> Result<Option<Vec<String>>, ProviderError> {
// List models via the v1beta/models endpoint // List models via the v1beta/models endpoint
let url = format!("{}/v1beta/models?key={}", self.host, self.api_key); let url = format!("{}/v1beta/models", self.host);
let response = self.client.get(&url).send().await?; let response = self.client.get(&url).send().await?;
let json: serde_json::Value = response.json().await?; let json: serde_json::Value = response.json().await?;
// If 'models' field missing, return None // If 'models' field missing, return None