Merge pull request #3063 from code-yeongyu/fix/issue-3040
fix: respect user-configured category model over fallbackChain defaults
This commit is contained in:
@@ -452,4 +452,36 @@ describe("resolveCategoryExecution", () => {
|
|||||||
cacheSpy.mockRestore()
|
cacheSpy.mockRestore()
|
||||||
agentsSpy.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()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -150,12 +150,12 @@ Available categories: ${allCategoryNames}`,
|
|||||||
const userModelOverride = explicitCategoryModel ?? overrideModel
|
const userModelOverride = explicitCategoryModel ?? overrideModel
|
||||||
if (userModelOverride) {
|
if (userModelOverride) {
|
||||||
actualModel = userModelOverride
|
actualModel = userModelOverride
|
||||||
const parsedModel = parseModelString(actualModel)
|
const parsedModel = parseModelString(userModelOverride)
|
||||||
const variantToUse = userCategories?.[args.category!]?.variant ?? resolved.config.variant
|
const variantToUse = userCategories?.[args.category!]?.variant ?? resolved.config.variant
|
||||||
categoryModel = parsedModel
|
categoryModel = parsedModel
|
||||||
? applyCategoryParams({ ...parsedModel, variant: variantToUse ?? parsedModel.variant }, resolved.config)
|
? applyCategoryParams({ ...parsedModel, variant: variantToUse ?? parsedModel.variant }, resolved.config)
|
||||||
: undefined
|
: undefined
|
||||||
modelInfo = { model: actualModel, type: "user-defined", source: "override" }
|
modelInfo = { model: userModelOverride, type: "user-defined", source: "override" }
|
||||||
}
|
}
|
||||||
} else if (resolution) {
|
} else if (resolution) {
|
||||||
const {
|
const {
|
||||||
@@ -275,6 +275,6 @@ Available categories: ${categoryNames.join(", ")}`,
|
|||||||
actualModel,
|
actualModel,
|
||||||
isUnstableAgent,
|
isUnstableAgent,
|
||||||
// Don't use hardcoded fallback chain when resolution was skipped (cold cache)
|
// 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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user