n8n集成
概述
n8n 是一个功能强大的开源自动化平台,允许用户通过可视化界面创建、部署和管理复杂的工作流程。它支持300多种应用和服务的集成,并提供webhook、定时触发等多种触发方式。
OneAI与n8n的双向集成为用户提供了强大的自动化能力:
- OneAI调用n8n工作流:通过技能插件机制,将n8n工作流作为OneAI的扩展能力,使AI能够触发和执行复杂的自动化流程,实现数据处理、系统集成等功能。
- 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(操作):
测试节点:
- 选择适当的参数进行配置
- 点击"Test Step"按钮执行测试
- 在右侧面板可以查看执行结果
具体测试步骤:
- 确认已正确选择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或新建
测试节点:
- 确认所有参数配置无误
- 点击"Execute Node"按钮执行测试
- 检查返回结果是否符合预期
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取值,使其能够正确返回查询到的数据。
最佳实践与故障排除
最佳实践
- 为每个工作流编写清晰的注释和描述
- 使用适当的错误处理机制确保流程稳定性
- 定期检查工作流执行历史和日志
- 对于复杂流程,建议先在测试环境中验证
常见问题排查
-
认证失败
- 检查Credential配置是否正确
- 确认Client ID和Secret是否有效
- 验证用户账号是否具有足够的权限
-
Webhook调用失败
- 确认n8n服务可从OneAI服务器访问
- 检查认证头信息是否正确配置
- 验证webhook路径是否正确
-
节点执行错误
- 检查输入数据格式是否符合要求
- 确认API版本兼容性
- 查看详细的错误日志信息
部署n8n
n8n提供了多种环境的部署文档,您可以参考n8n自托管部署选择最适合您的部署方式。
如果您想在Azure平台上快速部署n8n,并且熟悉Terraform,以下脚本可供您参考:
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}"
}