UNPKG

@juspay/neurolink

Version:

Universal AI Development Platform with working MCP integration, multi-provider support, voice (TTS/STT/realtime), and professional CLI. 58+ external MCP servers discoverable, multimodal file processing, RAG pipelines. Build, test, and deploy AI applicatio

67 lines (66 loc) 2.51 kB
/** * Tool Use/Result Pair Repair * * After compaction, validates that every tool_use (tool_call) has a * corresponding tool_result and vice versa. Inserts synthetic * placeholders for orphaned entries. */ import { randomUUID } from "crypto"; /** * Repair orphaned tool_use/tool_result pairs in a message array. * * Ensures every tool_call has a following tool_result and vice versa. */ export function repairToolPairs(messages) { const result = []; let orphanedCallsFixed = 0; let orphanedResultsFixed = 0; for (let i = 0; i < messages.length; i++) { const msg = messages[i]; const nextMsg = i + 1 < messages.length ? messages[i + 1] : undefined; if (msg.role === "tool_call") { result.push(msg); // Check if next message is the corresponding tool_result if (!nextMsg || nextMsg.role !== "tool_result") { // Insert synthetic tool_result result.push({ id: `repair-result-${randomUUID()}`, role: "tool_result", content: "[Tool result unavailable - conversation was compacted]", tool: msg.tool, timestamp: msg.timestamp, metadata: { truncated: true }, }); orphanedCallsFixed++; } } else if (msg.role === "tool_result") { // Check if previous message was the corresponding tool_call const prevMsg = result.length > 0 ? result[result.length - 1] : undefined; if (!prevMsg || (prevMsg.role !== "tool_call" && prevMsg.role !== "tool_result")) { // Insert synthetic tool_call before this result result.push({ id: `repair-call-${randomUUID()}`, role: "tool_call", content: `[Tool call for ${msg.tool || "unknown"} - conversation was compacted]`, tool: msg.tool, timestamp: msg.timestamp, metadata: { truncated: true }, }); orphanedResultsFixed++; } result.push(msg); } else { result.push(msg); } } const repaired = orphanedCallsFixed > 0 || orphanedResultsFixed > 0; return { repaired, messages: repaired ? result : messages, orphanedCallsFixed, orphanedResultsFixed, }; }