use reqwest::{Client, Response};
use serde_json::Value;
use systemprompt_wire::WireProtocol;
use super::constants::timeout;
use super::provider::GeminiProvider;
use crate::error::Result;
pub(super) fn build_client() -> Result<Client> {
Client::builder()
.timeout(systemprompt_models::net::AI_PROVIDER_REQUEST_TIMEOUT)
.connect_timeout(timeout::CONNECT_TIMEOUT)
.build()
.map_err(crate::error::AiError::Http)
}
pub(super) async fn post(
provider: &GeminiProvider,
body: &Value,
model: &str,
stream: bool,
) -> Result<Response> {
let call = provider.target.call().await?;
let upstream = provider.upstream_model(model);
let mut request = provider
.client
.post(call.url(WireProtocol::Gemini, upstream, stream));
for (name, value) in call.headers(WireProtocol::Gemini) {
request = request.header(name, value);
}
let response = request.json(body).send().await?;
if !response.status().is_success() {
return Err(crate::error::AiError::from_error_response("gemini", response).await);
}
Ok(response)
}