openai_api_rs/v1/
responses.rs

1use crate::v1::types::Tools;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4use std::collections::BTreeMap;
5
6#[derive(Debug, Serialize, Deserialize, Clone)]
7pub struct CreateResponseRequest {
8    // background
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub background: Option<bool>,
11
12    // conversation
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub conversation: Option<Value>,
15
16    // include
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub include: Option<Vec<String>>,
19
20    // input
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub input: Option<Value>,
23
24    // instructions
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub instructions: Option<String>,
27
28    // max_output_tokens
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub max_output_tokens: Option<u32>,
31
32    // max_tool_calls
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub max_tool_calls: Option<u32>,
35
36    // metadata
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub metadata: Option<BTreeMap<String, String>>,
39
40    // model
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub model: Option<String>,
43
44    // parallel_tool_calls
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub parallel_tool_calls: Option<bool>,
47
48    // previous_response_id
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub previous_response_id: Option<String>,
51
52    // prompt
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub prompt: Option<Value>,
55
56    // prompt_cache_key
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub prompt_cache_key: Option<String>,
59
60    // reasoning
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub reasoning: Option<Value>,
63
64    // safety_identifier
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub safety_identifier: Option<String>,
67
68    // service_tier
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub service_tier: Option<String>,
71
72    // store
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub store: Option<bool>,
75
76    // stream
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub stream: Option<bool>,
79
80    // stream_options
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub stream_options: Option<Value>,
83
84    // temperature
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub temperature: Option<f32>,
87
88    // text
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub text: Option<Value>,
91
92    // tool_choice
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub tool_choice: Option<Value>,
95
96    // tools
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub tools: Option<Vec<Tools>>,
99
100    // top_logprobs
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub top_logprobs: Option<u32>,
103
104    // top_p
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub top_p: Option<f32>,
107
108    // truncation
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub truncation: Option<String>,
111
112    // user (deprecated)
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub user: Option<String>,
115
116    // Future-proof
117    #[serde(flatten)]
118    pub extra: BTreeMap<String, Value>,
119}
120
121impl CreateResponseRequest {
122    pub fn new() -> Self {
123        Self {
124            background: None,
125            conversation: None,
126            include: None,
127            input: None,
128            instructions: None,
129            max_output_tokens: None,
130            max_tool_calls: None,
131            metadata: None,
132            model: None,
133            parallel_tool_calls: None,
134            previous_response_id: None,
135            prompt: None,
136            prompt_cache_key: None,
137            reasoning: None,
138            safety_identifier: None,
139            service_tier: None,
140            store: None,
141            stream: None,
142            stream_options: None,
143            temperature: None,
144            text: None,
145            tool_choice: None,
146            tools: None,
147            top_logprobs: None,
148            top_p: None,
149            truncation: None,
150            user: None,
151            extra: BTreeMap::new(),
152        }
153    }
154}
155
156impl Default for CreateResponseRequest {
157    fn default() -> Self {
158        Self::new()
159    }
160}
161
162#[derive(Debug, Serialize, Deserialize, Clone)]
163pub struct ResponseObject {
164    pub id: String,
165    pub object: String,
166
167    // Core
168    #[serde(skip_serializing_if = "Option::is_none")]
169    pub created_at: Option<u64>,
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub model: Option<String>,
172    #[serde(skip_serializing_if = "Option::is_none")]
173    pub status: Option<String>,
174
175    // Output
176    #[serde(skip_serializing_if = "Option::is_none")]
177    pub output: Option<Value>,
178    #[serde(skip_serializing_if = "Option::is_none")]
179    pub output_text: Option<String>,
180    #[serde(skip_serializing_if = "Option::is_none")]
181    pub output_audio: Option<Value>,
182
183    // Control / reasons
184    #[serde(skip_serializing_if = "Option::is_none")]
185    pub stop_reason: Option<String>,
186    #[serde(skip_serializing_if = "Option::is_none")]
187    pub refusal: Option<String>,
188
189    // Tools
190    #[serde(skip_serializing_if = "Option::is_none")]
191    pub tool_calls: Option<Value>,
192
193    // Misc
194    #[serde(skip_serializing_if = "Option::is_none")]
195    pub metadata: Option<Value>,
196    #[serde(skip_serializing_if = "Option::is_none")]
197    pub usage: Option<Value>,
198    #[serde(skip_serializing_if = "Option::is_none")]
199    pub system_fingerprint: Option<String>,
200    #[serde(skip_serializing_if = "Option::is_none")]
201    pub service_tier: Option<String>,
202
203    // Errors / details
204    #[serde(skip_serializing_if = "Option::is_none")]
205    pub status_details: Option<Value>,
206    #[serde(skip_serializing_if = "Option::is_none")]
207    pub incomplete_details: Option<Value>,
208    #[serde(skip_serializing_if = "Option::is_none")]
209    pub error: Option<Value>,
210
211    // Future-proof
212    #[serde(flatten)]
213    pub extra: BTreeMap<String, Value>,
214}
215
216#[derive(Debug, Serialize, Deserialize, Clone)]
217pub struct ListResponses {
218    pub object: String,
219    pub data: Vec<ResponseObject>,
220    #[serde(skip_serializing_if = "Option::is_none")]
221    pub first_id: Option<String>,
222    #[serde(skip_serializing_if = "Option::is_none")]
223    pub last_id: Option<String>,
224    pub has_more: bool,
225}
226
227// Get input token counts (POST /v1/responses/input_tokens)
228#[derive(Debug, Serialize, Deserialize, Clone)]
229pub struct CountTokensRequest {
230    // conversation
231    #[serde(skip_serializing_if = "Option::is_none")]
232    pub conversation: Option<Value>,
233
234    // input
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub input: Option<Value>,
237
238    // instructions
239    #[serde(skip_serializing_if = "Option::is_none")]
240    pub instructions: Option<String>,
241
242    // model
243    #[serde(skip_serializing_if = "Option::is_none")]
244    pub model: Option<String>,
245
246    // parallel_tool_calls
247    #[serde(skip_serializing_if = "Option::is_none")]
248    pub parallel_tool_calls: Option<bool>,
249
250    // previous_response_id
251    #[serde(skip_serializing_if = "Option::is_none")]
252    pub previous_response_id: Option<String>,
253
254    // reasoning
255    #[serde(skip_serializing_if = "Option::is_none")]
256    pub reasoning: Option<Value>,
257
258    // text
259    #[serde(skip_serializing_if = "Option::is_none")]
260    pub text: Option<Value>,
261
262    // tool_choice
263    #[serde(skip_serializing_if = "Option::is_none")]
264    pub tool_choice: Option<Value>,
265
266    // tools
267    #[serde(skip_serializing_if = "Option::is_none")]
268    pub tools: Option<Vec<Tools>>,
269
270    // truncation
271    #[serde(skip_serializing_if = "Option::is_none")]
272    pub truncation: Option<String>,
273
274    // Future-proof
275    #[serde(flatten)]
276    pub extra: BTreeMap<String, Value>,
277}
278
279impl CountTokensRequest {
280    pub fn new() -> Self {
281        Self {
282            conversation: None,
283            input: None,
284            instructions: None,
285            model: None,
286            parallel_tool_calls: None,
287            previous_response_id: None,
288            reasoning: None,
289            text: None,
290            tool_choice: None,
291            tools: None,
292            truncation: None,
293            extra: BTreeMap::new(),
294        }
295    }
296}
297
298impl Default for CountTokensRequest {
299    fn default() -> Self {
300        Self::new()
301    }
302}
303
304#[derive(Debug, Serialize, Deserialize, Clone)]
305pub struct CountTokensResponse {
306    #[serde(skip_serializing_if = "Option::is_none")]
307    pub object: Option<String>,
308    #[serde(skip_serializing_if = "Option::is_none")]
309    pub input_tokens: Option<u32>,
310    #[serde(flatten)]
311    pub extra: BTreeMap<String, Value>,
312}