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)]
#[serde(rename_all = "camelCase")]
pub struct GoogleTool {
#[serde(skip_serializing_if = "Option::is_none")]
pub function_declarations: Option<Vec<GoogleFunctionDeclaration>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub google_search_retrieval: Option<GoogleSearchRetrieval>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_execution: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GoogleSearchRetrieval {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_retrieval_config: Option<DynamicRetrievalConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DynamicRetrievalConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub mode: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_threshold: Option<f32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
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,
#[serde(default, skip_serializing_if = "Option::is_none")]
thought: Option<bool>,
},
InlineData {
mime_type: String,
data: String,
},
FunctionCall {
name: String,
args: serde_json::Value,
},
FunctionResponse {
name: String,
response: serde_json::Value,
},
ExecutableCode {
language: String,
code: String,
},
CodeExecutionResult {
outcome: String,
output: String,
},
}
#[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>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_schema: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_modalities: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub speech_config: Option<GoogleSpeechConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thinking_config: Option<GoogleThinkingConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GoogleSpeechConfig {
pub voice_config: GoogleVoiceConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GoogleVoiceConfig {
pub prebuilt_voice_config: GooglePrebuiltVoiceConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GooglePrebuiltVoiceConfig {
pub voice_name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GoogleThinkingConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub include_thoughts: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thinking_level: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thinking_budget: Option<i32>,
}
#[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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub grounding_metadata: Option<serde_json::Value>,
}
#[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,
#[serde(default)]
pub thoughts_token_count: Option<u32>,
}