claude_agent/types/tool/
definition.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct ToolDefinition {
7 pub name: String,
8 pub description: String,
9 pub input_schema: serde_json::Value,
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub strict: Option<bool>,
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub defer_loading: Option<bool>,
14}
15
16impl ToolDefinition {
17 pub fn new(
18 name: impl Into<String>,
19 description: impl Into<String>,
20 input_schema: serde_json::Value,
21 ) -> Self {
22 Self {
23 name: name.into(),
24 description: description.into(),
25 input_schema,
26 strict: None,
27 defer_loading: None,
28 }
29 }
30
31 pub fn with_strict(mut self, strict: bool) -> Self {
32 self.strict = Some(strict);
33 self
34 }
35
36 pub fn with_defer_loading(mut self, defer: bool) -> Self {
37 self.defer_loading = Some(defer);
38 self
39 }
40
41 pub fn deferred(mut self) -> Self {
42 self.defer_loading = Some(true);
43 self
44 }
45
46 pub fn is_deferred(&self) -> bool {
47 self.defer_loading.unwrap_or(false)
48 }
49
50 pub fn estimated_tokens(&self) -> usize {
51 let name_tokens = self.name.len() / 4;
52 let desc_tokens = self.description.len() / 4;
53 let schema_tokens = self.input_schema.to_string().len() / 4;
54 name_tokens + desc_tokens + schema_tokens + 20
55 }
56}