feat(M5): API集成文档 - 对话接口、知识库管理、Python/Node.js/企微集成示例
This commit is contained in:
@@ -0,0 +1,385 @@
|
|||||||
|
# Dify API 集成指南
|
||||||
|
|
||||||
|
> 西安云美电子科技有限公司 - 企业知识库
|
||||||
|
> 版本:v1.0 | 创建时间:2026-06-06
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 概述
|
||||||
|
|
||||||
|
Dify 提供完整的 RESTful API,支持将知识库对话能力集成到企业微信、钉钉、自建系统等渠道。本文档涵盖最常用的 API 接口及集成示例。
|
||||||
|
|
||||||
|
**Base URL**: `http://<dify-host>/v1`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 认证方式
|
||||||
|
|
||||||
|
所有 API 请求需在 Header 中携带 API Key:
|
||||||
|
|
||||||
|
```
|
||||||
|
Authorization: Bearer app-<your-api-key>
|
||||||
|
```
|
||||||
|
|
||||||
|
**获取 API Key**:Dify 控制台 → 应用 → API 访问 → 创建 API Key
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 对话接口
|
||||||
|
|
||||||
|
### 3.1 发送对话消息
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /v1/chat-messages
|
||||||
|
```
|
||||||
|
|
||||||
|
**请求参数**
|
||||||
|
|
||||||
|
| 参数 | 类型 | 必填 | 说明 |
|
||||||
|
|------|------|:----:|------|
|
||||||
|
| query | string | ✅ | 用户输入的问题 |
|
||||||
|
| inputs | object | ❌ | 额外输入参数 |
|
||||||
|
| response_mode | string | ✅ | `blocking`(阻塞)或 `streaming`(流式) |
|
||||||
|
| conversation_id | string | ❌ | 对话 ID,首次对话不传,后续传入上一次返回的 ID |
|
||||||
|
| user | string | ✅ | 用户标识 |
|
||||||
|
| files | array | ❌ | 上传文件列表 |
|
||||||
|
|
||||||
|
**阻塞模式请求示例**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST 'http://<dify-host>/v1/chat-messages' \
|
||||||
|
-H 'Authorization: Bearer app-<api-key>' \
|
||||||
|
-H 'Content-Type: application/json' \
|
||||||
|
-d '{
|
||||||
|
"query": "差旅报销标准是什么?",
|
||||||
|
"inputs": {},
|
||||||
|
"response_mode": "blocking",
|
||||||
|
"user": "zhangsan"
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
**阻塞模式响应**
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"task_id": "xxx",
|
||||||
|
"message_id": "xxx",
|
||||||
|
"conversation_id": "xxx",
|
||||||
|
"answer": "根据《差旅管理制度》第三章:\n\n1. 住宿标准:一线城市 500 元/晚...\n2. 交通标准:高铁二等座...",
|
||||||
|
"created_at": 1717632000
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**流式模式响应(SSE)**
|
||||||
|
|
||||||
|
```
|
||||||
|
data: {"event": "message", "message_id": "xxx", "conversation_id": "xxx", "answer": "根据", ...}
|
||||||
|
data: {"event": "message", "message_id": "xxx", "conversation_id": "xxx", "answer": "根据《", ...}
|
||||||
|
data: {"event": "message_end", ...}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 获取对话历史
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /v1/messages?conversation_id=<id>&user=<user>
|
||||||
|
```
|
||||||
|
|
||||||
|
**响应**
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"limit": 20,
|
||||||
|
"has_more": false,
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": "xxx",
|
||||||
|
"query": "差旅报销标准",
|
||||||
|
"answer": "根据《差旅管理制度》...",
|
||||||
|
"created_at": 1717632000
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 获取对话列表
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /v1/conversations?user=<user>&last_id=<id>&limit=20&sort_by=-updated_at
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.4 重命名对话
|
||||||
|
|
||||||
|
```
|
||||||
|
PATCH /v1/conversations/<conversation_id>/name
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "报销相关问题"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.5 删除对话
|
||||||
|
|
||||||
|
```
|
||||||
|
DELETE /v1/conversations/<conversation_id>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 知识库管理接口
|
||||||
|
|
||||||
|
### 4.1 创建知识库
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /v1/datasets
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "KB-RULE-制度流程",
|
||||||
|
"description": "公司各类管理制度和审批流程文档"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 获取知识库列表
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /v1/datasets?page=1&page_size=20
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 上传文档到知识库
|
||||||
|
|
||||||
|
**步骤一:创建上传任务**
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /v1/datasets/<dataset_id>/document/create-by-file
|
||||||
|
Content-Type: multipart/form-data
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 类型 | 必填 | 说明 |
|
||||||
|
|------|------|:----:|------|
|
||||||
|
| file | file | ✅ | 文档文件(PDF/Word/TXT/Markdown/Excel) |
|
||||||
|
| indexing_technique | string | ✅ | `high_quality`(高质量)或 `economy`(经济) |
|
||||||
|
| process_rule | object | ❌ | 分段规则 |
|
||||||
|
|
||||||
|
**分段规则示例**
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"mode": "automatic",
|
||||||
|
"rules": {
|
||||||
|
"pre_processing_rules": [
|
||||||
|
{"id": "remove_extra_spaces", "enabled": true},
|
||||||
|
{"id": "remove_urls_emails", "enabled": false}
|
||||||
|
],
|
||||||
|
"segmentation": {
|
||||||
|
"max_segmentation_tokens_length": 500,
|
||||||
|
"overlap_tokens_length": 50,
|
||||||
|
"separator": ["\n", "\n\n", "。", "!", "?", ";"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**步骤二:查询上传进度**
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /v1/datasets/<dataset_id>/documents/<document_id>/indexing-status
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 通过文本创建文档
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /v1/datasets/<dataset_id>/document/create-by-text
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "报销流程说明",
|
||||||
|
"text": "## 报销流程\n\n1. 填写报销单...\n2. 部门审批...\n3. 财务审核...",
|
||||||
|
"indexing_technique": "high_quality",
|
||||||
|
"process_rule": {
|
||||||
|
"mode": "automatic"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.5 获取知识库文档列表
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /v1/datasets/<dataset_id>/documents?page=1&page_size=20
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.6 删除文档
|
||||||
|
|
||||||
|
```
|
||||||
|
DELETE /v1/datasets/<dataset_id>/documents/<document_id>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 集成示例
|
||||||
|
|
||||||
|
### 5.1 Python 集成示例
|
||||||
|
|
||||||
|
```python
|
||||||
|
import requests
|
||||||
|
|
||||||
|
DIFY_BASE_URL = "http://<dify-host>/v1"
|
||||||
|
API_KEY = "app-<your-api-key>"
|
||||||
|
|
||||||
|
def chat(query: str, user: str = "default", conversation_id: str = None):
|
||||||
|
"""发送对话消息"""
|
||||||
|
headers = {
|
||||||
|
"Authorization": f"Bearer {API_KEY}",
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
}
|
||||||
|
data = {
|
||||||
|
"query": query,
|
||||||
|
"inputs": {},
|
||||||
|
"response_mode": "blocking",
|
||||||
|
"user": user,
|
||||||
|
}
|
||||||
|
if conversation_id:
|
||||||
|
data["conversation_id"] = conversation_id
|
||||||
|
|
||||||
|
resp = requests.post(
|
||||||
|
f"{DIFY_BASE_URL}/chat-messages",
|
||||||
|
headers=headers,
|
||||||
|
json=data,
|
||||||
|
timeout=30
|
||||||
|
)
|
||||||
|
result = resp.json()
|
||||||
|
return {
|
||||||
|
"answer": result.get("answer", ""),
|
||||||
|
"conversation_id": result.get("conversation_id", ""),
|
||||||
|
"message_id": result.get("message_id", ""),
|
||||||
|
}
|
||||||
|
|
||||||
|
# 使用示例
|
||||||
|
result = chat("差旅报销标准是什么?", user="zhangsan")
|
||||||
|
print(result["answer"])
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 企业微信 Webhook 集成
|
||||||
|
|
||||||
|
```python
|
||||||
|
from flask import Flask, request, jsonify
|
||||||
|
import requests
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
DIFY_API_KEY = "app-<your-api-key>"
|
||||||
|
DIFY_BASE_URL = "http://<dify-host>/v1"
|
||||||
|
|
||||||
|
@app.route("/wecom/webhook", methods=["POST"])
|
||||||
|
def wecom_webhook():
|
||||||
|
"""企业微信消息回调"""
|
||||||
|
data = request.json
|
||||||
|
user_query = data.get("Content", "")
|
||||||
|
user_id = data.get("FromUserName", "unknown")
|
||||||
|
|
||||||
|
# 调用 Dify API
|
||||||
|
resp = requests.post(
|
||||||
|
f"{DIFY_BASE_URL}/chat-messages",
|
||||||
|
headers={"Authorization": f"Bearer {DIFY_API_KEY}"},
|
||||||
|
json={
|
||||||
|
"query": user_query,
|
||||||
|
"response_mode": "blocking",
|
||||||
|
"user": user_id,
|
||||||
|
},
|
||||||
|
timeout=30
|
||||||
|
)
|
||||||
|
answer = resp.json().get("answer", "暂无回复")
|
||||||
|
|
||||||
|
# 返回企业微信消息格式
|
||||||
|
return jsonify({
|
||||||
|
"msgtype": "text",
|
||||||
|
"text": {"content": answer}
|
||||||
|
})
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host="0.0.0.0", port=5000)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.3 Node.js 集成示例
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const axios = require('axios');
|
||||||
|
|
||||||
|
const DIFY_BASE_URL = 'http://<dify-host>/v1';
|
||||||
|
const API_KEY = 'app-<your-api-key>';
|
||||||
|
|
||||||
|
async function chat(query, user = 'default') {
|
||||||
|
const { data } = await axios.post(
|
||||||
|
`${DIFY_BASE_URL}/chat-messages`,
|
||||||
|
{
|
||||||
|
query,
|
||||||
|
inputs: {},
|
||||||
|
response_mode: 'blocking',
|
||||||
|
user,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${API_KEY}`,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
timeout: 30000,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
answer: data.answer,
|
||||||
|
conversationId: data.conversation_id,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用示例
|
||||||
|
chat('差旅报销标准是什么?', 'zhangsan')
|
||||||
|
.then(result => console.log(result.answer));
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 错误处理
|
||||||
|
|
||||||
|
| HTTP 状态码 | 说明 | 处理建议 |
|
||||||
|
|:-----------:|------|---------|
|
||||||
|
| 400 | 请求参数错误 | 检查请求体格式 |
|
||||||
|
| 401 | API Key 无效 | 检查 Authorization Header |
|
||||||
|
| 403 | 无权限访问 | 检查 API Key 权限配置 |
|
||||||
|
| 429 | 请求频率超限 | 添加请求间隔/重试机制 |
|
||||||
|
| 500 | 服务端内部错误 | 查看 Dify 服务日志 |
|
||||||
|
|
||||||
|
**建议的重试策略**:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import time
|
||||||
|
|
||||||
|
def chat_with_retry(query, max_retries=3, retry_delay=2):
|
||||||
|
for attempt in range(max_retries):
|
||||||
|
try:
|
||||||
|
return chat(query)
|
||||||
|
except requests.exceptions.Timeout:
|
||||||
|
if attempt == max_retries - 1:
|
||||||
|
raise
|
||||||
|
time.sleep(retry_delay * (attempt + 1))
|
||||||
|
except requests.exceptions.HTTPError as e:
|
||||||
|
if e.response.status_code == 429:
|
||||||
|
time.sleep(retry_delay * (attempt + 1))
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. API 速率限制
|
||||||
|
|
||||||
|
| 计划类型 | 限制 |
|
||||||
|
|----------|------|
|
||||||
|
| 自部署版 | 无官方限制,受服务器资源约束 |
|
||||||
|
| 建议配置 | 单用户 ≥ 60 次/分钟 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
_最后更新: 2026-06-06_
|
||||||
Reference in New Issue
Block a user