npm package: @hangox/codemaker-proxy
Description: 将网易 CodeMaker API 转换为 Anthropic Messages API，供 Claude Code 使用
Latest version: 1.2.0

# CodeMaker Proxy

将网易 CodeMaker API（OpenAI 兼容格式）转换为 Anthropic Messages API，让 Claude Code 可以通过 CodeMaker 的模型配额使用 Claude 系列模型。

## 工作原理

```
Claude Code (Anthropic Messages API)
  → codemaker-proxy (localhost:4321)
    → Anthropic Messages → OpenAI Chat Completions 格式转换
    → HMAC-SHA256 签名 + JWT 认证
    → api-code-maker.nie.netease.com
    → OpenAI SSE → Anthropic SSE 格式转换
  → Claude Code
```

## 前置条件

- Node.js >= 18
- 已安装并登录 [CodeMaker CLI](https://codemaker.netease.com)（用于获取 API Token）
- 网络可达 `api-code-maker.nie.netease.com`（可能需要代理）

## 快速开始

### 方式一：npx 直接运行（推荐）

无需 clone 仓库，一条命令启动：

```bash
# 只启动代理
npx @hangox/codemaker-proxy

# 启动代理 + 自动拉起 Claude Code
npx @hangox/codemaker-proxy claude

# 指定模型
npx @hangox/codemaker-proxy claude -m haiku

# 走 HTTP 代理
npx @hangox/codemaker-proxy --proxy http://127.0.0.1:7897 claude -m sonnet
```

### 方式二：全局安装

```bash
npm install -g @hangox/codemaker-proxy

# 之后直接使用
codemaker-proxy claude -m haiku
```

### 方式三：源码运行（开发用）

```bash
git clone <repo-url> && cd codemaker-proxy
npm install
npx tsx src/index.ts
```

## CLI 用法

```
codemaker-proxy [选项]
codemaker-proxy claude [选项] [claude 参数...]
```

### 选项

| 参数 | 说明 | 默认值 |
|------|------|--------|
| `--port <n>` | 指定端口（被占用则报错退出） | 自动探测 4321-4330 |
| `--proxy <url>` | 上游 HTTP 代理 | 无 |
| `-h, --help` | 显示帮助 | - |

### Claude 子命令

启动代理后自动拉起 Claude Code，支持 `-m` 指定模型别名：

```bash
# Claude
codemaker-proxy claude                    # 默认模型 (Sonnet 4.6)
codemaker-proxy claude -m haiku           # Claude Haiku 4.5
codemaker-proxy claude -m sonnet          # Claude Sonnet 4.6
codemaker-proxy claude -m opus            # Claude Opus 4.6
codemaker-proxy claude -m sonnet45        # Claude Sonnet 4.5
codemaker-proxy claude -m opus45          # Claude Opus 4.5

# GPT
codemaker-proxy claude -m gpt            # GPT-5.4-Pro
codemaker-proxy claude -m gpt54          # GPT-5.4
codemaker-proxy claude -m gpt53          # GPT-5.3-Codex
codemaker-proxy claude -m codex          # GPT-5.3-Codex（别名）
codemaker-proxy claude -m gpt52          # GPT-5.2

# DeepSeek
codemaker-proxy claude -m ds             # DeepSeek v3.2
codemaker-proxy claude -m ds31           # DeepSeek v3.1

# 其他
codemaker-proxy claude -m gemini         # Gemini 3.1 Pro
codemaker-proxy claude -m kimi           # Kimi K2.5
codemaker-proxy claude -m qwen           # Qwen 3.5 Plus
codemaker-proxy claude -m minimax        # MiniMax M2.5
codemaker-proxy claude -m glm            # GLM-5

# 也可以直接传完整模型名
codemaker-proxy claude -m gpt-5.4-pro-2026-03-05

# 透传 claude 参数
codemaker-proxy claude -m haiku --debug
```

### 端口探测

- 默认从 4321 开始，依次尝试 10 个端口（4321-4330），找到第一个可用端口启动
- 使用 `--port` 指定端口时，若被占用则直接报错退出（不自动切换）

### 只启动代理（不拉起 Claude Code）

```bash
codemaker-proxy
# ✓ CodeMaker 代理已启动 → http://127.0.0.1:4321
#   配置 Claude Code: ANTHROPIC_BASE_URL=http://127.0.0.1:4321
```

然后在另一个终端手动启动 Claude Code：

```bash
ANTHROPIC_BASE_URL=http://127.0.0.1:4321 \
ANTHROPIC_AUTH_TOKEN=codemaker-proxy \
claude
```

## 方式四：Shell 快捷命令（mccs）

如果你更喜欢 shell 函数的方式，可以在 `~/.zshrc` 中添加以下函数，一键启动代理 + Claude Code：

```bash
function mccs(){
  local PORT=4321
  local PROXY_DIR="$HOME/ai/codemaker-proxy"
  local MODEL=""

  while [[ $# -gt 0 ]]; do
    case "$1" in
      -m|--model)
        shift
        case "$1" in
          haiku)    MODEL="claude-haiku-4-5" ;;
          sonnet)   MODEL="claude-sonnet-4-6" ;;
          opus)     MODEL="claude-opus-4-6" ;;
          sonnet45) MODEL="claude-sonnet-4-5" ;;
          opus45)   MODEL="claude-opus-4-5" ;;
          gpt)      MODEL="gpt-5.4-pro" ;;
          gpt54)    MODEL="gpt-5.4" ;;
          gpt53)    MODEL="gpt-5.3-codex" ;;
          gpt52)    MODEL="gpt-5.2" ;;
          codex)    MODEL="gpt-5.3-codex" ;;
          ds)       MODEL="deepseek-v3.2-latest" ;;
          ds31)     MODEL="deepseek-v3.1-latest" ;;
          gemini)   MODEL="gemini-3.1-pro" ;;
          kimi)     MODEL="kimi-k2.5" ;;
          qwen)     MODEL="qwen3.5-plus" ;;
          minimax)  MODEL="MiniMax-M2.5" ;;
          glm)      MODEL="glm-5" ;;
          *)        MODEL="$1" ;;
        esac
        shift ;;
      *) break ;;
    esac
  done

  if ! lsof -i :"$PORT" &>/dev/null; then
    echo "启动 CodeMaker 代理..."
    if command -v codemaker-proxy &>/dev/null; then
      # npm 全局安装方式
      (HTTPS_PROXY=http://127.0.0.1:7897 codemaker-proxy &>/tmp/codemaker-proxy.log &)
    elif [ -d "$PROXY_DIR" ]; then
      # 源码方式
      (cd "$PROXY_DIR" && HTTPS_PROXY=http://127.0.0.1:7897 npx tsx src/index.ts &>/tmp/codemaker-proxy.log &)
    else
      echo "未找到 codemaker-proxy，请安装: npm i -g @hangox/codemaker-proxy"
      echo "或 clone 源码到 $PROXY_DIR"
      return 1
    fi
    sleep 2
    if ! lsof -i :"$PORT" &>/dev/null; then
      echo "代理启动失败，查看日志: /tmp/codemaker-proxy.log"
      return 1
    fi
    echo "代理已启动 → http://127.0.0.1:$PORT"
  fi

  local MODEL_ARG=()
  if [ -n "$MODEL" ]; then
    MODEL_ARG=(--model "$MODEL")
    echo "使用模型: $MODEL"
  fi

  ANTHROPIC_BASE_URL="http://127.0.0.1:$PORT" \
  ANTHROPIC_AUTH_TOKEN="codemaker-proxy" \
  claude --dangerously-skip-permissions "${MODEL_ARG[@]}" "$@"
}

function mccs-stop(){
  local pid=$(lsof -nP -iTCP:4321 -sTCP:LISTEN -t 2>/dev/null)
  if [ -n "$pid" ]; then
    kill "$pid" && echo "CodeMaker 代理已停止 (PID: $pid)"
  else
    echo "CodeMaker 代理未运行"
  fi
}
```

使用：

```bash
mccs                # 默认模型 (Sonnet 4.6)
mccs -m haiku       # Claude Haiku 4.5
mccs -m opus        # Claude Opus 4.6
mccs -m gpt         # GPT-5.4-Pro
mccs -m ds          # DeepSeek v3.2
mccs -m haiku --debug  # 带调试日志
mccs-stop           # 停止代理
```

> **说明**：mccs 优先使用全局安装的 `codemaker-proxy` 命令（`npm i -g @hangox/codemaker-proxy`），如果未安装则 fallback 到源码目录 `$HOME/ai/codemaker-proxy`。

## 环境变量

| 变量 | 说明 | 默认值 |
|------|------|--------|
| `PORT` | 代理监听端口 | `4321` |
| `HTTPS_PROXY` | 上游 HTTP 代理 | 无 |
| `MODEL_MAP` | 模型名映射，格式 `from=to,from2=to2` | 无（直接透传） |

## 认证

- Token 自动从 `~/.local/share/codemaker/auth.json` 读取
- CodeMaker CLI 登录后会自动写入该文件
- 代理会 watch 文件变更，token 刷新后自动加载
- 签名算法：HMAC-SHA256（与 CodeMaker CLI 一致）

## 支持的模型

以下模型经过实测可用（2026-03-31 测试）。代理内置了短名→全名映射，可以直接用短名指定。

### Claude

| 短名 | 映射到 | 备注 |
|------|--------|------|
| `claude-sonnet-4-6` | 直接透传 | 默认模型 |
| `claude-opus-4-6` | 直接透传 | |
| `claude-haiku-4-5` | `claude-haiku-4-5-20251001` | |
| `claude-sonnet-4-5` | `claude-sonnet-4-5-20250929` | |
| `claude-opus-4-5` | `claude-opus-4-5-20251101` | |

### GPT

| 短名 | 映射到 | 备注 |
|------|--------|------|
| `gpt-5.4-pro` | `gpt-5.4-pro-2026-03-05` | |
| `gpt-5.4` | `gpt-5.4-2026-03-05` | |
| `gpt-5.3-codex` | `gpt-5.3-codex-2026-02-24` | |
| `gpt-5.2-codex` | `gpt-5.2-codex-2026-01-14` | |
| `gpt-5.2` | `gpt-5.2-2025-12-11` | |

### DeepSeek

| 短名 | 映射到 | 备注 |
|------|--------|------|
| `deepseek-v3.1-latest` | 直接透传 | |
| `deepseek-v3.2-latest` | 直接透传 | |
| `deepseek-v3.1-chat-yd` | `deepseek-v3.1-chat-yd-250821` | |
| `deepseek-v3.1-reasoner-yd` | `deepseek-v3.1-reasoner-yd-250821` | |
| `deepseek-v3.2-chat-yd` | `deepseek-v3.2-chat-yd-251201` | |
| `deepseek-v3.2-reasoner-yd` | `deepseek-v3.2-reasoner-yd-251201` | |

### 其他

| 短名 | 映射到 | 备注 |
|------|--------|------|
| `MiniMax-M2.5` | 直接透传 | |
| `gemini-3.1-pro` | 直接透传 | |
| `glm-5` | 直接透传 | |
| `kimi-k2.5` | 直接透传 | |
| `kimi-k2.5-yd` | 直接透传 | |
| `qwen3.5-plus` | 直接透传 | |
| `Kimi-K2.5` | `kimi-k2.5` | 大小写修正 |

> **提示**：CodeMaker 后端要求部分模型使用带日期后缀的全名（如 `gpt-5.4-pro-2026-03-05`）。
> 代理已内置短名映射，用短名（如 `gpt-5.4-pro`）即可自动转换。
> 也可通过 `MODEL_MAP` 环境变量自定义映射。

## 项目结构

```
src/
  cli.ts        # CLI 入口（端口探测、参数解析、拉起 claude）
  index.ts      # 代理服务器（Hono HTTP、格式转换、模型映射）
  auth.ts       # CodeMaker 认证（JWT + HMAC 签名）
  translate.ts  # Anthropic ↔ OpenAI 格式双向转换
```

## 参考

- 灵感来源: [codex-proxy](https://github.com/icebear0828/codex-proxy)
- CodeMaker CLI 基于 [opencode](https://github.com/opencode-ai/opencode)