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
+53 -1
View File
@@ -37,4 +37,56 @@ config:
wxpay:
private-key-path: /www/wwwroot/tuanwei/cert/apiclient_key.pem
pub-key-path: /www/wwwroot/tuanwei/cert/44ad9c08a0ab46dd8fc555178df581c4.pem
# Dify 平台对接(生产走内网实例)
#
# 2026-09-19 由公网 82.156.98.71 切至内网 10.100.158.15。
# 切换依据:内网实例 8 个应用全部可用且知识库内容更全
# (竞赛案例 146 篇 / GXMU团章 10 篇,公网侧仅挑战杯 5 篇 / GXMU团章 9 篇)。
#
# 两个实例的应用 Key 与知识库 ID 完全不通用,不可混用:
# 公网 Key 打到内网、或反之,一律返回 401。
# 因此下面每一项都必须成对覆盖,漏掉一项就会因公网 Key 失效而报错。
#
# 内网的 6 个存量应用变量名与公网一致(已由 probe-dify.sh 两轮实测比对),
# 故此处只需覆盖地址与密钥,不必动 workflows 变量映射。
dify:
base-url: http://10.100.158.15/v1
apps:
# 1 医科大团委智能知识库问答系统
chat: app-ZLUUbLkAX3FVzDubY06puxAo
# 2 活动策划大纲生成
activity-outline: app-4oBWB3HrdNlANdPFG8ZvVTkY
# 3 医科大智能文档处理系统
document-process: app-ohdIhk0lVfUwoy10xXRebmjD
# 4 AI 内容创作与宣传助手
manuscript: app-fhhz4fXMkEdVivAEiuWpycn6
# 5 AI 创意助手
creative-assistant: app-lAbpxMggNbIrByiDRDfckSSl
# 6 项目书质量初审
project-quality-review: app-J6h5I6Bo4oeBif2EofBGVrGs
# 7 申报书生成
declaration: app-k20aDmiQYh3LxqZSLuX8wjkU
# 8 竞赛文件预处理
competition-history-preprocess: app-UzVLKnGwg69uAUdbgFx6XNmc
dataset:
# 内网两个知识库各自签发独立密钥,注意与上面的应用 Key 不同前缀(dataset-)
api-key: dataset-jaqtnAQvYcQTEjECzxhQfNCv
# 注意:YAML 的 map 是"按键合并"而非整体替换 —— application.yml 里登记的
# 公网库密钥不会因为这里重写了 keys 就消失,而是与本段合并。
# 因此这里把公网那两个 ID 也显式指到内网密钥,避免残留一条指向公网实例的死密钥
# (残留后表现为"某个知识库接口偶发 401",很难查)。
keys:
# 内网知识库
181d58e3-78c2-4b7d-939c-57e780a8f7d6: dataset-jaqtnAQvYcQTEjECzxhQfNCv
3e0ac108-3a0d-41e2-8447-aa1c1044d3ac: dataset-f2a0Hjxix7lBcPNZtNMyKDTQ
# 公网知识库 ID:生产下同样指到内网密钥,杜绝残留公网密钥
b342f096-98b1-4a83-a296-f4ab60a6db0e: dataset-jaqtnAQvYcQTEjECzxhQfNCv
aa72c649-71a0-46e7-ac55-47f44b397a4e: dataset-f2a0Hjxix7lBcPNZtNMyKDTQ
ids:
# 内网知识库(生产实际使用)
competition-cases: 181d58e3-78c2-4b7d-939c-57e780a8f7d6
gxmu-constitution-internal: 3e0ac108-3a0d-41e2-8447-aa1c1044d3ac
# 公网知识库 ID 保留登记,便于切回时对照;生产下不应被业务引用
challenge-cup: b342f096-98b1-4a83-a296-f4ab60a6db0e
gxmu-constitution: aa72c649-71a0-46e7-ac55-47f44b397a4e
+67
View File
@@ -103,6 +103,73 @@ wxpay:
mch-id: 1732930031
mch-serial-no: 7EE24C695B278DB2C4F0C1CB42069065ECCBE3FD
# Dify 平台对接
#
# 注意这里有两套环境,Key 与知识库 ID 互不通用(实测:文档给的 Key 打到 82.156.98.71 上全部 401):
# 1) 公网实例 http://82.156.98.71/v1 —— 当前线上在用的实例,下列默认值即取自它
# 2) 内网实例 http://10.100.158.15/v1 —— 见《Dify API 文档》,已由服务器实测 8 个应用全部 200
# 切到内网实例时,在 application-prod.yml 覆盖 base-url 与全部 apps/dataset 密钥即可。
# 不要直接改这里的默认值,否则本地开发会一起被切走。
dify:
base-url: http://82.156.98.71/v1
timeout-ms: 600000
apps:
# 医科大团委智能知识库问答系统
chat: app-ou0qPesouiopaPpmxcFV2gFG
# 活动策划大纲生成
activity-outline: app-hp4PJknbejImmdDuMfziVcnN
# AI 内容创作与宣传助手
manuscript: app-hCzkdd6OsnMnwI2dQByLyNIN
# AI 创意助手
creative-assistant: app-l3accBEJLDAh9Pn8fLW8nNJ0
# 项目书质量初审
project-quality-review: app-HiI2FrNjcwL0A7QOOf7GIP50
# 竞赛文件预处理
competition-history-preprocess: app-bhyQLMAw2JEDXMTs2mzNRiIU
# 医科大智能文档处理系统
# 公网实例上该 Key 无效(实测 401),仅内网实例可用,故允许环境变量覆盖
document-process: ${DIFY_KEY_DOCUMENT_PROCESS:app-ohdIhk0lVfUwoy10xXRebmjD}
# 申报书生成,同上
declaration: ${DIFY_KEY_DECLARATION:app-k20aDmiQYh3LxqZSLuX8wjkU}
dataset:
# 知识库列表等不区分知识库的接口所用密钥
api-key: ${DIFY_DATASET_API_KEY:dataset-1n6MECRtQvEVGOL1o7SrSGfe}
# 知识库 ID -> 独立密钥
keys:
b342f096-98b1-4a83-a296-f4ab60a6db0e: ${DIFY_DATASET_API_KEY:dataset-1n6MECRtQvEVGOL1o7SrSGfe}
aa72c649-71a0-46e7-ac55-47f44b397a4e: ${DIFY_DATASET_API_KEY:dataset-1n6MECRtQvEVGOL1o7SrSGfe}
# 内网实例的两个知识库各自签发独立密钥
181d58e3-78c2-4b7d-939c-57e780a8f7d6: ${DIFY_DATASET_KEY_COMPETITION:dataset-jaqtnAQvYcQTEjECzxhQfNCv}
3e0ac108-3a0d-41e2-8447-aa1c1044d3ac: ${DIFY_DATASET_KEY_GXMU:dataset-f2a0Hjxix7lBcPNZtNMyKDTQ}
# 业务代号 -> 知识库 ID
ids:
# 公网实例现用:挑战杯历史案例(5 篇)
challenge-cup: b342f096-98b1-4a83-a296-f4ab60a6db0e
gxmu-constitution: aa72c649-71a0-46e7-ac55-47f44b397a4e
# 内网实例:竞赛案例(146 篇)、GXMU 团章(10 篇)
competition-cases: 181d58e3-78c2-4b7d-939c-57e780a8f7d6
gxmu-constitution-internal: 3e0ac108-3a0d-41e2-8447-aa1c1044d3ac
# 工作流变量名映射。
# 左边是入参实体的业务字段(中划线),右边是 Dify 工作流开始节点的真实变量名。
#
# 下两段取自 2026-09-19 在内网实例上跑 probe-dify.sh 的实际输出,
# 注意它们与公网实例的命名习惯并不一致 —— 不要凭直觉推断,必须以探针输出为准。
workflows:
# 内网实测: query,pdf_url,pdf_file(文件类)
document-process:
fields:
query: query
pdf-url: pdf_url
pdf-file: pdf_file
# 内网实测: core_idea,tech_route,team_intro,upload_file(文件类),parse_value
declaration:
fields:
core-idea: core_idea
tech-route: tech_route
team-intro: team_intro
upload-file: upload_file
parse-value: parse_value
# 医科大开放平台对接
gxmu:
openplat: