fix(agents): harden model fallback failover paths

This commit is contained in:
Peter Steinberger
2026-02-25 03:46:34 +00:00
parent 480cc4b85c
commit d2597d5ecf
10 changed files with 187 additions and 11 deletions

View File

@@ -61,10 +61,10 @@ describe("agent-runner-utils", () => {
const resolved = resolveModelFallbackOptions(run);
expect(hoisted.resolveAgentIdFromSessionKeyMock).toHaveBeenCalledWith(run.sessionKey);
expect(hoisted.resolveAgentIdFromSessionKeyMock).not.toHaveBeenCalled();
expect(hoisted.resolveAgentModelFallbacksOverrideMock).toHaveBeenCalledWith(
run.config,
"agent-id",
run.agentId,
);
expect(resolved).toEqual({
cfg: run.config,
@@ -75,6 +75,21 @@ describe("agent-runner-utils", () => {
});
});
it("falls back to sessionKey agent id when run.agentId is missing", () => {
hoisted.resolveAgentIdFromSessionKeyMock.mockReturnValue("agent-from-session-key");
hoisted.resolveAgentModelFallbacksOverrideMock.mockReturnValue(["fallback-model"]);
const run = makeRun({ agentId: undefined });
const resolved = resolveModelFallbackOptions(run);
expect(hoisted.resolveAgentIdFromSessionKeyMock).toHaveBeenCalledWith(run.sessionKey);
expect(hoisted.resolveAgentModelFallbacksOverrideMock).toHaveBeenCalledWith(
run.config,
"agent-from-session-key",
);
expect(resolved.fallbacksOverride).toEqual(["fallback-model"]);
});
it("builds embedded run base params with auth profile and run metadata", () => {
const run = makeRun({ enforceFinalTag: true });
const authProfile = resolveProviderScopedAuthProfile({

View File

@@ -147,15 +147,13 @@ export const resolveEnforceFinalTag = (run: FollowupRun["run"], provider: string
Boolean(run.enforceFinalTag || isReasoningTagProvider(provider));
export function resolveModelFallbackOptions(run: FollowupRun["run"]) {
const fallbackAgentId = run.agentId ?? resolveAgentIdFromSessionKey(run.sessionKey);
return {
cfg: run.config,
provider: run.provider,
model: run.model,
agentDir: run.agentDir,
fallbacksOverride: resolveAgentModelFallbacksOverride(
run.config,
resolveAgentIdFromSessionKey(run.sessionKey),
),
fallbacksOverride: resolveAgentModelFallbacksOverride(run.config, fallbackAgentId),
};
}

View File

@@ -135,7 +135,7 @@ export function createFollowupRunner(params: {
agentDir: queued.run.agentDir,
fallbacksOverride: resolveAgentModelFallbacksOverride(
queued.run.config,
resolveAgentIdFromSessionKey(queued.run.sessionKey),
queued.run.agentId ?? resolveAgentIdFromSessionKey(queued.run.sessionKey),
),
run: (provider, model) => {
const authProfile = resolveRunAuthProfile(queued.run, provider);