Dify 配置外置并切至内网实例

接口地址与各应用 API Key 原先硬编码在 AiController 与
KnowledgeBaseController 中,换环境要改代码、密钥还会散落在多处。
新增 DifyProperties 统一收敛到 dify 配置节点,并补上文档中缺失的
两个应用与知识库管理接口。

- 新增 DifyProperties,外置 base-url / 8 个应用 Key / 知识库密钥,
  默认值保持公网实例,本地开发不受影响
- 生产 profile 覆盖为内网 10.100.158.15,含全部 8 个应用 Key 与
  两个知识库的独立密钥
- 新增申报书生成、智能文档处理两个工作流接口(含文件上传版本),
  接入既有的 WebSocket 流式推送与停止机制
- KnowledgeBaseController 补齐知识库增删改查、文档管理与索引进度,
  并对文档状态动作加白名单,避免路径参数被任意拼接
- 修正 AI 内容创作的 number 变量名:Dify 侧为 Number,
  变量名大小写敏感,此前一直发送小写导致该功能缺参
- 生产下显式覆盖公网知识库 ID 的密钥:YAML 的 map 按键合并而非整体
  替换,不覆盖会残留指向公网实例的死密钥

工作流变量名取自内网实例实测(probe-dify.sh),其中申报书生成与
文档处理两组变量与公网命名习惯不一致,故以配置映射承载,改名只需
改 yml 而非改代码。

新增 18 项测试,覆盖配置绑定、profile 覆盖完整性(逐项断言 8 个
Key 均已覆盖且不残留公网 Key)与入参到 Dify inputs 的映射。
This commit is contained in:
2026-09-21 19:46:49 +08:00
parent 3e2d7b65a6
commit 8c994d9ed2
11 changed files with 1465 additions and 132 deletions
@@ -0,0 +1,58 @@
package com.gxwebsoft.ai.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* 智能文档处理系统入参(对应「医科大智能文档处理系统」工作流)。
*
* <p>业务说明:对上传的 PDF 或网络文件进行解析、清洗、分段、关键词提取,
* 处理结果导入「GXMU 团章」知识库。因此文件来源有二:上传文件或网络 PDF 地址。
*
* <p><b>字段名对齐 Dify 工作流开始节点的真实变量名</b>,取自 2026-09-19
* 在内网实例 10.100.158.15 上跑 probe-dify.sh 的实测输出:
* {@code query, pdf_url, pdf_file(文件类)}。
*
* <p>发送时仍会经 {@code dify.workflows.document-process.fields} 映射一次,
* 保留这一层是为了让变量名再次变动时只改 yml、不改代码。
*
* @author Codex
* @since 2026-09-19
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "智能文档处理对象")
public class DocumentProcessInputs implements Serializable {
/**
* 处理指令或补充说明。对应 Dify 变量 query
*/
@TableField(exist = false)
private String query;
/**
* 网络 PDF 地址。对应 Dify 变量 pdf_url
*/
@TableField(exist = false)
private String pdfUrl;
/**
* 上传的 PDF 文件。对应 Dify 变量 pdf_file(文件类)。
*
* <p>由 {@code /api/ai/documentProcess/upload} 在服务端上传到 Dify 后填充;
* JSON 直调时也可传入 Dify 文件对象或 upload_file_id。
*/
@TableField(exist = false)
private Object pdfFile;
/**
* 直接指定 inputs,非空时优先于上面的业务字段。
*/
@TableField(exist = false)
private java.util.Map<String, Object> inputs;
}