1use serde::{Deserialize, Serialize};
7use serde_with::skip_serializing_none;
8
9pub const PROTOCOL_VERSION: &str = "0.2";
11
12pub const HEADER_PROTOCOL_VERSION: &str = "ACT-Protocol-Version";
14
15#[skip_serializing_none]
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct ToolDefinition {
19 pub name: String,
20 pub description: String,
21 pub parameters_schema: serde_json::Value,
22 pub metadata: Option<serde_json::Value>,
23}
24
25#[skip_serializing_none]
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct ListToolsResponse {
29 pub tools: Vec<ToolDefinition>,
30 pub metadata: Option<serde_json::Value>,
31}
32
33#[skip_serializing_none]
35#[derive(Debug, Clone, Serialize, Deserialize, Default)]
36pub struct MetadataSchemaRequest {
37 #[serde(default)]
38 pub metadata: Option<serde_json::Value>,
39}
40
41#[skip_serializing_none]
43#[derive(Debug, Clone, Serialize, Deserialize, Default)]
44pub struct MetadataRequest {
45 #[serde(default)]
46 pub metadata: Option<serde_json::Value>,
47}
48
49#[skip_serializing_none]
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct ToolCallRequest {
53 pub arguments: serde_json::Value,
54 #[serde(default)]
55 pub metadata: Option<serde_json::Value>,
56}
57
58#[skip_serializing_none]
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct ContentPart {
62 pub data: serde_json::Value,
63 #[serde(default)]
64 pub mime_type: Option<String>,
65 #[serde(default)]
66 pub metadata: Option<serde_json::Value>,
67}
68
69#[skip_serializing_none]
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct ToolCallResponse {
73 pub content: Vec<ContentPart>,
74 #[serde(default)]
75 pub metadata: Option<serde_json::Value>,
76}
77
78#[skip_serializing_none]
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct ToolError {
82 pub kind: String,
83 pub message: String,
84 #[serde(default)]
85 pub metadata: Option<serde_json::Value>,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
90pub struct ErrorResponse {
91 pub error: ToolError,
92}
93
94#[skip_serializing_none]
96#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct ResourceInfo {
98 pub uri: String,
99 #[serde(default)]
100 pub mime_type: Option<String>,
101 pub description: String,
102 #[serde(default)]
103 pub metadata: Option<serde_json::Value>,
104}
105
106#[skip_serializing_none]
108#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct ListResourcesResponse {
110 pub resources: Vec<ResourceInfo>,
111 #[serde(default)]
112 pub metadata: Option<serde_json::Value>,
113}
114
115pub fn error_kind_to_status(kind: &str) -> u16 {
117 use crate::constants::*;
118 match kind {
119 ERR_NOT_FOUND => 404,
120 ERR_INVALID_ARGS => 422,
121 ERR_TIMEOUT => 504,
122 ERR_CAPABILITY_DENIED => 403,
123 _ => 500,
124 }
125}