“全自动安装”这四个字,看起来是最省心的,实际上往往是事故高发的开始。尤其是在 Hermes 这类桌面端智能体工具上,一条install.sh或setup.bat跑完,你以为万事大吉,结果启动时不是缺依赖,就是连不上模型服务,甚至桌面端窗口直接白屏。很多人看到这类工具的第一反应是“我下载下来一键部署就能用”,但真实情况远没有那么简单。
这篇文章想和你聊清楚一件事:Hermes 桌面端的“全自动安装”到底自动了什么,哪些环节它替你做完了,哪些环节它其实帮不了你。读完你会知道,为什么同样的安装脚本在不同机器上结果完全不同,以及当自动安装失败时,你应该按什么顺序去排查、手动兜底,最终把这个桌面端智能体工具稳稳跑起来。
先给一个明确判断:Hermes 不是那种“解压就能跑”的小工具,它更像一套“桌面端 + Agent 调度 + 模型服务”的组合体。全自动脚本解决的只是依赖安装和基础配置生成,真正容易出问题的是环境预检、模型服务地址配置、权限边界和桌面端运行时的兼容性。这篇文章会从概念、安装、配置、启动、验证、排错到工程建议,完整过一遍。
1. 这篇文章真正要解决的问题
先说说读者痛点。最近“Hermes”“Hermes Agent”“DeepSeek Harness 桌面端”这些词在社区里讨论度很高,很多人下载了项目之后,第一时间就是找所谓的“一键安装脚本”。脚本运行过程中,屏幕上滚过一大段日志,看起来非常专业,但最后停在某个位置不动了:可能是下载依赖超时,可能是 Node 版本不匹配,可能是 Python 解释器找不到,也可能是配置文件里还没填模型 API 地址。
这类问题的共同特征是:你不知道脚本执行到哪一步失败,也不知道它改动了什么。如果对安装流程本身没有概念,遇到报错就只能盲目重试,重试几次还是不行,就放弃了。
这篇文章要解决的,就是下面几个核心问题:
- 什么是 Hermes 桌面端,它和普通桌面应用有什么本质区别。
- 全自动安装脚本的各个阶段分别做了什么,为什么环境和依赖问题会导致失败。
- 自动安装失败后,怎样用一套手动流程把项目装起来。
- 启动之后如何验证它真的在工作,而不是仅仅“进程存在”。
- 日常使用中哪些安全边界和权限问题容易踩坑。
不管你是想尝鲜的普通开发者,还是准备把 Hermes 接入实际项目的工程师,这篇文章都能帮你建立一条清晰的装机和排错路径。建议先收藏,动手安装的时候对照着看。
2. Hermes 是什么:智能体桌面端的定位与背景
2.1 从热词看 Hermes 的生态背景
最近和 Hermes 一起出现的高频词包括:Hermes Agent、DeepSeek Hermes、DeepSeek Harness 桌面端、Hermes Studio、DSH 桌面端、Hermes WSL2 安装等等。这些词放在一起,能看出一个趋势:社区正在把大模型能力往本地桌面端搬,用 Agent 形态封装成普通人也能操作的应用。
但这里要提醒一句:目前这些名称并没有统一的官方定义。可能是不同的开源项目,也可能是一个项目在传播中被拆成了多个叫法。安装之前,你最好先确认自己下载的仓库到底是哪个,README 里的项目介绍是什么,依赖是 Python 还是 Node,官方推荐的安装方式是哪个分支。很多人装不上,不是因为操作问题,而是把两个不同项目的文档混在一起用了。
2.2 智能体桌面端的三个能力层次
从能力结构来看,一个完整的 Hermes 桌面端方案通常包含三层:
- 交互层:桌面窗口、聊天界面、任务面板,负责把用户的自然语言指令收集起来。
- Agent 调度层:理解任务、拆分步骤、调用工具。比如读取本地文件、执行命令、调用搜索接口、调起外部程序等。
- 模型服务层:提供大模型的推理能力,可以是远程 API,也可以是本地模型。
这三层的关系很像一个餐厅:交互层是前厅点餐,Agent 调度层是后厨切配,模型服务层是灶台掌勺。桌面端把这三者装进一个可视化的壳子里,让用户不用在终端里敲各种命令。
2.3 为什么桌面端形态比纯命令行更适合 Agent 场景
纯命令行工具的优点是轻量,但对普通用户不友好。Agent 场景的特点是任务链路长、状态多、需要可视化反馈,比如某个工具调用失败了,图表上应该直接标红;比如某个长任务执行到一半,用户需要看到进度,而不是盯着终端光标发呆。
桌面端把这些信息用界面展示出来,同时还能管理多个会话、保存历史记录、配置多个模型来源。这也是为什么近期 Codex、Claude、DeepSeek 相关的桌面端话题热度持续走高——大家逐渐接受了一个判断:Agent 工具的终局形态不只是 API,而是可交互的桌面产品。
2.4 先分清你在装哪一个项目
这是最实用的一条建议。别只看项目名里有没有 Hermes,要看:
- 仓库地址是什么,README 有没有明确的安装指引。
- 项目的依赖管理方式是 requirements.txt、pyproject.toml 还是 package.json。
- 是否有 release 版本的桌面端安装包,还是必须从源码构建。
- 模型服务是内置的还是需要额外配置外部 API。
这些信息决定了后续所有安装步骤。如果是桌面端安装包,那“全自动安装”可能真的是双击下一步;如果是源码仓库,自动安装脚本也只是帮你把环境搭好,后续还是要你自己配置。
3. 环境准备与前置条件
不管自动脚本写得再好,机器环境必须是可预期的。这一节我们先做安装前的自查,减少后面无意义的报错。
3.1 操作系统与基础运行环境
Hermes 桌面端相关的项目,多数会跨 Windows、macOS、Linux,但不同平台的自动安装脚本可能不一样。从社区反馈看,Windows 上最容易出问题的是 PowerShell 执行策略、缺少编译工具链、路径包含中文或空格;Linux 上常见的是系统发行版不同导致的依赖包名差异;macOS 相对平滑,但也要注意 Homebrew 环境是否完整。
建议先确认:
- 操作系统的具体版本,Windows 10/11,Ubuntu 22.04/24.04,macOS 版本等。
- 是否安装了 Git,版本是否较新。
- 是否安装了 Python 或 Node.js,版本是否符合项目要求。具体版本请以项目 README 为准,不建议凭感觉装最新版,很多开源项目对版本有约束。如果项目没写明版本要求,优先选择当前各语言生态里的主流稳定版。
3.2 模型服务准备
Hermes 作为智能体工具,通常需要模型推理能力。这里分为两种情况:
- 使用远程模型 API:需要准备 API Key,并确认网络能够访问对应的服务地址。配置文件里一般需要填
base_url和api_key两项,注意有些项目还要求填模型名称,例如不同命名规则的模型名。 - 使用本地模型服务:例如通过 Ollama、LM Studio、vLLM 等先启动一个本地推理服务,然后让 Hermes 连接到该服务的地址,例如
http://127.0.0.1:11434的形式。本地模型的优势是数据不出本机,但对硬件要求更高。
如果把模型服务比作发电厂,Hermes 桌面端就是电器。电器装好了,发电厂不供电或者电压不匹配,照样无法工作。所以,安装 Hermes 之前,先确认你的“发电厂”是通的。
3.3 网络与权限检查
自动安装脚本一定会联网拉取依赖包。如果你的网络环境无法稳定访问公共依赖仓库,必然失败。常见问题包括下载超时、SSL 证书校验失败、代理设置冲突等。安装前建议先用简单命令确认网络连通性,同时确认账号对目标安装目录有写权限。特别提醒:不要用 root 或管理员账号运行来源不明的安装脚本,这是最基本的安全底线。
3.4 准备一块干净的测试环境
如果你是第一次尝试,强烈建议不要直接在主力开发机上下手。可以用 Docker 容器、虚拟机,或者至少单独建一个目录、单独的 Python 虚拟环境。这样即使装坏了,也不会污染系统 Python 或 Node 全局包。
4. 全自动安装脚本到底做了什么——逐段拆解
市面上这些“一键安装”脚本,本质上都是把人工步骤写成了脚本。理解脚本内容,比盲目运行脚本更有价值。这一节我们以常见的 shell 安装脚本为模板,逐段拆解它的运行逻辑。注意,这不是某个具体项目的真实脚本,而是这类智能体工具安装脚本的通用结构。
4.1 自动安装的总体流程
一次标准的全自动安装,通常要经过下面几个阶段:
- 环境预检:检查操作系统、Python/Node 版本、必需命令是否存在。
- 拉取代码或解压安装包。
- 创建虚拟环境并安装后端依赖。
- 安装前端依赖并构建桌面端资源。
- 生成默认配置文件。
- 启动服务或显示启动指引。
“全自动”通常只覆盖 2 到 5 步,第 1 步和第 6 步最容易被忽略,也最经常出问题。
4.2 环境预检脚本示例
下面是一个简化版的环境预检脚本,目的是展示这类脚本的常见逻辑。
#!/usr/bin/env bash # 文件路径:scripts/check_env.sh set -e echo "==> 1. 检查系统类型" OS="$(uname -s)" case "$OS" in Linux*) echo "Linux 系统" ;; Darwin*) echo "macOS 系统" ;; MINGW*) echo "Windows (Git Bash)" ;; *) echo "未知系统: $OS,请手动检查环境"; exit 1 ;; esac echo "==> 2. 检查 Python" if ! command -v python3 &> /dev/null; then echo "未找到 python3,请先安装 Python" >&2 exit 1 fi PY_MAJOR=$(python3 -c 'import sys; print(sys.version_info.major)') PY_MINOR=$(python3 -c 'import sys; print(sys.version_info.minor)') echo "Python 版本: $PY_MAJOR.$PY_MINOR" if [ "$PY_MAJOR" -lt 3 ] || { [ "$PY_MAJOR" -eq 3 ] && [ "$PY_MINOR" -lt 10 ]; }; then echo "Python 版本过低,建议使用 3.10 及以上版本" >&2 exit 1 fi echo "==> 3. 检查 Node.js" if ! command -v node &> /dev/null; then echo "未找到 node,请先安装 Node.js" >&2 exit 1 fi echo "Node 版本: $(node -v)" echo "==> 环境预检通过"这段脚本的核心价值在于“失败提前暴露”。很多自动安装脚本在第一步没有做严格检查,而是等装到一半才报错,用户根本分不清是网络问题、版本问题还是权限问题。有了预检,至少能快速锁定是哪一类原因。
4.3 依赖安装与虚拟环境
依赖安装是耗时最长、最容易失败的阶段。Python 项目通常会创建虚拟环境,避免污染系统环境。Node 项目则会在项目目录下生成node_modules。核心命令示例如下。
# 文件路径:scripts/install_deps.sh set -e echo "==> 创建 Python 虚拟环境" python3 -m venv .venv source .venv/bin/activate echo "==> 升级 pip" pip install --upgrade pip echo "==> 安装后端依赖" if [ -f requirements.txt ]; then pip install -r requirements.txt elif [ -f pyproject.toml ]; then pip install -e . fi echo "==> 安装前端依赖" if [ -f package.json ]; then npm install fi echo "==> 依赖安装完成"这里容易踩坑的地方有几个:pip install的默认源如果访问不稳定,会频繁超时;npm install某些原生模块需要本地编译工具链;虚拟环境创建后,后续所有命令都必须在同一终端内继续执行,否则会找不到依赖。
如果你在安装时遇到类似ModuleNotFoundError或node-gyp编译失败,基本就是这一阶段出了问题。解决方案通常是切换镜像源,或者先安装编译工具链,然后再重试。
4.4 配置生成
安装完依赖,脚本一般还会生成一份默认配置。配置里至少包含模型服务地址、API Key 占位符、日志级别、监听端口等。很多自动安装脚本只负责生成默认配置,不会帮你填真实信息。所以脚本跑完后还要手动编辑配置文件,如果你忽略了这一步,启动服务时会发现模型请求失败。
4.5 启动服务
最后一个阶段是启动服务。有些项目会自动打开桌面窗口,有些只会在终端输出一个本地访问地址,例如http://127.0.0.1:8080。这里要理解一个区别:桌面端并不等于原生客户端。有些项目是“本地 Web 服务 + 浏览器访问”,有些是“Electron/Tauri 壳 + 本地服务”,有些是纯 Python GUI。启动方式不同,遇到白屏时的排查方向也不同。
4.6 脚本可能失败的常见位置
结合社区反馈,全自动安装脚本失败率最高的位置如下:
| 失败阶段 | 常见现象 | 直接原因 |
|---|---|---|
| 环境预检 | 提示找不到 Python 或 Node | 系统 PATH 未配置,或版本过旧 |
| 依赖安装 | pip/npm 下载超时 | 网络不稳定或源不可达 |
| 依赖安装 | 编译错误 | 缺少 C/C++ 编译工具链 |
| 配置生成 | 配置文件为空白 | 脚本没有权限写目录 |
| 启动服务 | 端口被占用 | 之前残留的进程未退出 |
理解了这些位置,再回头看“全自动安装”失败的问题,思路就清晰了:脚本本身通常没问题,是你机器的某个前置条件不在它的预期内。
5. 手动安装流程:自动脚本失败后的兜底方案
自动脚本失败时,不必立刻放弃或者反复重试。更稳的做法是手动走一遍,每一步都能看到结果,哪一步挂了就处理哪一步。
5.1 拉取项目代码
先进入你打算存放项目的目录,然后克隆仓库。注意检查分支,有些项目默认分支是main,有些是master,有些还分dev或nightly。
cd ~/projects git clone https://example.com/hermes-desktop.git cd hermes-desktop git checkout main克隆完成后,先花两分钟看 README。重点看安装要求、默认配置文件模板、启动命令这三块。不要跳过这一步,很多安装失败的根源在于没有看文档。
5.2 创建虚拟环境
如果是 Python 项目,建议使用虚拟环境。Python 3.10 以上版本自带venv。
python3 -m venv .venv source .venv/bin/activate # Linux/macOS # Windows PowerShell: .venv\Scripts\Activate.ps1激活虚拟环境后,命令行提示符前面会出现(.venv)字样,这时候执行pip命令就不会影响全局环境了。后续所有安装步骤都要在这个终端里进行。
5.3 安装后端依赖
按依赖声明文件安装。如果项目同时有requirements.txt和pyproject.toml,优先看 README 的推荐方式。
pip install --upgrade pip pip install -r requirements.txt如果安装很慢,可以临时指定镜像源,例如:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple这里提醒一下:使用镜像源时要确认项目依赖的安全性,不要随便添加来路不明的第三方源。
5.4 安装前端依赖并构建
如果项目包含package.json,说明桌面端界面或前端资源需要 Node 工具链。
npm install如果只是需要构建静态资源,通常会有一个build命令:
npm run build前端构建的目的是把 HTML、CSS、JavaScript 打包成静态文件,供本地服务或桌面壳加载。构建失败时,大部分原因是 Node 版本和项目要求不匹配,或者是某些依赖包版本锁定导致冲突。不要用暴力删除node_modules直接重装来解决,先看报错信息里指向的是哪个包。
5.5 验证依赖树
安装完成后,可以做一次快速验证:
pip check npm ls --depth=0pip check会检查已安装包之间的依赖冲突。npm ls --depth=0会列出顶层依赖,如果输出里有UNMET DEPENDENCY或INVALID,说明依赖树有问题。这一步能节省大量排查时间。
6. 启动、配置与首次运行验证
这一节进入实际操作场景。假设你已经通过自动脚本或手动方式把项目装好了,接下来要解决的是“启动并验证真的能用”。
6.1 启动服务
先以最常见的后端服务方式启动。以 Python 项目为例,启动命令一般是:
python main.py或者:
python -m hermes.cli serve如果项目内置了桌面窗口,启动命令可能会打开一个图形界面;如果没有桌面界面,命令行窗口会显示服务地址。这里要区分清楚:你运行的是“服务模式”还是“桌面模式”,不同模式的验证方式完全不同。
6.2 配置文件示例
启动前,先检查配置文件是否已经生成。常见的配置文件格式如下:
# 文件路径:config/config.yaml server: host: 127.0.0.1 port: 8080 model: provider: openai-compatible base_url: http://127.0.0.1:11434/v1 api_key: sk-your-api-key-here model_name: qwen2.5:7b agent: max_steps: 20 timeout_seconds: 60 allowed_tools: - local_command - web_search - file_read log: level: info file: logs/hermes.log不同项目的配置项命名会不同,但基本离不开“服务监听地址、模型服务地址、API Key、Agent 工具白名单”这几类。尤其是api_key和base_url两项,直接决定模型层是否通。如果base_url填的是本地端口,别忘了先确认本地模型服务确实已经启动。
6.3 验证 API 连通性
在启动桌面端之前,先用命令行验证模型服务是否可用。下面的示例假设你配置的是 OpenAI 兼容接口:
curl http://127.0.0.1:11434/v1/models如果你看到类似模型列表的 JSON 返回,说明连接没问题。如果连接失败,先确认端口是否监听、服务是否启动、防火墙是否拦截。这一步是整条链路里最核心的验证,因为桌面端界面的很多卡顿和白屏,根源都在模型服务不通。
6.4 启动后的预期输出
启动成功后,你至少应该看到以下信号之一:
- 终端日志出现
Uvicorn running on http://127.0.0.1:8080或类似内容。 - 桌面窗口正常打开,没有白屏,能输入文字。
- 日志中出现“模型连接成功”“配置加载完成”等提示。
如果终端只显示Starting...然后没有后续输出,大概率是初始化逻辑卡在某个外部调用上。此时先看日志文件,再决定是否调整超时时间。
6.5 通过界面验证
如果桌面端打开后可以输入文字,先发一个最简单的请求,比如“请回复 OK”。观察是否出现流式响应。如果界面转了半圈没有回复,优先检查网络请求是否发送出去,以及后端日志里有没有报错。这一步能区分问题在交互层、Agent 调度层还是模型层。
7. 桌面端接入智能体:联调与功能验证
项目能启动,不等于“能用”。真正的验证在于:你能不能通过桌面端完成一个由 Agent 调度的实际任务。
7.1 工具调用与权限边界
Agent 工具是 Hermes 这类智能体工具的灵魂。工具可以包括本地命令执行、文件读写、网页搜索等。但工具权限天然有安全风险。配置时,应该把allowed_tools限定在当前任务确实需要的范围内,不要全部放开。
最小权限原则在这里尤其重要。如果只是做问答,就不要给 Agent 开放本地命令执行权限;如果需要读取文件,只开放指定目录的访问权。社区里常见的翻车案例,大多是给了过大的权限,让模型在幻觉状态下执行了不该执行的命令。
7.2 测试任务示例
先用一个不需要外部网络的最小任务验证 Agent 链路。比如:
- 任务:读取当前目录下的
README.md文件,并总结前 50 个字。 - 预期:Agent 应该先调用文件读取工具,再把内容交给模型总结,最后返回结果。
如果这一步失败,大概率是工具调用配置有问题,或者是模型本身不支持工具调用格式。如果模型是纯文本模型,Agent 很难稳定地按 JSON 格式输出工具调用,建议优先选择支持函数调用(function calling)的模型。
7.3 多轮对话与上下文管理
再测试长任务或多轮对话。Agent 工具一个重要设计是记忆上下文,避免每轮对话都丢三落四。你可以在桌面端连续追问同一个任务,比如第一轮“找到项目里所有 Python 文件”,第二轮“统计每个文件的行数”,看 Agent 是否正确理解“每个文件”指的是上一轮的结果。
如果发现上下文串线,或者第二轮直接答非所问,一般是 Agent 上下文窗口管理策略简单粗暴——直接把历史消息全部塞给模型,导致超长截断或关键信息丢失。这属于工具本身的策略优化问题,可以通过调整上下文窗口长度、清理中间轮次等方式缓解。
7.4 结果判断与记录
完成联调后,建议把测试用例、配置文件和结果记录到项目文档里。以后升级版本、迁移环境时,这些记录能帮你快速回归。实际项目里,这类工具最怕的问题不是装不上,而是“昨天能用今天不能用了”,有记录就能快速定位是配置变了、依赖升级了,还是模型服务地址变了。
8. 常见问题与排查方法
这里整理一份高频问题表,结合前面各个环节,基本覆盖了 Hermes 桌面端安装使用中最容易出现的情况。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 自动安装脚本中途退出 | 环境预检未通过 | 查看脚本报错输出的前 30 行 | 补装对应运行环境,调整 PATH |
| pip 安装依赖超时 | 默认源访问慢 | 观察卡住的包名 | 切换镜像源,或配置代理后重试 |
| npm 编译报错 | 缺少编译工具链 | 查看错误中是否出现 node-gyp | 安装 build-essential / Xcode CLT |
| 端口被占用 | 残留进程未清理 | lsof -i:8080或netstat -ano | 结束占用进程或修改端口 |
| 模型请求失败 | base_url 或 api_key 错误 | curl 直接访问模型服务 | 修正配置,确认服务可达 |
| 桌面端窗口白屏 | 前端资源未构建成功 | 查看浏览器控制台或日志 | 重新执行前端构建命令 |
| WSL2 下窗口无法打开 | 缺少图形显示环境 | 检查 DISPLAY 变量 | 使用 WSLg 或改用 Windows 原生版本 |
| Agent 不执行工具调用 | 模型不支持 function calling | 查看模型文档 | 更换支持工具调用的模型 |
| 启动很慢 | 首次加载模型或依赖过多 | 观察 CPU/GPU 占用 | 预热模型,或减小启动加载项 |
9. 最佳实践与工程建议
9.1 安装规范
不要把自动安装脚本当成黑盒。运行之前,先阅读脚本内容,至少确认下面几点:
- 脚本是否包含从网上下载并执行未知二进制的动作。
- 脚本是否会修改系统级配置,比如 PATH、系统服务。
- 脚本是否需要 root 或管理员权限。
- 脚本是否有卸载或回滚机制。
如果脚本不满足以上任何一条,最好手动安装。尤其是生产环境或共享开发机,保持环境可审计、可回滚比“快点装好”重要得多。
9.2 配置管理
配置文件应该纳入版本控制,但要特别注意 API Key 等敏感信息的处理。实际项目里的推荐做法是:
- 把
config.example.yaml提交到仓库,里面只放占位符。 - 真实配置通过环境变量或本地密钥文件注入。
- 将包含真实密钥的文件加入
.gitignore。 - 定期轮换 API Key,尤其当项目目录可能被其他人查看时。
9.3 安全边界
Agent 工具天然有执行能力,必须控制边界。给你几个硬性建议:
- 不要用系统管理员身份运行 Agent 服务。
- 为 Agent 设置独立的工作目录,禁止访问目录外的路径。
- 对涉及删除、覆盖、网络请求等高风险操作,加入确认机制或审查日志。
- 在测试环境验证所有工具调用,再在真实环境放开权限。
9.4 日志与监控
启动后,检查日志功能是否正常。确保日志包含请求时间、模型调用参数、工具调用参数和结果摘要。可以建立如下分级日志策略:
- ERROR:服务无法启动、模型调用失败、工具执行异常。
- WARN:工具执行时间过长、配置不完整、请求被拒绝。
- INFO:请求开始、模型返回、工具执行完成。
- DEBUG:请求体和返回体详细信息。
生产环境建议把 ERROR 和 WARN 日志接入手边常用的日志平台,方便定位问题。
9.5 升级与回滚
不要在生产环境直接升级大版本。升级前先备份配置文件和项目目录,记录当前版本号。升级后如果出现异常,第一时间回滚到备份版本。
这里给出一个最小可用的备份思路:安装完成后,对整个项目目录做一次压缩备份,同时导出配置文件的脱敏版本。以后无论升级还是清理环境,都有退路。
10. 总结与后续实践建议
这篇文章主要围绕 Hermes 桌面端和同类智能体工具的安装部署展开。核心观点是:不要迷信“全自动安装”,自动脚本的价值在于把标准操作固化下来,但它无法替你处理异常环境、模型配置和权限边界。真正可靠的做法是:理解安装流程的每个阶段、在测试环境验证、手动掌握关键配置、用最小权限运行。
如果你正在尝试安装这类工具,建议按下面的顺序走一遍:先确认项目来源和文档,再检查操作系统和运行环境,然后创建虚拟环境完成依赖安装,接着启动服务并验证模型层接口,最后才通过桌面端发起真实任务。遇到失败时,先定位是网络问题、依赖问题还是配置问题,不要反复重跑同一个脚本。
接下来你可以继续深入的方向包括:模型服务的本地化部署与量化选型、Agent 工具调用机制的源码阅读、多工具组合编排、上下文管理策略以及生产环境的权限隔离方案。这些内容比安装本身更复杂,也是真正影响用户体验和系统稳定性的关键点。建议先把环境跑通,再做能力扩展。