use clust::messages::ClaudeModel;
use clust::messages::MaxTokens;
use clust::messages::Message;
use clust::messages::MessageChunk;
use clust::messages::MessagesRequestBody;
use clust::messages::StreamOption;
use clust::messages::SystemPrompt;
use clust::Client;
use clap::Parser;
use futures_util::StreamExt;
#[derive(Parser)]
struct Arguments {
#[arg(short, long)]
prompt: String,
#[arg(short, long)]
message: String,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let arguments = Arguments::parse();
let client = Client::from_env()?;
let model = ClaudeModel::Claude3Sonnet20240229;
let messages = vec![Message::user(
arguments.message,
)];
let max_tokens = MaxTokens::new(1024, model)?;
let system_prompt = SystemPrompt::new(arguments.prompt);
let request_body = MessagesRequestBody {
model,
messages,
max_tokens,
system: Some(system_prompt),
stream: Some(StreamOption::ReturnStream), ..Default::default()
};
let mut stream = client
.create_a_message_stream(request_body)
.await?;
let mut buffer = String::new();
while let Some(chunk) = stream.next().await {
match chunk {
| Ok(chunk) => {
println!("Chunk:\n{}", chunk);
match chunk {
| MessageChunk::ContentBlockDelta(content_block_delta) => {
buffer.push_str(&content_block_delta.delta.text);
},
| _ => {},
}
},
| Err(error) => {
eprintln!("Chunk error:\n{:?}", error);
},
}
}
println!("Result:\n{}", buffer);
Ok(())
}