feat: Extend timeout handling for Codex model feature generation

- Introduced a dedicated 5-minute timeout for Codex models during feature generation to accommodate slower response times when generating 50+ features.
- Updated the CodexProvider to utilize this extended timeout based on the reasoning effort level.
- Enhanced the feature generation logic in generate-features-from-spec.ts to detect Codex models and apply the appropriate timeout.
- Modified the model resolver to include reasoning effort in the resolved phase model structure.

This change improves the reliability of feature generation for Codex models, ensuring they have sufficient time to process requests effectively.
This commit is contained in:
Shirone
2026-01-24 20:23:34 +01:00
parent db87e83aed
commit 1b2bf0df3f
3 changed files with 44 additions and 5 deletions

View File

@@ -32,6 +32,7 @@ import {
migrateModelId,
type PhaseModelEntry,
type ThinkingLevel,
type ReasoningEffort,
} from '@automaker/types';
// Pattern definitions for Codex/OpenAI models
@@ -162,8 +163,10 @@ export function getEffectiveModel(
export interface ResolvedPhaseModel {
/** Resolved model string (full model ID) */
model: string;
/** Optional thinking level for extended thinking */
/** Optional thinking level for extended thinking (Claude models) */
thinkingLevel?: ThinkingLevel;
/** Optional reasoning effort for timeout calculation (Codex models) */
reasoningEffort?: ReasoningEffort;
/** Provider ID if using a ClaudeCompatibleProvider */
providerId?: string;
}
@@ -205,6 +208,7 @@ export function resolvePhaseModel(
return {
model: resolveModelString(undefined, defaultModel),
thinkingLevel: undefined,
reasoningEffort: undefined,
};
}
@@ -214,12 +218,13 @@ export function resolvePhaseModel(
return {
model: resolveModelString(phaseModel, defaultModel),
thinkingLevel: undefined,
reasoningEffort: undefined,
};
}
// Handle new PhaseModelEntry object format
console.log(
`[ModelResolver] phaseModel is object format: model="${phaseModel.model}", thinkingLevel="${phaseModel.thinkingLevel}", providerId="${phaseModel.providerId}"`
`[ModelResolver] phaseModel is object format: model="${phaseModel.model}", thinkingLevel="${phaseModel.thinkingLevel}", reasoningEffort="${phaseModel.reasoningEffort}", providerId="${phaseModel.providerId}"`
);
// If providerId is set, pass through the model string unchanged
@@ -231,6 +236,7 @@ export function resolvePhaseModel(
return {
model: phaseModel.model, // Pass through unchanged
thinkingLevel: phaseModel.thinkingLevel,
reasoningEffort: phaseModel.reasoningEffort,
providerId: phaseModel.providerId,
};
}
@@ -239,5 +245,6 @@ export function resolvePhaseModel(
return {
model: resolveModelString(phaseModel.model, defaultModel),
thinkingLevel: phaseModel.thinkingLevel,
reasoningEffort: phaseModel.reasoningEffort,
};
}