message_cli/message_cli.rs
1//! # Message CLI Example
2//!
3//! This example demonstrates a simple command-line interface for interacting with Claude.
4//! It creates a conversation loop where the user can chat with the AI assistant.
5//!
6//! ## Features
7//!
8//! - Initializes with a system-like message to set the assistant's behavior
9//! - Maintains conversation history for context
10//! - Simple command-line interface for user input
11//!
12//! ## Usage
13//!
14//! Run this example with:
15//!
16//! ```bash
17//! cargo run --example message_cli
18//! ```
19//!
20//! Make sure you have set the `ANTHROPIC_API_KEY` environment variable.
21
22use anthropic_api::{messages::*, Credentials};
23use std::io::{stdin, stdout, Write};
24
25#[tokio::main]
26async fn main() {
27 // Load .env file containing ANTHROPIC_API_KEY
28 let credentials = Credentials::from_env();
29
30 let mut messages = vec![Message {
31 role: MessageRole::User,
32 content: MessageContent::Text(
33 "You are a helpful AI assistant. Please introduce yourself briefly.".to_string(),
34 ),
35 }];
36
37 // Create initial message request
38 let response = MessagesBuilder::builder("claude-3-7-sonnet-20250219", messages.clone(), 2048)
39 .credentials(credentials.clone())
40 // Uncomment this to enable thinking
41 // .thinking(Thinking {
42 // thinking_type: ThinkingType::Enabled,
43 // budget_tokens: 1024,
44 // })
45 .create()
46 .await
47 .unwrap();
48
49 // Print assistant's response
50 if let Some(content) = response.content.first() {
51 match content {
52 ResponseContentBlock::Text { text } => {
53 println!("Assistant: {}", text.trim());
54 messages.push(Message {
55 role: MessageRole::Assistant,
56 content: MessageContent::Text(text.clone()),
57 });
58 }
59 _ => {}
60 }
61 }
62
63 // Start conversation loop
64 loop {
65 print!("User: ");
66 stdout().flush().unwrap();
67
68 let mut user_input = String::new();
69 stdin().read_line(&mut user_input).unwrap();
70
71 // Add user message
72 messages.push(Message {
73 role: MessageRole::User,
74 content: MessageContent::Text(user_input),
75 });
76
77 // Send message request
78 let response =
79 MessagesResponse::builder("claude-3-7-sonnet-20250219", messages.clone(), 1024)
80 .credentials(credentials.clone())
81 .create()
82 .await
83 .unwrap();
84
85 // Print assistant's response
86 if let Some(content) = response.content.first() {
87 match content {
88 ResponseContentBlock::Text { text } => {
89 println!("Assistant: {}", text.trim());
90 messages.push(Message {
91 role: MessageRole::Assistant,
92 content: MessageContent::Text(text.clone()),
93 });
94 }
95 _ => {}
96 }
97 }
98 }
99}