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 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
55pub 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}