fix: Pass Google AI API key in HTTP header, not query param (#3192)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user