9Router: Code AI Miễn Phí, Không Bao Giờ Hết Quota
TL;DR
- Hết quota Claude Pro lúc debug bug production: không còn là vấn đề khi có fallback stack tự động
- RTK nén nội dung
git diff,grep,lstrước khi gửi LLM - 47K token xuống còn 28K, cùng kết quả - Kiro AI và OpenCode Free: dùng Claude Sonnet 4.5 miễn phí không giới hạn, không cần trả phí
- Hỗ trợ Claude Code, Cursor, Cline, Codex, Antigravity, OpenClaw - bất kỳ tool nào theo chuẩn OpenAI endpoint
- Tự host bằng Docker một lệnh, hoặc
npm install -g 9routerđể chạy local
Thứ Sáu chiều. Production có bug. Tôi gọi Claude Code để debug.
rate_limit_exceeded.
Tôi chuyển sang OpenAI. Ba câu sau: You have reached your daily limit.
Còn Gemini. Nó trả lời được hai lần rồi thông báo quota reset sau 3 tiếng.
Ba tab trình duyệt mở, ba provider, một cái mental map trong đầu về cái nào còn quota. Mỗi lần chuyển phải vào Settings, đổi API key, đổi base URL. Không khó. Chỉ là mất đúng cái tập trung vào lúc cần nhất.
--> // making it invisible to querySelectorAll. // // `data-cfasync="false"` keeps this rescue script executable even when // Rocket Loader is active. It rescues module scripts via two strategies: // 1. Query the DOM for type$="-module" + src (covers case A) // 2. Regex-parse the raw HTML for commented-out script tags (covers case B) // Dynamically-created scripts bypass Rocket Loader entirely. (function () { if (window.__markdyRescue) return; window.__markdyRescue = true; var rescued = false; function rescueModuleScripts() { if (rescued) return; rescued = true; var srcs = []; // Strategy 1: Rocket Loader kept the tag in DOM but changed the type. // type="module" → type="{uuid}-module" (still has src attribute) document.querySelectorAll('script[type$="-module"][src]').forEach(function (s) { srcs.push(s.src); }); // Strategy 2: Rocket Loader COMMENTED OUT the script tag entirely: // // These are invisible to querySelectorAll, so we parse the raw HTML. // We handle both attribute orderings (type-first or src-first). var html = document.documentElement.innerHTML; var reSrcFirst = //g; var reTypeFirst = //g; var m; while ((m = reSrcFirst.exec(html)) !== null) { srcs.push(m[1]); } while ((m = reTypeFirst.exec(html)) !== null) { srcs.push(m[1]); } // Re-inject each found src as a real module script. // Deduplicate first, then inject. Dynamically-created scripts bypass // Rocket Loader entirely. Modules with the same URL are only executed // once by the browser (cached), so re-injecting already-running scripts // is safe. var seen = {}; srcs.forEach(function (src) { if (seen[src]) return; seen[src] = true; var fix = document.createElement('script'); fix.type = 'module'; fix.src = src; fix.setAttribute('data-cfasync', 'false'); document.head.appendChild(fix); }); } // Rescue when user clicks the placeholder (fallback if autoplay failed). document.addEventListener('click', function (e) { var t = e.target; if (t && typeof t.closest === 'function' && t.closest('.markdy-placeholder')) { rescueModuleScripts(); } }); // Rescue automatically after a short delay for autoplay. // Only fires if initAll() never ran (no data-markdy-init on any root). setTimeout(function () { if (document.querySelector('.markdy-root:not([data-markdy-init])')) { rescueModuleScripts(); } }, 1500); }());9Router Là Gì
9Router là một local HTTP proxy ngồi giữa AI coding tool của bạn và AI provider. Bạn cài một lần, trỏ tool vào localhost:20128/v1, và 9Router lo phần còn lại: routing, fallback, format dịch, và nén token.
Một câu: 9Router hoạt động như một smart gateway giữa coding tool và 40+ AI provider, tự fallback sang tier rẻ hơn hoặc miễn phí khi hết quota - và nén tool output nặng token trước khi gửi đến LLM.
Kiến trúc rõ ràng:
Claude Code / Cursor / Cline / Codex / OpenClaw
│
↓ http://localhost:20128/v1
┌─────────────────────────────────────┐
│ 9Router │
│ • RTK nén token │
│ • Dịch format (OpenAI ↔ Claude...) │
│ • Theo dõi quota │
│ • Tự refresh OAuth token │
└─────┬───────────────────────────────┘
│
├─→ Tier 1: SUBSCRIPTION (Claude Pro, Codex, Copilot)
│ ↓ hết quota
├─→ Tier 2: CHEAP (GLM $0.6/1M, MiniMax $0.2/1M)
│ ↓ hết budget
└─→ Tier 3: FREE (Kiro, OpenCode Free, Vertex $300 credits)
Tool của bạn nghĩ nó đang nói chuyện với một provider. Thực ra nó đang nói chuyện với một fallback stack có ba tầng.
RTK Token Saver - Phần Gây Ngạc Nhiên
Khi Claude Code hay Cline chạy tool - git diff, grep, find, ls, log dump - kết quả đầy đủ trả về LLM dưới dạng tool_result. Với một codebase tầm trung, đó thường là 20,000–50,000 token chỉ từ tool noise.
RTK chặn mỗi tool_result trước khi đến provider. Nó phát hiện loại nội dung và áp dụng filter nén lossless phù hợp: diff compression, dedup-log, smart-truncate, search-list collapse. Nếu filter lỗi hoặc làm output lớn hơn, nó giữ nguyên bản gốc. Request của bạn không bao giờ bị vỡ.
Không có RTK: 47,000 token gửi đến LLM
Có RTK: 28,000 token gửi đến LLM (tiết kiệm 40% · cùng context · cùng kết quả)
Với subscription Claude Pro có window 5 tiếng, sự khác biệt đó thường là xong session hay chạm giới hạn lúc dở dang.
Bắt Đầu
Con đường ba phút:
npm install -g 9router
9router
# Dashboard mở tại http://localhost:20128
Trong dashboard: Providers → Connect Kiro AI (miễn phí, Claude Sonnet 4.5 unlimited - OAuth một lần) hoặc OpenCode Free (không cần xác thực, danh sách model tự fetch).
Sau đó trong settings của coding tool:
Endpoint: http://localhost:20128/v1
API Key: [copy từ 9Router dashboard]
Model: kr/claude-sonnet-4.5 # Kiro AI
hoặc
oc/... # OpenCode Free models
Vậy thôi. Không cần subscription để bắt đầu.
Hoặc chạy bằng Docker:
git clone https://github.com/decolua/9router.git
cd 9router
docker compose up -d
-->
// making it invisible to querySelectorAll.
//
// `data-cfasync="false"` keeps this rescue script executable even when
// Rocket Loader is active. It rescues module scripts via two strategies:
// 1. Query the DOM for type$="-module" + src (covers case A)
// 2. Regex-parse the raw HTML for commented-out script tags (covers case B)
// Dynamically-created scripts bypass Rocket Loader entirely.
(function () {
if (window.__markdyRescue) return;
window.__markdyRescue = true;
var rescued = false;
function rescueModuleScripts() {
if (rescued) return;
rescued = true;
var srcs = [];
// Strategy 1: Rocket Loader kept the tag in DOM but changed the type.
// type="module" → type="{uuid}-module" (still has src attribute)
document.querySelectorAll('script[type$="-module"][src]').forEach(function (s) {
srcs.push(s.src);
});
// Strategy 2: Rocket Loader COMMENTED OUT the script tag entirely:
//
// These are invisible to querySelectorAll, so we parse the raw HTML.
// We handle both attribute orderings (type-first or src-first).
var html = document.documentElement.innerHTML;
var reSrcFirst = //g;
var reTypeFirst = //g;
var m;
while ((m = reSrcFirst.exec(html)) !== null) { srcs.push(m[1]); }
while ((m = reTypeFirst.exec(html)) !== null) { srcs.push(m[1]); }
// Re-inject each found src as a real module script.
// Deduplicate first, then inject. Dynamically-created scripts bypass
// Rocket Loader entirely. Modules with the same URL are only executed
// once by the browser (cached), so re-injecting already-running scripts
// is safe.
var seen = {};
srcs.forEach(function (src) {
if (seen[src]) return;
seen[src] = true;
var fix = document.createElement('script');
fix.type = 'module';
fix.src = src;
fix.setAttribute('data-cfasync', 'false');
document.head.appendChild(fix);
});
}
// Rescue when user clicks the placeholder (fallback if autoplay failed).
document.addEventListener('click', function (e) {
var t = e.target;
if (t && typeof t.closest === 'function' && t.closest('.markdy-placeholder')) {
rescueModuleScripts();
}
});
// Rescue automatically after a short delay for autoplay.
// Only fires if initAll() never ran (no data-markdy-init on any root).
setTimeout(function () {
if (document.querySelector('.markdy-root:not([data-markdy-init])')) {
rescueModuleScripts();
}
}, 1500);
}());
Bản Đồ Provider
Miễn phí (không tốn đồng nào):
| Provider | Model | Auth |
|---|---|---|
| Kiro AI | Claude Sonnet 4.5, GLM-5, MiniMax | OAuth một lần |
| OpenCode Free | Danh sách tự fetch | Không cần |
| Vertex AI | Gemini 3 Pro, DeepSeek, GLM-5 | GCP account ($300 credits miễn phí) |
Tier rẻ để backup:
| Provider | Giá | Ghi chú |
|---|---|---|
| GLM-5.1 / GLM-4.7 | $0.60/1M token | Reset daily 10AM |
| MiniMax M2.7 | $0.20/1M token | Rẻ nhất |
| Kimi K2.5 | $9/tháng flat | 10M token/tháng, dự đoán được |
Subscription đang có sẵn: Claude Code Pro/Max, Codex, GitHub Copilot, Cursor - tất cả chạy qua OAuth. 9Router tối đa hóa hết quota của chúng trước khi chạm tier rẻ hơn.
Những Thứ Cần Lưu Ý
Free tier provider thay đổi không báo trước. Kiro AI và OpenCode Free đang hoạt động; iFlow, Qwen, và Gemini CLI free tier đã bị ngừng đầu năm 2026. Nếu một provider đóng free access, fallback chain suy giảm cho đến khi bạn cập nhật config. README có danh sách hiện tại - kiểm tra trước khi tin vào bất kỳ free provider nào lâu dài.
Cột “cost” trong dashboard là bộ đếm tiết kiệm, không phải hóa đơn thật. 9Router không bao giờ thu tiền. Nhưng con số đó có thể gây nhầm lẫn ban đầu: “$290 cost” trong dashboard nghĩa là bạn không tốn $290 đó, không phải bạn nợ $290.
Caveman Mode - tính năng tùy chọn viết lại prompt LLM thành kiểu “người hang động” để cắt output token tới 65% - hoạt động nhưng thay đổi chất lượng câu trả lời. Ổn cho code thuần túy. Dở cho những chỗ cần giải thích rõ ràng.
Cloud Sync lưu config provider qua các thiết bị. Nghĩa là API key và OAuth token đi qua một cloud service của 9Router. Với hầu hết người dùng không vấn đề; môi trường bảo mật cao nên self-host Docker image và tắt sync.
Bên Trong Thực Sự Có Gì
Nhiều người đã đặt câu hỏi về tính minh bạch của 9Router. Tôi đọc source code. Đây là những gì có thể xác minh và những gì cần cân nhắc - không marketing, không thổi phồng.
Những gì thực sự mở. Logic routing, RTK compression, fallback tier, DB schema, và per-provider interceptor đều đọc được trên GitHub. Code làm đúng những gì nó nói.
MITM với root CA hệ thống - điều này có thật, và không được thông báo rõ ràng.
Với các OAuth subscription provider (Copilot, Cursor, Kiro, Antigravity), 9Router không đơn giản là một HTTP proxy. Nó chạy một MITM (man-in-the-middle) HTTPS server đầy đủ trong src/mitm/. Lần đầu chạy, nó tạo một root CA certificate cục bộ và cài vào system trust store của máy bạn. Trên Windows cần quyền elevated (winElevated.js). Sau đó, nó chặn và giải mã HTTPS outgoing từ các tool đó - đọc request, thay model, rồi re-route đến provider bạn đã cấu hình.
Đây là cách nó redirect traffic từ các tool không hỗ trợ custom endpoint. Nó hoạt động. Nhưng điều đó có nghĩa là 9Router có khả năng kỹ thuật để đọc mọi request và response đến Copilot, Cursor, Kiro, Antigravity - bao gồm code context và nội dung conversation của bạn - ở dạng cleartext trên máy.
Không có bằng chứng trong source code rằng nội dung này bị log hay exfiltrate. Nhưng việc cài root CA phơi bạn ra trước mọi lỗ hổng trong tương lai của quản lý CA key của 9Router. Bạn đang đưa ra một quyết định tin tưởng, và README không làm điều này nổi bật.
Npm package không thể audit được so với source.
package.json trong repo đặt "private": true và "name": "9router-app". Nghĩa là GitHub source và npm package 9router được maintaine riêng biệt. Những gì bạn cài với npm install -g 9router không thể xác minh trực tiếp so với những gì bạn thấy trên GitHub. Với một tool intercepting HTTPS traffic và lưu OAuth token, khoảng cách này quan trọng.
HOST_REWRITE dùng internal endpoint của Google.
Code trong src/mitm/server.js chứa:
const HOST_REWRITE = {
"cloudcode-pa.googleapis.com": "daily-cloudcode-pa.googleapis.com",
};
daily-cloudcode-pa là một developer/staging endpoint của Google, không phải production API. 9Router rewrite Antigravity request sang endpoint này để bypass production rate limit. Đây có thể là vi phạm điều khoản dịch vụ của Google và có thể dừng hoạt động bất cứ lúc nào nếu Google hạn chế lại.
Cloud Sync gửi credentials lên server của 9Router.
Bảng providerConnections lưu OAuth token và API key. Khi Cloud Sync bật, dữ liệu này đến server của 9Router. README nói dùng encryption; chi tiết quản lý key không thấy trong public source. Tắt sync nếu bạn đang xử lý credentials nhạy cảm.
Kết luận. 9Router không phải malware theo nghĩa truyền thống. Các tính năng routing, compression, và fallback hoạt động đúng như mô tả. Nhưng nó không phải “proxy local đơn giản” như cách nó tự giới thiệu. Nó cài system root CA, route qua một endpoint nội bộ của Google không chính thức, và sync credentials lên cloud service mà internal không thể audit từ public source. Nếu bạn chọn dùng nó, hãy chạy Docker với Cloud Sync tắt, và kiểm tra CA certificate nó cài vào trust store của bạn.
Mô Hình Tư Duy
Hãy nghĩ 9Router như một circuit breaker cho chi phí AI của bạn.
Khi hết quota, hành vi bình thường là hard stop: tool báo lỗi, bạn nhận ra, bạn đổi provider thủ công, bạn mất mạch tư duy. 9Router làm cái lỗi đó im lặng và tự động. Tier tiếp theo tiếp quản. Bạn tiếp tục gõ.
RTK compression độc lập với fallback story - nó giảm tốc độ đốt quota ở bất kỳ tier nào. Hai tính năng kết hợp: tốn ít tiền hơn mỗi session và ít khi chạm giới hạn hơn.
10,731 stars và 1,652 forks kể từ tháng 1/2026 - bốn tháng tăng trưởng. Tốc độ đó cho thấy pain point là thật và phổ biến rộng.
→ decolua/9router · MIT · JavaScript · 9router.com
Hoang Yell
Một nhà phát triển phần mềm và là người kể chuyện kỹ thuật. Tôi dành thời gian để khám phá những repository mã nguồn mở thú vị nhất trên GitHub và trình bày chúng dưới dạng những câu chuyện dễ hiểu cho mọi người.