# 海光 DCU 接入 HERMES 一条龙
> **目标读者**:已经准备使用海光 DCU 部署本地大模型,并希望把本地模型接入 HERMES / Hermes Agent,同时进一步把 HERMES 扩展成企业级自动办公系统的开发者、运维同学、测试同学和方案设计人员。
> **本文定位**:从整体链路讲清楚“海光 DCU 本地模型服务如何接入 HERMES”,并继续讲清楚 HERMES 如何通过 MCP / Skill 调用桌面、Office、WPS、文件系统和企业内部工具,最终形成一个可扩展的企业级 AI 操作系统雏形。
> **核心思路**:海光 DCU 负责跑模型,vLLM / SGLang 负责把模型发布成 OpenAI Compatible API,HERMES 通过 Custom Endpoint 调用这个 API;MCP 负责把外部系统能力变成标准工具;Skill 负责把具体工作流固化成可复用方法。
---
## 0. 一张图看完整链路
HERMES 并不需要直接识别 DCU。只要 DCU 上的模型服务对外提供 OpenAI 兼容接口,HERMES 就可以像调用云端模型一样调用本地 DCU 模型。
进一步扩展以后,HERMES 也不需要直接内置 PPT、Word、Excel、WPS 或桌面自动化组件,而是通过 MCP 把这些能力接进来。
```mermaid
flowchart TD
A0["用户 / 开发者 / 运维人员"] --> A1["HERMES / Hermes Agent
CLI / Desktop / Gateway"]
subgraph HERMES["HERMES Agent 层"]
A1 --> A2["模型配置
provider: custom / self-hosted"]
A1 --> A3["Agent 能力
Tools / Memory / Skills / Cron"]
A1 --> A4["MCP Client
发现外部工具并注册"]
A2 --> A5["OpenAI Compatible Client"]
end
A5 --> B0["HTTP API
http://DCU服务器:8001/v1"]
subgraph SERVE["模型服务层"]
B0 --> B1["vLLM / SGLang Server"]
B1 --> B2["/v1/chat/completions"]
B1 --> B3["/v1/models"]
B1 --> B4["tool calls / streaming / long context"]
end
subgraph DCU["海光 DCU 运行环境"]
B1 --> C1["DCU 适配镜像
vLLM / SGLang / DAS"]
C1 --> C2["DTK / HIP Runtime
数学库 / 通信库 / 编译器"]
C2 --> C3["DCU 驱动与设备节点
/dev/kfd /dev/dri /dev/mkfd"]
C3 --> C4["海光 DCU 显卡
K100 / K100_AI / BW 系列等"]
end
subgraph MCP["MCP / Skill 执行扩展层"]
A4 --> M1["Filesystem MCP
读写文件"]
A4 --> M2["Office MCP
Word / Excel / PPT"]
A4 --> M3["WPS MCP
WPS文字 / 表格 / 演示"]
A4 --> M4["Desktop MCP
Windows UI 自动化"]
A4 --> M5["Database / Browser / Internal API MCP"]
A3 --> S1["Skill
把流程固化成方法"]
end
subgraph DATA["资源来源"]
D1["光合开发者社区
驱动 / DTK / DAS"]
D2["光源
镜像 / 模型仓库"]
D3["ModelZoo README
模型对应镜像和启动参数"]
end
D1 --> C2
D2 --> C1
D3 --> B1
```
这一张图可以把整篇文章总结成三句话:
1. **DCU 不直接接 HERMES,DCU 先通过 vLLM / SGLang 变成 OpenAI Compatible API。**
2. **HERMES 不直接接 Office / WPS / 桌面,HERMES 通过 MCP 把这些能力变成工具。**
3. **企业级 AI 操作系统不是单一模型,而是“模型服务 + Agent 调度 + MCP 执行层 + 权限审计”的组合。**
---
## 1. 先讲清楚几个概念
### 1.1 DCU 驱动、DTK、DAS、镜像、模型仓库分别做什么?
可以把海光 DCU 大模型运行环境理解成五层:
| 层级 | 作用 | 本文处理方式 |
|---|---|---|
| DCU 驱动 | 让操作系统识别并调度 DCU 设备 | 驱动是底座,设备节点不正常时不要继续排查上层 |
| DTK | 海光 DCU 的开发和运行基础套件,包含运行时、数学库、通信库、编译器、调试优化工具等 | 需要与镜像、PyTorch、vLLM、模型版本匹配 |
| DAS / 深度学习栈 | 面向 AI 框架和推理训练场景的适配软件栈 | 按模型仓库 README 选择,不要随意混搭 |
| 镜像 | 已经集成好 DTK / PyTorch / vLLM / SGLang 等组件的容器环境 | 优先使用官方或 ModelZoo 推荐镜像 |
| 模型仓库 | 存放模型说明、权重入口、推荐镜像、启动命令 | 本文以 Qwen3.6 为例,其他模型同理 |
官方入口:
- 光合资源工具页:
- DTK 页面:
- 光源镜像 / 模型仓库入口:
- 光合论坛首页:
- Qwen3.6 ModelZoo 示例入口:
### 1.2 HERMES 是什么?
在本文语境里,HERMES 指 **NousResearch Hermes Agent**。
它的角色不是“显卡驱动”,也不是“vLLM 服务”,而是:
```text
HERMES = Agent 调度层 + 模型客户端 + 工具路由器 + Skill/Memory/Cron 工作流系统
```
它调用模型时,只关心模型服务是否能提供标准接口:
```text
/v1/chat/completions
/v1/models
```
也就是说,HERMES 不需要知道底层是海光 DCU、NVIDIA CUDA、AMD ROCm,还是 CPU;它只需要能访问 OpenAI Compatible API。
### 1.3 MCP 是什么?
MCP,全称 **Model Context Protocol**,可以理解成:
```text
MCP = 把外部系统能力标准化成 AI 可调用工具的协议层
```
它解决的问题是:模型不能直接操作电脑、数据库、浏览器、WPS、Office、内部系统,但是 MCP Server 可以把这些能力暴露成标准工具,然后 HERMES 发现这些工具并调用。
```mermaid
flowchart LR
A["用户自然语言任务"] --> B["HERMES"]
B --> C["本地模型判断是否需要工具"]
C --> D["tool_call"]
D --> E["MCP Server"]
E --> F["真实系统
文件 / 桌面 / Office / WPS / 数据库"]
F --> G["执行结果"]
G --> B
```
### 1.4 Skill 是什么?
Skill 不是直接执行工具的接口,而是“把经验固化成可复用流程”。
例如:
- “生成周报”是一套流程;
- “分析 Excel 并生成 PPT”是一套流程;
- “读取项目目录并总结架构”是一套流程;
- “用 WPS 打开文档、提取正文、调用本地模型改写、再写回文档”也是一套流程。
MCP 更像“工具箱”,Skill 更像“操作手册”。
```mermaid
flowchart TD
A["Skill:说明怎么做"] --> B["拆任务"]
B --> C["调用 MCP 工具"]
C --> D["执行文件 / 桌面 / Office / WPS 操作"]
D --> E["把结果交回模型总结"]
```
### 1.5 WPS 能不能接入本地模型?
能,但要分清楚两种情况。
第一种是 **WPS 产品本身是否提供可配置本地模型 Base URL 的 AI 入口**。这个取决于 WPS 具体版本、企业授权和开放平台能力,不能假设每个个人版 WPS 都有一个直接填写 `http://本地模型/v1` 的入口。
第二种是 **通过插件、宏、COM、UI 自动化或 MCP 桥接,让 WPS 文档内容走本地模型处理**。这种方式是可落地的,本文重点讲这一种:
```mermaid
flowchart LR
A["WPS 文档"] --> B["WPS 插件 / JS API / COM / UIA"]
B --> C["WPS MCP Server"]
C --> D["HERMES"]
D --> E["本地 vLLM / SGLang 模型"]
E --> F["生成 / 改写 / 总结结果"]
F --> C
C --> G["写回 WPS 文档"]
```
---
## 2. 基础环境安装与检查
### 2.1 驱动安装后的最小检查
驱动是最底层。驱动安装完成后,宿主机需要能够看到 DCU 相关设备节点:
```bash
ls -l /dev/kfd
ls -l /dev/dri
ls -l /dev/mkfd
```
如果设备节点不存在,后面的容器、vLLM、HERMES、MCP 都不用继续排查,应先回到驱动层处理。
常见搜索关键词:
```text
海光 DCU 驱动安装
DCU 驱动
K100 驱动
DTK 驱动
```
### 2.2 DTK 安装后的最小检查
DTK 是 DCU 应用开发、运行和优化的基础工具套件。安装后应检查运行时和工具链是否可用:
```bash
which hy-smi || true
which hipcc || true
hy-smi
```
如果 `hy-smi` 能看到卡、温度、显存、功耗等信息,说明驱动和设备识别已经进入可用状态。
### 2.3 DAS、PyTorch、vLLM、SGLang 的选择原则
本文不推荐从零编译深度学习环境。更稳定的路径是:
```mermaid
flowchart LR
A["确定目标模型"] --> B["查看 ModelZoo README"]
B --> C["使用 README 推荐镜像"]
C --> D["按 README 启动 vLLM / SGLang"]
D --> E["暴露 OpenAI Compatible API"]
E --> F["HERMES 接入 API"]
```
模型仓库 README 写了用哪个镜像、哪个启动命令,就优先用它。
如果为了优化性能需要自己编译 vLLM / kernel,也应先完成官方推荐路径的基线验证,再进入自编译优化阶段。
---
## 3. 部署拓扑
### 3.1 HERMES 和 vLLM 在同一台 DCU 服务器上
适合本地测试、单机开发:
```mermaid
flowchart LR
U["用户"] --> H["DCU 服务器上的 HERMES"]
H -->|"http://127.0.0.1:8001/v1"| V["本机 vLLM"]
V --> M["本地模型权重"]
V --> D["海光 DCU"]
```
HERMES 配置中的 Base URL:
```text
http://127.0.0.1:8001/v1
```
### 3.2 HERMES 在办公机,vLLM 在 DCU 服务器上
适合内网多人使用:
```mermaid
flowchart LR
U["用户电脑 / 运维机 / Windows Desktop"] --> H["HERMES Agent"]
H -->|"OpenAI Compatible API"| V["DCU 服务器上的 vLLM
http://DCU服务器IP:8001/v1"]
V --> M["本地模型权重"]
V --> D["海光 DCU"]
```
HERMES 配置中的 Base URL:
```text
http://:8001/v1
```
### 3.3 Windows Hermes Desktop + 远程 DCU 模型
适合办公场景。用户在 Windows 上使用 Hermes Desktop,模型跑在内网 DCU 服务器上。
```mermaid
flowchart TD
A["Windows 用户"] --> B["Hermes Desktop"]
B --> C["Custom Provider
Base URL = http://DCU服务器IP:8001/v1"]
C --> D["DCU 服务器 vLLM / SGLang"]
D --> E["海光 DCU 推理"]
B --> F["本机 MCP
Desktop / Office / WPS"]
F --> G["Windows 桌面与办公软件"]
```
这个拓扑的关键点是:
- 模型推理发生在 DCU 服务器;
- 桌面、Office、WPS 操作发生在 Windows 用户机;
- HERMES 负责把“模型推理”和“本地工具执行”串起来。
### 3.4 企业级拓扑
企业级环境不应让每个客户端直接管理所有能力,而是引入网关、权限和审计。
```mermaid
flowchart TD
Users["多用户终端
Hermes Desktop / CLI / Web"] --> APIGW["API Gateway / 内网入口"]
APIGW --> HermesCluster["Hermes Agent 集群"]
HermesCluster --> Router["模型路由 / Policy Engine"]
Router --> VLLM1["vLLM 实例 A
办公模型"]
Router --> VLLM2["vLLM 实例 B
代码模型"]
Router --> VLLM3["vLLM 实例 C
语音/ASR模型"]
VLLM1 --> DCU["DCU / GPU 集群"]
VLLM2 --> DCU
VLLM3 --> DCU
HermesCluster --> MCPGW["MCP Gateway"]
MCPGW --> OfficeMCP["Office / WPS MCP"]
MCPGW --> DesktopMCP["Desktop RPA MCP"]
MCPGW --> DataMCP["Database / File / API MCP"]
MCPGW --> Audit["审计日志"]
APIGW --> Auth["认证 / RBAC / 租户隔离"]
```
---
## 4. 在海光 DCU 上启动模型服务
以下以 **Qwen3.6-27B + vLLM** 为例。其他模型应以对应 ModelZoo README 为准,不要直接照搬参数。
### 4.1 进入官方推荐镜像
Qwen3.6 README 中给出的 vLLM 镜像示例:
```text
harbor.sourcefind.cn:5443/dcu/admin/base/custom:vllm018-ubuntu22.04-dtk26.04-qwen3.6-20260423
```
容器启动示例:
```bash
docker run -it \
--shm-size 256g \
--network=host \
--name qwen3.6-hermes-demo \
--privileged \
--device=/dev/kfd \
--device=/dev/dri \
--device=/dev/mkfd \
--group-add video \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
-u root \
-v /opt/hyhal/:/opt/hyhal/:ro \
-v /data/models/:/data/models/ \
harbor.sourcefind.cn:5443/dcu/admin/base/custom:vllm018-ubuntu22.04-dtk26.04-qwen3.6-20260423 \
bash
```
关键参数说明:
| 参数 | 含义 |
|---|---|
| `--device=/dev/kfd` | DCU / HIP 运行时需要的设备入口 |
| `--device=/dev/dri` | 图形 / 计算设备节点 |
| `--device=/dev/mkfd` | 海光 DCU 场景中常见的设备节点 |
| `-v /opt/hyhal/:/opt/hyhal/:ro` | 挂载宿主机侧 DCU 相关运行组件 |
| `--network=host` | 让容器中的 vLLM 端口直接暴露到宿主机 |
| `-v /data/models/:/data/models/` | 挂载模型权重目录 |
| `--shm-size 256g` | 给大模型推理提供足够共享内存,具体数值按服务器配置调整 |
### 4.2 启动 vLLM OpenAI 兼容接口
如果直接使用在线模型名:
```bash
vllm serve Qwen/Qwen3.6-27B \
--port 8001 \
--trust-remote-code \
--dtype bfloat16 \
--gpu-memory-utilization 0.9 \
--max-model-len 65536 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
--reasoning-parser qwen3
```
如果已经把模型下载到了本地:
```bash
vllm serve /data/models/Qwen3.6-27B \
--served-model-name qwen3.6-dcu \
--port 8001 \
--trust-remote-code \
--dtype bfloat16 \
--gpu-memory-utilization 0.9 \
--max-model-len 65536 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
--reasoning-parser qwen3
```
参数说明:
| 参数 | 说明 |
|---|---|
| `--served-model-name qwen3.6-dcu` | 对外暴露给 HERMES 的模型名 |
| `--port 8001` | vLLM 服务端口 |
| `--trust-remote-code` | 允许加载模型仓库中的自定义代码,部分模型需要 |
| `--dtype bfloat16` | 使用 bfloat16 推理,具体以模型和镜像支持为准 |
| `--gpu-memory-utilization 0.9` | 控制显存利用率,显存不足时可适当降低 |
| `--max-model-len 65536` | 给 Agent 场景预留较长上下文窗口 |
| `--enable-auto-tool-choice` | 允许 OpenAI 工具调用风格 |
| `--tool-call-parser qwen3_coder` | 让 vLLM 正确解析 Qwen3.6 的工具调用格式 |
| `--reasoning-parser qwen3` | 适配 Qwen3 系列 reasoning 输出 |
不同模型的 parser、上下文长度、dtype、张量并行参数可能不同,最终以模型 README 和镜像说明为准。
### 4.3 验证 vLLM 服务
先看模型列表:
```bash
curl http://127.0.0.1:8001/v1/models
```
如果 HERMES 不在 DCU 服务器本机,而是在另一台机器上,则从 HERMES 所在机器测试:
```bash
curl http://:8001/v1/models
```
再发一条普通对话请求:
```bash
curl http://127.0.0.1:8001/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.6-dcu",
"messages": [
{"role": "user", "content": "你好,请用一句话介绍你自己。"}
],
"temperature": 0.7,
"max_tokens": 256
}'
```
如果能返回正常文本,说明下面这条链路已经打通:
```mermaid
flowchart LR
A["DCU 驱动"] --> B["DTK / DAS"]
B --> C["vLLM 容器"]
C --> D["模型权重"]
D --> E["OpenAI Compatible API"]
```
### 4.4 让 vLLM 面向内网访问
如果 HERMES 在另一台机器上,vLLM 需要被内网访问。常见检查命令:
```bash
ss -lntp | grep 8001 || true
curl http://127.0.0.1:8001/v1/models
hostname -I
```
从 Windows 机器测试:
```powershell
curl.exe http://:8001/v1/models
```
如果服务器本机能访问、Windows 不能访问,重点检查:
```bash
sudo ufw status
sudo iptables -S | grep 8001 || true
```
---
## 5. 安装 HERMES / Hermes Agent
本文中的 HERMES 指 **NousResearch Hermes Agent**,命令行为:
```bash
hermes
```
Hermes Agent 官方安装文档:
```text
https://hermes-agent.nousresearch.com/docs/getting-started/installation
```
Linux / macOS / WSL2 安装命令:
```bash
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
```
Windows PowerShell 安装命令:
```powershell
iex (irm https://hermes-agent.nousresearch.com/install.ps1)
```
安装完成后,Linux / macOS / WSL2 通常需要重新加载 shell:
```bash
source ~/.bashrc
# 或
source ~/.zshrc
```
验证安装:
```bash
hermes --version
hermes doctor
```
---
## 6. 让 HERMES 接入本地 DCU 模型
HERMES 接入本地模型的核心不是“识别 DCU”,而是配置一个 OpenAI 兼容的模型端点。
模型端点格式通常是:
```text
http://:8001/v1
```
Hermes Agent 自定义模型端点文档:
```text
https://hermes-agent.nousresearch.com/docs/integrations/providers
```
### 6.1 方式一:交互式配置
在安装 HERMES 的机器上执行:
```bash
hermes model
```
选择自托管或自定义端点类型,填写:
```text
Base URL: http://:8001/v1
Model: qwen3.6-dcu
API Key: 本地测试可留空;生产环境使用网关或 token
Context length: 65536
```
如果 HERMES 和 vLLM 在同一台机器:
```text
http://127.0.0.1:8001/v1
```
如果 HERMES 在办公机,vLLM 在 DCU 服务器:
```text
http://:8001/v1
```
模型名必须与 `/v1/models` 返回的模型名一致。可以用下面命令确认:
```bash
curl http://:8001/v1/models
```
### 6.2 方式二:手动修改配置文件
打开 HERMES 配置文件:
```bash
vim ~/.hermes/config.yaml
```
单机示例:
```yaml
model:
provider: custom
default: qwen3.6-dcu
base_url: http://127.0.0.1:8001/v1
api_key: ""
context_length: 65536
```
远程 DCU 服务器示例:
```yaml
model:
provider: custom
default: qwen3.6-dcu
base_url: http://192.168.10.88:8001/v1
api_key: ""
context_length: 65536
```
其中:
| 配置项 | 含义 |
|---|---|
| `provider: custom` | 使用自定义模型服务商 |
| `default: qwen3.6-dcu` | 默认调用的模型名 |
| `base_url` | vLLM / SGLang 暴露的 OpenAI 兼容接口地址 |
| `api_key` | 本地测试可为空,生产环境应设置 |
| `context_length` | 上下文长度,建议与 vLLM 的 `--max-model-len` 对齐 |
### 6.3 Windows Desktop Hermes 接入远程 DCU 模型
Windows Desktop 版本的 Hermes 可以理解成:
```text
Hermes Desktop = UI + Agent Runtime + OpenAI API Client + 本机工具执行入口
```
工作原理:
```mermaid
flowchart LR
A["Windows Hermes Desktop"] --> B["Custom Provider"]
B --> C["http://DCU服务器IP:8001/v1"]
C --> D["vLLM / SGLang"]
D --> E["海光 DCU"]
A --> F["本机 MCP 工具"]
F --> G["Windows / Office / WPS / 文件系统"]
```
Windows 上先验证 DCU 服务:
```powershell
curl.exe http://:8001/v1/models
```
再在 Hermes Desktop 的模型配置里填:
```text
Provider: Custom / Self-hosted / OpenAI Compatible
Base URL: http://:8001/v1
Model: qwen3.6-dcu
API Key: 本地测试可为空;生产环境使用网关 token
```
完成后测试一句:
```text
只回复 HERMES_DCU_OK,不要解释。
```
如果返回:
```text
HERMES_DCU_OK
```
说明 Windows Hermes Desktop 已经通过远程 DCU 模型服务回答。
---
## 7. HERMES 实际请求链路
成功接入后,HERMES 的每一次对话请求大致会经过下面的链路:
```mermaid
sequenceDiagram
participant User as 用户
participant Hermes as HERMES Agent
participant API as vLLM OpenAI API
participant Model as Qwen3.6 on DCU
participant DCU as 海光 DCU
User->>Hermes: 输入任务
Hermes->>Hermes: 组织系统提示词 / 工具 / 记忆
Hermes->>API: POST /v1/chat/completions
API->>Model: 推理请求
Model->>DCU: 使用 DCU 加速计算
DCU-->>Model: 返回计算结果
Model-->>API: tokens / tool calls / reasoning
API-->>Hermes: OpenAI 兼容响应
Hermes-->>User: 最终回答
```
HERMES 关注的是:
```text
这个模型接口能不能按 OpenAI 格式响应?
```
DCU、DTK、DAS、vLLM 的细节,则在模型服务端解决。
---
## 8. MCP 接入 HERMES:从原理到可执行配置
### 8.1 MCP 的执行模型
MCP 的本质是:
```text
MCP Server = 一个独立进程 / HTTP 服务 + 工具清单 + 工具执行逻辑
```
HERMES 启动时连接 MCP Server,读取它暴露的工具 schema,然后把这些工具交给模型选择。
```mermaid
sequenceDiagram
participant Hermes as HERMES
participant MCP as MCP Server
participant LLM as 本地模型
participant OS as 外部系统
Hermes->>MCP: 启动/连接 MCP Server
MCP-->>Hermes: 返回 tools/list
Hermes->>LLM: prompt + tools schema
LLM-->>Hermes: tool_call
Hermes->>MCP: tool_call arguments
MCP->>OS: 执行文件/桌面/Office/WPS操作
OS-->>MCP: 执行结果
MCP-->>Hermes: result
Hermes->>LLM: tool result
LLM-->>Hermes: 最终回答
```
### 8.2 MCP 的两种服务形态
| 类型 | 运行方式 | 场景 |
|---|---|---|
| stdio MCP | HERMES 启动一个本地进程,通过 stdin/stdout 通信 | 文件系统、桌面自动化、本机 Office/WPS |
| HTTP MCP | HERMES 连接一个远程 HTTP MCP 服务 | 企业内部 API、数据库、集中式 Office/WPS 执行集群 |
### 8.3 配置一个最小 filesystem MCP
先用文件系统 MCP 验证 HERMES 的 MCP 能力。
Linux / WSL2 示例:
```yaml
mcp_servers:
project_fs:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/my-project"]
```
Windows 示例:
```yaml
mcp_servers:
project_fs:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-filesystem", "D:\\projects"]
```
保存后启动:
```bash
hermes chat
```
在 HERMES 里输入:
```text
读取项目目录并总结文件结构。
```
如果 HERMES 能列出目录、读取文件并总结,说明 MCP 基础链路已经通了。
### 8.4 生产环境要限制 MCP 工具范围
文件系统、桌面、Office、WPS 都属于能改变真实世界状态的工具。企业环境应只开放必要工具。
配置形态:
```yaml
mcp_servers:
project_fs:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-filesystem", "/data/hermes-workspace"]
tools:
include:
- read_file
- list_directory
- write_file
```
原则:
```text
能只读就不要写
能限制目录就不要放全盘
能限制工具就不要暴露全部工具
```
---
## 9. Skill:把 MCP 工具组合成稳定工作流
MCP 负责“能做什么”,Skill 负责“怎么稳定地做”。
### 9.1 Skill 和 MCP 的关系
```mermaid
flowchart TD
A["用户:生成周报并做PPT"] --> B["Skill:周报生成流程"]
B --> C["读取数据文件"]
C --> D["调用 Excel MCP 分析"]
D --> E["调用 Word MCP 写报告"]
E --> F["调用 PPT MCP 做汇报"]
F --> G["返回报告路径和PPT路径"]
```
### 9.2 一个办公自动化 Skill 的内容结构
文件名可以命名为:
```text
office-report/SKILL.md
```
内容:
```markdown
# Office Report Skill
## 触发条件
当用户要求生成周报、月报、汇报材料、PPT、Excel 分析或 Word 报告时使用。
## 工作原则
1. 先判断输入数据来源。
2. 如果是 Excel/CSV,先读取并检查字段。
3. 先生成报告大纲,再生成文档。
4. Office/WPS 文件必须保存到用户指定目录或工作区目录。
5. 修改现有文件前先生成副本。
6. 最终回答必须包含输出文件路径和处理摘要。
## 可用工具
- filesystem MCP
- office MCP
- wps MCP
- desktop MCP
## 标准流程
1. 读取用户提供的数据文件。
2. 分析数据结构。
3. 生成报告大纲。
4. 生成 Word 报告。
5. 生成 Excel 汇总表。
6. 生成 PPT 汇报。
7. 返回文件路径。
```
Skill 的价值是让 HERMES 不只是“临时会做”,而是每次遇到同类任务都按固定流程执行。
---
## 10. Desktop MCP:Windows 桌面自动化
### 10.1 Desktop 自动化的本质
桌面自动化不是模型直接移动鼠标,而是 HERMES 通过 MCP 调用一个桌面自动化服务,由这个服务操作 Windows UI。
```mermaid
flowchart TD
A["用户任务"] --> B["HERMES"]
B --> C["模型判断需要桌面工具"]
C --> D["Desktop MCP"]
D --> E["UI Automation / Win32 / pywinauto"]
E --> F["真实 Windows 应用"]
F --> G["执行结果"]
```
技术路径有三类:
| 路径 | 说明 | 适合场景 |
|---|---|---|
| UI Automation / UIA | 读取控件树,按控件名、类型、AutomationId 定位 | 稳定桌面软件 |
| Win32 API | 按窗口句柄、进程、控件类名操作 | 老式 Win32 软件 |
| 键盘鼠标模拟 | 模拟输入和点击 | 没有良好 UIA 支持的软件 |
### 10.2 Windows 上准备 Desktop 自动化环境
在 Windows PowerShell 执行:
```powershell
py -m pip install -U pip
py -m pip install pywinauto pywin32 mcp
```
### 10.3 最小桌面操作验证
创建文件:
```powershell
mkdir C:\hermes-mcp -Force
notepad C:\hermes-mcp\desktop_test.py
```
写入:
```python
from pywinauto import Application
import time
app = Application(backend="uia").start("notepad.exe")
time.sleep(1)
win = app.window(title_re=".*Notepad.*|.*记事本.*")
win.type_keys("Hello Hermes Desktop MCP", with_spaces=True)
time.sleep(1)
print("DESKTOP_AUTOMATION_OK")
```
运行:
```powershell
py C:\hermes-mcp\desktop_test.py
```
看到记事本打开并输入文字,说明本机桌面自动化基础可用。
### 10.4 Desktop MCP 的工具设计
一个 Desktop MCP 不应把“任意鼠标点击”直接暴露给模型。更好的做法是暴露高层动作:
| 工具名 | 参数 | 动作 |
|---|---|---|
| `open_app` | `app_name` | 打开指定软件 |
| `type_text` | `text` | 向当前焦点输入文本 |
| `press_hotkey` | `keys` | 执行快捷键 |
| `find_window` | `title` | 查找窗口 |
| `click_control` | `window_title`, `control_name` | 点击指定控件 |
这样模型调用的是结构化动作,而不是不稳定的坐标。
```mermaid
flowchart LR
A["不推荐:click x=533 y=281"] --> B["易受分辨率影响"]
C["推荐:click_control window='WPS' control='保存'"] --> D["语义稳定"]
```
---
## 11. Office MCP:Word / Excel / PPT 自动化
Office 自动化分两层:
| 层级 | 方式 | 特点 |
|---|---|---|
| 文件级自动化 | `python-docx` / `openpyxl` / `python-pptx` | 不依赖 Office UI,稳定,适合生成新文件 |
| 桌面级自动化 | COM / UIA / Office.js | 可以操作已打开的 Office/WPS 窗口,适合编辑现有文件 |
### 11.1 安装 Office 文件级依赖
Windows:
```powershell
py -m pip install python-docx openpyxl python-pptx pandas matplotlib mcp
```
Linux / WSL2:
```bash
python3 -m pip install python-docx openpyxl python-pptx pandas matplotlib mcp
```
### 11.2 Word 自动生成报告
```python
from docx import Document
from docx.shared import Pt
def create_report(path: str, title: str, sections: list[dict]):
doc = Document()
doc.add_heading(title, level=0)
for sec in sections:
doc.add_heading(sec["heading"], level=1)
doc.add_paragraph(sec["body"])
doc.save(path)
create_report(
"report.docx",
"AI 自动生成项目报告",
[
{"heading": "一、项目概述", "body": "本报告由 Hermes 调用本地模型与 Office MCP 自动生成。"},
{"heading": "二、系统架构", "body": "系统由 DCU 模型服务、Hermes Agent、MCP 执行层组成。"}
]
)
```
### 11.3 Excel 数据分析与汇总
```python
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
wb = Workbook()
ws = wb.active
ws.title = "summary"
rows = [
["部门", "收入"],
["一部", 120],
["二部", 180],
["三部", 150],
]
for row in rows:
ws.append(row)
chart = BarChart()
data = Reference(ws, min_col=2, min_row=1, max_row=4)
cats = Reference(ws, min_col=1, min_row=2, max_row=4)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)
ws.add_chart(chart, "D2")
wb.save("summary.xlsx")
```
### 11.4 PPT 自动生成
```python
from pptx import Presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "Hermes + DCU 企业级 AI 办公系统"
slide.placeholders[1].text = "本地模型 + MCP + Office/WPS 自动化"
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "系统组成"
slide.placeholders[1].text = "1. 海光 DCU 模型服务\n2. Hermes Agent\n3. MCP 工具层\n4. Office / WPS / Desktop 自动化"
prs.save("hermes_ai_office.pptx")
```
### 11.5 Office MCP 最小实现思路
创建:
```powershell
mkdir C:\hermes-mcp -Force
notepad C:\hermes-mcp\office_mcp.py
```
写入:
```python
from mcp.server.fastmcp import FastMCP
from docx import Document
from openpyxl import Workbook
from pptx import Presentation
mcp = FastMCP("office-local")
@mcp.tool()
def create_docx(path: str, title: str, body: str) -> str:
doc = Document()
doc.add_heading(title, level=0)
doc.add_paragraph(body)
doc.save(path)
return f"created docx: {path}"
@mcp.tool()
def create_xlsx(path: str, rows: list[list[str]]) -> str:
wb = Workbook()
ws = wb.active
for row in rows:
ws.append(row)
wb.save(path)
return f"created xlsx: {path}"
@mcp.tool()
def create_pptx(path: str, title: str, bullets: list[str]) -> str:
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = title
slide.placeholders[1].text = "\n".join(bullets)
prs.save(path)
return f"created pptx: {path}"
if __name__ == "__main__":
mcp.run()
```
HERMES 配置:
```yaml
mcp_servers:
office_local:
command: "py"
args: ["C:\\hermes-mcp\\office_mcp.py"]
tools:
include:
- create_docx
- create_xlsx
- create_pptx
```
HERMES 里测试:
```text
调用 office_local 工具,在 C:\hermes-out\ 生成一个标题为“本地AI办公系统”的 PPT,包含三条要点:DCU推理、Hermes调度、MCP执行。
```
执行逻辑:
```mermaid
sequenceDiagram
participant U as 用户
participant H as Hermes
participant L as 本地模型
participant M as Office MCP
participant F as 文件系统
U->>H: 生成PPT
H->>L: prompt + create_pptx工具
L-->>H: tool_call create_pptx
H->>M: create_pptx(path,title,bullets)
M->>F: 写入pptx
F-->>M: 文件生成成功
M-->>H: created pptx
H->>L: 工具结果
L-->>H: 汇报文件路径
```
---
## 12. PPT Master:开源 AI PPT 生成工具接入 HERMES
### 12.1 PPT Master 是什么
PPT Master 是一个开源 AI PPT 生成工作流,它不是传统 SaaS,也不是简单的 `python-pptx` 模板填充脚本。它的核心目标是:把 PDF、DOCX、URL、Markdown、Excel、已有 PPTX 等材料转成**真正可编辑的 PowerPoint 文件**,输出结果是原生 PPTX 里的 DrawingML 形状、文本框、图表和动画,而不是把每页做成一张图片塞进 PPT 里。
这点非常关键。很多“AI 生成 PPT”工具的输出看起来像 PPT,但每页本质是一张图,后期无法逐个编辑元素。PPT Master 的路线是先让 AI 生成 SVG 页面,再通过脚本把 SVG 转成 PowerPoint 原生对象,所以用户可以在 PowerPoint、WPS 演示、Keynote、LibreOffice 里继续编辑文字、形状、颜色和排版。
```mermaid
flowchart LR
A["普通 AI PPT
图片式输出"] --> B["每页是一张图"]
B --> C["后期难编辑"]
D["PPT Master"] --> E["AI 生成 SVG"]
E --> F["SVG 转 DrawingML"]
F --> G["原生可编辑 PPTX"]
```
PPT Master 更准确的定位是:
```text
PPT Master = PPT 生成 Skill / Workflow / Harness
```
也就是说,它本身负责流程、目录结构、脚本、质量检查、SVG 到 PPTX 的转换;最终效果上限主要取决于你接入的模型能力、上下文长度、视觉设计能力和你对工作流的使用熟练度。
### 12.2 它和 python-pptx、普通 Office MCP 的区别
在本文前面的 Office MCP 里,我们已经讲过用 `python-docx`、`openpyxl`、`python-pptx` 生成 Word / Excel / PPT。那为什么还需要 PPT Master?
区别在这里:
| 方案 | 适合场景 | 优点 | 局限 |
|---|---|---|---|
| `python-pptx` | 程序化生成固定结构 PPT | 稳定、简单、可控 | 设计感弱,复杂页面需要大量手写布局 |
| Office/WPS COM | 操作已有 Office/WPS 软件 | 能控制真实软件 | 对桌面环境依赖强,容易受 UI/版本影响 |
| 普通 AI PPT SaaS | 快速出图文 PPT | 上手简单 | 数据可能出内网,格式和可编辑性不一定可控 |
| PPT Master | 从资料生成可编辑高质量 PPT | 工作流完整,原生 PPTX,可用模板,支持多格式资料 | 需要 Agent 执行流程,对模型能力要求较高 |
所以在 HERMES 企业级 AI 操作系统里,三者不是互相替代,而是分工:
```mermaid
flowchart TD
A["企业 PPT 任务"] --> B{"任务类型"}
B -->|"固定报表 / 批量模板"| C["python-pptx Office MCP"]
B -->|"操作已有 WPS / Office 文件"| D["WPS/Office COM MCP"]
B -->|"从资料生成高质量演示稿"| E["PPT Master 工作流"]
B -->|"复用已有品牌模板"| F["PPT Master Template Fill / Create Template"]
```
### 12.3 PPT Master 的核心原理
PPT Master 的主流水线可以拆成九步:
```mermaid
flowchart TD
A["源材料
PDF / DOCX / XLSX / PPTX / URL / Markdown"] --> B["source_to_md
转成 Markdown"]
B --> C["project_manager
创建项目目录"]
C --> D["可选:模板 / 品牌 / 版式"]
D --> E["Strategist
确认页面数量、风格、结构"]
E --> F["Image_Generator
AI图 / 网络图 / 用户素材"]
F --> G["Executor
逐页生成 SVG"]
G --> H["svg_quality_checker
质量检查"]
H --> I["finalize_svg
后处理"]
I --> J["svg_to_pptx
转成原生 PPTX"]
J --> K["exports/_.pptx"]
```
其中最重要的是 **SVG 中间层**。
直接让模型写 PowerPoint 底层 DrawingML XML 很难,因为 DrawingML 非常冗长,也不适合人眼调试。PPT Master 选择 SVG,是因为 SVG 和 PowerPoint DrawingML 都是二维矢量图形思路,都有矩形、路径、圆、渐变、透明度、坐标变换等概念。AI 更容易生成 SVG,人也可以用浏览器预览,最后再通过脚本转成 PPTX 原生对象。
```mermaid
flowchart LR
A["AI 直接写 DrawingML"] --> B["XML冗长
难调试
模型容易错"]
C["AI 写 HTML"] --> D["流式排版
和PPT绝对坐标不一致"]
E["AI 写 SVG"] --> F["绝对坐标
浏览器可预览
容易转DrawingML"]
F --> G["原生可编辑 PPTX"]
```
### 12.4 PPT Master 在 HERMES 架构里的位置
PPT Master 不应该被理解成“另一个 Office 软件”。在本文的企业级 AI 操作系统架构里,它位于 Skill / MCP / Office 执行层之间:
```mermaid
flowchart TD
User["用户:把这份报告做成PPT"] --> Hermes["HERMES Agent"]
Hermes --> Model["本地模型
DCU vLLM / SGLang"]
Hermes --> Skill["PPT Master Skill"]
Skill --> FS["Filesystem MCP
读写项目文件"]
Skill --> Shell["Terminal MCP
执行PPT Master脚本"]
Skill --> Office["Office/WPS
打开和二次编辑PPTX"]
Model --> Strategist["生成结构和设计策略"]
Model --> Executor["生成逐页SVG"]
Shell --> Export["svg_to_pptx.py"]
Export --> PPTX["原生可编辑PPTX"]
```
在这个结构里:
- HERMES 负责对话、模型调用、任务拆解、工具调度;
- 本地 DCU 模型负责理解资料、生成页面结构和 SVG;
- PPT Master 负责项目结构、质量检查、后处理、导出 PPTX;
- MCP 负责给 HERMES 提供文件系统和命令执行能力;
- PowerPoint / WPS 负责最终打开和人工精修。
### 12.5 Windows 上安装 PPT Master
Windows 上最小依赖是 Python 3.10+。如果已经安装 Git,推荐用 Git 克隆;如果没有 Git,可以下载 ZIP 后解压。
PowerShell 操作流程:
```powershell
mkdir D:\ai-tools -Force
cd D:\ai-tools
git clone https://github.com/hugohe3/ppt-master.git
cd D:\ai-tools\ppt-master
py -3 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -U pip
pip install -r requirements.txt
python -c "import pptx; import fitz; print('PPT_MASTER_DEPS_OK')"
```
如果最后输出:
```text
PPT_MASTER_DEPS_OK
```
说明核心依赖已经安装成功。
如果 PowerShell 不允许激活 venv,执行:
```powershell
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
```
然后重新打开 PowerShell,再进入目录激活:
```powershell
cd D:\ai-tools\ppt-master
.\.venv\Scripts\Activate.ps1
```
### 12.6 Linux / openEuler / Ubuntu 上安装 PPT Master
Linux 上操作类似:
```bash
mkdir -p /data/ai-tools
cd /data/ai-tools
git clone https://github.com/hugohe3/ppt-master.git
cd /data/ai-tools/ppt-master
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
pip install -r requirements.txt
python -c "import pptx; import fitz; print('PPT_MASTER_DEPS_OK')"
```
如果需要处理老格式文档,例如 `.doc`、`.odt`、`.rtf`,可以额外安装 pandoc:
```bash
sudo apt install pandoc
```
一般 `.pdf`、`.docx`、`.xlsx`、`.pptx`、`.md`、网页 URL 等常见输入,不应一开始就把问题复杂化;先跑通主流程,再按需要补依赖。
### 12.7 准备 PPT Master 项目目录
PPT Master 的工作区核心目录是:
```text
ppt-master/
projects/
exports/
skills/ppt-master/
skills/ppt-master/scripts/
skills/ppt-master/templates/
```
可以创建一个项目目录,把资料放进去:
Windows:
```powershell
cd D:\ai-tools\ppt-master
mkdir projects\dcu-hermes\sources -Force
copy D:\docs\dcu-hermes-report.pdf projects\dcu-hermes\sources\
```
Linux:
```bash
cd /data/ai-tools/ppt-master
mkdir -p projects/dcu-hermes/sources
cp /data/docs/dcu-hermes-report.pdf projects/dcu-hermes/sources/
```
### 12.8 用 HERMES 驱动 PPT Master 的方式
PPT Master 官方工作方式更像“给 AI Coding Agent 的技能仓库”。也就是说,它要求 Agent 能做三件事:
1. 读写项目文件;
2. 运行 Python / Shell 命令;
3. 在多轮对话里持续执行工作流。
HERMES 如果已经接入本地 DCU 模型,并且配置了 filesystem MCP 与 terminal MCP,就可以按这个模式驱动 PPT Master。
```mermaid
sequenceDiagram
participant U as 用户
participant H as HERMES
participant L as 本地DCU模型
participant FS as Filesystem MCP
participant SH as Terminal MCP
participant PM as PPT Master
U->>H: 把报告做成PPT
H->>L: 读取PPT Master Skill规则
H->>FS: 读取源材料和项目文件
H->>SH: 执行source_to_md / project_manager
L-->>H: 生成设计策略与页面结构
H->>FS: 写入design_spec / spec_lock / SVG页面
H->>SH: 运行质量检查与导出脚本
PM-->>H: exports目录生成pptx
H-->>U: 返回PPTX路径
```
在 HERMES 里可以这样发起任务:
```text
请使用 D:\ai-tools\ppt-master 里的 PPT Master 工作流,把 projects\dcu-hermes\sources\dcu-hermes-report.pdf 生成一份 12 页左右的中文技术论坛分享 PPT。
要求:
1. 输出为 16:9 PPTX。
2. 风格偏技术架构图,适合论坛发布。
3. 尽量使用原生可编辑图形,不要把每页做成图片。
4. 生成完成后告诉我 exports 里的 pptx 文件路径。
```
如果是 Markdown 源文档:
```text
请使用 PPT Master,把 projects\dcu-hermes\sources\article.md 做成一份 10 页中文演示稿。
结构要求:
1. 封面
2. 背景与目标
3. 总体架构
4. DCU 模型服务
5. HERMES 接入
6. MCP 扩展
7. Office/WPS 自动化
8. 企业级 AI OS v2
9. 部署注意事项
10. 总结
```
### 12.9 HERMES 配置 filesystem MCP
HERMES 需要能读写 PPT Master 目录。示例配置:
```yaml
mcp_servers:
ppt_master_fs:
command: "npx"
args:
- "-y"
- "@modelcontextprotocol/server-filesystem"
- "D:\\ai-tools\\ppt-master"
tools:
include:
- read_file
- write_file
- list_directory
```
这样 HERMES 可以读取:
```text
D:\ai-tools\ppt-master\skills\ppt-master\SKILL.md
D:\ai-tools\ppt-master\projects\
D:\ai-tools\ppt-master\exports\
```
### 12.10 HERMES 配置 PPT Master 专用 MCP
只开放文件系统还不够,PPT Master 还需要运行脚本。可以写一个受控 MCP,把常用命令封装起来,避免让模型拿到“任意 shell”。
创建文件:
```powershell
mkdir C:\hermes-mcp -Force
notepad C:\hermes-mcp\ppt_master_mcp.py
```
写入:
```python
from mcp.server.fastmcp import FastMCP
from pathlib import Path
import subprocess
mcp = FastMCP("ppt-master-local")
ROOT = Path(r"D:\ai-tools\ppt-master").resolve()
PYTHON = ROOT / ".venv" / "Scripts" / "python.exe"
def run_cmd(args: list[str], timeout: int = 900) -> str:
if not PYTHON.exists():
raise RuntimeError(f"python not found: {PYTHON}")
result = subprocess.run(
[str(PYTHON)] + args,
cwd=str(ROOT),
capture_output=True,
text=True,
timeout=timeout,
encoding="utf-8",
errors="replace",
)
out = []
out.append(f"returncode={result.returncode}")
if result.stdout:
out.append("stdout:")
out.append(result.stdout[-8000:])
if result.stderr:
out.append("stderr:")
out.append(result.stderr[-8000:])
if result.returncode != 0:
raise RuntimeError("\n".join(out))
return "\n".join(out)
def project_path(project_name: str) -> Path:
safe = project_name.replace("\\", "/").strip("/")
p = (ROOT / "projects" / safe).resolve()
if ROOT not in p.parents and p != ROOT:
raise ValueError("project path escapes ppt-master root")
return p
@mcp.tool()
def ppt_master_init(project_name: str, fmt: str = "ppt169") -> str:
return run_cmd([
"skills/ppt-master/scripts/project_manager.py",
"init",
project_name,
"--format",
fmt,
])
@mcp.tool()
def ppt_master_import_sources(project_name: str, sources: list[str], move: bool = False) -> str:
p = project_path(project_name)
args = [
"skills/ppt-master/scripts/project_manager.py",
"import-sources",
str(p),
] + sources
if move:
args.append("--move")
return run_cmd(args)
@mcp.tool()
def ppt_master_validate(project_name: str) -> str:
p = project_path(project_name)
return run_cmd([
"skills/ppt-master/scripts/project_manager.py",
"validate",
str(p),
])
@mcp.tool()
def ppt_master_quality_check(project_name: str) -> str:
p = project_path(project_name)
return run_cmd([
"skills/ppt-master/scripts/svg_quality_checker.py",
str(p),
])
@mcp.tool()
def ppt_master_export(project_name: str, no_merge: bool = False, svg_snapshot: bool = False) -> str:
p = project_path(project_name)
outputs = []
outputs.append(run_cmd(["skills/ppt-master/scripts/total_md_split.py", str(p)]))
outputs.append(run_cmd(["skills/ppt-master/scripts/finalize_svg.py", str(p)]))
args = ["skills/ppt-master/scripts/svg_to_pptx.py", str(p)]
if no_merge:
args.append("--no-merge")
if svg_snapshot:
args.append("--svg-snapshot")
outputs.append(run_cmd(args))
return "\n\n".join(outputs)
if __name__ == "__main__":
mcp.run()
```
然后在 HERMES 配置中加入:
```yaml
mcp_servers:
ppt_master_local:
command: "py"
args:
- "C:\\hermes-mcp\\ppt_master_mcp.py"
tools:
include:
- ppt_master_init
- ppt_master_import_sources
- ppt_master_validate
- ppt_master_quality_check
- ppt_master_export
```
这个 MCP 不是让 PPT Master “一键自动变魔法”,而是把项目创建、导入资料、校验、质量检查、导出这些命令变成 HERMES 可以安全调用的工具。真正的页面规划和 SVG 生成仍由 HERMES 调用本地模型完成。
### 12.11 本地 DCU 模型与 PPT Master 的关系
如果 HERMES 已经配置为本地 DCU 模型:
```yaml
model:
provider: custom
default: qwen3.6-dcu
base_url: http://:8001/v1
api_key: ""
context_length: 65536
```
那么 PPT Master 的 AI 生成阶段使用的就是 HERMES 当前模型。也就是说:
```mermaid
flowchart LR
A["PPT Master Workflow"] --> B["HERMES"]
B --> C["本地 vLLM / SGLang API"]
C --> D["海光 DCU 模型"]
```
这里要注意一个现实问题:PPT Master 对模型能力要求很高,尤其是长上下文、视觉设计、SVG 坐标、跨页一致性。用本地 Qwen / DeepSeek / GLM 等模型可以跑流程,但如果本地模型在 SVG 布局、坐标、设计语言上不够强,输出质量会低于强视觉/强代码/长上下文模型。
企业内部落地时可以采用双模型策略:
```mermaid
flowchart TD
A["PPT任务"] --> B{"任务阶段"}
B -->|"资料理解 / 大纲 / 中文表达"| C["本地 DCU 大模型"]
B -->|"SVG视觉执行 / 复杂页面设计"| D["更强视觉/代码模型
可选"]
B -->|"导出 / 转换 / 校验"| E["PPT Master Python脚本"]
B -->|"二次润色 / 合规检查"| F["本地模型"]
```
如果要求数据完全不出内网,就全部使用本地模型;如果允许外部模型处理脱敏后的设计任务,可以把“视觉执行”阶段路由给更强模型。
### 12.12 PPT Master 的典型工作流:从 PDF 生成 PPT
准备资料:
```powershell
cd D:\ai-tools\ppt-master
mkdir projects\dcu-hermes\sources -Force
copy D:\docs\dcu-hermes-report.pdf projects\dcu-hermes\sources\
```
在 HERMES 里执行:
```text
使用 PPT Master 工作流,为项目 dcu-hermes 生成一份中文 PPT。
输入资料:
D:\ai-tools\ppt-master\projects\dcu-hermes\sources\dcu-hermes-report.pdf
要求:
1. 16:9。
2. 12页左右。
3. 技术论坛风格。
4. 每页要有清晰标题。
5. 尽量多使用架构图、流程图、对比表。
6. 输出为原生可编辑 PPTX。
7. 生成后运行质量检查和导出。
```
内部执行顺序:
```mermaid
sequenceDiagram
participant User as 用户
participant Hermes as HERMES
participant MCP as ppt_master_local MCP
participant FS as 文件系统
participant Model as 本地DCU模型
User->>Hermes: 发起PDF转PPT任务
Hermes->>MCP: ppt_master_init("dcu-hermes","ppt169")
Hermes->>MCP: ppt_master_import_sources(...)
Hermes->>FS: 读取PPT Master SKILL.md
Hermes->>Model: 分析源文档并生成设计策略
Model-->>Hermes: 大纲、风格、页面规划
Hermes->>FS: 写入design_spec.md / spec_lock.md
Hermes->>Model: 逐页生成SVG
Hermes->>FS: 写入svg_output/page_*.svg
Hermes->>MCP: ppt_master_quality_check("dcu-hermes")
Hermes->>MCP: ppt_master_export("dcu-hermes")
MCP-->>Hermes: exports/*.pptx
Hermes-->>User: 返回PPTX文件路径
```
### 12.13 从 Markdown 生成 PPT
如果你的论坛文章本来就是 Markdown,可以直接走 Markdown 输入。比如把本文保存为:
```text
D:\ai-tools\ppt-master\projects\dcu-hermes\sources\article.md
```
然后在 HERMES 中输入:
```text
使用 PPT Master,把 projects\dcu-hermes\sources\article.md 做成一份 10 页中文 PPT。
目标:
1. 给论坛读者讲清楚 DCU + HERMES + MCP + Office/WPS 的整体架构。
2. 每页只讲一个核心观点。
3. 页面风格偏工程技术,使用深色科技风。
4. 输出 PPTX 放到 exports 目录。
```
Markdown 到 PPT 的优势是结构更清晰,模型更容易识别标题层级、代码块、表格和流程图描述。
```mermaid
flowchart LR
A["Markdown文章"] --> B["章节结构清晰"]
B --> C["模型拆分页面更稳定"]
C --> D["PPT Master生成SVG页面"]
D --> E["导出PPTX"]
```
### 12.14 使用已有 PPT 模板
企业里经常有固定模板,比如公司汇报模板、产品发布模板、政府项目申报模板。PPT Master 有两种路线:
| 路线 | 适合场景 | 输出特点 |
|---|---|---|
| Template Fill | 已有 PPT 模板非常固定,只想替换文字/表格/图表内容 | 保留原模板页结构 |
| Create Template | 想把现有 PPT 的风格提取成可复用模板,再生成新结构 | 更灵活,适合不同页数和不同内容 |
在 HERMES 里可以这样描述:
```text
使用 PPT Master 的 template fill 路线,把 projects\template\company_template.pptx 作为模板,把 projects\dcu-hermes\sources\article.md 的内容填进去。
要求:
1. 保留原模板风格。
2. 选择适合内容的页面。
3. 输出可编辑 PPTX。
```
如果要创建模板:
```text
使用 PPT Master 的 create-template 路线,从 projects\template\company_template.pptx 提取一套公司模板,然后用这个模板生成 dcu-hermes 项目的 PPT。
```
模板路线适合企业级 AI OS,因为它解决的是“AI 生成内容”和“企业品牌统一”之间的冲突。
```mermaid
flowchart TD
A["企业品牌PPT"] --> B["Create Template"]
B --> C["模板库"]
D["新报告 / 新材料"] --> E["PPT Master"]
C --> E
E --> F["符合企业视觉规范的PPTX"]
```
### 12.15 PPT Master 与 WPS 的关系
PPT Master 输出的是标准 `.pptx` 文件,后续可以用 PowerPoint 或 WPS 演示打开。对于国产化办公环境,可以采用:
```mermaid
flowchart LR
A["PPT Master生成PPTX"] --> B["WPS 演示打开"]
B --> C["WPS MCP二次检查"]
C --> D["读取页面文字 / 检查格式"]
D --> E["本地模型润色"]
E --> F["写回WPS"]
```
也就是说:
- PPT Master 负责从资料生成高质量初稿;
- WPS 负责国产办公环境下打开、展示、人工编辑;
- WPS MCP 负责把 WPS 文档读写能力接入 HERMES;
- HERMES 负责统一调度和审计。
### 12.16 PPT Master 在企业级 AI OS 中的推荐定位
在企业级架构里,PPT 生成可以分为三级:
```mermaid
flowchart TD
A["企业PPT生成需求"] --> B{"质量要求"}
B -->|"批量固定格式"| C["python-pptx
速度快、模板稳定"]
B -->|"已有企业模板填充"| D["PPT Master Template Fill"]
B -->|"高质量新演示稿"| E["PPT Master SVG Pipeline"]
B -->|"最终人工精修"| F["PowerPoint / WPS"]
```
推荐组合:
| 需求 | 推荐工具 |
|---|---|
| 每天自动生成固定格式日报 | `python-pptx` |
| 从 Excel 自动生成经营分析 PPT | `openpyxl + python-pptx` 或 PPT Master |
| 从长报告生成讲解型 PPT | PPT Master |
| 保留公司模板做新汇报 | PPT Master Template Fill |
| 国产办公环境二次编辑 | WPS + WPS MCP |
| 最终高质量交付 | PPT Master 初稿 + 人工精修 |
### 12.17 PPT Master 的企业安全边界
PPT Master 会读源材料、调用模型、写文件、可能调用图片生成或图片搜索能力,所以企业环境必须加边界:
```mermaid
flowchart TD
A["PPT生成请求"] --> B["权限检查"]
B --> C["资料脱敏检查"]
C --> D{"是否允许外部模型/图片API"}
D -->|"仅内网"| E["本地DCU模型 + 内部素材库"]
D -->|"允许脱敏外部调用"| F["外部模型/图片API"]
E --> G["PPT Master生成"]
F --> G
G --> H["审计日志"]
```
安全策略:
| 项目 | 策略 |
|---|---|
| 源文件目录 | 只允许读取工作区目录 |
| 输出目录 | 只允许写入 `exports/` 或企业指定目录 |
| 模型调用 | 敏感材料只走本地 DCU 模型 |
| 图片来源 | 内部素材库优先,外部图片 API 需要审批 |
| 模板 | 企业模板统一管理,避免泄露品牌资料 |
| 审计 | 记录输入文件、输出文件、模型、工具调用时间 |
### 12.18 PPT Master 常见问题
#### 12.18.1 生成的 PPT 质量不稳定
原因通常不是脚本问题,而是模型能力、上下文长度、提示词、源材料结构、页面数量共同影响。处理顺序:
1. 先减少页数,验证 3 页或 5 页能否稳定生成;
2. 使用结构清晰的 Markdown 或 DOCX;
3. 提前指定风格、页数、受众;
4. 让 HERMES 读取 `skills/ppt-master/SKILL.md` 后再执行;
5. 本地模型不稳定时,把任务拆成“大纲生成”和“页面执行”两阶段。
#### 12.18.2 文字溢出或页面元素重叠
处理方式:
```text
请只修复第 5 页:标题太长、正文溢出,请保持整体风格不变,减少正文长度并重新排版。
```
也可以运行质量检查:
```powershell
cd D:\ai-tools\ppt-master
.\.venv\Scripts\Activate.ps1
python skills/ppt-master/scripts/svg_quality_checker.py projects\dcu-hermes
```
#### 12.18.3 导出的 PPT 在 WPS 中显示和 PowerPoint 不完全一致
PPTX 是标准文件,但不同软件对动画、SVG、渐变、字体替换的支持程度不同。企业环境可以设定两条输出规范:
| 场景 | 输出策略 |
|---|---|
| PowerPoint 演示 | 允许使用动画、渐变、复杂形状 |
| WPS / 国产环境 | 减少复杂动画,字体使用系统已有字体,图形保持简洁 |
#### 12.18.4 本地 DCU 模型能不能完全替代 Claude / GPT 做 PPT Master
可以跑通工作流,但效果取决于本地模型能力。PPT Master 对模型要求不是普通问答能力,而是:
- 长上下文;
- 内容结构化;
- 视觉设计;
- SVG 坐标与排版;
- 跨页风格一致性;
- 遵循复杂 workflow 的能力。
本地模型适合先承担:
```text
资料总结 → 大纲生成 → 页面文案 → 论坛技术内容组织
```
如果要追求非常强的视觉表现,需要继续优化本地模型的 tool call、长上下文、SVG 生成稳定性,或者把部分非敏感视觉执行任务路由给更强模型。
### 12.19 PPT Master 小结
PPT Master 在本文体系里的价值不是“又多了一个 PPT 工具”,而是把 PPT 生成从简单文件写入升级成了一套完整的 Agent 工作流:
```text
源资料 → 内容理解 → 设计策略 → SVG 页面 → 质量检查 → 原生 PPTX → WPS/PowerPoint 精修
```
和 HERMES + DCU + MCP 结合后,它可以成为企业级 AI 操作系统里的“高质量演示稿生成引擎”。
## 13. WPS 接入本地模型
### 13.1 WPS 接入本地模型的正确理解
WPS 接入本地模型不是“让 WPS 自己跑大模型”,而是把 WPS 作为文档前端,把本地模型作为后端智能能力。
```mermaid
flowchart TD
A["WPS 文字 / 表格 / 演示"] --> B["提取当前文档内容"]
B --> C["发送到本地模型 API"]
C --> D["模型生成结果"]
D --> E["写回 WPS 文档"]
```
可落地方式有四种:
| 方式 | 是否需要企业授权 | 说明 |
|---|---|---|
| WPS AI / 企业私有化接口 | 取决于 WPS 版本和授权 | 如果企业版支持 AI 网关或插件配置,可接入内部模型网关 |
| WPS JS API / 加载项 | 取决于 WPS 开放平台能力 | 用 JS 获取文档对象,调用 HTTP API,再写回 |
| WPS COM / OLE 自动化 | Windows 桌面版常用 | 用 PowerShell / Python 操作 WPS 应用对象 |
| WPS Desktop MCP | 可自建 | 把 JS/COM/UIA 封装成 MCP 工具给 HERMES 调用 |
### 13.2 本地模型 API 网关
为了让 WPS 和 HERMES 都能调用同一个本地模型,推荐统一走一个 OpenAI Compatible 网关:
```mermaid
flowchart LR
WPS["WPS 插件 / COM / MCP"] --> GW["AI API Gateway"]
Hermes["Hermes Agent"] --> GW
GW --> VLLM["vLLM / SGLang"]
VLLM --> DCU["DCU / GPU"]
```
网关地址示例:
```text
http://192.168.10.88:8001/v1
```
WPS 插件、WPS MCP、Hermes 都调用这个地址,避免每个客户端单独维护模型配置。
### 13.3 WPS COM 自动化探测
不同 WPS 版本的 COM ProgID 可能不同,可以先探测:
```powershell
$progids = @(
"KWPS.Application",
"WPS.Application",
"Et.Application",
"WPP.Application"
)
foreach ($p in $progids) {
try {
$app = New-Object -ComObject $p
Write-Host "FOUND_COM_PROGID=$p"
$app.Quit()
} catch {
Write-Host "NOT_FOUND=$p"
}
}
```
含义:
| ProgID | 可能对应 |
|---|---|
| `KWPS.Application` / `WPS.Application` | WPS 文字 |
| `Et.Application` | WPS 表格 |
| `WPP.Application` | WPS 演示 |
### 13.4 PowerShell 操作 WPS 文字
```powershell
$wps = New-Object -ComObject "KWPS.Application"
$wps.Visible = $true
$doc = $wps.Documents.Add()
$doc.Content.Text = "这是一段由本地 AI 工作流准备写入 WPS 的文本。"
$out = "C:\hermes-out\wps-demo.docx"
$doc.SaveAs($out)
Write-Host "WPS_DOC_CREATED=$out"
```
### 13.5 WPS 调用本地模型的 HTTP 流程
WPS 插件或 WPS MCP 提取文档文本后,调用本地模型:
```powershell
$body = @{
model = "qwen3.6-dcu"
messages = @(
@{
role = "user"
content = "请把下面文字改写成正式公文风格:这是一段测试内容。"
}
)
temperature = 0.2
max_tokens = 512
} | ConvertTo-Json -Depth 10
$r = Invoke-RestMethod `
-Uri "http://192.168.10.88:8001/v1/chat/completions" `
-Method Post `
-ContentType "application/json" `
-Body $body
$r.choices[0].message.content
```
WPS MCP 的完整链路:
```mermaid
sequenceDiagram
participant User as 用户
participant WPS as WPS
participant MCP as WPS MCP
participant Hermes as Hermes
participant VLLM as 本地模型API
User->>Hermes: 改写当前WPS文档
Hermes->>MCP: read_current_document
MCP->>WPS: 读取正文
WPS-->>MCP: 文档文本
MCP-->>Hermes: 文本内容
Hermes->>VLLM: 调用本地模型改写
VLLM-->>Hermes: 改写结果
Hermes->>MCP: write_current_document
MCP->>WPS: 写回文档
WPS-->>User: 文档已更新
```
### 13.6 WPS MCP 工具设计
WPS MCP 工具不应一上来开放任意 COM 操作,应先开放高层动作:
| 工具名 | 作用 |
|---|---|
| `wps_read_document` | 读取当前 WPS 文字正文 |
| `wps_write_document` | 写回当前 WPS 文字 |
| `wps_create_document` | 新建 WPS 文档 |
| `wps_read_sheet` | 读取当前 WPS 表格区域 |
| `wps_write_sheet` | 写入 WPS 表格 |
| `wps_create_presentation` | 生成 WPS 演示文件 |
对应的 HERMES 用户任务:
```text
读取当前 WPS 文档,把语言改得更正式,但不要改变原意。
```
HERMES 执行:
```mermaid
flowchart TD
A["用户任务"] --> B["Skill:文档润色流程"]
B --> C["wps_read_document"]
C --> D["本地模型改写"]
D --> E["wps_write_document"]
E --> F["返回处理摘要"]
```
---
## 14. 企业级 AI 操作系统
### 14.1 v2 的核心变化
v1 是:
```text
HERMES 接入本地 DCU 模型
```
v2 是:
```text
HERMES + DCU 模型 + MCP 工具集群 + Office/WPS/Desktop 自动化 + 权限审计
```
### 14.2 多模型路由
不同任务交给不同模型:
```mermaid
flowchart LR
A["用户任务"] --> B["任务分类器 / Policy Engine"]
B --> C["办公写作 / 汇报材料
Qwen / 通用模型"]
B --> D["代码 / 逆向 / 工程任务
DeepSeek / Coding模型"]
B --> E["语音输入 / ASR / TTS
VibeVoice / ASR模型"]
B --> F["简单摘要 / 轻量任务
小模型"]
```
路由规则可以按关键词、任务类型、成本、上下文长度、模型可用性决定。
### 14.3 MCP Gateway
企业环境中,不应让每个 Hermes 客户端都直接连接所有 MCP Server。更好的结构是:
```mermaid
flowchart TD
Hermes["Hermes Agent"] --> MCPGW["MCP Gateway"]
MCPGW --> Auth["认证与授权"]
MCPGW --> Tools["工具注册表"]
MCPGW --> Audit["审计日志"]
MCPGW --> Policy["策略引擎"]
Tools --> Office["Office/WPS工具"]
Tools --> Desktop["Desktop RPA工具"]
Tools --> Data["数据库/文件/API工具"]
```
MCP Gateway 的职责:
| 模块 | 作用 |
|---|---|
| 工具注册 | 管理哪些工具可用 |
| 权限控制 | 判断谁能调用哪些工具 |
| 参数校验 | 防止危险路径、危险命令、越权操作 |
| 审计日志 | 记录谁在什么时间调用了什么工具 |
| 执行隔离 | 不同用户、部门、租户互相隔离 |
### 14.4 AI 防火墙
企业级工具调用必须在模型输出和真实执行之间增加策略层。
```mermaid
flowchart TD
A["模型输出 tool_call"] --> B["AI Firewall"]
B --> C{"策略检查"}
C -->|"允许"| D["执行 MCP 工具"]
C -->|"拒绝"| E["返回拒绝原因"]
C -->|"需要确认"| F["请求人工确认"]
D --> G["审计日志"]
E --> G
F --> G
```
典型策略:
| 类型 | 规则 |
|---|---|
| 文件路径 | 只能写入工作区,不能写系统目录 |
| Office/WPS | 修改现有文件前先复制备份 |
| Desktop | 禁止自动点击支付、删除、格式化等危险按钮 |
| 数据库 | 只读账号和写入账号分离 |
| API | 生产系统写操作需要人工确认 |
| 模型 | 高风险任务转人工审批 |
### 14.5 审计日志格式
每次工具调用都记录:
```json
{
"time": "2026-06-25T10:00:00+09:00",
"user": "muyi",
"tenant": "internal",
"agent": "hermes-desktop",
"model": "qwen3.6-dcu",
"tool": "create_pptx",
"arguments_hash": "sha256:xxxx",
"target_path": "C:\\hermes-out\\report.pptx",
"result": "success",
"latency_ms": 1832
}
```
### 14.6 v2 企业级最终架构
```mermaid
flowchart TD
subgraph Client["用户端"]
C1["Hermes Desktop"]
C2["Hermes CLI"]
C3["Web / 企业门户"]
end
subgraph Agent["Agent 层"]
A1["Hermes Agent"]
A2["Skill 工作流"]
A3["Memory / Context"]
end
subgraph Model["模型层"]
R["Model Router"]
M1["办公模型"]
M2["代码模型"]
M3["语音模型"]
M4["小模型"]
end
subgraph Compute["算力层"]
V1["vLLM / SGLang"]
G1["海光 DCU"]
G2["NVIDIA GPU"]
end
subgraph Tool["工具执行层"]
GW["MCP Gateway"]
T1["Office MCP"]
T2["WPS MCP"]
T3["Desktop MCP"]
T4["Filesystem MCP"]
T5["Database MCP"]
end
subgraph Security["安全治理层"]
P["Policy Engine"]
AU["Audit Log"]
RBAC["RBAC / 多租户"]
end
Client --> Agent
Agent --> R
R --> M1
R --> M2
R --> M3
R --> M4
M1 --> V1
M2 --> V1
M3 --> V1
M4 --> V1
V1 --> G1
V1 --> G2
Agent --> GW
GW --> P
P --> T1
P --> T2
P --> T3
P --> T4
P --> T5
P --> AU
RBAC --> P
```
---
## 15. 常见问题排查
### 15.1 HERMES 报连接失败
先不要看 HERMES,直接在 HERMES 所在机器上执行:
```bash
curl http://:8001/v1/models
```
失败原因通常在以下位置之一:
- vLLM 服务没有启动;
- 端口不是 `8001`;
- 容器没有使用 `--network=host`;
- 防火墙阻止访问;
- HERMES 所在机器和 DCU 服务器网络不通;
- Base URL 写错,少了 `/v1`。
正确格式一般是:
```text
http://:8001/v1
```
不是:
```text
http://:8001
```
### 15.2 HERMES 报 model not found
检查 vLLM 实际暴露的模型名:
```bash
curl http://:8001/v1/models
```
HERMES 里的模型名必须和这里一致。
推荐在启动 vLLM 时固定名称:
```bash
--served-model-name qwen3.6-dcu
```
然后 HERMES 中统一填写:
```text
qwen3.6-dcu
```
### 15.3 HERMES 启动后上下文不够
Agent 场景会占用较多上下文,包括:
- 系统提示词;
- 工具 schema;
- 历史对话;
- 文件内容;
- 中间推理过程;
- 函数调用返回结果。
建议 vLLM 启动时设置:
```bash
--max-model-len 65536
```
HERMES 配置里也写:
```yaml
context_length: 65536
```
如果显存不够:
- 换更小模型;
- 降低 `--max-model-len` 做纯聊天测试;
- 增加 tensor parallel 卡数;
- 使用模型仓库中推荐的量化或 FP8 版本,前提是对应 DCU 型号和镜像支持。
### 15.4 工具调用变成普通文本
如果模型输出类似 JSON 的工具调用文本,但 HERMES 没有真的执行工具,通常说明 vLLM 的 tool call parser 没有正确启用,或者模型本身的工具调用格式与当前 parser 不匹配。
Qwen3.6 示例:
```bash
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
--reasoning-parser qwen3
```
不同模型的 parser 不一样,必须看对应模型仓库 README。
### 15.5 Docker 容器里看不到 DCU
检查容器启动参数:
```bash
--device=/dev/kfd
--device=/dev/dri
--device=/dev/mkfd
```
检查宿主机设备节点:
```bash
ls /dev/kfd
ls /dev/dri
ls /dev/mkfd
```
如果宿主机都没有这些设备节点,应回到驱动安装阶段排查。
### 15.6 vLLM 本机能访问,Windows 不能访问
在 DCU 服务器上测试:
```bash
curl http://127.0.0.1:8001/v1/models
```
在 Windows 上测试:
```powershell
curl.exe http://:8001/v1/models
```
如果前者成功、后者失败,重点检查:
- DCU 服务器防火墙;
- 内网路由;
- 安全组策略;
- vLLM 是否只监听了本地地址;
- 容器网络是否正确暴露。
### 15.7 MCP 没有加载
检查配置文件:
```bash
vim ~/.hermes/config.yaml
```
检查 `mcp_servers` 缩进是否正确。
启动 HERMES 后输入:
```text
告诉我当前可用的 MCP 工具有哪些。
```
如果没有看到目标工具,检查:
- `npx` 或 `py` 是否在 PATH;
- MCP Server 命令是否能单独启动;
- 工作目录是否存在;
- Windows 路径是否需要双反斜杠;
- 工具是否被 `tools.include` 过滤掉。
### 15.8 Office / WPS 文件生成失败
重点检查:
- 输出目录是否存在;
- 文件是否被 WPS/Office 打开占用;
- Python 依赖是否安装;
- Windows 权限是否允许写入;
- COM ProgID 是否正确;
- 32 位 / 64 位 Office/WPS 与 Python 位数是否匹配。
---
## 16. 最小可用命令汇总
### 16.1 DCU 服务器:启动模型容器
```bash
docker run -it \
--shm-size 256g \
--network=host \
--name qwen3.6-hermes-demo \
--privileged \
--device=/dev/kfd \
--device=/dev/dri \
--device=/dev/mkfd \
--group-add video \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
-u root \
-v /opt/hyhal/:/opt/hyhal/:ro \
-v /data/models/:/data/models/ \
harbor.sourcefind.cn:5443/dcu/admin/base/custom:vllm018-ubuntu22.04-dtk26.04-qwen3.6-20260423 \
bash
```
### 16.2 容器内:启动 vLLM
```bash
vllm serve /data/models/Qwen3.6-27B \
--served-model-name qwen3.6-dcu \
--port 8001 \
--trust-remote-code \
--dtype bfloat16 \
--gpu-memory-utilization 0.9 \
--max-model-len 65536 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
--reasoning-parser qwen3
```
### 16.3 HERMES 机器:验证模型接口
```bash
curl http://:8001/v1/models
```
Windows:
```powershell
curl.exe http://:8001/v1/models
```
### 16.4 HERMES 机器:安装 HERMES
Linux / WSL2:
```bash
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
source ~/.bashrc
hermes doctor
```
Windows PowerShell:
```powershell
iex (irm https://hermes-agent.nousresearch.com/install.ps1)
hermes doctor
```
### 16.5 HERMES 机器:配置模型
```bash
hermes model
```
填写:
```text
Provider: Custom endpoint / Self-hosted / OpenAI Compatible
Base URL: http://:8001/v1
API Key: 本地测试留空;生产环境填写网关 token
Model: qwen3.6-dcu
Context length: 65536
```
### 16.6 HERMES 机器:启动测试
```bash
hermes chat
```
测试:
```text
只回复 HERMES_DCU_OK,不要解释。
```
### 16.7 Windows 机器:安装 Office/WPS MCP 所需依赖
```powershell
py -m pip install -U pip
py -m pip install mcp python-docx openpyxl python-pptx pandas matplotlib pywinauto pywin32 requests
```
### 16.8 HERMES 配置 Office MCP
```yaml
mcp_servers:
office_local:
command: "py"
args: ["C:\\hermes-mcp\\office_mcp.py"]
tools:
include:
- create_docx
- create_xlsx
- create_pptx
```
### 16.9 HERMES 配置文件系统 MCP
```yaml
mcp_servers:
project_fs:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-filesystem", "D:\\projects"]
tools:
include:
- read_file
- list_directory
- write_file
```
---
## 17. 生产环境做法
本地测试可以直接裸跑:
```text
http://127.0.0.1:8001/v1
```
多人使用或生产环境应增加网关层:
```mermaid
flowchart LR
H["HERMES"] --> G["内网网关 / Nginx / API Key"]
G --> V["vLLM :8001"]
V --> D["海光 DCU"]
H --> M["MCP Gateway"]
M --> A["权限 / 审计 / 工具过滤"]
```
生产环境至少做到:
| 项目 | 做法 |
|---|---|
| 网络 | 不直接暴露公网 |
| 鉴权 | vLLM 或网关层加 API Key |
| 访问范围 | 只允许 HERMES 所在机器或指定内网访问 |
| 日志 | vLLM、HERMES、网关、MCP 审计日志分开 |
| 模型名 | 用 `--served-model-name` 固定 |
| 版本 | 驱动、DTK、镜像、模型 README 保持匹配 |
| 资源隔离 | 多用户场景按端口、容器、模型实例隔离 |
| 工具权限 | MCP 工具白名单、路径白名单、危险操作人工确认 |
| 可观测性 | 记录请求耗时、token 数、错误率、DCU 使用率、工具调用结果 |
---
## 18. 参考页面
| 内容 | 页面地址 |
|---|---|
| 光合资源工具页:驱动、DTK、DAS、光源入口 | |
| DTK 页面 | |
| DTK 26.04 更新说明 | |
| 光源:镜像、模型仓库 | |
| 光合论坛 | |
| Qwen3.6 ModelZoo 示例 | |
| Hermes Agent 安装文档 | |
| Hermes Agent AI Providers 文档 | |
| Hermes Agent MCP 文档 | |
| PPT Master GitHub 仓库 | |
| PPT Master 官方展示页 | |
| PPT Master Getting Started | |
| PPT Master Windows 安装文档 | |
| PPT Master Skill 工作流 | |
| PPT Master 技术设计文档 | |
| WPS 开放平台 JS API 文档 | |
---
## 19. 结论
海光 DCU 接入 HERMES 的关键,不是让 HERMES 直接“认识 DCU”,而是把 DCU 上的大模型服务标准化成:
```text
OpenAI Compatible API
```
也就是:
```text
/v1/chat/completions
```
只要这一步打通,HERMES 就可以像调用云端模型一样调用本地 DCU 模型。
企业级 v2 的关键,则是把 HERMES 从“能聊天的本地 Agent”升级为;并把 PPT Master 这类高质量演示稿生成工作流纳入 Office/WPS 自动化体系:
```text
模型调度 + MCP 工具执行 + Office/WPS/Desktop 自动化 + 权限审计
```
最终形成的架构是:
```mermaid
flowchart LR
A["海光 DCU"] --> B["vLLM / SGLang"]
B --> C["OpenAI Compatible API"]
C --> D["HERMES Agent"]
D --> E["MCP Gateway"]
E --> F["Office / WPS / Desktop / 文件 / 数据库"]
E --> G["权限 / 审计 / 企业流程"]
```
后续要换 Qwen、DeepSeek、GLM、Kimi、VibeVoice 或其他模型,本质上只是替换:
```text
模型权重 + 镜像 + vLLM/SGLang 启动参数 + 模型路由策略
```
HERMES 侧保持:
```yaml
provider: custom
base_url: http://:8001/v1
```
MCP 侧保持:
```yaml
mcp_servers:
工具名:
command: "工具启动命令"
args: ["工具参数"]
tools:
include: ["允许暴露的工具"]
```
这就是整条链路最稳定、最容易维护、也最容易继续扩展成企业级 AI 操作系统的方式。