Pi(pi-coding-agent)、dsh(DeepSeek Harness)、opencode 都是终端里的编码 Agent,但定位差得远。先分清三者,再记 Pi 怎么配到本机 llama.cpp 服务上。
一、三者区别
| opencode | pi | dsh | |
|---|---|---|---|
| 定位 | 成熟的终端编码 Agent | 极简 harness(框架) | DeepSeek 官方的 Agent 运行时 |
| 协议 | 开源 | 开源(MIT) | 开源(MIT) |
| 内置工具 | 齐全、开箱即用 | 只有 4 个(read/write/edit/bash) | 插件化,无固定核心 |
| 子 agent / plan / MCP | 内置 | 刻意砍掉,靠自己装扩展 | 靠插件 |
| 模型 | 支持多家 | 15+ 供应商,可中途切模型 | 70+ 供应商,模型即插件 |
| 特点 | 稳定、日常首选 | 系统提示词 <1000 token,context 几乎全留给工作 | 万物皆插件(Cordis),实验性 |
一句话:opencode 是成熟工具,pi 是极简零件箱,dsh 是插件生态。都不锁模型、都开源免费,差别在「极简程度」和「插件化程度」。
二、装 Pi
1 | npm install -g @earendil-works/pi-coding-agent |
验证:
1 | pi --version |
Pi 的包名是 @earendil-works/pi-coding-agent,命令行入口叫 pi。
三、连本机 llama.cpp 服务
本机跑着 llama-server 起的 OpenAI 兼容接口(端口 20000),Pi 直接走 OpenAI 兼容这条路。
设环境变量:
1 | setx OPENAI_API_KEY "local" |
OPENAI_API_KEY 本地服务不校验,随便填占位即可;OPENAI_BASE_URL 指向 llama-server 的 /v1 端点。
改完重开终端,让环境变量生效。验证服务通不通:
1 | curl http://127.0.0.1:20000/v1/models |
返回 JSON 里能看到模型名(如 qwen3-30b-a3b)即可。
启动 Pi:
1 | pi |
进去后用 /model 把模型设成服务里的模型名。常用命令:
| 命令 | 作用 |
|---|---|
/model |
切换模型 |
/login |
用订阅登录(Claude Pro/Max、ChatGPT Plus 等) |
/help |
帮助 |
四、Pi 的核心哲学
Pi 只有 4 个内置工具:read、write、edit、bash,其余操作全交给 bash(git/npm/curl 都靠它)。子 agent、plan 模式、MCP、联网搜索默认都没有,需要时靠 TypeScript 扩展、Skills、包自己加。
这也带来一个后果:Pi 不帮你压缩上下文,塞进去的指令文件会原样发给模型,token 消耗比 opencode 更快,指令文件要精简。
五、本机 llama-server 参考
opencode 里 llama-local 这个 provider 用的就是同一套服务:
1 | { |
opencode 和 pi 可以共存,指向同一个 20000 端口,不冲突。本地模型走 OpenAI 兼容接口是通用做法,任何支持自定义 baseURL 的编码 Agent 都能这么接。