1use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct ToolDefinition {
8 pub name: String,
10 pub description: String,
12 pub input_schema: HashMap<String, serde_json::Value>,
14}
15
16impl ToolDefinition {
17 pub fn new(
19 name: impl Into<String>,
20 description: impl Into<String>,
21 input_schema: HashMap<String, serde_json::Value>,
22 ) -> Self {
23 Self {
24 name: name.into(),
25 description: description.into(),
26 input_schema,
27 }
28 }
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct ToolCall {
34 pub id: String,
36 pub name: String,
38 pub arguments: String,
40}
41
42impl ToolCall {
43 pub fn new(
45 id: impl Into<String>,
46 name: impl Into<String>,
47 arguments: impl Into<String>,
48 ) -> Self {
49 Self {
50 id: id.into(),
51 name: name.into(),
52 arguments: arguments.into(),
53 }
54 }
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct ToolResult {
60 pub tool_call_id: String,
62 pub content: String,
64 pub is_error: bool,
66}
67
68impl ToolResult {
69 pub fn success(tool_call_id: impl Into<String>, content: impl Into<String>) -> Self {
71 Self {
72 tool_call_id: tool_call_id.into(),
73 content: content.into(),
74 is_error: false,
75 }
76 }
77
78 pub fn error(tool_call_id: impl Into<String>, content: impl Into<String>) -> Self {
80 Self {
81 tool_call_id: tool_call_id.into(),
82 content: content.into(),
83 is_error: true,
84 }
85 }
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
90pub struct Response {
91 pub content: String,
93 pub stop_reason: StopReason,
95}
96
97#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
98#[serde(rename_all = "camelCase")]
99pub enum StopReason {
101 Stop,
103 Length,
105 ToolUse,
107 Error,
109 Aborted,
111}