1use futures_util::StreamExt;
9use quantum_sdk::{ChatMessage, ChatRequest, Client};
10
11#[tokio::main]
12async fn main() {
13 let api_key = std::env::var("QAI_API_KEY").expect("QAI_API_KEY environment variable is required");
14
15 let client = Client::new(api_key);
16
17 println!("=== Non-streaming Chat ===");
19
20 let resp = client
21 .chat(&ChatRequest {
22 model: "claude-sonnet-4-6".into(),
23 messages: vec![ChatMessage::user(
24 "What is quantum computing in one sentence?",
25 )],
26 ..Default::default()
27 })
28 .await
29 .expect("Chat failed");
30
31 println!("Model: {}", resp.model);
32 println!("Response: {}", resp.text());
33 if let Some(usage) = &resp.usage {
34 println!(
35 "Tokens: {} in / {} out (cost: {} ticks)",
36 usage.input_tokens, usage.output_tokens, usage.cost_ticks
37 );
38 }
39 println!("Request ID: {}\n", resp.request_id);
40
41 println!("=== Streaming Chat ===");
43
44 let mut stream = client
45 .chat_stream(&ChatRequest {
46 model: "claude-sonnet-4-6".into(),
47 messages: vec![ChatMessage::user(
48 "Count from 1 to 5, one number per line.",
49 )],
50 ..Default::default()
51 })
52 .await
53 .expect("ChatStream failed");
54
55 while let Some(ev) = stream.next().await {
56 match ev.event_type.as_str() {
57 "content_delta" => {
58 if let Some(delta) = &ev.delta {
59 print!("{}", delta.text);
60 }
61 }
62 "usage" => {
63 if let Some(usage) = &ev.usage {
64 println!("\n[Cost: {} ticks]", usage.cost_ticks);
65 }
66 }
67 "error" => {
68 eprintln!("Stream error: {}", ev.error.as_deref().unwrap_or("unknown"));
69 std::process::exit(1);
70 }
71 "done" => {
72 println!("\n[Stream complete]");
73 }
74 _ => {}
75 }
76 }
77}