Dify二次开发-AI 应用端反馈指令接收(AI 应用端 → Dify)

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 定义指令校验模型,强制校验必填字段(如 commandTypesessionIdtalkId 等)的数据类型与格式,校验失败直接返回 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 处理标准答案添加);
  • 数据关联 : 通过 sessionIdtalkId 关联查询 Dify 本地的 conversationsmessagesmessage_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 后端已安装 requestspip install requests)、pydanticpip 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 应用端)
  1. 在 Dify WebApp 提交一条消息反馈;
  2. 查看 Dify 后端日志(logs/feedback_forward.log),确认转发请求是否触发及是否成功;
  3. 检查 AI 应用端是否接收到反馈数据,字段是否与报文规范一致。
2.2 反向指令测试(AI 应用端 → Dify)
  1. 通过 Postman 模拟 AI 应用端发送反馈指令,携带正确鉴权头;
  2. 查看 Dify 后端日志(logs/external_command.log),确认指令是否被正确处理;
  3. 查询 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 应用端传递的 sessionIdtalkId 与 Dify 数据库中的 conversations.idmessages.id 一致;2. 检查用户工号(userId)是否关联有效反馈记录
转发或指令处理频繁失败 网络抖动或 AI 应用端响应缓慢 1. 查看日志中的错误详情(如超时、连接拒绝);2. 优化网络环境或调整超时时间;3. 确认 AI 应用端服务是否正常运行

4. 监控告警配置

  • 日志监控 : 建议收集 Dify 后端 logs/feedback_forward.loglogs/external_command.log 日志,重点监控错误日志(含 ERROR 级别);
  • 告警阈值: 当 1 分钟内转发失败次数超过 5 次,或指令处理失败次数超过 3 次时,触发告警(如邮件、短信通知);
  • 健康检查: 定期调用 AI 应用端反馈接收接口和 Dify 外部指令接口,确认服务可用性。

欢迎评论私信讨论Dify相关的问题,需要源码私我

相关推荐
哟哟耶耶1 小时前
knowledge-scss学习
前端·学习·scss
坚定信念,勇往无前1 小时前
springboot +mongodb游标分页,性能好。前端存储游标历史
前端·spring boot·mongodb
南极星10051 小时前
OPENCV(python)--初学之路(十)
人工智能·python·opencv
Wise玩转AI1 小时前
AI智能体开发实战AutoGen篇(四)——会干活的导诊 Agent(Planner + Tools 实战)
人工智能·python·microsoft·ai智能体·autogen
却话巴山夜雨时i1 小时前
295. 数据流的中位数【困难】
java·服务器·前端
www7691 小时前
构建企业级代码知识图谱系统:从理论到实践
人工智能
AndrewHZ1 小时前
【复杂网络分析】复杂网络分析技术在图像处理中的经典算法与应用实践
图像处理·人工智能·算法·计算机视觉·图像分割·复杂网络·图论算法
云技纵横1 小时前
Vue无限滚动实战——从原理到企业级优化方案
前端