use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use super::{
CodeExecutionOutcome, ContentRole, ExecutableCodeLanguage, ExtraFields,
FunctionResponseScheduling, JsonMap, MediaResolutionLevel, ServerToolType,
};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct Content {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub parts: Vec<Part>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<ContentRole>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct Part {
#[serde(skip_serializing_if = "Option::is_none")]
pub thought: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thought_signature: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub part_metadata: Option<JsonMap>,
#[serde(skip_serializing_if = "Option::is_none")]
pub media_resolution: Option<MediaResolution>,
#[serde(flatten, skip_serializing_if = "Option::is_none")]
pub data: Option<PartData>,
#[serde(flatten, skip_serializing_if = "Option::is_none")]
pub metadata: Option<PartMetadata>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum PartData {
Text {
text: String,
},
InlineData {
#[serde(rename = "inlineData")]
inline_data: Blob,
},
FunctionCall {
#[serde(rename = "functionCall")]
function_call: FunctionCall,
},
FunctionResponse {
#[serde(rename = "functionResponse")]
function_response: FunctionResponse,
},
FileData {
#[serde(rename = "fileData")]
file_data: FileData,
},
ExecutableCode {
#[serde(rename = "executableCode")]
executable_code: ExecutableCode,
},
CodeExecutionResult {
#[serde(rename = "codeExecutionResult")]
code_execution_result: CodeExecutionResult,
},
ToolCall {
#[serde(rename = "toolCall")]
tool_call: ToolCall,
},
ToolResponse {
#[serde(rename = "toolResponse")]
tool_response: ToolResponse,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum PartMetadata {
VideoMetadata {
#[serde(rename = "videoMetadata")]
video_metadata: VideoMetadata,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct Blob {
pub mime_type: String,
pub data: String,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct FileData {
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
pub file_uri: String,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct FunctionCall {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub args: Option<JsonMap>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct FunctionResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub name: String,
pub response: JsonMap,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub parts: Vec<FunctionResponsePart>,
#[serde(skip_serializing_if = "Option::is_none")]
pub will_continue: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scheduling: Option<FunctionResponseScheduling>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct FunctionResponsePart {
#[serde(flatten, skip_serializing_if = "Option::is_none")]
pub data: Option<FunctionResponsePartData>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum FunctionResponsePartData {
InlineData {
#[serde(rename = "inlineData")]
inline_data: FunctionResponseBlob,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct FunctionResponseBlob {
pub mime_type: String,
pub data: String,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ExecutableCode {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub language: ExecutableCodeLanguage,
pub code: String,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct CodeExecutionResult {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub outcome: CodeExecutionOutcome,
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ToolCall {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub tool_type: ServerToolType,
#[serde(skip_serializing_if = "Option::is_none")]
pub args: Option<JsonMap>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ToolResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub tool_type: ServerToolType,
#[serde(skip_serializing_if = "Option::is_none")]
pub response: Option<JsonMap>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct VideoMetadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub start_offset: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_offset: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fps: Option<f64>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct MediaResolution {
#[serde(flatten, skip_serializing_if = "Option::is_none")]
pub value: Option<MediaResolutionValue>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum MediaResolutionValue {
Level { level: MediaResolutionLevel },
}