把 Dify 应用的对话接口转换成 OpenAI Chat Completions 格式,让只支持 OpenAI API 的客户端(如 ChatGPT-Next-Web、各类 OpenAI SDK)可以直接调用 Dify 应用。
客户端 ──(OpenAI 格式)──> Dify2OpenaiApi ──(Dify 格式)──> Dify /chat-messages
<──(OpenAI SSE)── <──(Dify SSE)──
- 接收
POST /v1/chat/completions请求 - 把请求头里的
Authorization: Bearer <key>原样转发给 Dify,因此 这里填的 key 就是 Dify 应用的 API Key - 取
messages数组中的最后一条消息作为query发给 Dify 的/chat-messages(streaming 模式) - 把 Dify 返回的
message事件转换成 OpenAI 的chat.completion.chunk,以 SSE 形式返回,最后发送data: [DONE]
需要 Node.js 18 或更高版本。
git clone <本仓库地址>
cd Dify2OpenaiApi
npm install在项目根目录创建 .env:
# Dify API 地址(必填),例如 Dify 云服务:
DIFY_API_URL=https://api.dify.ai/v1
# 监听端口(可选,默认 3000)
PORT=3000启动:
npm startcurl http://localhost:3000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer app-xxxxxxxxxxxxxxxx" \
-d '{
"model": "dify",
"messages": [{"role": "user", "content": "你好"}],
"stream": true
}'import OpenAI from 'openai';
const openai = new OpenAI({
apiKey: 'app-xxxxxxxxxxxxxxxx', // Dify 应用的 API Key
baseURL: 'http://localhost:3000/v1',
});
const stream = await openai.chat.completions.create({
model: 'dify',
messages: [{ role: 'user', content: '你好' }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || '');
}在客户端里把 API 地址设为 http://<你的服务器>:3000,API Key 填 Dify 应用的 API Key 即可。model 可以随便填,服务只会把它原样写回响应。
| 变量 | 必填 | 默认值 | 说明 |
|---|---|---|---|
DIFY_API_URL |
是 | — | Dify API 基础地址,会在后面拼接 /chat-messages |
PORT |
否 | 3000 |
服务监听端口 |
- 只支持流式返回:不论请求里
stream是否为true,都以 SSE 形式返回 - 不支持多轮对话:Dify 用
conversation_id维护上下文,本服务每次都新建会话,只发送最后一条消息,之前的messages会被忽略 - 只支持 Dify 的对话型应用(调用
/chat-messages接口),不支持文本生成型应用 inputs固定为空对象,user固定为apiuser- 只实现了
/v1/chat/completions,没有/v1/models等其他接口 - 每个请求都会把请求头和请求体打印到控制台(包括
Authorization),生产环境请注意日志安全
ISC