diff --git a/src/tools/delegate-task/category-resolver.test.ts b/src/tools/delegate-task/category-resolver.test.ts index d48407dba..1b2ca185f 100644 --- a/src/tools/delegate-task/category-resolver.test.ts +++ b/src/tools/delegate-task/category-resolver.test.ts @@ -452,4 +452,36 @@ describe("resolveCategoryExecution", () => { cacheSpy.mockRestore() agentsSpy.mockRestore() }) + + test("does not inherit hardcoded fallbackChain when user configures a category model [regression #3040]", async () => { + //#given + const args = { + category: "quick", + prompt: "test prompt", + description: "Test task", + run_in_background: false, + load_skills: [], + blockedBy: undefined, + enableSkillTools: false, + } + const executorCtx = createMockExecutorContext() + executorCtx.userCategories = { + quick: { + model: "animal-gateway-xai/grok-4-fast-non-reasoning", + }, + } + + //#when + const result = await resolveCategoryExecution(args, executorCtx, undefined, "anthropic/claude-sonnet-4-6") + + //#then + expect(result.error).toBeUndefined() + expect(result.actualModel).toBe("animal-gateway-xai/grok-4-fast-non-reasoning") + expect(result.categoryModel).toEqual({ + providerID: "animal-gateway-xai", + modelID: "grok-4-fast-non-reasoning", + variant: undefined, + }) + expect(result.fallbackChain).toBeUndefined() + }) }) diff --git a/src/tools/delegate-task/category-resolver.ts b/src/tools/delegate-task/category-resolver.ts index 5651f509d..ffcfd1881 100644 --- a/src/tools/delegate-task/category-resolver.ts +++ b/src/tools/delegate-task/category-resolver.ts @@ -150,12 +150,12 @@ Available categories: ${allCategoryNames}`, const userModelOverride = explicitCategoryModel ?? overrideModel if (userModelOverride) { actualModel = userModelOverride - const parsedModel = parseModelString(actualModel) + const parsedModel = parseModelString(userModelOverride) const variantToUse = userCategories?.[args.category!]?.variant ?? resolved.config.variant categoryModel = parsedModel ? applyCategoryParams({ ...parsedModel, variant: variantToUse ?? parsedModel.variant }, resolved.config) : undefined - modelInfo = { model: actualModel, type: "user-defined", source: "override" } + modelInfo = { model: userModelOverride, type: "user-defined", source: "override" } } } else if (resolution) { const { @@ -275,6 +275,6 @@ Available categories: ${categoryNames.join(", ")}`, actualModel, isUnstableAgent, // Don't use hardcoded fallback chain when resolution was skipped (cold cache) - fallbackChain: configuredFallbackChain ?? (isModelResolutionSkipped ? undefined : requirement?.fallbackChain), + fallbackChain: configuredFallbackChain ?? ((isModelResolutionSkipped || explicitCategoryModel) ? undefined : requirement?.fallbackChain), } }