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 #[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 #[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 #[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 #[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#[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#[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}