fix(delegate-task): gate fallback settings to real fallback matches

This commit is contained in:
Ravi Tharuma
2026-03-25 10:49:10 +01:00
parent a77a16c494
commit e5c5438a44
8 changed files with 1070 additions and 39 deletions
+17 -8
View File
@@ -89,6 +89,7 @@ Available categories: ${allCategoryNames}`,
let categoryModel: DelegatedModelConfig | undefined
let isModelResolutionSkipped = false
let fallbackEntry: FallbackEntry | undefined
let matchedFallback = false
const overrideModel = sisyphusJuniorModel
const explicitCategoryModel = userCategories?.[args.category!]?.model
@@ -122,8 +123,14 @@ Available categories: ${allCategoryNames}`,
if (resolution && "skipped" in resolution) {
isModelResolutionSkipped = true
} else if (resolution) {
const { model: resolvedModel, variant: resolvedVariant, fallbackEntry: resolvedFallbackEntry } = resolution
const {
model: resolvedModel,
variant: resolvedVariant,
fallbackEntry: resolvedFallbackEntry,
matchedFallback: resolvedMatchedFallback,
} = resolution
fallbackEntry = resolvedFallbackEntry
matchedFallback = resolvedMatchedFallback === true
actualModel = resolvedModel
if (!parseModelString(actualModel)) {
@@ -202,13 +209,15 @@ Available categories: ${categoryNames.join(", ")}`,
defaultProviderID,
)
// Apply per-model settings from the source that provided the match:
// 1. fallbackEntry from resolver (built-in chain match) — exact, no lookup needed
// 2. configuredFallbackChain (user's fallback_models) — prefix match against user config
const effectiveEntry = fallbackEntry
?? (categoryModel && configuredFallbackChain
? findMostSpecificFallbackEntry(categoryModel.providerID, categoryModel.modelID, configuredFallbackChain)
: undefined)
// Only promote fallback-only settings when resolution actually selected a fallback model.
const effectiveEntry = matchedFallback && categoryModel
? (
fallbackEntry
?? (configuredFallbackChain
? findMostSpecificFallbackEntry(categoryModel.providerID, categoryModel.modelID, configuredFallbackChain)
: undefined)
)
: undefined
if (categoryModel && effectiveEntry) {
categoryModel = {