1. 功能概述
支持 AI 应用端(Java 系统)主动向 Dify 推送反馈相关指令(如反馈处理状态更新、人工修正后的标准答案、反馈有效性校验结果等),Dify 后端接收并校验指令后,更新本地反馈数据状态或关联业务数据,实现双向数据闭环。
2. 代码实现细节
2.1 接收接口设计
- 文件路径 :
api/controllers/web/feedback.py - 接口路由 :
/api/v1/feedback/external/command - 请求方法: POST
- 实现逻辑: 作为 Dify 对外暴露的标准化接口,负责接收、校验、解析 AI 应用端指令,触发本地数据更新逻辑。
2.2 权限校验与数据校验
- 权限校验 : 复用第一部分的鉴权机制,要求 AI 应用端请求头携带
Authorization: difyAI-request-token,与 Dify 后端配置的密钥比对一致后,才允许继续处理; - 数据校验 : 采用
pydantic定义指令校验模型,强制校验必填字段(如commandType、sessionId、talkId等)的数据类型与格式,校验失败直接返回 400 错误响应:
python
运行
# 指令校验模型示例
class ExternalFeedbackCommand(BaseModel):
commandType: str # 指令类型(如 "update_status"、"add_correct_answer")
sessionId: str # 对话会话 ID(与 Dify conversations.id 一致)
talkId: str # 消息唯一 ID(与 Dify messages.id 一致)
userId: str # 用户工号(与 Dify end_users.session_id 一致)
data: dict # 指令详情数据(因指令类型不同而异)
timestamp: int # 指令发送时间戳(毫秒级)
2.3 指令处理与本地更新
- 指令分发 : 基于
commandType分发至对应处理函数(如_handle_update_status处理状态更新、_handle_add_correct_answer处理标准答案添加); - 数据关联 : 通过
sessionId和talkId关联查询 Dify 本地的conversations、messages、message_feedbacks表,确保指令指向有效数据; - 事务保障 : 所有本地数据更新操作(如
db.session.update())封装在事务中,执行完成后提交,失败则回滚,确保数据一致性; - 容错处理: 捕获数据关联失败、指令格式错误、数据库异常等问题,返回标准化错误响应(含错误码和描述),并记录详细日志。
python
运行
# 核心处理逻辑伪代码
@router.post("/api/v1/feedback/external/command")
def handle_external_feedback_command(command: ExternalFeedbackCommand):
# 1. 权限校验
auth_header = request.headers.get("Authorization")
if auth_header != "difyAI-request-token":
return jsonify({"code": 403, "msg": "Invalid authorization token"}), 403
try:
# 2. 数据关联查询
feedback = db.session.query(MessageFeedback).join(
Message, Message.id == MessageFeedback.message_id
).join(
Conversation, Conversation.id == Message.conversation_id
).filter(
Conversation.id == command.sessionId,
Message.id == command.talkId,
MessageFeedback.from_end_user_id == EndUser.id,
EndUser.session_id == command.userId
).first()
if not feedback:
return jsonify({"code": 404, "msg": "Feedback not found"}), 404
# 3. 指令分发处理
command_handlers = {
"update_status": _handle_update_status,
"add_correct_answer": _handle_add_correct_answer
}
if command.commandType not in command_handlers:
return jsonify({"code": 400, "msg": f"Unsupported command type: {command.commandType}"}), 400
command_handlers[command.commandType](feedback, command.data)
db.session.commit()
return jsonify({"code": 200, "msg": "Command processed successfully"}), 200
except Exception as e:
db.session.rollback()
logger.error(f"Process external feedback command failed: {str(e)}, command: {command.dict()}")
return jsonify({"code": 500, "msg": "Internal server error"}), 500
3. 接口报文规范
-
请求地址 :
https://dify-server-domain/api/v1/feedback/external/command -
请求方法: POST
-
Content-Type: application/json
-
请求头 : 必须包含
Authorization: difyAI-request-token -
请求体(Payload)示例 :
- 示例 1:更新反馈处理状态
json
{ "commandType": "update_status", "sessionId": "d733eec2-8e47-46db-9827-662222c3222d", "talkId": "1e7c5b17-b078-4988-8052-332222d4444f", "userId": "7480480", "data": { "status": "processed", // 处理状态(pending/processed/rejected) "processor": "admin_001", // 处理人账号 "processTime": "2025-11-27 14:30:00" // 处理时间(UTC+8) }, "timestamp": 1732686600000 }- 示例 2:添加人工修正标准答案
json
{ "commandType": "add_correct_answer", "sessionId": "d733eec2-8e47-46db-9827-662222c3222d", "talkId": "1e7c5b17-b078-4988-8052-332222d4444f", "userId": "7480480", "data": { "correctAnswer": "正确答案应为大米,小米的主要应用场景为煮粥而非主食替代。", // 人工修正答案 "remark": "用户反馈准确,已更新知识库对应条目" // 备注信息 }, "timestamp": 1732687200000 } -
响应格式 :
- 成功响应:
{"code": 200, "msg": "Command processed successfully"} - 错误响应:
{"code": 错误码, "msg": "错误描述"}(错误码:400 格式错误、403 权限不足、404 数据未找到、500 服务器异常)
- 成功响应:
第三部分:集成部署与运维保障
1. 环境配置要求
- Dify 版本: 要求 v0.10.0 及以上(需兼容自定义接口与数据模型扩展);
- 依赖安装 : 确保 Dify 后端已安装
requests(pip install requests)、pydantic(pip install pydantic)依赖库; - 时区配置 : 确认
app_factory.py中已设置os.environ['TZ'] = 'Asia/Shanghai',避免时区不一致导致的时间偏差; - 网络权限 : 允许 Dify 后端访问 AI 应用端反馈接收地址(
http://10.72.205.177:8085),同时开放 Dify 对外接口端口(如 8000)供 AI 应用端调用。
2. 测试验证方案
2.1 正向转发测试(Dify → AI 应用端)
- 在 Dify WebApp 提交一条消息反馈;
- 查看 Dify 后端日志(
logs/feedback_forward.log),确认转发请求是否触发及是否成功; - 检查 AI 应用端是否接收到反馈数据,字段是否与报文规范一致。
2.2 反向指令测试(AI 应用端 → Dify)
- 通过 Postman 模拟 AI 应用端发送反馈指令,携带正确鉴权头;
- 查看 Dify 后端日志(
logs/external_command.log),确认指令是否被正确处理; - 查询 Dify 数据库
message_feedbacks表,验证相关字段是否按指令更新。
3. 问题排查指南
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| Dify 反馈未转发至 AI 应用端 | 1. 未触发转发条件(如用户类型非 EndUser);2. 网络不通;3. AI 应用端地址配置错误 | 1. 查看 Dify 日志,确认是否进入转发逻辑;2. 测试 Dify 服务器与 AI 应用端的网络连通性;3. 核对 _forward_feedback_to_external_system 中的目标地址 |
| AI 应用端指令提交返回 403 | 鉴权头缺失或密钥不匹配 | 1. 检查请求头是否包含 Authorization: difyAI-request-token;2. 核对 Dify 后端与 AI 应用端的密钥配置 |
| 指令处理返回 404 | sessionId 或 talkId 不存在 | 1. 确认 AI 应用端传递的 sessionId、talkId 与 Dify 数据库中的 conversations.id、messages.id 一致;2. 检查用户工号(userId)是否关联有效反馈记录 |
| 转发或指令处理频繁失败 | 网络抖动或 AI 应用端响应缓慢 | 1. 查看日志中的错误详情(如超时、连接拒绝);2. 优化网络环境或调整超时时间;3. 确认 AI 应用端服务是否正常运行 |
4. 监控告警配置
- 日志监控 : 建议收集 Dify 后端
logs/feedback_forward.log和logs/external_command.log日志,重点监控错误日志(含ERROR级别); - 告警阈值: 当 1 分钟内转发失败次数超过 5 次,或指令处理失败次数超过 3 次时,触发告警(如邮件、短信通知);
- 健康检查: 定期调用 AI 应用端反馈接收接口和 Dify 外部指令接口,确认服务可用性。
欢迎评论私信讨论Dify相关的问题,需要源码私我