62bb0169bb
Cover three frequently reported problems: - usage.input_tokens error from misconfigured ANTHROPIC_BASE_URL - Cannot find package 'bundle' from outdated Bun version - How to use non-Anthropic models (OpenAI/DeepSeek/Ollama) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
294 lines
9.6 KiB
Markdown
294 lines
9.6 KiB
Markdown
# Claude Code Haha
|
||
|
||
<p align="right"><strong>中文</strong> | <a href="./README.en.md">English</a></p>
|
||
|
||
基于 Claude Code 泄露源码修复的**本地可运行版本**,支持接入任意 Anthropic 兼容 API(如 MiniMax、OpenRouter 等)。
|
||
|
||
> 原始泄露源码无法直接运行。本仓库修复了启动链路中的多个阻塞问题,使完整的 Ink TUI 交互界面可以在本地工作。
|
||
|
||
<p align="center">
|
||
<img src="docs/00runtime.png" alt="运行截图" width="800">
|
||
</p>
|
||
|
||
## 功能
|
||
|
||
- 完整的 Ink TUI 交互界面(与官方 Claude Code 一致)
|
||
- `--print` 无头模式(脚本/CI 场景)
|
||
- 支持 MCP 服务器、插件、Skills
|
||
- 支持自定义 API 端点和模型([第三方模型使用指南](docs/third-party-models.md))
|
||
- 降级 Recovery CLI 模式
|
||
|
||
---
|
||
|
||
## 架构概览
|
||
|
||
<table>
|
||
<tr>
|
||
<td align="center" width="25%"><img src="docs/01-overall-architecture.png" alt="整体架构"><br><b>整体架构</b></td>
|
||
<td align="center" width="25%"><img src="docs/02-request-lifecycle.png" alt="请求生命周期"><br><b>请求生命周期</b></td>
|
||
<td align="center" width="25%"><img src="docs/03-tool-system.png" alt="工具系统"><br><b>工具系统</b></td>
|
||
<td align="center" width="25%"><img src="docs/04-multi-agent.png" alt="多 Agent 架构"><br><b>多 Agent 架构</b></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center" width="25%"><img src="docs/05-terminal-ui.png" alt="终端 UI"><br><b>终端 UI</b></td>
|
||
<td align="center" width="25%"><img src="docs/06-permission-security.png" alt="权限与安全"><br><b>权限与安全</b></td>
|
||
<td align="center" width="25%"><img src="docs/07-services-layer.png" alt="服务层"><br><b>服务层</b></td>
|
||
<td align="center" width="25%"><img src="docs/08-state-data-flow.png" alt="状态与数据流"><br><b>状态与数据流</b></td>
|
||
</tr>
|
||
</table>
|
||
|
||
---
|
||
|
||
## 快速开始
|
||
|
||
### 1. 安装 Bun
|
||
|
||
本项目运行依赖 [Bun](https://bun.sh)。如果你的电脑还没有安装 Bun,可以先执行下面任一方式:
|
||
|
||
```bash
|
||
# macOS / Linux(官方安装脚本)
|
||
curl -fsSL https://bun.sh/install | bash
|
||
```
|
||
|
||
如果在精简版 Linux 环境里提示 `unzip is required to install bun`,先安装 `unzip`:
|
||
|
||
```bash
|
||
# Ubuntu / Debian
|
||
apt update && apt install -y unzip
|
||
```
|
||
|
||
```bash
|
||
# macOS(Homebrew)
|
||
brew install bun
|
||
```
|
||
|
||
```powershell
|
||
# Windows(PowerShell)
|
||
powershell -c "irm bun.sh/install.ps1 | iex"
|
||
```
|
||
|
||
安装完成后,重新打开终端并确认:
|
||
|
||
```bash
|
||
bun --version
|
||
```
|
||
|
||
### 2. 安装项目依赖
|
||
|
||
```bash
|
||
bun install
|
||
```
|
||
|
||
### 3. 配置环境变量
|
||
|
||
复制示例文件并填入你的 API Key:
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
```
|
||
|
||
编辑 `.env`(以下示例使用 [MiniMax](https://platform.minimaxi.com/subscribe/token-plan?code=1TG2Cseab2&source=link) 作为 API 提供商,也可替换为其他兼容服务):
|
||
|
||
```env
|
||
# API 认证(二选一)
|
||
ANTHROPIC_API_KEY=sk-xxx # 标准 API Key(x-api-key 头)
|
||
ANTHROPIC_AUTH_TOKEN=sk-xxx # Bearer Token(Authorization 头)
|
||
|
||
# API 端点(可选,默认 Anthropic 官方)
|
||
ANTHROPIC_BASE_URL=https://api.minimaxi.com/anthropic
|
||
|
||
# 模型配置
|
||
ANTHROPIC_MODEL=MiniMax-M2.7-highspeed
|
||
ANTHROPIC_DEFAULT_SONNET_MODEL=MiniMax-M2.7-highspeed
|
||
ANTHROPIC_DEFAULT_HAIKU_MODEL=MiniMax-M2.7-highspeed
|
||
ANTHROPIC_DEFAULT_OPUS_MODEL=MiniMax-M2.7-highspeed
|
||
|
||
# 超时(毫秒)
|
||
API_TIMEOUT_MS=3000000
|
||
|
||
# 禁用遥测和非必要网络请求
|
||
DISABLE_TELEMETRY=1
|
||
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
|
||
```
|
||
|
||
> **提示**:除了 `.env` 文件,你也可以通过 `~/.claude/settings.json` 的 `env` 字段配置环境变量。这与官方 Claude Code 的配置方式一致:
|
||
>
|
||
> ```json
|
||
> {
|
||
> "env": {
|
||
> "ANTHROPIC_AUTH_TOKEN": "sk-xxx",
|
||
> "ANTHROPIC_BASE_URL": "https://api.minimaxi.com/anthropic",
|
||
> "ANTHROPIC_MODEL": "MiniMax-M2.7-highspeed"
|
||
> }
|
||
> }
|
||
> ```
|
||
>
|
||
> 配置优先级:环境变量 > `.env` 文件 > `~/.claude/settings.json`
|
||
|
||
### 4. 启动
|
||
|
||
#### macOS / Linux
|
||
|
||
```bash
|
||
# 交互 TUI 模式(完整界面)
|
||
./bin/claude-haha
|
||
|
||
# 无头模式(单次问答)
|
||
./bin/claude-haha -p "your prompt here"
|
||
|
||
# 管道输入
|
||
echo "explain this code" | ./bin/claude-haha -p
|
||
|
||
# 查看所有选项
|
||
./bin/claude-haha --help
|
||
```
|
||
|
||
#### Windows
|
||
|
||
> **前置要求**:必须安装 [Git for Windows](https://git-scm.com/download/win)(提供 Git Bash,项目内部 Shell 执行依赖它)。
|
||
|
||
Windows 下启动脚本 `bin/claude-haha` 是 bash 脚本,无法在 cmd / PowerShell 中直接运行。请使用以下方式:
|
||
|
||
**方式一:PowerShell / cmd 直接调用 Bun(推荐)**
|
||
|
||
```powershell
|
||
# 交互 TUI 模式
|
||
bun --env-file=.env ./src/entrypoints/cli.tsx
|
||
|
||
# 无头模式
|
||
bun --env-file=.env ./src/entrypoints/cli.tsx -p "your prompt here"
|
||
|
||
# 降级 Recovery CLI
|
||
bun --env-file=.env ./src/localRecoveryCli.ts
|
||
```
|
||
|
||
**方式二:Git Bash 中运行**
|
||
|
||
```bash
|
||
# 在 Git Bash 终端中,与 macOS/Linux 用法一致
|
||
./bin/claude-haha
|
||
```
|
||
|
||
> **注意**:部分功能(语音输入、Computer Use、Sandbox 隔离等)在 Windows 上不可用,不影响核心 TUI 交互。
|
||
|
||
---
|
||
|
||
## 环境变量说明
|
||
|
||
| 变量 | 必填 | 说明 |
|
||
|------|------|------|
|
||
| `ANTHROPIC_API_KEY` | 二选一 | API Key,通过 `x-api-key` 头发送 |
|
||
| `ANTHROPIC_AUTH_TOKEN` | 二选一 | Auth Token,通过 `Authorization: Bearer` 头发送 |
|
||
| `ANTHROPIC_BASE_URL` | 否 | 自定义 API 端点,默认 Anthropic 官方 |
|
||
| `ANTHROPIC_MODEL` | 否 | 默认模型 |
|
||
| `ANTHROPIC_DEFAULT_SONNET_MODEL` | 否 | Sonnet 级别模型映射 |
|
||
| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | 否 | Haiku 级别模型映射 |
|
||
| `ANTHROPIC_DEFAULT_OPUS_MODEL` | 否 | Opus 级别模型映射 |
|
||
| `API_TIMEOUT_MS` | 否 | API 请求超时,默认 600000 (10min) |
|
||
| `DISABLE_TELEMETRY` | 否 | 设为 `1` 禁用遥测 |
|
||
| `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` | 否 | 设为 `1` 禁用非必要网络请求 |
|
||
|
||
---
|
||
|
||
## 降级模式
|
||
|
||
如果完整 TUI 出现问题,可以使用简化版 readline 交互模式:
|
||
|
||
```bash
|
||
CLAUDE_CODE_FORCE_RECOVERY_CLI=1 ./bin/claude-haha
|
||
```
|
||
|
||
---
|
||
|
||
## 相对于原始泄露源码的修复
|
||
|
||
泄露的源码无法直接运行,主要修复了以下问题:
|
||
|
||
| 问题 | 根因 | 修复 |
|
||
|------|------|------|
|
||
| TUI 不启动 | 入口脚本把无参数启动路由到了 recovery CLI | 恢复走 `cli.tsx` 完整入口 |
|
||
| 启动卡死 | `verify` skill 导入缺失的 `.md` 文件,Bun text loader 无限挂起 | 创建 stub `.md` 文件 |
|
||
| `--print` 卡死 | `filePersistence/types.ts` 缺失 | 创建类型桩文件 |
|
||
| `--print` 卡死 | `ultraplan/prompt.txt` 缺失 | 创建资源桩文件 |
|
||
| **Enter 键无响应** | `modifiers-napi` native 包缺失,`isModifierPressed()` 抛异常导致 `handleEnter` 中断,`onSubmit` 永远不执行 | 加 try-catch 容错 |
|
||
| setup 被跳过 | `preload.ts` 自动设置 `LOCAL_RECOVERY=1` 跳过全部初始化 | 移除默认设置 |
|
||
|
||
---
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
bin/claude-haha # 入口脚本
|
||
preload.ts # Bun preload(设置 MACRO 全局变量)
|
||
.env.example # 环境变量模板
|
||
src/
|
||
├── entrypoints/cli.tsx # CLI 主入口
|
||
├── main.tsx # TUI 主逻辑(Commander.js + React/Ink)
|
||
├── localRecoveryCli.ts # 降级 Recovery CLI
|
||
├── setup.ts # 启动初始化
|
||
├── screens/REPL.tsx # 交互 REPL 界面
|
||
├── ink/ # Ink 终端渲染引擎
|
||
├── components/ # UI 组件
|
||
├── tools/ # Agent 工具(Bash, Edit, Grep 等)
|
||
├── commands/ # 斜杠命令(/commit, /review 等)
|
||
├── skills/ # Skill 系统
|
||
├── services/ # 服务层(API, MCP, OAuth 等)
|
||
├── hooks/ # React hooks
|
||
└── utils/ # 工具函数
|
||
```
|
||
|
||
---
|
||
|
||
## 技术栈
|
||
|
||
| 类别 | 技术 |
|
||
|------|------|
|
||
| 运行时 | [Bun](https://bun.sh) |
|
||
| 语言 | TypeScript |
|
||
| 终端 UI | React + [Ink](https://github.com/vadimdemedes/ink) |
|
||
| CLI 解析 | Commander.js |
|
||
| API | Anthropic SDK |
|
||
| 协议 | MCP, LSP |
|
||
|
||
---
|
||
|
||
## 常见问题
|
||
|
||
### Q: `undefined is not an object (evaluating 'usage.input_tokens')`
|
||
|
||
**原因**:`ANTHROPIC_BASE_URL` 配置不正确,API 端点返回的不是 Anthropic 协议格式的 JSON,而是 HTML 页面或其他格式。
|
||
|
||
本项目使用 **Anthropic Messages API 协议**,`ANTHROPIC_BASE_URL` 必须指向一个兼容 Anthropic `/v1/messages` 接口的端点。Anthropic SDK 会自动在 base URL 后面拼接 `/v1/messages`,所以:
|
||
|
||
- MiniMax:`ANTHROPIC_BASE_URL=https://api.minimaxi.com/anthropic` ✅
|
||
- OpenRouter:`ANTHROPIC_BASE_URL=https://openrouter.ai/api` ✅
|
||
- OpenRouter 错误写法:`ANTHROPIC_BASE_URL=https://openrouter.ai/anthropic` ❌(返回 HTML)
|
||
|
||
如果你的模型供应商只支持 OpenAI 协议,需要通过 LiteLLM 等代理做协议转换,详见 [第三方模型使用指南](docs/third-party-models.md)。
|
||
|
||
### Q: `Cannot find package 'bundle'`
|
||
|
||
```
|
||
error: Cannot find package 'bundle' from '.../claude-code-haha/src/entrypoints/cli.tsx'
|
||
```
|
||
|
||
**原因**:Bun 版本过低,不支持项目所需的 `bun:bundle` 等内置模块。
|
||
|
||
**解决**:升级 Bun 到最新版本:
|
||
|
||
```bash
|
||
bun upgrade
|
||
```
|
||
|
||
### Q: 怎么接入 OpenAI / DeepSeek / Ollama 等非 Anthropic 模型?
|
||
|
||
本项目只支持 Anthropic 协议。如果模型供应商不直接支持 Anthropic 协议,需要用 [LiteLLM](https://github.com/BerriAI/litellm) 等代理做协议转换(OpenAI → Anthropic)。
|
||
|
||
详细配置步骤请参考:[第三方模型使用指南](docs/third-party-models.md)
|
||
|
||
---
|
||
|
||
## Disclaimer
|
||
|
||
本仓库基于 2026-03-31 从 Anthropic npm registry 泄露的 Claude Code 源码。所有原始源码版权归 [Anthropic](https://www.anthropic.com) 所有。仅供学习和研究用途。
|