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    /// Announced shutdown date (`YYYY-MM-DD`); explicit `null` when none is announced.
78    #[serde(
79        default,
80        deserialize_with = "super::chat::content::present_nullable",
81        skip_serializing_if = "Option::is_none"
82    )]
83    pub shutdown_date: Option<Option<String>>,
84
85    // GPROXY model extensions, matching the v3 OpenAI model contract.
86    #[serde(default, skip_serializing_if = "Option::is_none")]
87    pub display_name: Option<String>,
88    #[serde(default, skip_serializing_if = "Option::is_none")]
89    pub description: Option<String>,
90    #[serde(default, skip_serializing_if = "Option::is_none")]
91    pub instructions: Option<String>,
92    #[serde(default, skip_serializing_if = "Option::is_none")]
93    pub context_window: Option<u64>,
94    #[serde(default, skip_serializing_if = "Option::is_none")]
95    pub max_context_window: Option<u64>,
96    #[serde(default, skip_serializing_if = "Option::is_none")]
97    pub max_output_tokens: Option<u64>,
98    #[serde(default, skip_serializing_if = "Option::is_none")]
99    pub thinking_supported: Option<bool>,
100    #[serde(default, skip_serializing_if = "Option::is_none")]
101    pub input_modalities: Option<Vec<String>>,
102    #[serde(default, skip_serializing_if = "Option::is_none")]
103    pub output_modalities: Option<Vec<String>>,
104    #[serde(default, skip_serializing_if = "Option::is_none")]
105    pub supported_parameters: Option<Vec<String>>,
106    #[serde(
107        default,
108        deserialize_with = "reasoning_levels",
109        skip_serializing_if = "Option::is_none"
110    )]
111    pub supported_reasoning_levels: Option<Vec<ModelReasoningLevel>>,
112    #[serde(default, skip_serializing_if = "Option::is_none")]
113    pub default_reasoning_level: Option<ModelReasoningEffort>,
114    #[serde(default, skip_serializing_if = "Option::is_none")]
115    pub service_tiers: Option<Vec<ModelServiceTier>>,
116    #[serde(default, skip_serializing_if = "Option::is_none")]
117    pub default_service_tier: Option<String>,
118    #[serde(default, skip_serializing_if = "Option::is_none")]
119    pub generation_methods: Option<Vec<String>>,
120    #[serde(default, skip_serializing_if = "Option::is_none")]
121    pub supported_actions: Option<Vec<String>>,
122
123    // Codex model catalog extensions.
124    #[serde(default, skip_serializing_if = "Option::is_none")]
125    pub guardian: Option<GuardianModelPolicy>,
126    #[serde(default, skip_serializing_if = "Option::is_none")]
127    pub shell_type: Option<ConfigShellToolType>,
128    #[serde(default, skip_serializing_if = "Option::is_none")]
129    pub visibility: Option<ModelVisibility>,
130    #[serde(default, skip_serializing_if = "Option::is_none")]
131    pub supported_in_api: Option<bool>,
132    #[serde(default, skip_serializing_if = "Option::is_none")]
133    pub priority: Option<i32>,
134    #[serde(default, skip_serializing_if = "Option::is_none")]
135    pub additional_speed_tiers: Option<Vec<String>>,
136    #[serde(default, skip_serializing_if = "Option::is_none")]
137    pub available_access_programs: Option<ModelAccessPrograms>,
138    #[serde(default, skip_serializing_if = "Option::is_none")]
139    pub availability_nux: Option<ModelAvailabilityNux>,
140    #[serde(default, skip_serializing_if = "Option::is_none")]
141    pub upgrade: Option<ModelInfoUpgrade>,
142    #[serde(default, skip_serializing_if = "Option::is_none")]
143    pub model_messages: Option<ModelMessages>,
144    #[serde(default, skip_serializing_if = "Option::is_none")]
145    pub include_skills_usage_instructions: Option<bool>,
146    #[serde(default, skip_serializing_if = "Option::is_none")]
147    pub include_plugin_usage_instructions: Option<bool>,
148    #[serde(default, skip_serializing_if = "Option::is_none")]
149    pub include_apps_usage_instructions: Option<bool>,
150    #[serde(default, skip_serializing_if = "Option::is_none")]
151    pub supports_reasoning_summary_parameter: Option<bool>,
152    #[serde(default, skip_serializing_if = "Option::is_none")]
153    pub default_reasoning_summary: Option<ModelReasoningSummary>,
154    #[serde(default, skip_serializing_if = "Option::is_none")]
155    pub support_verbosity: Option<bool>,
156    #[serde(default, skip_serializing_if = "Option::is_none")]
157    pub default_verbosity: Option<super::responses::TextVerbosity>,
158    #[serde(default, skip_serializing_if = "Option::is_none")]
159    pub apply_patch_tool_type: Option<ApplyPatchToolType>,
160    #[serde(default, skip_serializing_if = "Option::is_none")]
161    pub web_search_tool_type: Option<WebSearchToolType>,
162    #[serde(default, skip_serializing_if = "Option::is_none")]
163    pub truncation_policy: Option<TruncationPolicyConfig>,
164    #[serde(default, skip_serializing_if = "Option::is_none")]
165    pub supports_image_detail_original: Option<bool>,
166    #[serde(default, skip_serializing_if = "Option::is_none")]
167    pub auto_compact_token_limit: Option<i64>,
168    #[serde(default, skip_serializing_if = "Option::is_none")]
169    pub comp_hash: Option<String>,
170    #[serde(default, skip_serializing_if = "Option::is_none")]
171    pub effective_context_window_percent: Option<i64>,
172    #[serde(default, skip_serializing_if = "Option::is_none")]
173    pub experimental_supported_tools: Option<Vec<String>>,
174    #[serde(default, skip_serializing_if = "Option::is_none")]
175    pub supports_search_tool: Option<bool>,
176    #[serde(default, skip_serializing_if = "Option::is_none")]
177    pub supports_experimental_context: Option<bool>,
178    #[serde(default, skip_serializing_if = "Option::is_none")]
179    pub use_responses_lite: Option<bool>,
180    #[serde(default, skip_serializing_if = "Option::is_none")]
181    pub supports_reasoning_effort_updates: Option<bool>,
182    #[serde(default, skip_serializing_if = "Option::is_none")]
183    pub node_repl_auto_review_required: Option<bool>,
184    #[serde(default, skip_serializing_if = "Option::is_none")]
185    pub node_repl_disabled: Option<bool>,
186    #[serde(default, skip_serializing_if = "Option::is_none")]
187    pub auto_review_model_override: Option<String>,
188    #[serde(default, skip_serializing_if = "Option::is_none")]
189    pub model_specialty: Option<String>,
190    #[serde(
191        default,
192        deserialize_with = "optional_selector",
193        skip_serializing_if = "Option::is_none"
194    )]
195    pub tool_mode: Option<ToolMode>,
196    #[serde(
197        default,
198        deserialize_with = "optional_selector",
199        skip_serializing_if = "Option::is_none"
200    )]
201    pub multi_agent_version: Option<MultiAgentVersion>,
202    #[serde(default, skip_serializing_if = "Option::is_none")]
203    pub multi_agent_reasoning_effort: Option<ModelReasoningEffort>,
204    #[serde(default, skip_serializing_if = "Option::is_none")]
205    pub base_instructions: Option<String>,
206    // Fields also advertised by the bundled Codex catalog.
207    #[serde(default, skip_serializing_if = "Option::is_none")]
208    pub prefer_websockets: Option<bool>,
209    #[serde(default, skip_serializing_if = "Option::is_none")]
210    pub supports_parallel_tool_calls: Option<bool>,
211    #[serde(default, skip_serializing_if = "Option::is_none")]
212    pub supports_reasoning_summaries: Option<bool>,
213    #[serde(default, skip_serializing_if = "Option::is_none")]
214    pub requires_sandboxed_review: Option<bool>,
215    #[serde(default, skip_serializing_if = "Option::is_none")]
216    pub available_in_plans: Option<Vec<String>>,
217    #[serde(default, skip_serializing_if = "Option::is_none")]
218    pub minimal_client_version: Option<ClientVersion>,
219    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
220    pub rest: Rest,
221}
222
223#[derive(
224    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
225)]
226#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
227pub struct ModelReasoningLevel {
228    pub effort: ModelReasoningEffort,
229    pub description: String,
230}
231#[derive(
232    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
233)]
234#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
235pub struct ModelServiceTier {
236    pub id: String,
237    pub name: String,
238    pub description: String,
239}
240
241fn reasoning_levels<'de, D>(deserializer: D) -> Result<Option<Vec<ModelReasoningLevel>>, D::Error>
242where
243    D: serde::Deserializer<'de>,
244{
245    #[derive(Deserialize)]
246    #[serde(untagged)]
247    enum Level {
248        Preset(ModelReasoningLevel),
249        Effort(ModelReasoningEffort),
250    }
251    Ok(
252        Option::<Vec<Level>>::deserialize(deserializer)?.map(|levels| {
253            levels
254                .into_iter()
255                .map(|level| match level {
256                    Level::Preset(preset) => preset,
257                    Level::Effort(effort) => ModelReasoningLevel {
258                        effort,
259                        description: String::new(),
260                    },
261                })
262                .collect()
263        }),
264    )
265}
266
267#[derive(
268    Debug,
269    Clone,
270    Default,
271    PartialEq,
272    Eq,
273    Serialize,
274    Deserialize,
275    gproxy_protocol_macros::DeclaredFields,
276)]
277#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
278pub struct ModelMessages {
279    #[serde(default, skip_serializing_if = "Option::is_none")]
280    pub apps: Option<AppsMessages>,
281    #[serde(default, skip_serializing_if = "Option::is_none")]
282    pub content_filter_guidance: Option<String>,
283    #[serde(default, skip_serializing_if = "Option::is_none")]
284    pub persistent_instructions: Option<String>,
285    #[serde(default, skip_serializing_if = "Option::is_none")]
286    pub tools: Option<ToolMessages>,
287    #[serde(default, skip_serializing_if = "Option::is_none")]
288    pub instructions_template: Option<String>,
289    #[serde(default, skip_serializing_if = "Option::is_none")]
290    pub instructions_variables: Option<ModelInstructionsVariables>,
291    #[serde(default, skip_serializing_if = "Option::is_none")]
292    pub approvals: Option<ApprovalMessages>,
293    #[serde(default, skip_serializing_if = "Option::is_none")]
294    pub collaboration_modes: Option<CollaborationModeMessages>,
295    #[serde(default, skip_serializing_if = "Option::is_none")]
296    pub auto_review: Option<AutoReviewMessages>,
297    #[serde(default, skip_serializing_if = "Option::is_none")]
298    pub permissions: Option<PermissionMessages>,
299    #[serde(default, skip_serializing_if = "Option::is_none")]
300    pub multi_agent: Option<MultiAgentMessages>,
301    #[serde(default, skip_serializing_if = "Option::is_none")]
302    pub token_budget: Option<ModelTokenBudgetConfig>,
303    #[serde(default, skip_serializing_if = "Option::is_none")]
304    pub guardian_v2: Option<GuardianV2ModelConfig>,
305    #[serde(default, skip_serializing_if = "Option::is_none")]
306    pub confirmation_policies: Option<ConfirmationPolicies>,
307    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
308    pub rest: Rest,
309}
310
311#[derive(
312    Debug,
313    Clone,
314    Default,
315    PartialEq,
316    Eq,
317    Serialize,
318    Deserialize,
319    gproxy_protocol_macros::DeclaredFields,
320)]
321#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
322pub struct ConfirmationPolicies {
323    #[serde(default, skip_serializing_if = "Option::is_none")]
324    pub browser_use: Option<String>,
325    #[serde(default, skip_serializing_if = "Option::is_none")]
326    pub computer_use: Option<String>,
327    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
328    pub rest: Rest,
329}
330
331#[derive(
332    Debug,
333    Clone,
334    Default,
335    PartialEq,
336    Eq,
337    Serialize,
338    Deserialize,
339    gproxy_protocol_macros::DeclaredFields,
340)]
341#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
342pub struct ToolMessages {
343    #[serde(default, skip_serializing_if = "Option::is_none")]
344    pub history: Option<HistoryToolMessages>,
345    #[serde(default, skip_serializing_if = "Option::is_none")]
346    pub notes: Option<NotesToolMessages>,
347    #[serde(default, skip_serializing_if = "Option::is_none")]
348    pub context_management: Option<ContextManagementToolMessages>,
349    #[serde(default, skip_serializing_if = "Option::is_none")]
350    pub incremental_tools: Option<IncrementalToolMessages>,
351    #[serde(default, skip_serializing_if = "Option::is_none")]
352    pub functions_namespace_functions_description_prefixes:
353        Option<std::collections::BTreeMap<String, String>>,
354    #[serde(default, skip_serializing_if = "Option::is_none")]
355    pub indirect_description_prefixes: Option<IndirectDescriptionPrefixes>,
356    #[serde(default, skip_serializing_if = "Option::is_none")]
357    pub send_user_message_async: Option<ToolMessage>,
358    #[serde(default, skip_serializing_if = "Option::is_none")]
359    pub multi_agent: Option<MultiAgentToolMessages>,
360    #[serde(default, skip_serializing_if = "Option::is_none")]
361    pub code_mode: Option<CodeModeToolMessages>,
362    #[serde(default, skip_serializing_if = "Option::is_none")]
363    pub mcp_resources: Option<McpResourceToolMessages>,
364    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
365    pub rest: Rest,
366}
367
368#[derive(
369    Debug,
370    Clone,
371    Default,
372    PartialEq,
373    Eq,
374    Serialize,
375    Deserialize,
376    gproxy_protocol_macros::DeclaredFields,
377)]
378#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
379pub struct IndirectDescriptionPrefixes {
380    #[serde(default, skip_serializing_if = "Option::is_none")]
381    pub namespaces: Option<std::collections::BTreeMap<String, String>>,
382    #[serde(default, skip_serializing_if = "Option::is_none")]
383    pub mcp_servers: Option<std::collections::BTreeMap<String, String>>,
384    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
385    pub rest: Rest,
386}
387
388#[derive(
389    Debug,
390    Clone,
391    Default,
392    PartialEq,
393    Eq,
394    Serialize,
395    Deserialize,
396    gproxy_protocol_macros::DeclaredFields,
397)]
398#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
399pub struct ToolMessage {
400    #[serde(default, skip_serializing_if = "Option::is_none")]
401    pub description: Option<String>,
402    #[serde(default, skip_serializing_if = "Option::is_none")]
403    pub parameters: Option<String>,
404    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
405    pub rest: Rest,
406}
407
408#[derive(
409    Debug,
410    Clone,
411    Default,
412    PartialEq,
413    Eq,
414    Serialize,
415    Deserialize,
416    gproxy_protocol_macros::DeclaredFields,
417)]
418#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
419pub struct MultiAgentToolMessages {
420    #[serde(default, skip_serializing_if = "Option::is_none")]
421    pub spawn_agent: Option<ToolMessage>,
422    #[serde(default, skip_serializing_if = "Option::is_none")]
423    pub send_message: Option<ToolMessage>,
424    #[serde(default, skip_serializing_if = "Option::is_none")]
425    pub followup_task: Option<ToolMessage>,
426    #[serde(default, skip_serializing_if = "Option::is_none")]
427    pub wait_agent: Option<ToolMessage>,
428    #[serde(default, skip_serializing_if = "Option::is_none")]
429    pub interrupt_agent: Option<ToolMessage>,
430    #[serde(default, skip_serializing_if = "Option::is_none")]
431    pub list_agents: Option<ToolMessage>,
432    #[serde(default, skip_serializing_if = "Option::is_none")]
433    pub create_channel: Option<ToolMessage>,
434    #[serde(default, skip_serializing_if = "Option::is_none")]
435    pub get_channels: Option<ToolMessage>,
436    #[serde(default, skip_serializing_if = "Option::is_none")]
437    pub list_threads: Option<ToolMessage>,
438    #[serde(default, skip_serializing_if = "Option::is_none")]
439    pub search_posts: Option<ToolMessage>,
440    #[serde(default, skip_serializing_if = "Option::is_none")]
441    pub read_thread: Option<ToolMessage>,
442    #[serde(default, skip_serializing_if = "Option::is_none")]
443    pub read_post: Option<ToolMessage>,
444    #[serde(default, skip_serializing_if = "Option::is_none")]
445    pub subscribe: Option<ToolMessage>,
446    #[serde(default, skip_serializing_if = "Option::is_none")]
447    pub unsubscribe: Option<ToolMessage>,
448    #[serde(default, skip_serializing_if = "Option::is_none")]
449    pub post: Option<ToolMessage>,
450    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
451    pub rest: Rest,
452}
453
454#[derive(
455    Debug,
456    Clone,
457    Default,
458    PartialEq,
459    Eq,
460    Serialize,
461    Deserialize,
462    gproxy_protocol_macros::DeclaredFields,
463)]
464#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
465pub struct McpResourceToolMessages {
466    #[serde(default, skip_serializing_if = "Option::is_none")]
467    pub list_mcp_resources: Option<ToolMessage>,
468    #[serde(default, skip_serializing_if = "Option::is_none")]
469    pub list_mcp_resource_templates: Option<ToolMessage>,
470    #[serde(default, skip_serializing_if = "Option::is_none")]
471    pub read_mcp_resource: Option<ToolMessage>,
472    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
473    pub rest: Rest,
474}
475
476#[derive(
477    Debug,
478    Clone,
479    Default,
480    PartialEq,
481    Eq,
482    Serialize,
483    Deserialize,
484    gproxy_protocol_macros::DeclaredFields,
485)]
486#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
487pub struct CodeModeToolMessages {
488    #[serde(default, skip_serializing_if = "Option::is_none")]
489    pub exec: Option<ToolMessage>,
490    #[serde(default, skip_serializing_if = "Option::is_none")]
491    pub wait: Option<ToolMessage>,
492    #[serde(default, skip_serializing_if = "Option::is_none")]
493    pub deferred_nested_tools_guidance: Option<String>,
494    #[serde(default, skip_serializing_if = "Option::is_none")]
495    pub mcp_typescript_preamble: Option<String>,
496    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
497    pub rest: Rest,
498}
499
500#[derive(
501    Debug,
502    Clone,
503    Default,
504    PartialEq,
505    Eq,
506    Serialize,
507    Deserialize,
508    gproxy_protocol_macros::DeclaredFields,
509)]
510#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
511pub struct ModelTokenBudgetConfig {
512    #[serde(default)]
513    pub enabled: bool,
514    #[serde(default)]
515    pub use_history_notes_extension: bool,
516    pub reminder_threshold_tokens: i64,
517    pub reminder_message_template: String,
518    pub guidance_message: String,
519    pub auto_compact_fallback_prompt: String,
520    pub auto_compact_fallback_buffer_tokens: i64,
521    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
522    pub rest: Rest,
523}
524
525#[derive(
526    Debug,
527    Clone,
528    Default,
529    PartialEq,
530    Eq,
531    Serialize,
532    Deserialize,
533    gproxy_protocol_macros::DeclaredFields,
534)]
535#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
536pub struct ApprovalMessages {
537    #[serde(
538        default,
539        alias = "request_permissions_tool",
540        skip_serializing_if = "Option::is_none"
541    )]
542    pub request_permissions: Option<String>,
543    #[serde(default, skip_serializing_if = "Option::is_none")]
544    pub auto_review_suffix: Option<String>,
545    #[serde(default, skip_serializing_if = "Option::is_none")]
546    pub granular: Option<GranularApprovalMessages>,
547    #[serde(default, skip_serializing_if = "Option::is_none")]
548    pub on_request: Option<String>,
549    #[serde(default, skip_serializing_if = "Option::is_none")]
550    pub on_request_auto_review: Option<String>,
551    #[serde(default, skip_serializing_if = "Option::is_none")]
552    pub never: Option<String>,
553    #[serde(default, skip_serializing_if = "Option::is_none")]
554    pub unless_trusted: Option<String>,
555    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
556    pub rest: Rest,
557}
558
559#[derive(
560    Debug,
561    Clone,
562    Default,
563    PartialEq,
564    Eq,
565    Serialize,
566    Deserialize,
567    gproxy_protocol_macros::DeclaredFields,
568)]
569#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
570pub struct CollaborationModeMessages {
571    #[serde(default, skip_serializing_if = "Option::is_none")]
572    pub default: Option<String>,
573    #[serde(default, skip_serializing_if = "Option::is_none")]
574    pub plan: Option<String>,
575    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
576    pub rest: Rest,
577}
578
579#[derive(
580    Debug,
581    Clone,
582    Default,
583    PartialEq,
584    Eq,
585    Serialize,
586    Deserialize,
587    gproxy_protocol_macros::DeclaredFields,
588)]
589#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
590pub struct AutoReviewMessages {
591    #[serde(default, skip_serializing_if = "Option::is_none")]
592    pub policy: Option<String>,
593    #[serde(default, skip_serializing_if = "Option::is_none")]
594    pub policy_template: Option<String>,
595    #[serde(default, skip_serializing_if = "Option::is_none")]
596    pub node_repl_policy: Option<String>,
597    #[serde(default, skip_serializing_if = "Option::is_none")]
598    pub rejection_instructions: Option<String>,
599    #[serde(default, skip_serializing_if = "Option::is_none")]
600    pub timeout_instructions: Option<String>,
601    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
602    pub rest: Rest,
603}
604
605#[derive(
606    Debug,
607    Clone,
608    Default,
609    PartialEq,
610    Eq,
611    Serialize,
612    Deserialize,
613    gproxy_protocol_macros::DeclaredFields,
614)]
615#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
616pub struct PermissionMessages {
617    #[serde(default, skip_serializing_if = "Option::is_none")]
618    pub approved_prefixes: Option<String>,
619    #[serde(default, skip_serializing_if = "Option::is_none")]
620    pub approved_command_prefix_saved: Option<String>,
621    #[serde(default, skip_serializing_if = "Option::is_none")]
622    pub writable_root: Option<String>,
623    #[serde(default, skip_serializing_if = "Option::is_none")]
624    pub writable_roots: Option<String>,
625    #[serde(default, skip_serializing_if = "Option::is_none")]
626    pub omitted_paths: Option<String>,
627    #[serde(default, skip_serializing_if = "Option::is_none")]
628    pub denied_reads: Option<String>,
629    #[serde(default, skip_serializing_if = "Option::is_none")]
630    pub danger_full_access: Option<String>,
631    #[serde(default, skip_serializing_if = "Option::is_none")]
632    pub workspace_write: Option<String>,
633    #[serde(default, skip_serializing_if = "Option::is_none")]
634    pub read_only: Option<String>,
635    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
636    pub rest: Rest,
637}
638
639#[derive(
640    Debug,
641    Clone,
642    Default,
643    PartialEq,
644    Eq,
645    Serialize,
646    Deserialize,
647    gproxy_protocol_macros::DeclaredFields,
648)]
649#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
650pub struct MultiAgentMessages {
651    #[serde(default, skip_serializing_if = "Option::is_none")]
652    pub role: Option<MultiAgentRoleMessages>,
653    #[serde(default, skip_serializing_if = "Option::is_none")]
654    pub mode: Option<MultiAgentModeMessages>,
655    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
656    pub rest: Rest,
657}
658
659#[derive(
660    Debug,
661    Clone,
662    Default,
663    PartialEq,
664    Eq,
665    Serialize,
666    Deserialize,
667    gproxy_protocol_macros::DeclaredFields,
668)]
669#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
670pub struct MultiAgentRoleMessages {
671    #[serde(default, skip_serializing_if = "Option::is_none")]
672    pub root: Option<String>,
673    #[serde(default, skip_serializing_if = "Option::is_none")]
674    pub subagent: Option<String>,
675    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
676    pub rest: Rest,
677}
678
679#[derive(
680    Debug,
681    Clone,
682    Default,
683    PartialEq,
684    Eq,
685    Serialize,
686    Deserialize,
687    gproxy_protocol_macros::DeclaredFields,
688)]
689#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
690pub struct MultiAgentModeMessages {
691    #[serde(default, skip_serializing_if = "Option::is_none")]
692    pub explicit: Option<String>,
693    #[serde(default, skip_serializing_if = "Option::is_none")]
694    pub proactive: Option<String>,
695    #[serde(default, skip_serializing_if = "Option::is_none")]
696    pub hint_text: Option<String>,
697    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
698    pub rest: Rest,
699}
700
701#[derive(
702    Debug,
703    Clone,
704    Default,
705    PartialEq,
706    Eq,
707    Serialize,
708    Deserialize,
709    gproxy_protocol_macros::DeclaredFields,
710)]
711#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
712pub struct ModelInstructionsVariables {
713    #[serde(default, skip_serializing_if = "Option::is_none")]
714    pub personality_default: Option<String>,
715    #[serde(default, skip_serializing_if = "Option::is_none")]
716    pub personality_friendly: Option<String>,
717    #[serde(default, skip_serializing_if = "Option::is_none")]
718    pub personality_pragmatic: Option<String>,
719    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
720    pub rest: Rest,
721}
722
723#[derive(
724    Debug,
725    Clone,
726    Default,
727    PartialEq,
728    Eq,
729    Serialize,
730    Deserialize,
731    gproxy_protocol_macros::DeclaredFields,
732)]
733#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
734pub struct ModelInfoUpgrade {
735    pub model: String,
736    pub migration_markdown: String,
737    #[serde(default, skip_serializing_if = "Option::is_none")]
738    pub retirement_at: Option<String>,
739    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
740    pub rest: Rest,
741}
742
743#[derive(
744    Debug,
745    Clone,
746    Default,
747    PartialEq,
748    Eq,
749    Serialize,
750    Deserialize,
751    gproxy_protocol_macros::DeclaredFields,
752)]
753#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
754pub struct ModelAvailabilityNux {
755    pub message: String,
756    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
757    pub rest: Rest,
758}
759
760#[derive(
761    Debug,
762    Clone,
763    Default,
764    PartialEq,
765    Eq,
766    Serialize,
767    Deserialize,
768    gproxy_protocol_macros::DeclaredFields,
769)]
770#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
771pub struct GuardianModelPolicy {
772    #[serde(default, skip_serializing_if = "Option::is_none")]
773    pub computer_use: Option<GuardianReviewMode>,
774    #[serde(default, skip_serializing_if = "Option::is_none")]
775    pub shell: Option<GuardianReviewMode>,
776    #[serde(default, skip_serializing_if = "Option::is_none")]
777    pub file_changes: Option<GuardianReviewMode>,
778    #[serde(default, skip_serializing_if = "Option::is_none")]
779    pub mcp: Option<GuardianReviewMode>,
780    #[serde(default, skip_serializing_if = "Option::is_none")]
781    pub network: Option<GuardianReviewMode>,
782    #[serde(default, skip_serializing_if = "Option::is_none")]
783    pub permissions: Option<GuardianReviewMode>,
784    #[serde(default, skip_serializing_if = "Option::is_none")]
785    pub other_tools: Option<GuardianReviewMode>,
786    #[serde(default, skip_serializing_if = "Option::is_none")]
787    pub unscored_action: Option<GuardianUnscoredAction>,
788    #[serde(default, skip_serializing_if = "Option::is_none")]
789    pub initial_cua_call: Option<bool>,
790    #[serde(default, skip_serializing_if = "Option::is_none")]
791    pub sandboxed_exec_commands: Option<bool>,
792    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
793    pub rest: Rest,
794}
795
796#[derive(
797    Debug,
798    Clone,
799    Default,
800    PartialEq,
801    Eq,
802    Serialize,
803    Deserialize,
804    gproxy_protocol_macros::DeclaredFields,
805)]
806#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
807pub struct GuardianV2ModelConfig {
808    #[serde(default, skip_serializing_if = "Option::is_none")]
809    pub async_classifier_mode: Option<AsyncClassifierMode>,
810    #[serde(default, skip_serializing_if = "Option::is_none")]
811    pub async_classifier_conversation_token_limit: Option<usize>,
812    #[serde(default, skip_serializing_if = "Option::is_none")]
813    pub classifier_instructions: Option<String>,
814    #[serde(default, skip_serializing_if = "Option::is_none")]
815    pub review_threshold_basis_points: Option<u16>,
816    #[serde(default, skip_serializing_if = "Option::is_none")]
817    pub max_tool_call_lag: Option<usize>,
818    #[serde(default, skip_serializing_if = "Option::is_none")]
819    pub reasoning_effort: Option<ModelReasoningEffort>,
820    #[serde(default, skip_serializing_if = "Option::is_none")]
821    pub transcript: Option<GuardianV2TranscriptModelConfig>,
822    #[serde(default, skip_serializing_if = "Option::is_none")]
823    pub max_action_tokens: Option<usize>,
824    #[serde(default, skip_serializing_if = "Option::is_none")]
825    pub max_classifier_instruction_tokens: Option<usize>,
826    #[serde(default, skip_serializing_if = "Option::is_none")]
827    pub reuse_parent_compaction: Option<bool>,
828    #[serde(default, skip_serializing_if = "Option::is_none")]
829    pub max_parent_compaction_tokens: Option<usize>,
830    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
831    pub rest: Rest,
832}
833
834#[derive(
835    Debug,
836    Clone,
837    Default,
838    PartialEq,
839    Eq,
840    Serialize,
841    Deserialize,
842    gproxy_protocol_macros::DeclaredFields,
843)]
844#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
845pub struct GuardianV2TranscriptModelConfig {
846    #[serde(default, skip_serializing_if = "Option::is_none")]
847    pub sources: Option<Vec<String>>,
848    #[serde(default, skip_serializing_if = "Option::is_none")]
849    pub include_images: Option<bool>,
850    #[serde(default, skip_serializing_if = "Option::is_none")]
851    pub max_message_entry_tokens: Option<usize>,
852    #[serde(default, skip_serializing_if = "Option::is_none")]
853    pub max_tool_entry_tokens: Option<usize>,
854    #[serde(default, skip_serializing_if = "Option::is_none")]
855    pub max_message_transcript_tokens: Option<usize>,
856    #[serde(default, skip_serializing_if = "Option::is_none")]
857    pub max_tool_transcript_tokens: Option<usize>,
858    #[serde(default, skip_serializing_if = "Option::is_none")]
859    pub max_recent_non_user_entries: Option<usize>,
860    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
861    pub rest: Rest,
862}
863
864#[derive(
865    Debug,
866    Clone,
867    Default,
868    PartialEq,
869    Eq,
870    Serialize,
871    Deserialize,
872    gproxy_protocol_macros::DeclaredFields,
873)]
874#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
875pub struct ModelAccessPrograms {
876    #[serde(deserialize_with = "known_cyber_programs")]
877    pub cyber: Vec<CyberAccessProgram>,
878    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
879    pub rest: Rest,
880}
881
882#[derive(
883    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
884)]
885#[serde(rename_all = "snake_case")]
886#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
887pub enum ModelVisibility {
888    List,
889    Hide,
890    None,
891}
892
893#[derive(
894    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
895)]
896#[serde(rename_all = "snake_case")]
897#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
898pub enum ConfigShellToolType {
899    #[serde(alias = "default", alias = "local", alias = "shell_command")]
900    UnifiedExec,
901    Disabled,
902}
903
904#[derive(
905    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
906)]
907#[serde(rename_all = "snake_case")]
908#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
909pub enum ApplyPatchToolType {
910    Freeform,
911}
912
913#[derive(
914    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
915)]
916#[serde(rename_all = "snake_case")]
917#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
918pub enum WebSearchToolType {
919    Text,
920    TextAndImage,
921}
922
923#[derive(
924    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
925)]
926#[serde(rename_all = "snake_case")]
927#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
928pub enum TruncationMode {
929    Bytes,
930    Tokens,
931}
932
933#[derive(
934    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
935)]
936#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
937pub struct TruncationPolicyConfig {
938    pub mode: TruncationMode,
939    pub limit: i64,
940    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
941    pub rest: Rest,
942}
943
944#[derive(
945    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
946)]
947#[serde(rename_all = "snake_case")]
948#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
949pub enum ToolMode {
950    Direct,
951    CodeMode,
952    CodeModeOnly,
953}
954
955#[derive(
956    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
957)]
958#[serde(rename_all = "snake_case")]
959#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
960pub enum MultiAgentVersion {
961    Disabled,
962    V1,
963    V2,
964}
965
966#[derive(
967    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
968)]
969#[serde(rename_all = "snake_case")]
970#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
971pub enum CyberAccessProgram {
972    Standard,
973    DaybreakBlue,
974    DaybreakRed,
975}
976
977#[derive(
978    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
979)]
980#[serde(rename_all = "snake_case")]
981#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
982pub enum GuardianReviewMode {
983    Disabled,
984    Synchronous,
985    Adaptive,
986    #[serde(untagged)]
987    Unknown(String),
988}
989
990#[derive(
991    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
992)]
993#[serde(rename_all = "snake_case")]
994#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
995pub enum GuardianUnscoredAction {
996    Ignore,
997    AgeScore,
998    InvalidateScore,
999    #[serde(untagged)]
1000    Unknown(String),
1001}
1002
1003#[derive(
1004    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
1005)]
1006#[serde(rename_all = "snake_case")]
1007#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1008pub enum AsyncClassifierMode {
1009    Snapshot,
1010    Conversation,
1011}
1012
1013#[derive(
1014    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
1015)]
1016#[serde(rename_all = "snake_case")]
1017#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1018pub enum ModelReasoningSummary {
1019    Auto,
1020    Concise,
1021    Detailed,
1022    None,
1023}
1024
1025fn optional_selector<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
1026where
1027    D: serde::Deserializer<'de>,
1028    T: serde::de::DeserializeOwned,
1029{
1030    Ok(Option::<String>::deserialize(deserializer)?
1031        .and_then(|value| serde_json::from_value(serde_json::Value::String(value)).ok()))
1032}
1033
1034fn known_cyber_programs<'de, D>(deserializer: D) -> Result<Vec<CyberAccessProgram>, D::Error>
1035where
1036    D: serde::Deserializer<'de>,
1037{
1038    Ok(Vec::<String>::deserialize(deserializer)?
1039        .into_iter()
1040        .filter_map(|value| serde_json::from_value(serde_json::Value::String(value)).ok())
1041        .collect())
1042}
1043
1044#[derive(
1045    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
1046)]
1047#[serde(untagged)]
1048#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1049pub enum ClientVersion {
1050    Text(String),
1051    Components([u32; 3]),
1052}
1053
1054/// Catalog effort choices include CLI modes such as Ultra and Persistent;
1055/// they are distinct from the Responses request's reasoning-effort parameter.
1056#[derive(
1057    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::DeclaredFields,
1058)]
1059#[serde(rename_all = "snake_case")]
1060#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1061pub enum ModelReasoningEffort {
1062    None,
1063    Minimal,
1064    Low,
1065    Medium,
1066    High,
1067    Xhigh,
1068    Max,
1069    Ultra,
1070    Persistent,
1071    #[serde(untagged)]
1072    Custom(String),
1073}
1074
1075// Model-owned presentation text follows the current Codex catalog. Preserve
1076// literal values; validation and rendering remain with the consuming client.
1077#[derive(
1078    Debug,
1079    Clone,
1080    Default,
1081    PartialEq,
1082    Eq,
1083    Serialize,
1084    Deserialize,
1085    gproxy_protocol_macros::DeclaredFields,
1086)]
1087#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1088pub struct AppsMessages {
1089    #[serde(default, skip_serializing_if = "Option::is_none")]
1090    pub usage_instructions: Option<String>,
1091    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
1092    pub rest: Rest,
1093}
1094
1095#[derive(
1096    Debug,
1097    Clone,
1098    Default,
1099    PartialEq,
1100    Eq,
1101    Serialize,
1102    Deserialize,
1103    gproxy_protocol_macros::DeclaredFields,
1104)]
1105#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1106pub struct HistoryToolMessages {
1107    #[serde(default, skip_serializing_if = "Option::is_none")]
1108    pub namespace_description: Option<String>,
1109    #[serde(default, skip_serializing_if = "Option::is_none")]
1110    pub list_windows: Option<ToolMessage>,
1111    #[serde(default, skip_serializing_if = "Option::is_none")]
1112    pub list_items: Option<ToolMessage>,
1113    #[serde(default, skip_serializing_if = "Option::is_none")]
1114    pub read_item: Option<ToolMessage>,
1115    #[serde(default, skip_serializing_if = "Option::is_none")]
1116    pub search_contents: Option<ToolMessage>,
1117    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
1118    pub rest: Rest,
1119}
1120
1121#[derive(
1122    Debug,
1123    Clone,
1124    Default,
1125    PartialEq,
1126    Eq,
1127    Serialize,
1128    Deserialize,
1129    gproxy_protocol_macros::DeclaredFields,
1130)]
1131#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1132pub struct NotesToolMessages {
1133    #[serde(default, skip_serializing_if = "Option::is_none")]
1134    pub namespace_description: Option<String>,
1135    #[serde(default, skip_serializing_if = "Option::is_none")]
1136    pub list_files_by_prefix: Option<ToolMessage>,
1137    #[serde(default, skip_serializing_if = "Option::is_none")]
1138    pub read_file: Option<ToolMessage>,
1139    #[serde(default, skip_serializing_if = "Option::is_none")]
1140    pub search_contents: Option<ToolMessage>,
1141    #[serde(default, skip_serializing_if = "Option::is_none")]
1142    pub append_to_file: Option<ToolMessage>,
1143    #[serde(default, skip_serializing_if = "Option::is_none")]
1144    pub write_file: Option<ToolMessage>,
1145    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
1146    pub rest: Rest,
1147}
1148
1149#[derive(
1150    Debug,
1151    Clone,
1152    Default,
1153    PartialEq,
1154    Eq,
1155    Serialize,
1156    Deserialize,
1157    gproxy_protocol_macros::DeclaredFields,
1158)]
1159#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1160pub struct ContextManagementToolMessages {
1161    #[serde(default, skip_serializing_if = "Option::is_none")]
1162    pub new_context: Option<ToolMessage>,
1163    #[serde(default, skip_serializing_if = "Option::is_none")]
1164    pub get_context_remaining: Option<ToolMessage>,
1165    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
1166    pub rest: Rest,
1167}
1168
1169#[derive(
1170    Debug,
1171    Clone,
1172    Default,
1173    PartialEq,
1174    Eq,
1175    Serialize,
1176    Deserialize,
1177    gproxy_protocol_macros::DeclaredFields,
1178)]
1179#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1180pub struct IncrementalToolMessages {
1181    #[serde(default, skip_serializing_if = "Option::is_none")]
1182    pub tool_update_hint: Option<String>,
1183    #[serde(default, skip_serializing_if = "Option::is_none")]
1184    pub removed_tools_header: Option<String>,
1185    #[serde(default, skip_serializing_if = "Option::is_none")]
1186    pub removed_namespaces_header: Option<String>,
1187    #[serde(default, skip_serializing_if = "Option::is_none")]
1188    pub namespace_instructions_prefix: Option<String>,
1189    #[serde(default, skip_serializing_if = "Option::is_none")]
1190    pub namespace_instructions_cleared: Option<String>,
1191    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
1192    pub rest: Rest,
1193}
1194
1195#[derive(
1196    Debug,
1197    Clone,
1198    Default,
1199    PartialEq,
1200    Eq,
1201    Serialize,
1202    Deserialize,
1203    gproxy_protocol_macros::DeclaredFields,
1204)]
1205#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
1206pub struct GranularApprovalMessages {
1207    #[serde(default, skip_serializing_if = "Option::is_none")]
1208    pub intro: Option<String>,
1209    #[serde(default, skip_serializing_if = "Option::is_none")]
1210    pub prompted_categories: Option<String>,
1211    #[serde(default, skip_serializing_if = "Option::is_none")]
1212    pub rejected_categories: Option<String>,
1213    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
1214    pub rest: Rest,
1215}