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}