use std::time::Duration;
use serde::Deserialize;
use super::common::{Content, EmptyObject};
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ServerMessage {
#[serde(default)]
pub setup_complete: Option<EmptyObject>,
#[serde(default)]
pub server_content: Option<ServerContent>,
#[serde(default)]
pub tool_call: Option<ToolCallMessage>,
#[serde(default)]
pub tool_call_cancellation: Option<ToolCallCancellation>,
#[serde(default)]
pub go_away: Option<GoAway>,
#[serde(default)]
pub session_resumption_update: Option<SessionResumptionUpdate>,
#[serde(default)]
pub usage_metadata: Option<UsageMetadata>,
#[serde(default)]
pub error: Option<ApiError>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ServerContent {
pub model_turn: Option<Content>,
#[serde(default)]
pub turn_complete: Option<bool>,
#[serde(default)]
pub generation_complete: Option<bool>,
#[serde(default)]
pub interrupted: Option<bool>,
pub input_transcription: Option<Transcription>,
pub output_transcription: Option<Transcription>,
pub grounding_metadata: Option<serde_json::Value>,
pub url_context_metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
pub struct Transcription {
#[serde(default)]
pub text: Option<String>,
#[serde(default)]
pub finished: Option<bool>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ToolCallMessage {
pub function_calls: Vec<FunctionCallRequest>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FunctionCallRequest {
pub id: String,
pub name: String,
pub args: serde_json::Value,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ToolCallCancellation {
pub ids: Vec<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GoAway {
pub time_left: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionResumptionUpdate {
pub new_handle: Option<String>,
#[serde(default)]
pub resumable: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UsageMetadata {
#[serde(default)]
pub prompt_token_count: u32,
#[serde(default)]
pub cached_content_token_count: u32,
#[serde(default)]
pub response_token_count: u32,
#[serde(default)]
pub tool_use_prompt_token_count: u32,
#[serde(default)]
pub thoughts_token_count: u32,
#[serde(default)]
pub total_token_count: u32,
#[serde(default)]
pub prompt_tokens_details: Option<Vec<ModalityTokenCount>>,
#[serde(default)]
pub response_tokens_details: Option<Vec<ModalityTokenCount>>,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ModalityTokenCount {
pub modality: String,
pub token_count: u32,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
pub struct ApiError {
pub message: String,
}
#[derive(Debug, Clone)]
pub enum ServerEvent {
SetupComplete,
ModelText(String),
ModelAudio(Vec<u8>),
GenerationComplete,
TurnComplete,
Interrupted,
InputTranscription(String),
OutputTranscription(String),
ToolCall(Vec<FunctionCallRequest>),
ToolCallCancellation(Vec<String>),
SessionResumption {
new_handle: Option<String>,
resumable: bool,
},
GoAway { time_left: Option<Duration> },
Usage(UsageMetadata),
Closed { reason: String },
Error(ApiError),
}