#![cfg(feature = "macros")]
use clust::Client;
use clust::messages::ClaudeModel;
use clust::messages::MaxTokens;
use clust::messages::Message;
use clust::messages::MessagesRequestBody;
use clust::messages::ToolList;
use clust_macros::clust_tool;
#[clust_tool]
fn get_weather(location: String) -> String {
"15 degrees".to_string() }
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let client = Client::from_env()?;
let tool_increment = ClustTool_get_weather {}; let tools = ToolList::new(vec![Box::new(
tool_increment,
)]);
let model = ClaudeModel::Claude35Sonnet20240620;
let messages = vec![Message::user(
"What is the weather like in San Francisco?",
)];
let max_tokens = MaxTokens::new(1024, model)?;
let request_body = MessagesRequestBody {
model,
messages,
max_tokens,
tools: Some(tools.definitions()), ..Default::default()
};
let response = client
.create_a_message(request_body)
.await?;
println!("Result:\n{}", response);
assert_eq!(
response.stop_reason,
Some(clust::messages::StopReason::ToolUse)
);
let tool_use = response
.content
.flatten_into_tool_use()?;
println!("Tool use: {}", tool_use);
let tool_result = tools.call(tool_use)?;
println!("Tool result: {}", tool_result);
Ok(())
}