use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GoogleRequest {
pub contents: Vec<GoogleContent>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system_instruction: Option<GoogleContent>,
#[serde(skip_serializing_if = "Option::is_none")]
pub generation_config: Option<GoogleGenerationConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<GoogleTool>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GoogleTool {
pub function_declarations: Vec<GoogleFunctionDeclaration>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GoogleFunctionDeclaration {
pub name: String,
pub description: String,
pub parameters: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GoogleContent {
pub role: String, pub parts: Vec<GooglePart>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum GooglePart {
Text {
text: String,
},
InlineData {
mime_type: String,
data: String,
},
FunctionCall {
name: String,
args: serde_json::Value,
},
FunctionResponse {
name: String,
response: serde_json::Value,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GoogleGenerationConfig {
pub max_output_tokens: Option<u32>,
pub temperature: Option<f32>,
pub top_p: Option<f32>,
pub top_k: Option<u32>,
pub stop_sequences: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GoogleResponse {
pub candidates: Vec<GoogleCandidate>,
pub usage_metadata: GoogleUsageMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GoogleCandidate {
pub content: GoogleContent,
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GoogleUsageMetadata {
pub prompt_token_count: u32,
pub candidates_token_count: u32,
pub total_token_count: u32,
}