Skip to main content

gproxy_protocol/protocol/openai/generate_content/
chat_tail.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::super::common::*;
6use super::chat::ChatTextContent;
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct ImageUrl {
10    pub url: String,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub detail: Option<ChatImageDetailLevel>,
13    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
14    pub extra: Extra,
15}
16
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18pub struct InputAudio {
19    pub data: String,
20    pub format: InputAudioFormat,
21    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
22    pub extra: Extra,
23}
24
25#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
26pub struct ChatFileRef {
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub file_data: Option<String>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub file_id: Option<String>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub filename: Option<String>,
33    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
34    pub extra: Extra,
35}
36
37#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
38pub struct CustomToolCall {
39    pub input: String,
40    pub name: String,
41    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
42    pub extra: Extra,
43}
44
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
46pub struct ChatAudioParam {
47    pub format: AudioResponseFormat,
48    pub voice: VoiceRef,
49    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
50    pub extra: Extra,
51}
52
53#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
54#[serde(untagged)]
55pub enum VoiceRef {
56    Name(VoiceName),
57    Object { id: String },
58}
59
60#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
61pub struct ChatAudioRef {
62    pub id: String,
63    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
64    pub extra: Extra,
65}
66
67#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
68pub struct PredictionContent {
69    #[serde(rename = "type")]
70    pub type_: PredictionContentType,
71    pub content: ChatTextContent,
72    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
73    pub extra: Extra,
74}
75
76#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
77pub enum PredictionContentType {
78    #[serde(rename = "content")]
79    Content,
80}
81
82#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
83pub struct StreamOptions {
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub include_obfuscation: Option<bool>,
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub include_usage: Option<bool>,
88    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
89    pub extra: Extra,
90}
91
92#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
93pub struct ChatChoiceLogprobs {
94    #[serde(skip_serializing_if = "Vec::is_empty")]
95    pub content: Vec<TokenLogprob>,
96    #[serde(skip_serializing_if = "Vec::is_empty")]
97    pub refusal: Vec<TokenLogprob>,
98    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
99    pub extra: Extra,
100}
101
102#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
103pub struct ChatAnnotation {
104    #[serde(rename = "type")]
105    pub type_: ChatAnnotationType,
106    pub url_citation: UrlCitation,
107    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
108    pub extra: Extra,
109}
110
111#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
112pub enum ChatAnnotationType {
113    #[serde(rename = "url_citation")]
114    UrlCitation,
115}
116
117#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
118pub struct UrlCitation {
119    pub end_index: u32,
120    pub start_index: u32,
121    pub title: String,
122    pub url: String,
123    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
124    pub extra: Extra,
125}
126
127#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
128pub struct ChatAudio {
129    pub id: String,
130    pub data: String,
131    pub expires_at: u64,
132    pub transcript: String,
133    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
134    pub extra: Extra,
135}
136
137#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
138pub struct CompletionUsage {
139    pub completion_tokens: u32,
140    pub prompt_tokens: u32,
141    pub total_tokens: u32,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub completion_tokens_details: Option<CompletionTokensDetails>,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub prompt_tokens_details: Option<PromptTokensDetails>,
146    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
147    pub extra: Extra,
148}
149
150#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
151pub struct CompletionTokensDetails {
152    #[serde(skip_serializing_if = "Option::is_none")]
153    pub accepted_prediction_tokens: Option<u32>,
154    #[serde(skip_serializing_if = "Option::is_none")]
155    pub audio_tokens: Option<u32>,
156    #[serde(skip_serializing_if = "Option::is_none")]
157    pub reasoning_tokens: Option<u32>,
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub rejected_prediction_tokens: Option<u32>,
160    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
161    pub extra: Extra,
162}
163
164#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
165pub struct PromptTokensDetails {
166    #[serde(skip_serializing_if = "Option::is_none")]
167    pub audio_tokens: Option<u32>,
168    #[serde(skip_serializing_if = "Option::is_none")]
169    pub cache_write_tokens: Option<u32>,
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub cached_tokens: Option<u32>,
172    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
173    pub extra: Extra,
174}
175
176#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
177pub struct ChatWebSearchOptions {
178    #[serde(skip_serializing_if = "Option::is_none")]
179    pub search_context_size: Option<SearchContextSize>,
180    #[serde(skip_serializing_if = "Option::is_none")]
181    pub user_location: Option<ChatWebSearchUserLocation>,
182    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
183    pub extra: Extra,
184}
185
186#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
187pub struct ChatWebSearchUserLocation {
188    pub approximate: ApproximateLocation,
189    #[serde(rename = "type")]
190    pub type_: ApproximateLocationType,
191    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
192    pub extra: Extra,
193}
194
195#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
196pub struct ApproximateLocation {
197    #[serde(skip_serializing_if = "Option::is_none")]
198    pub city: Option<String>,
199    #[serde(skip_serializing_if = "Option::is_none")]
200    pub country: Option<String>,
201    #[serde(skip_serializing_if = "Option::is_none")]
202    pub region: Option<String>,
203    #[serde(skip_serializing_if = "Option::is_none")]
204    pub timezone: Option<String>,
205    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
206    pub extra: Extra,
207}