Skip to content

Commit b5c37ee

Browse files
committed
fix(sdk): include the errored user message in the error event's newMessages
The error-path onTurnComplete reported the errored user message in newUIMessages but not in newMessages (the model-message delta), so a customer persisting the model delta lost it. Derive newMessages from the same set as newUIMessages so the two stay symmetric.
1 parent 1916507 commit b5c37ee

2 files changed

Lines changed: 19 additions & 14 deletions

File tree

packages/trigger-sdk/src/v3/ai.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7982,23 +7982,25 @@ function chatAgent<
79827982
// its model messages to preserve a prior turn's compaction (mirrors
79837983
// the success path's append branch); otherwise reconvert from UI.
79847984
// Guard the conversion so a secondary failure can't crash the run.
7985-
if (!responseCommitted && erroredUIMessagesWithPartial !== accumulatedUIMessages) {
7985+
if (!responseCommitted) {
79867986
try {
7987-
if (includePartial) {
7988-
erroredNewModelMessages = await toModelMessages([
7989-
stripProviderMetadata(partialResponse!),
7990-
]);
7991-
}
7992-
if (partialIdx === -1) {
7993-
const appended = erroredUIMessagesWithPartial.slice(accumulatedUIMessages.length);
7994-
accumulatedMessages.push(
7995-
...(await toModelMessages(appended.map((m) => stripProviderMetadata(m))))
7987+
if (erroredNewUIMessages.length > 0) {
7988+
erroredNewModelMessages = await toModelMessages(
7989+
erroredNewUIMessages.map((m) => stripProviderMetadata(m))
79967990
);
7997-
} else {
7998-
accumulatedMessages = await toModelMessages(erroredUIMessagesWithPartial);
79997991
}
8000-
accumulatedUIMessages = erroredUIMessagesWithPartial;
8001-
locals.set(chatCurrentUIMessagesKey, accumulatedUIMessages);
7992+
if (erroredUIMessagesWithPartial !== accumulatedUIMessages) {
7993+
if (partialIdx === -1) {
7994+
const appended = erroredUIMessagesWithPartial.slice(accumulatedUIMessages.length);
7995+
accumulatedMessages.push(
7996+
...(await toModelMessages(appended.map((m) => stripProviderMetadata(m))))
7997+
);
7998+
} else {
7999+
accumulatedMessages = await toModelMessages(erroredUIMessagesWithPartial);
8000+
}
8001+
accumulatedUIMessages = erroredUIMessagesWithPartial;
8002+
locals.set(chatCurrentUIMessagesKey, accumulatedUIMessages);
8003+
}
80028004
} catch {
80038005
// Keep the prior model accumulator if conversion fails.
80048006
erroredNewModelMessages = [];

packages/trigger-sdk/test/chat-agent-source-stream-error.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ describe("chat.agent managed loop — source-stream failure", () => {
112112
)
113113
.join("");
114114
expect(newAssistantText).toBe("partial answer");
115+
116+
expect((evt.newMessages as ModelMessage[]).some((m) => m.role === "user")).toBe(true);
117+
expect((evt.newUIMessages as UIMessage[]).some((m) => m.role === "user")).toBe(true);
115118
} finally {
116119
await harness.close();
117120
}

0 commit comments

Comments
 (0)