diff --git a/src/container-runner.ts b/src/container-runner.ts index 12358a6..622cdf8 100644 --- a/src/container-runner.ts +++ b/src/container-runner.ts @@ -202,10 +202,16 @@ function prepareGroupEnvironment( process.env.OPENAI_API_KEY; if (openaiKey) env.OPENAI_API_KEY = openaiKey; - // Codex model/effort configuration - const codexModel = envVars.CODEX_MODEL || process.env.CODEX_MODEL; + // Codex model/effort configuration (per-group overrides global) + const codexModel = + group.containerConfig?.codexModel || + envVars.CODEX_MODEL || + process.env.CODEX_MODEL; if (codexModel) env.CODEX_MODEL = codexModel; - const codexEffort = envVars.CODEX_EFFORT || process.env.CODEX_EFFORT; + const codexEffort = + group.containerConfig?.codexEffort || + envVars.CODEX_EFFORT || + process.env.CODEX_EFFORT; if (codexEffort) env.CODEX_EFFORT = codexEffort; // Codex session directory @@ -243,7 +249,7 @@ function prepareGroupEnvironment( process.env.CLAUDE_CODE_OAUTH_TOKEN || ''; } - // Model/thinking config + // Model/thinking config (per-group overrides global) for (const key of [ 'CLAUDE_MODEL', 'CLAUDE_THINKING', @@ -253,6 +259,12 @@ function prepareGroupEnvironment( const val = envVars[key as keyof typeof envVars] || process.env[key]; if (val) env[key] = val; } + if (group.containerConfig?.claudeModel) { + env.CLAUDE_MODEL = group.containerConfig.claudeModel; + } + if (group.containerConfig?.claudeEffort) { + env.CLAUDE_EFFORT = group.containerConfig.claudeEffort; + } } return { env, groupDir, runnerDir }; diff --git a/src/types.ts b/src/types.ts index 7b0e25e..ebabf32 100644 --- a/src/types.ts +++ b/src/types.ts @@ -7,6 +7,11 @@ export interface AdditionalMount { export interface ContainerConfig { additionalMounts?: AdditionalMount[]; timeout?: number; // Default: 300000 (5 minutes) + // Per-group model/effort overrides (take precedence over global env vars) + codexModel?: string; + codexEffort?: string; + claudeModel?: string; + claudeEffort?: string; } export type AgentType = 'claude-code' | 'codex';