gproxy_protocol/protocol/gemini/generate_content/
mod.rs1use 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}