From 2ed47980ef8ce0d942ce7e9266ba18bd9b42011f Mon Sep 17 00:00:00 2001 From: William Jeynes Date: Tue, 31 Mar 2026 19:26:56 +0100 Subject: [PATCH] Add better error handling to LLM output response --- agent/nodes/verificationSetup.ts | 42 +++++++++++++++++++------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/agent/nodes/verificationSetup.ts b/agent/nodes/verificationSetup.ts index e142e37..66fe64d 100644 --- a/agent/nodes/verificationSetup.ts +++ b/agent/nodes/verificationSetup.ts @@ -1,20 +1,24 @@ import { GraphNode } from "@langchain/langgraph"; import { MessagesState, ProposedTriggerEventArray } from "../state"; import { logger } from "../utils/logger"; -import { jsonrepair } from 'jsonrepair' +import { jsonrepair } from 'jsonrepair'; export const verificationSetup: GraphNode = async (state) => { - //this is kinda doing two things, but having two nodes for it seems overkill - if (state.proposedTriggerEvent == undefined) { - logger.warn("No trigger events in memory, parsing") + logger.warn("No trigger events in memory, parsing"); - let genResponse = state.messages.at(-1)?.content.toString() ?? ""; + const genResponse = state.messages.at(-1)?.content.toString() ?? ""; - const repaired = jsonrepair(genResponse); + let repaired: string; + try { + repaired = jsonrepair(genResponse); + } catch (repairErr: any) { + logger.error("Failed to repair JSON from LLM response."); + logger.error("Original LLM response:\n%s", genResponse); + throw new Error(`JSON repair failed: ${repairErr.message}`); + } let parsed; - try { const json = JSON.parse(repaired); @@ -27,19 +31,23 @@ export const verificationSetup: GraphNode = async (state) if (Array.isArray(firstValue)) { parsed = ProposedTriggerEventArray.parse(firstValue); } else { - throw new Error("No array found in JSON"); + logger.error("No array found in JSON after parsing."); + logger.error("Repaired JSON:\n%s", repaired); + logger.error("Original LLM response:\n%s", genResponse); + throw new Error("No array found in JSON structure"); } } - } catch (err: any) { - logger.error(`Failed to parse LLM response: ${err.message}`); - throw new Error(`Failed to parse LLM response: ${err}`); + } catch (parseErr: any) { + logger.error("Failed to parse LLM response to JSON or validate array."); + logger.error("Repaired JSON:\n%s", repaired); + logger.error("Original LLM response:\n%s", genResponse); + throw new Error(`Parsing failed: ${parseErr.message}`); } - + return { proposedTriggerEvent: parsed, proposedTriggerEventIndex: 0 }; - } - else { - logger.info("Trigger event index %s", state.proposedTriggerEventIndex+1) - - return { proposedTriggerEvent: state.proposedTriggerEvent, proposedTriggerEventIndex: state.proposedTriggerEventIndex+1 }; + } else { + logger.info("Trigger event index %s", state.proposedTriggerEventIndex + 1); + + return { proposedTriggerEvent: state.proposedTriggerEvent, proposedTriggerEventIndex: state.proposedTriggerEventIndex + 1 }; } }; \ No newline at end of file