n8n-nodes-advanced-output-parser
Version:
Advanced Output Parser node for n8n with dynamic expression support
168 lines (167 loc) • 6.32 kB
JavaScript
"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;