diff --git a/agent-service/src/agent/texera-agent.spec.ts b/agent-service/src/agent/texera-agent.spec.ts index 416fee5444f..52d9103866c 100644 --- a/agent-service/src/agent/texera-agent.spec.ts +++ b/agent-service/src/agent/texera-agent.spec.ts @@ -670,6 +670,25 @@ describe("sendMessage", () => { expect(agent.getAllSteps()[1].content).toBe("Error: just-a-string"); }); + test.each([null, undefined, false, 0, ""])("a falsy throw resolves as an error step: %p", async thrown => { + const model = new MockLanguageModelV4({ + doGenerate: async () => { + throw thrown; + }, + }); + const agent = makeAgentWith(model); + const res = await agent.sendMessage("hi"); + const expected = String(thrown); + expect(res).toEqual({ + response: "", + messages: [], + usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 }, + stopped: false, + error: expected, + }); + expect(agent.getAllSteps()[1].content).toBe(`Error: ${expected}`); + }); + test("a failed turn stays on the branch", async () => { const model = new MockLanguageModelV4({ doGenerate: async () => { diff --git a/agent-service/src/agent/texera-agent.ts b/agent-service/src/agent/texera-agent.ts index ccd0545919a..9a640aaab6c 100644 --- a/agent-service/src/agent/texera-agent.ts +++ b/agent-service/src/agent/texera-agent.ts @@ -657,7 +657,8 @@ export class TexeraAgent { stopped: false, }; } catch (error: any) { - const isAborted = error.name === "AbortError" || this.abortController?.signal.aborted; + const errorMessage = error?.message || String(error); + const isAborted = error?.name === "AbortError" || this.abortController?.signal.aborted; if (isAborted) { stepIndex++; @@ -693,7 +694,7 @@ export class TexeraAgent { stepId: stepIndex, timestamp: Date.now(), role: "agent", - content: `Error: ${error.message || String(error)}`, + content: `Error: ${errorMessage}`, isBegin: false, isEnd: true, }; @@ -705,7 +706,7 @@ export class TexeraAgent { messages: [], usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 }, stopped: false, - error: error.message || String(error), + error: errorMessage, }; } finally { this.abortController = null;