Add better error handling to LLM output response
This commit is contained in:
@@ -1,20 +1,24 @@
|
|||||||
import { GraphNode } from "@langchain/langgraph";
|
import { GraphNode } from "@langchain/langgraph";
|
||||||
import { MessagesState, ProposedTriggerEventArray } from "../state";
|
import { MessagesState, ProposedTriggerEventArray } from "../state";
|
||||||
import { logger } from "../utils/logger";
|
import { logger } from "../utils/logger";
|
||||||
import { jsonrepair } from 'jsonrepair'
|
import { jsonrepair } from 'jsonrepair';
|
||||||
|
|
||||||
export const verificationSetup: GraphNode<typeof MessagesState> = async (state) => {
|
export const verificationSetup: GraphNode<typeof MessagesState> = async (state) => {
|
||||||
//this is kinda doing two things, but having two nodes for it seems overkill
|
|
||||||
|
|
||||||
if (state.proposedTriggerEvent == undefined) {
|
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;
|
let parsed;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const json = JSON.parse(repaired);
|
const json = JSON.parse(repaired);
|
||||||
|
|
||||||
@@ -27,19 +31,23 @@ export const verificationSetup: GraphNode<typeof MessagesState> = async (state)
|
|||||||
if (Array.isArray(firstValue)) {
|
if (Array.isArray(firstValue)) {
|
||||||
parsed = ProposedTriggerEventArray.parse(firstValue);
|
parsed = ProposedTriggerEventArray.parse(firstValue);
|
||||||
} else {
|
} 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) {
|
} catch (parseErr: any) {
|
||||||
logger.error(`Failed to parse LLM response: ${err.message}`);
|
logger.error("Failed to parse LLM response to JSON or validate array.");
|
||||||
throw new Error(`Failed to parse LLM response: ${err}`);
|
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 };
|
return { proposedTriggerEvent: parsed, proposedTriggerEventIndex: 0 };
|
||||||
}
|
} else {
|
||||||
else {
|
logger.info("Trigger event index %s", state.proposedTriggerEventIndex + 1);
|
||||||
logger.info("Trigger event index %s", state.proposedTriggerEventIndex+1)
|
|
||||||
|
|
||||||
return { proposedTriggerEvent: state.proposedTriggerEvent, proposedTriggerEventIndex: state.proposedTriggerEventIndex+1 };
|
return { proposedTriggerEvent: state.proposedTriggerEvent, proposedTriggerEventIndex: state.proposedTriggerEventIndex + 1 };
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user