fix: properly serialize error objects in transcript logging (#427)

Co-authored-by: Letta <noreply@letta.com>
This commit is contained in:
Charles Packer
2025-12-30 14:14:04 -08:00
committed by GitHub
parent 397eb5e390
commit 096b6aec4d
3 changed files with 43 additions and 6 deletions

View File

@@ -420,12 +420,19 @@ export function onChunk(b: Buffers, chunk: LettaStreamingResponse) {
for (const toolReturn of toolReturns) {
const toolCallId = toolReturn.tool_call_id;
// Handle both func_response (streaming) and tool_return (SDK) properties
const resultText =
const rawResult =
("func_response" in toolReturn
? toolReturn.func_response
: undefined) ||
("tool_return" in toolReturn ? toolReturn.tool_return : undefined) ||
"";
("tool_return" in toolReturn ? toolReturn.tool_return : undefined);
// Ensure resultText is always a string (guard against SDK returning objects)
const resultText =
typeof rawResult === "string"
? rawResult
: rawResult != null
? JSON.stringify(rawResult)
: "";
const status = toolReturn.status;
// Look up the line by toolCallId

View File

@@ -98,7 +98,29 @@ export function formatErrorDetails(e: unknown, agentId?: string): string {
return e.message;
}
// Fallback for any other type
// Fallback for any other type (e.g., plain objects thrown by SDK or other code)
if (typeof e === "object" && e !== null) {
const obj = e as Record<string, unknown>;
// Check common error-like properties
if (typeof obj.message === "string") {
return obj.message;
}
if (typeof obj.error === "string") {
return obj.error;
}
if (typeof obj.detail === "string") {
return obj.detail;
}
// Last resort: JSON stringify
try {
return JSON.stringify(e, null, 2);
} catch {
return "[Error: Unable to serialize error object]";
}
}
return String(e);
}