pub struct ClaudeClient { /* private fields */ }Expand description
Claude API client
This client can connect to either the Anthropic API directly or AWS Bedrock.
§Example - Anthropic API
use claude_sdk::ClaudeClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = ClaudeClient::anthropic(
std::env::var("ANTHROPIC_API_KEY")?
);
Ok(())
}§Example - AWS Bedrock
use claude_sdk::ClaudeClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Requires --features bedrock
let client = ClaudeClient::bedrock("us-east-1").await?;
Ok(())
}Implementations§
Source§impl ClaudeClient
impl ClaudeClient
Sourcepub fn anthropic(api_key: impl Into<String>) -> Self
pub fn anthropic(api_key: impl Into<String>) -> Self
Create a new client for the Anthropic API
§Example
use claude_sdk::ClaudeClient;
let client = ClaudeClient::anthropic("your-api-key");Sourcepub async fn bedrock(region: impl Into<String>) -> Result<Self>
pub async fn bedrock(region: impl Into<String>) -> Result<Self>
Create a new client for AWS Bedrock
This loads AWS credentials from the environment (AWS_PROFILE, AWS_ACCESS_KEY_ID, etc.) using the standard AWS credential chain.
§Example
use claude_sdk::ClaudeClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Uses AWS_PROFILE or default credential chain
let client = ClaudeClient::bedrock("us-east-1").await?;
Ok(())
}Sourcepub async fn send_message(
&self,
request: MessagesRequest,
) -> Result<MessagesResponse>
pub async fn send_message( &self, request: MessagesRequest, ) -> Result<MessagesResponse>
Send a message and get a complete response
This is the non-streaming API. For streaming responses, use send_streaming().
§Example
use claude_sdk::{ClaudeClient, MessagesRequest, Message};
let client = ClaudeClient::anthropic("your-api-key");
let request = MessagesRequest::new(
"claude-3-5-sonnet-20241022",
1024,
vec![Message::user("Hello, Claude!")],
);
let response = client.send_message(request).await?;
println!("Response: {:?}", response.content);Sourcepub async fn send_streaming(
&self,
request: MessagesRequest,
) -> Result<Pin<Box<dyn Stream<Item = Result<StreamEvent>> + Send>>>
pub async fn send_streaming( &self, request: MessagesRequest, ) -> Result<Pin<Box<dyn Stream<Item = Result<StreamEvent>> + Send>>>
Send a message and stream the response
Returns a stream of events as Claude generates its response.
§Example
use claude_sdk::{ClaudeClient, MessagesRequest, Message, StreamEvent};
use futures::StreamExt;
let client = ClaudeClient::anthropic("your-api-key");
let request = MessagesRequest::new(
claude_sdk::models::CLAUDE_SONNET_4_5.anthropic_id,
1024,
vec![Message::user("Tell me a story")],
);
let mut stream = client.send_streaming(request).await?;
while let Some(event) = stream.next().await {
match event? {
StreamEvent::ContentBlockDelta { delta, .. } => {
if let Some(text) = delta.text() {
print!("{}", text);
}
}
StreamEvent::MessageStop => break,
_ => {}
}
}Sourcepub async fn count_tokens(&self, request: MessagesRequest) -> Result<TokenCount>
pub async fn count_tokens(&self, request: MessagesRequest) -> Result<TokenCount>
Count tokens for a request without sending it
Uses the server-side token counting endpoint for accurate counts.
This is more accurate than the local TokenCounter but requires an API call.
§Example
use claude_sdk::{ClaudeClient, MessagesRequest, Message};
let client = ClaudeClient::anthropic("your-api-key");
let request = MessagesRequest::new(
"claude-sonnet-4-5-20250929",
1024,
vec![Message::user("Hello!")],
);
let count = client.count_tokens(request).await?;
println!("Would use {} input tokens", count.input_tokens);Sourcepub async fn send_message_with_retry(
&self,
request: MessagesRequest,
config: RetryConfig,
) -> Result<MessagesResponse>
pub async fn send_message_with_retry( &self, request: MessagesRequest, config: RetryConfig, ) -> Result<MessagesResponse>
Send a message with automatic retry on transient failures
This method automatically retries on rate limits (429) and server errors (5xx)
using exponential backoff. Use the provided RetryConfig to customize behavior.
§Example
use claude_sdk::{ClaudeClient, MessagesRequest, Message};
use claude_sdk::retry::RetryConfig;
let client = ClaudeClient::anthropic("your-api-key");
let request = MessagesRequest::new(
claude_sdk::models::CLAUDE_SONNET_4_5.anthropic_id,
1024,
vec![Message::user("Hello!")],
);
let config = RetryConfig::new().with_max_attempts(5);
let response = client.send_message_with_retry(request, config).await?;Sourcepub async fn send_streaming_with_retry(
&self,
request: MessagesRequest,
config: RetryConfig,
) -> Result<Pin<Box<dyn Stream<Item = Result<StreamEvent>> + Send>>>
pub async fn send_streaming_with_retry( &self, request: MessagesRequest, config: RetryConfig, ) -> Result<Pin<Box<dyn Stream<Item = Result<StreamEvent>> + Send>>>
Send a streaming message with automatic retry on transient failures
Note: Retries create a new stream, so partial results from failed attempts are lost.
Auto Trait Implementations§
impl !RefUnwindSafe for ClaudeClient
impl !UnwindSafe for ClaudeClient
impl Freeze for ClaudeClient
impl Send for ClaudeClient
impl Sync for ClaudeClient
impl Unpin for ClaudeClient
impl UnsafeUnpin for ClaudeClient
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more