fix(agent): preserved routed subagent fallbacks

Kept OpenRouter and Vercel upstream routing suffixes in subagent retry fallback selectors so same-base routed candidates stay distinct.

Resolved retry fallback candidates from the raw selector before model switching so routed fallback models keep their requested upstream route.
This commit is contained in:
roboomp
2026-06-16 07:47:48 +00:00
parent 3742e07791
commit 3cdb867d28
4 changed files with 75 additions and 18 deletions
+7 -12
View File
@@ -12,7 +12,8 @@ import { logger, popLoopPhase, prompt, pushLoopPhase, untilAborted } from "@oh-m
import type { Rule } from "../capability/rule";
import { ModelRegistry } from "../config/model-registry";
import {
formatModelString,
formatModelSelectorValue,
formatModelStringWithRouting,
resolveModelOverride,
resolveModelOverrideWithAuthFallback,
} from "../config/model-resolver";
@@ -131,11 +132,6 @@ interface SubagentRetryFallbackCandidate {
selector: string;
}
function formatSubagentRetryFallbackSelector(model: Model<Api>, thinkingLevel: ThinkingLevel | undefined): string {
const selector = formatModelString(model);
return thinkingLevel ? `${selector}:${thinkingLevel}` : selector;
}
function resolveSubagentRetryFallbackCandidates(
modelPatterns: string[],
modelRegistry: ModelRegistry,
@@ -146,10 +142,9 @@ function resolveSubagentRetryFallbackCandidates(
for (const pattern of modelPatterns) {
const resolved = resolveModelOverride([pattern], modelRegistry, settings);
if (!resolved.model) continue;
const selector = formatSubagentRetryFallbackSelector(
resolved.model,
resolved.explicitThinkingLevel ? resolved.thinkingLevel : undefined,
);
const selector = resolved.explicitThinkingLevel
? formatModelSelectorValue(formatModelStringWithRouting(resolved.model), resolved.thinkingLevel)
: formatModelStringWithRouting(resolved.model);
if (seen.has(selector)) continue;
seen.add(selector);
candidates.push({ model: resolved.model, selector });
@@ -1923,8 +1918,8 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
}
if (model) {
progress.resolvedModel = explicitThinkingLevel
? `${model.provider}/${model.id}:${resolvedThinkingLevel}`
: `${model.provider}/${model.id}`;
? formatModelSelectorValue(formatModelStringWithRouting(model), resolvedThinkingLevel)
: formatModelStringWithRouting(model);
}
const effectiveThinkingLevel = explicitThinkingLevel
? resolvedThinkingLevel