File size: 2,162 Bytes
7a1ad33 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | /**
* @license
* Copyright 2026 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
export interface ToolLogEntry {
toolRequest: {
name: string;
args: string;
success: boolean;
duration_ms: number;
prompt_id?: string;
error?: string;
error_type?: string;
};
}
const MAX_ARG_VALUE_LENGTH = 60;
function formatArgs(argsJson: string): string {
if (!argsJson || argsJson === '{}') {
return '';
}
let parsed: Record<string, unknown>;
try {
const val = JSON.parse(argsJson);
if (val === null || typeof val !== 'object' || Array.isArray(val)) {
return truncate(argsJson, MAX_ARG_VALUE_LENGTH);
}
parsed = val as Record<string, unknown>;
} catch {
return truncate(argsJson, MAX_ARG_VALUE_LENGTH);
}
const pairs: string[] = [];
for (const [key, value] of Object.entries(parsed)) {
const strValue = typeof value === 'string' ? value : JSON.stringify(value);
pairs.push(
`${key}=${JSON.stringify(truncate(String(strValue), MAX_ARG_VALUE_LENGTH))}`,
);
}
return pairs.join(', ');
}
function truncate(str: string, max: number): string {
if (str.length <= max) {
return str;
}
return str.slice(0, max - 1) + '…';
}
export function formatToolLogChain(logs: ToolLogEntry[]): string {
if (!logs || logs.length === 0) {
return '';
}
const lines: string[] = [];
const padWidth = String(logs.length).length;
for (let i = 0; i < logs.length; i++) {
const { toolRequest: t } = logs[i];
const idx = String(i + 1).padStart(padWidth, ' ');
const argsStr = formatArgs(t.args);
const call = argsStr ? `${t.name}(${argsStr})` : `${t.name}()`;
const status = t.success ? '✓' : '✗';
const duration = `${t.duration_ms}ms`;
lines.push(` ${idx}. ${call} ── ${status} ${duration}`);
if (!t.success && (t.error || t.error_type)) {
const errorType = t.error_type ? `[${t.error_type}] ` : '';
const errorMsg = t.error ? truncate(t.error, 120) : 'Unknown error';
lines.push(
` ${' '.repeat(padWidth)} ↳ Error: ${errorType}${errorMsg}`,
);
}
}
return lines.join('\n');
}
|