codex-client-sdk 0.107.0

Rust SDK for embedding the Codex agent via CLI-over-JSONL transport
Documentation
use serde::{Deserialize, Serialize};

use crate::items::ThreadItem;

/// Token usage for a completed turn.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Usage {
    /// Input tokens consumed by the turn.
    pub input_tokens: u64,
    /// Input tokens served from cache.
    pub cached_input_tokens: u64,
    /// Output tokens generated by the model.
    pub output_tokens: u64,
}

/// Turn failure payload.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ThreadError {
    /// Human-readable error message emitted for a failed turn.
    pub message: String,
}

/// Payload for a `thread.started` event.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ThreadStartedEvent {
    /// Stable thread identifier used for subsequent `resume` turns.
    pub thread_id: String,
}

/// Payload for a `turn.started` event.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TurnStartedEvent;

/// Payload for a `turn.completed` event.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TurnCompletedEvent {
    /// Final token usage reported for the turn.
    pub usage: Usage,
}

/// Payload for a `turn.failed` event.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TurnFailedEvent {
    /// Error details for the failed turn.
    pub error: ThreadError,
}

/// Payload for an `item.started` event.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ItemStartedEvent {
    /// Item state snapshot when processing begins.
    pub item: ThreadItem,
}

/// Payload for an `item.updated` event.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ItemUpdatedEvent {
    /// Item state snapshot after an incremental update.
    pub item: ThreadItem,
}

/// Payload for an `item.completed` event.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ItemCompletedEvent {
    /// Final item payload.
    pub item: ThreadItem,
}

/// Payload for a top-level `error` event.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ThreadErrorEvent {
    /// Human-readable stream-level error message.
    pub message: String,
}

/// Top-level JSONL events emitted by `codex exec --experimental-json`.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
pub enum ThreadEvent {
    /// Emitted once when a thread is created and assigned an id.
    #[serde(rename = "thread.started")]
    ThreadStarted {
        /// Stable thread identifier used for subsequent turns.
        thread_id: String,
    },
    /// Emitted when a new turn starts execution.
    #[serde(rename = "turn.started")]
    TurnStarted,
    /// Emitted after a successful turn with token usage information.
    #[serde(rename = "turn.completed")]
    TurnCompleted {
        /// Final token usage for the completed turn.
        usage: Usage,
    },
    /// Emitted when a turn fails.
    #[serde(rename = "turn.failed")]
    TurnFailed {
        /// Failure payload describing why the turn failed.
        error: ThreadError,
    },
    /// Emitted when an item starts.
    #[serde(rename = "item.started")]
    ItemStarted {
        /// Item snapshot at start time.
        item: ThreadItem,
    },
    /// Emitted when an in-progress item receives an update.
    #[serde(rename = "item.updated")]
    ItemUpdated {
        /// Item snapshot after an intermediate update.
        item: ThreadItem,
    },
    /// Emitted when an item is completed.
    #[serde(rename = "item.completed")]
    ItemCompleted {
        /// Final item snapshot.
        item: ThreadItem,
    },
    /// Emitted for stream-level errors not tied to a specific turn item.
    #[serde(rename = "error")]
    Error {
        /// Human-readable stream-level error message.
        message: String,
    },
}