use api_claude::{ Client, CreateMessageRequest, Message, Role, Content };
#[ tokio::main( flavor = "current_thread" ) ]
async fn main() -> Result< (), Box< dyn core::error::Error > >
{
println!( "Initializing Claude client from environment..." );
let client = Client::from_env()?;
let request = CreateMessageRequest::builder()
.model( "claude-sonnet-4-5-20250929".to_string() )
.max_tokens( 1024 )
.messages( vec![
Message
{
role : Role::User,
content : vec![ Content::Text {
r#type : "text".to_string(),
text : "Hello! Can you explain what artificial intelligence is in simple terms?".to_string(),
} ],
cache_control : None,
}
] )
.temperature( 0.7 )
.build();
println!( "=== Request JSON Payload ===" );
println!( "{}", serde_json::to_string_pretty( &request )? );
println!( "=== End JSON Payload ===\n" );
#[ cfg( feature = "curl-diagnostics" ) ]
{
println!( "=== Exact Curl Command Being Executed ===" );
println!( "curl -X POST https://api.anthropic.com/v1/messages \\" );
println!( " -H \"Content-Type : application/json\" \\" );
println!( " -H \"x-api-key : $ANTHROPIC_API_KEY\" \\" );
println!( " -H \"anthropic-version : 2023-06-01\" \\" );
println!( " -d '{}'", serde_json::to_string( &request )? );
println!( "=== End Curl Command ===\n" );
}
println!( "Sending request to Claude API..." );
let response = client.create_message( request ).await?;
if let Some( content ) = response.content.first()
{
if content.r#type == "text"
{
if let Some( text ) = &content.text
{
println!( "\n=== Claude Response ===" );
println!( "{text}" );
}
}
else
{
println!( "Non-text content received (unexpected for this example)" );
}
}
else
{
println!( "No response received from the API." );
}
if let Some( stop_reason ) = &response.stop_reason
{
println!( "\nStop reason : {stop_reason}" );
}
let usage = &response.usage;
println!( "\n=== Token Usage ===" );
println!( "Input tokens : {}", usage.input_tokens );
println!( "Output tokens : {}", usage.output_tokens );
println!( "Total tokens : {}", usage.total_tokens() );
println!( "\nModel used : {}", response.model );
Ok( () )
}