# Dify2OpenAI
**Repository Path**: AlienElephant/Dify2OpenAI
## Basic Information
- **Project Name**: Dify2OpenAI
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-07-13
- **Last Updated**: 2025-07-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

# Dify2OpenAI Gateway
[](https://afdian.com/@orence)
**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
---
## 安装与启动
### 安装依赖
```bash
git clone https://github.com/onenov/Dify2OpenAI.git
cd Dify2OpenAI
npm install
```
### 启动服务
使用 PM2 启动(推荐):
```bash
# 直接使用PM2命令
pm2 start ecosystem.config.cjs
# 或使用npm脚本
npm run pm2:start
```
或者使用普通方式启动:
```bash
npm run start
```
默认服务会在 `http://localhost:3099` 运行。
### PM2 常用命令
使用PM2直接管理:
```bash
# 查看应用状态
pm2 list
# 查看日志
pm2 logs
# 重启应用
pm2 restart dify2openai
# 停止应用
pm2 stop dify2openai
# 删除应用
pm2 delete dify2openai
# 监控应用
pm2 monit
```
使用npm脚本管理:
```bash
# 启动应用
npm run pm2:start
# 查看日志
npm run pm2:logs
# 重启应用
npm run pm2:restart
# 停止应用
npm run pm2:stop
# 删除应用
npm run pm2:delete
# 监控应用
npm run pm2:monit
```
---
## 一键部署
### Vercel 部署
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fonenov%2FDify2OpenAI)
1. 点击上方按钮跳转至 Vercel
2. 创建并导入项目
3. 直接部署即可,无需配置环境变量
4. 部署完成后,可以通过以下三种方式访问:
- 在 Authorization Header 中传递所有配置
- 在 Authorization Header 中传递 API_KEY,其他配置通过 model 参数传递
- 在 Authorization Header 中传递 DIFY_API_URL,其他配置通过 model 参数传递
注意:Vercel 的无服务器函数有 10 秒的超时限制。
---
## 接入方式
### 接入方式一:所有配置在 Authorization Header 中
**Authorization Header 格式:**
```
Authorization: Bearer DIFY_API_URL|API_KEY|BOT_TYPE|INPUT_VARIABLE|OUTPUT_VARIABLE
```
- 所有配置信息都通过 Authorization Header 传递。
- `model` 参数设置为 `dify`。
**示例:**
```bash
Authorization: Bearer https://cloud.dify.ai/v1|app-xxxx|Chat
```
### 接入方式二:Authorization Header 传递 API_KEY,model 参数传递其他配置
**Authorization Header 格式:**
```
Authorization: Bearer API_KEY
```
**`model` 参数格式:**
```
"model": "dify|BOT_TYPE|DIFY_API_URL|INPUT_VARIABLE|OUTPUT_VARIABLE"
```
- Authorization Header 中只包含 `API_KEY`。
- 其他配置信息通过请求体中的 `model` 参数传递。
**示例:**
```bash
Authorization: Bearer app-xxxx
```
```json
"model": "dify|Chat|https://cloud.dify.ai/v1"
```
### 接入方式三:Authorization Header 传递 DIFY_API_URL,model 参数传递其他配置
**Authorization Header 格式:**
```
Authorization: Bearer DIFY_API_URL
```
**`model` 参数格式:**
```
"model": "dify|API_KEY|BOT_TYPE|INPUT_VARIABLE|OUTPUT_VARIABLE"
```
- Authorization Header 中只包含 `DIFY_API_URL`。
- 其他配置信息通过请求体中的 `model` 参数传递。
**示例:**
```bash
Authorization: Bearer https://cloud.dify.ai/v1
```
```json
"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.cjs # PM2 配置文件
├── nodemon.json # Nodemon 配置文件
└── package.json # 项目配置文件
```
### 开发模式配置
项目使用 nodemon 进行开发模式的热重载,配置如下:
```json
{
"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`: 显示详细日志
### 开发流程
1. 克隆项目
```bash
git clone https://github.com/onenov/Dify2OpenAI.git
cd Dify2OpenAI
```
2. 安装依赖
```bash
npm install
```
3. 启动开发服务器
```bash
npm run dev
```
4. 生产环境部署
```bash
npm start
# 或使用 PM2
pm2 start ecosystem.config.cjs
```
### 代码风格
- 使用 ES Modules 导入导出
- 异步操作使用 async/await
- 错误处理使用 try/catch
- 使用 winston 进行日志记录
---
## 日志系统
### 日志配置
默认情况下:
- 生产环境(`npm start`):只记录错误级别日志,仅在控制台显示
- 开发环境(`npm run dev`):记录所有级别日志,同时输出到控制台和文件
日志文件存储在 `logs` 目录下:
- `combined-%DATE%.log`: 所有级别的日志
- `error-%DATE%.log`: 仅错误级别的日志
### 日志级别
支持以下日志级别(按严重程度排序):
- `error`: 错误信息
- `warn`: 警告信息
- `info`: 一般信息
- `debug`: 调试信息
### 日志格式
每条日志包含以下信息:
- 时间戳
- 日志级别
- 详细信息
- 元数据(如果有)
示例:
```json
{
"level": "info",
"message": "服务器启动成功",
"timestamp": "2024-12-24T01:51:10+08:00",
"port": 3099
}
```
### 日志轮转
日志文件按以下规则自动轮转:
- 按日期轮转(每天一个新文件)
- 单个文件最大 20MB
- 保留最近 14 天的日志
- 超出限制的日志文件会被自动删除
### 性能优化
为了优化性能,日志系统采用以下策略:
- 使用缓冲写入,减少 I/O 操作
- 异步写入,不阻塞主线程
- 自动清理过期日志,控制磁盘占用
---
## 示例
### 基础对话
#### 接入方式一
```bash
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": "你好"
}
]
}'
```
#### 接入方式二
```bash
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": "你好"
}
]
}'
```
#### 接入方式三
```bash
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": "你好"
}
]
}'
```
### 带图片的对话
#### 接入方式一
```bash
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"
}
}
]
}
]
}'
```
#### 接入方式二
```bash
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"
}
}
]
}
]
}'
```
#### 接入方式三
```bash
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`**
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
---
## 更新日志
### 2025-04-05更新
#### 已修复的问题
1. **Base64图像处理问题**
- **问题**:无法正确处理base64编码的图像数据,错误地将其作为URL处理
- **修复**:添加了对以"data:"开头的数据的检测,并通过`uploadFileToDify`函数上传到Dify服务器
- **效果**:现在可以正确处理base64图像数据,获取文件ID并使用`local_file`方式引用
2. **OpenAI标准格式消息处理**
- **问题**:不支持OpenAI标准格式的字符串类型内容处理
- **修复**:增加了`typeof content === "string"`的判断逻辑
- **效果**:可以处理多种类型的消息格式,包括字符串和对象混合的内容数组
3. **文件类型自动识别**
- **问题**:所有文件都被错误地识别为"image"类型,导致PDF等文件处理失败
- **修复**:创建了`getFileExtension()`和`getFileType()`函数,根据扩展名识别文件类型
- **效果**:正确区分document、image、audio、video等不同类型文件,确保Dify能正确处理
4. **多消息图片处理**
- **问题**:只处理最后一条消息中的图片,忽略之前消息中的图片内容
- **修复**:重构了消息处理逻辑,先扫描所有消息找图片,再从最后一条提取文本
- **效果**:能够处理多条消息中的图片,不会遗漏任何消息中的图像内容
5. **PM2脚本便捷命令**
- **改进**:添加了PM2管理的npm脚本命令
- **效果**:可以通过`npm run pm2:*`命令更方便地管理应用
---
**感谢您使用 Dify2OpenAI!如果您在使用过程中遇到任何问题,欢迎提问,我们将尽快协助您解决。**