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}