import type { UIMessage } from "ai"; import { isToolUIPart } from "ai"; /** * Clean up incomplete tool calls from messages before sending to API * Prevents API errors from interrupted or failed tool executions */ export function cleanupMessages(messages: UIMessage[]): UIMessage[] { return messages.filter((message) => { if (!message.parts) return true; // Filter out messages with incomplete tool calls const hasIncompleteToolCall = message.parts.some((part) => { if (!isToolUIPart(part)) return false; // Remove tool calls that are still streaming or awaiting input without results return ( part.state === "input-streaming" || (part.state === "input-available" && !part.output && !part.errorText) ); }); return !hasIncompleteToolCall; }); }