mirror of
https://github.com/farcasclaudiu/Flowise.git
synced 2026-06-28 21:00:58 +03:00
[Feature] Repair JSON from LLM in StructuredOutputParserAdvanced (#3723)
Repair JSON from LLM in StructuredOutputParserAdvanced Co-authored-by: Henry <hzj94@hotmail.com>
This commit is contained in:
+9
@@ -3,6 +3,7 @@ import { BaseOutputParser } from '@langchain/core/output_parsers'
|
|||||||
import { StructuredOutputParser as LangchainStructuredOutputParser } from 'langchain/output_parsers'
|
import { StructuredOutputParser as LangchainStructuredOutputParser } from 'langchain/output_parsers'
|
||||||
import { CATEGORY } from '../OutputParserHelpers'
|
import { CATEGORY } from '../OutputParserHelpers'
|
||||||
import { convertSchemaToZod, getBaseClasses, INode, INodeData, INodeParams } from '../../../src'
|
import { convertSchemaToZod, getBaseClasses, INode, INodeData, INodeParams } from '../../../src'
|
||||||
|
import { jsonrepair } from 'jsonrepair'
|
||||||
|
|
||||||
class StructuredOutputParser implements INode {
|
class StructuredOutputParser implements INode {
|
||||||
label: string
|
label: string
|
||||||
@@ -74,6 +75,14 @@ class StructuredOutputParser implements INode {
|
|||||||
const zodSchema = z.object(convertSchemaToZod(jsonStructure)) as any
|
const zodSchema = z.object(convertSchemaToZod(jsonStructure)) as any
|
||||||
const structuredOutputParser = LangchainStructuredOutputParser.fromZodSchema(zodSchema)
|
const structuredOutputParser = LangchainStructuredOutputParser.fromZodSchema(zodSchema)
|
||||||
|
|
||||||
|
const baseParse = structuredOutputParser.parse
|
||||||
|
|
||||||
|
// Fix broken JSON from LLM
|
||||||
|
structuredOutputParser.parse = (text) => {
|
||||||
|
const jsonString = text.includes('```') ? text.trim().split(/```(?:json)?/)[1] : text.trim()
|
||||||
|
return baseParse.call(structuredOutputParser, jsonrepair(jsonString))
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: When we change Flowise to return a json response, the following has to be changed to: JsonStructuredOutputParser
|
// NOTE: When we change Flowise to return a json response, the following has to be changed to: JsonStructuredOutputParser
|
||||||
Object.defineProperty(structuredOutputParser, 'autoFix', {
|
Object.defineProperty(structuredOutputParser, 'autoFix', {
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
|
|||||||
+9
@@ -3,6 +3,7 @@ import { BaseOutputParser } from '@langchain/core/output_parsers'
|
|||||||
import { StructuredOutputParser as LangchainStructuredOutputParser } from 'langchain/output_parsers'
|
import { StructuredOutputParser as LangchainStructuredOutputParser } from 'langchain/output_parsers'
|
||||||
import { CATEGORY } from '../OutputParserHelpers'
|
import { CATEGORY } from '../OutputParserHelpers'
|
||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
|
import { jsonrepair } from 'jsonrepair'
|
||||||
|
|
||||||
class AdvancedStructuredOutputParser implements INode {
|
class AdvancedStructuredOutputParser implements INode {
|
||||||
label: string
|
label: string
|
||||||
@@ -62,6 +63,14 @@ class AdvancedStructuredOutputParser implements INode {
|
|||||||
try {
|
try {
|
||||||
const structuredOutputParser = LangchainStructuredOutputParser.fromZodSchema(zodSchema)
|
const structuredOutputParser = LangchainStructuredOutputParser.fromZodSchema(zodSchema)
|
||||||
|
|
||||||
|
const baseParse = structuredOutputParser.parse
|
||||||
|
|
||||||
|
// Fix broken JSON from LLM
|
||||||
|
structuredOutputParser.parse = (text) => {
|
||||||
|
const jsonString = text.includes('```') ? text.trim().split(/```(?:json)?/)[1] : text.trim()
|
||||||
|
return baseParse.call(structuredOutputParser, jsonrepair(jsonString))
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: When we change Flowise to return a json response, the following has to be changed to: JsonStructuredOutputParser
|
// NOTE: When we change Flowise to return a json response, the following has to be changed to: JsonStructuredOutputParser
|
||||||
Object.defineProperty(structuredOutputParser, 'autoFix', {
|
Object.defineProperty(structuredOutputParser, 'autoFix', {
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
|
|||||||
@@ -92,6 +92,7 @@
|
|||||||
"ioredis": "^5.3.2",
|
"ioredis": "^5.3.2",
|
||||||
"jsdom": "^22.1.0",
|
"jsdom": "^22.1.0",
|
||||||
"jsonpointer": "^5.0.1",
|
"jsonpointer": "^5.0.1",
|
||||||
|
"jsonrepair": "^3.11.1",
|
||||||
"langchain": "^0.3.5",
|
"langchain": "^0.3.5",
|
||||||
"langfuse": "3.3.4",
|
"langfuse": "3.3.4",
|
||||||
"langfuse-langchain": "^3.3.4",
|
"langfuse-langchain": "^3.3.4",
|
||||||
|
|||||||
Generated
+9
@@ -319,6 +319,9 @@ importers:
|
|||||||
jsonpointer:
|
jsonpointer:
|
||||||
specifier: ^5.0.1
|
specifier: ^5.0.1
|
||||||
version: 5.0.1
|
version: 5.0.1
|
||||||
|
jsonrepair:
|
||||||
|
specifier: ^3.11.1
|
||||||
|
version: 3.11.2
|
||||||
langchain:
|
langchain:
|
||||||
specifier: ^0.3.5
|
specifier: ^0.3.5
|
||||||
version: 0.3.5(@langchain/anthropic@0.3.7(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(encoding@0.1.13))(@langchain/aws@0.1.2(@aws-sdk/client-sso-oidc@3.624.0(@aws-sdk/client-sts@3.624.0))(@aws-sdk/client-sts@3.624.0)(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4))))(@langchain/cohere@0.0.7(encoding@0.1.13)(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(@langchain/google-genai@0.1.3(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(zod@3.22.4))(@langchain/google-vertexai@0.1.2(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(encoding@0.1.13)(zod@3.22.4))(@langchain/groq@0.1.2(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(encoding@0.1.13))(@langchain/mistralai@0.0.26(encoding@0.1.13)(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(@langchain/ollama@0.1.2(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4))))(axios@1.6.2)(cheerio@1.0.0-rc.12)(encoding@0.1.13)(openai@4.57.3(encoding@0.1.13)(zod@3.22.4))(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))
|
version: 0.3.5(@langchain/anthropic@0.3.7(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(encoding@0.1.13))(@langchain/aws@0.1.2(@aws-sdk/client-sso-oidc@3.624.0(@aws-sdk/client-sts@3.624.0))(@aws-sdk/client-sts@3.624.0)(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4))))(@langchain/cohere@0.0.7(encoding@0.1.13)(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(@langchain/google-genai@0.1.3(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(zod@3.22.4))(@langchain/google-vertexai@0.1.2(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(encoding@0.1.13)(zod@3.22.4))(@langchain/groq@0.1.2(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(encoding@0.1.13))(@langchain/mistralai@0.0.26(encoding@0.1.13)(openai@4.57.3(encoding@0.1.13)(zod@3.22.4)))(@langchain/ollama@0.1.2(@langchain/core@0.3.18(openai@4.57.3(encoding@0.1.13)(zod@3.22.4))))(axios@1.6.2)(cheerio@1.0.0-rc.12)(encoding@0.1.13)(openai@4.57.3(encoding@0.1.13)(zod@3.22.4))(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))
|
||||||
@@ -10807,6 +10810,10 @@ packages:
|
|||||||
resolution: { integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== }
|
resolution: { integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== }
|
||||||
engines: { node: '>=0.10.0' }
|
engines: { node: '>=0.10.0' }
|
||||||
|
|
||||||
|
jsonrepair@3.11.2:
|
||||||
|
resolution: { integrity: sha512-ejydGcTq0qKk1r0NUBwjtvswbPFhs19+QEfwSeGwB8KJZ59W7/AOFmQh04c68mkJ+2hGk+OkOmkr2bKG4tGlLQ== }
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
jsonwebtoken@9.0.2:
|
jsonwebtoken@9.0.2:
|
||||||
resolution: { integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== }
|
resolution: { integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== }
|
||||||
engines: { node: '>=12', npm: '>=6' }
|
engines: { node: '>=12', npm: '>=6' }
|
||||||
@@ -29873,6 +29880,8 @@ snapshots:
|
|||||||
|
|
||||||
jsonpointer@5.0.1: {}
|
jsonpointer@5.0.1: {}
|
||||||
|
|
||||||
|
jsonrepair@3.11.2: {}
|
||||||
|
|
||||||
jsonwebtoken@9.0.2:
|
jsonwebtoken@9.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
jws: 3.2.2
|
jws: 3.2.2
|
||||||
|
|||||||
Reference in New Issue
Block a user