codex-cli-sdk 0.0.1

Rust SDK for the OpenAI Codex CLI
Documentation
//! Streaming — print agent output as it arrives.
//!
//! Demonstrates `run_streamed()` and the `ThreadEvent` item lifecycle:
//! `ItemStarted` → `ItemUpdated` (text deltas) → `ItemCompleted`.
//!
//! ```bash
//! cargo run --example 02_streaming
//! ```

use codex_cli_sdk::{Codex, CodexConfig, ThreadEvent, ThreadItem, ThreadOptions};
use tokio_stream::StreamExt;

#[tokio::main]
async fn main() -> codex_cli_sdk::Result<()> {
    let codex = Codex::new(CodexConfig::default())?;
    let mut thread = codex.start_thread(ThreadOptions::default());

    let mut stream = thread
        .run_streamed("Explain the Rust borrow checker", Default::default())
        .await?;

    while let Some(event) = stream.next().await {
        match event? {
            // Text delta — print as it streams in
            ThreadEvent::ItemUpdated {
                item: ThreadItem::AgentMessage { text, .. },
            } => {
                print!("{text}");
            }
            // Command started
            ThreadEvent::ItemStarted {
                item: ThreadItem::CommandExecution { command, .. },
            } => {
                println!("\n> Running: {command}");
            }
            // Command finished
            ThreadEvent::ItemCompleted {
                item: ThreadItem::CommandExecution { exit_code, .. },
            } => {
                if let Some(code) = exit_code {
                    println!("  (exit {code})");
                }
            }
            // Turn done
            ThreadEvent::TurnCompleted { usage } => {
                println!("\n--- Turn complete ---");
                println!(
                    "Tokens: {} in / {} out",
                    usage.input_tokens, usage.output_tokens
                );
            }
            ThreadEvent::TurnFailed { error } => {
                eprintln!("Turn failed: {}", error.message);
            }
            _ => {}
        }
    }

    Ok(())
}