Skip to main content

gproxy_protocol/wire/openai/
models.rs

1use serde::{Deserialize, Serialize};
2
3use crate::Rest;
4
5/// Query/path request shapes for `GET /models` and `GET /models/{model}`.
6/// Source: `upstream_docs/openai/docs/List models.md` and `Retrieve model.md`.
7/// Extended catalog fields follow `samples/codex/codex-rs/protocol/src/openai_models.rs`.
8pub type ListModelsRequest = crate::WireRequest<()>;
9
10#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(rename_all = "snake_case")]
12#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
13#[derive(gproxy_protocol_macros::DeclaredFields)]
14#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
15pub enum ListObject {
16    #[default]
17    List,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
21#[serde(rename_all = "snake_case")]
22#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
23#[derive(gproxy_protocol_macros::DeclaredFields)]
24#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
25pub enum ModelObject {
26    Model,
27}
28
29pub type GetModelRequest = crate::WireRequest<()>;
30
31#[derive(
32    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
33)]
34#[serde(rename_all = "snake_case")]
35#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
36#[derive(gproxy_protocol_macros::DeclaredFields)]
37#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
38pub struct ListModelsResponseBody {
39    #[serde(default)]
40    pub data: Vec<Model>,
41    #[serde(default)]
42    pub object: ListObject,
43    #[serde(default, skip_serializing_if = "Option::is_none")]
44    pub models: Option<Vec<Model>>,
45    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
46    pub rest: Rest,
47}
48
49pub type ListModelsResponse = crate::WireResponse<ListModelsResponseBody>;
50pub type GetModelResponse = crate::WireResponse<Model>;
51
52#[derive(
53    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
54)]
55#[serde(rename_all = "snake_case")]
56#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
57#[derive(gproxy_protocol_macros::DeclaredFields)]
58#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
59pub struct Model {
60    #[serde(default, skip_serializing_if = "String::is_empty")]
61    pub id: String,
62    #[serde(default, skip_serializing_if = "Option::is_none")]
63    pub slug: Option<String>,
64    /// Some compatible catalogs do not report a creation timestamp.
65    #[wire(required)]
66    #[cfg_attr(feature = "schema", schemars(extend("x-gproxy-required" = true)))]
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub created: Option<i64>,
69    #[wire(required)]
70    #[cfg_attr(feature = "schema", schemars(extend("x-gproxy-required" = true)))]
71    #[serde(default, skip_serializing_if = "Option::is_none")]
72    pub object: Option<ModelObject>,
73    #[wire(required)]
74    #[cfg_attr(feature = "schema", schemars(extend("x-gproxy-required" = true)))]
75    #[serde(default, skip_serializing_if = "Option::is_none")]
76    pub owned_by: Option<String>,
77
78    // GPROXY model extensions, matching the v3 OpenAI model contract.
79    #[serde(default, skip_serializing_if = "Option::is_none")]
80    pub display_name: Option<String>,
81    #[serde(default, skip_serializing_if = "Option::is_none")]
82    pub description: Option<String>,
83    #[serde(default, skip_serializing_if = "Option::is_none")]
84    pub instructions: Option<String>,
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub context_window: Option<u64>,
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub max_context_window: Option<u64>,
89    #[serde(default, skip_serializing_if = "Option::is_none")]
90    pub max_output_tokens: Option<u64>,
91    #[serde(default, skip_serializing_if = "Option::is_none")]
92    pub thinking_supported: Option<bool>,
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub input_modalities: Option<Vec<String>>,
95    #[serde(default, skip_serializing_if = "Option::is_none")]
96    pub output_modalities: Option<Vec<String>>,
97    #[serde(default, skip_serializing_if = "Option::is_none")]
98    pub supported_parameters: Option<Vec<String>>,
99    #[serde(
100        default,
101        deserialize_with = "reasoning_levels",
102        skip_serializing_if = "Option::is_none"
103    )]
104    pub supported_reasoning_levels: Option<Vec<ModelReasoningLevel>>,
105    #[serde(default, skip_serializing_if = "Option::is_none")]
106    pub default_reasoning_level: Option<ModelReasoningEffort>,
107    #[serde(default, skip_serializing_if = "Option::is_none")]
108    pub service_tiers: Option<Vec<ModelServiceTier>>,
109    #[serde(default, skip_serializing_if = "Option::is_none")]
110    pub default_service_tier: Option<String>,
111    #[serde(default, skip_serializing_if = "Option::is_none")]
112    pub generation_methods: Option<Vec<String>>,
113    #[serde(default, skip_serializing_if = "Option::is_none")]
114    pub supported_actions: Option<Vec<String>>,
115
116    // Codex model catalog extensions.
117    #[serde(default, skip_serializing_if = "Option::is_none")]
118    pub guardian: Option<GuardianModelPolicy>,
119    #[serde(default, skip_serializing_if = "Option::is_none")]
120    pub shell_type: Option<ConfigShellToolType>,
121    #[serde(default, skip_serializing_if = "Option::is_none")]
122    pub visibility: Option<ModelVisibility>,
123    #[serde(default, skip_serializing_if = "Option::is_none")]
124    pub supported_in_api: Option<bool>,
125    #[serde(default, skip_serializing_if = "Option::is_none")]
126    pub priority: Option<i32>,
127    #[serde(default, skip_serializing_if = "Option::is_none")]
128    pub additional_speed_tiers: Option<Vec<String>>,
129    #[serde(default, skip_serializing_if = "Option::is_none")]
130    pub available_access_programs: Option<ModelAccessPrograms>,
131    #[serde(default, skip_serializing_if = "Option::is_none")]
132    pub availability_nux: Option<ModelAvailabilityNux>,
133    #[serde(default, skip_serializing_if = "Option::is_none")]
134    pub upgrade: Option<ModelInfoUpgrade>,
135    #[serde(default, skip_serializing_if = "Option::is_none")]
136    pub model_messages: Option<ModelMessages>,
137    #[serde(default, skip_serializing_if = "Option::is_none")]
138    pub include_skills_usage_instructions: Option<bool>,
139    #[serde(default, skip_serializing_if = "Option::is_none")]
140    pub include_plugin_usage_instructions: Option<bool>,
141    #[serde(default, skip_serializing_if = "Option::is_none")]
142    pub include_apps_usage_instructions: Option<bool>,
143    #[serde(default, skip_serializing_if = "Option::is_none")]
144    pub supports_reasoning_summary_parameter: Option<bool>,
145    #[serde(default, skip_serializing_if = "Option::is_none")]
146    pub default_reasoning_summary: Option<ModelReasoningSummary>,
147    #[serde(default, skip_serializing_if = "Option::is_none")]
148    pub support_verbosity: Option<bool>,
149    #[serde(default, skip_serializing_if = "Option::is_none")]
150    pub default_verbosity: Option<super::responses::TextVerbosity>,
151    #[serde(default, skip_serializing_if = "Option::is_none")]
152    pub apply_patch_tool_type: Option<ApplyPatchToolType>,
153    #[serde(default, skip_serializing_if = "Option::is_none")]
154    pub web_search_tool_type: Option<WebSearchToolType>,
155    #[serde(default, skip_serializing_if = "Option::is_none")]
156    pub truncation_policy: Option<TruncationPolicyConfig>,
157    #[serde(default, skip_serializing_if = "Option::is_none")]
158    pub supports_image_detail_original: Option<bool>,
159    #[serde(default, skip_serializing_if = "Option::is_none")]
160    pub auto_compact_token_limit: Option<i64>,
161    #[serde(default, skip_serializing_if = "Option::is_none")]
162    pub comp_hash: Option<String>,
163    #[serde(default, skip_serializing_if = "Option::is_none")]
164    pub effective_context_window_percent: Option<i64>,
165    #[serde(default, skip_serializing_if = "Option::is_none")]
166    pub experimental_supported_tools: Option<Vec<String>>,
167    #[serde(default, skip_serializing_if = "Option::is_none")]
168    pub supports_search_tool: Option<bool>,
169    #[serde(default, skip_serializing_if = "Option::is_none")]
170    pub supports_experimental_context: Option<bool>,
171    #[serde(default, skip_serializing_if = "Option::is_none")]
172    pub use_responses_lite: Option<bool>,
173    #[serde(default, skip_serializing_if = "Option::is_none")]
174    pub supports_reasoning_effort_updates: Option<bool>,
175    #[serde(default, skip_serializing_if = "Option::is_none")]
176    pub node_repl_auto_review_required: Option<bool>,
177    #[serde(default, skip_serializing_if = "Option::is_none")]
178    pub node_repl_disabled: Option<bool>,
179    #[serde(default, skip_serializing_if = "Option::is_none")]
180    pub auto_review_model_override: Option<String>,
181    #[serde(default, skip_serializing_if = "Option::is_none")]
182    pub model_specialty: Option<String>,
183    #[serde(
184        default,
185        deserialize_with = "optional_selector",
186        skip_serializing_if = "Option::is_none"
187    )]
188    pub tool_mode: Option<ToolMode>,
189    #[serde(
190        default,
191        deserialize_with = "optional_selector",
192        skip_serializing_if = "Option::is_none"
193    )]
194    pub multi_agent_version: Option<MultiAgentVersion>,
195    #[serde(default, skip_serializing_if = "Option::is_none")]
196    pub multi_agent_reasoning_effort: Option<ModelReasoningEffort>,
197    #[serde(default, skip_serializing_if = "Option::is_none")]
198    pub base_instructions: Option<String>,
199    // Fields also advertised by the bundled Codex catalog.
200    #[serde(default, skip_serializing_if = "Option::is_none")]
201    pub prefer_websockets: Option<bool>,
202    #[serde(default, skip_serializing_if = "Option::is_none")]
203    pub supports_parallel_tool_calls: Option<bool>,
204    #[serde(default, skip_serializing_if = "Option::is_none")]
205    pub supports_reasoning_summaries: Option<bool>,
206    #[serde(default, skip_serializing_if = "Option::is_none")]
207    pub requires_sandboxed_review: Option<bool>,
208    #[serde(default, skip_serializing_if = "Option::is_none")]
209    pub available_in_plans: Option<Vec<String>>,
210    #[serde(default, skip_serializing_if = "Option::is_none")]
211    pub minimal_client_version: Option<ClientVersion>,
212    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
213    pub rest: Rest,
214}
215
216#[derive(
217    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
218)]
219#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
220pub struct ModelReasoningLevel {
221    pub effort: ModelReasoningEffort,
222    pub description: String,
223}
224#[derive(
225    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
226)]
227#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
228pub struct ModelServiceTier {
229    pub id: String,
230    pub name: String,
231    pub description: String,
232}
233
234fn reasoning_levels<'de, D>(deserializer: D) -> Result<Option<Vec<ModelReasoningLevel>>, D::Error>
235where
236    D: serde::Deserializer<'de>,
237{
238    #[derive(Deserialize)]
239    #[serde(untagged)]
240    enum Level {
241        Preset(ModelReasoningLevel),
242        Effort(ModelReasoningEffort),
243    }
244    Ok(
245        Option::<Vec<Level>>::deserialize(deserializer)?.map(|levels| {
246            levels
247                .into_iter()
248                .map(|level| match level {
249                    Level::Preset(preset) => preset,
250                    Level::Effort(effort) => ModelReasoningLevel {
251                        effort,
252                        description: String::new(),
253                    },
254                })
255                .collect()
256        }),
257    )
258}
259
260#[derive(
261    Debug,
262    Clone,
263    Default,
264    PartialEq,
265    Eq,
266    Serialize,
267    Deserialize,
268    gproxy_protocol_macros::DeclaredFields,
269)]
270#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
271pub struct ModelMessages {
272    #[serde(default, skip_serializing_if = "Option::is_none")]
273    pub content_filter_guidance: Option<String>,
274    #[serde(default, skip_serializing_if = "Option::is_none")]
275    pub persistent_instructions: Option<String>,
276    #[serde(default, skip_serializing_if = "Option::is_none")]
277    pub tools: Option<ToolMessages>,
278    #[serde(default, skip_serializing_if = "Option::is_none")]
279    pub instructions_template: Option<String>,
280    #[serde(default, skip_serializing_if = "Option::is_none")]
281    pub instructions_variables: Option<ModelInstructionsVariables>,
282    #[serde(default, skip_serializing_if = "Option::is_none")]
283    pub approvals: Option<ApprovalMessages>,
284    #[serde(default, skip_serializing_if = "Option::is_none")]
285    pub collaboration_modes: Option<CollaborationModeMessages>,
286    #[serde(default, skip_serializing_if = "Option::is_none")]
287    pub auto_review: Option<AutoReviewMessages>,
288    #[serde(default, skip_serializing_if = "Option::is_none")]
289    pub permissions: Option<PermissionMessages>,
290    #[serde(default, skip_serializing_if = "Option::is_none")]
291    pub multi_agent: Option<MultiAgentMessages>,
292    #[serde(default, skip_serializing_if = "Option::is_none")]
293    pub token_budget: Option<ModelTokenBudgetConfig>,
294    #[serde(default, skip_serializing_if = "Option::is_none")]
295    pub guardian_v2: Option<GuardianV2ModelConfig>,
296    #[serde(default, skip_serializing_if = "Option::is_none")]
297    pub confirmation_policies: Option<ConfirmationPolicies>,
298    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
299    pub rest: Rest,
300}
301
302#[derive(
303    Debug,
304    Clone,
305    Default,
306    PartialEq,
307    Eq,
308    Serialize,
309    Deserialize,
310    gproxy_protocol_macros::DeclaredFields,
311)]
312#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
313pub struct ConfirmationPolicies {
314    #[serde(default, skip_serializing_if = "Option::is_none")]
315    pub browser_use: Option<String>,
316    #[serde(default, skip_serializing_if = "Option::is_none")]
317    pub computer_use: Option<String>,
318    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
319    pub rest: Rest,
320}
321
322#[derive(
323    Debug,
324    Clone,
325    Default,
326    PartialEq,
327    Eq,
328    Serialize,
329    Deserialize,
330    gproxy_protocol_macros::DeclaredFields,
331)]
332#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
333pub struct ToolMessages {
334    #[serde(default, skip_serializing_if = "Option::is_none")]
335    pub functions_namespace_functions_description_prefixes:
336        Option<std::collections::BTreeMap<String, String>>,
337    #[serde(default, skip_serializing_if = "Option::is_none")]
338    pub indirect_description_prefixes: Option<IndirectDescriptionPrefixes>,
339    #[serde(default, skip_serializing_if = "Option::is_none")]
340    pub send_user_message_async: Option<ToolMessage>,
341    #[serde(default, skip_serializing_if = "Option::is_none")]
342    pub multi_agent: Option<MultiAgentToolMessages>,
343    #[serde(default, skip_serializing_if = "Option::is_none")]
344    pub code_mode: Option<CodeModeToolMessages>,
345    #[serde(default, skip_serializing_if = "Option::is_none")]
346    pub mcp_resources: Option<McpResourceToolMessages>,
347    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
348    pub rest: Rest,
349}
350
351#[derive(
352    Debug,
353    Clone,
354    Default,
355    PartialEq,
356    Eq,
357    Serialize,
358    Deserialize,
359    gproxy_protocol_macros::DeclaredFields,
360)]
361#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
362pub struct IndirectDescriptionPrefixes {
363    #[serde(default, skip_serializing_if = "Option::is_none")]
364    pub namespaces: Option<std::collections::BTreeMap<String, String>>,
365    #[serde(default, skip_serializing_if = "Option::is_none")]
366    pub mcp_servers: Option<std::collections::BTreeMap<String, String>>,
367    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
368    pub rest: Rest,
369}
370
371#[derive(
372    Debug,
373    Clone,
374    Default,
375    PartialEq,
376    Eq,
377    Serialize,
378    Deserialize,
379    gproxy_protocol_macros::DeclaredFields,
380)]
381#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
382pub struct ToolMessage {
383    #[serde(default, skip_serializing_if = "Option::is_none")]
384    pub description: Option<String>,
385    #[serde(default, skip_serializing_if = "Option::is_none")]
386    pub parameters: Option<String>,
387    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
388    pub rest: Rest,
389}
390
391#[derive(
392    Debug,
393    Clone,
394    Default,
395    PartialEq,
396    Eq,
397    Serialize,
398    Deserialize,
399    gproxy_protocol_macros::DeclaredFields,
400)]
401#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
402pub struct MultiAgentToolMessages {
403    #[serde(default, skip_serializing_if = "Option::is_none")]
404    pub spawn_agent: Option<ToolMessage>,
405    #[serde(default, skip_serializing_if = "Option::is_none")]
406    pub send_message: Option<ToolMessage>,
407    #[serde(default, skip_serializing_if = "Option::is_none")]
408    pub followup_task: Option<ToolMessage>,
409    #[serde(default, skip_serializing_if = "Option::is_none")]
410    pub wait_agent: Option<ToolMessage>,
411    #[serde(default, skip_serializing_if = "Option::is_none")]
412    pub interrupt_agent: Option<ToolMessage>,
413    #[serde(default, skip_serializing_if = "Option::is_none")]
414    pub list_agents: Option<ToolMessage>,
415    #[serde(default, skip_serializing_if = "Option::is_none")]
416    pub create_channel: Option<ToolMessage>,
417    #[serde(default, skip_serializing_if = "Option::is_none")]
418    pub get_channels: Option<ToolMessage>,
419    #[serde(default, skip_serializing_if = "Option::is_none")]
420    pub list_threads: Option<ToolMessage>,
421    #[serde(default, skip_serializing_if = "Option::is_none")]
422    pub search_posts: Option<ToolMessage>,
423    #[serde(default, skip_serializing_if = "Option::is_none")]
424    pub read_thread: Option<ToolMessage>,
425    #[serde(default, skip_serializing_if = "Option::is_none")]
426    pub read_post: Option<ToolMessage>,
427    #[serde(default, skip_serializing_if = "Option::is_none")]
428    pub subscribe: Option<ToolMessage>,
429    #[serde(default, skip_serializing_if = "Option::is_none")]
430    pub unsubscribe: Option<ToolMessage>,
431    #[serde(default, skip_serializing_if = "Option::is_none")]
432    pub post: Option<ToolMessage>,
433    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
434    pub rest: Rest,
435}
436
437#[derive(
438    Debug,
439    Clone,
440    Default,
441    PartialEq,
442    Eq,
443    Serialize,
444    Deserialize,
445    gproxy_protocol_macros::DeclaredFields,
446)]
447#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
448pub struct McpResourceToolMessages {
449    #[serde(default, skip_serializing_if = "Option::is_none")]
450    pub list_mcp_resources: Option<ToolMessage>,
451    #[serde(default, skip_serializing_if = "Option::is_none")]
452    pub list_mcp_resource_templates: Option<ToolMessage>,
453    #[serde(default, skip_serializing_if = "Option::is_none")]
454    pub read_mcp_resource: Option<ToolMessage>,
455    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
456    pub rest: Rest,
457}
458
459#[derive(
460    Debug,
461    Clone,
462    Default,
463    PartialEq,
464    Eq,
465    Serialize,
466    Deserialize,
467    gproxy_protocol_macros::DeclaredFields,
468)]
469#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
470pub struct CodeModeToolMessages {
471    #[serde(default, skip_serializing_if = "Option::is_none")]
472    pub exec: Option<ToolMessage>,
473    #[serde(default, skip_serializing_if = "Option::is_none")]
474    pub wait: Option<ToolMessage>,
475    #[serde(default, skip_serializing_if = "Option::is_none")]
476    pub deferred_nested_tools_guidance: Option<String>,
477    #[serde(default, skip_serializing_if = "Option::is_none")]
478    pub mcp_typescript_preamble: Option<String>,
479    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
480    pub rest: Rest,
481}
482
483#[derive(
484    Debug,
485    Clone,
486    Default,
487    PartialEq,
488    Eq,
489    Serialize,
490    Deserialize,
491    gproxy_protocol_macros::DeclaredFields,
492)]
493#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
494pub struct ModelTokenBudgetConfig {
495    #[serde(default)]
496    pub enabled: bool,
497    #[serde(default)]
498    pub use_history_notes_extension: bool,
499    pub reminder_threshold_tokens: i64,
500    pub reminder_message_template: String,
501    pub guidance_message: String,
502    pub auto_compact_fallback_prompt: String,
503    pub auto_compact_fallback_buffer_tokens: i64,
504    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
505    pub rest: Rest,
506}
507
508#[derive(
509    Debug,
510    Clone,
511    Default,
512    PartialEq,
513    Eq,
514    Serialize,
515    Deserialize,
516    gproxy_protocol_macros::DeclaredFields,
517)]
518#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
519pub struct ApprovalMessages {
520    #[serde(default, skip_serializing_if = "Option::is_none")]
521    pub on_request: Option<String>,
522    #[serde(default, skip_serializing_if = "Option::is_none")]
523    pub on_request_auto_review: Option<String>,
524    #[serde(default, skip_serializing_if = "Option::is_none")]
525    pub never: Option<String>,
526    #[serde(default, skip_serializing_if = "Option::is_none")]
527    pub unless_trusted: Option<String>,
528    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
529    pub rest: Rest,
530}
531
532#[derive(
533    Debug,
534    Clone,
535    Default,
536    PartialEq,
537    Eq,
538    Serialize,
539    Deserialize,
540    gproxy_protocol_macros::DeclaredFields,
541)]
542#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
543pub struct CollaborationModeMessages {
544    #[serde(default, skip_serializing_if = "Option::is_none")]
545    pub default: Option<String>,
546    #[serde(default, skip_serializing_if = "Option::is_none")]
547    pub plan: Option<String>,
548    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
549    pub rest: Rest,
550}
551
552#[derive(
553    Debug,
554    Clone,
555    Default,
556    PartialEq,
557    Eq,
558    Serialize,
559    Deserialize,
560    gproxy_protocol_macros::DeclaredFields,
561)]
562#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
563pub struct AutoReviewMessages {
564    #[serde(default, skip_serializing_if = "Option::is_none")]
565    pub policy: Option<String>,
566    #[serde(default, skip_serializing_if = "Option::is_none")]
567    pub policy_template: Option<String>,
568    #[serde(default, skip_serializing_if = "Option::is_none")]
569    pub node_repl_policy: Option<String>,
570    #[serde(default, skip_serializing_if = "Option::is_none")]
571    pub rejection_instructions: Option<String>,
572    #[serde(default, skip_serializing_if = "Option::is_none")]
573    pub timeout_instructions: Option<String>,
574    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
575    pub rest: Rest,
576}
577
578#[derive(
579    Debug,
580    Clone,
581    Default,
582    PartialEq,
583    Eq,
584    Serialize,
585    Deserialize,
586    gproxy_protocol_macros::DeclaredFields,
587)]
588#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
589pub struct PermissionMessages {
590    #[serde(default, skip_serializing_if = "Option::is_none")]
591    pub danger_full_access: Option<String>,
592    #[serde(default, skip_serializing_if = "Option::is_none")]
593    pub workspace_write: Option<String>,
594    #[serde(default, skip_serializing_if = "Option::is_none")]
595    pub read_only: Option<String>,
596    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
597    pub rest: Rest,
598}
599
600#[derive(
601    Debug,
602    Clone,
603    Default,
604    PartialEq,
605    Eq,
606    Serialize,
607    Deserialize,
608    gproxy_protocol_macros::DeclaredFields,
609)]
610#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
611pub struct MultiAgentMessages {
612    #[serde(default, skip_serializing_if = "Option::is_none")]
613    pub role: Option<MultiAgentRoleMessages>,
614    #[serde(default, skip_serializing_if = "Option::is_none")]
615    pub mode: Option<MultiAgentModeMessages>,
616    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
617    pub rest: Rest,
618}
619
620#[derive(
621    Debug,
622    Clone,
623    Default,
624    PartialEq,
625    Eq,
626    Serialize,
627    Deserialize,
628    gproxy_protocol_macros::DeclaredFields,
629)]
630#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
631pub struct MultiAgentRoleMessages {
632    #[serde(default, skip_serializing_if = "Option::is_none")]
633    pub root: Option<String>,
634    #[serde(default, skip_serializing_if = "Option::is_none")]
635    pub subagent: Option<String>,
636    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
637    pub rest: Rest,
638}
639
640#[derive(
641    Debug,
642    Clone,
643    Default,
644    PartialEq,
645    Eq,
646    Serialize,
647    Deserialize,
648    gproxy_protocol_macros::DeclaredFields,
649)]
650#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
651pub struct MultiAgentModeMessages {
652    #[serde(default, skip_serializing_if = "Option::is_none")]
653    pub explicit: Option<String>,
654    #[serde(default, skip_serializing_if = "Option::is_none")]
655    pub proactive: Option<String>,
656    #[serde(default, skip_serializing_if = "Option::is_none")]
657    pub hint_text: Option<String>,
658    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
659    pub rest: Rest,
660}
661
662#[derive(
663    Debug,
664    Clone,
665    Default,
666    PartialEq,
667    Eq,
668    Serialize,
669    Deserialize,
670    gproxy_protocol_macros::DeclaredFields,
671)]
672#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
673pub struct ModelInstructionsVariables {
674    #[serde(default, skip_serializing_if = "Option::is_none")]
675    pub personality_default: Option<String>,
676    #[serde(default, skip_serializing_if = "Option::is_none")]
677    pub personality_friendly: Option<String>,
678    #[serde(default, skip_serializing_if = "Option::is_none")]
679    pub personality_pragmatic: Option<String>,
680    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
681    pub rest: Rest,
682}
683
684#[derive(
685    Debug,
686    Clone,
687    Default,
688    PartialEq,
689    Eq,
690    Serialize,
691    Deserialize,
692    gproxy_protocol_macros::DeclaredFields,
693)]
694#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
695pub struct ModelInfoUpgrade {
696    pub model: String,
697    pub migration_markdown: String,
698    #[serde(default, skip_serializing_if = "Option::is_none")]
699    pub retirement_at: Option<String>,
700    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
701    pub rest: Rest,
702}
703
704#[derive(
705    Debug,
706    Clone,
707    Default,
708    PartialEq,
709    Eq,
710    Serialize,
711    Deserialize,
712    gproxy_protocol_macros::DeclaredFields,
713)]
714#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
715pub struct ModelAvailabilityNux {
716    pub message: String,
717    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
718    pub rest: Rest,
719}
720
721#[derive(
722    Debug,
723    Clone,
724    Default,
725    PartialEq,
726    Eq,
727    Serialize,
728    Deserialize,
729    gproxy_protocol_macros::DeclaredFields,
730)]
731#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
732pub struct GuardianModelPolicy {
733    #[serde(default, skip_serializing_if = "Option::is_none")]
734    pub computer_use: Option<GuardianReviewMode>,
735    #[serde(default, skip_serializing_if = "Option::is_none")]
736    pub shell: Option<GuardianReviewMode>,
737    #[serde(default, skip_serializing_if = "Option::is_none")]
738    pub file_changes: Option<GuardianReviewMode>,
739    #[serde(default, skip_serializing_if = "Option::is_none")]
740    pub mcp: Option<GuardianReviewMode>,
741    #[serde(default, skip_serializing_if = "Option::is_none")]
742    pub network: Option<GuardianReviewMode>,
743    #[serde(default, skip_serializing_if = "Option::is_none")]
744    pub permissions: Option<GuardianReviewMode>,
745    #[serde(default, skip_serializing_if = "Option::is_none")]
746    pub other_tools: Option<GuardianReviewMode>,
747    #[serde(default, skip_serializing_if = "Option::is_none")]
748    pub unscored_action: Option<GuardianUnscoredAction>,
749    #[serde(default, skip_serializing_if = "Option::is_none")]
750    pub initial_cua_call: Option<bool>,
751    #[serde(default, skip_serializing_if = "Option::is_none")]
752    pub sandboxed_exec_commands: Option<bool>,
753    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
754    pub rest: Rest,
755}
756
757#[derive(
758    Debug,
759    Clone,
760    Default,
761    PartialEq,
762    Eq,
763    Serialize,
764    Deserialize,
765    gproxy_protocol_macros::DeclaredFields,
766)]
767#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
768pub struct GuardianV2ModelConfig {
769    #[serde(default, skip_serializing_if = "Option::is_none")]
770    pub async_classifier_mode: Option<AsyncClassifierMode>,
771    #[serde(default, skip_serializing_if = "Option::is_none")]
772    pub async_classifier_conversation_token_limit: Option<usize>,
773    #[serde(default, skip_serializing_if = "Option::is_none")]
774    pub classifier_instructions: Option<String>,
775    #[serde(default, skip_serializing_if = "Option::is_none")]
776    pub review_threshold_basis_points: Option<u16>,
777    #[serde(default, skip_serializing_if = "Option::is_none")]
778    pub max_tool_call_lag: Option<usize>,
779    #[serde(default, skip_serializing_if = "Option::is_none")]
780    pub reasoning_effort: Option<ModelReasoningEffort>,
781    #[serde(default, skip_serializing_if = "Option::is_none")]
782    pub transcript: Option<GuardianV2TranscriptModelConfig>,
783    #[serde(default, skip_serializing_if = "Option::is_none")]
784    pub max_action_tokens: Option<usize>,
785    #[serde(default, skip_serializing_if = "Option::is_none")]
786    pub max_classifier_instruction_tokens: Option<usize>,
787    #[serde(default, skip_serializing_if = "Option::is_none")]
788    pub reuse_parent_compaction: Option<bool>,
789    #[serde(default, skip_serializing_if = "Option::is_none")]
790    pub max_parent_compaction_tokens: Option<usize>,
791    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
792    pub rest: Rest,
793}
794
795#[derive(
796    Debug,
797    Clone,
798    Default,
799    PartialEq,
800    Eq,
801    Serialize,
802    Deserialize,
803    gproxy_protocol_macros::DeclaredFields,
804)]
805#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
806pub struct GuardianV2TranscriptModelConfig {
807    #[serde(default, skip_serializing_if = "Option::is_none")]
808    pub sources: Option<Vec<String>>,
809    #[serde(default, skip_serializing_if = "Option::is_none")]
810    pub include_images: Option<bool>,
811    #[serde(default, skip_serializing_if = "Option::is_none")]
812    pub max_message_entry_tokens: Option<usize>,
813    #[serde(default, skip_serializing_if = "Option::is_none")]
814    pub max_tool_entry_tokens: Option<usize>,
815    #[serde(default, skip_serializing_if = "Option::is_none")]
816    pub max_message_transcript_tokens: Option<usize>,
817    #[serde(default, skip_serializing_if = "Option::is_none")]
818    pub max_tool_transcript_tokens: Option<usize>,
819    #[serde(default, skip_serializing_if = "Option::is_none")]
820    pub max_recent_non_user_entries: Option<usize>,
821    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
822    pub rest: Rest,
823}
824
825#[derive(
826    Debug,
827    Clone,
828    Default,
829    PartialEq,
830    Eq,
831    Serialize,
832    Deserialize,
833    gproxy_protocol_macros::DeclaredFields,
834)]
835#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
836pub struct ModelAccessPrograms {
837    #[serde(deserialize_with = "known_cyber_programs")]
838    pub cyber: Vec<CyberAccessProgram>,
839    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
840    pub rest: Rest,
841}
842
843#[derive(
844    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
845)]
846#[serde(rename_all = "snake_case")]
847#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
848pub enum ModelVisibility {
849    List,
850    Hide,
851    None,
852}
853
854#[derive(
855    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
856)]
857#[serde(rename_all = "snake_case")]
858#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
859pub enum ConfigShellToolType {
860    #[serde(alias = "default", alias = "local", alias = "shell_command")]
861    UnifiedExec,
862    Disabled,
863}
864
865#[derive(
866    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
867)]
868#[serde(rename_all = "snake_case")]
869#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
870pub enum ApplyPatchToolType {
871    Freeform,
872}
873
874#[derive(
875    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
876)]
877#[serde(rename_all = "snake_case")]
878#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
879pub enum WebSearchToolType {
880    Text,
881    TextAndImage,
882}
883
884#[derive(
885    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
886)]
887#[serde(rename_all = "snake_case")]
888#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
889pub enum TruncationMode {
890    Bytes,
891    Tokens,
892}
893
894#[derive(
895    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
896)]
897#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
898pub struct TruncationPolicyConfig {
899    pub mode: TruncationMode,
900    pub limit: i64,
901    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
902    pub rest: Rest,
903}
904
905#[derive(
906    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
907)]
908#[serde(rename_all = "snake_case")]
909#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
910pub enum ToolMode {
911    Direct,
912    CodeMode,
913    CodeModeOnly,
914}
915
916#[derive(
917    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
918)]
919#[serde(rename_all = "snake_case")]
920#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
921pub enum MultiAgentVersion {
922    Disabled,
923    V1,
924    V2,
925}
926
927#[derive(
928    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
929)]
930#[serde(rename_all = "snake_case")]
931#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
932pub enum CyberAccessProgram {
933    Standard,
934    DaybreakBlue,
935    DaybreakRed,
936}
937
938#[derive(
939    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
940)]
941#[serde(rename_all = "snake_case")]
942#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
943pub enum GuardianReviewMode {
944    Disabled,
945    Synchronous,
946    Adaptive,
947    #[serde(untagged)]
948    Unknown(String),
949}
950
951#[derive(
952    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
953)]
954#[serde(rename_all = "snake_case")]
955#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
956pub enum GuardianUnscoredAction {
957    Ignore,
958    AgeScore,
959    InvalidateScore,
960    #[serde(untagged)]
961    Unknown(String),
962}
963
964#[derive(
965    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
966)]
967#[serde(rename_all = "snake_case")]
968#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
969pub enum AsyncClassifierMode {
970    Snapshot,
971    Conversation,
972}
973
974#[derive(
975    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
976)]
977#[serde(rename_all = "snake_case")]
978#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
979pub enum ModelReasoningSummary {
980    Auto,
981    Concise,
982    Detailed,
983    None,
984}
985
986fn optional_selector<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
987where
988    D: serde::Deserializer<'de>,
989    T: serde::de::DeserializeOwned,
990{
991    Ok(Option::<String>::deserialize(deserializer)?
992        .and_then(|value| serde_json::from_value(serde_json::Value::String(value)).ok()))
993}
994
995fn known_cyber_programs<'de, D>(deserializer: D) -> Result<Vec<CyberAccessProgram>, D::Error>
996where
997    D: serde::Deserializer<'de>,
998{
999    Ok(Vec::<String>::deserialize(deserializer)?
1000        .into_iter()
1001        .filter_map(|value| serde_json::from_value(serde_json::Value::String(value)).ok())
1002        .collect())
1003}
1004
1005#[derive(
1006    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
1007)]
1008#[serde(untagged)]
1009#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1010pub enum ClientVersion {
1011    Text(String),
1012    Components([u32; 3]),
1013}
1014
1015/// Catalog effort choices include CLI modes such as Ultra and Persistent;
1016/// they are distinct from the Responses request's reasoning-effort parameter.
1017#[derive(
1018    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
1019)]
1020#[serde(rename_all = "snake_case")]
1021#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1022pub enum ModelReasoningEffort {
1023    None,
1024    Minimal,
1025    Low,
1026    Medium,
1027    High,
1028    Xhigh,
1029    Max,
1030    Ultra,
1031    Persistent,
1032    #[serde(untagged)]
1033    Custom(String),
1034}