export type ParsedToolCall = { name: string; arguments: Record; }; export type ToolCallParseResult = | { status: 'absent' } | { status: 'parsed'; call: ParsedToolCall } | { status: 'malformed' }; /** 从续写文本中解析首个 Qwen 风格 `` 块。 */ export function parseToolCallFromCompletion(text: string): ToolCallParseResult { const match = text.match(/\s*([\s\S]*?)\s*<\/tool_call>/); if (!match) return { status: 'absent' }; let parsed: unknown; try { parsed = JSON.parse(match[1]!.trim()); } catch { return { status: 'malformed' }; } if (!parsed || typeof parsed !== 'object') return { status: 'malformed' }; const name = (parsed as { name?: unknown }).name; if (typeof name !== 'string' || !name) return { status: 'malformed' }; const args = (parsed as { arguments?: unknown }).arguments; const argumentsObj = args && typeof args === 'object' && !Array.isArray(args) ? (args as Record) : {}; return { status: 'parsed', call: { name, arguments: argumentsObj } }; }