claude_agent/types/tool/
definition.rs

1//! Tool definition types.
2
3use 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}