mirror of
https://gitcode.com/ageerle/ruoyi-ai.git
synced 2026-09-13 08:25:00 +00:00
Merge upstream/main into feature/common-trace-rag-chat
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -45,6 +45,7 @@ nbdist/
|
|||||||
*.xml.versionsBackup
|
*.xml.versionsBackup
|
||||||
*.swp
|
*.swp
|
||||||
data/
|
data/
|
||||||
|
logs/
|
||||||
|
|
||||||
!*/build/*.java
|
!*/build/*.java
|
||||||
!*/build/*.html
|
!*/build/*.html
|
||||||
@@ -52,3 +53,4 @@ data/
|
|||||||
|
|
||||||
.flattened-pom.xml
|
.flattened-pom.xml
|
||||||
/.claude/settings.local.json
|
/.claude/settings.local.json
|
||||||
|
/docs/docker/milvus/volumes/
|
||||||
|
|||||||
64
RAG_TEST_REPORT_2026-07-20.md
Normal file
64
RAG_TEST_REPORT_2026-07-20.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# RAG 完整修复与全量验收报告
|
||||||
|
|
||||||
|
验收时间:2026-07-21(Asia/Shanghai)
|
||||||
|
验收对象:当前未提交工作区(保留原有改动)
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
|
||||||
|
计划内的 1–15 项工程缺陷已完成代码修复,默认 Maven 构建已从“跳过测试”改为真实执行测试。全仓 37 个 reactor 模块测试成功,`ruoyi-chat` 49/49 通过,两个前端生产构建通过,`git diff --check` 通过。
|
||||||
|
|
||||||
|
本机已运行 MySQL、Redis、MinIO 和 Weaviate 1.30.0;Milvus/Qdrant 容器以及有效的 embedding/chat/rerank provider 凭证不存在,因此这三项真实 provider/存储引擎冒烟被标记为环境限制,不影响确定性代码验收。
|
||||||
|
|
||||||
|
## 1–15 项验收
|
||||||
|
|
||||||
|
| # | 状态 | 修复/证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| 1 | 通过 | Markdown/Java/字符分片的边界、空文档、超长块回归通过。 |
|
||||||
|
| 2 | 通过 | Supervisor 每轮仅保留一个 RAG 入口,不再用已含 RAG 的 prompt 重复检索。 |
|
||||||
|
| 3 | 通过 | 历史消息进入 Supervisor prompt,检索 query 与最终 prompt 分离。 |
|
||||||
|
| 4 | 通过 | `fid` 稳定 ID 贯穿 DB/三种向量库/RRF,融合去重回归通过。 |
|
||||||
|
| 5 | 通过 | aiflow vector/hybrid 复用统一检索服务;graph 明确返回不支持,不再伪装为 vector。 |
|
||||||
|
| 6 | 通过 | 重解析改为先写新 fid、再清旧向量、最后替换 DB;失败补偿新向量;删片段/附件/库遇向量删除失败即中止。 |
|
||||||
|
| 7 | 通过 | embedding/rerank provider 使用 prototype 实例,工厂缓存可按模型刷新,避免跨配置污染。 |
|
||||||
|
| 8 | 通过 | `similarityThreshold` 仅用于粗召回;`rerankScoreThreshold` 仅在 rerank 真实成功后生效,回归测试通过。 |
|
||||||
|
| 9 | 通过 | 默认配置和 Compose 统一为 Weaviate 1.30.0、`28080:8080`。 |
|
||||||
|
| 10 | 通过 | 三种策略均使用 `embedAll`;Weaviate batch objects、Milvus `addAll`、Qdrant `addAll`。 |
|
||||||
|
| 11 | 通过 | upload/parse/retrieval 权限保留,parse/retrieval 增加分布式防重复提交,upload 由现有知识库+文件名唯一约束兜底。 |
|
||||||
|
| 12 | 通过 | 分隔符使用字面量语义,`|`/`.`/`*` 回归通过。 |
|
||||||
|
| 13 | 通过 | hybrid 通道失败可降级到 vector;所有可用通道都失败时抛出明确业务异常。 |
|
||||||
|
| 14 | 通过 | Weaviate client 稳定懒加载单例;schema 仅在已存在或创建成功后进入缓存。 |
|
||||||
|
| 15 | 通过 | 工厂新增严格 `getStrategy(type)`,知识库 `vectorModel` 优先,空值才回退全局,非法值直接报错。 |
|
||||||
|
|
||||||
|
## 其他完成项
|
||||||
|
|
||||||
|
- 多知识库并行检索,按 `kid + docId + fid` 去重,统一上限和字符预算。
|
||||||
|
- 5 分钟短 TTL 检索缓存,key 覆盖检索参数,知识数据变更主动失效。
|
||||||
|
- rerank 仅保留 provider 实际返回的文档。
|
||||||
|
- 知识库文档数改为 group-by 查询,消除该 N+1。
|
||||||
|
- Milvus/Qdrant/Weaviate 的删 collection/doc/fid 语义对齐;Milvus 删库改为 drop collection。
|
||||||
|
- MCP `npx` 根据操作系统解析,支持系统属性/环境变量覆盖。
|
||||||
|
- `fid` 非空唯一、`doc_id varchar(32)`、租户/用户索引与可重复执行迁移脚本已提供。
|
||||||
|
- 用户端聊天页已接入知识库列表和最小选择器。
|
||||||
|
|
||||||
|
## 测试记录
|
||||||
|
|
||||||
|
| 检查 | 结果 |
|
||||||
|
|---|---|
|
||||||
|
| `mvn -Pdev test` | 37/37 reactor 模块 SUCCESS;`ruoyi-chat` 49/49 |
|
||||||
|
| `mvn -Pdev -pl ruoyi-modules/ruoyi-aiflow -am -DskipTests compile` | 21/21 SUCCESS |
|
||||||
|
| `ruoyi-web: pnpm build` | SUCCESS,2621 modules transformed |
|
||||||
|
| `ruoyi-admin: pnpm build` | SUCCESS,10/10 build tasks |
|
||||||
|
| `git diff --check` | SUCCESS,无空白错误 |
|
||||||
|
| Weaviate/MySQL/Redis/MinIO | Docker 服务运行,Weaviate 1.30.0 映射 28080 |
|
||||||
|
| 三向量库 Docker 集成 | SUCCESS;Weaviate 1.30.0、Milvus 2.5.7、Qdrant 1.17.0 真实写入/检索/删除测试 3/3 通过 |
|
||||||
|
| 真实 embedding/chat/rerank | 环境限制:当前配置为无效/占位凭证 |
|
||||||
|
|
||||||
|
本轮未创建新的 `codex_rag_verify_` 持久化数据;上一轮验收数据已清理,未动现有非测试数据。
|
||||||
|
|
||||||
|
## 2026-07-21 三向量库 Docker 补充验收
|
||||||
|
|
||||||
|
- 启动并保留 `ruoyi-rag-milvus`、`ruoyi-rag-milvus-etcd`、`ruoyi-rag-milvus-minio`、`ruoyi-rag-qdrant`,四个容器健康检查均为 `healthy`。
|
||||||
|
- Milvus 专用 MinIO 仅在 Docker 内网可达,没有占用宿主机 9000/9001;Milvus 映射 19530/9091,Qdrant 映射 6333/6334。
|
||||||
|
- `ThreeVectorStoresDockerIT` 使用 32 维确定性 embedding,对三库逐一验证 batch write、vector search、fid delete、docId delete 和 drop collection,3/3 通过。
|
||||||
|
- 首轮测试发现 Milvus `autoFlush=false` 导致批量写入后不可立即检索、元数据删除不可立即见;改为写入和删除返回前 flush 后通过。
|
||||||
|
- 清理后 Weaviate/Qdrant 的 `CodexRagVerify*` collection 计数均为 0,Milvus collection 也由测试 finally 成功 drop;本轮未写入 MySQL 或 OSS 测试数据。
|
||||||
15
README.md
15
README.md
@@ -30,12 +30,12 @@
|
|||||||
## ✨ 核心亮点
|
## ✨ 核心亮点
|
||||||
|
|
||||||
| 模块 | 现有能力
|
| 模块 | 现有能力
|
||||||
|:----------:|---
|
|:---------:|---
|
||||||
| **模型管理** | 多模型接入(OpenAI/DeepSeek/通义/智谱/MiniMax)、多模态理解、Coze/DIFY/FastGPT平台集成
|
| **模型管理** | 多模型接入(DeepSeek/智谱/MIMO/百炼/OpenAI)、多模态理解、Coze/DIFY/FastGPT/RAGFlow平台集成
|
||||||
| **知识管理** | 本地RAG + 向量库(Milvus/Weaviate/Qdrant) + 文档解析
|
| **知识管理** | 本地RAG + 向量库(Milvus/Weaviate/Qdrant) + 文档解析
|
||||||
| **工具管理** | Mcp协议集成、Skills能力 + 可扩展工具生态
|
| **工具管理** | Mcp协议集成、Skills能力 + 可扩展工具生态
|
||||||
| **流程编排** | 可视化工作流设计器、节点拖拽编排、SSE流式执行,目前已经支持模型调用,邮件发送,人工审核等节点
|
| **流程编排** | 可视化工作流设计器、节点拖拽编排、SSE流式执行,目前已经支持模型调用,邮件发送,人工审核等节点
|
||||||
| **多智能体** | 基于Langchain4j的Agent框架、Supervisor模式编排,支持多种决策模型
|
| **智能体管理** | 基于Langchain4j的Agent框架、Supervisor模式编排,支持多种决策模型,可以灵活搭配工具,skills
|
||||||
|
|
||||||
|
|
||||||
### 项目源码
|
### 项目源码
|
||||||
@@ -45,6 +45,9 @@
|
|||||||
| 🔧 后端服务 | [ruoyi-ai](https://github.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitee.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitcode.com/ageerle/ruoyi-ai) |
|
| 🔧 后端服务 | [ruoyi-ai](https://github.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitee.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitcode.com/ageerle/ruoyi-ai) |
|
||||||
| 🎨 用户前端 | [ruoyi-web](https://github.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitee.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitcode.com/ageerle/ruoyi-web) |
|
| 🎨 用户前端 | [ruoyi-web](https://github.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitee.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitcode.com/ageerle/ruoyi-web) |
|
||||||
| 🛠️ 管理后台 | [ruoyi-admin](https://github.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitee.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitcode.com/ageerle/ruoyi-admin) |
|
| 🛠️ 管理后台 | [ruoyi-admin](https://github.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitee.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitcode.com/ageerle/ruoyi-admin) |
|
||||||
|
| 🎬 短剧平台 | [ruoyi-drama](https://github.com/ageerle/ruoyi-drama) | [ruoyi-drama](https://gitee.com/ageerle/ruoyi-drama) | [ruoyi-drama](https://gitcode.com/ageerle/ruoyi-drama) |
|
||||||
|
| 🤖 编程助手 | [ruoyi-copilot](https://github.com/ageerle/ruoyi-copilot) | [ruoyi-copilot](https://gitee.com/ageerle/ruoyi-copilot) | [ruoyi-copilot](https://gitcode.com/ageerle/ruoyi-copilot) |
|
||||||
|
| 📱 小程序端 | [ruoyi-uniapp](https://github.com/ageerle/ruoyi-uniapp) | [ruoyi-uniapp](https://gitee.com/ageerle/ruoyi-uniapp) | [ruoyi-uniapp](https://gitcode.com/ageerle/ruoyi-uniapp) |
|
||||||
|
|
||||||
### 合作项目
|
### 合作项目
|
||||||
| 项目名称 | GitHub 仓库 | Gitee 仓库
|
| 项目名称 | GitHub 仓库 | Gitee 仓库
|
||||||
@@ -213,15 +216,15 @@ docker-compose -f docker-compose-all.yaml restart [服务名]
|
|||||||
<img src="docs/image/sponsor/atlascloud_banner.png" alt="Atlas Cloud" width="160" height="80">
|
<img src="docs/image/sponsor/atlascloud_banner.png" alt="Atlas Cloud" width="160" height="80">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
[访问Atlas Cloud官网](https://www.atlascloud.ai?ref=89F97E) · [编程计划优惠](https://www.atlascloud.ai/console/coding-plan)
|
[访问Atlas Cloud官网](https://www.atlascloud.ai?ref=89F97E&utm_source=github&utm_campaign=ruoyi-drama) · [编程计划优惠](https://www.atlascloud.ai/console/coding-plan)
|
||||||
全模态 AI 推理平台,为开发者提供统一的 AI API,支持视频生成、图像生成和大语言模型。一次接入,即可访问 **300+ 精选模型**。
|
全模态 AI 推理平台,为开发者提供统一的 AI API,支持视频生成、图像生成和大语言模型。一次接入,即可访问 **300+ 精选模型**。
|
||||||
|
|
||||||
<a href="https://www.volcengine.com/activity/codingplan?utm_campaign=hw&utm_content=hw&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=ageerle-ruoyi-ai">
|
<a href="https://www.volcengine.com/activity/codingplan?utm_campaign=hw&utm_content=hw&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=ageerle-ruoyi-ai">
|
||||||
<img src="docs/image/sponsor/huoshan.png" alt="火山引擎 CodingPlan" width="160" height="80">
|
<img src="docs/image/sponsor/huoshan.png" alt="火山引擎 CodingPlan" width="160" height="80">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
[火山引擎 CodingPlan 开发者计划](https://www.volcengine.com/activity/codingplan?utm_campaign=hw&utm_content=hw&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=ageerle-ruoyi-ai)
|
[注册即领2500万Tokens,立即前往](https://www.volcengine.com/activity/ai618?utm_campaign=hw&utm_content=hw&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=ageerle-ruoyi-ai)
|
||||||
火山引擎是字节跳动旗下的云与 AI 服务平台,火山方舟提供豆包大模型、DeepSeek 等多种模型的 API 接入,为开发者提供一站式 AI 开发与推理服务。
|
享字节自研豆包模型+满血版开源 SOTA模型,覆盖文本、VLM、图像生成,全模态一站配齐:Seed-2.1、Seedream-5.0、GLM-5.2、DeepSeek等。不止编程、更能解决 Agent 复杂长程任务!
|
||||||
|
|
||||||
|
|
||||||
## 💬 社区交流
|
## 💬 社区交流
|
||||||
|
|||||||
31
README_EN.md
31
README_EN.md
@@ -47,6 +47,9 @@
|
|||||||
| 🔧 Backend | [ruoyi-ai](https://github.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitee.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitcode.com/ageerle/ruoyi-ai) |
|
| 🔧 Backend | [ruoyi-ai](https://github.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitee.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitcode.com/ageerle/ruoyi-ai) |
|
||||||
| 🎨 User Frontend | [ruoyi-web](https://github.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitee.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitcode.com/ageerle/ruoyi-web) |
|
| 🎨 User Frontend | [ruoyi-web](https://github.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitee.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitcode.com/ageerle/ruoyi-web) |
|
||||||
| 🛠️ Admin Panel | [ruoyi-admin](https://github.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitee.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitcode.com/ageerle/ruoyi-admin) |
|
| 🛠️ Admin Panel | [ruoyi-admin](https://github.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitee.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitcode.com/ageerle/ruoyi-admin) |
|
||||||
|
| 🎬 Drama | [ruoyi-drama](https://github.com/ageerle/ruoyi-drama) | [ruoyi-drama](https://gitee.com/ageerle/ruoyi-drama) | |
|
||||||
|
| 🤖 Copilot | [ruoyi-copilot](https://github.com/ageerle/ruoyi-copilot) | [ruoyi-copilot](https://gitee.com/ageerle/ruoyi-copilot) | [ruoyi-copilot](https://gitcode.com/ageerle/ruoyi-copilot) |
|
||||||
|
| 📱 Mini-App | [ruoyi-uniapp](https://github.com/ageerle/ruoyi-uniapp) | [ruoyi-uniapp](https://gitee.com/ageerle/ruoyi-uniapp) | [ruoyi-uniapp](https://gitcode.com/ageerle/ruoyi-uniapp) |
|
||||||
|
|
||||||
### Partner Projects
|
### Partner Projects
|
||||||
| Project Name | GitHub Repository | Gitee Repository |
|
| Project Name | GitHub Repository | Gitee Repository |
|
||||||
@@ -175,6 +178,34 @@ docker-compose -f docker-compose-all.yaml logs -f [service-name]
|
|||||||
docker-compose -f docker-compose-all.yaml restart [service-name]
|
docker-compose -f docker-compose-all.yaml restart [service-name]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### MiniMax Configuration
|
||||||
|
|
||||||
|
The built-in MiniMax provider accepts one API Host value and selects the matching protocol adapter. Use a Base URL from this table:
|
||||||
|
|
||||||
|
| Region | OpenAI-compatible Base URL | Anthropic-compatible Base URL |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Global | `https://api.minimax.io/v1` | `https://api.minimax.io/anthropic` |
|
||||||
|
| China | `https://api.minimaxi.com/v1` | `https://api.minimaxi.com/anthropic` |
|
||||||
|
|
||||||
|
For Anthropic-compatible requests, configure the Base URL ending in `/anthropic`. Do not append `/v1` or `/v1/messages`; the provider adapter derives the request path internally.
|
||||||
|
|
||||||
|
| Model ID | Total context | Input modalities | Thinking |
|
||||||
|
| --- | ---: | --- | --- |
|
||||||
|
| `MiniMax-M3` | 1,000,000 tokens | Text, image, video | Adaptive or disabled |
|
||||||
|
| `MiniMax-M2.7` | 204,800 tokens | Text | Always on |
|
||||||
|
|
||||||
|
Current pay-as-you-go prices are in USD per million tokens:
|
||||||
|
|
||||||
|
| Model | Service tier and input range | Input | Output | Cache read | Cache write |
|
||||||
|
| --- | --- | ---: | ---: | ---: | ---: |
|
||||||
|
| `MiniMax-M3` | Standard, up to 512,000 input tokens | $0.30 | $1.20 | $0.06 | Not listed |
|
||||||
|
| `MiniMax-M3` | Standard, over 512,000 input tokens | $0.60 | $2.40 | $0.12 | Not listed |
|
||||||
|
| `MiniMax-M3` | Priority, up to 512,000 input tokens | $0.45 | $1.80 | $0.09 | Not listed |
|
||||||
|
| `MiniMax-M3` | Priority, over 512,000 input tokens | $0.90 | $3.60 | $0.18 | Not listed |
|
||||||
|
| `MiniMax-M2.7` | Standard | $0.30 | $1.20 | $0.06 | $0.375 |
|
||||||
|
|
||||||
|
See the [official API overview](https://platform.minimax.io/docs/api-reference/api-overview) and [pay-as-you-go pricing](https://platform.minimax.io/docs/guides/pricing-paygo) for current details.
|
||||||
|
|
||||||
## 📚 Documentation
|
## 📚 Documentation
|
||||||
|
|
||||||
Want to learn more about installation, deployment, configuration, and secondary development?
|
Want to learn more about installation, deployment, configuration, and secondary development?
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
version: '3.5'
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
etcd:
|
etcd:
|
||||||
container_name: milvus-etcd
|
container_name: ruoyi-rag-milvus-etcd
|
||||||
image: quay.io/coreos/etcd:v3.5.18
|
image: quay.io/coreos/etcd:v3.5.18
|
||||||
environment:
|
environment:
|
||||||
- ETCD_AUTO_COMPACTION_MODE=revision
|
- ETCD_AUTO_COMPACTION_MODE=revision
|
||||||
@@ -19,14 +17,11 @@ services:
|
|||||||
retries: 3
|
retries: 3
|
||||||
|
|
||||||
minio:
|
minio:
|
||||||
container_name: milvus-minio
|
container_name: ruoyi-rag-milvus-minio
|
||||||
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
|
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
|
||||||
environment:
|
environment:
|
||||||
MINIO_ACCESS_KEY: minioadmin
|
MINIO_ACCESS_KEY: minioadmin
|
||||||
MINIO_SECRET_KEY: minioadmin
|
MINIO_SECRET_KEY: minioadmin
|
||||||
ports:
|
|
||||||
- "9001:9001"
|
|
||||||
- "9000:9000"
|
|
||||||
volumes:
|
volumes:
|
||||||
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
|
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
|
||||||
command: minio server /minio_data --console-address ":9001"
|
command: minio server /minio_data --console-address ":9001"
|
||||||
@@ -37,7 +32,7 @@ services:
|
|||||||
retries: 3
|
retries: 3
|
||||||
|
|
||||||
standalone:
|
standalone:
|
||||||
container_name: milvus-standalone
|
container_name: ruoyi-rag-milvus
|
||||||
image: milvusdb/milvus:v2.5.7
|
image: milvusdb/milvus:v2.5.7
|
||||||
command: ["milvus", "run", "standalone"]
|
command: ["milvus", "run", "standalone"]
|
||||||
security_opt:
|
security_opt:
|
||||||
@@ -61,7 +56,7 @@ services:
|
|||||||
- "minio"
|
- "minio"
|
||||||
|
|
||||||
attu:
|
attu:
|
||||||
container_name: attu
|
container_name: ruoyi-rag-attu
|
||||||
image: zilliz/attu:v2.5.7
|
image: zilliz/attu:v2.5.7
|
||||||
environment:
|
environment:
|
||||||
MILVUS_URL: milvus-standalone:19530
|
MILVUS_URL: milvus-standalone:19530
|
||||||
@@ -72,4 +67,4 @@ services:
|
|||||||
|
|
||||||
networks:
|
networks:
|
||||||
default:
|
default:
|
||||||
name: milvus
|
name: ruoyi-rag-milvus
|
||||||
|
|||||||
@@ -1,12 +1,20 @@
|
|||||||
---
|
---
|
||||||
services:
|
services:
|
||||||
qdrant:
|
qdrant:
|
||||||
image: qdrant/qdrant:latest
|
container_name: ruoyi-rag-qdrant
|
||||||
|
image: qdrant/qdrant:v1.17.0
|
||||||
ports:
|
ports:
|
||||||
- 6333:6333
|
- 6333:6333
|
||||||
- 6334:6334
|
- 6334:6334
|
||||||
volumes:
|
volumes:
|
||||||
- qdrant_data:/qdrant/storage
|
- qdrant_data:/qdrant/storage
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "bash -c 'exec 3<>/dev/tcp/127.0.0.1/6333 && printf \"GET /healthz HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n\" >&3 && grep -q \"200 OK\" <&3'"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 12
|
||||||
|
start_period: 10s
|
||||||
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
qdrant_data:
|
qdrant_data:
|
||||||
...
|
...
|
||||||
|
|||||||
@@ -20,6 +20,22 @@ RUN mvn clean package -Pprod -DskipTests
|
|||||||
# 最终运行镜像
|
# 最终运行镜像
|
||||||
FROM eclipse-temurin:17-jre-alpine
|
FROM eclipse-temurin:17-jre-alpine
|
||||||
|
|
||||||
|
RUN set -eux; \
|
||||||
|
apk add --no-cache ffmpeg; \
|
||||||
|
for filter in scale pad fps setsar format tpad trim settb setpts xfade \
|
||||||
|
aresample aformat apad atrim asetpts anullsrc concat acrossfade; do \
|
||||||
|
ffmpeg -hide_banner -filters 2>/dev/null | grep -Eq "[[:space:]]${filter}[[:space:]]"; \
|
||||||
|
done; \
|
||||||
|
ffmpeg -hide_banner -h filter=xfade 2>&1 | grep -q dissolve; \
|
||||||
|
ffmpeg -hide_banner -h filter=xfade 2>&1 | grep -q fadeblack; \
|
||||||
|
ffmpeg -hide_banner -h filter=xfade 2>&1 | grep -q slideleft; \
|
||||||
|
ffmpeg -hide_banner -encoders 2>/dev/null | grep -Eq '[[:space:]]libx264[[:space:]]'; \
|
||||||
|
ffmpeg -hide_banner -encoders 2>/dev/null | grep -Eq '[[:space:]]aac[[:space:]]'; \
|
||||||
|
ffprobe -hide_banner -version >/dev/null
|
||||||
|
|
||||||
|
ENV FFMPEG_PATH=/usr/bin/ffmpeg \
|
||||||
|
FFPROBE_PATH=/usr/bin/ffprobe
|
||||||
|
|
||||||
# 设置工作目录
|
# 设置工作目录
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
@@ -27,10 +43,10 @@ WORKDIR /app
|
|||||||
COPY --from=builder /build/ruoyi-admin/target/ruoyi-admin.jar ./ruoyi-admin.jar
|
COPY --from=builder /build/ruoyi-admin/target/ruoyi-admin.jar ./ruoyi-admin.jar
|
||||||
|
|
||||||
# 创建日志目录
|
# 创建日志目录
|
||||||
RUN mkdir -p /ruoyi/server/logs
|
RUN mkdir -p /ruoyi/server/logs /ruoyi/server/temp
|
||||||
|
|
||||||
# 暴露端口
|
# 暴露端口
|
||||||
EXPOSE 6039
|
EXPOSE 6039
|
||||||
|
|
||||||
# 启动命令
|
# 启动命令
|
||||||
ENTRYPOINT ["java", "-jar", "ruoyi-admin.jar", "--spring.profiles.active=prod"]
|
ENTRYPOINT ["java", "-Djava.io.tmpdir=/ruoyi/server/temp", "-jar", "ruoyi-admin.jar", "--spring.profiles.active=prod"]
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
# 基于官方MySQL 8.0镜像构建自定义镜像
|
# 基于官方MySQL 8.0镜像构建自定义镜像
|
||||||
# 构建命令: docker build -t registry.cn-hangzhou.aliyuncs.com/ruoyi-ai/mysql:v3 -f Dockerfile.mysql .
|
# 构建命令: docker build -t registry.cn-hangzhou.aliyuncs.com/ruoyi-ai/mysql:v3 -f Dockerfile.mysql .
|
||||||
FROM mysql:8.0.33
|
FROM mysql:8.0
|
||||||
|
|
||||||
# 设置时区
|
# 设置时区
|
||||||
ENV TZ=Asia/Shanghai
|
ENV TZ=Asia/Shanghai
|
||||||
|
|
||||||
# 复制初始化脚本和SQL文件到镜像中
|
# MySQL 官方入口会按文件名顺序执行初始化目录中的 SQL。
|
||||||
COPY docs/script/docker/mysql/init/init-db.sh /docker-entrypoint-initdb.d/init-db.sh
|
# ruoyi-ai.sql 会导入 MYSQL_DATABASE,snail_job_mysql.sql 会自行创建并切换数据库。
|
||||||
COPY docs/script/sql/ruoyi-ai-v3_mysql8.sql /docker-entrypoint-initdb.d/ruoyi-ai-v3_mysql8.sql
|
COPY docs/script/sql/ruoyi-ai.sql /docker-entrypoint-initdb.d/01-ruoyi-ai.sql
|
||||||
|
COPY docs/script/sql/snail_job_mysql.sql /docker-entrypoint-initdb.d/02-snail-job.sql
|
||||||
# 设置脚本可执行权限
|
|
||||||
RUN chmod +x /docker-entrypoint-initdb.d/init-db.sh
|
|
||||||
|
|
||||||
# MySQL启动参数
|
# MySQL启动参数
|
||||||
CMD ["--default-authentication-plugin=mysql_native_password", \
|
CMD ["--default-authentication-plugin=mysql_native_password", \
|
||||||
|
|||||||
@@ -12,8 +12,6 @@
|
|||||||
#
|
#
|
||||||
# 镜像仓库地址: crpi-31mraxd99y2gqdgr.cn-beijing.personal.cr.aliyuncs.com/ruoyi_ai
|
# 镜像仓库地址: crpi-31mraxd99y2gqdgr.cn-beijing.personal.cr.aliyuncs.com/ruoyi_ai
|
||||||
|
|
||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# ==================== MySQL 数据库 ====================
|
# ==================== MySQL 数据库 ====================
|
||||||
mysql:
|
mysql:
|
||||||
@@ -30,7 +28,10 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- mysql-data:/var/lib/mysql
|
- mysql-data:/var/lib/mysql
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"]
|
# Force TCP: during first-time initialization MySQL exposes a temporary
|
||||||
|
# socket-only server. A socket ping would mark the service healthy before
|
||||||
|
# the real network listener (used by the backend) is ready.
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "--protocol=tcp", "-h", "127.0.0.1", "-u", "root", "-proot"]
|
||||||
interval: 15s
|
interval: 15s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 10
|
retries: 10
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ services:
|
|||||||
MYSQL_DATABASE: ruoyi-ai-agent
|
MYSQL_DATABASE: ruoyi-ai-agent
|
||||||
TZ: Asia/Shanghai
|
TZ: Asia/Shanghai
|
||||||
volumes:
|
volumes:
|
||||||
- ./docs/script/docker/mysql/init/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro
|
- ../../script/sql/ruoyi-ai.sql:/docker-entrypoint-initdb.d/01-ruoyi-ai.sql:ro
|
||||||
- ./docs/script/sql/ruoyi-ai-v3_mysql8.sql:/docker-entrypoint-initdb.d/ruoyi-ai-v3_mysql8.sql:ro
|
- ../../script/sql/snail_job_mysql.sql:/docker-entrypoint-initdb.d/02-snail-job.sql:ro
|
||||||
- mysql-data:/var/lib/mysql
|
- mysql-data:/var/lib/mysql
|
||||||
command:
|
command:
|
||||||
--default-authentication-plugin=mysql_native_password
|
--default-authentication-plugin=mysql_native_password
|
||||||
@@ -32,7 +32,9 @@ services:
|
|||||||
--lower_case_table_names=1
|
--lower_case_table_names=1
|
||||||
--skip-ssl
|
--skip-ssl
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"]
|
# Do not let the socket-only initialization server satisfy the check.
|
||||||
|
# The backend connects over TCP and must wait for that listener.
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "--protocol=tcp", "-h", "127.0.0.1", "-u", "root", "-proot"]
|
||||||
interval: 15s
|
interval: 15s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 10
|
retries: 10
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ services:
|
|||||||
- --host
|
- --host
|
||||||
- 0.0.0.0
|
- 0.0.0.0
|
||||||
- --port
|
- --port
|
||||||
- '6038'
|
- '8080'
|
||||||
- --scheme
|
- --scheme
|
||||||
- http
|
- http
|
||||||
image: semitechnologies/weaviate:1.19.7
|
image: semitechnologies/weaviate:1.30.0
|
||||||
ports:
|
ports:
|
||||||
- 6038:6038
|
- 28080:8080
|
||||||
- 50051:50051
|
- 50051:50051
|
||||||
volumes:
|
volumes:
|
||||||
- weaviate_data:/var/lib/weaviate
|
- weaviate_data:/var/lib/weaviate
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 112 KiB |
@@ -1,10 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 数据库初始化脚本
|
|
||||||
# 使用 --force 参数确保即使出错也继续执行
|
|
||||||
|
|
||||||
echo "开始初始化数据库..."
|
|
||||||
|
|
||||||
# 使用 --force 参数忽略错误继续执行
|
|
||||||
mysql -uroot -proot ruoyi-ai-agent --force < /docker-entrypoint-initdb.d/ruoyi-ai-v3_mysql8.sql
|
|
||||||
|
|
||||||
echo "数据库初始化完成"
|
|
||||||
86
docs/script/install-ffmpeg-windows.ps1
Normal file
86
docs/script/install-ffmpeg-windows.ps1
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
function Find-Executable([string]$Name) {
|
||||||
|
$command = Get-Command $Name -ErrorAction SilentlyContinue
|
||||||
|
if ($command) {
|
||||||
|
return $command.Source
|
||||||
|
}
|
||||||
|
|
||||||
|
$roots = @(
|
||||||
|
(Join-Path $env:LOCALAPPDATA 'Microsoft\WinGet\Packages'),
|
||||||
|
(Join-Path $env:USERPROFILE 'scoop\apps\ffmpeg'),
|
||||||
|
'C:\ProgramData\chocolatey\bin',
|
||||||
|
'C:\ffmpeg'
|
||||||
|
)
|
||||||
|
foreach ($root in $roots) {
|
||||||
|
if (-not (Test-Path $root)) { continue }
|
||||||
|
$match = Get-ChildItem -Path $root -Filter "$Name.exe" -Recurse -ErrorAction SilentlyContinue |
|
||||||
|
Select-Object -First 1 -ExpandProperty FullName
|
||||||
|
if ($match) { return $match }
|
||||||
|
}
|
||||||
|
return $null
|
||||||
|
}
|
||||||
|
|
||||||
|
$ffmpeg = Find-Executable 'ffmpeg'
|
||||||
|
$ffprobe = Find-Executable 'ffprobe'
|
||||||
|
|
||||||
|
if ($Force -or -not $ffmpeg -or -not $ffprobe) {
|
||||||
|
$winget = Get-Command winget -ErrorAction SilentlyContinue
|
||||||
|
if (-not $winget) {
|
||||||
|
throw '未找到 winget。请先从 Microsoft Store 安装“应用安装程序”,或使用项目 Dockerfile 运行后端。'
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host '正在通过 winget 安装 FFmpeg...' -ForegroundColor Cyan
|
||||||
|
& winget install --id Gyan.FFmpeg --exact --source winget `
|
||||||
|
--accept-package-agreements --accept-source-agreements
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw "winget 安装失败,退出码: $LASTEXITCODE"
|
||||||
|
}
|
||||||
|
|
||||||
|
$ffmpeg = Find-Executable 'ffmpeg'
|
||||||
|
$ffprobe = Find-Executable 'ffprobe'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $ffmpeg -or -not $ffprobe) {
|
||||||
|
throw 'FFmpeg 已安装但未能定位 ffmpeg.exe 或 ffprobe.exe。请重新打开 PowerShell 后再次运行脚本。'
|
||||||
|
}
|
||||||
|
|
||||||
|
$binDirectory = Split-Path -Parent $ffmpeg
|
||||||
|
[Environment]::SetEnvironmentVariable('FFMPEG_PATH', $ffmpeg, 'User')
|
||||||
|
[Environment]::SetEnvironmentVariable('FFPROBE_PATH', $ffprobe, 'User')
|
||||||
|
|
||||||
|
$userPath = [Environment]::GetEnvironmentVariable('Path', 'User')
|
||||||
|
$pathParts = @($userPath -split ';' | Where-Object { $_ })
|
||||||
|
if ($pathParts -notcontains $binDirectory) {
|
||||||
|
$newPath = (@($pathParts) + $binDirectory) -join ';'
|
||||||
|
[Environment]::SetEnvironmentVariable('Path', $newPath, 'User')
|
||||||
|
}
|
||||||
|
|
||||||
|
$env:FFMPEG_PATH = $ffmpeg
|
||||||
|
$env:FFPROBE_PATH = $ffprobe
|
||||||
|
if (($env:Path -split ';') -notcontains $binDirectory) {
|
||||||
|
$env:Path = "$binDirectory;$env:Path"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "ffmpeg: $ffmpeg" -ForegroundColor Green
|
||||||
|
Write-Host "ffprobe: $ffprobe" -ForegroundColor Green
|
||||||
|
|
||||||
|
& $ffmpeg -hide_banner -version | Select-Object -First 1
|
||||||
|
& $ffprobe -hide_banner -version | Select-Object -First 1
|
||||||
|
|
||||||
|
$encoders = & $ffmpeg -hide_banner -encoders 2>&1 | Out-String
|
||||||
|
if ($encoders -notmatch '\blibx264\b') {
|
||||||
|
throw '当前 FFmpeg 不包含 libx264 编码器,无法满足短剧合成配置。'
|
||||||
|
}
|
||||||
|
if ($encoders -notmatch '\baac\b') {
|
||||||
|
throw '当前 FFmpeg 不包含 AAC 编码器,无法满足短剧合成配置。'
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host ''
|
||||||
|
Write-Host '安装与配置完成。请完全重启 IntelliJ IDEA 和 ruoyi-ai 后端服务。' -ForegroundColor Yellow
|
||||||
|
Write-Host '重启后,Spring 将从 FFMPEG_PATH 和 FFPROBE_PATH 读取绝对路径。'
|
||||||
File diff suppressed because one or more lines are too long
545
docs/script/sql/snail_job_mysql.sql
Normal file
545
docs/script/sql/snail_job_mysql.sql
Normal file
File diff suppressed because it is too large
Load Diff
58
docs/script/sql/update/2026-07-20-knowledge-fragment-fid.sql
Normal file
58
docs/script/sql/update/2026-07-20-knowledge-fragment-fid.sql
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
-- RAG metadata migration (MySQL 8). Safe to execute repeatedly.
|
||||||
|
-- 注意:MySQL 8 不支持 ALTER TABLE ... ADD COLUMN IF NOT EXISTS(仅 MariaDB 支持),
|
||||||
|
-- 因此列的增量添加统一用 information_schema 守卫 + PREPARE 实现幂等。
|
||||||
|
SET @add_file_hash_col = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_attach' AND column_name = 'file_hash'),
|
||||||
|
'SELECT 1',
|
||||||
|
'ALTER TABLE `knowledge_attach` ADD COLUMN `file_hash` varchar(64) NULL DEFAULT NULL COMMENT ''文件SHA-256摘要'' AFTER `doc_id`');
|
||||||
|
PREPARE stmt FROM @add_file_hash_col; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
ALTER TABLE `knowledge_attach`
|
||||||
|
MODIFY COLUMN `doc_id` varchar(32) NULL DEFAULT NULL COMMENT '文档ID';
|
||||||
|
|
||||||
|
SET @add_file_hash = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_attach' AND index_name = 'uk_knowledge_file_hash'),
|
||||||
|
'SELECT 1', 'ALTER TABLE `knowledge_attach` ADD UNIQUE INDEX `uk_knowledge_file_hash` (`knowledge_id`, `file_hash`)');
|
||||||
|
PREPARE stmt FROM @add_file_hash; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
SET @add_fid_col = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_fragment' AND column_name = 'fid'),
|
||||||
|
'SELECT 1',
|
||||||
|
'ALTER TABLE `knowledge_fragment` ADD COLUMN `fid` varchar(32) NULL DEFAULT NULL COMMENT ''向量库片段ID'' AFTER `id`');
|
||||||
|
PREPARE stmt FROM @add_fid_col; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
ALTER TABLE `knowledge_fragment`
|
||||||
|
MODIFY COLUMN `doc_id` varchar(32) NULL DEFAULT NULL COMMENT '文档ID';
|
||||||
|
|
||||||
|
UPDATE `knowledge_fragment`
|
||||||
|
SET `fid` = LOWER(MD5(CONCAT('knowledge_fragment:', `id`)))
|
||||||
|
WHERE `fid` IS NULL OR `fid` = '';
|
||||||
|
|
||||||
|
SET @drop_idx_fid = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_fragment' AND index_name = 'idx_fid'),
|
||||||
|
'ALTER TABLE `knowledge_fragment` DROP INDEX `idx_fid`', 'SELECT 1');
|
||||||
|
PREPARE stmt FROM @drop_idx_fid; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
SET @add_uk_fid = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_fragment' AND index_name = 'uk_fid'),
|
||||||
|
'SELECT 1', 'ALTER TABLE `knowledge_fragment` ADD UNIQUE INDEX `uk_fid` (`fid`)');
|
||||||
|
PREPARE stmt FROM @add_uk_fid; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
ALTER TABLE `knowledge_fragment` MODIFY COLUMN `fid` varchar(32) NOT NULL COMMENT '向量库片段ID';
|
||||||
|
|
||||||
|
SET @add_tenant_user = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_info' AND index_name = 'idx_tenant_user'),
|
||||||
|
'SELECT 1', 'ALTER TABLE `knowledge_info` ADD INDEX `idx_tenant_user` (`tenant_id`, `user_id`)');
|
||||||
|
PREPARE stmt FROM @add_tenant_user; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
SET @add_tenant_share = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_info' AND index_name = 'idx_tenant_share'),
|
||||||
|
'SELECT 1', 'ALTER TABLE `knowledge_info` ADD INDEX `idx_tenant_share` (`tenant_id`, `share`)');
|
||||||
|
PREPARE stmt FROM @add_tenant_share; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
-- 加宽 chat_provider.provider_icon 字段 (对应 issue IHPUDA)
|
||||||
|
-- 背景:文件系统使用 minio 私有桶时,厂商图标存的是带签名的临时访问 URL,
|
||||||
|
-- 长度常超过 255,导致「Data too long for column 'provider_icon'」。
|
||||||
|
-- MODIFY COLUMN 可重复执行。
|
||||||
|
|
||||||
|
ALTER TABLE `chat_provider`
|
||||||
|
MODIFY COLUMN `provider_icon` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '厂商图标';
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
-- 补充工作流节点消息模板配置 (对应 issue IJX5VV)
|
||||||
|
-- 背景:NodeMessageTemplateEnum 依赖以下 9 个 sys_config 键,缺失时
|
||||||
|
-- WorkflowMessageUtil.getNodeMessageTemplate 会抛出「请先配置该节点的响应模板」。
|
||||||
|
-- 这批配置在历史提交 20d531c0 中存在,SQL 脚本合并重命名时遗失,此处恢复。
|
||||||
|
-- 幂等:按 config_key + tenant_id 判重,可重复执行。
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027192921483309058, '000000', 'HTTP请求节点响应模板', 'node.httpRequest.template', '✅ HTTP请求节点:结束响应 - ', 'Y', 103, 1, '2026-02-27 09:23:51', 1, '2026-02-27 09:31:41', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.httpRequest.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027193296990957569, '000000', '文生图节点响应模板', 'node.image.template', '🎨 文生图节点:结束响应 - 图片URL: ', 'Y', 103, 1, '2026-02-27 09:25:20', 1, '2026-02-27 09:31:52', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.image.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027193820393959425, '000000', '发送邮箱节点响应模板', 'node.mailsend.template', '📧 发送邮箱节点:结束响应 - ', 'Y', 103, 1, '2026-02-27 09:27:25', 1, '2026-02-27 09:32:05', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.mailsend.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027194134438277122, '000000', '结束节点响应模板', 'node.end.template', '🔚 流程已执行完毕,如果您有其他需求,请随时重新发起请求。', 'Y', 103, 1, '2026-02-27 09:28:40', 1, '2026-02-27 09:32:53', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.end.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027206492573335554, '000000', '人机交互节点响应模板', 'node.humanFeedback.template', '👤 人机交互节点:等待用户操作 - ', 'Y', 103, 1, '2026-02-27 10:17:46', 1, '2026-02-27 10:17:46', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.humanFeedback.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027208880369647617, '000000', '条件分支节点响应模板', 'node.switch.template', '🔀 条件分支节点:触发 -> 跳转到节点 ', 'Y', 103, 1, '2026-02-27 10:27:15', 1, '2026-02-27 10:35:54', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.switch.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027213914603995137, '000000', '大模型回答节点响应模板', 'node.llmAnswer.template', '🤖 LLM 节点 生成回答:', 'Y', 103, 1, '2026-02-27 10:47:16', 1, '2026-02-27 10:52:40', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.llmAnswer.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027214387000066050, '000000', '关键词提取响应模板', 'node.keywordExtractor.template', '🔑 关键词提取节点 处理完成 : ', 'Y', 103, 1, '2026-02-27 10:49:08', 1, '2026-02-27 10:52:08', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.keywordExtractor.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027217577397391361, '000000', '工作流异常响应模板', 'node.exception.template', '🛑 工作流发生异常:', 'N', 103, 1, '2026-02-27 11:01:49', 1, '2026-02-27 11:02:01', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.exception.template' AND `tenant_id` = '000000');
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
/*
|
|
||||||
Navicat Premium Dump SQL
|
|
||||||
|
|
||||||
Source Server : localhost-mysql
|
|
||||||
Source Server Type : MySQL
|
|
||||||
Source Server Version : 80045 (8.0.45)
|
|
||||||
Source Host : localhost:3306
|
|
||||||
Source Schema : ruoyi-ai
|
|
||||||
|
|
||||||
Target Server Type : MySQL
|
|
||||||
Target Server Version : 80045 (8.0.45)
|
|
||||||
File Encoding : 65001
|
|
||||||
|
|
||||||
Date: 19/04/2026 13:36:41
|
|
||||||
*/
|
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
|
||||||
SET FOREIGN_KEY_CHECKS = 0;
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- Table structure for chat_model
|
|
||||||
-- ----------------------------
|
|
||||||
DROP TABLE IF EXISTS `chat_model`;
|
|
||||||
CREATE TABLE `chat_model` (
|
|
||||||
`id` bigint NOT NULL COMMENT '主键',
|
|
||||||
`category` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模型分类',
|
|
||||||
`model_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模型名称',
|
|
||||||
`provider_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模型供应商',
|
|
||||||
`model_describe` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模型描述',
|
|
||||||
`model_dimension` int NULL DEFAULT NULL COMMENT '模型维度',
|
|
||||||
`model_show` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否显示',
|
|
||||||
`api_host` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '请求地址',
|
|
||||||
`api_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '密钥',
|
|
||||||
`create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
|
|
||||||
`create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
|
|
||||||
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
|
|
||||||
`update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
|
|
||||||
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
|
|
||||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
|
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户Id',
|
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '模型管理' ROW_FORMAT = DYNAMIC;
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- Records of chat_model
|
|
||||||
-- ----------------------------
|
|
||||||
INSERT INTO `chat_model` VALUES (2000585866022060033, 'chat', 'zai-org/glm-5', 'ppio', 'zai-org/glm-5', NULL, 'Y', 'https://api.ppio.com/openai', 'sk_xx', 103, 1, '2025-12-15 23:16:54', 1, '2026-03-15 19:18:48', 'DeepSeek-V3.2 是一款在高效推理、复杂推理能力与智能体场景中表现突出的领先模型。其基于 DeepSeek Sparse Attention(DSA)稀疏注意力机制,在显著降低计算开销的同时优化长上下文性能;通过可扩展强化学习框架,整体能力达到 GPT-5 同级,高算力版本 V3.2-Speciale 更在推理表现上接近 Gemini-3.0-Pro;同时,模型依托大型智能体任务合成管线,具备更强的工具调用与多步骤决策能力,并在 2025 年 IMO 与 IOI 中取得金牌级表现。作为 MaaS 平台,我们已对 DeepSeek-V3.2 完成深度适配,通过动态调度、批处理加速、低延迟推理与企业级 SLA 保障,进一步增强其在企业生产环境中的稳定性、性价比与可控性,适用于搜索、问答、智能体、代码、数据处理等多类高价值场景。', 0);
|
|
||||||
INSERT INTO `chat_model` VALUES (2007528268536287233, 'vector', 'baai/bge-m3', 'ppio', 'bge-m3', 1024, 'N', 'https://api.ppio.com/openai', 'sk_xx', 103, 1, '2026-01-04 03:03:32', 1, '2026-03-15 19:18:51', 'BGE-M3 是一款具备多维度能力的文本嵌入模型,可同时实现密集检索、多向量检索和稀疏检索三大核心功能。该模型设计上兼容超过100种语言,并支持从短句到长达8192词元的长文本等多种输入形式。在跨语言检索任务中,BGE-M3展现出显著优势,其性能在MIRACL、MKQA等国际基准测试中位居前列。此外,针对长文档检索场景,该模型在MLDR、NarritiveQA等数据集上的表现同样达到行业领先水平。', 0);
|
|
||||||
INSERT INTO `chat_model` VALUES (2045735140488847361, 'chat', 'deepseek-chat', 'custom_api', 'deepseek-chat', NULL, NULL, 'https://api.deepseek.com', 'sk_xx', 103, 1, '2026-04-19 13:24:00', 1, '2026-04-19 13:24:00', 'deepseek对话模型', 0);
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- Table structure for chat_provider
|
|
||||||
-- ----------------------------
|
|
||||||
DROP TABLE IF EXISTS `chat_provider`;
|
|
||||||
CREATE TABLE `chat_provider` (
|
|
||||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
|
||||||
`provider_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '厂商名称',
|
|
||||||
`provider_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '厂商编码',
|
|
||||||
`provider_icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '厂商图标',
|
|
||||||
`provider_desc` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '厂商描述',
|
|
||||||
`api_host` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'API地址',
|
|
||||||
`status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
|
|
||||||
`sort_order` int NULL DEFAULT 0 COMMENT '排序',
|
|
||||||
`create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
|
|
||||||
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
|
|
||||||
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
|
|
||||||
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
|
|
||||||
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
|
|
||||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
|
|
||||||
`version` int NULL DEFAULT NULL COMMENT '版本',
|
|
||||||
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
|
|
||||||
`update_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新IP',
|
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户Id',
|
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
|
||||||
UNIQUE INDEX `unique_provider_code`(`provider_code` ASC, `tenant_id` ASC, `del_flag` ASC) USING BTREE,
|
|
||||||
INDEX `idx_status`(`status` ASC) USING BTREE
|
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 2045727230803255298 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '厂商管理表' ROW_FORMAT = DYNAMIC;
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- Records of chat_provider
|
|
||||||
-- ----------------------------
|
|
||||||
INSERT INTO `chat_provider` VALUES (1, 'OpenAI', 'openai', 'https://ruoyiai-1254149996.cos.ap-guangzhou.myqcloud.com/2026/02/25/01091be272334383a1efd9bc22b73ee6.png', 'OpenAI官方API服务商', 'https://api.openai.com', '0', 1, 103, '2025-12-14 21:48:11', '1', '1', '2026-02-25 20:46:59', 'OpenAI厂商', NULL, '0', NULL, 0);
|
|
||||||
INSERT INTO `chat_provider` VALUES (11, '深度求索', 'deepseek', 'https://ruoyiai-1254149996.cos.ap-guangzhou.myqcloud.com/2026/04/19/5ba8c30f153246898a4d7dc7b846de8d.png', 'DeepSeek官方API', 'https://api.deepseek.com', '0', 0, 103, '2026-04-19 12:52:34', '1', '1', '2026-04-19 13:13:25', 'DeepSeek官方API', NULL, '0', NULL, 0);
|
|
||||||
INSERT INTO `chat_provider` VALUES (12, '智谱AI', 'zhipu', 'https://ruoyiai-1254149996.cos.ap-guangzhou.myqcloud.com/2026/04/19/da071783c9284fdd9ed1ce1b57b3c75c.png', '智谱AI大模型服务', 'https://open.bigmodel.cn', '0', 4, 103, '2025-12-14 21:48:11', '1', '1', '2026-04-19 13:14:00', '智谱AI厂商', NULL, '0', NULL, 0);
|
|
||||||
INSERT INTO `chat_provider` VALUES (13, '小米MIMO', 'xiaomi', 'https://ruoyiai-1254149996.cos.ap-guangzhou.myqcloud.com/2026/04/19/18dd39365ce244e3ae5e030da036760e.png', '小米官方API', 'https://api.xiaomimimo.com/anthropic/v1/messages', '0', 3, 103, '2026-04-19 12:48:24', '1', '1', '2026-04-19 13:14:22', '小米官方API', NULL, '0', NULL, 0);
|
|
||||||
INSERT INTO `chat_provider` VALUES (14, '阿里云百炼', 'qianwen', 'https://ruoyiai-1254149996.cos.ap-guangzhou.myqcloud.com/2026/02/25/de2aa7e649de44f3ba5c6380ac6acd04.png', '阿里云百炼大模型服务', 'https://dashscope.aliyuncs.com', '0', 2, 103, '2025-12-14 21:48:11', '1', '1', '2026-02-25 20:49:13', '阿里云厂商', NULL, '0', NULL, 0);
|
|
||||||
INSERT INTO `chat_provider` VALUES (15, 'PPIO', 'ppio', 'https://ruoyiai-1254149996.cos.ap-guangzhou.myqcloud.com/2026/02/25/049bb6a507174f73bba4b8d8b9e55b8a.png', 'api聚合厂商', 'https://api.ppinfra.com/openai', '0', 5, 103, '2025-12-15 23:13:42', '1', '1', '2026-02-25 20:49:01', 'api聚合厂商', NULL, '0', NULL, 0);
|
|
||||||
INSERT INTO `chat_provider` VALUES (16, 'MiniMax', 'minimax', 'https://ruoyiai-1254149996.cos.ap-guangzhou.myqcloud.com/2026/04/19/fdc712e90e0e4d78b05862ad230884e5.png', 'MiniMax大模型服务,支持M2.7、M2.5等模型', 'https://api.minimax.io/v1', '0', 6, 103, '2026-04-19 12:50:12', '1', '1', '2026-04-19 13:14:59', 'MiniMax厂商', NULL, '0', NULL, 0);
|
|
||||||
INSERT INTO `chat_provider` VALUES (17, 'ollama', 'ollama', 'https://ruoyiai-1254149996.cos.ap-guangzhou.myqcloud.com/2026/02/25/afecabebc8014d80b0f06b4796a74c5d.png', 'ollama大模型', 'http://127.0.0.1:11434', '0', 7, 103, '2025-12-14 21:48:11', '1', '1', '2026-02-25 20:48:48', 'ollama厂商', NULL, '0', NULL, 0);
|
|
||||||
INSERT INTO `chat_provider` VALUES (18, '自定义厂商', 'custom_api', 'https://ruoyiai-1254149996.cos.ap-guangzhou.myqcloud.com/2026/04/19/c1a8e122510f4e2f90deb36958af710b.png', 'OPENAI兼容格式', '自定义', '0', 8, 103, '2026-04-19 12:35:57', '1', '1', '2026-04-19 13:17:20', 'OPENAI兼容格式', NULL, '0', NULL, 0);
|
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
Navicat Premium Dump SQL
|
|
||||||
|
|
||||||
Source Server : localhost-mysql
|
|
||||||
Source Server Type : MySQL
|
|
||||||
Source Server Version : 80045 (8.0.45)
|
|
||||||
Source Host : localhost:3306
|
|
||||||
Source Schema : ruoyi-ai
|
|
||||||
|
|
||||||
Target Server Type : MySQL
|
|
||||||
Target Server Version : 80045 (8.0.45)
|
|
||||||
File Encoding : 65001
|
|
||||||
|
|
||||||
Date: 20/04/2026 15:30:00
|
|
||||||
*/
|
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
|
||||||
SET FOREIGN_KEY_CHECKS = 0;
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- 新增:重排序模型(chat_model)
|
|
||||||
-- ----------------------------
|
|
||||||
INSERT INTO `chat_model`
|
|
||||||
(id, category, model_name, provider_code, model_describe, model_dimension, model_show, api_host, api_key, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id)
|
|
||||||
VALUES(2045071617578237953, 'rerank', 'rerank', 'zhipu', '智谱重排序', NULL, 'Y', 'https://open.bigmodel.cn', 'e9xx', 103, 1, '2026-04-17 17:27:24', 1, '2026-04-20 15:21:48', '智谱重排序', 0);
|
|
||||||
|
|
||||||
INSERT INTO `chat_model`
|
|
||||||
(id, category, model_name, provider_code, model_describe, model_dimension, model_show, api_host, api_key, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id)
|
|
||||||
VALUES(2046119803482902530, 'rerank', 'qwen3-rerank', 'qianwen', '千问3重排序', NULL, NULL, 'https://dashscope.aliyuncs.com', 'sk-xx', 103, 1, '2026-04-20 14:52:31', 1, '2026-04-20 15:03:13', '千问3文本重排序', 0);
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- 新增:字典类型 - 重排序模型分类
|
|
||||||
-- ----------------------------
|
|
||||||
INSERT INTO `sys_dict_data`
|
|
||||||
(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark)
|
|
||||||
VALUES(2045070879435259905, '000000', 4, '重排序', 'rerank', 'chat_model_category', NULL, '#000000', 'N', 103, 1, '2026-04-17 17:24:28', 1, '2026-04-19 01:02:20', '重排序模型');
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- 修改表:knowledge_info 增加重排序相关字段
|
|
||||||
-- ----------------------------
|
|
||||||
ALTER TABLE `knowledge_info` ADD COLUMN `enable_rerank` tinyint DEFAULT 0 NULL COMMENT '是否启用重排序(0否 1是)';
|
|
||||||
ALTER TABLE `knowledge_info` ADD COLUMN `rerank_score_threshold` double NULL COMMENT '重排序相关性分数阈值';
|
|
||||||
ALTER TABLE `knowledge_info` ADD COLUMN `rerank_top_n` int NULL COMMENT '重排序后返回的文档数量';
|
|
||||||
ALTER TABLE `knowledge_info` ADD COLUMN `rerank_model` varchar(100) NULL COMMENT '重排序模型名称';
|
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
-- 为知识库信息表新增检索配置字段 (剔除了已存在的重排字段)
|
|
||||||
ALTER TABLE knowledge_info
|
|
||||||
ADD COLUMN similarity_threshold DOUBLE DEFAULT 0.5 COMMENT '相似度阈值'
|
|
||||||
AFTER retrieve_limit;
|
|
||||||
|
|
||||||
ALTER TABLE knowledge_info ADD COLUMN enable_hybrid tinyint(1) DEFAULT 0 COMMENT '是否启用混合检索';
|
|
||||||
ALTER TABLE knowledge_info ADD COLUMN hybrid_alpha double DEFAULT 0.5 COMMENT '混合检索权重比例 (0.0=纯向量, 1.0=纯关键词)';
|
|
||||||
|
|
||||||
-- 为知识片段表增加全文索引及关联ID
|
|
||||||
ALTER TABLE knowledge_fragment ADD COLUMN knowledge_id bigint COMMENT '知识库ID';
|
|
||||||
ALTER TABLE knowledge_fragment ADD FULLTEXT INDEX ft_content (content) WITH PARSER ngram;
|
|
||||||
|
|
||||||
-- 为知识库附件表增加解析状态字段
|
|
||||||
ALTER TABLE `knowledge_attach` ADD COLUMN `status` TINYINT DEFAULT 0 COMMENT '解析状态: 0待解析, 1解析中, 2已解析, 3解析失败';
|
|
||||||
31
pom.xml
31
pom.xml
@@ -13,7 +13,7 @@
|
|||||||
<description>全栈式AI开发平台</description>
|
<description>全栈式AI开发平台</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<revision>3.0.0</revision>
|
<revision>3.1.0</revision>
|
||||||
<spring-boot.version>3.5.8</spring-boot.version>
|
<spring-boot.version>3.5.8</spring-boot.version>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
@@ -54,18 +54,23 @@
|
|||||||
<!-- Jackson XML -->
|
<!-- Jackson XML -->
|
||||||
<jackson-dataformat-xml.version>2.18.2</jackson-dataformat-xml.version>
|
<jackson-dataformat-xml.version>2.18.2</jackson-dataformat-xml.version>
|
||||||
<!-- AI 相关依赖 -->
|
<!-- AI 相关依赖 -->
|
||||||
<langchain4j.version>1.13.0</langchain4j.version>
|
|
||||||
<langchain4j.community.version>1.13.0-beta23</langchain4j.community.version>
|
<langchain4j.version>1.17.2</langchain4j.version>
|
||||||
<langgraph4j.version>1.5.3</langgraph4j.version>
|
<langchain4j.beta.version>1.17.2-beta27</langchain4j.beta.version>
|
||||||
|
<langchain4j.community.version>1.17.0-beta27</langchain4j.community.version>
|
||||||
|
<langgraph4j.version>1.8.20</langgraph4j.version>
|
||||||
|
|
||||||
<weaviate.version>1.19.6</weaviate.version>
|
<weaviate.version>1.19.6</weaviate.version>
|
||||||
<dify.version>1.0.7</dify.version>
|
<dify.version>1.2.7</dify.version>
|
||||||
|
<coze.version>0.4.2</coze.version>
|
||||||
|
|
||||||
<!-- gRPC 版本 - 解决 Milvus SDK 依赖冲突 -->
|
<!-- gRPC 版本 - 解决 Milvus SDK 依赖冲突 -->
|
||||||
<grpc.version>1.62.2</grpc.version>
|
<grpc.version>1.62.2</grpc.version>
|
||||||
<!-- Apache Commons Compress - 用于POI处理ZIP格式 -->
|
<!-- Apache Commons Compress - 用于POI处理ZIP格式 -->
|
||||||
<commons-compress.version>1.27.1</commons-compress.version>
|
<commons-compress.version>1.27.1</commons-compress.version>
|
||||||
|
|
||||||
|
|
||||||
<avatar-generator.version>1.1.0</avatar-generator.version>
|
<avatar-generator.version>1.1.0</avatar-generator.version>
|
||||||
|
<javassist.version>3.30.2-GA</javassist.version>
|
||||||
<jsoup.version>1.21.2</jsoup.version>
|
<jsoup.version>1.21.2</jsoup.version>
|
||||||
<knife4j.version>4.4.0</knife4j.version>
|
<knife4j.version>4.4.0</knife4j.version>
|
||||||
<swagger-annotations.version>2.2.8</swagger-annotations.version>
|
<swagger-annotations.version>2.2.8</swagger-annotations.version>
|
||||||
@@ -79,7 +84,7 @@
|
|||||||
<maven-surefire-plugin.version>3.5.3</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>3.5.3</maven-surefire-plugin.version>
|
||||||
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
|
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
|
||||||
<!-- 打包默认跳过测试 -->
|
<!-- 打包默认跳过测试 -->
|
||||||
<skipTests>true</skipTests>
|
<skipTests>false</skipTests>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<profiles>
|
<profiles>
|
||||||
@@ -499,20 +504,8 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<resource>
|
<resource>
|
||||||
<directory>src/main/resources</directory>
|
<directory>src/main/resources</directory>
|
||||||
<!-- 关闭过滤 -->
|
|
||||||
<filtering>false</filtering>
|
<filtering>false</filtering>
|
||||||
</resource>
|
</resource>
|
||||||
<resource>
|
|
||||||
<directory>src/main/resources</directory>
|
|
||||||
<!-- 引入所有 匹配文件进行过滤 -->
|
|
||||||
<includes>
|
|
||||||
<include>application*</include>
|
|
||||||
<include>bootstrap*</include>
|
|
||||||
<include>banner*</include>
|
|
||||||
</includes>
|
|
||||||
<!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
|
|
||||||
<filtering>true</filtering>
|
|
||||||
</resource>
|
|
||||||
</resources>
|
</resources>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|||||||
@@ -1,31 +1,59 @@
|
|||||||
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
|
# FFmpeg-enabled variant of ruoyi-admin/Dockerfile.
|
||||||
FROM bellsoft/liberica-openjdk-rocky:17.0.16-cds
|
FROM bellsoft/liberica-openjdk-rocky:17.0.16-cds
|
||||||
#FROM bellsoft/liberica-openjdk-rocky:21.0.8-cds
|
|
||||||
#FROM findepi/graalvm:java17-native
|
|
||||||
|
|
||||||
LABEL maintainer="Lion Li"
|
LABEL maintainer="Lion Li"
|
||||||
|
|
||||||
|
# Rocky base repositories do not provide the full codec build. RPM Fusion Free
|
||||||
|
# supplies ffmpeg with libx264, while the checks below prevent a reduced build
|
||||||
|
# from reaching production unnoticed.
|
||||||
|
RUN set -eux; \
|
||||||
|
dnf -y install dnf-plugins-core epel-release; \
|
||||||
|
. /etc/os-release; \
|
||||||
|
rocky_major="${VERSION_ID%%.*}"; \
|
||||||
|
if [ "${rocky_major}" -ge 9 ]; then \
|
||||||
|
dnf config-manager --set-enabled crb; \
|
||||||
|
else \
|
||||||
|
dnf config-manager --set-enabled powertools; \
|
||||||
|
fi; \
|
||||||
|
dnf -y install "https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-${rocky_major}.noarch.rpm"; \
|
||||||
|
dnf -y install ffmpeg; \
|
||||||
|
for filter in scale pad fps setsar format tpad trim settb setpts xfade \
|
||||||
|
aresample aformat apad atrim asetpts anullsrc concat acrossfade; do \
|
||||||
|
ffmpeg -hide_banner -filters 2>/dev/null | grep -Eq "[[:space:]]${filter}[[:space:]]"; \
|
||||||
|
done; \
|
||||||
|
ffmpeg -hide_banner -h filter=xfade 2>&1 | grep -q dissolve; \
|
||||||
|
ffmpeg -hide_banner -h filter=xfade 2>&1 | grep -q fadeblack; \
|
||||||
|
ffmpeg -hide_banner -h filter=xfade 2>&1 | grep -q slideleft; \
|
||||||
|
ffmpeg -hide_banner -encoders 2>/dev/null | grep -Eq '[[:space:]]libx264[[:space:]]'; \
|
||||||
|
ffmpeg -hide_banner -encoders 2>/dev/null | grep -Eq '[[:space:]]aac[[:space:]]'; \
|
||||||
|
ffprobe -hide_banner -version >/dev/null; \
|
||||||
|
dnf clean all; \
|
||||||
|
rm -rf /var/cache/dnf
|
||||||
|
|
||||||
RUN mkdir -p /ruoyi/server/logs \
|
RUN mkdir -p /ruoyi/server/logs \
|
||||||
/ruoyi/server/temp \
|
/ruoyi/server/temp \
|
||||||
/ruoyi/skywalking/agent
|
/ruoyi/skywalking/agent
|
||||||
|
|
||||||
WORKDIR /ruoyi/server
|
WORKDIR /ruoyi/server
|
||||||
|
|
||||||
ENV SERVER_PORT=8080 SNAIL_PORT=28080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
|
ENV SERVER_PORT=8080 \
|
||||||
|
SNAIL_PORT=28080 \
|
||||||
|
LANG=C.UTF-8 \
|
||||||
|
LC_ALL=C.UTF-8 \
|
||||||
|
JAVA_OPTS="" \
|
||||||
|
FFMPEG_PATH=/usr/bin/ffmpeg \
|
||||||
|
FFPROBE_PATH=/usr/bin/ffprobe
|
||||||
|
|
||||||
EXPOSE ${SERVER_PORT}
|
EXPOSE ${SERVER_PORT}
|
||||||
# 暴露 snail job 客户端端口 用于定时任务调度中心通信
|
|
||||||
EXPOSE ${SNAIL_PORT}
|
EXPOSE ${SNAIL_PORT}
|
||||||
|
|
||||||
ADD ./target/ruoyi-admin.jar ./app.jar
|
ADD ./target/ruoyi-admin.jar ./app.jar
|
||||||
|
|
||||||
SHELL ["/bin/bash", "-c"]
|
SHELL ["/bin/bash", "-c"]
|
||||||
|
|
||||||
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
|
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \
|
||||||
|
-Djava.io.tmpdir=/ruoyi/server/temp \
|
||||||
|
-Dserver.port=${SERVER_PORT} \
|
||||||
-Dsnail-job.port=${SNAIL_PORT} \
|
-Dsnail-job.port=${SNAIL_PORT} \
|
||||||
# 应用名称 如果想区分集群节点监控 改成不同的名称即可
|
|
||||||
#-Dskywalking.agent.service_name=ruoyi-server \
|
|
||||||
#-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \
|
|
||||||
-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \
|
-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \
|
||||||
-jar app.jar
|
-jar app.jar
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ spring.boot.admin.client:
|
|||||||
metadata:
|
metadata:
|
||||||
username: ${spring.boot.admin.client.username}
|
username: ${spring.boot.admin.client.username}
|
||||||
userpassword: ${spring.boot.admin.client.password}
|
userpassword: ${spring.boot.admin.client.password}
|
||||||
username: @monitor.username@
|
username: ${MONITOR_USERNAME:ruoyi}
|
||||||
password: @monitor.password@
|
password: ${MONITOR_PASSWORD:123456}
|
||||||
|
|
||||||
--- # mcp配置信息
|
--- # mcp配置信息
|
||||||
mcp:
|
mcp:
|
||||||
@@ -27,12 +27,12 @@ snail-job:
|
|||||||
enabled: false
|
enabled: false
|
||||||
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
||||||
group: "ruoyi_group"
|
group: "ruoyi_group"
|
||||||
# SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` 表
|
# SnailJob 接入验证令牌 详见 docs/script/sql/ruoyi-ai-v3_mysql8.sql `sj_group_config` 表
|
||||||
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
||||||
server:
|
server:
|
||||||
host: 127.0.0.1
|
host: 127.0.0.1
|
||||||
port: 17888
|
port: 17888
|
||||||
# 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段
|
# 命名空间UUID 详见 docs/script/sql/ruoyi-ai-v3_mysql8.sql `sj_namespace`表`unique_id`字段
|
||||||
namespace: ${spring.profiles.active}
|
namespace: ${spring.profiles.active}
|
||||||
# 随主应用端口漂移
|
# 随主应用端口漂移
|
||||||
port: 2${server.port}
|
port: 2${server.port}
|
||||||
@@ -60,7 +60,7 @@ spring:
|
|||||||
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
|
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
|
||||||
url: jdbc:mysql://127.0.0.1:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: root
|
username: root
|
||||||
password: root
|
password: 123456
|
||||||
# agent:
|
# agent:
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
# url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# # url: jdbc:mysql://localhost:3306/agent_db
|
# # url: jdbc:mysql://localhost:3306/agent_db
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ spring.boot.admin.client:
|
|||||||
metadata:
|
metadata:
|
||||||
username: ${spring.boot.admin.client.username}
|
username: ${spring.boot.admin.client.username}
|
||||||
userpassword: ${spring.boot.admin.client.password}
|
userpassword: ${spring.boot.admin.client.password}
|
||||||
username: @monitor.username@
|
username: ${MONITOR_USERNAME:ruoyi}
|
||||||
password: @monitor.password@
|
password: ${MONITOR_PASSWORD:123456}
|
||||||
|
|
||||||
--- # mcp配置信息
|
--- # mcp配置信息
|
||||||
mcp:
|
mcp:
|
||||||
@@ -28,12 +28,12 @@ snail-job:
|
|||||||
enabled: false
|
enabled: false
|
||||||
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
||||||
group: "ruoyi_group"
|
group: "ruoyi_group"
|
||||||
# SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` 表
|
# SnailJob 接入验证令牌 详见 docs/script/sql/ruoyi-ai-v3_mysql8.sql `sj_group_config` 表
|
||||||
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
||||||
server:
|
server:
|
||||||
host: 127.0.0.1
|
host: 127.0.0.1
|
||||||
port: 17888
|
port: 17888
|
||||||
# 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段
|
# 命名空间UUID 详见 docs/script/sql/ruoyi-ai-v3_mysql8.sql `sj_namespace`表`unique_id`字段
|
||||||
namespace: ${spring.profiles.active}
|
namespace: ${spring.profiles.active}
|
||||||
# 随主应用端口漂移
|
# 随主应用端口漂移
|
||||||
port: 2${server.port}
|
port: 2${server.port}
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ server:
|
|||||||
# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
|
# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
|
||||||
worker: 256
|
worker: 256
|
||||||
|
|
||||||
|
--- # 小程序对话 WebSocket 兜底默认模型(前端未传 model 且无智能体绑定时使用)
|
||||||
|
chat:
|
||||||
|
default-model: deepseek-v4-flash
|
||||||
|
|
||||||
captcha:
|
captcha:
|
||||||
# 是否启用验证码校验
|
# 是否启用验证码校验
|
||||||
enable: false
|
enable: false
|
||||||
@@ -35,7 +39,7 @@ captcha:
|
|||||||
# 日志配置
|
# 日志配置
|
||||||
logging:
|
logging:
|
||||||
level:
|
level:
|
||||||
org.ruoyi: @logging.level@
|
org.ruoyi: ${LOGGING_LEVEL_ORG_RUOYI:info}
|
||||||
org.springframework: warn
|
org.springframework: warn
|
||||||
org.mybatis.spring.mapper: error
|
org.mybatis.spring.mapper: error
|
||||||
org.apache.fury: warn
|
org.apache.fury: warn
|
||||||
@@ -75,7 +79,7 @@ spring:
|
|||||||
# 国际化资源文件路径
|
# 国际化资源文件路径
|
||||||
basename: i18n/messages
|
basename: i18n/messages
|
||||||
profiles:
|
profiles:
|
||||||
active: @profiles.active@
|
active: ${SPRING_PROFILES_ACTIVE:dev}
|
||||||
# 文件上传
|
# 文件上传
|
||||||
servlet:
|
servlet:
|
||||||
multipart:
|
multipart:
|
||||||
@@ -125,6 +129,7 @@ security:
|
|||||||
- /*/api-docs/**
|
- /*/api-docs/**
|
||||||
- /warm-flow-ui/config
|
- /warm-flow-ui/config
|
||||||
- /workflow/run
|
- /workflow/run
|
||||||
|
- /coding/**
|
||||||
# 多租户配置
|
# 多租户配置
|
||||||
tenant:
|
tenant:
|
||||||
# 是否开启
|
# 是否开启
|
||||||
@@ -314,11 +319,12 @@ warm-flow:
|
|||||||
vector-store:
|
vector-store:
|
||||||
# 向量存储类型 可选(weaviate/milvus/qdrant)
|
# 向量存储类型 可选(weaviate/milvus/qdrant)
|
||||||
# 如需修改向量库类型,请修改此配置值!
|
# 如需修改向量库类型,请修改此配置值!
|
||||||
type: milvus
|
# 注意:需与 docker-compose 实际部署的向量库保持一致(当前 compose 内置 weaviate,映射端口 28080)
|
||||||
|
type: weaviate
|
||||||
# Weaviate配置
|
# Weaviate配置
|
||||||
weaviate:
|
weaviate:
|
||||||
protocol: http
|
protocol: http
|
||||||
host: 127.0.0.1:6038
|
host: 127.0.0.1:28080
|
||||||
classname: LocalKnowledge
|
classname: LocalKnowledge
|
||||||
# Milvus配置
|
# Milvus配置
|
||||||
milvus:
|
milvus:
|
||||||
@@ -331,3 +337,38 @@ vector-store:
|
|||||||
collectionname: LocalKnowledge
|
collectionname: LocalKnowledge
|
||||||
api-key:
|
api-key:
|
||||||
use-tls: false
|
use-tls: false
|
||||||
|
|
||||||
|
# 短剧成片合成
|
||||||
|
short-drama:
|
||||||
|
composition:
|
||||||
|
ffmpeg-path: ${FFMPEG_PATH:ffmpeg}
|
||||||
|
ffprobe-path: ${FFPROBE_PATH:ffprobe}
|
||||||
|
fps: ${SHORT_DRAMA_COMPOSITION_FPS:30}
|
||||||
|
audio-sample-rate: ${SHORT_DRAMA_COMPOSITION_AUDIO_SAMPLE_RATE:48000}
|
||||||
|
video-codec: ${SHORT_DRAMA_COMPOSITION_VIDEO_CODEC:libx264}
|
||||||
|
audio-codec: ${SHORT_DRAMA_COMPOSITION_AUDIO_CODEC:aac}
|
||||||
|
preset: ${SHORT_DRAMA_COMPOSITION_PRESET:medium}
|
||||||
|
crf: ${SHORT_DRAMA_COMPOSITION_CRF:20}
|
||||||
|
audio-bitrate: ${SHORT_DRAMA_COMPOSITION_AUDIO_BITRATE:192k}
|
||||||
|
max-clips: ${SHORT_DRAMA_COMPOSITION_MAX_CLIPS:100}
|
||||||
|
max-transition-seconds: ${SHORT_DRAMA_COMPOSITION_MAX_TRANSITION_SECONDS:2.0}
|
||||||
|
minimum-output-bytes: ${SHORT_DRAMA_COMPOSITION_MINIMUM_OUTPUT_BYTES:1024}
|
||||||
|
max-process-output-bytes: ${SHORT_DRAMA_COMPOSITION_MAX_PROCESS_OUTPUT_BYTES:1048576}
|
||||||
|
max-source-bytes: ${SHORT_DRAMA_COMPOSITION_MAX_SOURCE_BYTES:536870912}
|
||||||
|
max-total-source-bytes: ${SHORT_DRAMA_COMPOSITION_MAX_TOTAL_SOURCE_BYTES:2147483648}
|
||||||
|
probe-timeout: ${SHORT_DRAMA_COMPOSITION_PROBE_TIMEOUT:30s}
|
||||||
|
process-timeout: ${SHORT_DRAMA_COMPOSITION_PROCESS_TIMEOUT:30m}
|
||||||
|
job-stale-after: ${SHORT_DRAMA_COMPOSITION_JOB_STALE_AFTER:45m}
|
||||||
|
watermark-font-file: ${SHORT_DRAMA_COMPOSITION_WATERMARK_FONT_FILE:}
|
||||||
|
worker-core-size: ${SHORT_DRAMA_COMPOSITION_WORKER_CORE_SIZE:1}
|
||||||
|
worker-max-size: ${SHORT_DRAMA_COMPOSITION_WORKER_MAX_SIZE:2}
|
||||||
|
worker-queue-capacity: ${SHORT_DRAMA_COMPOSITION_WORKER_QUEUE_CAPACITY:8}
|
||||||
|
storage-mode: ${SHORT_DRAMA_COMPOSITION_STORAGE_MODE:local}
|
||||||
|
local-output-directory: ${SHORT_DRAMA_COMPOSITION_LOCAL_OUTPUT_DIRECTORY:logs/short-drama-compositions}
|
||||||
|
download:
|
||||||
|
connect-timeout: ${SHORT_DRAMA_DOWNLOAD_CONNECT_TIMEOUT:30s}
|
||||||
|
call-timeout: ${SHORT_DRAMA_DOWNLOAD_CALL_TIMEOUT:10m}
|
||||||
|
max-redirects: ${SHORT_DRAMA_DOWNLOAD_MAX_REDIRECTS:5}
|
||||||
|
# 生产环境建议配置为视频供应商或 OSS/CDN 域名,多个值用逗号分隔。
|
||||||
|
allowed-hosts: ${SHORT_DRAMA_DOWNLOAD_ALLOWED_HOSTS:}
|
||||||
|
fake-ip-allowed-hosts: ${SHORT_DRAMA_DOWNLOAD_FAKE_IP_ALLOWED_HOSTS:atlas-media.oss-us-west-1.aliyuncs.com}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
</description>
|
</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<revision>3.0.0</revision>
|
<revision>3.1.0</revision>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package org.ruoyi.common.chat.domain.bo.chat;
|
package org.ruoyi.common.chat.domain.bo.chat;
|
||||||
|
|
||||||
import io.github.linpeilie.annotations.AutoMapper;
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import org.ruoyi.common.chat.entity.chat.ChatModel;
|
import org.ruoyi.common.chat.entity.chat.ChatModel;
|
||||||
|
import org.ruoyi.common.core.validate.AddGroup;
|
||||||
import org.ruoyi.common.core.validate.EditGroup;
|
import org.ruoyi.common.core.validate.EditGroup;
|
||||||
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
|
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
@@ -28,16 +30,19 @@ public class ChatModelBo extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 模型分类
|
* 模型分类
|
||||||
*/
|
*/
|
||||||
|
@NotBlank(message = "模型分类不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
private String category;
|
private String category;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模型名称
|
* 模型名称
|
||||||
*/
|
*/
|
||||||
|
@NotBlank(message = "模型名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
private String modelName;
|
private String modelName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模型供应商
|
* 模型供应商
|
||||||
*/
|
*/
|
||||||
|
@NotBlank(message = "模型供应商不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
private String providerCode;
|
private String providerCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package org.ruoyi.common.chat.domain.bo.chat;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按厂商批量更新密钥业务对象
|
||||||
|
*
|
||||||
|
* @author ageerle
|
||||||
|
* @date 2025-12-14
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class ModelBatchKeyBo extends BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模型供应商
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "厂商编码不能为空")
|
||||||
|
private String providerCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 密钥
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "密钥不能为空")
|
||||||
|
private String apiKey;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -21,9 +21,19 @@ import java.util.List;
|
|||||||
@Data
|
@Data
|
||||||
public class ChatRequest {
|
public class ChatRequest {
|
||||||
|
|
||||||
@NotEmpty(message = "传入的模型不能为空")
|
/**
|
||||||
|
* 模型名称。
|
||||||
|
* 智能体模式下可缺省:传 agentId 时后端按智能体绑定的模型解析,此字段仅作回退。
|
||||||
|
*/
|
||||||
private String model;
|
private String model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 智能体ID。传入时后端按智能体配置解析模型/工具/技能/知识库/提示词/是否深度思考。
|
||||||
|
*/
|
||||||
|
@JsonSerialize(using = ToStringSerializer.class)
|
||||||
|
@JSONField(serializeUsing = String.class)
|
||||||
|
private Long agentId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对话消息
|
* 对话消息
|
||||||
*/
|
*/
|
||||||
@@ -35,16 +45,6 @@ public class ChatRequest {
|
|||||||
*/
|
*/
|
||||||
private WorkFlowRunner workFlowRunner;
|
private WorkFlowRunner workFlowRunner;
|
||||||
|
|
||||||
/**
|
|
||||||
* 人机交互信息体
|
|
||||||
*/
|
|
||||||
private ReSumeRunner reSumeRunner;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否为人机交互用户继续输入
|
|
||||||
*/
|
|
||||||
private Boolean isResume = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否启用工作流
|
* 是否启用工作流
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
package org.ruoyi.common.chat.domain.dto.request;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 人机交互输入信息
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
public class ReSumeRunner {
|
|
||||||
/**
|
|
||||||
* 运行节点UUID
|
|
||||||
*/
|
|
||||||
private String runtimeUuid;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 人机交互用户输入信息
|
|
||||||
*/
|
|
||||||
private String feedbackContent;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package org.ruoyi.common.chat.entity.audio;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.ruoyi.common.chat.domain.vo.chat.ChatModelVo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Text-to-speech context.
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
public class AudioContext {
|
||||||
|
|
||||||
|
@NotNull(message = "模型配置不能为空")
|
||||||
|
private ChatModelVo chatModelVo;
|
||||||
|
|
||||||
|
@NotBlank(message = "输入文本不能为空")
|
||||||
|
private String input;
|
||||||
|
|
||||||
|
private String voice;
|
||||||
|
|
||||||
|
private String responseFormat;
|
||||||
|
|
||||||
|
private Double speed;
|
||||||
|
|
||||||
|
private String instructions;
|
||||||
|
|
||||||
|
/** Atlas seed-audio 参考资源:[{speaker, audioUrl, audioData, imageData}],speaker 为音色名 */
|
||||||
|
private java.util.List<java.util.Map<String, String>> references;
|
||||||
|
|
||||||
|
/** Atlas seed-audio 采样率 */
|
||||||
|
private Integer sampleRate;
|
||||||
|
|
||||||
|
/** Atlas seed-audio 音调调整 (-12~12) */
|
||||||
|
private Integer pitchRate;
|
||||||
|
|
||||||
|
/** Atlas seed-audio 语速调整 (-50~100) */
|
||||||
|
private Integer speechRate;
|
||||||
|
|
||||||
|
/** Atlas seed-audio 响度调整 (-50~100) */
|
||||||
|
private Integer loudnessRate;
|
||||||
|
}
|
||||||
@@ -42,4 +42,9 @@ public class ImageContext {
|
|||||||
@Min(value = 0, message = "随机数种子不能小于0")
|
@Min(value = 0, message = "随机数种子不能小于0")
|
||||||
@Max(value = 2147483647, message = "随机数种子不能大于2147483647")
|
@Max(value = 2147483647, message = "随机数种子不能大于2147483647")
|
||||||
private Integer seed;
|
private Integer seed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参考图 URL(图生图用)
|
||||||
|
*/
|
||||||
|
private String image;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package org.ruoyi.common.chat.entity.media;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unified media generation response.
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
public class MediaGenerationResponse {
|
||||||
|
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
private String mimeType;
|
||||||
|
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
private String b64Json;
|
||||||
|
|
||||||
|
private String dataUrl;
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
private String rawResponse;
|
||||||
|
|
||||||
|
/** 末帧图片 URL(Atlas return_last_frame=true 时返回,用于下一镜首帧承接) */
|
||||||
|
private String lastFrameUrl;
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package org.ruoyi.common.chat.entity.video;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.ruoyi.common.chat.domain.vo.chat.ChatModelVo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Text-to-video context.
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
public class VideoContext {
|
||||||
|
|
||||||
|
@NotNull(message = "模型配置不能为空")
|
||||||
|
private ChatModelVo chatModelVo;
|
||||||
|
|
||||||
|
@NotBlank(message = "提示词不能为空")
|
||||||
|
private String prompt;
|
||||||
|
|
||||||
|
private String size;
|
||||||
|
|
||||||
|
private Integer seconds;
|
||||||
|
|
||||||
|
private String quality;
|
||||||
|
|
||||||
|
/** 参考图 URL(图生视频模式,单图) */
|
||||||
|
private String imageUrl;
|
||||||
|
|
||||||
|
/** 多参考图 URL(多参考图生视频模式,配合 @imageN prompt 使用) */
|
||||||
|
private java.util.List<String> referenceImages;
|
||||||
|
|
||||||
|
/** 参考音频 URL 列表(对白口型对齐模式) */
|
||||||
|
private java.util.List<String> referenceAudios;
|
||||||
|
|
||||||
|
/** 是否让模型生成同步音频(环境音/动效) */
|
||||||
|
private Boolean generateAudio;
|
||||||
|
|
||||||
|
/** 是否要求返回末帧,用于下一镜首帧承接 */
|
||||||
|
private Boolean returnLastFrame;
|
||||||
|
|
||||||
|
/** 上一镜末帧 URL(同场景连续镜头首帧承接用,作为额外参考图传入) */
|
||||||
|
private String lastFrameUrl;
|
||||||
|
|
||||||
|
private String videoId;
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package org.ruoyi.common.chat.factory;
|
||||||
|
|
||||||
|
import org.ruoyi.common.chat.service.audio.IAudioGenerationService;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Text-to-speech service factory.
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class AudioServiceFactory implements ApplicationContextAware {
|
||||||
|
|
||||||
|
private final Map<String, IAudioGenerationService> audioServiceMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||||
|
Map<String, IAudioGenerationService> serviceMap = applicationContext.getBeansOfType(IAudioGenerationService.class);
|
||||||
|
for (IAudioGenerationService service : serviceMap.values()) {
|
||||||
|
if (service != null) {
|
||||||
|
audioServiceMap.put(service.getProviderName(), service);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IAudioGenerationService getOriginalService(String providerCode) {
|
||||||
|
IAudioGenerationService service = audioServiceMap.get(providerCode);
|
||||||
|
if (service == null && "custom_api".equals(providerCode)) {
|
||||||
|
service = audioServiceMap.get("openai");
|
||||||
|
}
|
||||||
|
if (service == null) {
|
||||||
|
throw new IllegalArgumentException("不支持的语音模型供应商: " + providerCode);
|
||||||
|
}
|
||||||
|
return service;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -37,6 +37,9 @@ public class ImageServiceFactory implements ApplicationContextAware {
|
|||||||
*/
|
*/
|
||||||
public IImageGenerationService getOriginalService(String category) {
|
public IImageGenerationService getOriginalService(String category) {
|
||||||
IImageGenerationService service = imageSerivceMap.get(category);
|
IImageGenerationService service = imageSerivceMap.get(category);
|
||||||
|
if (service == null && "custom_api".equals(category)) {
|
||||||
|
service = imageSerivceMap.get("openai");
|
||||||
|
}
|
||||||
if (service == null) {
|
if (service == null) {
|
||||||
throw new IllegalArgumentException("不支持的模型类别: " + category);
|
throw new IllegalArgumentException("不支持的模型类别: " + category);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package org.ruoyi.common.chat.factory;
|
||||||
|
|
||||||
|
import org.ruoyi.common.chat.service.video.IVideoGenerationService;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Text-to-video service factory.
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class VideoServiceFactory implements ApplicationContextAware {
|
||||||
|
|
||||||
|
private final Map<String, IVideoGenerationService> videoServiceMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||||
|
Map<String, IVideoGenerationService> serviceMap = applicationContext.getBeansOfType(IVideoGenerationService.class);
|
||||||
|
for (IVideoGenerationService service : serviceMap.values()) {
|
||||||
|
if (service != null) {
|
||||||
|
videoServiceMap.put(service.getProviderName(), service);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IVideoGenerationService getOriginalService(String providerCode) {
|
||||||
|
IVideoGenerationService service = videoServiceMap.get(providerCode);
|
||||||
|
if (service == null && "custom_api".equals(providerCode)) {
|
||||||
|
service = videoServiceMap.get("openai");
|
||||||
|
}
|
||||||
|
if (service == null) {
|
||||||
|
throw new IllegalArgumentException("不支持的视频模型供应商: " + providerCode);
|
||||||
|
}
|
||||||
|
return service;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package org.ruoyi.common.chat.service.audio;
|
||||||
|
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import org.ruoyi.common.chat.entity.audio.AudioContext;
|
||||||
|
import org.ruoyi.common.chat.entity.media.MediaGenerationResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public text-to-speech service.
|
||||||
|
*/
|
||||||
|
public interface IAudioGenerationService {
|
||||||
|
|
||||||
|
MediaGenerationResponse generateSpeech(@Valid AudioContext audioContext);
|
||||||
|
|
||||||
|
String getProviderName();
|
||||||
|
}
|
||||||
@@ -73,4 +73,13 @@ public interface IChatModelService {
|
|||||||
* @return 是否删除成功
|
* @return 是否删除成功
|
||||||
*/
|
*/
|
||||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按厂商批量更新密钥
|
||||||
|
*
|
||||||
|
* @param providerCode 厂商编码
|
||||||
|
* @param apiKey 密钥
|
||||||
|
* @return 是否更新成功
|
||||||
|
*/
|
||||||
|
Boolean updateApiKeyByProvider(String providerCode, String apiKey);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package org.ruoyi.common.chat.service.image;
|
|||||||
|
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import org.ruoyi.common.chat.entity.image.ImageContext;
|
import org.ruoyi.common.chat.entity.image.ImageContext;
|
||||||
|
import org.ruoyi.common.chat.entity.media.MediaGenerationResponse;
|
||||||
|
import org.ruoyi.common.chat.domain.vo.chat.ChatModelVo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 公共文生图接口
|
* 公共文生图接口
|
||||||
@@ -9,10 +11,31 @@ import org.ruoyi.common.chat.entity.image.ImageContext;
|
|||||||
public interface IImageGenerationService {
|
public interface IImageGenerationService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据文字生成图片
|
* 根据文字生成图片(同步阻塞,返回 URL)
|
||||||
*/
|
*/
|
||||||
String generateImage(@Valid ImageContext imageContext);
|
String generateImage(@Valid ImageContext imageContext);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异步启动图片生成(返回 prediction 信息,用于轮询进度)
|
||||||
|
* 默认回退到同步模式
|
||||||
|
*/
|
||||||
|
default MediaGenerationResponse startImageGeneration(@Valid ImageContext imageContext) {
|
||||||
|
String url = generateImage(imageContext);
|
||||||
|
return MediaGenerationResponse.builder()
|
||||||
|
.type("image")
|
||||||
|
.url(url)
|
||||||
|
.status("completed")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上传图生图/图生视频使用的临时媒体文件。
|
||||||
|
* 不支持上传的供应商保持默认异常,避免静默回退到错误存储。
|
||||||
|
*/
|
||||||
|
default String uploadMedia(ChatModelVo model, byte[] content, String fileName, String contentType) {
|
||||||
|
throw new UnsupportedOperationException("当前图片供应商不支持临时媒体上传");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取服务提供商名称
|
* 获取服务提供商名称
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package org.ruoyi.common.chat.service.video;
|
||||||
|
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import org.ruoyi.common.chat.entity.media.MediaGenerationResponse;
|
||||||
|
import org.ruoyi.common.chat.entity.video.VideoContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public text-to-video service.
|
||||||
|
*/
|
||||||
|
public interface IVideoGenerationService {
|
||||||
|
|
||||||
|
MediaGenerationResponse generateVideo(@Valid VideoContext videoContext);
|
||||||
|
|
||||||
|
MediaGenerationResponse retrieveVideo(@Valid VideoContext videoContext);
|
||||||
|
|
||||||
|
String getProviderName();
|
||||||
|
}
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
package org.ruoyi.common.core.service;
|
package org.ruoyi.common.core.service;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import org.ruoyi.common.core.domain.dto.OssDTO;
|
import org.ruoyi.common.core.domain.dto.OssDTO;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -33,5 +36,19 @@ public interface OssService {
|
|||||||
*/
|
*/
|
||||||
OssDTO uploadFile(MultipartFile file);
|
OssDTO uploadFile(MultipartFile file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upload a server-side file without buffering the complete payload in memory.
|
||||||
|
*/
|
||||||
|
OssDTO uploadFile(File file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stream an object as an authenticated attachment response.
|
||||||
|
*/
|
||||||
|
void downloadFile(Long ossId, HttpServletResponse response) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete one object and its sys_oss metadata.
|
||||||
|
*/
|
||||||
|
Boolean deleteFile(Long ossId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ public class OssClient {
|
|||||||
client.deleteObject(
|
client.deleteObject(
|
||||||
x -> x.bucket(properties.getBucketName())
|
x -> x.bucket(properties.getBucketName())
|
||||||
.key(removeBaseUrl(path))
|
.key(removeBaseUrl(path))
|
||||||
.build());
|
.build()).join();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new OssException("删除文件失败,请检查配置信息:[" + e.getMessage() + "]");
|
throw new OssException("删除文件失败,请检查配置信息:[" + e.getMessage() + "]");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ spring:
|
|||||||
application:
|
application:
|
||||||
name: ruoyi-monitor-admin
|
name: ruoyi-monitor-admin
|
||||||
profiles:
|
profiles:
|
||||||
active: @profiles.active@
|
active: ${SPRING_PROFILES_ACTIVE:dev}
|
||||||
|
|
||||||
logging:
|
logging:
|
||||||
config: classpath:logback-plus.xml
|
config: classpath:logback-plus.xml
|
||||||
@@ -13,8 +13,8 @@ logging:
|
|||||||
spring:
|
spring:
|
||||||
security:
|
security:
|
||||||
user:
|
user:
|
||||||
name: @monitor.username@
|
name: ${MONITOR_USERNAME:ruoyi}
|
||||||
password: @monitor.password@
|
password: ${MONITOR_PASSWORD:123456}
|
||||||
boot:
|
boot:
|
||||||
admin:
|
admin:
|
||||||
ui:
|
ui:
|
||||||
@@ -47,5 +47,5 @@ spring.boot.admin.client:
|
|||||||
metadata:
|
metadata:
|
||||||
username: ${spring.boot.admin.client.username}
|
username: ${spring.boot.admin.client.username}
|
||||||
userpassword: ${spring.boot.admin.client.password}
|
userpassword: ${spring.boot.admin.client.password}
|
||||||
username: @monitor.username@
|
username: ${MONITOR_USERNAME:ruoyi}
|
||||||
password: @monitor.password@
|
password: ${MONITOR_PASSWORD:123456}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ spring:
|
|||||||
datasource:
|
datasource:
|
||||||
type: com.zaxxer.hikari.HikariDataSource
|
type: com.zaxxer.hikari.HikariDataSource
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
url: jdbc:mysql://localhost:3306/snail_job?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||||
username: root
|
username: root
|
||||||
password: root
|
password: root
|
||||||
hikari:
|
hikari:
|
||||||
@@ -47,5 +47,5 @@ spring.boot.admin.client:
|
|||||||
metadata:
|
metadata:
|
||||||
username: ${spring.boot.admin.client.username}
|
username: ${spring.boot.admin.client.username}
|
||||||
userpassword: ${spring.boot.admin.client.password}
|
userpassword: ${spring.boot.admin.client.password}
|
||||||
username: @monitor.username@
|
username: ${MONITOR_USERNAME:ruoyi}
|
||||||
password: @monitor.password@
|
password: ${MONITOR_PASSWORD:123456}
|
||||||
|
|||||||
@@ -47,5 +47,5 @@ spring.boot.admin.client:
|
|||||||
metadata:
|
metadata:
|
||||||
username: ${spring.boot.admin.client.username}
|
username: ${spring.boot.admin.client.username}
|
||||||
userpassword: ${spring.boot.admin.client.password}
|
userpassword: ${spring.boot.admin.client.password}
|
||||||
username: @monitor.username@
|
username: ${MONITOR_USERNAME:ruoyi}
|
||||||
password: @monitor.password@
|
password: ${MONITOR_PASSWORD:123456}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ spring:
|
|||||||
application:
|
application:
|
||||||
name: ruoyi-snailjob-server
|
name: ruoyi-snailjob-server
|
||||||
profiles:
|
profiles:
|
||||||
active: @profiles.active@
|
active: ${SPRING_PROFILES_ACTIVE:dev}
|
||||||
web:
|
web:
|
||||||
resources:
|
resources:
|
||||||
static-locations: classpath:admin/
|
static-locations: classpath:admin/
|
||||||
|
|||||||
@@ -29,6 +29,12 @@
|
|||||||
<artifactId>ruoyi-common-chat</artifactId>
|
<artifactId>ruoyi-common-chat</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 复用聊天模块的知识库统一检索能力(向量/混合/重排) -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.ruoyi</groupId>
|
||||||
|
<artifactId>ruoyi-chat</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.ruoyi</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-common-web</artifactId>
|
<artifactId>ruoyi-common-web</artifactId>
|
||||||
@@ -72,6 +78,21 @@
|
|||||||
<groupId>com.talanlabs</groupId>
|
<groupId>com.talanlabs</groupId>
|
||||||
<artifactId>avatar-generator-cat</artifactId>
|
<artifactId>avatar-generator-cat</artifactId>
|
||||||
<version>${avatar-generator.version}</version>
|
<version>${avatar-generator.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.javassist</groupId>
|
||||||
|
<artifactId>javassist</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- avatar-generator-cat pulls an obsolete Javassist POM that Maven 3.9
|
||||||
|
warns about. Reflections 0.9.10 is compatible with the maintained
|
||||||
|
drop-in replacement. -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.javassist</groupId>
|
||||||
|
<artifactId>javassist</artifactId>
|
||||||
|
<version>${javassist.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user