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}