Skip to main content

anthropic_tools/
anthropic-tools.rs

1use anylm::{Chunk, Completions, Schema, Tool, prelude::*};
2
3#[tokio::main]
4async fn main() -> Result<()> {
5    let api_key = std::env::var("ANTHROPIC_API_KEY")?;
6
7    /// The weather tool data
8    #[allow(dead_code)]
9    #[derive(Debug, serde::Deserialize)]
10    struct LocationData {
11        location: String,
12    }
13
14    // send request:
15    let mut response = Completions::anthropic(api_key, "claude-opus-4-6")
16        .proxy(Proxy::all("socks5://127.0.0.1:1080")?)
17        .user_message(vec!["What's the weather like in London?".into()])
18        .tool(Tool::new(
19            "weather",
20            "Search weather by location",
21            Schema::object("Location data")
22                .required_property("location", Schema::string("The location")),
23        ))
24        .send()
25        .await?;
26
27    // read response stream:
28    let mut tool_calls = vec![];
29    while let Some(chunk) = response.next().await {
30        match chunk? {
31            Chunk::Text(text) => {
32                eprint!("{text}");
33            }
34            Chunk::Tool(name, json_str) => {
35                tool_calls.push((name, json_str));
36            }
37        }
38    }
39    println!();
40
41    // handle tool calls:
42    for (name, json_str) in tool_calls {
43        match name.as_ref() {
44            "weather" => {
45                let location: LocationData = serde_json::from_str(&json_str)?;
46                println!("{location:#?}");
47            }
48            _ => {}
49        }
50    }
51
52    Ok(())
53}