WindsurfAPI: Windsurf のモデルを標準 API に翻訳する
WindsurfAPI はセルフホストの proxy で、Windsurf/Devin デスクトップ版に入っている 100 以上のモデルを取り出し、標準的な API 形式で外部に公開する。Claude、GPT、Gemini、DeepSeek、Kimi、GLM がすべて含まれている。元々は自社の IDE でしか使えなかったが、今は 4 つのエンドポイントを同時に開けられる:
POST /v1/chat/completions OpenAI 互換
POST /v1/responses OpenAI Responses 互換
POST /v1/messages Anthropic 互換(Claude Code / Cline / Cursor)
POST /v1beta/models/* Gemini 互換
転送経路は次のようになっている。サービスはポート 3003 で OpenAI/Anthropic のリクエストを受け取り、Cascade リクエストにパッケージ化し、ローカルの Language Server バイナリを経由して gRPC で server.self-serve.windsurf.com に送る。proxy は tool_use / tool_result を中継するだけで、実際にファイルを操作するのはローカルの IDE agent であり、モデルにも proxy にも存在しない。
技術スタックは純粋な Node.js で、npm のランタイム依存はゼロ、node:* の組み込みモジュールのみを使う。protobuf は src/proto.js に手書きし、画像のエンコード/デコードは src/vendor/ に vendor しており、デプロイ時に依存チェーンを管理する必要がない。
エンジニアリング上のポイントをいくつか。アカウントプールは自動でローテーションし、レート制限の隔離とフェイルオーバーを行う。LS プールは proxy ごとに独立したインスタンスを持ち共有しない。メモリに応じて自動でスケールし、最大 20 個まで、アイドルになれば TTL で回収する。NO_TOOL モードは planner_mode=3 を使って Cascade 標準の tool loop を無効化しパス漏洩を防ぎ、tool 結果・<tool_call> テキスト・出力パスの 3 層でクリーニングする。
落とし穴も明確にしておく。無料アカウントはほとんどオープンソースモデルしか動かせない。gemini-2.5-flash、GLM、Kimi、Qwen などは使えるが、Claude と GPT のフルラインナップには Pro が必要だ。tool 呼び出しが安定するかどうかはモデル次第で、Claude 系が最も安定している。長いストリームでは上流が 236〜243 秒で切断する。ローカルで timeout を調整しても効果はない。これは上流側で詰まっているためだ。コードは MIT。