55 lines
1.7 KiB
TypeScript
55 lines
1.7 KiB
TypeScript
import type { AssistantMessage } from "@mariozechner/pi-ai";
|
|
import { formatToolDetail, resolveToolDisplay } from "./tool-display.js";
|
|
|
|
export function extractAssistantText(msg: AssistantMessage): string {
|
|
const isTextBlock = (
|
|
block: unknown,
|
|
): block is { type: "text"; text: string } => {
|
|
if (!block || typeof block !== "object") return false;
|
|
const rec = block as Record<string, unknown>;
|
|
return rec.type === "text" && typeof rec.text === "string";
|
|
};
|
|
|
|
const blocks = Array.isArray(msg.content)
|
|
? msg.content
|
|
.filter(isTextBlock)
|
|
.map((c) => c.text.trim())
|
|
.filter(Boolean)
|
|
: [];
|
|
return blocks.join("\n").trim();
|
|
}
|
|
|
|
export function extractAssistantThinking(msg: AssistantMessage): string {
|
|
if (!Array.isArray(msg.content)) return "";
|
|
const blocks = msg.content
|
|
.map((block) => {
|
|
if (!block || typeof block !== "object") return "";
|
|
const record = block as unknown as Record<string, unknown>;
|
|
if (record.type === "thinking" && typeof record.thinking === "string") {
|
|
return record.thinking.trim();
|
|
}
|
|
return "";
|
|
})
|
|
.filter(Boolean);
|
|
return blocks.join("\n").trim();
|
|
}
|
|
|
|
export function formatReasoningMarkdown(text: string): string {
|
|
const trimmed = text.trim();
|
|
if (!trimmed) return "";
|
|
const lines = trimmed.split(/\r?\n/);
|
|
const wrapped = lines
|
|
.map((line) => line.trim())
|
|
.map((line) => (line ? `_${line}_` : ""))
|
|
.filter((line) => line.length > 0);
|
|
return wrapped.length > 0 ? [`_Reasoning:_`, ...wrapped].join("\n") : "";
|
|
}
|
|
|
|
export function inferToolMetaFromArgs(
|
|
toolName: string,
|
|
args: unknown,
|
|
): string | undefined {
|
|
const display = resolveToolDisplay({ name: toolName, args });
|
|
return formatToolDetail(display);
|
|
}
|