UNPKG

n8n-nodes-advanced-output-parser

Version:

Advanced Output Parser node for n8n with dynamic expression support

168 lines (167 loc) 6.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AdvancedOutputParser = void 0; const n8n_workflow_1 = require("n8n-workflow"); const output_parsers_1 = require("langchain/output_parsers"); const utils_1 = require("./utils"); class AdvancedOutputParser { description = { displayName: "Advanced Output Parser", name: "advancedOutputParser", icon: "fa:code", iconColor: "black", group: ["transform"], version: 1, defaultVersion: 1, description: "Output parser with dynamic/expression-based JSON schema support for LangChain/ChatModel nodes.", defaults: { name: "Advanced Output Parser", }, codex: { alias: ["json", "zod", "dynamic", "expressions"], categories: ["AI"], subcategories: { AI: ["Output Parsers"], }, resources: { primaryDocumentation: [ { url: "https://github.com/volkovmqx/n8n-nodes-advanced-output-parser", }, ], }, }, inputs: [], outputs: ["ai_outputParser"], outputNames: ["Output Parser"], properties: [ { displayName: "Notice", name: "notice", type: "notice", default: "", typeOptions: { theme: "info", }, noDataExpression: true, description: "This advanced output parser supports dynamic expressions in schemas. Connect it to Chain or Agent nodes as an output parser.", }, { displayName: "Schema Mode", name: "schemaMode", type: "options", options: [ { name: "Static JSON Schema", value: "static", description: "Use a fixed JSON schema", }, { name: "From Example with Expressions", value: "fromExample", description: "Generate schema from JSON example with expression support", }, { name: "Dynamic Expression", value: "dynamic", description: "Use expressions to build schema dynamically from workflow data", }, ], default: "static", description: "How to define the output schema", }, { displayName: "JSON Schema", name: "jsonSchema", type: "string", description: "JSON Schema to structure and validate the output against (supports expressions)", default: `{ "type": "object", "properties": { "state": { "type": "string" }, "cities": { "type": "array", "items": { "type": "string" } } } }`, typeOptions: { rows: 10, }, required: true, noDataExpression: false, displayOptions: { show: { schemaMode: ["static", "dynamic"], }, }, }, { displayName: "JSON Example", name: "jsonExample", type: "string", description: "JSON example to generate schema from (supports expressions)", default: `{ "state": "California", "cities": ["Los Angeles", "San Francisco", "San Diego"] }`, typeOptions: { rows: 10, }, required: true, noDataExpression: false, displayOptions: { show: { schemaMode: ["fromExample"], }, }, }, { displayName: "Make All Fields Required", name: "allFieldsRequired", type: "boolean", default: true, description: "Whether to make all fields in the generated schema required", displayOptions: { show: { schemaMode: ["fromExample"], }, }, }, ], }; async supplyData(itemIndex) { const schemaMode = this.getNodeParameter("schemaMode", itemIndex, "static"); let jsonSchema; try { if (schemaMode === "fromExample") { const jsonExampleTemplate = this.getNodeParameter("jsonExample", itemIndex, ""); const allFieldsRequired = this.getNodeParameter("allFieldsRequired", itemIndex, true); const resolvedExample = (0, utils_1.hasExpressions)(jsonExampleTemplate) ? utils_1.evaluateExpression.call(this, jsonExampleTemplate, itemIndex) : jsonExampleTemplate; jsonSchema = (0, utils_1.generateSchemaFromExample)(resolvedExample, allFieldsRequired); } else { const schemaTemplate = this.getNodeParameter("jsonSchema", itemIndex, ""); const resolvedSchemaString = (0, utils_1.hasExpressions)(schemaTemplate) ? utils_1.evaluateExpression.call(this, schemaTemplate, itemIndex) : schemaTemplate; jsonSchema = (0, utils_1.validateDynamicSchema)(resolvedSchemaString); } const zodSchema = (0, utils_1.convertJsonSchemaToZod)(jsonSchema); const outputParser = output_parsers_1.StructuredOutputParser.fromZodSchema(zodSchema); return { response: outputParser, }; } catch (error) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error creating advanced output parser: ${error instanceof Error ? error.message : String(error)}`); } } } exports.AdvancedOutputParser = AdvancedOutputParser;