use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
pub mod config;
pub use config::*;
use super::common::{
BlockReason, CitationMetadata, Content, ExtraFields, FinishReason, GroundingMetadata,
ModalityTokenCount, ModelStage, SafetyRating, SafetySetting, ServiceTier, Tool, ToolConfig,
UrlContextMetadata,
};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct GenerateContentRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub contents: Vec<Content>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tools: Vec<Tool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_config: Option<ToolConfig>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub safety_settings: Vec<SafetySetting>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system_instruction: Option<Content>,
#[serde(skip_serializing_if = "Option::is_none")]
pub generation_config: Option<GenerationConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cached_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub store: Option<bool>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}
pub type StreamGenerateContentRequest = GenerateContentRequest;
pub type StreamGenerateContentChunk = GenerateContentResponse;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct GenerateContentResponse {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub candidates: Vec<Candidate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_feedback: Option<PromptFeedback>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage_metadata: Option<UsageMetadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model_status: Option<ModelStatus>,
#[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 Candidate {
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<Content>,
#[serde(skip_serializing_if = "Option::is_none")]
pub finish_reason: Option<FinishReason>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub safety_ratings: Vec<SafetyRating>,
#[serde(skip_serializing_if = "Option::is_none")]
pub citation_metadata: Option<CitationMetadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub grounding_metadata: Option<GroundingMetadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avg_logprobs: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logprobs_result: Option<LogprobsResult>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url_context_metadata: Option<UrlContextMetadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub index: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub finish_message: 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 PromptFeedback {
#[serde(skip_serializing_if = "Option::is_none")]
pub block_reason: Option<BlockReason>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub safety_ratings: Vec<SafetyRating>,
#[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 UsageMetadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_token_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cached_content_token_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub candidates_token_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_use_prompt_token_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thoughts_token_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_token_count: Option<i32>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub prompt_tokens_details: Vec<ModalityTokenCount>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub cache_tokens_details: Vec<ModalityTokenCount>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub candidates_tokens_details: Vec<ModalityTokenCount>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tool_use_prompt_tokens_details: Vec<ModalityTokenCount>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
#[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 ModelStatus {
#[serde(skip_serializing_if = "Option::is_none")]
pub model_stage: Option<ModelStage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub retirement_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: 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 LogprobsResult {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub top_candidates: Vec<TopCandidates>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub chosen_candidates: Vec<LogprobCandidate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub log_probability_sum: 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 TopCandidates {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub candidates: Vec<LogprobCandidate>,
#[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 LogprobCandidate {
#[serde(skip_serializing_if = "Option::is_none")]
pub token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub log_probability: Option<f64>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
pub extra: ExtraFields,
}