Skip to main content

gproxy_protocol/protocol/gemini/generate_content/
mod.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5pub mod config;
6
7pub use config::*;
8
9use super::common::{
10    BlockReason, CitationMetadata, Content, ExtraFields, FinishReason, GroundingMetadata,
11    ModalityTokenCount, ModelStage, SafetyRating, SafetySetting, ServiceTier, Tool, ToolConfig,
12    UrlContextMetadata,
13};
14
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
16#[serde(rename_all = "camelCase")]
17pub struct GenerateContentRequest {
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub model: Option<String>,
20    #[serde(default, skip_serializing_if = "Vec::is_empty")]
21    pub contents: Vec<Content>,
22    #[serde(default, skip_serializing_if = "Vec::is_empty")]
23    pub tools: Vec<Tool>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub tool_config: Option<ToolConfig>,
26    #[serde(default, skip_serializing_if = "Vec::is_empty")]
27    pub safety_settings: Vec<SafetySetting>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub system_instruction: Option<Content>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub generation_config: Option<GenerationConfig>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub cached_content: Option<String>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub service_tier: Option<ServiceTier>,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub store: Option<bool>,
38    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
39    pub extra: ExtraFields,
40}
41
42pub type StreamGenerateContentRequest = GenerateContentRequest;
43pub type StreamGenerateContentChunk = GenerateContentResponse;
44
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
46#[serde(rename_all = "camelCase")]
47pub struct GenerateContentResponse {
48    #[serde(default, skip_serializing_if = "Vec::is_empty")]
49    pub candidates: Vec<Candidate>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub prompt_feedback: Option<PromptFeedback>,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub usage_metadata: Option<UsageMetadata>,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub model_version: Option<String>,
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub response_id: Option<String>,
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub model_status: Option<ModelStatus>,
60    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
61    pub extra: ExtraFields,
62}
63
64#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
65#[serde(rename_all = "camelCase")]
66pub struct Candidate {
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub content: Option<Content>,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub finish_reason: Option<FinishReason>,
71    #[serde(default, skip_serializing_if = "Vec::is_empty")]
72    pub safety_ratings: Vec<SafetyRating>,
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub citation_metadata: Option<CitationMetadata>,
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub token_count: Option<i32>,
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub grounding_metadata: Option<GroundingMetadata>,
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub avg_logprobs: Option<f64>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub logprobs_result: Option<LogprobsResult>,
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub url_context_metadata: Option<UrlContextMetadata>,
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub index: Option<i32>,
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub finish_message: Option<String>,
89    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
90    pub extra: ExtraFields,
91}
92
93#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
94#[serde(rename_all = "camelCase")]
95pub struct PromptFeedback {
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub block_reason: Option<BlockReason>,
98    #[serde(default, skip_serializing_if = "Vec::is_empty")]
99    pub safety_ratings: Vec<SafetyRating>,
100    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
101    pub extra: ExtraFields,
102}
103
104#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
105#[serde(rename_all = "camelCase")]
106pub struct UsageMetadata {
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub prompt_token_count: Option<i32>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub cached_content_token_count: Option<i32>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub candidates_token_count: Option<i32>,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub tool_use_prompt_token_count: Option<i32>,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub thoughts_token_count: Option<i32>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub total_token_count: Option<i32>,
119    #[serde(default, skip_serializing_if = "Vec::is_empty")]
120    pub prompt_tokens_details: Vec<ModalityTokenCount>,
121    #[serde(default, skip_serializing_if = "Vec::is_empty")]
122    pub cache_tokens_details: Vec<ModalityTokenCount>,
123    #[serde(default, skip_serializing_if = "Vec::is_empty")]
124    pub candidates_tokens_details: Vec<ModalityTokenCount>,
125    #[serde(default, skip_serializing_if = "Vec::is_empty")]
126    pub tool_use_prompt_tokens_details: Vec<ModalityTokenCount>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub service_tier: Option<ServiceTier>,
129    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
130    pub extra: ExtraFields,
131}
132
133#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
134#[serde(rename_all = "camelCase")]
135pub struct ModelStatus {
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub model_stage: Option<ModelStage>,
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub retirement_time: Option<String>,
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub message: Option<String>,
142    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
143    pub extra: ExtraFields,
144}
145
146#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
147#[serde(rename_all = "camelCase")]
148pub struct LogprobsResult {
149    #[serde(default, skip_serializing_if = "Vec::is_empty")]
150    pub top_candidates: Vec<TopCandidates>,
151    #[serde(default, skip_serializing_if = "Vec::is_empty")]
152    pub chosen_candidates: Vec<LogprobCandidate>,
153    #[serde(skip_serializing_if = "Option::is_none")]
154    pub log_probability_sum: Option<f64>,
155    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
156    pub extra: ExtraFields,
157}
158
159#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
160#[serde(rename_all = "camelCase")]
161pub struct TopCandidates {
162    #[serde(default, skip_serializing_if = "Vec::is_empty")]
163    pub candidates: Vec<LogprobCandidate>,
164    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
165    pub extra: ExtraFields,
166}
167
168#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
169#[serde(rename_all = "camelCase")]
170pub struct LogprobCandidate {
171    #[serde(skip_serializing_if = "Option::is_none")]
172    pub token: Option<String>,
173    #[serde(skip_serializing_if = "Option::is_none")]
174    pub token_id: Option<i32>,
175    #[serde(skip_serializing_if = "Option::is_none")]
176    pub log_probability: Option<f64>,
177    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
178    pub extra: ExtraFields,
179}