Skip to content

Commit 8f8edee

Browse files
committed
test(agents): model current attempt terminal state
1 parent cf3b049 commit 8f8edee

2 files changed

Lines changed: 51 additions & 22 deletions

File tree

src/agents/embedded-agent-runner/run.cross-provider-fallback-error-context.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ describe("runEmbeddedAgent cross-provider fallback error handling", () => {
256256
}),
257257
);
258258

259-
await runEmbeddedAgent({
259+
const result = await runEmbeddedAgent({
260260
...overflowBaseRunParams,
261261
runId: "run-stale-session-assistant-non-timeout",
262262
config: makeCrossProviderFallbackConfig(),
@@ -268,5 +268,10 @@ describe("runEmbeddedAgent cross-provider fallback error handling", () => {
268268

269269
expect(mockedIsFailoverAssistantError).toHaveBeenCalledWith(undefined);
270270
expect(getLastFormattedAssistant()).toBeUndefined();
271+
expect(result.meta.finalAssistantVisibleText).toBeUndefined();
272+
expect(result.meta.agentMeta).toMatchObject({
273+
provider: "deepseek",
274+
model: "test-model",
275+
});
271276
});
272277
});

src/agents/embedded-agent-runner/run.incomplete-turn.test.ts

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
import { makeAttemptResult } from "./run.overflow-compaction.fixture.js";
99
import {
1010
loadRunOverflowCompactionHarness,
11+
mockedBuildEmbeddedRunPayloads,
1112
mockedClassifyFailoverReason,
1213
mockedGlobalHookRunner,
1314
mockedIsFailoverAssistantError,
@@ -554,17 +555,19 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
554555
mockedClassifyFailoverReason.mockReturnValue(null);
555556
const finalText =
556557
"1. Verdict: the answer completed cleanly. 2. Evidence: the runner captured final text.";
558+
const finalAssistant = {
559+
role: "assistant",
560+
stopReason: "stop",
561+
provider: "openai",
562+
model: "gpt-5.5",
563+
content: [{ type: "text", text: finalText }],
564+
} as unknown as NonNullable<EmbeddedRunAttemptResult["currentAttemptAssistant"]>;
557565
mockedRunEmbeddedAttempt.mockResolvedValueOnce(
558566
makeAttemptResult({
559567
assistantTexts: [],
560568
timedOut: true,
561-
lastAssistant: {
562-
role: "assistant",
563-
stopReason: "stop",
564-
provider: "openai",
565-
model: "gpt-5.5",
566-
content: [{ type: "text", text: finalText }],
567-
} as unknown as EmbeddedRunAttemptResult["lastAssistant"],
569+
lastAssistant: finalAssistant,
570+
currentAttemptAssistant: finalAssistant,
568571
}),
569572
);
570573

@@ -617,16 +620,18 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
617620
currentAttemptAssistant: rateLimitAssistant,
618621
}),
619622
);
623+
const recoveredAssistant = {
624+
role: "assistant",
625+
stopReason: "stop",
626+
provider: "openai",
627+
model: "gpt-5.5",
628+
content: [{ type: "text", text: "Recovered after a short rate-limit wait." }],
629+
} as unknown as NonNullable<EmbeddedRunAttemptResult["currentAttemptAssistant"]>;
620630
mockedRunEmbeddedAttempt.mockResolvedValueOnce(
621631
makeAttemptResult({
622632
assistantTexts: ["Recovered after a short rate-limit wait."],
623-
lastAssistant: {
624-
role: "assistant",
625-
stopReason: "stop",
626-
provider: "openai",
627-
model: "gpt-5.5",
628-
content: [{ type: "text", text: "Recovered after a short rate-limit wait." }],
629-
} as unknown as EmbeddedRunAttemptResult["lastAssistant"],
633+
lastAssistant: recoveredAssistant,
634+
currentAttemptAssistant: recoveredAssistant,
630635
}),
631636
);
632637

@@ -969,16 +974,18 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
969974
currentAttemptAssistant: undefined,
970975
}),
971976
);
977+
const recoveredAssistant = {
978+
role: "assistant",
979+
stopReason: "end_turn",
980+
provider: "openai",
981+
model: "gpt-5.5",
982+
content: [{ type: "text", text: "Recovered answer." }],
983+
} as unknown as NonNullable<EmbeddedRunAttemptResult["currentAttemptAssistant"]>;
972984
mockedRunEmbeddedAttempt.mockResolvedValueOnce(
973985
makeAttemptResult({
974986
assistantTexts: ["Recovered answer."],
975-
lastAssistant: {
976-
role: "assistant",
977-
stopReason: "end_turn",
978-
provider: "openai",
979-
model: "gpt-5.5",
980-
content: [{ type: "text", text: "Recovered answer." }],
981-
} as unknown as EmbeddedRunAttemptResult["lastAssistant"],
987+
lastAssistant: recoveredAssistant,
988+
currentAttemptAssistant: recoveredAssistant,
982989
}),
983990
);
984991

@@ -1734,6 +1741,7 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
17341741
it("delivers the current final answer when the session assistant is stale (#80918)", async () => {
17351742
mockedClassifyFailoverReason.mockReturnValue(null);
17361743
const finalText = "The requested update is complete.";
1744+
mockedBuildEmbeddedRunPayloads.mockReturnValueOnce([{ text: finalText }]);
17371745
mockedRunEmbeddedAttempt.mockResolvedValueOnce(
17381746
makeAttemptResult({
17391747
assistantTexts: [finalText],
@@ -1744,13 +1752,15 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
17441752
provider: "openai",
17451753
model: "gpt-5.5",
17461754
content: [{ type: "tool_use", id: "tool_1", name: "update_plan", input: {} }],
1755+
usage: { input: 100, output: 5, total: 105 },
17471756
} as unknown as EmbeddedRunAttemptResult["lastAssistant"],
17481757
currentAttemptAssistant: {
17491758
role: "assistant",
17501759
stopReason: "stop",
17511760
provider: "openai",
17521761
model: "gpt-5.5",
17531762
content: [{ type: "text", text: finalText }],
1763+
usage: { input: 200, output: 20, total: 220 },
17541764
} as unknown as EmbeddedRunAttemptResult["currentAttemptAssistant"],
17551765
}),
17561766
);
@@ -1763,8 +1773,22 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
17631773
});
17641774

17651775
expect(result.payloads).toEqual([{ text: finalText }]);
1776+
expect(mockedBuildEmbeddedRunPayloads).toHaveBeenCalledWith(
1777+
expect.objectContaining({
1778+
currentAssistant: expect.objectContaining({
1779+
stopReason: "stop",
1780+
content: [{ type: "text", text: finalText }],
1781+
}),
1782+
lastAssistant: expect.objectContaining({ stopReason: "toolUse" }),
1783+
}),
1784+
);
17661785
expect(result.meta.finalAssistantVisibleText).toBe(finalText);
17671786
expect(result.meta.stopReason).toBe("stop");
1787+
expect(result.meta.agentMeta?.lastCallUsage).toMatchObject({
1788+
input: 200,
1789+
output: 20,
1790+
total: 220,
1791+
});
17681792
expectNoWarnMessageWith("incomplete turn detected");
17691793
});
17701794

0 commit comments

Comments
 (0)