use std::{path::PathBuf, time::Duration};
use crate::DEFAULT_CODEX_EXECUTABLE;
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
pub enum ReasoningEffort {
None,
Minimal,
Low,
Medium,
High,
#[default]
XHigh,
Max,
}
impl ReasoningEffort {
pub const fn as_str(self) -> &'static str {
match self {
Self::None => "none",
Self::Minimal => "minimal",
Self::Low => "low",
Self::Medium => "medium",
Self::High => "high",
Self::XHigh => "xhigh",
Self::Max => "max",
}
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum WebSearchContext {
Low,
Medium,
High,
}
impl WebSearchContext {
pub(crate) const fn as_str(self) -> &'static str {
match self {
Self::Low => "low",
Self::Medium => "medium",
Self::High => "high",
}
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum SearchDepth {
Focused,
Thorough,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CodexConfig {
pub executable: String,
pub working_directory: PathBuf,
pub base_instruction: String,
pub validation_model: String,
pub validation_reasoning_effort: ReasoningEffort,
}
impl CodexConfig {
pub fn new(validation_model: impl Into<String>) -> Self {
Self {
executable: DEFAULT_CODEX_EXECUTABLE.into(),
working_directory: std::env::temp_dir(),
base_instruction: String::new(),
validation_model: validation_model.into(),
validation_reasoning_effort: ReasoningEffort::XHigh,
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct GenerationRequest {
pub prompt: String,
pub model: String,
pub reasoning_effort: ReasoningEffort,
pub previous_thread_id: Option<String>,
pub ephemeral: bool,
pub timeout: Duration,
}
impl GenerationRequest {
pub fn new(prompt: impl Into<String>, model: impl Into<String>) -> Self {
Self {
prompt: prompt.into(),
model: model.into(),
reasoning_effort: ReasoningEffort::XHigh,
previous_thread_id: None,
ephemeral: false,
timeout: Duration::from_secs(10 * 60),
}
}
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct TokenUsage {
pub input_tokens: u64,
pub output_tokens: u64,
pub cached_input_tokens: u64,
pub reasoning_output_tokens: u64,
pub last_input_tokens: Option<u64>,
pub last_output_tokens: Option<u64>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct GenerationResponse {
pub thread_id: String,
pub answer: String,
pub usage: Option<TokenUsage>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct WebSearchRequest {
pub question: String,
pub model: String,
pub reasoning_effort: ReasoningEffort,
pub context: WebSearchContext,
pub depth: SearchDepth,
pub timeout: Duration,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct WebSource {
pub title: String,
pub url: String,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct WebSearchResponse {
pub answer: String,
pub sources: Vec<WebSource>,
pub usage: Option<TokenUsage>,
}