Skip to main content

gproxy_protocol/claude/common/server_tools/
results.rs

1use serde::{Deserialize, Serialize};
2
3use super::super::{CacheControl, Caller, JsonObject, WebSearchResultBlock};
4use super::{
5    AdvisorRedactedResultBlock, AdvisorResultBlock, AdvisorToolResultError,
6    BashCodeExecutionResultBlock, BashCodeExecutionToolResultError, CodeExecutionResultBlock,
7    CodeExecutionToolResultError, EncryptedCodeExecutionResultBlock,
8    TextEditorCodeExecutionCreateResultBlock, TextEditorCodeExecutionStrReplaceResultBlock,
9    TextEditorCodeExecutionToolResultError, TextEditorCodeExecutionViewResultBlock,
10    ToolSearchToolResultError, ToolSearchToolSearchResultBlock, WebFetchResultBlock,
11    WebFetchToolResultError, WebSearchToolResultError,
12};
13
14#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
15#[serde(untagged)]
16#[non_exhaustive]
17pub enum WebSearchToolResultContent {
18    Error(WebSearchToolResultError),
19    Results(Vec<WebSearchResultBlock>),
20    Raw(serde_json::Value),
21}
22
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
24#[serde(untagged)]
25#[non_exhaustive]
26pub enum WebFetchToolResultContent {
27    Error(WebFetchToolResultError),
28    Result(Box<WebFetchResultBlock>),
29    Raw(serde_json::Value),
30}
31
32#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
33#[serde(untagged)]
34#[non_exhaustive]
35pub enum AdvisorToolResultContent {
36    Error(AdvisorToolResultError),
37    Result(AdvisorResultBlock),
38    Redacted(AdvisorRedactedResultBlock),
39    Raw(serde_json::Value),
40}
41
42#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
43#[serde(untagged)]
44#[non_exhaustive]
45pub enum CodeExecutionToolResultContent {
46    Error(CodeExecutionToolResultError),
47    Result(CodeExecutionResultBlock),
48    Encrypted(EncryptedCodeExecutionResultBlock),
49    Raw(serde_json::Value),
50}
51
52#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
53#[serde(untagged)]
54#[non_exhaustive]
55pub enum BashCodeExecutionToolResultContent {
56    Error(BashCodeExecutionToolResultError),
57    Result(BashCodeExecutionResultBlock),
58    Raw(serde_json::Value),
59}
60
61#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
62#[serde(untagged)]
63#[non_exhaustive]
64pub enum TextEditorCodeExecutionToolResultContent {
65    Error(TextEditorCodeExecutionToolResultError),
66    View(TextEditorCodeExecutionViewResultBlock),
67    Create(TextEditorCodeExecutionCreateResultBlock),
68    StrReplace(TextEditorCodeExecutionStrReplaceResultBlock),
69    Raw(serde_json::Value),
70}
71
72#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
73#[serde(untagged)]
74#[non_exhaustive]
75pub enum ToolSearchToolResultContent {
76    Error(ToolSearchToolResultError),
77    Result(ToolSearchToolSearchResultBlock),
78    Raw(serde_json::Value),
79}
80
81#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
82#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
83pub struct WebFetchToolResultBlock {
84    pub content: WebFetchToolResultContent,
85    pub tool_use_id: String,
86    #[serde(rename = "type")]
87    pub type_: WebFetchToolResultBlockType,
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub cache_control: Option<CacheControl>,
90    #[serde(skip_serializing_if = "Option::is_none")]
91    pub caller: Option<Caller>,
92    #[serde(default, flatten, skip_serializing_if = "JsonObject::is_empty")]
93    pub rest: serde_json::Map<String, serde_json::Value>,
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
97#[non_exhaustive]
98pub enum WebFetchToolResultBlockType {
99    #[serde(rename = "web_fetch_tool_result")]
100    WebFetchToolResult,
101}
102
103macro_rules! server_tool_result_block {
104    ($block:ident, $content:ident, $tag:ident, $wire:literal, $variant:ident) => {
105        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
106        pub struct $block {
107            pub content: $content,
108            pub tool_use_id: String,
109            #[serde(rename = "type")]
110            pub type_: $tag,
111            #[serde(skip_serializing_if = "Option::is_none")]
112            pub cache_control: Option<CacheControl>,
113            #[serde(default, flatten, skip_serializing_if = "JsonObject::is_empty")]
114            pub rest: serde_json::Map<String, serde_json::Value>,
115        }
116
117        #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
118        #[non_exhaustive]
119        pub enum $tag {
120            #[serde(rename = $wire)]
121            $variant,
122        }
123    };
124}
125
126server_tool_result_block!(
127    AdvisorToolResultBlock,
128    AdvisorToolResultContent,
129    AdvisorToolResultBlockType,
130    "advisor_tool_result",
131    AdvisorToolResult
132);
133server_tool_result_block!(
134    CodeExecutionToolResultBlock,
135    CodeExecutionToolResultContent,
136    CodeExecutionToolResultBlockType,
137    "code_execution_tool_result",
138    CodeExecutionToolResult
139);
140server_tool_result_block!(
141    BashCodeExecutionToolResultBlock,
142    BashCodeExecutionToolResultContent,
143    BashCodeExecutionToolResultBlockType,
144    "bash_code_execution_tool_result",
145    BashCodeExecutionToolResult
146);
147server_tool_result_block!(
148    TextEditorCodeExecutionToolResultBlock,
149    TextEditorCodeExecutionToolResultContent,
150    TextEditorCodeExecutionToolResultBlockType,
151    "text_editor_code_execution_tool_result",
152    TextEditorCodeExecutionToolResult
153);
154server_tool_result_block!(
155    ToolSearchToolResultBlock,
156    ToolSearchToolResultContent,
157    ToolSearchToolResultBlockType,
158    "tool_search_tool_result",
159    ToolSearchToolResult
160);