1use serde::{Deserialize, Serialize};
8
9use crate::JsonObject;
10use crate::tool::Tool;
11
12#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
14#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
15#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
16pub struct SubAgentInfo {
17 pub name: String,
19 #[serde(default, skip_serializing_if = "Option::is_none")]
21 pub description: Option<String>,
22}
23
24#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
26#[serde(rename_all = "camelCase")]
27#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
28#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
29pub struct IdentityCapabilities {
30 #[serde(default, skip_serializing_if = "Option::is_none")]
32 pub name: Option<String>,
33 #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
35 pub kind: Option<String>,
36 #[serde(default, skip_serializing_if = "Option::is_none")]
38 pub description: Option<String>,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
41 pub version: Option<String>,
42 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub provider: Option<String>,
45 #[serde(default, skip_serializing_if = "Option::is_none")]
47 pub documentation_url: Option<String>,
48 #[serde(default, skip_serializing_if = "Option::is_none")]
50 #[cfg_attr(
51 feature = "schemars",
52 schemars(with = "Option<std::collections::BTreeMap<String, serde_json::Value>>")
53 )]
54 #[cfg_attr(feature = "utoipa", schema(value_type = Option<Object>))]
55 pub metadata: Option<JsonObject>,
56}
57
58#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
60#[serde(rename_all = "camelCase")]
61#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
62#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
63pub struct TransportCapabilities {
64 #[serde(default, skip_serializing_if = "Option::is_none")]
66 pub streaming: Option<bool>,
67 #[serde(default, skip_serializing_if = "Option::is_none")]
69 pub websocket: Option<bool>,
70 #[serde(default, skip_serializing_if = "Option::is_none")]
72 pub http_binary: Option<bool>,
73 #[serde(default, skip_serializing_if = "Option::is_none")]
75 pub push_notifications: Option<bool>,
76 #[serde(default, skip_serializing_if = "Option::is_none")]
78 pub resumable: Option<bool>,
79}
80
81#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
83#[serde(rename_all = "camelCase")]
84#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
85#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
86pub struct ToolsCapabilities {
87 #[serde(default, skip_serializing_if = "Option::is_none")]
90 pub supported: Option<bool>,
91 #[serde(default, skip_serializing_if = "Option::is_none")]
94 pub items: Option<Vec<Tool>>,
95 #[serde(default, skip_serializing_if = "Option::is_none")]
97 pub parallel_calls: Option<bool>,
98 #[serde(default, skip_serializing_if = "Option::is_none")]
100 pub client_provided: Option<bool>,
101}
102
103#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
105#[serde(rename_all = "camelCase")]
106#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
107#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
108pub struct OutputCapabilities {
109 #[serde(default, skip_serializing_if = "Option::is_none")]
111 pub structured_output: Option<bool>,
112 #[serde(default, skip_serializing_if = "Option::is_none")]
114 pub supported_mime_types: Option<Vec<String>>,
115}
116
117#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
119#[serde(rename_all = "camelCase")]
120#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
121#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
122pub struct StateCapabilities {
123 #[serde(default, skip_serializing_if = "Option::is_none")]
125 pub snapshots: Option<bool>,
126 #[serde(default, skip_serializing_if = "Option::is_none")]
128 pub deltas: Option<bool>,
129 #[serde(default, skip_serializing_if = "Option::is_none")]
131 pub memory: Option<bool>,
132 #[serde(default, skip_serializing_if = "Option::is_none")]
135 pub persistent_state: Option<bool>,
136}
137
138#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
140#[serde(rename_all = "camelCase")]
141#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
142#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
143pub struct MultiAgentCapabilities {
144 #[serde(default, skip_serializing_if = "Option::is_none")]
146 pub supported: Option<bool>,
147 #[serde(default, skip_serializing_if = "Option::is_none")]
149 pub delegation: Option<bool>,
150 #[serde(default, skip_serializing_if = "Option::is_none")]
152 pub handoffs: Option<bool>,
153 #[serde(default, skip_serializing_if = "Option::is_none")]
155 pub sub_agents: Option<Vec<SubAgentInfo>>,
156}
157
158#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
160#[serde(rename_all = "camelCase")]
161#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
162#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
163pub struct ReasoningCapabilities {
164 #[serde(default, skip_serializing_if = "Option::is_none")]
166 pub supported: Option<bool>,
167 #[serde(default, skip_serializing_if = "Option::is_none")]
169 pub streaming: Option<bool>,
170 #[serde(default, skip_serializing_if = "Option::is_none")]
173 pub encrypted: Option<bool>,
174}
175
176#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
178#[serde(rename_all = "camelCase")]
179#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
180#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
181pub struct MultimodalInputCapabilities {
182 #[serde(default, skip_serializing_if = "Option::is_none")]
184 pub image: Option<bool>,
185 #[serde(default, skip_serializing_if = "Option::is_none")]
187 pub audio: Option<bool>,
188 #[serde(default, skip_serializing_if = "Option::is_none")]
190 pub video: Option<bool>,
191 #[serde(default, skip_serializing_if = "Option::is_none")]
193 pub pdf: Option<bool>,
194 #[serde(default, skip_serializing_if = "Option::is_none")]
196 pub file: Option<bool>,
197}
198
199#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
201#[serde(rename_all = "camelCase")]
202#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
203#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
204pub struct MultimodalOutputCapabilities {
205 #[serde(default, skip_serializing_if = "Option::is_none")]
207 pub image: Option<bool>,
208 #[serde(default, skip_serializing_if = "Option::is_none")]
210 pub audio: Option<bool>,
211}
212
213#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
216#[serde(rename_all = "camelCase")]
217#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
218#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
219pub struct MultimodalCapabilities {
220 #[serde(default, skip_serializing_if = "Option::is_none")]
222 pub input: Option<MultimodalInputCapabilities>,
223 #[serde(default, skip_serializing_if = "Option::is_none")]
225 pub output: Option<MultimodalOutputCapabilities>,
226}
227
228#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
240#[serde(rename_all = "camelCase")]
241#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
242#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
243pub struct ExecutionCapabilities {
244 #[serde(default, skip_serializing_if = "Option::is_none")]
246 pub code_execution: Option<bool>,
247 #[serde(default, skip_serializing_if = "Option::is_none")]
249 pub sandboxed: Option<bool>,
250 #[serde(default, skip_serializing_if = "Option::is_none")]
252 pub max_iterations: Option<i64>,
253 #[serde(default, skip_serializing_if = "Option::is_none")]
255 pub max_execution_time: Option<i64>,
256}
257
258#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
260#[serde(rename_all = "camelCase")]
261#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
262#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
263pub struct HumanInTheLoopCapabilities {
264 #[serde(default, skip_serializing_if = "Option::is_none")]
266 pub supported: Option<bool>,
267 #[serde(default, skip_serializing_if = "Option::is_none")]
269 pub approvals: Option<bool>,
270 #[serde(default, skip_serializing_if = "Option::is_none")]
272 pub interventions: Option<bool>,
273 #[serde(default, skip_serializing_if = "Option::is_none")]
275 pub feedback: Option<bool>,
276 #[serde(default, skip_serializing_if = "Option::is_none")]
280 pub interrupts: Option<bool>,
281 #[serde(default, skip_serializing_if = "Option::is_none")]
284 pub approve_with_edits: Option<bool>,
285}
286
287#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
289#[serde(rename_all = "camelCase")]
290#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
291#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
292pub struct AgentCapabilities {
293 #[serde(default, skip_serializing_if = "Option::is_none")]
295 pub identity: Option<IdentityCapabilities>,
296 #[serde(default, skip_serializing_if = "Option::is_none")]
298 pub transport: Option<TransportCapabilities>,
299 #[serde(default, skip_serializing_if = "Option::is_none")]
301 pub tools: Option<ToolsCapabilities>,
302 #[serde(default, skip_serializing_if = "Option::is_none")]
304 pub output: Option<OutputCapabilities>,
305 #[serde(default, skip_serializing_if = "Option::is_none")]
307 pub state: Option<StateCapabilities>,
308 #[serde(default, skip_serializing_if = "Option::is_none")]
310 pub multi_agent: Option<MultiAgentCapabilities>,
311 #[serde(default, skip_serializing_if = "Option::is_none")]
313 pub reasoning: Option<ReasoningCapabilities>,
314 #[serde(default, skip_serializing_if = "Option::is_none")]
316 pub multimodal: Option<MultimodalCapabilities>,
317 #[serde(default, skip_serializing_if = "Option::is_none")]
319 pub execution: Option<ExecutionCapabilities>,
320 #[serde(default, skip_serializing_if = "Option::is_none")]
322 pub human_in_the_loop: Option<HumanInTheLoopCapabilities>,
323 #[serde(default, skip_serializing_if = "Option::is_none")]
325 #[cfg_attr(
326 feature = "schemars",
327 schemars(with = "Option<std::collections::BTreeMap<String, serde_json::Value>>")
328 )]
329 #[cfg_attr(feature = "utoipa", schema(value_type = Option<Object>))]
330 pub custom: Option<JsonObject>,
331}