先建立坐标系:一条鲸鱼的「去 DeepSeek 化」

工坊写 Crush 时说过,2025 下半年起 terminal coding agent 进入「周更军备竞赛」。Codewhale 是这场竞赛里最值得看的一个样本,因为它走了一条别人没走的路:主动斩断自己的原生模型出身。README「Project history」写得很直白:「Codewhale began as deepseek-tui and still preserves that configuration and session compatibility. It is now provider-neutral and independently maintained; it is not affiliated with any model provider.」——一个 DeepSeek 系 TUI,改名叫鲸鱼,然后宣布「我跟任何模型厂商都没关系」。

这不是营销话术,是能实测验证的工程决策:

对比一下这个生态里的另外两条路:MiMo-Code(小米)是「fork OpenCode 然后锁进自家模型闭环」,deepseek-reasonix 是「把 DeepSeek 的缓存经济学吃到极致」——Codewhale 是第三个方向:「模型自由」本身当卖点,默认值留给老东家。三种路线谁活得久,2026 下半年见分晓。眼下看数据:不到 8 个月 40.9K Star、周更、MIT、codewhale update 自更新、GitHub release 直接发 8 平台二进制(win/mac/linux × x64/arm64 + Android),工程成熟度明显不是玩具。

核心机制一:工具面只有 7 个——「反 Ruflo」的动态发现路线

工坊写 Ruflo 时算过一笔账:333 个 MCP 工具 ≈ 每轮 61,550 schema tokens,光工具定义就把上下文烧掉一大截。Codewhale 走了完全相反的路线。我用 mock 服务扒它 exec --auto 真实发出的请求,tools 数组里只有 7 个:

工具名作用(从 schema 描述实测扒取)
read读文件(offset/limit 分页),实测执行后返回内容 + content_hash="sha256:..."
write写文件(content/path)
edit一次性多处不相交替换(edits 数组,全部基于原文件匹配)
bash执行 shell 命令(带 justification 字段——要求模型说明为什么跑)
todo_write写完整待办清单(替换式,不是追加)——配合持久 /goal
agent启动子 agent(action: start + prompt,dependentSchemas 描述完整状态机)
tool_search工具发现:按 query 搜索可用工具(match 支持 bm25 等)——需要更多工具时现搜现用

核心设计是 tool_search:不把几百个工具的定义一次性塞进上下文,而是让模型按需「搜」出工具再调用。7 个常驻工具 schema 的总开销比 Ruflo 那种全家桶低一个数量级,代价是模型多一轮搜索推理。系统提示词我完整导出了:10,729 字符,开头是一段不像机器写的哲学(「You already have an A: begin from possibility and bring your whole attention.」「Invent no urgency or deadline.」「Failure is information. Check before concluding; never invent.」),尾部是 verbosity/translation 控制和 Registry 发现规则——提醒模型「熟悉的 shell 命令也不是跳过 Registry 发现的理由」。这种「少工具 + 动态发现 + 长人格提示词」的组合,是 2026 年上下文成本焦虑下的典型解法,跟 headroom(压缩一切)是同一焦虑的两张脸。

核心机制二:把「授权」写成契约——9 层流水线 + 类型化权限

这是 Codewhale 技术深度最硬的部分,也是它跟 Crush / opencode 拉开差距的地方。docs/AUTHORIZATION_ORDER.md 把「模型请求一个工具调用后会发生什么」写成了一张 9 层流水线表,每层只能加码不能减码:

这套契约不是 PPT——文档末尾列了对应的回归测试名(authorization_order_contract_matches_documented_precedence、hook_fold_deny_wins_over_ask_and_allow、full_access_permission_allow_cannot_bypass_background_catastrophic_floor……),仓库里 execpolicy crate 就是它的实现。另一个细节很戳人:「未知的模型价格保持未知,而不会被误报为免费」——这是 README 安全章节里的一句话,专门堵「价格表没配就显示 $0」的假省钱幻觉。跟 vibe-kanban 倒闭、ruflo 默认关加密对比着看,能感受到这个项目对「信任边界」的执念到了什么程度。

核心机制三:fleet + workflow——把多 agent 跑批做成可恢复的耐久运行

Codewhale 的多 agent 不叫「sub-agent 扇出」,叫 fleet(船队),定位是「local-first 的耐久多 worker 层」。架构上很讲究:fleet 只负责「谁参与」,不执行也不授权——成员选定后,由委托协调器拉起一个 headless codewhale exec 跑,Runtime 做耐久跟踪。命令行长这样:

codewhale fleet init
codewhale fleet run tasks.json --max-workers 4
codewhale fleet status / inspect <worker-id> / logs / artifacts / interrupt / restart
codewhale fleet resume <run-id>    # 重启恢复:重放 ledger、对心跳停止的 worker 重试或升级告警
codewhale fleet stop --all

成员身份是公开契约:稳定 member id + 语义角色(explore / implement / test / advisor,旧的 worker/scout/builder/verifier/oracle 拼写仍接受)+ 精确的 provider/model 或继承路由。自然语言选人是确定性的:点名 member id、唯一名字、唯一角色、精确模型 id(比如 deepseek-v4-flash)都行。状态全部落盘:.codewhale/fleet.jsonl ledger + .codewhale/fleet/ 日志目录,resume 是幂等的——笔记本休眠、manager 退出后重跑不重复起新活。旁边还挂着 workflow(入库的 workflow 文件)+ lane runtime(跑 workflow 实例),0.9.12 又加了 per-session 控制 socket(JSON-RPC:message / interrupt / relaunch / status)。这套「先记账再干活、账本可重放」的工程习惯,是冲着「agent 跑批必须能断电续传」去的。

核心机制四:0.9.12 的三个信号(9 月 4 日刚发)

上手:我在沙箱实测跑通的命令(含 mock 全链路)

Ubuntu 无头沙箱。官方推荐 curl -fsSL https://codewhale.net/install.sh | sh(装到 ~/.local/bin/codewhale),我直接下 GitHub release 的 codew-linux-x64(v0.9.12,69,543,680 字节 ≈ 66 MiB)。全链路:版本 → doctor → 无 key → 坏 key → 裸 exec → exec --auto + SSE mock 闭环,都走了一遍。

# 1) 安装(直接下载 release 二进制;npm/cargo/docker/nix/scoop/Termux 也行)
curl -sL https://github.com/Hmbown/Codewhale/releases/download/v0.9.12/codew-linux-x64 -o codew
chmod +x codew
./codew --version        # codewhale 0.9.12 (dcd4c200f72f)

# 2) 诊断(纯离线可跑)
./codew doctor
# config.toml not found at ~/.codewhale/config.toml (using defaults/env)
# legacy_path: /home/ubuntu/.deepseek/secrets/secrets.json (absent)  ← deepseek-tui 化石

# 3) 无 key 裸跑:报错清晰,还带 4 个补救方案
./codew exec "hi"
# error: DeepSeek API key not found.
# 1. Get a key: https://platform.deepseek.com/api_keys
# 2. codewhale auth set --provider deepseek
#    export DEEPSEEK_API_KEY=*** / api_key = "..." in ~/.codewhale/config.toml
#    codewhale auth external-consent --provider deepseek --mode read-only

# 4) 坏 key:不静默,但会回显 key 尾号
DEEPSEEK_API_KEY=sk-invalid-123 ./codew exec "say hi"
# error: Authentication failed: Authentication Fails, Your api key: ****-123 is invalid

# 5) 裸 exec = 一次性模型回复(不是 agent!)
#    本地 mock 记录:单发非流式 POST /v1/chat/completions,只有 1 条 user 消息,
#    无 system、无 tools、max_tokens=65536——mock 回文本它就原样打印 exit 0;
#    回 tool_call 它直接静默吞掉(无输出,exit 0)

# 6) exec --auto = 工具型 agent 模式(SSE 流式)
./codew exec --auto "read main.rs and summarize it in one line"
# tool: read_file (path: main.rs)
# tool read_file completed: content_hash="sha256:f32984..."  ← 本地真执行
# MOCK-DONE: 读到了 main.rs(mock 流式闭环完成)

# 7) 模型目录(离线只有 3 个 DeepSeek id,--update 才拉全)
./codew models
# * deepseek-v4-flash / deepseek-v4-pro / deepseek-v4-flash-vision-exp

mock 抓包的关键事实:请求统一打到 {base_url 的 origin}/v1/chat/completions(配置里写 /beta 也会被归一化),Authorization 正常带 Bearer sk-...,UA 是 Mozilla/5.0 (compatible; codewhale/0.9.12; +https://github.com/Hmbown/CodeWhale)。系统提示词 10,729 字符、7 个工具、tool_choice: auto、max_tokens 65536。全程 2 个请求闭环:req1 模型要 read_file → Codewhale 本地真执行(返回内容带 sha256 content_hash)→ req2 带 tool 结果 → 模型给最终文本。工具调用格式是标准 OpenAI function calling,tool_call_id 回传正确。

实测与踩坑:6 个坑,第 1 个最阴

对比:2025-26 Terminal Coding Agent 家族里的站位

维度CodewhaleCrushAiderOpenCode
出生2026-01(前身 deepseek-tui)2025-05(charmbracelet)2023-05(祖师爷)2025-04(社区/被广泛 fork)
语言 / 许可Rust / ✅ MITGo / ⚠️ FSL-1.1-MIT(两年内禁竞争性商用)Python / ✅ Apache-2.0TypeScript / ✅ MIT
Star / 状态40,913 / ✅ 周更(9/4 刚发 0.9.12)27,677 / ✅ 活跃48,605 / ⚠️ 休眠 3 个月205,072 / ✅ 活跃
模型面38 个内置 provider + Ollama/vLLM/SGLang,默认 DeepSeek,flash/pro 自动路由40 家 provider / 1,547 模型(社区目录日更)litellm 全家桶多后端 + 插件
工具设计7 常驻工具 + tool_search 动态发现(反全家桶)26 工具(8 个 LSP)SEARCH/REPLACE 编辑块 + repo map(首创)LSP + 插件生态
安全/授权✅ 9 层授权契约 + permissions.toml 类型化规则 + 3 档沙箱✅ approval 模式 + crushrc 即代码⚠️ 靠 git 兜底⚠️ 权限系统
多 agent / 耐久✅ fleet(ledger 可 resume)+ workflow/lane + 控制 socket——⚠️ 插件
独特卖点computer-use 内置默认禁用 / cloud dispatch / 价格未知不报免费Bubble Tea TUI 美学范式输出者(repo map/自动 commit)生态最大、被小米等 fork

一句话定位:aider 是「范式祖师爷」、OpenCode 是「生态最大公约数」、Crush 是「设计驱动的新贵」——Codewhale 则是「安全工程最较真的模型自由派」。它跟 Crush 是最直接的竞品(都是 2025 下半年冒头、都周更、都主打「模型随便接」),但气质完全不同:Crush 的配置是「可执行 Bash」(crushrc,信任即代码),Codewhale 的配置是「9 层授权流水线 + 类型化规则 + 只能收紧的项目 overlay」(信任要分层审计)。前者浪漫,后者适合当生产基础设施。

值不值得装:三个场景对号入座

最后说句公道话:Codewhale 不是没有隐忧——周更节奏意味着 changelog 永远比教程新,exec/exec --auto 这种「同名不同命」的命令设计对新手不友好,默认 DeepSeek + 默认 max 推理 + 默认开统计的组合拳也说明它的「默认值」是站在老用户(deepseek-tui 迁移者)而非新用户立场上的。但论工程密度、授权严谨度和「模型自由」的彻底程度,40.9K Star 里没有水分。MIT,仓库 github.com/Hmbown/Codewhale,官方安装 curl -fsSL https://codewhale.net/install.sh | sh——一条从 DeepSeek 游向整片海的鲸鱼,2026 年最值得盯的 Rust coding agent 之一。