1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use crate::openai::common::*;
7
8use super::{
9 MultiAgentConfig, PromptVariableInputContentPart, ResponseConversationParam, ResponseInput,
10 ResponseOutputItem, ResponseTool,
11};
12
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
14#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
15pub struct ContextManagement {
16 #[serde(rename = "type")]
17 pub type_: ContextManagementType,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub compact_threshold: Option<f64>,
20 #[serde(default, flatten)]
21 pub rest: Rest,
22}
23
24#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
25#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
26pub struct PromptRef {
27 pub id: String,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub version: Option<String>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub variables: Option<PromptVariables>,
32 #[serde(default, flatten)]
33 pub rest: Rest,
34}
35
36pub type PromptVariables = BTreeMap<String, PromptVariableValue>;
37
38#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
39#[serde(untagged)]
40#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
41pub enum PromptVariableValue {
42 Text(String),
43 InputContent(PromptVariableInputContentPart),
44}
45
46#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
47#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
48pub struct ReasoningConfig {
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub context: Option<ReasoningContext>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub effort: Option<ReasoningEffort>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub mode: Option<ReasoningMode>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub summary: Option<ReasoningSummary>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub generate_summary: Option<ReasoningSummary>,
59 #[serde(default, flatten)]
60 pub rest: Rest,
61}
62
63#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
64#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
65pub struct TextConfig {
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub format: Option<ResponseFormat>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub verbosity: Option<Verbosity>,
70 #[serde(default, flatten)]
71 pub rest: Rest,
72}
73
74#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
75#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
76pub struct ResponseStreamOptions {
77 #[serde(skip_serializing_if = "Option::is_none")]
78 pub include_obfuscation: Option<bool>,
79 #[serde(default, flatten)]
80 pub rest: Rest,
81}
82
83#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
84#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
85pub struct ResponseObject {
86 pub id: String,
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub created_at: Option<u64>,
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub background: Option<bool>,
91 #[serde(skip_serializing_if = "Option::is_none")]
92 pub completed_at: Option<u64>,
93 #[serde(skip_serializing_if = "Option::is_none")]
94 pub conversation: Option<ResponseConversationParam>,
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub error: Option<ResponseError>,
97 #[serde(skip_serializing_if = "Option::is_none")]
98 pub incomplete_details: Option<IncompleteDetails>,
99 #[serde(skip_serializing_if = "Option::is_none")]
100 pub instructions: Option<ResponseInput>,
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub max_output_tokens: Option<u32>,
103 #[serde(skip_serializing_if = "Option::is_none")]
104 pub max_tool_calls: Option<u32>,
105 #[serde(skip_serializing_if = "Option::is_none")]
106 pub metadata: Option<Metadata>,
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub model: Option<OpenAiModelId>,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 pub moderation: Option<ResponseModeration>,
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub multi_agent: Option<MultiAgentConfig>,
113 pub object: ResponseObjectType,
114 pub output: Vec<ResponseOutputItem>,
115 #[serde(skip_serializing_if = "Option::is_none")]
116 pub output_text: Option<String>,
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub parallel_tool_calls: Option<bool>,
119 #[serde(skip_serializing_if = "Option::is_none")]
120 pub prompt: Option<PromptRef>,
121 #[serde(skip_serializing_if = "Option::is_none")]
122 pub prompt_cache_key: Option<String>,
123 #[serde(skip_serializing_if = "Option::is_none")]
124 pub prompt_cache_options: Option<PromptCacheOptions>,
125 #[serde(skip_serializing_if = "Option::is_none")]
126 pub prompt_cache_retention: Option<PromptCacheRetention>,
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub previous_response_id: Option<String>,
129 #[serde(skip_serializing_if = "Option::is_none")]
130 pub reasoning: Option<ReasoningConfig>,
131 #[serde(skip_serializing_if = "Option::is_none")]
132 pub safety_identifier: Option<String>,
133 #[serde(skip_serializing_if = "Option::is_none")]
134 pub service_tier: Option<ServiceTier>,
135 #[serde(skip_serializing_if = "Option::is_none")]
136 pub status: Option<ResponseStatus>,
137 #[serde(skip_serializing_if = "Option::is_none")]
138 pub store: Option<bool>,
139 #[serde(skip_serializing_if = "Option::is_none")]
140 pub temperature: Option<f64>,
141 #[serde(skip_serializing_if = "Option::is_none")]
142 pub text: Option<TextConfig>,
143 #[serde(skip_serializing_if = "Option::is_none")]
144 pub tool_choice: Option<ResponseToolChoice>,
145 #[serde(skip_serializing_if = "Option::is_none")]
146 pub tools: Option<Vec<ResponseTool>>,
147 #[serde(skip_serializing_if = "Option::is_none")]
148 pub top_logprobs: Option<u32>,
149 #[serde(skip_serializing_if = "Option::is_none")]
150 pub top_p: Option<f64>,
151 #[serde(skip_serializing_if = "Option::is_none")]
152 pub truncation: Option<TruncationStrategy>,
153 #[serde(skip_serializing_if = "Option::is_none")]
154 pub usage: Option<ResponseUsage>,
155 #[serde(skip_serializing_if = "Option::is_none")]
156 pub user: Option<String>,
157 #[serde(default, flatten)]
158 pub rest: Rest,
159}
160
161#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
162#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
163pub struct ResponseError {
164 pub code: ResponseErrorCode,
165 pub message: String,
166 #[serde(default, flatten)]
167 pub rest: Rest,
168}
169
170#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
171#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
172pub struct ResponseModeration {
173 pub input: ResponseModerationOutcome,
174 pub output: ResponseModerationOutcome,
175 #[serde(default, flatten)]
176 pub rest: Rest,
177}
178
179#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
180#[serde(untagged)]
181pub enum ResponseModerationOutcome {
182 Result(ModerationResult),
183 Error(ModerationError),
184 Unknown(Value),
185}
186
187#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
188#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
189pub struct IncompleteDetails {
190 #[serde(skip_serializing_if = "Option::is_none")]
191 pub reason: Option<IncompleteReason>,
192 #[serde(default, flatten)]
193 pub rest: Rest,
194}
195
196#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
197#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
198pub struct ResponseUsage {
199 pub input_tokens: u32,
200 pub output_tokens: u32,
201 pub total_tokens: u32,
202 #[serde(skip_serializing_if = "Option::is_none")]
203 pub input_tokens_details: Option<ResponseInputTokensDetails>,
204 #[serde(skip_serializing_if = "Option::is_none")]
205 pub output_tokens_details: Option<ResponseOutputTokensDetails>,
206 #[serde(default, flatten)]
207 pub rest: Rest,
208}
209
210#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
211#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
212pub struct ResponseInputTokensDetails {
213 #[serde(default, skip_serializing_if = "Option::is_none")]
214 pub cache_write_tokens: Option<u32>,
215 #[serde(default, skip_serializing_if = "Option::is_none")]
216 pub cached_tokens: Option<u32>,
217 #[serde(default, flatten)]
218 pub rest: Rest,
219}
220
221#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
222#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
223pub struct ResponseOutputTokensDetails {
224 #[serde(skip_serializing_if = "Option::is_none")]
225 pub reasoning_tokens: Option<u32>,
226 #[serde(default, flatten)]
227 pub rest: Rest,
228}