claude-code-sdk-rust 0.1.0

Async Rust SDK for the Claude Code CLI: streaming agent turns, tool use, and sessions.
Documentation
use claude_agent_sdk::{query, ClaudeAgentOptions};

const CLAUDE_HAIKU_4_5_MODEL: &str = "claude-haiku-4-5-20251001";

fn has_real_claude_auth() -> bool {
    std::env::var_os("ANTHROPIC_API_KEY").is_some()
        || std::env::var_os("CLAUDE_CODE_OAUTH_TOKEN").is_some()
}

#[tokio::test]
#[ignore = "requires Claude CLI authentication and may incur API usage"]
async fn real_claude_cli_query_smoke() {
    if !has_real_claude_auth() {
        eprintln!("skipping: ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN is required");
        return;
    }

    let options = ClaudeAgentOptions::builder().max_turns(1).build();
    let result = query("Reply with exactly: pong", Some(options))
        .await
        .expect("real Claude CLI query should succeed");

    assert!(
        result.content.to_ascii_lowercase().contains("pong"),
        "expected response to contain pong, got {:?}",
        result.content
    );
}

#[tokio::test]
#[ignore = "requires Claude CLI authentication and may incur API usage"]
async fn real_claude_cli_haiku_4_5_query_smoke() {
    if !has_real_claude_auth() {
        eprintln!("skipping: ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN is required");
        return;
    }

    let options = ClaudeAgentOptions::builder()
        .model(CLAUDE_HAIKU_4_5_MODEL)
        .max_turns(1)
        .build();
    let result = query("Reply with exactly: haiku-pong", Some(options))
        .await
        .expect("real Claude CLI Haiku 4.5 query should succeed");

    assert_eq!(
        result.content.trim(),
        "haiku-pong",
        "expected exact Haiku 4.5 response, got {:?}",
        result.content
    );
}