·
English
没点 Star 和 Follow 的:严禁商业使用、转售、代部署、挂后台对外提供服务、包装成中转服务出售。 点了 Star 和 Follow 的:随便用,我睁一只眼闭一只眼。
代码本体按 MIT License 开源(见 LICENSE),上面这段是作者个人态度。
把 Windsurf(原 Codeium)的 AI 模型变成两套标准 API 同时兼容:
POST /v1/chat/completions — OpenAI 兼容 任何 OpenAI SDK 直接用POST /v1/messages — Anthropic 兼容 Claude Code / Cline / Cursor 直接连100+ 模型:Claude 4.5/4.6/Opus 4.7 · GPT-5/5.1/5.2/5.4 全系 · Gemini 2.5/3.0/3.1 · Grok · Qwen · Kimi K2.x · GLM 4.7/5/5.1 · MiniMax · SWE 1.5/1.6 · Arena 等。零 npm 依赖 纯 Node.js。
┌─────────────┐ /v1/chat/completions ┌────────────┐
│ OpenAI SDK │ ──────────────────────→ │ │
│ curl / 前端 │ ←────────────────────── │ │
└─────────────┘ OpenAI JSON + SSE │ WindsurfAPI│
│ Node.js │ ┌──────────────┐ ┌─────────────────┐
┌─────────────┐ /v1/messages │ (本服务) │ gRPC │ Language │ HTTPS │ Windsurf 云端 │
│ Claude Code │ ──────────────────────→ │ │ ───→ │ Server (LS) │ ────→ │ server.self- │
│ Cline │ ←────────────────────── │ │ ←─── │ (Windsurf │ ←─── │ serve.windsurf │
│ Cursor │ Anthropic SSE │ │ │ binary) │ │ .com │
└─────────────┘ └────────────┘ └──────────────┘ └─────────────────┘
↑
账号池轮询
速率限制隔离
故障转移
它做了什么: 1. 一个 HTTP 服务(端口 3003)同时暴露 OpenAI 和 Anthropic 两套 API 2. 把请求翻译成 Windsurf 内部 gRPC 协议,通过本地 Language Server 发给 Windsurf 云 3. 维护账号池,自动轮询 + 速率限制 + 故障转移 4. 返回前把上游 Windsurf 身份剥掉,模型自称"我是 Claude Opus 4.6 由 Anthropic 开发"
模型本身不会操作文件 — 文件操作是 IDE Agent 客户端(Claude Code / Cline 等)在本地执行的:
你 "帮我改 bug" Claude Code WindsurfAPI Windsurf Cloud
│ │ │ │
│────────────────────────────→ │ │ │
│ │ POST /v1/messages │ │
│ │ messages + tools + system │ │
│ │ ─────────────────────────────→│ 打包成 Cascade 请求 │
│ │ │ ──────────────────────→ │
│ │ │ │
│ │ │ 模型思考 → 返回
│ │ │ tool_use(edit_file)
│ │ │ ←────────────────────── │
│ │ ←── Anthropic SSE ────────────│ │
│ │ content_block=tool_use │ │
│ │ │ │
│ │ 本地执行 edit_file() │ │
│ │ (读写本地文件) │ │
│ │ │ │
│ │ 带 tool_result 再发一轮 │ │
│ │ ─────────────────────────────→│ ──────────────────────→ │
│ │ ... (循环) ...
│ │ │ │
│ ← 最终答案 │ │ │
重点:WindsurfAPI 只负责传递 tool_use / tool_result,真正改文件的是客户端 CLI。
git clone https://github.com/dwgx/WindsurfAPI.git
cd WindsurfAPI
bash setup.sh # 建目录 · 配权限 · 生成 .env
node src/index.js
Dashboard:http://你的IP:3003/dashboard
cp .env.example .env
# 可选:提前把 language_server_linux_x64 放到 .docker-data/opt/windsurf/ 下
# 不放也行,容器首次启动时会自动下载到 /opt/windsurf/
docker compose up -d --build
docker compose logs -f
默认挂载:
./.docker-data/data:持久化 accounts.json、proxy.json、stats.json、runtime-config.json、model-access.json、logs/./.docker-data/opt/windsurf:Language Server 二进制与数据目录./.docker-data/tmp/windsurf-workspace:临时工作区如果想改持久化目录,可在 .env 里设置 DATA_DIR。Docker 默认已设为 /data。
部署过之后要拉最新修复,一条命令搞定:
cd ~/WindsurfAPI && bash update.sh
update.sh 做了:git pull → 通过 install-ls.sh 更新 LS binary → 停 PM2 → kill 3003 端口残留 → 重启 → 健康检查。
如果你用的是我们的公网实例(skiapi.dev 之类),不用管,我们已经推过了。
git clone https://github.com/dwgx/WindsurfAPI.git
cd WindsurfAPI
# Language Server 二进制 —— 自动检测 Linux/macOS,一键下载 + chmod
bash install-ls.sh
# 默认安装路径:
# Linux x64: /opt/windsurf/language_server_linux_x64
# Linux arm64: /opt/windsurf/language_server_linux_arm
# macOS Apple Silicon: $HOME/.windsurf/language_server_macos_arm
# macOS Intel: $HOME/.windsurf/language_server_macos_x64
# 如果想用本地已下好的 binary:
# bash install-ls.sh /path/to/language_server_linux_x64
# 或者指定 URL:
# bash install-ls.sh --url https://example.com/language_server_linux_x64
# ⚠️ 看不到 opus-4.7 / 其他新模型?
# Exafunction/codeium 公开 release 最新停在 v2.12.5(2026-01),不含 4.7。
# 要 4.7,把 Windsurf 桌面端本体里的 LS binary 拷过来:
#
# macOS: "$HOME/Library/Application Support/Windsurf/resources/app/extensions/windsurf/bin/language_server_macos_arm"
# Linux: "$HOME/.windsurf/bin/language_server_linux_x64"
# 或 /opt/Windsurf/resources/app/extensions/windsurf/bin/language_server_linux_x64
# Windows: %APPDATA%\Windsurf\bin\language_server_windows_x64.exe
#
# # 从本地桌面端装:
# bash install-ls.sh /path/to/language_server_linux_x64
#
# LS binary 一换,/v1/models 立刻就能看到最新模型目录了(云端自动发现)。
cat > .env << 'EOF'
PORT=3003
API_KEY=
DEFAULT_MODEL=claude-4.5-sonnet-thinking
MAX_TOKENS=8192
LOG_LEVEL=info
LS_BINARY_PATH=/opt/windsurf/language_server_linux_x64
LS_DATA_DIR=/opt/windsurf/data
LS_PORT=42100
DASHBOARD_PASSWORD=
EOF
# macOS 本地部署时,使用 install-ls.sh 打印的 LS_BINARY_PATH,
# 并把 LS_DATA_DIR 设到用户可写目录,例如 /Users/you/.windsurf/data。
node src/index.js
服务跑起来之后要先加 Windsurf 账号才能用,三种方式:
方式 1 Dashboard 一键登录(推荐)
打开 http://你的IP:3003/dashboard → 登录取号 → 点 Google 登录 或 GitHub 登录(OAuth 弹窗)或直接填邮箱密码。所有方式都会自动入池。
方式 2 Token(任何登录方式都能用)
去 windsurf.com/show-auth-token 复制 Token:
curl -X POST http://localhost:3003/auth/login \
-H "Content-Type: application/json" \
-d '{"token": "你的token"}'
方式 3 批量
curl -X POST http://localhost:3003/auth/login \
-H "Content-Type: application/json" \
-d '{"accounts": [{"token": "t1"}, {"token": "t2"}]}'
from openai import OpenAI
client = OpenAI(base_url="http://你的IP:3003/v1", api_key="你设的API_KEY")
r = client.chat.completions.create(
model="claude-sonnet-4.6",
messages=[{"role": "user", "content": "你好"}]
)
print(r.choices[0].message.content)
export ANTHROPIC_BASE_URL=http://你的IP:3003
export ANTHROPIC_API_KEY=你设的API_KEY
claude # 正常用 Claude Code 即可
# 裸 curl 测试
curl http://localhost:3003/v1/messages \
-H "Authorization: Bearer 你的key" \
-H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-opus-4.6","max_tokens":100,"messages":[{"role":"user","content":"你好"}]}'
在客户端配置里 Custom OpenAI Compatible:
- Base URL: http://你的IP:3003/v1
- API Key: 你设的 API_KEY
- Model: 任选我们支持的模型
Cursor 用户注意:Cursor 客户端白名单会拦截含
claude的模型名(请求根本不到后端)。用以下别名绕过:
在 Cursor 填 实际模型 opus-4.6claude-opus-4.6 opus-4.6-thinkingclaude-opus-4.6-thinking opus-4.7claude-opus-4-7-medium sonnet-4.6claude-sonnet-4.6 sonnet-4.5claude-4.5-sonnet haiku-4.5claude-4.5-haiku ws-opusclaude-opus-4.6 ws-sonnetclaude-sonnet-4.6 GPT / Gemini / DeepSeek 等不受 Cursor 白名单限制,直接填原名。
| 变量 | 默认值 | 干嘛的 |
|---|---|---|
PORT |
3003 |
服务端口 |
API_KEY |
空 | 调 API 要带的密钥 留空就不验证 |
DATA_DIR |
项目根目录 | 持久化 JSON 状态和 logs/ 的目录,Docker 推荐设成 /data |
DEFAULT_MODEL |
claude-4.5-sonnet-thinking |
不传 model 用哪个 |
MAX_TOKENS |
8192 |
默认最大回复 token 数 |
LOG_LEVEL |
info |
debug / info / warn / error |
LS_BINARY_PATH |
/opt/windsurf/language_server_linux_x64 |
LS 二进制位置 |
LS_DATA_DIR |
Linux: /opt/windsurf/data;macOS: ~/.windsurf/data |
每个 proxy 独立的 LS 数据根目录 |
LS_PORT |
42100 |
LS gRPC 端口 |
LS_MAX_INSTANCES |
内存自适应,最多 20 |
LS 池最大实例数;2GB VPS 建议 2 |
LS_POOL_WAIT_MS |
30000 |
LS 池满且全部 active 时,新 proxy LS 最多等待这么久再返回 LS_POOL_EXHAUSTED |
LS_SPAWN_MIN_AVAILABLE_BYTES |
700MB |
新增非 default LS 前要求的可用内存水位;低于该值会排队/拒绝,避免 OOM |
LS_MEMORY_GUARD |
1 |
设 0 可关闭 LS 内存护栏(仅在你有外部 memory limit/监控时考虑) |
LS_IDLE_TTL_MS |
1200000 |
非 default LS 空闲超过该时间自动停止;0 关闭 |
LS_IDLE_SWEEP_MS |
自动推导 | LS 空闲回收扫描间隔 |
LS_PREWARM_DEFAULT |
1 |
设为 0 可跳过启动时 default LS 预热,低内存/全 proxy 池改为首个真实请求再懒启动 |
LS_PREWARM_PROXIES |
0 |
设为 1 才在启动时预热所有 proxy LS;默认按需启动。后台 scheduled probe / 预测 prewarm 只复用空闲常驻 LS,不会为了探测新开/等待/驱逐 LS |
LS_PREWARM_ON_ACCOUNT_ADD |
0 |
设为 1 才在 Dashboard/批量导入/OAuth 添加账号后立即预热对应 LS;默认避免批量录入打爆内存 |
WINDSURFAPI_NATIVE_TOOL_BRIDGE |
空 | 仅用于 lab/远程执行灰度。all_mapped 仅在已 allowlist 的工具全部可映射时走 native bridge;1 为混合工具 partition 模式。不要把它当成本地 IDE 工具调用的通用修复 |
WINDSURFAPI_NATIVE_TOOL_BRIDGE_TOOLS |
Bash/shell_command/run_command 语义族 |
native bridge 工具 allowlist。默认只包含成熟的 Bash/run_command 路径;Read/Grep/Glob 和 WebSearch/WebFetch 必须显式加入 allowlist,再配合模型/账号/API key gate 小流量实测,仍不是生产默认 |
WINDSURFAPI_NATIVE_TOOL_BRIDGE_MODELS / PROVIDERS / ROUTES / CALLERS / ACCOUNTS / API_KEYS |
空 | native bridge 灰度门。为空表示不限;设置后必须匹配才启用。ACCOUNTS 可填账号 id/email,API_KEYS 匹配调用方 API key 但不会把明文 key 传进 chat 逻辑 |
WINDSURFAPI_NATIVE_TOOL_BRIDGE_OFF |
空 | 设为 1 强制关闭 native tool bridge,优先级高于上面的开关 |
WINDSURFAPI_SPECIAL_AGENT_BACKEND |
空 | 可选 lab-only special-agent 后端。设为 devin-cli 后,swe-1.6 / swe-1.6-fast / adaptive / arena-* 不再走 direct Cascade,而是走 Devin CLI PoC;这不是普通 catalog 模型修复 |
DEVIN_CLI_PATH |
devin |
Devin CLI 可执行文件路径;Docker/macOS 都需要自己安装或挂载,不是基础镜像硬依赖 |
DEVIN_CLI_MODE |
print |
print 为 devin -p 保守模式;acp 为实验 ACP stdio 后端,使用账号池上游 Windsurf apiKey 认证,默认不全量启用 |
DEVIN_MAX_PROCS |
1 |
Devin CLI 最大并发进程数,避免 special-agent 路径把内存打爆 |
DEVIN_CLI_USE_ACCOUNT_POOL |
1 |
默认从 WindsurfAPI 账号池取一个账号并把 apiKey 注入 WINDSURF_API_KEY;设 0 表示 Devin CLI 自己管理登录态 |
DASHBOARD_PASSWORD |
空 | 后台密码 留空不设密码 |
ALLOW_PRIVATE_PROXY_HOSTS |
空 | 设为 1 允许在代理测试和登录时使用内网 IP(如 192.168.x.x、10.x.x.x)。默认留空仅允许公网地址 |
CASCADE_REUSE_BY_CALLER |
0 |
设为 1 启用 caller 级别回退复用。指纹未命中时,按 callerKey+model 回退到最近的 cascade。适合单用户 Claude Code 场景 |
CASCADE_POOL_MAX |
500 |
对话池最大条目数。单用户场景设 1–5 即可,减少资源占用 |
打开 http://你的IP:3003/dashboard:
| 面板 | 功能 |
|---|---|
| 总览 | 运行状态 · 账号池 · LS 健康 · 成功率 |
| 登录取号 | Google / GitHub OAuth 一键登录 · 邮箱密码登录 · 测试代理 按钮(实测出口 IP) |
| 账号管理 | 加 / 删 / 停用 · 探测订阅等级 · 看余额 · 封禁模型黑名单 |
| 模型控制 | 全局模型黑白名单 |
| 代理配置 | 全局或单账号的 HTTP / SOCKS5 代理 |
| 日志 | 实时 SSE 串流 · 按级别筛 · 每条 turns=N chars=M 诊断多轮 |
| 统计分析 | 时间范围 6h / 24h / 72h · 账号维度 · p50 / p95 延迟 |
| 实验性 | Cascade 对话复用 · 模型身份注入(每厂商可自定义 prompt) |
主线 100+ 个静态模型 + Windsurf 雲端動態下發(mergeCloudModels 啟動時拉取最新)。完整列表查 GET /v1/models,或看 GitHub Pages 模型清单(同步生成於 src/models.js)。
Claude(Anthropic) — 21 个
claude-3.5-sonnet / 3.7-sonnet / thinking · claude-4-sonnet / opus / thinking · claude-4.1-opus · claude-4.5-haiku / sonnet / opus · claude-sonnet-4.6(含 1m / thinking / thinking-1m) · claude-opus-4.6 / thinking · claude-opus-4.7-medium
GPT(OpenAI) — 55 个
gpt-4o · gpt-4.1 · gpt-5 全系(含 medium / high / codex) · gpt-5.1 全系(base / low / medium / high + fast + codex 全 6 變體) · gpt-5.2 全系(none / low / medium / high / xhigh + fast + codex 全 5 變體) · gpt-5.4 全系(base / mini × low/medium/high/xhigh) · o3 全系(base / mini / pro) · o4-mini
Gemini(Google) — 9 个
gemini-2.5-pro / flash · gemini-3.0-pro / flash(minimal / low / medium / high 4 個 reasoning 等級) · gemini-3.1-pro(low / high)
开源 / 国产
Kimi: kimi-k2 / k2.5 / k2-6 · GLM: glm-4.7 / 5 / 5.1 · Qwen: qwen-3 · Grok: grok-3 / grok-3-mini-thinking / grok-code-fast-1 · MiniMax: minimax-m2.5
Windsurf 自家 + Arena
swe-1.5 / 1.5-fast / 1.6 / 1.6-fast · arena-fast · arena-smart
swe-1.6/swe-1.6-fast/adaptive/arena-*属于 special-agent 路径。direct Cascade 会报 unknow
$ claude mcp add WindsurfAPI \
-- python -m otcore.mcp_server <graph>