Skip to main content

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 strict(mut self, strict: bool) -> Self {
32        self.strict = Some(strict);
33        self
34    }
35
36    pub fn 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        estimate_tool_tokens(&self.name, &self.description, &self.input_schema)
52    }
53}
54
55/// Estimate token count for a tool based on name, description, and schema sizes.
56///
57/// Uses a chars/4 heuristic (roughly 4 characters per token) plus a fixed
58/// overhead of 20 tokens for JSON structure.
59pub fn estimate_tool_tokens(name: &str, description: &str, schema: &serde_json::Value) -> usize {
60    name.len() / 4 + description.len() / 4 + schema.to_string().len() / 4 + 20
61}