Files
botpress--botpress/plugins/conversation-insights/src/prompt/parse-content.ts
T
2026-07-13 13:34:48 +08:00

30 lines
997 B
TypeScript

import * as cognitive from '@botpress/cognitive'
import * as sdk from '@botpress/sdk'
import { jsonrepair } from 'jsonrepair'
export type LLMInput = cognitive.GenerateContentInput
type LLMChoice = cognitive.GenerateContentOutput['choices'][number]
export type PredictResponse<T> = {
success: boolean
json: T
}
const parseJson = <T>(expectedSchema: sdk.z.ZodSchema, str: string): T => {
const repaired = jsonrepair(str)
const parsed = JSON.parse(repaired)
return expectedSchema.parse(parsed)
}
type ParseLLMOutputProps = cognitive.GenerateContentOutput & { schema: sdk.z.ZodSchema }
export const parseLLMOutput = <T>(props: ParseLLMOutputProps): PredictResponse<T> => {
const mappedChoices: LLMChoice['content'][] = props.choices.map((choice) => choice.content)
if (!mappedChoices[0]) throw new sdk.RuntimeError('Could not parse LLM output')
const firstChoice = mappedChoices[0]
return {
success: true,
json: parseJson<T>(props.schema, firstChoice.toString()),
}
}