use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GenerateContentRequest {
pub contents: Vec<Content>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system_instruction: Option<SystemInstruction>,
#[serde(skip_serializing_if = "Option::is_none")]
pub generation_config: Option<GenerationConfig>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tools: Vec<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_config: Option<ToolConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Content {
pub role: String,
pub parts: Vec<Part>,
}
#[derive(Debug, Serialize)]
pub struct SystemInstruction {
pub parts: Vec<Part>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Part {
FunctionCall {
#[serde(rename = "functionCall")]
function_call: FunctionCallPart,
},
FunctionResponse {
#[serde(rename = "functionResponse")]
function_response: FunctionResponsePart,
},
Text {
text: String,
},
InlineData {
#[serde(rename = "inlineData")]
inline_data: InlineDataPart,
},
FileData {
#[serde(rename = "fileData")]
file_data: FileDataPart,
},
Other(Value),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InlineDataPart {
#[serde(rename = "mimeType")]
pub mime_type: String,
pub data: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileDataPart {
#[serde(rename = "mimeType")]
pub mime_type: String,
#[serde(rename = "fileUri")]
pub file_uri: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionCallPart {
pub name: String,
#[serde(default)]
pub args: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionResponsePart {
pub name: String,
pub response: Value,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GenerationConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_json_schema: Option<Value>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub stop_sequences: Vec<String>,
}
#[derive(Debug, Serialize)]
pub struct ToolDeclaration {
#[serde(rename = "functionDeclarations")]
pub function_declarations: Vec<FunctionDeclaration>,
}
#[derive(Debug, Serialize)]
pub struct FunctionDeclaration {
pub name: String,
pub description: String,
#[serde(rename = "parametersJsonSchema")]
pub parameters_json_schema: Value,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ToolConfig {
pub function_calling_config: FunctionCallingConfig,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FunctionCallingConfig {
pub mode: &'static str,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_function_names: Option<Vec<String>>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GenerateContentResponse {
#[serde(default)]
pub candidates: Vec<Candidate>,
#[serde(default)]
pub usage_metadata: Option<UsageMetadata>,
#[serde(default)]
pub model_version: Option<String>,
#[serde(default)]
pub response_id: Option<String>,
#[serde(default)]
pub prompt_feedback: Option<PromptFeedback>,
}
#[derive(Debug, Deserialize)]
pub struct Candidate {
#[serde(default)]
pub content: Option<Content>,
#[serde(default, rename = "finishReason")]
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UsageMetadata {
#[serde(default)]
pub prompt_token_count: u32,
#[serde(default)]
pub candidates_token_count: u32,
#[serde(default)]
pub cached_content_token_count: Option<u32>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PromptFeedback {
#[serde(default)]
pub block_reason: Option<String>,
}