1. 从 GitHub 拉源码到本地跑通:Claude Code Haha 是什么、适合谁
Claude Code Haha 是一个把 Claude Code 重新组织成桌面工作台的开源项目,仓库主体用 TypeScript 写成(占比 99% 以上),三个月左右在 GitHub 上攒到 12W stars 量级。它和纯命令行式的 AI 编程工具最大的区别在于形态:把会话、多项目切换、分支 / Worktree、代码 Diff、权限确认、提供商配置、远程入口这些原本散落在终端和多个窗口里的操作,收拢进一个图形化工作区。你不需要长期待在终端里敲命令,也能完成日常的 AI 辅助编码流程。
它适合几类人:经常同时推进多个项目、需要频繁切 branch 或 Worktree 的开发者;希望在对话过程中直接看右侧代码 Diff、而不是靠终端输出猜改动的人;想把权限确认、工具调用审批、AI 反问集中在一个界面处理的人;以及想通过一次性令牌从手机或其他设备临时接入当前桌面会话的人。对刚接触 AI 编程工具的小白来说,它的图形化审批流也比纯 CLI 更友好——危险命令会弹确认,不会一上来就把你的工作区改乱。
这篇要解决的核心问题是:怎么从 GitHub 把这份 TypeScript 源码拉到本地,装依赖、配环境变量、启动 CLI,并验证基础对话真的能用。很多人卡在bun install之后的.env配置和启动命令上,或者启动成功了但一发请求就 401。下面按「环境准备 → 依赖安装 → 配置项 → 启动 → 验证 → 排错」的顺序走一遍,配置片段都可以直接复制。模型服务这一侧,我用统一 Key / API 通道接入,官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,API 地址是 https://taotoken.net/api ,后面配置里会反复出现。
先明确一点:源码跑通和桌面端安装包是两条路径。桌面端去 Releases 下 dmg / exe / AppImage 就行,但如果你想调试底层 CLI、改服务端逻辑、或者准备自己二次开发,就必须走源码这条路。源码路径的产物是./bin/claude-haha这个 CLI 入口,桌面端只是它的一个壳。所以本文聚焦源码,桌面端只在必要处提一句。
环境上你需要:Node.js 18+(建议 20 LTS)、bun(项目用 bun 做包管理和脚本运行)、git,以及一个可用的模型 API Key。操作系统 macOS / Linux / Windows(WSL2 更稳)都行。下面每一步我都会给出实际命令和预期输出,你照着敲即可。
2. 前置准备:bun 环境、仓库拉取与统一 Key 通道
这一节把「跑起来之前必须就位的东西」一次配齐。顺序是:装 bun → clone 仓库 → 装依赖 → 准备 API Key。任何一步跳过,后面启动都会报错,所以别嫌啰嗦。
装 bun。项目根目录的脚本和依赖安装都依赖 bun,用 npm 装也能跑但容易和 lockfile 对不上。macOS / Linux 一行搞定:
curl -fsSL https://bun.sh/install | bashWindows 在 PowerShell 里:
powershell -c "irm bun.sh/install.ps1 | iex"装完关掉终端重开,验证:
bun --version # 预期输出类似 1.1.xclone 仓库。仓库地址是NanmiCoder/cc-haha,注意别 clone 成同名的其他 fork:
git clone https://github.com/NanmiCoder/cc-haha.git cd cc-haha进去之后先看一眼目录结构,确认package.json、bin/、.env.example都在。bin/claude-haha就是后面要启动的入口脚本,src/下是 TypeScript 源码主体。
装依赖。在仓库根目录执行:
bun install预期会看到依赖树解析和下载进度,最后输出installed之类的汇总行。如果卡在某个 native 包(比如涉及 Rust 侧的 0.3% 模块)编译失败,先确认本机有基础编译工具链:macOS 装 Xcode Command Line Tools(xcode-select --install),Linux 装build-essential,Windows 用 WSL2 最省事。
准备 API Key。这是最容易翻车的一步。Claude Code Haha 支持 Anthropic 兼容 API 和第三方模型提供商,我这边统一走 TaoToken 的 API 通道,好处是一个 Key 管多个模型、Base URL 固定、不用在多个供应商后台之间来回切。操作路径:
- 打开 https://taotoken.net/api ,注册并登录;
- 进控制台 https://taotoken.net/console ;
- 在 API Keys 页面 https://taotoken.net/api-keys 创建一个 Key,复制保存(只显示一次);
- 记下 Base URL:
https://taotoken.net/api。
拿到 Key 之后先别急着写进项目,先在 shell 里验证通道本身是通的:
curl https://taotoken.net/api/v1/models \ -H "Authorization: Bearer sk-你的Key"返回一个模型列表 JSON 就说明 Key 和通道都没问题。这一步能帮你把「Key 无效」和「项目配置错」两类问题提前分开,后面排错会省很多时间。模型对话入口在 https://taotoken.net/chat ,如果你想先在网页里试一下模型响应是否正常,也可以从那里发一条消息确认。
到这里前置就齐了:bun 可用、仓库在本地、依赖装完、Key 验证通过。下一节开始写配置。
3. 可复制配置:.env、settings 与启动命令
这一节是全文的核心,配置片段都按项目实际路径给,复制后改 Key 就能用。Claude Code Haha 的配置分两层:项目根目录的.env(进程级环境变量)和 CLI 的全局设置(模型、提供商、权限策略)。两层都要对,缺一层就会出现「启动成功但请求 401」或者「模型 ID 不识别」。
第一步:生成 .env。仓库自带.env.example,直接复制:
cp .env.example .env然后编辑.env,把模型服务这一段填成统一通道。下面是我实测可用的最小配置,字段名以你 clone 下来的.env.example为准,值按这个填:
# 模型服务:统一 Key / API 通道 ANTHROPIC_BASE_URL=https://taotoken.net/api ANTHROPIC_AUTH_TOKEN=sk-你的Key ANTHROPIC_MODEL=claude-sonnet-4-20250514 # 可选:小模型走同一通道,用于标题生成、摘要等轻量任务 ANTHROPIC_SMALL_FAST_MODEL=claude-haiku-4-20250514 # 工作区与日志 WORKSPACE_ROOT=./workspace LOG_LEVEL=info三个关键点解释一下。ANTHROPIC_BASE_URL指向https://taotoken.net/api,注意不要带/v1,SDK 会自己拼路径,多写一段就 404。ANTHROPIC_AUTH_TOKEN放你的 Key,这个变量名是 Anthropic 兼容 SDK 认的,别写成OPENAI_API_KEY。ANTHROPIC_MODEL填你要用的模型 ID,必须和通道返回的模型列表一致,写错会报model not found。
第二步:CLI 全局设置。项目支持全局配置文件,路径通常在用户目录下(macOS / Linux 是~/.claude-haha/settings.json,Windows 在%USERPROFILE%\.claude-haha\settings.json)。没有就手动建:
{ "provider": "anthropic-compatible", "baseUrl": "https://taotoken.net/api", "apiKeyEnv": "ANTHROPIC_AUTH_TOKEN", "defaultModel": "claude-sonnet-4-20250514", "permissions": { "allowFileWrite": true, "confirmDangerousCommands": true }, "worktree": { "enabled": true, "root": "./worktrees" } }这里apiKeyEnv指向环境变量名而不是明文 Key,避免把密钥写进配置文件被误提交。confirmDangerousCommands: true建议保持开启,危险命令会走审批流,这是它相对纯 CLI 的一个实用点。worktree.enabled打开后,新会话可以选择隔离 Worktree,多任务并行时不互相污染工作区。
第三步:启动命令。依赖和配置就位后,在仓库根目录执行:
./bin/claude-haha如果提示权限不足:
chmod +x ./bin/claude-haha ./bin/claude-haha想指定配置文件或工作区,可以带参数(以--help输出为准):
./bin/claude-haha --workspace ./workspace --config ~/.claude-haha/settings.json启动后 CLI 会打印版本、当前 provider、默认模型和工作区路径。看到这几行就说明进程起来了,但「起来」不等于「能用」,下一节专门验证请求链路。
注意:
.env和settings.json里的 Base URL 必须完全一致,都是https://taotoken.net/api。我见过有人.env写对了、settings 里还留着旧的第三方地址,结果 CLI 读 settings 优先,一直 401,查了半天。
4. 验证请求:从启动成功到基础对话可用
配置写完必须验证,否则你永远不知道是「没启动」还是「启动了但请求挂了」。这一节给三个递进的验证动作:进程级、通道级、对话级。每一级都有明确的成功标志,任何一级不过就停在那里排,别往下跳。
验证一:进程启动。执行./bin/claude-haha后,预期输出大致是:
Claude Code Haha CLI v0.4.x provider: anthropic-compatible baseUrl: https://taotoken.net/api model: claude-sonnet-4-20250514 workspace: /path/to/cc-haha/workspace ready>看到ready>提示符就说明进程、配置加载、工作区初始化都过了。如果这里就报错,多半是.env没被读到或者 bun 依赖没装全,回到上一节检查。
验证二:通道连通。在另一个终端用同样的 Key 打一次模型列表接口,确认通道本身没问题:
curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" | head -c 400返回 JSON 数组、里面有模型 ID,说明 Key 有效、Base URL 正确。这一步和项目无关,纯粹隔离变量:如果这里就失败,问题在 Key 或通道,不在代码。
验证三:基础对话。回到ready>提示符,发一条最简单的消息:
ready> 用一句话说明这个仓库是做什么的预期行为:CLI 发起一次流式请求,终端逐字输出模型回复,结束后回到ready>。成功标志是有内容输出且没有报错栈。如果输出到一半断了,看是不是ANTHROPIC_SMALL_FAST_MODEL填了不存在的模型——轻量任务会走小模型,小模型 ID 错会导致中途失败。
再验证一次工具调用链路,这是 Claude Code 类工具的核心能力:
ready> 列出当前工作区根目录下的文件预期它会请求执行一个列目录的命令,因为confirmDangerousCommands: true,会先弹确认,你输入同意后它执行并返回文件列表。这一步过了,说明「对话 + 工具审批 + 执行」整条链路是通的,不只是聊天机器人。
验证四(可选):Worktree 会话。如果你的settings.json开了 worktree,新建会话时选择隔离 Worktree,确认它在./worktrees下创建了独立目录,且主工作区没被改动。这是多任务并行的关键,验证一次心里有底。
四级验证全过,源码就算真正跑通了。整个过程里最容易出问题的是验证三,下一节把常见报错逐个拆开。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
这一节按真实报错信息组织,你遇到哪条对哪条。所有报错都来自实际跑源码时的终端输出,不是编的。
报错一:401 Unauthorized/invalid api key。最常见,原因有三类。第一,Key 复制时带了空格或换行,ANTHROPIC_AUTH_TOKEN值首尾有空白,重新复制一次。第二,.env和settings.json的 Base URL 不一致,CLI 读 settings 优先,检查两处都是https://taotoken.net/api。第三,Key 本身失效或额度问题,用第 4 节的 curl 单独验证通道。排查顺序:先 curl 验 Key,再对两处 Base URL,最后看.env是否真的被加载(可以在启动日志里看它打印的 baseUrl)。
报错二:local proxy failed/ECONNREFUSED。这个通常出现在你配置了本地代理端口但代理没起来,或者ANTHROPIC_BASE_URL被误写成http://localhost:xxxx。检查.env里 Base URL 是不是被改成了本地地址;如果你本机有环境变量HTTP_PROXY/HTTPS_PROXY指向一个不存在的端口,也会触发。临时清掉再启动:
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY ./bin/claude-haha报错三:reading 'choices'/Cannot read properties of undefined (reading 'choices')。这是响应体结构和预期不符导致的。典型原因是 Base URL 指向了一个 OpenAI 格式的端点,但客户端按 Anthropic 格式解析(或反过来)。统一通道的 Anthropic 兼容端点是https://taotoken.net/api,不要手动拼/v1/chat/completions。另外确认ANTHROPIC_MODEL是通道支持的模型 ID,模型不存在时部分网关会返回错误结构,客户端解析时就炸在choices上。
报错四:OAuth相关 /authentication failed。源码版默认走 API Key 认证,如果你之前登录过官方账号、本地残留了 OAuth 凭据,可能会优先走 OAuth 导致冲突。清掉本地凭据目录(通常在~/.claude-haha/或~/.claude/下与 auth 相关的文件),确保ANTHROPIC_AUTH_TOKEN生效。启动日志里如果显示auth: oauth而不是auth: api-key,就是这个原因。
报错五:bun install后启动报模块找不到。多半是 Node 版本过低或 bun 版本和 lockfile 不匹配。确认node -v≥ 18,bun --version和仓库package.json里 engines 要求一致,然后删掉node_modules和 lockfile 重装:
rm -rf node_modules bun.lockb bun install报错六:桌面端首次打开提示「已损坏」。这是 macOS 未签名应用的隔离属性,源码 CLI 不受影响,但如果你同时装了桌面端,执行:
xattr -cr /Applications/Claude\ Code\ Haha.appWindows 的 SmartScreen 提示点「更多信息 → 仍要运行」即可。
排查通用原则:先隔离层级。curl 验通道 → 看启动日志的 baseUrl / model / auth 三行 → 再发对话。三层里哪层先失败就修哪层,不要一上来就改代码。我踩过的坑是.env改了没重启进程,CLI 只在启动时读一次环境变量,改完必须重启。
6. 长期使用与接入建议:Coding Plan、文档与模型对话入口
源码跑通只是起点,真正日常用起来还要考虑几件事:Key 怎么管、模型怎么选、长期编码任务走什么通道、出问题去哪查文档。
Key 与通道管理。统一通道的好处是一个 Key 覆盖多个模型,切换模型只改ANTHROPIC_MODEL,不用换 Key 换 Base URL。Key 建议按用途分:日常对话一个、长期编码任务一个,方便在控制台看用量。API Keys 管理页在 https://taotoken.net/api-keys ,用量和额度在控制台 https://taotoken.net/console 看。不要把 Key 明文写进settings.json或提交到 git,用apiKeyEnv指向环境变量是更稳的做法。
长期编码 / Agent 任务。如果你打算让 Claude Code Haha 跑长时间的编码任务、多轮 Agent 循环,建议走 Coding Plan 通道,配额和计费模型更适合持续调用,入口在 https://taotoken.net/coding-plan 。短对话、临时验证用按量 Key 就行,两者可以并存,配置里换 Base URL 或 Key 即可切换。
模型选择。主模型用能力强的(如 sonnet 系列)负责编码和推理,小模型用轻量的(如 haiku 系列)负责标题生成、摘要、意图分类这类轻任务,通过ANTHROPIC_SMALL_FAST_MODEL分开配。这样既保证效果又控制成本。模型 ID 以通道/v1/models返回的为准,别凭记忆写。
文档与排错。接入细节、环境变量完整列表、全局使用说明在文档页 https://taotoken.net/doc ,遇到配置项不确定先查这里。Claude Code 相关的接入说明(包括 Anthropic 兼容配置)在 https://taotoken.net/ClaudeCodeAnthropic ,如果你要把这套配置复用到其他 Anthropic 兼容客户端,那份文档的字段名可以直接对照。想先在网页里验证模型响应、对比不同模型输出,用模型对话入口 https://taotoken.net/chat ,比在终端里反复试快。
二次开发提示。这份源码 TypeScript 占 99% 以上,改业务逻辑基本都在src/下,Rust 那 0.3% 是少量 native 模块,不碰它不影响主流程。改完用bun run build(以package.jsonscripts 为准)重新构建,再./bin/claude-haha启动验证。调试 CLI 时把LOG_LEVEL调到debug,能看到完整的请求 URL、模型 ID 和响应状态,排 401 和reading choices特别有用。
最后给一个实用习惯:每次改完.env或settings.json,先跑第 4 节的 curl 通道验证,再重启 CLI 发一条对话。两步都过再开始正式干活,比改完直接上生产任务、中途报错再回头查要省时间得多。源码跑通不难,难的是配置一致性——Base URL、Key、Model ID 三件套在.env、settings.json、启动参数里保持同一套值,基本就不会出问题。