1use serde::{Deserialize, Serialize};
4
5use crate::prelude::*;
6
7use crate::common::{Content, DebugOutput, ResponseFormat, StreamOptions};
8use crate::search::SearchParameters;
9use crate::tools::{Tool, ToolCall, ToolChoice};
10use crate::usage::Usage;
11
12#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
14pub struct ChatRequest {
15 #[serde(default)]
17 pub messages: Vec<Message>,
18
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub model: Option<String>,
22
23 #[serde(skip_serializing_if = "Option::is_none")]
25 pub temperature: Option<f32>,
26
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub top_p: Option<f32>,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub n: Option<i32>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub stream: Option<bool>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub stream_options: Option<StreamOptions>,
42
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub stop: Option<Vec<String>>,
46
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub max_completion_tokens: Option<i32>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub max_tokens: Option<i32>,
54
55 #[serde(skip_serializing_if = "Option::is_none")]
57 pub presence_penalty: Option<f32>,
58
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub frequency_penalty: Option<f32>,
62
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub logit_bias: Option<serde_json::Value>,
66
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub logprobs: Option<bool>,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub top_logprobs: Option<i32>,
74
75 #[serde(skip_serializing_if = "Option::is_none")]
77 pub user: Option<String>,
78
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub response_format: Option<ResponseFormat>,
82
83 #[serde(skip_serializing_if = "Option::is_none")]
85 pub seed: Option<i32>,
86
87 #[serde(skip_serializing_if = "Option::is_none")]
89 pub tools: Option<Vec<Tool>>,
90
91 #[serde(skip_serializing_if = "Option::is_none")]
93 pub tool_choice: Option<ToolChoice>,
94
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub parallel_tool_calls: Option<bool>,
98
99 #[serde(skip_serializing_if = "Option::is_none")]
101 pub search_parameters: Option<SearchParameters>,
102
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub web_search_options: Option<crate::tools::WebSearchOptions>,
106
107 #[serde(skip_serializing_if = "Option::is_none")]
109 pub reasoning_effort: Option<String>,
110
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub deferred: Option<bool>,
114
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub bootstrap_host: Option<String>,
118
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub bootstrap_room: Option<i64>,
122}
123
124#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
126#[serde(tag = "role", rename_all = "lowercase")]
127pub enum Message {
128 System {
130 content: Content,
132 #[serde(skip_serializing_if = "Option::is_none")]
134 name: Option<String>,
135 },
136 User {
138 content: Content,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 name: Option<String>,
143 },
144 Assistant {
146 #[serde(skip_serializing_if = "Option::is_none")]
148 content: Option<Content>,
149 #[serde(skip_serializing_if = "Option::is_none")]
151 name: Option<String>,
152 #[serde(skip_serializing_if = "Option::is_none")]
154 reasoning_content: Option<String>,
155 #[serde(skip_serializing_if = "Option::is_none")]
157 tool_calls: Option<Vec<ToolCall>>,
158 },
159 Tool {
161 content: Content,
163 #[serde(skip_serializing_if = "Option::is_none")]
165 tool_call_id: Option<String>,
166 },
167 Function {
169 content: Content,
171 #[serde(skip_serializing_if = "Option::is_none")]
173 name: Option<String>,
174 },
175}
176
177impl Default for Message {
178 fn default() -> Self {
179 Message::User {
180 content: Content::default(),
181 name: None,
182 }
183 }
184}
185
186#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
188pub struct ChatResponse {
189 pub id: String,
191
192 pub object: String,
194
195 pub created: i64,
197
198 pub model: String,
200
201 pub choices: Vec<Choice>,
203
204 #[serde(skip_serializing_if = "Option::is_none")]
206 pub usage: Option<Usage>,
207
208 #[serde(skip_serializing_if = "Option::is_none")]
210 pub system_fingerprint: Option<String>,
211
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub citations: Option<Vec<String>>,
215
216 #[serde(skip_serializing_if = "Option::is_none")]
218 pub debug_output: Option<DebugOutput>,
219}
220
221#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
223pub struct Choice {
224 pub index: i32,
226
227 pub message: ChoiceMessage,
229
230 #[serde(skip_serializing_if = "Option::is_none")]
232 pub finish_reason: Option<String>,
233
234 #[serde(skip_serializing_if = "Option::is_none")]
236 pub logprobs: Option<LogProbs>,
237}
238
239#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
241pub struct ChoiceMessage {
242 pub role: String,
244
245 #[serde(skip_serializing_if = "Option::is_none")]
247 pub content: Option<String>,
248
249 #[serde(skip_serializing_if = "Option::is_none")]
251 pub reasoning_content: Option<String>,
252
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub refusal: Option<String>,
256
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub tool_calls: Option<Vec<ToolCall>>,
260}
261
262#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
264pub struct ChatResponseChunk {
265 pub id: String,
267
268 pub object: String,
270
271 pub created: i64,
273
274 pub model: String,
276
277 pub choices: Vec<ChoiceChunk>,
279
280 #[serde(skip_serializing_if = "Option::is_none")]
282 pub usage: Option<Usage>,
283
284 #[serde(skip_serializing_if = "Option::is_none")]
286 pub system_fingerprint: Option<String>,
287
288 #[serde(skip_serializing_if = "Option::is_none")]
290 pub citations: Option<Vec<String>>,
291
292 #[serde(skip_serializing_if = "Option::is_none")]
294 pub debug_output: Option<DebugOutput>,
295}
296
297#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
299pub struct ChoiceChunk {
300 pub index: i32,
302
303 pub delta: Delta,
305
306 #[serde(skip_serializing_if = "Option::is_none")]
308 pub finish_reason: Option<String>,
309
310 #[serde(skip_serializing_if = "Option::is_none")]
312 pub logprobs: Option<LogProbs>,
313}
314
315#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
317pub struct Delta {
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub role: Option<String>,
321
322 #[serde(skip_serializing_if = "Option::is_none")]
324 pub content: Option<String>,
325
326 #[serde(skip_serializing_if = "Option::is_none")]
328 pub reasoning_content: Option<String>,
329
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub tool_calls: Option<Vec<ToolCall>>,
333
334 #[serde(skip_serializing_if = "Option::is_none")]
336 pub images: Option<Vec<String>>,
337}
338
339#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
341pub struct LogProbs {
342 #[serde(skip_serializing_if = "Option::is_none")]
344 pub content: Option<Vec<TokenLogProb>>,
345}
346
347#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
349pub struct TokenLogProb {
350 pub token: String,
352
353 pub logprob: f32,
355
356 pub top_logprobs: Vec<TopLogProb>,
358
359 #[serde(skip_serializing_if = "Option::is_none")]
361 pub bytes: Option<Vec<u32>>,
362}
363
364#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
366pub struct TopLogProb {
367 pub token: String,
369
370 pub logprob: f32,
372
373 #[serde(skip_serializing_if = "Option::is_none")]
375 pub bytes: Option<Vec<u32>>,
376}