概要
9Router は Claude Code、Cursor、Copilot などの AI コーディングツールを 40 以上の AI プロバイダーに接続し、自動フォールバックと RTK トークン圧縮をサポートすることで、トークンを 20〜40% 節約し、コーディングの中断を防ぎます。
README プレビュー
\n \n \n # 9Router - FREE AI Router & Token Saver\n \n **Never stop coding. Save 20-40% tokens with RTK + auto-fallback to FREE & cheap AI models.**\n \n **Connect All AI Code Tools (Claude Code, Cursor, Antigravity, Copilot, Codex, Gemini, OpenCode, Cline, OpenClaw...) to 40+ AI Providers & 100+ Models.**\n \n [](https://www.npmjs.com/package/9router)\n [](https://www.npmjs.com/package/9router)\n [](https://github.com/decolua/9router/blob/main/LICENSE)\n\n \n \n [🚀 Quick Start](#-quick-start) • [💡 Features](#-key-features) • [📖 Setup](#-setup-guide) • [🌐 Website](https://9router.com)\n\n [🇻🇳 Tiếng Việt](./i18n/README.vi.md) • [🇨🇳 中文](./i18n/README.zh-CN.md) • [🇯🇵 日本語](./i18n/README.ja-JP.md)\n\n\n---\n\n## 🤔 Why 9Router?\n\n**Stop wasting money, tokens and hitting limits:**\n\n- ❌ Subscription quota expires unused every month\n- ❌ Rate limits stop you mid-coding\n- ❌ Tool outputs (git diff, grep, ls...) burn tokens fast\n- ❌ Expensive APIs ($20-50/month per provider)\n- ❌ Manual switching between providers\n\n**9Router solves this:**\n\n- ✅ **RTK Token Saver** - Auto-compress tool_result content, save 20-40% tokens per request\n- ✅ **Maximize subscriptions** - Track quota, use every bit before reset\n- ✅ **Auto fallback** - Subscription → Cheap → Free, zero downtime\n- ✅ **Multi-account** - Round-robin between accounts per provider\n- ✅ **Universal** - Works with Claude Code, Codex, Cursor, Cline, any CLI tool\n\n---\n\n## 🔄 How It Works\n\n```\n┌─────────────┐\n│ Your CLI │ (Claude Code, Codex, OpenClaw, Cursor, Cline...)\n│ Tool │\n└──────┬──────┘\n │ http://localhost:20128/v1\n ↓\n┌─────────────────────────────────────────────┐\n│ 9Router (Smart Router) │\n│ • RTK Token Saver (cut tool_result tokens) │\n│ • Format translation (OpenAI ↔ Claude) │\n│ • Quota tracking │\n│ • Auto token refresh │\n└──────┬────────────────────────────────────
FAQ (5)
トラブル対応opencode-go または xiaomi-tokenplan プロバイダーをテストすると、'Provider test not supported' が返されるのはなぜですか?
/api/providers/[id]/test ルートは、プロバイダスイッチ文において opencode-go および xiaomi-tokenplan の明示的なケースが欠けていました。これは必要なテストロジックを追加することで修正されました (PR #1576)。サーバーを最新のコミットに更新するか、app/src/app/api/providers/[id]/test/route.js に手動でケースを追加し(バリデーションルートをミラーリング)、npm run build で再ビルドしてください。
トラブル対応9Routerがコンボ内の次のモデルにフォールバックせず、HTTP 408/499エラーを返すのはなぜですか?
これは open-sse/services/accountFallback.js におけるレジリエンスのバグです。43行目のフォールバックロジックは、すべての4xxステータス(401/402/403/429を除く)をリトライ不可のクライアントエラーとして扱うため、一時的なプロキシタイムアウトを意図せず捕捉してしまいます: HTTP 408 (AWS ALB/Cloudflare/HAProxyからのRequest Timeout)、499 (NginxからのClient Closed Request)、425 (TLS 0-RTTからのToo Early)。修正方法: これらの一時的なコードを明示的に除外し、コンボフォールバックがトリガーされるようにします:
// 一時的なタイムアウト/トランスポート系コードをクライアントエラーの非フォールバック対象から除外
const NON_FALLBACK_CLIENT_STATUSES = new Set([
401, 402, 403, 429, // アカウント/クォータスコープ
408, 425, 499 // フォールバックを必ずトリガーすべき一時的なゲートウェイ/タイムアウトエラー
]);
if (status >= 400 && status < 500 && !NON_FALLBACK_CLIENT_STATUSES.has(status)) {
return { shouldFallback: false, cooldownMs: 0 };
}
この変更により、アップストリームノードが停滞してゲートウェイが408/499を返した場合、9Routerはクライアントリクエストを終了させる代わりに、次のコンボメンバーへフェイルオーバーします。
トラブル対応ds/deepseek-v4.1-flash を使用する際に発生する 9router の DeepSeek エラー "HTTP 400: you passed deepseek-v4.1-flash" を修正する方法
9routerの組み込みds/deepseek-v4.1-flashエントリーは、誤ったモデル名をアップストリームに転送します — DeepSeek APIはdeepseek-flash(またはdeepseek-v4-pro)のみを受け付けるため、リクエストはHTTP 400で失敗します。回避策:9routerで「Add Model」を使用し、DeepSeekプロバイダーの配下に正確にdeepseek-flashという名前のカスタムモデルを作成してください。これによりモデルテスト(緑のチェック)に合格し、チャットは正常に動作します。恒久的な修正には、9routerがV4.1 Flashエントリーをアップストリーム名deepseek-flashにマッピングする必要があります(issue #4939で追跡中)。
トラブル対応9router を curl、Claude Code、またはその他の OpenCode 以外のクライアントで使用する際に発生する「403 FreeTierError: OpenCode's free tier can only be used from within OpenCode」エラーを修正する方法
原因: 9router の resolveOpencodeSession()(open-sse/executors/opencode.js 内)は、12文字の16進プレフィックスが有効な反転タイムスタンプではなく SHA-256 ダイジェストになっている ses_ セッション ID を生成します。OpenCode Zen の無料ティア(oc/* モデル)はこのプレフィックスを検証し、リクエストを「OpenCode クライアントではない」と分類して、403 FreeTierError で拒否します。影響を受けるのは無料ティアのみです。OpenCode CLI は正規のセッションヘッダーを送信するため動作します。
回避策(コード変更なし): すべてのリクエストに有効な OpenCode セッション ID ヘッダーを付けて送信します。どちらのヘッダーでも動作します:
curl -H "x-session-id: ses_ecc985076ffe3FWJqsz05vQbUW" ...
curl -H "x-opencode-session: ses_ecc985076ffe3FWJqsz05vQbUW" ...
ID は正規にエンコードされた OpenCode ID である必要があります(プレフィックスが16進数の ~(Date.now()*0x1000 + counter) であるため、本物は ses_ecc…ffe のように表示されます)。ダイジェスト由来の偽造 ses_ ID は依然として 403 を返します。セッションの経過期間は問題になりません。正しくエンコードされた ID であれば、30日前のタイムスタンプでも 200 を返します。リクエストボディ内のツールは無関係です。ヘッダーが唯一の判別要素です。
恒久的な修正: 汎用リゾルバーの UUID を translateSessionId() で再ラップする代わりに、エグゼキューターの実際のジェネレーター(OpenCode と同一の generateSessionId() を使用する stableSessionId)にフォールバックするように resolveOpencodeSession() にパッチを適用します:
if (viaManager) {
if (OPENCODE_SESSION_RE.test(viaManager)) return viaManager;
return stableSessionId(credentials);
}
これにより、セッションごとのクォータ親和性を維持しながら(アップストリームは無料ティアの使用量をセッションごとにカウントします)、時間的に有効な ses_ ID が発行されます。
トラブル対応9Router の /v1/models が top-gpt、high-gpt、hermes-advisor の各プリセットに対して古い 272k のコンテキストウィンドウを報告するのはなぜですか?また、早すぎる自動コンパクションを修正するにはどうすればよいですか?
9Router v0.5.104 では、Codex ベースのコンボプリセット top-gpt、high-gpt、hermes-advisor が GET /v1/models 経由で context_length: 272000 をアドバタイズしていました。原因: top-gpt/high-gpt にはベースの cx/gpt-6-astra シートが含まれており、その静的な Codex ケイパビリティエントリが 272000 であったため、コンボの上限は最も弱いシートから導出され、モデルメタデータから自動コンパクションしきい値を導出するクライアントは、あまりにも早すぎるタイミングでコンパクションを実行していました(ルーティング可能なシートは実際には 1M 以上をサポートしています)。修正(パッチ適用済みフォークで実装・デプロイ済み): 1) 追加的で後方互換性のある SQLite マイグレーションにより、コンボごとのオプションのコンテキスト上限を永続化する。2) アドバタイズされる上限を、コンボのシートの解決済み最小容量にクランプする。3) top-gpt と high-gpt を拡張コンテキストの Astra シートに向け、古い 272k シートが安全な下限を引き下げられないようにする。4) 空の SQLite コンテキスト値を未設定として扱う(ゼロトークン上限としてではなく)。ブルーグリーンリビルドによるデプロイ後、確認: GET /v1/models は3つのプリセットすべてに対して context_length と capabilities.contextWindow として 400000 を返すはずです。リグレッションカバレッジ: tests/unit/v1-models-combo-context.test.js と tests/unit/v1-models-route-codex.test.js。