Skip to main content

gproxy_protocol/wire/openai/
guardian.rs

1//! Guardian and guardian-classifier use the Codex Responses client wire request.
2//! Sources: samples/codex/codex-rs/codex-api/src/common.rs (ResponsesApiRequest),
3//! endpoint/responses.rs (ResponsesEndpoint), and protocol/src/models.rs.
4//! Private client items differ from the public Responses schema. Headers such
5//! as x-openai-subagent belong to the outer WireRequest, not this body.
6use crate::Rest;
7use serde::{Deserialize, Serialize};
8use std::collections::BTreeMap;
9
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
11#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
12#[derive(gproxy_protocol_macros::DeclaredFields)]
13pub struct ClientAdditionalTools {
14    #[serde(default, skip_serializing_if = "Option::is_none")]
15    pub id: Option<String>,
16    pub role: String,
17    pub tools: Vec<serde_json::Value>,
18
19    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
20    pub rest: Rest,
21}
22
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
24#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
25#[derive(gproxy_protocol_macros::DeclaredFields)]
26pub struct ClientMessage {
27    #[serde(default, skip_serializing_if = "Option::is_none")]
28    pub id: Option<String>,
29    pub role: String,
30    pub content: Vec<ContentItem>,
31
32    #[serde(default, skip_serializing_if = "Option::is_none")]
33    pub phase: Option<MessagePhase>,
34    #[serde(default, skip_serializing_if = "Option::is_none")]
35    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
36
37    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
38    pub rest: Rest,
39}
40
41#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
42#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
43#[derive(gproxy_protocol_macros::DeclaredFields)]
44pub struct ClientAgentMessage {
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub id: Option<String>,
47    pub author: String,
48    pub recipient: String,
49    pub content: Vec<AgentMessageInputContent>,
50    #[serde(default, skip_serializing_if = "Option::is_none")]
51    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
52
53    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
54    pub rest: Rest,
55}
56
57#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
58#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
59#[derive(gproxy_protocol_macros::DeclaredFields)]
60pub struct ClientReasoning {
61    #[serde(default, skip_serializing_if = "Option::is_none")]
62    pub id: Option<String>,
63    pub summary: Vec<ReasoningItemReasoningSummary>,
64    #[serde(
65        default,
66        deserialize_with = "super::responses::input::present_nullable",
67        skip_serializing_if = "Option::is_none"
68    )]
69    pub content: Option<Option<Vec<ReasoningItemContent>>>,
70    #[wire(required)]
71    #[serde(deserialize_with = "super::responses::input::required_nullable")]
72    pub encrypted_content: Option<String>,
73    #[serde(default, skip_serializing_if = "Option::is_none")]
74    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
75
76    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
77    pub rest: Rest,
78}
79
80#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
81#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
82#[derive(gproxy_protocol_macros::DeclaredFields)]
83pub struct ClientLocalShellCall {
84    #[serde(default, skip_serializing_if = "Option::is_none")]
85    pub id: Option<String>,
86
87    #[wire(required)]
88    #[serde(deserialize_with = "super::responses::input::required_nullable")]
89    pub call_id: Option<String>,
90    pub status: LocalShellStatus,
91    pub action: LocalShellAction,
92    #[serde(default, skip_serializing_if = "Option::is_none")]
93    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
94
95    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
96    pub rest: Rest,
97}
98
99#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
100#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
101#[derive(gproxy_protocol_macros::DeclaredFields)]
102pub struct ClientFunctionCall {
103    #[serde(default, skip_serializing_if = "Option::is_none")]
104    pub id: Option<String>,
105    pub name: String,
106    #[serde(default, skip_serializing_if = "Option::is_none")]
107    pub namespace: Option<String>,
108
109    pub arguments: String,
110    #[serde(default, skip_serializing_if = "Option::is_none")]
111    pub encrypted_function_args: Option<Vec<String>>,
112    pub call_id: String,
113    #[serde(default, skip_serializing_if = "Option::is_none")]
114    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
115
116    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
117    pub rest: Rest,
118}
119
120#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
121#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
122#[derive(gproxy_protocol_macros::DeclaredFields)]
123pub struct ClientToolSearchCall {
124    #[serde(default, skip_serializing_if = "Option::is_none")]
125    pub id: Option<String>,
126    #[wire(required)]
127    #[serde(deserialize_with = "super::responses::input::required_nullable")]
128    pub call_id: Option<String>,
129    #[serde(default, skip_serializing_if = "Option::is_none")]
130    pub status: Option<String>,
131    pub execution: String,
132    pub arguments: serde_json::Value,
133    #[serde(default, skip_serializing_if = "Option::is_none")]
134    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
135
136    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
137    pub rest: Rest,
138}
139
140#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
141#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
142#[derive(gproxy_protocol_macros::DeclaredFields)]
143pub struct ClientFunctionCallOutput {
144    #[serde(default, skip_serializing_if = "Option::is_none")]
145    pub id: Option<String>,
146    #[serde(default, skip_serializing_if = "Option::is_none")]
147    pub call_id: Option<String>,
148    #[serde(default, skip_serializing_if = "Option::is_none")]
149    pub name: Option<String>,
150    #[serde(default, skip_serializing_if = "Option::is_none")]
151    pub namespace: Option<String>,
152    pub output: FunctionCallOutputBody,
153    #[serde(default, skip_serializing_if = "Option::is_none")]
154    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
155
156    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
157    pub rest: Rest,
158}
159
160#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
161#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
162#[derive(gproxy_protocol_macros::DeclaredFields)]
163pub struct ClientCustomToolCall {
164    #[serde(default, skip_serializing_if = "Option::is_none")]
165    pub id: Option<String>,
166    #[serde(default, skip_serializing_if = "Option::is_none")]
167    pub status: Option<String>,
168
169    pub call_id: String,
170    pub name: String,
171    #[serde(default, skip_serializing_if = "Option::is_none")]
172    pub namespace: Option<String>,
173    pub input: String,
174    #[serde(default, skip_serializing_if = "Option::is_none")]
175    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
176
177    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
178    pub rest: Rest,
179}
180
181#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
182#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
183#[derive(gproxy_protocol_macros::DeclaredFields)]
184pub struct ClientCustomToolCallOutput {
185    #[serde(default, skip_serializing_if = "Option::is_none")]
186    pub id: Option<String>,
187    pub call_id: String,
188    #[serde(default, skip_serializing_if = "Option::is_none")]
189    pub name: Option<String>,
190    pub output: FunctionCallOutputBody,
191    #[serde(default, skip_serializing_if = "Option::is_none")]
192    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
193
194    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
195    pub rest: Rest,
196}
197
198#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
199#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
200#[derive(gproxy_protocol_macros::DeclaredFields)]
201pub struct ClientToolSearchOutput {
202    #[serde(default, skip_serializing_if = "Option::is_none")]
203    pub id: Option<String>,
204    #[wire(required)]
205    #[serde(deserialize_with = "super::responses::input::required_nullable")]
206    pub call_id: Option<String>,
207    pub status: String,
208    pub execution: String,
209    pub tools: Vec<serde_json::Value>,
210    #[serde(default, skip_serializing_if = "Option::is_none")]
211    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
212
213    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
214    pub rest: Rest,
215}
216
217#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
218#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
219#[derive(gproxy_protocol_macros::DeclaredFields)]
220pub struct ClientWebSearchCall {
221    #[serde(default, skip_serializing_if = "Option::is_none")]
222    pub id: Option<String>,
223    #[serde(default, skip_serializing_if = "Option::is_none")]
224    pub status: Option<String>,
225    #[serde(default, skip_serializing_if = "Option::is_none")]
226    pub action: Option<WebSearchAction>,
227    #[serde(default, skip_serializing_if = "Option::is_none")]
228    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
229
230    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
231    pub rest: Rest,
232}
233
234#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
235#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
236#[derive(gproxy_protocol_macros::DeclaredFields)]
237pub struct ClientImageGenerationCall {
238    #[serde(default, skip_serializing_if = "Option::is_none")]
239    pub id: Option<String>,
240    pub status: String,
241    #[serde(default, skip_serializing_if = "Option::is_none")]
242    pub revised_prompt: Option<String>,
243    pub result: String,
244    #[serde(default, skip_serializing_if = "Option::is_none")]
245    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
246
247    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
248    pub rest: Rest,
249}
250
251#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
252#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
253#[derive(gproxy_protocol_macros::DeclaredFields)]
254pub struct ClientCompaction {
255    #[serde(default, skip_serializing_if = "Option::is_none")]
256    pub id: Option<String>,
257    pub encrypted_content: String,
258    #[serde(default, skip_serializing_if = "Option::is_none")]
259    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
260
261    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
262    pub rest: Rest,
263}
264
265#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
266#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
267#[derive(gproxy_protocol_macros::DeclaredFields)]
268pub struct ClientConfigurationUpdate {
269    pub reasoning: ConfigurationReasoning,
270
271    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
272    pub rest: Rest,
273}
274
275#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
276#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
277#[derive(gproxy_protocol_macros::DeclaredFields)]
278pub struct ClientCompactionTrigger {
279    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
280    pub rest: Rest,
281}
282
283#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
284#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
285#[derive(gproxy_protocol_macros::DeclaredFields)]
286pub struct ClientContextCompaction {
287    #[serde(default, skip_serializing_if = "Option::is_none")]
288    pub id: Option<String>,
289    #[serde(default, skip_serializing_if = "Option::is_none")]
290    pub encrypted_content: Option<String>,
291    #[serde(default, skip_serializing_if = "Option::is_none")]
292    pub internal_chat_message_metadata_passthrough: Option<InternalChatMessageMetadataPassthrough>,
293
294    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
295    pub rest: Rest,
296}
297
298#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
299#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
300#[derive(gproxy_protocol_macros::DeclaredFields)]
301pub struct ResponseItemOther {
302    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
303    pub rest: Rest,
304}
305
306#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
307#[serde(tag = "type", rename_all = "snake_case")]
308#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
309#[derive(gproxy_protocol_macros::DeclaredFields)]
310pub enum ClientResponseItem {
311    AdditionalTools(ClientAdditionalTools),
312    Message(ClientMessage),
313    AgentMessage(ClientAgentMessage),
314    Reasoning(ClientReasoning),
315    LocalShellCall(ClientLocalShellCall),
316    FunctionCall(ClientFunctionCall),
317    ToolSearchCall(ClientToolSearchCall),
318    FunctionCallOutput(ClientFunctionCallOutput),
319    CustomToolCall(ClientCustomToolCall),
320    CustomToolCallOutput(ClientCustomToolCallOutput),
321    ToolSearchOutput(ClientToolSearchOutput),
322    WebSearchCall(ClientWebSearchCall),
323    ImageGenerationCall(ClientImageGenerationCall),
324    #[serde(alias = "compaction_summary")]
325    Compaction(ClientCompaction),
326    ConfigurationUpdate(ClientConfigurationUpdate),
327    CompactionTrigger(ClientCompactionTrigger),
328    ContextCompaction(ClientContextCompaction),
329    Other(ResponseItemOther),
330}
331
332#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
333#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
334#[derive(gproxy_protocol_macros::DeclaredFields)]
335pub struct ContentItemInputText {
336    pub text: String,
337
338    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
339    pub rest: Rest,
340}
341
342#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
343#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
344#[derive(gproxy_protocol_macros::DeclaredFields)]
345pub struct ContentItemInputImage {
346    pub image_url: String,
347    #[serde(default, skip_serializing_if = "Option::is_none")]
348    pub detail: Option<ImageDetail>,
349
350    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
351    pub rest: Rest,
352}
353
354#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
355#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
356#[derive(gproxy_protocol_macros::DeclaredFields)]
357pub struct ContentItemInputAudio {
358    pub audio_url: String,
359
360    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
361    pub rest: Rest,
362}
363
364#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
365#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
366#[derive(gproxy_protocol_macros::DeclaredFields)]
367pub struct ContentItemOutputText {
368    pub text: String,
369
370    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
371    pub rest: Rest,
372}
373
374#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
375#[serde(tag = "type", rename_all = "snake_case")]
376#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
377#[derive(gproxy_protocol_macros::DeclaredFields)]
378pub enum ContentItem {
379    InputText(ContentItemInputText),
380    InputImage(ContentItemInputImage),
381    InputAudio(ContentItemInputAudio),
382    OutputText(ContentItemOutputText),
383}
384
385#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
386#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
387#[derive(gproxy_protocol_macros::DeclaredFields)]
388pub struct AgentMessageInputContentInputText {
389    pub text: String,
390    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
391    pub rest: Rest,
392}
393
394#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
395#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
396#[derive(gproxy_protocol_macros::DeclaredFields)]
397pub struct AgentMessageInputContentEncryptedContent {
398    pub encrypted_content: String,
399    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
400    pub rest: Rest,
401}
402
403#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
404#[serde(tag = "type", rename_all = "snake_case")]
405#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
406#[derive(gproxy_protocol_macros::DeclaredFields)]
407pub enum AgentMessageInputContent {
408    InputText(AgentMessageInputContentInputText),
409    EncryptedContent(AgentMessageInputContentEncryptedContent),
410}
411
412#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
413#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
414#[derive(gproxy_protocol_macros::DeclaredFields)]
415pub struct WebSearchActionSearch {
416    #[serde(default, skip_serializing_if = "Option::is_none")]
417    pub query: Option<String>,
418    #[serde(default, skip_serializing_if = "Option::is_none")]
419    pub queries: Option<Vec<String>>,
420
421    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
422    pub rest: Rest,
423}
424
425#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
426#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
427#[derive(gproxy_protocol_macros::DeclaredFields)]
428pub struct WebSearchActionOpenPage {
429    #[serde(default, skip_serializing_if = "Option::is_none")]
430    pub url: Option<String>,
431
432    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
433    pub rest: Rest,
434}
435
436#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
437#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
438#[derive(gproxy_protocol_macros::DeclaredFields)]
439pub struct WebSearchActionFindInPage {
440    #[serde(default, skip_serializing_if = "Option::is_none")]
441    pub url: Option<String>,
442    #[serde(default, skip_serializing_if = "Option::is_none")]
443    pub pattern: Option<String>,
444
445    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
446    pub rest: Rest,
447}
448
449#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
450#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
451#[derive(gproxy_protocol_macros::DeclaredFields)]
452pub struct WebSearchActionOther {
453    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
454    pub rest: Rest,
455}
456
457#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
458#[serde(tag = "type", rename_all = "snake_case")]
459#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
460#[derive(gproxy_protocol_macros::DeclaredFields)]
461pub enum WebSearchAction {
462    Search(WebSearchActionSearch),
463    OpenPage(WebSearchActionOpenPage),
464    FindInPage(WebSearchActionFindInPage),
465    Other(WebSearchActionOther),
466}
467
468#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
469#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
470#[derive(gproxy_protocol_macros::DeclaredFields)]
471pub struct ReasoningItemReasoningSummarySummaryText {
472    pub text: String,
473    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
474    pub rest: Rest,
475}
476
477#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
478#[serde(tag = "type", rename_all = "snake_case")]
479#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
480#[derive(gproxy_protocol_macros::DeclaredFields)]
481pub enum ReasoningItemReasoningSummary {
482    SummaryText(ReasoningItemReasoningSummarySummaryText),
483}
484
485#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
486#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
487#[derive(gproxy_protocol_macros::DeclaredFields)]
488pub struct ReasoningItemContentReasoningText {
489    pub text: String,
490    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
491    pub rest: Rest,
492}
493
494#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
495#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
496#[derive(gproxy_protocol_macros::DeclaredFields)]
497pub struct ReasoningItemContentText {
498    pub text: String,
499    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
500    pub rest: Rest,
501}
502
503#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
504#[serde(tag = "type", rename_all = "snake_case")]
505#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
506#[derive(gproxy_protocol_macros::DeclaredFields)]
507pub enum ReasoningItemContent {
508    ReasoningText(ReasoningItemContentReasoningText),
509    Text(ReasoningItemContentText),
510}
511
512#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
513#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
514#[derive(gproxy_protocol_macros::DeclaredFields)]
515pub struct FunctionCallOutputContentItemInputText {
516    pub text: String,
517
518    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
519    pub rest: Rest,
520}
521
522#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
523#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
524#[derive(gproxy_protocol_macros::DeclaredFields)]
525pub struct FunctionCallOutputContentItemInputImage {
526    pub image_url: String,
527    #[serde(default, skip_serializing_if = "Option::is_none")]
528    pub detail: Option<ImageDetail>,
529
530    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
531    pub rest: Rest,
532}
533
534#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
535#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
536#[derive(gproxy_protocol_macros::DeclaredFields)]
537pub struct FunctionCallOutputContentItemInputAudio {
538    pub audio_url: String,
539
540    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
541    pub rest: Rest,
542}
543
544#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
545#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
546#[derive(gproxy_protocol_macros::DeclaredFields)]
547pub struct FunctionCallOutputContentItemEncryptedContent {
548    pub encrypted_content: String,
549
550    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
551    pub rest: Rest,
552}
553
554#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
555#[serde(tag = "type", rename_all = "snake_case")]
556#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
557#[derive(gproxy_protocol_macros::DeclaredFields)]
558pub enum FunctionCallOutputContentItem {
559    InputText(FunctionCallOutputContentItemInputText),
560    InputImage(FunctionCallOutputContentItemInputImage),
561    InputAudio(FunctionCallOutputContentItemInputAudio),
562    EncryptedContent(FunctionCallOutputContentItemEncryptedContent),
563}
564
565#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
566#[serde(rename_all = "snake_case")]
567#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
568#[derive(gproxy_protocol_macros::DeclaredFields)]
569pub enum ImageDetail {
570    Auto,
571    Low,
572    High,
573    Original,
574}
575
576#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
577#[serde(rename_all = "snake_case")]
578#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
579#[derive(gproxy_protocol_macros::DeclaredFields)]
580pub enum MessagePhase {
581    Commentary,
582
583    FinalAnswer,
584}
585
586#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
587#[serde(rename_all = "snake_case")]
588#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
589#[derive(gproxy_protocol_macros::DeclaredFields)]
590pub enum LocalShellStatus {
591    Completed,
592    InProgress,
593    Incomplete,
594}
595
596#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
597#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
598#[derive(gproxy_protocol_macros::DeclaredFields)]
599pub struct LocalShellExecAction {
600    pub command: Vec<String>,
601    #[wire(required)]
602    #[serde(deserialize_with = "super::responses::input::required_nullable")]
603    pub timeout_ms: Option<u64>,
604    #[wire(required)]
605    #[serde(deserialize_with = "super::responses::input::required_nullable")]
606    pub working_directory: Option<String>,
607    #[wire(required)]
608    #[serde(deserialize_with = "super::responses::input::required_nullable")]
609    pub env: Option<BTreeMap<String, String>>,
610    #[wire(required)]
611    #[serde(deserialize_with = "super::responses::input::required_nullable")]
612    pub user: Option<String>,
613
614    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
615    pub rest: Rest,
616}
617
618#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
619#[serde(tag = "type", rename_all = "snake_case")]
620#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
621#[derive(gproxy_protocol_macros::DeclaredFields)]
622pub enum LocalShellAction {
623    Exec(LocalShellExecAction),
624}
625
626#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
627#[serde(untagged)]
628#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
629#[derive(gproxy_protocol_macros::DeclaredFields)]
630pub enum FunctionCallOutputBody {
631    Text(String),
632    ContentItems(Vec<FunctionCallOutputContentItem>),
633}
634
635#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
636#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
637#[derive(gproxy_protocol_macros::DeclaredFields)]
638pub struct ConfigurationReasoning {
639    pub effort: String,
640    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
641    pub rest: Rest,
642}
643
644#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
645#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
646#[derive(gproxy_protocol_macros::DeclaredFields)]
647pub struct InternalChatMessageMetadataPassthrough {
648    #[serde(skip_serializing_if = "Option::is_none")]
649    pub turn_id: Option<String>,
650    #[serde(skip_serializing_if = "Option::is_none")]
651    pub create_time: Option<serde_json::Number>,
652    #[serde(skip_serializing_if = "Option::is_none")]
653    pub content_item_kinds: Option<Vec<String>>,
654    #[serde(skip_serializing_if = "Option::is_none")]
655    pub cell_id: Option<String>,
656    #[serde(skip_serializing_if = "Option::is_none")]
657    pub executed_tool_calls: Option<Vec<ExecutedToolCall>>,
658    #[serde(skip_serializing_if = "Option::is_none")]
659    pub tool_calls_complete: Option<bool>,
660    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
661    pub rest: Rest,
662}
663
664#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
665#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
666#[derive(gproxy_protocol_macros::DeclaredFields)]
667pub struct ExecutedToolCall {
668    pub name: String,
669    pub arguments: serde_json::Value,
670    #[serde(skip_serializing_if = "Option::is_none")]
671    pub tool_result_sources: Option<ToolResultSources>,
672    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
673    pub rest: Rest,
674}
675
676#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
677#[serde(untagged)]
678#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
679#[derive(gproxy_protocol_macros::DeclaredFields)]
680pub enum ToolResultSources {
681    Sources(Vec<ToolResultSource>),
682    ParseFailed(ParseFailed),
683}
684
685#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
686#[serde(rename_all = "snake_case")]
687#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
688#[derive(gproxy_protocol_macros::DeclaredFields)]
689pub enum ParseFailed {
690    ParseFailed,
691}
692
693#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
694#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
695#[derive(gproxy_protocol_macros::DeclaredFields)]
696pub struct ToolResultSource {
697    #[serde(rename = "type")]
698    pub type_: String,
699    pub id: String,
700    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
701    pub rest: Rest,
702}
703
704#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
705#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
706#[derive(gproxy_protocol_macros::DeclaredFields)]
707pub struct Reasoning {
708    #[serde(skip_serializing_if = "Option::is_none")]
709    pub effort: Option<String>,
710    #[serde(skip_serializing_if = "Option::is_none")]
711    pub summary: Option<ReasoningSummary>,
712    #[serde(skip_serializing_if = "Option::is_none")]
713    pub context: Option<ReasoningContext>,
714    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
715    pub rest: Rest,
716}
717
718#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
719#[serde(rename_all = "snake_case")]
720#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
721#[derive(gproxy_protocol_macros::DeclaredFields)]
722pub enum ReasoningSummary {
723    Auto,
724    Concise,
725    Detailed,
726    None,
727}
728
729#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
730#[serde(rename_all = "snake_case")]
731#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
732#[derive(gproxy_protocol_macros::DeclaredFields)]
733pub enum ReasoningContext {
734    Auto,
735    CurrentTurn,
736    AllTurns,
737}
738
739#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
740#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
741#[derive(gproxy_protocol_macros::DeclaredFields)]
742pub struct ClientTextControls {
743    #[serde(skip_serializing_if = "Option::is_none")]
744    pub verbosity: Option<ClientVerbosity>,
745    #[serde(skip_serializing_if = "Option::is_none")]
746    pub format: Option<ClientTextFormat>,
747    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
748    pub rest: Rest,
749}
750
751#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
752#[serde(rename_all = "snake_case")]
753#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
754#[derive(gproxy_protocol_macros::DeclaredFields)]
755pub enum ClientVerbosity {
756    Low,
757    Medium,
758    High,
759}
760
761#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
762#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
763#[derive(gproxy_protocol_macros::DeclaredFields)]
764pub struct ClientTextFormat {
765    #[serde(rename = "type")]
766    pub type_: ClientTextFormatType,
767    pub strict: bool,
768    pub schema: serde_json::Value,
769    pub name: String,
770    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
771    pub rest: Rest,
772}
773
774#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
775#[serde(rename_all = "snake_case")]
776#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
777#[derive(gproxy_protocol_macros::DeclaredFields)]
778pub enum ClientTextFormatType {
779    JsonSchema,
780}
781
782#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
783#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
784#[derive(gproxy_protocol_macros::DeclaredFields)]
785pub struct ClientStreamOptions {
786    pub reasoning_summary_delivery: ReasoningSummaryDelivery,
787    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
788    pub rest: Rest,
789}
790
791#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
792#[serde(rename_all = "snake_case")]
793#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
794#[derive(gproxy_protocol_macros::DeclaredFields)]
795pub enum ReasoningSummaryDelivery {
796    SequentialCutoff,
797}
798
799#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
800#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
801#[derive(gproxy_protocol_macros::DeclaredFields)]
802pub struct AccessPrograms {
803    pub cyber: CyberAccessProgram,
804    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
805    pub rest: Rest,
806}
807
808#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
809#[serde(rename_all = "snake_case")]
810#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
811#[derive(gproxy_protocol_macros::DeclaredFields)]
812pub enum CyberAccessProgram {
813    Standard,
814    DaybreakBlue,
815    DaybreakRed,
816}
817
818#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
819#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
820#[derive(gproxy_protocol_macros::DeclaredFields)]
821pub struct GuardianRequestBody {
822    pub model: String,
823    #[serde(default, skip_serializing_if = "String::is_empty")]
824    pub instructions: String,
825    pub input: Vec<ClientResponseItem>,
826    #[serde(
827        default,
828        deserialize_with = "super::responses::input::present_nullable",
829        skip_serializing_if = "Option::is_none"
830    )]
831    pub tools: Option<Option<serde_json::Value>>,
832    pub tool_choice: String,
833    pub parallel_tool_calls: bool,
834    #[wire(required)]
835    #[serde(deserialize_with = "super::responses::input::required_nullable")]
836    pub reasoning: Option<Reasoning>,
837    pub store: bool,
838    pub stream: bool,
839    #[serde(skip_serializing_if = "Option::is_none")]
840    pub stream_options: Option<ClientStreamOptions>,
841    pub include: Vec<String>,
842    #[serde(skip_serializing_if = "Option::is_none")]
843    pub service_tier: Option<String>,
844    #[serde(skip_serializing_if = "Option::is_none")]
845    pub prompt_cache_key: Option<String>,
846    #[serde(skip_serializing_if = "Option::is_none")]
847    pub text: Option<ClientTextControls>,
848    #[serde(skip_serializing_if = "Option::is_none")]
849    pub client_metadata: Option<BTreeMap<String, String>>,
850    #[serde(skip_serializing_if = "Option::is_none")]
851    pub access_programs: Option<AccessPrograms>,
852    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
853    pub rest: Rest,
854}
855
856pub type GuardianRequest = crate::WireRequest<GuardianRequestBody>;
857pub type GuardianClassifierRequest = GuardianRequest;
858pub type GuardianResponse = crate::WireResponse<crate::connection::ByteStream>;
859pub type GuardianClassifierResponse = GuardianResponse;
860pub type GuardianEvent = super::responses::stream::StreamEvent;