use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VertexGenerateContentRequest {
pub contents: Vec<VertexContent>,
#[serde(rename = "systemInstruction", skip_serializing_if = "Option::is_none")]
pub system_instruction: Option<VertexContent>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<VertexTool>>,
#[serde(rename = "toolConfig", skip_serializing_if = "Option::is_none")]
pub tool_config: Option<VertexToolConfig>,
#[serde(rename = "generationConfig", skip_serializing_if = "Option::is_none")]
pub generation_config: Option<VertexGenerationConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VertexContent {
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
pub parts: Vec<VertexPart>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VertexPart {
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(rename = "functionCall", skip_serializing_if = "Option::is_none")]
pub function_call: Option<VertexFunctionCall>,
#[serde(rename = "functionResponse", skip_serializing_if = "Option::is_none")]
pub function_response: Option<VertexFunctionResponse>,
#[serde(rename = "thoughtSignature", skip_serializing_if = "Option::is_none")]
pub thought_signature: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thought: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VertexFunctionCall {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub args: Option<serde_json::Value>,
#[serde(rename = "partialArgs", skip_serializing_if = "Option::is_none")]
pub partial_args: Option<Vec<VertexPartialArg>>,
#[serde(rename = "willContinue", skip_serializing_if = "Option::is_none")]
pub will_continue: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VertexPartialArg {
#[serde(rename = "jsonPath", skip_serializing_if = "Option::is_none")]
pub json_path: Option<String>,
#[serde(rename = "stringValue", skip_serializing_if = "Option::is_none")]
pub string_value: Option<String>,
#[serde(rename = "numberValue", skip_serializing_if = "Option::is_none")]
pub number_value: Option<f64>,
#[serde(rename = "boolValue", skip_serializing_if = "Option::is_none")]
pub bool_value: Option<bool>,
#[serde(rename = "nullValue", skip_serializing_if = "Option::is_none")]
pub null_value: Option<serde_json::Value>,
#[serde(rename = "structValue", skip_serializing_if = "Option::is_none")]
pub struct_value: Option<serde_json::Value>,
#[serde(rename = "listValue", skip_serializing_if = "Option::is_none")]
pub list_value: Option<serde_json::Value>,
#[serde(rename = "willContinue", skip_serializing_if = "Option::is_none")]
pub will_continue: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VertexFunctionResponse {
pub name: String,
pub response: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VertexTool {
#[serde(rename = "functionDeclarations")]
pub function_declarations: Vec<VertexFunctionDeclaration>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VertexFunctionDeclaration {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub parameters: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VertexToolConfig {
#[serde(rename = "functionCallingConfig")]
pub function_calling_config: VertexFunctionCallingConfig,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VertexFunctionCallingConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub mode: Option<String>,
#[serde(
rename = "allowedFunctionNames",
skip_serializing_if = "Option::is_none"
)]
pub allowed_function_names: Option<Vec<String>>,
#[serde(
rename = "streamFunctionCallArguments",
skip_serializing_if = "Option::is_none"
)]
pub stream_function_call_arguments: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VertexGenerationConfig {
#[serde(rename = "temperature", skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(rename = "topP", skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(rename = "topK", skip_serializing_if = "Option::is_none")]
pub top_k: Option<u32>,
#[serde(rename = "maxOutputTokens", skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<u32>,
#[serde(rename = "thinkingConfig", skip_serializing_if = "Option::is_none")]
pub thinking_config: Option<crate::llm::vertex::config::VertexThinkingConfig>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VertexGenerateContentResponse {
#[serde(default)]
pub candidates: Vec<VertexCandidate>,
#[serde(rename = "usageMetadata", skip_serializing_if = "Option::is_none")]
pub usage_metadata: Option<VertexUsageMetadata>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VertexCandidate {
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<VertexContent>,
#[serde(rename = "finishReason", skip_serializing_if = "Option::is_none")]
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VertexUsageMetadata {
#[serde(rename = "promptTokenCount", skip_serializing_if = "Option::is_none")]
pub prompt_token_count: Option<u32>,
#[serde(
rename = "candidatesTokenCount",
skip_serializing_if = "Option::is_none"
)]
pub candidates_token_count: Option<u32>,
#[serde(rename = "thoughtsTokenCount", skip_serializing_if = "Option::is_none")]
pub thoughts_token_count: Option<u32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct VertexErrorResponse {
pub error: VertexError,
}
#[derive(Debug, Clone, Deserialize)]
pub struct VertexError {
pub message: String,
#[serde(default)]
pub status: Option<String>,
}