fix(tui): surface model errors

This commit is contained in:
Peter Steinberger
2026-01-15 08:16:44 +00:00
parent 3171781d58
commit 1797233989
8 changed files with 138 additions and 3 deletions

View File

@@ -47,6 +47,12 @@ export function createEventHandlers(context: EventHandlerContext) {
setActivityStatus("streaming");
}
if (evt.state === "final") {
const stopReason =
evt.message && typeof evt.message === "object" && !Array.isArray(evt.message)
? typeof (evt.message as Record<string, unknown>).stopReason === "string"
? ((evt.message as Record<string, unknown>).stopReason as string)
: ""
: "";
const text = extractTextFromMessage(evt.message, {
includeThinking: state.showThinking,
});
@@ -57,7 +63,7 @@ export function createEventHandlers(context: EventHandlerContext) {
chatLog.finalizeAssistant(finalText, evt.runId);
noteFinalizedRun(evt.runId);
state.activeChatRunId = null;
setActivityStatus("idle");
setActivityStatus(stopReason === "error" ? "error" : "idle");
}
if (evt.state === "aborted") {
chatLog.addSystem("run aborted");

View File

@@ -0,0 +1,31 @@
import { describe, expect, it } from "vitest";
import { extractTextFromMessage } from "./tui-formatters.js";
describe("extractTextFromMessage", () => {
it("renders errorMessage when assistant content is empty", () => {
const text = extractTextFromMessage({
role: "assistant",
content: [],
stopReason: "error",
errorMessage:
'429 {"type":"error","error":{"type":"rate_limit_error","message":"This request would exceed your account\\u0027s rate limit. Please try again later."},"request_id":"req_123"}',
});
expect(text).toContain("HTTP 429");
expect(text).toContain("rate_limit_error");
expect(text).toContain("req_123");
});
it("falls back to a generic message when errorMessage is missing", () => {
const text = extractTextFromMessage({
role: "assistant",
content: [],
stopReason: "error",
errorMessage: "",
});
expect(text).toContain("unknown error");
});
});

View File

@@ -1,4 +1,5 @@
import { formatTokenCount } from "../utils/usage-format.js";
import { formatRawAssistantErrorForUi } from "../agents/pi-embedded-helpers.js";
export function resolveFinalAssistantText(params: {
finalText?: string | null;
@@ -38,7 +39,14 @@ export function extractTextFromMessage(
): string {
if (!message || typeof message !== "object") return "";
const record = message as Record<string, unknown>;
return extractTextBlocks(record.content, opts);
const text = extractTextBlocks(record.content, opts);
if (text) return text;
const stopReason = typeof record.stopReason === "string" ? record.stopReason : "";
if (stopReason !== "error") return "";
const errorMessage = typeof record.errorMessage === "string" ? record.errorMessage : "";
return formatRawAssistantErrorForUi(errorMessage);
}
export function formatTokens(total?: number | null, context?: number | null) {