Download codex-rs/codex-api/src/common.rs from SaylorTwift/codex: direct link, hf CLI and curl.
- Browser
- Download file 13.4 kB
-
https://huggingface.co/SaylorTwift/codex/resolve/main/codex-rs/codex-api/src/common.rs
- Command line
-
hf download hf://SaylorTwift/codex/codex-rs/codex-api/src/common.rs
-
curl -L -o common.rs https://huggingface.co/SaylorTwift/codex/resolve/main/codex-rs/codex-api/src/common.rs
13.4 kB
| use crate::error::ApiError; | |
| use codex_protocol::ResponseUsageMetadata; | |
| use codex_protocol::config_types::ReasoningSummary as ReasoningSummaryConfig; | |
| use codex_protocol::config_types::Verbosity as VerbosityConfig; | |
| use codex_protocol::models::ResponseItem; | |
| use codex_protocol::openai_models::ReasoningEffort as ReasoningEffortConfig; | |
| use codex_protocol::protocol::ModelVerification; | |
| use codex_protocol::protocol::RateLimitSnapshot; | |
| use codex_protocol::protocol::TokenUsage; | |
| use codex_protocol::protocol::TurnModerationMetadataEvent; | |
| use codex_protocol::protocol::W3cTraceContext; | |
| use codex_protocol::turn_input::CyberAccessProgram; | |
| use futures::Stream; | |
| use serde::Deserialize; | |
| use serde::Serialize; | |
| use serde_json::Value; | |
| use serde_json::value::RawValue; | |
| use std::collections::HashMap; | |
| use std::pin::Pin; | |
| use std::sync::Arc; | |
| use std::task::Context; | |
| use std::task::Poll; | |
| use tokio::sync::mpsc; | |
| pub const WS_REQUEST_HEADER_TRACEPARENT_CLIENT_METADATA_KEY: &str = "ws_request_header_traceparent"; | |
| pub const WS_REQUEST_HEADER_TRACESTATE_CLIENT_METADATA_KEY: &str = "ws_request_header_tracestate"; | |
| /// Explicit per-request access selection using the Responses API wire values. | |
| pub struct AccessPrograms { | |
| cyber: &'static str, | |
| } | |
| impl From<CyberAccessProgram> for AccessPrograms { | |
| fn from(program: CyberAccessProgram) -> Self { | |
| Self { | |
| cyber: match program { | |
| CyberAccessProgram::Standard => "standard", | |
| CyberAccessProgram::DaybreakBlue => "daybreak_blue", | |
| CyberAccessProgram::DaybreakRed => "daybreak_red", | |
| }, | |
| } | |
| } | |
| } | |
| /// Canonical input payload for the memory summarize endpoint. | |
| pub struct MemorySummarizeInput { | |
| pub model: String, | |
| pub raw_memories: Vec<RawMemory>, | |
| pub reasoning: Option<Reasoning>, | |
| } | |
| pub struct RawMemory { | |
| pub id: String, | |
| pub metadata: RawMemoryMetadata, | |
| pub items: Vec<Value>, | |
| } | |
| pub struct RawMemoryMetadata { | |
| pub source_path: String, | |
| } | |
| pub struct MemorySummarizeOutput { | |
| pub raw_memory: String, | |
| pub memory_summary: String, | |
| } | |
| /// The latest server response ID received in this turn, shared with tool-review extensions. | |
| pub struct ResponseId(pub String); | |
| pub enum ResponseEvent { | |
| Created { | |
| /// Existing server response ID, when supplied by the stream. | |
| response_id: Option<String>, | |
| }, | |
| SafetyBuffering(SafetyBuffering), | |
| OutputItemDone(ResponseItem), | |
| OutputItemAdded(ResponseItem), | |
| /// Emitted when the server includes `OpenAI-Model` on the stream response. | |
| /// This can differ from the requested model when backend safety routing applies. | |
| ServerModel(String), | |
| /// Emitted when the server recommends additional account verification. | |
| ModelVerifications(Vec<ModelVerification>), | |
| /// Emitted when the server includes moderation metadata for first-party turn presentation. | |
| TurnModerationMetadata(TurnModerationMetadataEvent), | |
| /// Emitted when `X-Reasoning-Included: true` is present on the response, | |
| /// meaning the server already accounted for past reasoning tokens and the | |
| /// client should not re-estimate them. | |
| ServerReasoningIncluded(bool), | |
| Completed { | |
| response_id: String, | |
| token_usage: Option<TokenUsage>, | |
| usage_metadata: Option<ResponseUsageMetadata>, | |
| /// Did the model affirmatively end its turn? Some providers do not set this, | |
| /// so we rely on fallback logic when this is `None`. | |
| end_turn: Option<bool>, | |
| }, | |
| OutputTextDelta(String), | |
| ToolCallInputDelta { | |
| item_id: String, | |
| call_id: Option<String>, | |
| delta: String, | |
| }, | |
| ReasoningSummaryDelta { | |
| delta: String, | |
| summary_index: i64, | |
| }, | |
| ReasoningSummaryDone { | |
| item_id: String, | |
| text: String, | |
| summary_index: i64, | |
| }, | |
| ReasoningContentDelta { | |
| delta: String, | |
| content_index: i64, | |
| }, | |
| ReasoningSummaryPartAdded { | |
| summary_index: i64, | |
| }, | |
| RateLimits(RateLimitSnapshot), | |
| ModelsEtag(String), | |
| } | |
| pub struct SafetyBuffering { | |
| pub use_cases: Vec<String>, | |
| pub reasons: Vec<String>, | |
| pub show_buffering_ui: bool, | |
| pub faster_model: Option<String>, | |
| } | |
| pub(crate) struct SafetyBufferingTreatment { | |
| pub faster_model: Option<String>, | |
| } | |
| pub enum ReasoningContext { | |
| Auto, | |
| CurrentTurn, | |
| AllTurns, | |
| } | |
| pub struct Reasoning { | |
| pub effort: Option<ReasoningEffortConfig>, | |
| pub summary: Option<ReasoningSummaryConfig>, | |
| pub context: Option<ReasoningContext>, | |
| } | |
| pub enum ReasoningSummaryDelivery { | |
| SequentialCutoff, | |
| } | |
| pub struct StreamOptions { | |
| pub reasoning_summary_delivery: ReasoningSummaryDelivery, | |
| } | |
| pub enum TextFormatType { | |
| JsonSchema, | |
| } | |
| pub struct TextFormat { | |
| /// Format type used by the OpenAI text controls. | |
| pub r#type: TextFormatType, | |
| /// When true, the server is expected to strictly validate responses. | |
| pub strict: bool, | |
| /// JSON schema for the desired output. | |
| pub schema: Value, | |
| /// Friendly name for the format, used in telemetry/debugging. | |
| pub name: String, | |
| } | |
| /// Controls the `text` field for the Responses API, combining verbosity and | |
| /// optional JSON schema output formatting. | |
| pub struct TextControls { | |
| pub verbosity: Option<OpenAiVerbosity>, | |
| pub format: Option<TextFormat>, | |
| } | |
| pub enum OpenAiVerbosity { | |
| Low, | |
| Medium, | |
| High, | |
| } | |
| impl From<VerbosityConfig> for OpenAiVerbosity { | |
| fn from(v: VerbosityConfig) -> Self { | |
| match v { | |
| VerbosityConfig::Low => OpenAiVerbosity::Low, | |
| VerbosityConfig::Medium => OpenAiVerbosity::Medium, | |
| VerbosityConfig::High => OpenAiVerbosity::High, | |
| } | |
| } | |
| } | |
| /// Serialized tool definitions for Responses API requests. | |
| /// | |
| /// Keeping the tool list as raw JSON avoids rebuilding a generic JSON value | |
| /// tree, while the shared allocation keeps request clones cheap. | |
| pub struct ResponsesApiTools(Arc<RawValue>); | |
| impl ResponsesApiTools { | |
| pub(crate) fn as_raw_value(&self) -> &RawValue { | |
| &self.0 | |
| } | |
| } | |
| impl From<Arc<RawValue>> for ResponsesApiTools { | |
| fn from(value: Arc<RawValue>) -> Self { | |
| Self(value) | |
| } | |
| } | |
| impl PartialEq for ResponsesApiTools { | |
| fn eq(&self, other: &Self) -> bool { | |
| Arc::ptr_eq(&self.0, &other.0) || self.0.get() == other.0.get() | |
| } | |
| } | |
| impl Serialize for ResponsesApiTools { | |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> | |
| where | |
| S: serde::Serializer, | |
| { | |
| self.0.serialize(serializer) | |
| } | |
| } | |
| pub struct ResponsesApiRequest { | |
| pub model: String, | |
| pub instructions: String, | |
| pub input: Vec<ResponseItem>, | |
| pub tools: Option<ResponsesApiTools>, | |
| pub tool_choice: String, | |
| pub parallel_tool_calls: bool, | |
| pub reasoning: Option<Reasoning>, | |
| pub store: bool, | |
| pub stream: bool, | |
| pub stream_options: Option<StreamOptions>, | |
| pub include: Vec<String>, | |
| pub service_tier: Option<String>, | |
| pub prompt_cache_key: Option<String>, | |
| pub text: Option<TextControls>, | |
| pub client_metadata: Option<HashMap<String, String>>, | |
| pub access_programs: Option<AccessPrograms>, | |
| } | |
| impl<'a> From<&'a ResponsesApiRequest> for ResponseCreateWsRequest<'a> { | |
| fn from(request: &'a ResponsesApiRequest) -> Self { | |
| Self { | |
| model: &request.model, | |
| instructions: &request.instructions, | |
| previous_response_id: None, | |
| input: &request.input, | |
| tools: request.tools.as_ref().map(ResponsesApiTools::as_raw_value), | |
| tool_choice: &request.tool_choice, | |
| parallel_tool_calls: request.parallel_tool_calls, | |
| reasoning: request.reasoning.as_ref(), | |
| store: request.store, | |
| stream: request.stream, | |
| stream_options: request.stream_options.as_ref(), | |
| include: &request.include, | |
| service_tier: request.service_tier.as_deref(), | |
| prompt_cache_key: request.prompt_cache_key.as_deref(), | |
| text: request.text.as_ref(), | |
| generate: None, | |
| client_metadata: request.client_metadata.clone(), | |
| access_programs: request.access_programs, | |
| } | |
| } | |
| } | |
| pub struct ResponseCreateWsRequest<'a> { | |
| pub model: &'a str, | |
| pub instructions: &'a str, | |
| pub previous_response_id: Option<String>, | |
| pub input: &'a [ResponseItem], | |
| pub tools: Option<&'a RawValue>, | |
| pub tool_choice: &'a str, | |
| pub parallel_tool_calls: bool, | |
| pub reasoning: Option<&'a Reasoning>, | |
| pub store: bool, | |
| pub stream: bool, | |
| pub stream_options: Option<&'a StreamOptions>, | |
| pub include: &'a [String], | |
| pub service_tier: Option<&'a str>, | |
| pub prompt_cache_key: Option<&'a str>, | |
| pub text: Option<&'a TextControls>, | |
| pub generate: Option<bool>, | |
| pub client_metadata: Option<HashMap<String, String>>, | |
| pub access_programs: Option<AccessPrograms>, | |
| } | |
| pub fn response_create_client_metadata( | |
| client_metadata: Option<HashMap<String, String>>, | |
| trace: Option<&W3cTraceContext>, | |
| ) -> Option<HashMap<String, String>> { | |
| let mut client_metadata = client_metadata.unwrap_or_default(); | |
| if let Some(traceparent) = trace.and_then(|trace| trace.traceparent.as_deref()) { | |
| client_metadata.insert( | |
| WS_REQUEST_HEADER_TRACEPARENT_CLIENT_METADATA_KEY.to_string(), | |
| traceparent.to_string(), | |
| ); | |
| } | |
| if let Some(tracestate) = trace.and_then(|trace| trace.tracestate.as_deref()) { | |
| client_metadata.insert( | |
| WS_REQUEST_HEADER_TRACESTATE_CLIENT_METADATA_KEY.to_string(), | |
| tracestate.to_string(), | |
| ); | |
| } | |
| (!client_metadata.is_empty()).then_some(client_metadata) | |
| } | |
| pub enum ResponsesWsRequest<'a> { | |
| ResponseCreate(ResponseCreateWsRequest<'a>), | |
| } | |
| pub fn create_text_param_for_request( | |
| verbosity: Option<VerbosityConfig>, | |
| output_schema: &Option<Value>, | |
| output_schema_strict: bool, | |
| ) -> Option<TextControls> { | |
| if verbosity.is_none() && output_schema.is_none() { | |
| return None; | |
| } | |
| Some(TextControls { | |
| verbosity: verbosity.map(std::convert::Into::into), | |
| format: output_schema.as_ref().map(|schema| TextFormat { | |
| r#type: TextFormatType::JsonSchema, | |
| strict: output_schema_strict, | |
| schema: schema.clone(), | |
| name: "codex_output_schema".to_string(), | |
| }), | |
| }) | |
| } | |
| pub struct ResponseStream { | |
| pub rx_event: mpsc::Receiver<Result<ResponseEvent, ApiError>>, | |
| /// Server-assigned `x-request-id` response header, when present. | |
| pub upstream_request_id: Option<String>, | |
| } | |
| impl Stream for ResponseStream { | |
| type Item = Result<ResponseEvent, ApiError>; | |
| fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> { | |
| self.rx_event.poll_recv(cx) | |
| } | |
| } | |