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