Skip to main content

gproxy_protocol/openai/generate_content/responses/
response.rs

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}