import { NodeConnectionTypes } from 'n8n-workflow'; import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription, INodeTypeBaseDescription, EngineResponse, EngineRequest, } from 'n8n-workflow'; import type { RequestResponseMetadata } from '@utils/agent-execution'; import { promptTypeOptions, promptTypeOptionsDeprecated, textFromGuardrailsNode, textFromPreviousNode, textInput, } from '@utils/descriptions'; import { toolsAgentProperties } from '../agents/ToolsAgent/V3/description'; import { toolsAgentExecute } from '../agents/ToolsAgent/V3/execute'; import { getInputs } from '../utils'; export class AgentV3 implements INodeType { description: INodeTypeDescription; constructor(baseDescription: INodeTypeBaseDescription) { this.description = { ...baseDescription, version: [3, 3.1], defaults: { name: 'AI Agent', color: '#404040', }, inputs: `={{ ((hasOutputParser, needsFallback) => { ${getInputs.toString()}; return getInputs(true, hasOutputParser, needsFallback); })($parameter.hasOutputParser === undefined || $parameter.hasOutputParser === true, $parameter.needsFallback !== undefined && $parameter.needsFallback === true) }}`, outputs: [NodeConnectionTypes.Main], builderHint: { ...baseDescription.builderHint, inputs: { ai_languageModel: { required: true }, ai_memory: { required: false }, ai_tool: { required: false }, ai_outputParser: { required: false, displayOptions: { show: { hasOutputParser: [true] } }, }, }, }, properties: [ { displayName: 'Tip: Get a feel for agents with our quick tutorial or see an example of how this node works', name: 'aiAgentStarterCallout', type: 'callout', default: '', }, { ...promptTypeOptionsDeprecated, displayOptions: { show: { '@version': [{ _cnd: { lt: 3.1 } }] } }, }, { ...promptTypeOptions, displayOptions: { show: { '@version': [{ _cnd: { gte: 3.1 } }] } }, }, { ...textFromGuardrailsNode, displayOptions: { show: { promptType: ['guardrails'], }, }, }, { ...textFromPreviousNode, displayOptions: { show: { promptType: ['auto'], }, }, }, { ...textInput, displayOptions: { show: { promptType: ['define'], }, }, }, { displayName: 'Require Specific Output Format', name: 'hasOutputParser', type: 'boolean', default: false, noDataExpression: true, }, { displayName: `Connect an output parser on the canvas to specify the output format you require`, name: 'notice', type: 'notice', default: '', displayOptions: { show: { hasOutputParser: [true], }, }, }, { displayName: 'Enable Fallback Model', name: 'needsFallback', type: 'boolean', default: false, noDataExpression: true, }, { displayName: 'Connect an additional language model on the canvas to use it as a fallback if the main model fails', name: 'fallbackNotice', type: 'notice', default: '', displayOptions: { show: { needsFallback: [true], }, }, }, toolsAgentProperties, ], hints: [ { message: 'You are using streaming responses. Make sure to set the response mode to "Streaming Response" on the connected trigger node.', type: 'warning', location: 'outputPane', whenToDisplay: 'afterExecution', displayCondition: '={{ $parameter["enableStreaming"] === true }}', }, ], }; } async execute( this: IExecuteFunctions, response?: EngineResponse, ): Promise> { return await toolsAgentExecute.call(this, response); } }