Skip to main content

gproxy_protocol/wire/openai/responses/
generate.rs

1//! OpenAI Responses generation request body (`POST /responses`).
2//! Source: Create a model response.md, Body Parameters (lines 15-5760).
3use super::input::{
4    ConversationParam, Input, ReasoningConfig, ResponseInputFile, ResponseInputImage,
5    ResponseInputText, TextConfig, present_nullable, present_optional,
6};
7use super::tools::Tool;
8use crate::Rest;
9use serde::{Deserialize, Serialize};
10use std::collections::BTreeMap;
11
12#[derive(
13    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
14)]
15#[serde(rename_all = "snake_case")]
16#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
17#[derive(gproxy_protocol_macros::DeclaredFields)]
18pub struct GenerateContentRequestBody {
19    #[serde(
20        default,
21        deserialize_with = "present_nullable",
22        skip_serializing_if = "Option::is_none"
23    )]
24    pub multi_agent: Option<Option<super::multi_agent::MultiAgentConfig>>,
25    #[serde(
26        default,
27        deserialize_with = "present_nullable",
28        skip_serializing_if = "Option::is_none"
29    )]
30    pub background: Option<Option<bool>>,
31    #[serde(
32        default,
33        deserialize_with = "present_nullable",
34        skip_serializing_if = "Option::is_none"
35    )]
36    pub context_management: Option<Option<Vec<ContextManagement>>>,
37    #[serde(
38        default,
39        deserialize_with = "present_nullable",
40        skip_serializing_if = "Option::is_none"
41    )]
42    pub conversation: Option<Option<ConversationParam>>,
43    #[serde(
44        default,
45        deserialize_with = "present_nullable",
46        skip_serializing_if = "Option::is_none"
47    )]
48    pub include: Option<Option<Vec<ResponseIncludable>>>,
49    #[serde(
50        default,
51        deserialize_with = "present_optional",
52        skip_serializing_if = "Option::is_none"
53    )]
54    pub input: Option<Input>,
55    #[serde(
56        default,
57        deserialize_with = "present_nullable",
58        skip_serializing_if = "Option::is_none"
59    )]
60    pub instructions: Option<Option<String>>,
61    #[serde(
62        default,
63        deserialize_with = "present_nullable",
64        skip_serializing_if = "Option::is_none"
65    )]
66    pub max_output_tokens: Option<Option<i64>>,
67    #[serde(
68        default,
69        deserialize_with = "present_nullable",
70        skip_serializing_if = "Option::is_none"
71    )]
72    pub max_tool_calls: Option<Option<i64>>,
73    #[serde(
74        default,
75        deserialize_with = "present_nullable",
76        skip_serializing_if = "Option::is_none"
77    )]
78    pub metadata: Option<Option<BTreeMap<String, String>>>,
79    #[serde(
80        default,
81        deserialize_with = "present_optional",
82        skip_serializing_if = "Option::is_none"
83    )]
84    pub model: Option<String>,
85    #[serde(
86        default,
87        deserialize_with = "present_nullable",
88        skip_serializing_if = "Option::is_none"
89    )]
90    pub moderation: Option<Option<ResponseModeration>>,
91    #[serde(
92        default,
93        deserialize_with = "present_nullable",
94        skip_serializing_if = "Option::is_none"
95    )]
96    pub parallel_tool_calls: Option<Option<bool>>,
97    #[serde(
98        default,
99        deserialize_with = "present_nullable",
100        skip_serializing_if = "Option::is_none"
101    )]
102    pub previous_response_id: Option<Option<String>>,
103    #[serde(
104        default,
105        deserialize_with = "present_nullable",
106        skip_serializing_if = "Option::is_none"
107    )]
108    pub prompt: Option<Option<ResponsePrompt>>,
109    #[serde(
110        default,
111        deserialize_with = "present_nullable",
112        skip_serializing_if = "Option::is_none"
113    )]
114    pub prompt_cache_key: Option<Option<String>>,
115    #[serde(
116        default,
117        deserialize_with = "present_optional",
118        skip_serializing_if = "Option::is_none"
119    )]
120    pub prompt_cache_options: Option<PromptCacheOptions>,
121    #[serde(
122        default,
123        deserialize_with = "present_nullable",
124        skip_serializing_if = "Option::is_none"
125    )]
126    pub prompt_cache_retention: Option<Option<PromptCacheRetention>>,
127    #[serde(
128        default,
129        deserialize_with = "present_nullable",
130        skip_serializing_if = "Option::is_none"
131    )]
132    pub reasoning: Option<Option<ReasoningConfig>>,
133    #[serde(
134        default,
135        deserialize_with = "present_nullable",
136        skip_serializing_if = "Option::is_none"
137    )]
138    pub safety_identifier: Option<Option<String>>,
139    #[serde(
140        default,
141        deserialize_with = "present_nullable",
142        skip_serializing_if = "Option::is_none"
143    )]
144    pub service_tier: Option<Option<ServiceTier>>,
145    #[serde(
146        default,
147        deserialize_with = "present_nullable",
148        skip_serializing_if = "Option::is_none"
149    )]
150    pub store: Option<Option<bool>>,
151    #[serde(
152        default,
153        deserialize_with = "present_nullable",
154        skip_serializing_if = "Option::is_none"
155    )]
156    pub stream: Option<Option<bool>>,
157    #[serde(
158        default,
159        deserialize_with = "present_nullable",
160        skip_serializing_if = "Option::is_none"
161    )]
162    pub stream_options: Option<Option<StreamOptions>>,
163    #[serde(
164        default,
165        deserialize_with = "present_nullable",
166        skip_serializing_if = "Option::is_none"
167    )]
168    pub temperature: Option<Option<serde_json::Number>>,
169    #[serde(
170        default,
171        deserialize_with = "present_optional",
172        skip_serializing_if = "Option::is_none"
173    )]
174    pub text: Option<TextConfig>,
175    #[serde(
176        default,
177        deserialize_with = "present_optional",
178        skip_serializing_if = "Option::is_none"
179    )]
180    pub tool_choice: Option<super::input::ToolChoice>,
181    #[serde(
182        default,
183        deserialize_with = "present_optional",
184        skip_serializing_if = "Option::is_none"
185    )]
186    pub tools: Option<Vec<Tool>>,
187    #[serde(
188        default,
189        deserialize_with = "present_nullable",
190        skip_serializing_if = "Option::is_none"
191    )]
192    pub top_logprobs: Option<Option<i64>>,
193    #[serde(
194        default,
195        deserialize_with = "present_nullable",
196        skip_serializing_if = "Option::is_none"
197    )]
198    pub top_p: Option<Option<serde_json::Number>>,
199    #[serde(
200        default,
201        deserialize_with = "present_nullable",
202        skip_serializing_if = "Option::is_none"
203    )]
204    pub truncation: Option<Option<GenerateTruncation>>,
205    #[serde(
206        default,
207        deserialize_with = "present_optional",
208        skip_serializing_if = "Option::is_none"
209    )]
210    pub user: Option<String>,
211    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
212    pub rest: Rest,
213}
214
215#[derive(
216    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
217)]
218#[serde(rename_all = "snake_case")]
219#[derive(gproxy_protocol_macros::DeclaredFields)]
220pub struct ContextManagement {
221    pub r#type: String,
222    #[serde(
223        default,
224        deserialize_with = "present_nullable",
225        skip_serializing_if = "Option::is_none"
226    )]
227    pub compact_threshold: Option<Option<i64>>,
228    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
229    pub rest: Rest,
230}
231#[derive(
232    Debug,
233    Clone,
234    Copy,
235    PartialEq,
236    Eq,
237    Serialize,
238    Deserialize,
239    gproxy_protocol_macros::DeclaredFields,
240)]
241pub enum ResponseIncludable {
242    #[serde(rename = "web_search_call.action.sources")]
243    WebSearchSources,
244    #[serde(rename = "code_interpreter_call.outputs")]
245    CodeInterpreterOutputs,
246    #[serde(rename = "computer_call_output.output.image_url")]
247    ComputerImageUrl,
248    #[serde(rename = "file_search_call.results")]
249    FileSearchResults,
250    #[serde(rename = "message.input_image.image_url")]
251    InputImageUrl,
252    #[serde(rename = "message.output_text.logprobs")]
253    OutputLogprobs,
254    #[serde(rename = "reasoning.encrypted_content")]
255    ReasoningEncryptedContent,
256}
257#[derive(
258    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
259)]
260#[serde(rename_all = "snake_case")]
261#[derive(gproxy_protocol_macros::DeclaredFields)]
262pub struct ResponseModeration {
263    pub model: String,
264    #[serde(
265        default,
266        deserialize_with = "present_nullable",
267        skip_serializing_if = "Option::is_none"
268    )]
269    pub policy: Option<Option<ModerationPolicy>>,
270    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
271    pub rest: Rest,
272}
273#[derive(
274    Debug,
275    Clone,
276    Copy,
277    PartialEq,
278    Eq,
279    Serialize,
280    Deserialize,
281    gproxy_protocol_macros::DeclaredFields,
282)]
283pub enum ModerationMode {
284    #[serde(rename = "score")]
285    Score,
286    #[serde(rename = "block")]
287    Block,
288}
289#[derive(
290    Debug,
291    Clone,
292    PartialEq,
293    Eq,
294    Serialize,
295    Deserialize,
296    gproxy_protocol_macros::WireBuilder,
297    gproxy_protocol_macros::DeclaredFields,
298)]
299pub struct ModerationPolicy {
300    #[serde(
301        default,
302        deserialize_with = "present_nullable",
303        skip_serializing_if = "Option::is_none"
304    )]
305    pub input: Option<Option<ModerationPolicyMode>>,
306    #[serde(
307        default,
308        deserialize_with = "present_nullable",
309        skip_serializing_if = "Option::is_none"
310    )]
311    pub output: Option<Option<ModerationPolicyMode>>,
312    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
313    pub rest: Rest,
314}
315#[derive(
316    Debug,
317    Clone,
318    PartialEq,
319    Eq,
320    Serialize,
321    Deserialize,
322    gproxy_protocol_macros::WireBuilder,
323    gproxy_protocol_macros::DeclaredFields,
324)]
325pub struct ModerationPolicyMode {
326    pub mode: ModerationMode,
327    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
328    pub rest: Rest,
329}
330#[derive(
331    Debug,
332    Clone,
333    PartialEq,
334    Eq,
335    Serialize,
336    Deserialize,
337    gproxy_protocol_macros::WireBuilder,
338    gproxy_protocol_macros::DeclaredFields,
339)]
340pub struct ResponsePrompt {
341    pub id: String,
342    #[serde(
343        default,
344        deserialize_with = "present_nullable",
345        skip_serializing_if = "Option::is_none"
346    )]
347    pub variables: Option<Option<BTreeMap<String, PromptVariableValue>>>,
348    #[serde(
349        default,
350        deserialize_with = "present_nullable",
351        skip_serializing_if = "Option::is_none"
352    )]
353    pub version: Option<Option<String>>,
354    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
355    pub rest: Rest,
356}
357#[derive(
358    Debug,
359    Clone,
360    Copy,
361    PartialEq,
362    Eq,
363    Serialize,
364    Deserialize,
365    gproxy_protocol_macros::DeclaredFields,
366)]
367pub enum PromptCachingMode {
368    #[serde(rename = "implicit")]
369    Implicit,
370    #[serde(rename = "explicit")]
371    Explicit,
372}
373#[derive(
374    Debug,
375    Clone,
376    PartialEq,
377    Eq,
378    Serialize,
379    Deserialize,
380    gproxy_protocol_macros::WireBuilder,
381    gproxy_protocol_macros::DeclaredFields,
382)]
383pub struct PromptCacheOptions {
384    #[serde(
385        default,
386        deserialize_with = "present_nullable",
387        skip_serializing_if = "Option::is_none"
388    )]
389    pub comparison_response_id: Option<Option<String>>,
390    #[serde(skip_serializing_if = "Option::is_none")]
391    pub prewarm: Option<bool>,
392
393    #[serde(
394        default,
395        deserialize_with = "present_optional",
396        skip_serializing_if = "Option::is_none"
397    )]
398    pub mode: Option<PromptCachingMode>,
399    #[serde(
400        default,
401        deserialize_with = "present_optional",
402        skip_serializing_if = "Option::is_none"
403    )]
404    pub ttl: Option<PromptCacheTtl>,
405    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
406    pub rest: Rest,
407}
408#[derive(
409    Debug,
410    Clone,
411    Copy,
412    PartialEq,
413    Eq,
414    Serialize,
415    Deserialize,
416    gproxy_protocol_macros::DeclaredFields,
417)]
418pub enum PromptCacheRetention {
419    #[serde(rename = "in_memory")]
420    InMemory,
421    #[serde(rename = "24h")]
422    TwentyFourHours,
423}
424#[derive(
425    Debug,
426    Clone,
427    Copy,
428    PartialEq,
429    Eq,
430    Serialize,
431    Deserialize,
432    gproxy_protocol_macros::DeclaredFields,
433)]
434pub enum ServiceTier {
435    #[serde(rename = "auto")]
436    Auto,
437    #[serde(rename = "default")]
438    Default,
439    #[serde(rename = "flex")]
440    Flex,
441    #[serde(rename = "scale")]
442    Scale,
443    #[serde(rename = "priority")]
444    Priority,
445    #[serde(rename = "fast")]
446    Fast,
447    #[serde(rename = "ultrafast")]
448    Ultrafast,
449}
450#[derive(
451    Debug,
452    Clone,
453    PartialEq,
454    Eq,
455    Serialize,
456    Deserialize,
457    gproxy_protocol_macros::WireBuilder,
458    gproxy_protocol_macros::DeclaredFields,
459)]
460pub struct StreamOptions {
461    #[serde(
462        default,
463        deserialize_with = "present_optional",
464        skip_serializing_if = "Option::is_none"
465    )]
466    pub include_obfuscation: Option<bool>,
467    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
468    pub rest: Rest,
469}
470#[derive(
471    Debug,
472    Clone,
473    Copy,
474    PartialEq,
475    Eq,
476    Serialize,
477    Deserialize,
478    gproxy_protocol_macros::DeclaredFields,
479)]
480pub enum GenerateTruncation {
481    #[serde(rename = "auto")]
482    Auto,
483    #[serde(rename = "disabled")]
484    Disabled,
485}
486pub type GenerateContentRequest = crate::WireRequest<GenerateContentRequestBody>;
487
488/// Prompt variables are a closed union, not arbitrary JSON (source line 4419).
489#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
490#[serde(untagged)]
491#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
492#[derive(gproxy_protocol_macros::DeclaredFields)]
493pub enum PromptVariableValue {
494    String(String),
495    Text(ResponseInputText),
496    Image(ResponseInputImage),
497    File(ResponseInputFile),
498}
499
500/// `ttl` has exactly one documented value (source line 4459).
501#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
502#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
503#[derive(gproxy_protocol_macros::DeclaredFields)]
504pub enum PromptCacheTtl {
505    #[serde(rename = "30m")]
506    ThirtyMinutes,
507}