1use serde::{Deserialize, Serialize};
2
3use crate::Rest;
4
5pub 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 #[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 #[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 #[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 #[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#[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}