Whale:一个 Go 写的 DeepSeek 终端编程 Agent
🐋 Whale:一个 Go 写的 DeepSeek 终端编程 Agent
用 Go 给 DeepSeek 写了一个终端里的编程助手,成本只有 Claude Code 的 1/30。
GitHub: github.com/usewhale/whale
一键安装: curl -fsSL https://raw.githubusercontent.com/usewhale/whale/main/scripts/install.sh | sh
为什么会有这个项目
先说说背景。
Claude Code 用起来确实爽,但价格摆在那里。Codex CLI 默认走 OpenAI,也不太符合我的需求。
DeepSeek 的价格大概是 Claude 的 1/20,而且有 prefix-cache 机制——如果请求的字节前缀跟上一次相同,缓存命中后输入 token 价格降到 1/10。
这个缓存特性对 Agent 场景很有价值:Agent 每轮对话的 system prompt、tool spec 都是重复的,如果 context 布局设计得好,缓存命中率能非常高。
但问题是,现有的 Agent 框架大多是”多模型通用”的,不会针对某一家模型的缓存特性做优化。所以干脆自己写一个。
技术实现
语言选型:Go
选择 Go 的原因:
- 单二进制分发,用户不用装 runtime
- 跨平台(macOS / Linux / Windows)支持容易
- 启动速度快,终端工具的核心体验
- TUI 用 Bubble Tea 生态,开发体验很好
核心设计:Cache-First Loop
Whale 的上下文布局把 DeepSeek 的 prefix-cache 作为一等公民来设计:
┌─────────────────────────────────────┐
│ 不可变前缀 │ ← 会话期间固定
│ system + tool specs + skills │ 缓存命中目标
├─────────────────────────────────────┤
│ 追加式对话日志 │ ← 每轮追加
│ [user][assistant][tool][user]... │ 保持前缀一致
├─────────────────────────────────────┤
│ 可变暂存区 │ ← 每轮重置
│ 推理 / 中间结果 │ 不参与下游请求
└─────────────────────────────────────┘
实测在真实开发会话中能达到 ~90% 的 prefix-cache 命中率。
工具调用修复层
DeepSeek 的 tool-call 有一些已知特性(不稳定 JSON、参数丢失等),Whale 在 Go 层做了专门的修复逻辑:
- scavenge:从
reasoning_content里恢复遗漏的 tool-call - flatten:深层 schema 自动展平
- recovery:JSON 截断恢复、调用风暴熔断
工具系统
内置了文件读写、grep 搜索、shell 执行、网页抓取等工具。通过 MCP 可以接入外部工具,通过 Skills 可以定义可复用的工作流。
一些数据
| 场景 | Whale (DeepSeek) | Claude Code 等价 | 节省 |
|---|---|---|---|
| 5 轮编程会话 | ~$0.001 | ~$0.015 | ~93% |
| 工具调用任务 | ~$0.00014 | ~$0.0034 | ~96% |
| R1 推理任务 | ~$0.0065 | ~$0.044 | ~85% |
快速上手
curl -fsSL https://raw.githubusercontent.com/usewhale/whale/main/scripts/install.sh | sh
whale setup # 配置 DeepSeek API key
whale # 启动 TUI
也可以在脚本里直接用:
whale exec "解释一下当前仓库的架构设计"
目前还在快速迭代中
如果觉得有意思,欢迎点个 ⭐:github.com/usewhale/whale
也欢迎提 issue、PR,或者来聊聊你觉得应该加什么功能。
关于 LearnKu
推荐文章: