Dify2OpenAI 是一个将 Dify 应用程序转换为 OpenAI API 接口的网关服务,使您可以使用 OpenAI API 兼容的方式访问 Dify 的 LLM、知识库、工具和工作流程。
- 将 Dify API 转换为 OpenAI API
- 支持流式传输和阻止
- 在 dify 上支持 Chat、Completion、Agent 和 Workflow bots API
- 图像支持
- 变量支持
- 持续对话
- Workflow Bot
- Streaming & Blocking
- Agent & Chat bots
git clone https://github.com/onenov/Dify2OpenAI.git
cd Dify2OpenAI
npm install
使用 PM2 启动(推荐):
pm2 start ecosystem.config.js
或者使用普通方式启动:
npm run start
默认服务会在 http://localhost:3099
运行。
# 查看应用状态
pm2 list
# 查看日志
pm2 logs
# 重启应用
pm2 restart dify2openai
# 停止应用
pm2 stop dify2openai
# 删除应用
pm2 delete dify2openai
- 点击上方按钮跳转至 Vercel
- 创建并导入项目
- 直接部署即可,无需配置环境变量
- 部署完成后,可以通过以下三种方式访问:
- 在 Authorization Header 中传递所有配置
- 在 Authorization Header 中传递 API_KEY,其他配置通过 model 参数传递
- 在 Authorization Header 中传递 DIFY_API_URL,其他配置通过 model 参数传递
注意:Vercel 的无服务器函数有 10 秒的超时限制。
Authorization Header 格式:
Authorization: Bearer DIFY_API_URL|API_KEY|BOT_TYPE|INPUT_VARIABLE|OUTPUT_VARIABLE
- 所有配置信息都通过 Authorization Header 传递。
model
参数设置为dify
。
示例:
Authorization: Bearer https://cloud.dify.ai/v1|app-xxxx|Chat
Authorization Header 格式:
Authorization: Bearer API_KEY
model
参数格式:
"model": "dify|BOT_TYPE|DIFY_API_URL|INPUT_VARIABLE|OUTPUT_VARIABLE"
- Authorization Header 中只包含
API_KEY
。 - 其他配置信息通过请求体中的
model
参数传递。
示例:
Authorization: Bearer app-xxxx
"model": "dify|Chat|https://cloud.dify.ai/v1"
Authorization Header 格式:
Authorization: Bearer DIFY_API_URL
model
参数格式:
"model": "dify|API_KEY|BOT_TYPE|INPUT_VARIABLE|OUTPUT_VARIABLE"
- Authorization Header 中只包含
DIFY_API_URL
。 - 其他配置信息通过请求体中的
model
参数传递。
示例:
Authorization: Bearer https://cloud.dify.ai/v1
"model": "dify|app-xxxx|Chat"
.
├── app.js # 应用入口文件
├── botType/ # 机器人类型处理器
│ ├── chatHandler.js # 聊天处理器
│ ├── completionHandler.js # 补全处理器
│ ├── utils.js # 工具函数
│ └── workflowHandler.js # 工作流处理器
├── config/ # 配置文件目录
│ └── logger.js # 日志配置
├── public/ # 静态文件目录
│ └── index.html # API 文档页面
├── ecosystem.config.js # PM2 配置文件
├── nodemon.json # Nodemon 配置文件
└── package.json # 项目配置文件
项目使用 nodemon 进行开发模式的热重载,配置如下:
{
"watch": ["*.js", "botType/*.js", "config/*.js"],
"ext": "js,json,env",
"ignore": [
"node_modules/",
"*.test.js",
"logs/*",
".git",
"public/*"
],
"delay": "500",
"verbose": true
}
watch
: 监控的文件和目录ext
: 监控的文件扩展名ignore
: 忽略的文件和目录delay
: 延迟重启时间(毫秒)verbose
: 显示详细日志
- 克隆项目
git clone https://github.com/onenov/Dify2OpenAI.git
cd Dify2OpenAI
- 安装依赖
npm install
- 启动开发服务器
npm run dev
- 生产环境部署
npm start
# 或使用 PM2
pm2 start ecosystem.config.js
- 使用 ES Modules 导入导出
- 异步操作使用 async/await
- 错误处理使用 try/catch
- 使用 winston 进行日志记录
默认情况下:
- 生产环境(
npm start
):只记录错误级别日志,仅在控制台显示 - 开发环境(
npm run dev
):记录所有级别日志,同时输出到控制台和文件
日志文件存储在 logs
目录下:
combined-%DATE%.log
: 所有级别的日志error-%DATE%.log
: 仅错误级别的日志
支持以下日志级别(按严重程度排序):
error
: 错误信息warn
: 警告信息info
: 一般信息debug
: 调试信息
每条日志包含以下信息:
- 时间戳
- 日志级别
- 详细信息
- 元数据(如果有)
示例:
{
"level": "info",
"message": "服务器启动成功",
"timestamp": "2024-12-24T01:51:10+08:00",
"port": 3099
}
日志文件按以下规则自动轮转:
- 按日期轮转(每天一个新文件)
- 单个文件最大 20MB
- 保留最近 14 天的日志
- 超出限制的日志文件会被自动删除
为了优化性能,日志系统采用以下策略:
- 使用缓冲写入,减少 I/O 操作
- 异步写入,不阻塞主线程
- 自动清理过期日志,控制磁盘占用
curl http://localhost:3099/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer https://cloud.dify.ai/v1|app-xxxx|Chat" \
-X POST \
-d '{
"model": "dify",
"stream": true,
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "你好"
}
]
}'
curl http://localhost:3099/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer app-xxxx" \
-X POST \
-d '{
"model": "dify|Chat|https://cloud.dify.ai/v1",
"stream": true,
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "你好"
}
]
}'
curl http://localhost:3099/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer https://cloud.dify.ai/v1" \
-X POST \
-d '{
"model": "dify|app-xxxx|Chat",
"stream": true,
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "你好"
}
]
}'
curl http://localhost:3099/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer https://cloud.dify.ai/v1|app-xxxx|Chat" \
-X POST \
-d '{
"model": "dify",
"stream": true,
"messages": [
{
"role": "user",
"content": [
"请分析这张图片。",
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg"
}
}
]
}
]
}'
curl http://localhost:3099/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer app-xxxx" \
-X POST \
-d '{
"model": "dify|Chat|https://cloud.dify.ai/v1",
"stream": true,
"messages": [
{
"role": "user",
"content": [
"请分析这张图片。",
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg"
}
}
]
}
]
}'
curl http://localhost:3099/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer https://cloud.dify.ai/v1" \
-X POST \
-d '{
"model": "dify|app-xxxx|Chat",
"stream": true,
"messages": [
{
"role": "user",
"content": [
"请分析这张图片。",
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg"
}
}
]
}
]
}'
-
参数替换:请将示例中的
https://cloud.dify.ai/v1
、app-xxxx
、BOT_TYPE
等参数替换为您实际的值。 -
BOT_TYPE
:可选值为Chat
、Completion
或Workflow
,请根据您的应用类型选择。 -
INPUT_VARIABLE
和OUTPUT_VARIABLE
:主要用于Workflow
类型的应用,如果不需要可省略。 -
stream
参数:如果需要流式返回,请将stream
设置为true
,否则可以省略或设置为false
。 -
安全性:请妥善保管您的
API_KEY
,不要泄露给无关人员。
WeChat:AOKIEO
| Mail: dev@orence.ai
This project is licensed under the MIT License - see the LICENSE file for details.
感谢您使用 Dify2OpenAI!如果您在使用过程中遇到任何问题,欢迎提问,我们将尽快协助您解决。