From 1cb067d8942b96b7f2087e61971a1a148ce6f80d Mon Sep 17 00:00:00 2001 From: Solomon Date: Mon, 8 Sep 2025 14:29:26 +0100 Subject: [PATCH] Codex: "high" variant, and settings for reasoning effort & reasoning summaries (#648) --- crates/executors/default_profiles.json | 8 ++++- crates/executors/src/executors/codex.rs | 39 +++++++++++++++++++++++++ crates/server/src/bin/generate_types.rs | 2 ++ shared/schemas/codex.json | 27 +++++++++++++++++ shared/types.ts | 6 +++- 5 files changed, 80 insertions(+), 2 deletions(-) diff --git a/crates/executors/default_profiles.json b/crates/executors/default_profiles.json index 5ad82842..19d69aee 100644 --- a/crates/executors/default_profiles.json +++ b/crates/executors/default_profiles.json @@ -44,6 +44,12 @@ "CODEX": { "sandbox": "danger-full-access" } + }, + "HIGH": { + "CODEX": { + "sandbox": "danger-full-access", + "model_reasoning_effort": "high" + } } }, "OPENCODE": { @@ -66,4 +72,4 @@ } } } -} \ No newline at end of file +} diff --git a/crates/executors/src/executors/codex.rs b/crates/executors/src/executors/codex.rs index fed5df00..3b74b6b4 100644 --- a/crates/executors/src/executors/codex.rs +++ b/crates/executors/src/executors/codex.rs @@ -50,6 +50,27 @@ pub enum ApprovalPolicy { Never, } +/// Reasoning effort for the underlying model +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, TS, JsonSchema, AsRefStr)] +#[serde(rename_all = "kebab-case")] +#[strum(serialize_all = "kebab-case")] +pub enum ReasoningEffort { + Low, + Medium, + High, +} + +/// Model reasoning summary style +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, TS, JsonSchema, AsRefStr)] +#[serde(rename_all = "kebab-case")] +#[strum(serialize_all = "kebab-case")] +pub enum ReasoningSummary { + Auto, + Concise, + Detailed, + None, +} + /// Handles session management for Codex executor pub struct SessionHandler; @@ -214,6 +235,10 @@ pub struct Codex { pub oss: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub model: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub model_reasoning_effort: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub model_reasoning_summary: Option, #[serde(flatten)] pub cmd: CmdOverrides, } @@ -242,6 +267,20 @@ impl Codex { builder = builder.extend_params(["--model", model]); } + if let Some(effort) = &self.model_reasoning_effort { + builder = builder.extend_params([ + "--config", + &format!("model_reasoning_effort={}", effort.as_ref()), + ]); + } + + if let Some(summary) = &self.model_reasoning_summary { + builder = builder.extend_params([ + "--config", + &format!("model_reasoning_summary={}", summary.as_ref()), + ]); + } + apply_overrides(builder, &self.cmd) } } diff --git a/crates/server/src/bin/generate_types.rs b/crates/server/src/bin/generate_types.rs index 32e074d0..001a2706 100644 --- a/crates/server/src/bin/generate_types.rs +++ b/crates/server/src/bin/generate_types.rs @@ -73,6 +73,8 @@ fn generate_types_content() -> String { executors::executors::codex::Codex::decl(), executors::executors::codex::SandboxMode::decl(), executors::executors::codex::ApprovalPolicy::decl(), + executors::executors::codex::ReasoningEffort::decl(), + executors::executors::codex::ReasoningSummary::decl(), executors::executors::cursor::Cursor::decl(), executors::executors::opencode::Opencode::decl(), executors::executors::qwen::QwenCode::decl(), diff --git a/shared/schemas/codex.json b/shared/schemas/codex.json index fc233431..30f5c746 100644 --- a/shared/schemas/codex.json +++ b/shared/schemas/codex.json @@ -50,6 +50,33 @@ "null" ] }, + "model_reasoning_effort": { + "description": "Reasoning effort for the underlying model", + "type": [ + "string", + "null" + ], + "enum": [ + "low", + "medium", + "high", + null + ] + }, + "model_reasoning_summary": { + "description": "Model reasoning summary style", + "type": [ + "string", + "null" + ], + "enum": [ + "auto", + "concise", + "detailed", + "none", + null + ] + }, "base_command_override": { "title": "Base Command Override", "description": "Override the base command with a custom command", diff --git a/shared/types.ts b/shared/types.ts index d2c59dda..5a4d1fdb 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -144,12 +144,16 @@ export type GeminiModel = "default" | "flash"; export type Amp = { append_prompt: AppendPrompt, dangerously_allow_all?: boolean | null, base_command_override?: string | null, additional_params?: Array | null, }; -export type Codex = { append_prompt: AppendPrompt, sandbox?: SandboxMode | null, approval?: ApprovalPolicy | null, oss?: boolean | null, model?: string | null, base_command_override?: string | null, additional_params?: Array | null, }; +export type Codex = { append_prompt: AppendPrompt, sandbox?: SandboxMode | null, approval?: ApprovalPolicy | null, oss?: boolean | null, model?: string | null, model_reasoning_effort?: ReasoningEffort | null, model_reasoning_summary?: ReasoningSummary | null, base_command_override?: string | null, additional_params?: Array | null, }; export type SandboxMode = "read-only" | "workspace-write" | "danger-full-access"; export type ApprovalPolicy = "untrusted" | "on-failure" | "on-request" | "never"; +export type ReasoningEffort = "low" | "medium" | "high"; + +export type ReasoningSummary = "auto" | "concise" | "detailed" | "none"; + export type Cursor = { append_prompt: AppendPrompt, force?: boolean | null, model?: string | null, base_command_override?: string | null, additional_params?: Array | null, }; export type Opencode = { append_prompt: AppendPrompt, model?: string | null, agent?: string | null, base_command_override?: string | null, additional_params?: Array | null, };