openai_api_rs/v1/responses/
responses.rs

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