mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 15:28:27 +00:00
fix(tui): surface model errors
This commit is contained in:
@@ -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");
|
||||
|
||||
31
src/tui/tui-formatters.test.ts
Normal file
31
src/tui/tui-formatters.test.ts
Normal 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");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user