use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum HttpMethod {
Get,
Post,
Put,
Patch,
Delete,
}
pub type JsonObject = BTreeMap<String, Value>;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct GeminiResponseHeaders {
#[serde(flatten, default, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: BTreeMap<String, String>,
}
pub mod status_code_serde {
use http::StatusCode;
use serde::de::Error as _;
use serde::{Deserialize, Deserializer, Serializer};
pub fn serialize<S>(value: &StatusCode, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_u16(value.as_u16())
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<StatusCode, D::Error>
where
D: Deserializer<'de>,
{
let code = u16::deserialize(deserializer)?;
StatusCode::from_u16(code).map_err(D::Error::custom)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GeminiModelInfo {
pub name: String,
#[serde(
rename = "baseModelId",
default,
skip_serializing_if = "Option::is_none"
)]
pub base_model_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(
rename = "displayName",
default,
skip_serializing_if = "Option::is_none"
)]
pub display_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(
rename = "inputTokenLimit",
default,
skip_serializing_if = "Option::is_none"
)]
pub input_token_limit: Option<u64>,
#[serde(
rename = "outputTokenLimit",
default,
skip_serializing_if = "Option::is_none"
)]
pub output_token_limit: Option<u64>,
#[serde(
rename = "supportedGenerationMethods",
default,
skip_serializing_if = "Option::is_none"
)]
pub supported_generation_methods: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub thinking: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(
rename = "maxTemperature",
default,
skip_serializing_if = "Option::is_none"
)]
pub max_temperature: Option<f64>,
#[serde(rename = "topP", default, skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(rename = "topK", default, skip_serializing_if = "Option::is_none")]
pub top_k: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GeminiApiErrorResponse {
pub error: GeminiApiError,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GeminiApiError {
pub code: i32,
pub message: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub details: Option<Vec<JsonObject>>,
}