飞牛 NAS 部署 Headroom 压缩代理:给 CowAgent 省 Token 的完整指南

飞牛 NAS 部署 Headroom 压缩代理:给 CowAgent 省 Token 的完整指南
周言志飞牛 NAS 部署 Headroom 压缩代理:给 CowAgent 省 Token 的完整指南
环境:飞牛 NAS(主机名
fnnas,aarch64,Python 3.11.2,无 uv)
CowAgent 源码位于/root/CowAgent/,当前bot_type: zhipu,模型glm-5-turbo,智谱 key 已配置
所有命令在 NAS 上以 root 运行(sudo -i)
链路
1 | CowAgent (zhipu/OpenAI 格式) → headroom (:8787/v1, 压缩上下文) → https://open.bigmodel.cn/api/paas/v4 → GLM |
Headroom 是一个透明代理,CowAgent 发的智谱 key 会原样透传到上游,不用装 cc-switch。CowAgent 的 bot_type、model、zhipu_ai_api_key 都不动,只改 zhipu_ai_api_base 指向 headroom。
如果你还没部署 CowAgent,先看 飞牛 NAS 部署 CowAgent 并开放局域网访问,本文假设 CowAgent 已经跑起来并且能用智谱 GLM 正常回复。
先知道这些
- 安装包很大:
headroom-ai会拖 torch / transformers / opencv / scipy / sentence-transformers / pandas 等一堆 ML 依赖,aarch64 上约 3–5 GB,装十几分钟正常。若某个包没有 aarch64 wheel 会尝试源码编译(可能失败,届时单独处理)。 - **压缩可能让机器人”忘事”**:headroom
token模式会改写/压缩历史轮次以省 token。CowAgent 自己已截断到agent_max_context_tokens: 50000/ 20 轮,再压一层,长对话里可能丢细节。微信/飞书聊天场景要留意体验。 - 会改 CowAgent 配置:先备份
config.json,出问题能秒回滚。
1. 装 headroom
1 | # 建 venv |
看到 headroom, version 0.28.0(或更高)即成功。
如果 pip 报 Python 版本不满足(headroom 可能要求 3.10+,3.11 一般够),改用 uv 装 Python 3.12:
1
2
3
4 curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
uv venv ~/.headroom-venv --python 3.12
~/.headroom-venv/bin/pip install headroom-ai
2. 写启动脚本
1 | cat > ~/.headroom-start.sh << 'EOF' |
参数说明:
--host 127.0.0.1:只本机监听,不暴露到局域网(CowAgent 在同一台 NAS,够用)OPENAI_TARGET_API_URL:headroom 把 OpenAI 格式请求转发到智谱HEADROOM_NO_CCR_INJECT_TOOL:关键,否则 CowAgent 收到陌生的headroom_retrieve工具会报错- 默认
--mode token(压缩优先),想更激进可加--target-ratio 0.5(保留约 50% token)
3. 先手跑一次,验证能通
1 | ~/.headroom-start.sh |
另开一个终端(或先 Ctrl+C,用下面命令测),跑 curl 验证 OpenAI 入口 + 智谱转发:
1 | curl -s http://127.0.0.1:8787/v1/chat/completions \ |
看到正常的 GLM 回复("content":"ok"... 之类)就说明链路通了。Ctrl+C 停掉手跑的进程,下一步交给 systemd 托管。
如果 curl 报错,看
/tmp/headroom-proxy.log(手跑时是终端输出)排查。常见是 key 没透传或模型名不对。
4. 设开机自启(systemd)
fnOS 是 Debian 系,systemd 可用:
1 | cat > /etc/systemd/system/headroom.service << 'EOF' |
看到 active (running) 即成功。日志在 /var/log/headroom.log。
5. 改 CowAgent 配置指向 headroom
先备份:
1 | cp /root/CowAgent/config.json /root/CowAgent/config.json.bak.$(date +%s) |
只改 zhipu_ai_api_base,其它不动:
1 | sed -i 's#"zhipu_ai_api_base": "https://open.bigmodel.cn/api/paas/v4"#"zhipu_ai_api_base": "http://127.0.0.1:8787/v1"#' /root/CowAgent/config.json |
验证:
1 | grep zhipu_ai_api_base /root/CowAgent/config.json |
应为 "zhipu_ai_api_base": "http://127.0.0.1:8787/v1"。
6. 重启 CowAgent
改完 zhipu_ai_api_base 后必须重启 CowAgent 才能生效。CowAgent 的重启方式取决于它是怎么跑起来的:
如果用 systemd 托管(推荐)
1 | systemctl restart cowagent |
看到 active (running) 即已重启。日志在 /var/log/cowagent.log:
1 | tail -f /var/log/cowagent.log |
如果还没给 CowAgent 配 systemd,参考 CowAgent 部署指南 第 4 节。
如果用 screen / nohup 跑的
1 | # screen 方式 |
验证链路
重启后在 Web 控制台或微信/飞书发一条消息,能正常回复就说明整条链路通了——headroom 压缩 + GLM 转发没有断。如果报错,先看两头日志定位:
1 | # headroom 日志 |
7. 确认压缩在生效
看 headroom 日志:
1 | tail -f /var/log/headroom.log |
请求经过时会有 tokens_before / tokens_after / latency_ms 之类的记录,tokens_after < tokens_before 就说明在省 token。
出问题怎么回滚
CowAgent 不正常就立刻切回直连智谱:
1 | cp /root/CowAgent/config.json.bak.* /root/CowAgent/config.json |
Headroom 本身停掉不影响 CowAgent(只是没了压缩,CowAgent 直连 headroom 会连不上,所以回滚 config 必须做)。要彻底卸载 headroom:
1 | systemctl disable --now headroom |
备选:如果 zhipu SDK 不兼容代理
CowAgent 的 zhipu bot 用的是智谱 SDK,极少数情况下可能跟代理相处不好。若第 6 步报错,改用标准 OpenAI 通道(更可预测):
1 | python3 - << 'EOF' |
然后重启 CowAgent。
文件清单
| 路径 | 作用 |
|---|---|
~/.headroom-venv/ |
Headroom 专用 Python 虚拟环境 |
~/.headroom-start.sh |
Headroom 启动脚本(含环境变量配置) |
/etc/systemd/system/headroom.service |
systemd 服务文件 |
/var/log/headroom.log |
Headroom 运行日志 |
/root/CowAgent/config.json |
CowAgent 主配置(zhipu_ai_api_base 改成了 headroom) |
/root/CowAgent/config.json.bak.* |
改配置前的备份(回滚用) |


