streaming_usage/
streaming_usage.rs

1// examples/streaming_usage.rs
2
3use anthropic_sdk::Client;
4use dotenv::dotenv;
5use serde_json::json;
6use std::sync::{Arc, Mutex};
7
8#[tokio::main]
9async fn main() -> Result<(), Box<dyn std::error::Error>> {
10    dotenv().ok();
11    let secret_key = std::env::var("ANTHROPIC_API_KEY").unwrap_or_default();
12
13    let request = Client::new()
14        .auth(secret_key.as_str())
15        .model("claude-3-opus-20240229")
16        .messages(&json!([
17            {"role": "user", "content": "Write me a poem about bravery"}
18        ]))
19        .system("Make it sound like Edgar Allan Poe")
20        .temperature(0.1)
21        .max_tokens(1024)
22        .stream(true)
23        .build()?;
24
25    let message = Arc::new(Mutex::new(String::new()));
26    let message_clone = message.clone();
27
28    // NOTE: you should spawn a new thread if you need to
29    if let Err(error) = request
30        .execute(move |text| {
31            let message_clone = message_clone.clone();
32            async move {
33                println!("{text}");
34
35                {
36                    let mut message = message_clone.lock().unwrap();
37                    *message = format!("{}{}", *message, text);
38                    drop(message);
39                }
40                // Mimic async process
41                // tokio::time::sleep(tokio::time::Duration::from_millis(200)).await;
42            }
43        })
44        .await
45    {
46        eprintln!("Error: {error}");
47    }
48
49    let final_message = message.lock().unwrap();
50    println!("Message: {}", *final_message); // or get the whole message at the end
51
52    Ok(())
53}