跳到主要内容

n8n集成

概述

n8n 是一个功能强大的开源自动化平台,允许用户通过可视化界面创建、部署和管理复杂的工作流程。它支持300多种应用和服务的集成,并提供webhook、定时触发等多种触发方式。

OneAI与n8n的双向集成为用户提供了强大的自动化能力:

  1. OneAI调用n8n工作流:通过技能插件机制,将n8n工作流作为OneAI的扩展能力,使AI能够触发和执行复杂的自动化流程,实现数据处理、系统集成等功能。
  2. n8n调用OneAI API:在n8n工作流中无缝调用OneAI的智能服务,为自动化流程注入AI能力,如文本分析、内容生成、知识问答等。

这种双向集成为企业提供了灵活的自动化解决方案,可用于客户服务自动化、数据处理流程、跨系统业务流程编排、智能通知等场景,帮助企业提升运营效率并降低人工成本。

n8n 调用OneAI API

安装OneAI社区节点

通过n8n工作台左下角的 ... > Setting进入设置页面,在Community nodes中安装 n8n-nodes-oneai

提示

请在社区节点安装完成以后重启n8n服务,否则可能会在节点面板中看到重复的OneAI节点

添加OneAI Credential

在添加Credential的界面中,选择OneAI。

填写以下信息:

  • Base URL:OneAI服务器地址,结尾不带/
  • Client ID:通过OneAI的Client Management进行创建和获取
  • Client Secret:通过OneAI的Client Management进行创建和获取
  • User Account:对应用户管理的User Name,将以该用户身份进行接口调用,请确保用户有足够的API权限

保存后Credential会自动测试,配置正确情况下会显示Connection tested successfully

方式1:通过One AI Node调用OpenAPI

选择One AI节点:

选择需要执行的Action(操作):

测试节点:

  1. 选择适当的参数进行配置
  2. 点击"Test Step"按钮执行测试
  3. 在右侧面板可以查看执行结果

具体测试步骤:

  • 确认已正确选择OneAI Credential
  • 填写必要的输入参数
  • 执行节点并验证返回结果是否符合预期
  • 若执行失败,检查错误信息并相应调整配置

方式2:通过HTTP Request Node调用OpenAPI

OneAI Node目前只提供了部分OpenAPI Operation,如果需要的API不在OneAI Node的Operation列表中,可以使用HTTP Request Node直接调用API。

选择HTTP Request节点:

配置请求参数:

  • Method:选择适当的HTTP方法(GET/POST/PUT等)
  • URL:填写OneAI API的完整URL路径
  • Headers:按需添加请求头
  • Query Parameters/Body:根据API要求配置
提示

你可以通过Import cURL进行导入,但注意要移除Header中的Authorization,否则会和下面的Authentication配置发生冲突

配置Authentication:

  • Authentication:选择Predefined Credential Type
  • Credential Type:选择OneAI API
  • OneAI API:选择现有的OneAI Credential或新建

测试节点:

  1. 确认所有参数配置无误
  2. 点击"Execute Node"按钮执行测试
  3. 检查返回结果是否符合预期

OneAI 调用n8n工作流

创建n8n流程

首先,创建一个工作流,命名为Echo,并将Trigger设置为Webhook。创建完成后,点击右上角的"Active"按钮激活流程。

配置Webhook:

  • HTTP Method:选择POST
  • Path:调用此流程的地址,可使用默认值
  • Authentication:选择Header Auth并创建Credential,将Header和Value保存下来,后续配置技能插件需要使用
  • Respond:选择 Using 'Respond to Webhook' Node

添加Respond to Webhook节点,设置如下:

  • Respond With:选择JSON
  • Response Body:将Fixed切换为Expression并输入以下json:
{
"output": "{{ $json.body.input }}"
}

添加技能并关联至n8n流程

在OneAI平台中完成以下配置:

  • Code:输入echo
  • Name:输入echo,点击魔术棒自动翻译
  • Description:输入echo,点击魔术棒自动翻译
  • Request header:如果在前面的n8n webhook设置了Header Auth,则在此添加对应的Header和Value,确保接口认证能够通过
  • OpenAPI / Swagger Schema (JSON):在以下模板基础上进行修改:
提示

{n8n_server_url}替换为n8n服务器的URL,将{n8n_webhook_path}替换为n8n webhook节点的path

{
"openapi": "3.0.3",
"info": {
"title": "N8N echo example",
"version": "1.0.0"
},
"servers": [
{
"url": "{n8n_server_url}"
}
],
"paths": {
"/webhook/{n8n_webhook_path}": {
"post": {
"operationId": "echo",
"summary": "echo",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"input": {
"type": "string",
"description": "Text content from user input"
}
},
"required": [
"input"
]
}
}
}
},
"responses": {
"200": {
"description": "Echo success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"output": {
"type": "string",
"description": "Echo output"
}
},
"required": [
"output"
]
}
}
}
}
}
}
}
}
}

设置完成后,可以点击"debug"按钮进行测试:

通过Chatbot调用技能

为Chatbot添加echo技能:

修改Chatbot的Prompt,引导技能调用。

Prompt 示例:

# Skill echo

If the user enters the `echo` command, please call the `echo` function and return `output` in the result.

测试技能(输入 echo 1+1=?,返回 1+1=?,并且能够看到echo技能被调用):

检查n8n流程执行状态:

更复杂的流程,可在此示例基础上进行扩展。

例如:需要通过n8n查询数据库并返回数据,可在Webhook和Respond to Webhook节点之间添加一个Database节点,并配置数据库连接信息。 然后相应调整Respond to webhook的Body取值,使其能够正确返回查询到的数据。

最佳实践与故障排除

最佳实践

  • 为每个工作流编写清晰的注释和描述
  • 使用适当的错误处理机制确保流程稳定性
  • 定期检查工作流执行历史和日志
  • 对于复杂流程,建议先在测试环境中验证

常见问题排查

  1. 认证失败

    • 检查Credential配置是否正确
    • 确认Client ID和Secret是否有效
    • 验证用户账号是否具有足够的权限
  2. Webhook调用失败

    • 确认n8n服务可从OneAI服务器访问
    • 检查认证头信息是否正确配置
    • 验证webhook路径是否正确
  3. 节点执行错误

    • 检查输入数据格式是否符合要求
    • 确认API版本兼容性
    • 查看详细的错误日志信息

部署n8n

n8n提供了多种环境的部署文档,您可以参考n8n自托管部署选择最适合您的部署方式。

如果您想在Azure平台上快速部署n8n,并且熟悉Terraform,以下脚本可供您参考:

main.tf
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "4.27.0"
}
}
}

provider "azurerm" {
features {}
subscription_id = var.subscription_id
tenant_id = var.tenant_id
}

# Variable definitions
variable "subscription_id" {
description = "Azure Subscription ID"
type = string
default = "your-subscription-id"
}

variable "tenant_id" {
description = "Azure Tenant ID"
type = string
default = "your-tenant-id"
}

variable "application_name" {
description = "Application name"
type = string
default = "n8n"
}

variable "environment" {
description = "Environment"
type = string
default = "dev"
}

variable "location" {
description = "Azure region"
type = string
default = "eastasia"
}

variable "container_image" {
description = "N8N container image"
type = string
default = "n8nio/n8n:latest"
}

variable "n8n_host" {
description = "N8N URL"
type = string
default = "your-app-url.azurewebsites.net"
}

variable "random_suffix" {
description = "Random string"
type = string
default = "suffix"
}

variable "app_service_sku" {
description = "App Service Plan SKU"
type = string
default = "B2"
}

# Account and password variables
variable "n8n_encryption_key" {
description = "N8N encryption key"
type = string
default = "your-encryption-key"
sensitive = true
}

variable "n8n_basic_auth_user" {
description = "N8N basic auth username"
type = string
default = "admin"
}

variable "n8n_basic_auth_password" {
description = "N8N basic auth password"
type = string
default = "your-secure-password"
sensitive = true
}

variable "postgresql_admin_username" {
description = "PostgreSQL admin username"
type = string
default = "psqladmin"
}

variable "postgresql_admin_password" {
description = "PostgreSQL admin password"
type = string
default = "your-secure-password"
sensitive = true
}

# Resource Group
resource "azurerm_resource_group" "n8n" {
name = "rg-${var.application_name}-${var.environment}"
location = var.location
}

# App Service Plan
resource "azurerm_service_plan" "n8n" {
name = "asp-${var.application_name}-${var.environment}"
resource_group_name = azurerm_resource_group.n8n.name
location = azurerm_resource_group.n8n.location
os_type = "Linux"
sku_name = var.app_service_sku
}

# App Service (Web App for Containers)
resource "azurerm_linux_web_app" "n8n" {
name = "app-${var.application_name}-${var.environment}-${var.random_suffix}"
resource_group_name = azurerm_resource_group.n8n.name
location = azurerm_resource_group.n8n.location
service_plan_id = azurerm_service_plan.n8n.id

app_settings = {
"N8N_ENCRYPTION_KEY" = var.n8n_encryption_key
"N8N_HOST" = "${var.n8n_host}"
"N8N_PORT" = "443"
"N8N_PROTOCOL" = "https"
"N8N_WEBHOOK_URL" = "https://${var.n8n_host}/"
"GENERIC_TIMEZONE" = "Asia/Shanghai"
"N8N_BASIC_AUTH_ACTIVE" = "true"
"N8N_BASIC_AUTH_USER" = var.n8n_basic_auth_user
"N8N_BASIC_AUTH_PASSWORD" = var.n8n_basic_auth_password
"EXECUTIONS_DATA_PRUNE" = "true"
"EXECUTIONS_DATA_MAX_AGE" = "336"
"WEBSITES_PORT" = "443"

# DB Config
"DB_TYPE" = "postgresdb"
"DB_POSTGRESDB_HOST" = "${azurerm_postgresql_flexible_server.postgresql_server.fqdn}"
"DB_POSTGRESDB_PORT" = "5432"
"DB_POSTGRESDB_DATABASE" = "${azurerm_postgresql_flexible_server_database.postgresql_database.name}"
"DB_POSTGRESDB_USER" = var.postgresql_admin_username
"DB_POSTGRESDB_PASSWORD" = var.postgresql_admin_password
"DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED" = "false"
}

site_config {
always_on = true
websockets_enabled = true

application_stack {
docker_image_name = "${var.container_image}"
docker_registry_url = "https://docker.n8n.io"
}
}
}

# PostgreSQL database server
resource "azurerm_postgresql_flexible_server" "postgresql_server" {
name = "psql-${var.application_name}-${var.environment}"
resource_group_name = azurerm_resource_group.n8n.name
location = azurerm_resource_group.n8n.location
administrator_login = var.postgresql_admin_username
administrator_password = var.postgresql_admin_password

version = "16"
sku_name = "B_Standard_B1ms"
# 128GB
storage_mb = 131072

backup_retention_days = 35
geo_redundant_backup_enabled = true

public_network_access_enabled = true

lifecycle {
ignore_changes = [
zone,
]
}
}

# PostgreSQL firewall rule
resource "azurerm_postgresql_flexible_server_firewall_rule" "postgresql_firewall_rule" {
name = "AllowAzureServicesAccessPGSQL"
server_id = azurerm_postgresql_flexible_server.postgresql_server.id
start_ip_address = "0.0.0.0"
end_ip_address = "0.0.0.0"
}

# PostgreSQL database instance
resource "azurerm_postgresql_flexible_server_database" "postgresql_database" {
name = "psqldb-${var.application_name}-${var.environment}"
server_id = azurerm_postgresql_flexible_server.postgresql_server.id
charset = "UTF8"
collation = "en_US.utf8"
}

# Output
output "n8n_url" {
description = "N8N access url"
value = "https://${azurerm_linux_web_app.n8n.default_hostname}"
}

参考资料

n8n相关资源

OneAI相关资源