pub use codex_api::ResponseEvent; use codex_config::types::Personality; use codex_protocol::error::Result; use codex_protocol::models::BaseInstructions; use codex_protocol::models::ResponseItem; use codex_tools::ToolSpec; use futures::Stream; use serde_json::Value; use std::pin::Pin; use std::task::Context; use std::task::Poll; use tokio::sync::mpsc; use tokio_util::sync::CancellationToken; /// Review thread system prompt. Edit `core/src/review_prompt.md` to customize. pub const REVIEW_PROMPT: &str = include_str!("../review_prompt.md"); // Centralized templates for review-related user messages pub const REVIEW_EXIT_SUCCESS_TMPL: &str = include_str!("../templates/review/exit_success.xml"); pub const REVIEW_EXIT_INTERRUPTED_TMPL: &str = include_str!("../templates/review/exit_interrupted.xml"); /// API request payload for a single model turn #[derive(Debug, Clone)] pub struct Prompt { /// Conversation context input items. pub input: Vec, /// Tools available to the model, including additional tools sourced from /// external MCP servers. pub(crate) tools: Vec, /// Whether parallel tool calls are permitted for this prompt. pub(crate) parallel_tool_calls: bool, pub base_instructions: BaseInstructions, /// Optionally specify the personality of the model. pub personality: Option, /// Optional the output schema for the model's response. pub output_schema: Option, /// Whether the Responses API should strictly validate `output_schema`. pub output_schema_strict: bool, } impl Default for Prompt { fn default() -> Self { Self { input: Vec::new(), tools: Vec::new(), parallel_tool_calls: false, base_instructions: BaseInstructions::default(), personality: None, output_schema: None, output_schema_strict: true, } } } impl Prompt { pub(crate) fn get_formatted_input(&self) -> Vec { self.input.clone() } } pub struct ResponseStream { pub(crate) rx_event: mpsc::Receiver>, /// Signals the mapper task that the consumer stopped polling before the /// provider stream reached its own terminal event. pub(crate) consumer_dropped: CancellationToken, } impl Stream for ResponseStream { type Item = Result; fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { self.rx_event.poll_recv(cx) } } impl Drop for ResponseStream { fn drop(&mut self) { self.consumer_dropped.cancel(); } } #[cfg(test)] #[path = "client_common_tests.rs"] mod tests;