{"_id":"8router","_rev":"12-eff9ec0ff229183f1613db380427a04e","name":"8router","dist-tags":{"latest":"0.5.24"},"versions":{"0.5.12":{"name":"8router","version":"0.5.12","_id":"8router@0.5.12","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"593c039686b1230e504740063c6ee37c534e6c7d","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.12.tgz","fileCount":712,"integrity":"sha512-YRZn37t50ts+Uji7iJGONVkija2atEMbgNmBsmSXX6fiUPZLgw1U2ISNBWOJC+XE371cJ+ihVWLGb3LW0Djeeg==","signatures":[{"sig":"MEQCIBhmxf1rb//4YzAzLzaQJmI+VaQ1Ss671LBrKS7hdfdBAiB8lAwGA/i/m8DkoUM5bg5Qty0g9UYd6b2FuXP+CVVBKg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5472442},"gitHead":"a109513dda50792523ca6a48ae62abb7994b8879","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"11.16.0","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.12_1782721920391_0.6244258931354005","host":"s3://npm-registry-packages-npm-production"}},"0.5.13":{"name":"8router","version":"0.5.13","_id":"8router@0.5.13","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"0fcb98b320ee79eea768815649260c2e8bcfbed4","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.13.tgz","fileCount":7909,"integrity":"sha512-fyAuVmKvXZSimpnM/fyxm0Hu9pUYtLJIxrO8um+403gVnOXuRsw3Q/Of9QlrKATfyA1K/bUvWaa8txsz3rr0/A==","signatures":[{"sig":"MEQCIH1NWqZoy89iLtWa0Sf10PwlBgJOXWv0SRn5OKHcZU3LAiBksajbDTBbF0SRnMl4Qh30TPx53aL0rr/rXI0WsDZrKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":702831238},"gitHead":"c8093fd0ceb5e67618bf4f9e8eccc44d7cd99966","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"11.16.0","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.13_1782723971236_0.24150662116571509","host":"s3://npm-registry-packages-npm-production"}},"0.5.15":{"name":"8router","version":"0.5.15","_id":"8router@0.5.15","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"6f1b1339fb9bc7f286cbbad84592b81c655102fe","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.15.tgz","fileCount":3891,"integrity":"sha512-QPJiKuOG8ZOWSV+KtDqBgCPf7KnSMV2vM0GBxyIBvHpLcNFP8mgrVHtts9fOtLIgDTAyTIVBd21c+sfdKpOQcQ==","signatures":[{"sig":"MEYCIQCMrVfflDnQZUlDDgUR0zQS/ShN7pqKdcVzIqgxOgHdjQIhAPhRuLGRjHTP6br0NfxqvZezKKipo6ZgC4/zVDQ/E23T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78754777},"gitHead":"c812c50c22602f36bb6195996ad3ef9a8a44ac6f","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"10.9.8","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.15_1782726197110_0.6024558339044863","host":"s3://npm-registry-packages-npm-production"}},"0.5.16":{"name":"8router","version":"0.5.16","_id":"8router@0.5.16","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"a9ed75ed075e9cd867da1d5e414ac1a08f273110","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.16.tgz","fileCount":3891,"integrity":"sha512-BjIdmfkf1/phK2jG3sjBrTydmnbbMv5isIvuA1DNEc2FPmJRfjcXEH+AcvZFe5RzmaAp29CcX0FfBE7+SmRMeQ==","signatures":[{"sig":"MEQCIHlNPrlo4TUUyUXCKhkiNt3naX7WqQCz5vAjmdE3Bu1zAiBkrlRPRlntZhfHIPUnlUTStMW0qUTIrFBr4JeIMzPAMw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78754777},"gitHead":"d4d30037fc4d7f1533b49d575bd66407d21e9263","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"10.9.8","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.16_1782726274889_0.897659877442385","host":"s3://npm-registry-packages-npm-production"}},"0.5.17":{"name":"8router","version":"0.5.17","_id":"8router@0.5.17","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"f139fb3c2872c0992f8b24ef5b8938f7e61149f4","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.17.tgz","fileCount":3891,"integrity":"sha512-2itxzUmTAkPWbHVLyVjAVmk1bYth4vZLB5cnb8w0xFWneUKFCrFPll1yg2zu0y6JYY5vYL1lyMzxTui2ah+ZcQ==","signatures":[{"sig":"MEQCIHTLWKffs6Tj1CMB5aogk/IxsZjQ/LSXITwxbw5vNCT1AiBZe9/PyFMW+CIZ3tvPVJraOr6gHWACOypzOX15f8Dkhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78754919},"gitHead":"d01fc3f49b13c83b24a0f3931e004263831cfa41","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"10.9.8","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.17_1782726544009_0.03084666081215026","host":"s3://npm-registry-packages-npm-production"}},"0.5.18":{"name":"8router","version":"0.5.18","_id":"8router@0.5.18","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"8c15971524e07f2c2e568e4ad9a0f6abc163401d","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.18.tgz","fileCount":3891,"integrity":"sha512-K+EWwO6RrQDPFXEH/qJdpEmrp6TR3Q5SO0SdZ0bpHXt2N+zuMXe4T77QuHds0eqZRYTmj4wdAiEcnZOocvjKug==","signatures":[{"sig":"MEUCIEDmp8KvFbVMnbTA1SVwoptrhhlA8fnKG8OLVKI8/NY3AiEA1NARHVfNZFB09G9y5vSfQz1i1lqKJxbvs+2kBOlJzeY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78754919},"gitHead":"4af4da0cbadcddf98ad56e628d86134cf2e0477e","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"10.9.8","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.18_1782726991285_0.2159297300007481","host":"s3://npm-registry-packages-npm-production"}},"0.5.19":{"name":"8router","version":"0.5.19","_id":"8router@0.5.19","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"4370e205f1acbbec40f853c46db18966a42e0e42","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.19.tgz","fileCount":3911,"integrity":"sha512-lDWLrjNAr8DkqB9DG/izUrNhk25p7IXj98DWxmErMlKRSnNv0JZHBkIjewnL2gqS/8gpFJRtDjVssgSoZMoWaA==","signatures":[{"sig":"MEYCIQD+apDnGBbY55Y5sLSIc2YLXSyyb+UWH2R8U7ZWD74IPQIhALyUMHTkx5WaPsBiXSkmvkG+no1YA5SMTT9HJdi0/rD+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79076454},"gitHead":"4af4da0cbadcddf98ad56e628d86134cf2e0477e","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"10.9.8","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.19_1782727714847_0.34596406052368267","host":"s3://npm-registry-packages-npm-production"}},"0.5.20":{"name":"8router","version":"0.5.20","_id":"8router@0.5.20","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"9782f35b247ed22ebb08d50addeaf1993f8b80ff","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.20.tgz","fileCount":3912,"integrity":"sha512-NYS3jnwaH4VOHYx4LP4hDRUE5sSbM8fpdc0e8I6gJqbnPnBpa2lwF/3y/CxfI64QakHFweCwKVfGpzbB+FmsPw==","signatures":[{"sig":"MEUCIQD7/+RB9cI6ndc14i7cYSsSfa4ZRDd1lD/WVtVtkebFhAIgVql9oyGI6Zem27i39rbWNeBtlvWY0Vc+KSMPcVwaBXc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79266435},"gitHead":"4af4da0cbadcddf98ad56e628d86134cf2e0477e","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"10.9.8","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.20_1782728172658_0.9299465282948125","host":"s3://npm-registry-packages-npm-production"}},"0.5.21":{"name":"8router","version":"0.5.21","_id":"8router@0.5.21","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"80151b8f6391b3d65a71032de6e248e6d8be6103","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.21.tgz","fileCount":3913,"integrity":"sha512-r1BbcCUP9ovnLHN9OByvhgAOiuF2MkHZuU1a6xhRqdYs9HZ2lnzgjmXggCmCx43l6YLfWJ9yJXaEUbsV2zYxtA==","signatures":[{"sig":"MEUCIQDyRTmk/xGLvA6+i476bVg/E2P402BOxNOM9iSlLaqB7gIgX8zC2OQQQcUi+2zLPsYla2JAGWvWPpw06i1+Vt7EcQY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79456040},"gitHead":"eedf726d356f97815aeae567e3cee51fead55076","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"10.9.8","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.21_1782734982662_0.9955082475526484","host":"s3://npm-registry-packages-npm-production"}},"0.5.22":{"name":"8router","version":"0.5.22","_id":"8router@0.5.22","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"846a1569342c2647b77d4fb018b3285b595bb81f","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.22.tgz","fileCount":3913,"integrity":"sha512-P5cUTNZUh3VkxFXygcYjPs1QE3oxxs7cCNT5idMTNWXxppvBBiSonVoZ0o7pKD4zmAIh4hpQqKlFf9HRvxLkbA==","signatures":[{"sig":"MEQCIDSpv8gMO+t/EwiP648MMHpAtJQV3q5kdjRRZ1FaKXNNAiAVMeLH57zD4hrC6DhhSHXPkO2mmLUXGHHs/12RHNXyog==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79456040},"gitHead":"78d1482185420eb384b546851f6891cf68756770","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"10.9.8","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.22_1782735838177_0.930543720987471","host":"s3://npm-registry-packages-npm-production"}},"0.5.23":{"name":"8router","version":"0.5.23","_id":"8router@0.5.23","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"bin":{"8router":"bin/8router.js"},"dist":{"shasum":"b718eafd40b37883eacdc1716a5f0ef6cef0a75d","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.23.tgz","fileCount":3914,"integrity":"sha512-CCde57ADYlwM37CpxawD9+BGXIU9HAQ5TGMOXzly88wSoyb7mFl4ggPtYXxvEWznXtRtT/LHMsxN+DWHKt475Q==","signatures":[{"sig":"MEQCIAzh003jWUEYL0TS5qFD16GpS3VPoZ1q+eLSm1S2rxyuAiAYXvlGISmwD1BKfXjqrsPzVJRr4BTUZFx7FcDIXwfnkQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79644520},"gitHead":"ee3fb1955665054d298980d427ead0a2acbc9339","scripts":{"dev":"next dev --webpack --port 20127","lint":"eslint . --no-warn-ignored","test":"vitest run --config tests/vitest.config.js","build":"node scripts/build.js","start":"node server.js","dev:bun":"bun --bun next dev --webpack --port 20127","cli:pack":"npm --prefix cli run pack:cli","lint:fix":"eslint . --fix --no-warn-ignored","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","lint:undef":"node scripts/lint-undef.cjs","cli:publish":"npm --prefix cli run publish:cli","lint:reacthooks":"node scripts/lint-reacthooks.cjs"},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"_npmVersion":"10.9.8","description":"8Router - Universal AI Gateway","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ora":"^9.1.0","jose":"^6.1.3","next":"^16.1.6","open":"^11.0.0","chalk":"^5.6.2","react":"19.2.4","marked":"^18.0.1","sql.js":"^1.14.1","undici":"^7.19.2","confbox":"^0.2.4","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.4.11","react-dom":"19.2.4","node-forge":"^1.3.3","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.10.1","monaco-editor":"^0.55.1","node-machine-id":"^1.1.12","playwright-core":"^1.60.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@next/third-parties":"^16.2.9","@monaco-editor/react":"^4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.8","postcss":"^8.5.6","tailwindcss":"^4","eslint-config-next":"16.1.6","@tailwindcss/postcss":"^4.1.18"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","_npmOperationalInternal":{"tmp":"tmp/8router_0.5.23_1782736597830_0.7124148395533603","host":"s3://npm-registry-packages-npm-production"}},"0.5.24":{"name":"8router","version":"0.5.24","description":"8Router - Universal AI Gateway","bin":{"8router":"bin/8router.js"},"scripts":{"dev":"next dev --webpack --port 20127","build":"node scripts/build.js","lint":"eslint . --no-warn-ignored","lint:fix":"eslint . --fix --no-warn-ignored","lint:undef":"node scripts/lint-undef.cjs","lint:reacthooks":"node scripts/lint-reacthooks.cjs","start":"node server.js","test":"vitest run --config tests/vitest.config.js","dev:bun":"bun --bun next dev --webpack --port 20127","build:bun":"bun --bun next build --webpack","start:bun":"bun ./.next/standalone/server.js","cli:pack":"npm --prefix cli run pack:cli","cli:publish":"npm --prefix cli run publish:cli"},"dependencies":{"@dnd-kit/core":"^6.3.1","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@monaco-editor/react":"^4.7.0","@next/third-parties":"^16.2.9","@xyflow/react":"^12.10.1","bcryptjs":"^3.0.3","chalk":"^5.6.2","confbox":"^0.2.4","dompurify":"^3.4.11","jose":"^6.1.3","marked":"^18.0.1","monaco-editor":"^0.55.1","next":"^16.1.6","node-forge":"^1.3.3","node-machine-id":"^1.1.12","open":"^11.0.0","ora":"^9.1.0","playwright-core":"^1.60.0","react":"19.2.4","react-dom":"19.2.4","recharts":"^3.7.0","sql.js":"^1.14.1","undici":"^7.19.2","zustand":"^5.0.10"},"optionalDependencies":{"better-sqlite3":"^12.6.2"},"comment_better_sqlite3":"kept in optionalDependencies so npm install doesn't fail on systems without build tools — sql.js is used as fallback at runtime","devDependencies":{"@tailwindcss/postcss":"^4.1.18","eslint":"^9","eslint-config-next":"16.1.6","postcss":"^8.5.6","tailwindcss":"^4","vitest":"^4.1.8"},"_id":"8router@0.5.24","gitHead":"d06520c9d6ffa11887374f32d59ee467434dc79d","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-QYjnZC7gXcqOw71QoHw8NjhJkheXST1IpgeM5MymLXoZLgiBV9300U2VzQed8NYrVdELTyk4OWSR7IT+gJpJXg==","shasum":"3213a38c092d1618284a9fb3a7e3425824dc7885","tarball":"https://registry.npmjs.org/8router/-/8router-0.5.24.tgz","fileCount":3915,"unpackedSize":79834794,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFlsYS+EZHDUAmK+lrj2NmtBXwumCYcHxX07x/vvHfRSAiEA8XvnTd3jprJXj7GUlaCP0685qgKm0T0Am768vgr8f64="}]},"_npmUser":{"name":"inihanif","email":"rmhyps@gmail.com"},"directories":{},"maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/8router_0.5.24_1782738862039_0.1416281677454574"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-29T08:32:00.355Z","modified":"2026-06-29T13:14:22.675Z","0.5.12":"2026-06-29T08:32:00.609Z","0.5.13":"2026-06-29T09:06:12.634Z","0.5.15":"2026-06-29T09:43:17.556Z","0.5.16":"2026-06-29T09:44:35.432Z","0.5.17":"2026-06-29T09:49:04.424Z","0.5.18":"2026-06-29T09:56:31.702Z","0.5.19":"2026-06-29T10:08:35.352Z","0.5.20":"2026-06-29T10:16:13.115Z","0.5.21":"2026-06-29T12:09:43.162Z","0.5.22":"2026-06-29T12:23:58.748Z","0.5.23":"2026-06-29T12:36:38.274Z","0.5.24":"2026-06-29T13:14:22.566Z"},"description":"8Router - Universal AI Gateway","maintainers":[{"name":"inihanif","email":"rmhyps@gmail.com"}],"readme":"\r\n<div align=\"center\">\r\n  <img src=\"./images/9router.png?1\" alt=\"9Router Dashboard\" width=\"800\"/>\r\n  \r\n  # 9Router - 免费 AI 路由器与 Token 节省器\r\n  \r\n  **编程永不停歇。使用 RTK + 自动切换到免费/低价 AI 模型，节省 20-40% 的 tokens。**\r\n  \r\n  **将所有 AI 编程工具（Claude Code、Cursor、Antigravity、Copilot、Codex、Gemini、OpenCode、Cline、OpenClaw...）连接到 40+ AI 提供商和 100+ 模型。**\r\n  \r\n  [![npm](https://img.shields.io/npm/v/9router.svg)](https://www.npmjs.com/package/9router)\r\n  [![Downloads](https://img.shields.io/npm/dm/9router.svg)](https://www.npmjs.com/package/9router)\r\n  [![License](https://img.shields.io/npm/l/9router.svg)](https://github.com/decolua/9router/blob/main/LICENSE)\r\n\r\n  <a href=\"https://trendshift.io/repositories/22628\" target=\"_blank\"><img src=\"https://trendshift.io/api/badge/repositories/22628\" alt=\"decolua%2F9router | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/></a>\r\n  \r\n  [🚀 快速开始](#-快速开始) • [💡 功能特点](#-主要功能) • [📖 设置指南](#-设置指南) • [🌐 网站](https://9router.com)\r\n\r\n  [🇻🇳 Tiếng Việt](./i18n/README.vi.md) • [🇨🇳 中文](./i18n/README.zh-CN.md) • [🇯🇵 日本語](./i18n/README.ja-JP.md)\r\n</div>\r\n\r\n---\r\n\r\n## 🤔 为什么选择 9Router？\r\n\r\n**告别浪费金钱、tokens 和触碰限制的困扰：**\r\n\r\n- ❌ 订阅配额每月到期却未使用\r\n- ❌ 速率限制在编程中途打断你\r\n- ❌ 工具输出（git diff、grep、ls...）快速消耗 tokens\r\n- ❌ 昂贵的 API（每个提供商 $20-50/月）\r\n- ❌ 需要手动在提供商之间切换\r\n\r\n**9Router 解决这一切：**\r\n\r\n- ✅ **RTK Token 节省器** - 自动压缩 tool_result 内容，每次请求节省 20-40% tokens\r\n- ✅ **充分利用订阅** - 追踪配额，在重置前用尽每一分额度\r\n- ✅ **自动切换** - 订阅 → 低价 → 免费，零停机时间\r\n- ✅ **多账户支持** - 按提供商在账户之间轮询\r\n- ✅ **通用兼容** - 支持 Claude Code、Codex、Cursor、Cline 以及任何 CLI 工具\r\n\r\n---\r\n\r\n## 🔄 工作原理\r\n\r\n```\r\n┌─────────────┐\r\n│  你的 CLI   │  (Claude Code、Codex、OpenClaw、Cursor、Cline...)\r\n│   工具      │\r\n└──────┬──────┘\r\n       │ http://localhost:20128/v1\r\n       ↓\r\n┌─────────────────────────────────────────────┐\r\n│           9Router（智能路由器）              │\r\n│  • RTK Token 节省器（减少 tool_result tokens）│\r\n│  • 格式转换（OpenAI ↔ Claude）              │\r\n│  • 配额追踪                                  │\r\n│  • 自动刷新 token                           │\r\n└──────┬──────────────────────────────────────┘\r\n       │\r\n       ├─→ [第一层：订阅] Claude Code、Codex、GitHub Copilot\r\n       │   ↓ 配额耗尽\r\n       ├─→ [第二层：低价] GLM ($0.6/1M)、MiniMax ($0.2/1M)\r\n       │   ↓ 预算超限\r\n       └─→ [第三层：免费] Kiro、OpenCode Free、Vertex ($300 额度)\r\n\r\n结果：编程永不停歇，最小成本 + 通过 RTK 节省 20-40% tokens\r\n```\r\n\r\n---\r\n\r\n## ⚡ 快速开始\r\n\r\n**1. 全局安装：**\r\n\r\n```bash\r\nnpm install -g 9router\r\n9router\r\n```\r\n\r\n🎉 控制面板在 `http://localhost:20128` 打开\r\n\r\n**2. 连接免费提供商（无需注册）：**\r\n\r\n控制面板 → 提供商 → 连接 **Kiro AI**（免费 Claude 无限量）或 **OpenCode Free**（无需认证）→ 完成！\r\n\r\n**3. 在 CLI 工具中使用：**\r\n\r\n```\r\nClaude Code/Codex/OpenClaw/Cursor/Cline 设置：\r\n  Endpoint: http://localhost:20128/v1\r\n  API Key: [从控制面板复制]\r\n  Model: kr/claude-sonnet-4.5\r\n```\r\n\r\n**就这么简单！** 开始使用免费 AI 模型编程。\r\n\r\n**替代方案：从源码运行（本仓库）：**\r\n\r\n本仓库的包是私有的（`9router-app`），所以源码/Docker 执行是预期的本地开发方式。\r\n\r\n```bash\r\ncp .env.example .env\r\nnpm install\r\nPORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev\r\n```\r\n\r\n生产模式：\r\n\r\n```bash\r\nnpm run build\r\nPORT=20128 HOSTNAME=0.0.0.0 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run start\r\n```\r\n\r\n默认 URL：\r\n- 控制面板：`http://localhost:20128/dashboard`\r\n- OpenAI 兼容 API：`http://localhost:20128/v1`\r\n\r\n---\r\n\r\n## 视频教程\r\n\r\n<div align=\"center\">\r\n\r\n<table>\r\n  <tr>\r\n    <td align=\"center\" width=\"320\">\r\n      <a href=\"https://www.youtube.com/watch?v=raEyZPg5xE0\">\r\n        <img src=\"https://img.youtube.com/vi/raEyZPg5xE0/maxresdefault.jpg\" alt=\"9Router Setup Tutorial\" width=\"300\"/>\r\n      </a><br/>\r\n      <b>🇺🇸 English</b><br/>\r\n      <sub>9Router + Claude Code 免费设置<br/>by <a href=\"https://www.youtube.com/@BuildAIWithHamid\">Build AI With Hamid</a></sub>\r\n    </td>\r\n    <td align=\"center\" width=\"320\">\r\n      <a href=\"https://www.youtube.com/watch?v=X69n5Lm06Yw\">\r\n        <img src=\"https://img.youtube.com/vi/X69n5Lm06Yw/maxresdefault.jpg\" alt=\"Tiết kiệm chi phí LLM với 9Router\" width=\"300\"/>\r\n      </a><br/>\r\n      <b>🇻🇳 Tiếng Việt</b><br/>\r\n      <sub>使用 9Router 节省 OpenClaw 的 LLM 成本<br/>by <a href=\"https://www.youtube.com/c/M%C3%ACAIblog\">Mì AI</a></sub>\r\n    </td>\r\n    <td align=\"center\" width=\"320\">\r\n      <a href=\"https://www.youtube.com/watch?v=o3qYCyjrFYg\">\r\n        <img src=\"https://img.youtube.com/vi/o3qYCyjrFYg/maxresdefault.jpg\" alt=\"Claude Code FREE Forever\" width=\"300\"/>\r\n      </a><br/>\r\n      <b>🇺🇸 English</b><br/>\r\n      <sub>Claude Code 免费永久使用 — 无限模型<br/>by <a href=\"https://www.youtube.com/@BuildAIWithHamid\">Build AI With Hamid</a></sub>\r\n    </td>\r\n  </tr>\r\n  <tr>\r\n    <td align=\"center\" width=\"320\">\r\n      <a href=\"https://www.youtube.com/watch?v=Ttpc26m39Dw\">\r\n        <img src=\"https://img.youtube.com/vi/Ttpc26m39Dw/maxresdefault.jpg\" alt=\"Claude CLI Free Setup\" width=\"300\"/>\r\n      </a><br/>\r\n      <b>🇺🇸 English</b><br/>\r\n      <sub>使用 9Router 免费设置 Claude CLI 🚀<br/>by <a href=\"https://www.youtube.com/@CodeVerseSoban\">CodeVerse Soban</a></sub>\r\n    </td>\r\n    <td align=\"center\" width=\"320\">\r\n      <a href=\"https://www.youtube.com/watch?v=G-5A_D5Pm6Y\">\r\n        <img src=\"https://img.youtube.com/vi/G-5A_D5Pm6Y/maxresdefault.jpg\" alt=\"Cài đặt OpenClaw Free A-Z\" width=\"300\"/>\r\n      </a><br/>\r\n      <b>🇻🇳 Tiếng Việt</b><br/>\r\n      <sub>从零开始安装 OpenClaw 免费版 + 9Router<br/>by <a href=\"https://www.youtube.com/@maigia\">Mai Gia</a></sub>\r\n    </td>\r\n    <td align=\"center\" width=\"320\">\r\n      <a href=\"https://www.youtube.com/watch?v=JXmg8_gccgE\">\r\n        <img src=\"https://img.youtube.com/vi/JXmg8_gccgE/maxresdefault.jpg\" alt=\"FREE OpenClaw with Claude Opus\" width=\"300\"/>\r\n      </a><br/>\r\n      <b>🇺🇸 English</b><br/>\r\n      <sub>免费 OpenClaw + Claude Opus 4.6<br/>by <a href=\"https://www.youtube.com/@BuildAIWithHamid\">Build AI With Hamid</a></sub>\r\n    </td>\r\n  </tr>\r\n</table>\r\n\r\n</div>\r\n\r\n> 🎬 **制作了关于 9Router 的视频？** 提交 [Pull Request](https://github.com/decolua/9router/pulls)，将你的视频添加到此部分 — 我们会合并它！\r\n\r\n---\r\n\r\n## 🛠️ 支持的 CLI 工具\r\n\r\n9Router 与所有主流 AI 编程工具无缝协作：\r\n\r\n<div align=\"center\">\r\n  <table>\r\n    <tr>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/claude.png\" width=\"60\" alt=\"Claude Code\"/><br/>\r\n        <b>Claude-Code</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/openclaw.png\" width=\"60\" alt=\"OpenClaw\"/><br/>\r\n        <b>OpenClaw</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/codex.png\" width=\"60\" alt=\"Codex\"/><br/>\r\n        <b>Codex</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/opencode.png\" width=\"60\" alt=\"OpenCode\"/><br/>\r\n        <b>OpenCode</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/cursor.png\" width=\"60\" alt=\"Cursor\"/><br/>\r\n        <b>Cursor</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/antigravity.png\" width=\"60\" alt=\"Antigravity\"/><br/>\r\n        <b>Antigravity</b>\r\n      </td>\r\n    </tr>\r\n    <tr>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/cline.png\" width=\"60\" alt=\"Cline\"/><br/>\r\n        <b>Cline</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/continue.png\" width=\"60\" alt=\"Continue\"/><br/>\r\n        <b>Continue</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/droid.png\" width=\"60\" alt=\"Droid\"/><br/>\r\n        <b>Droid</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/roo.png\" width=\"60\" alt=\"Roo\"/><br/>\r\n        <b>Roo</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/copilot.png\" width=\"60\" alt=\"Copilot\"/><br/>\r\n        <b>Copilot</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/kilocode.png\" width=\"60\" alt=\"Kilo Code\"/><br/>\r\n        <b>Kilo Code</b>\r\n      </td>\r\n    </tr>\r\n  </table>\r\n</div>\r\n\r\n---\r\n\r\n## 🌐 支持的提供商\r\n\r\n### 🔐 OAuth 提供商\r\n\r\n<div align=\"center\">\r\n  <table>\r\n    <tr>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/claude.png\" width=\"60\" alt=\"Claude Code\"/><br/>\r\n        <b>Claude-Code</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/antigravity.png\" width=\"60\" alt=\"Antigravity\"/><br/>\r\n        <b>Antigravity</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/codex.png\" width=\"60\" alt=\"Codex\"/><br/>\r\n        <b>Codex</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/github.png\" width=\"60\" alt=\"GitHub\"/><br/>\r\n        <b>GitHub</b>\r\n      </td>\r\n      <td align=\"center\" width=\"120\">\r\n        <img src=\"./public/providers/cursor.png\" width=\"60\" alt=\"Cursor\"/><br/>\r\n        <b>Cursor</b>\r\n      </td>\r\n    </tr>\r\n  </table>\r\n</div>\r\n\r\n### 🆓 免费提供商\r\n\r\n<div align=\"center\">\r\n  <table>\r\n    <tr>\r\n      <td align=\"center\" width=\"150\">\r\n        <img src=\"./public/providers/kiro.png\" width=\"70\" alt=\"Kiro\"/><br/>\r\n        <b>Kiro AI</b><br/>\r\n        <sub>Claude 4.5 + GLM-5 + MiniMax<br/>无限免费</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"150\">\r\n        <img src=\"./public/providers/opencode.png\" width=\"70\" alt=\"OpenCode Free\"/><br/>\r\n        <b>OpenCode Free</b><br/>\r\n        <sub>无需认证 • 自动获取模型<br/>无限免费</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"150\">\r\n        <img src=\"./public/providers/gemini.png\" width=\"70\" alt=\"Vertex AI\"/><br/>\r\n        <b>Vertex AI</b><br/>\r\n        <sub>Gemini 3 Pro + GLM-5 + DeepSeek<br/>$300 免费额度</sub>\r\n      </td>\r\n    </tr>\r\n  </table>\r\n</div>\r\n\r\n> **注意：** iFlow、Qwen 和 Gemini CLI 的免费等级已于 2026 年停止。请改用 Kiro / OpenCode Free / Vertex。\r\n\r\n### 🔑 API Key 提供商（40+）\r\n\r\n<div align=\"center\">\r\n  <table>\r\n    <tr>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/openrouter.png\" width=\"50\" alt=\"OpenRouter\"/><br/>\r\n        <sub>OpenRouter</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/glm.png\" width=\"50\" alt=\"GLM\"/><br/>\r\n        <sub>GLM</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/kimi.png\" width=\"50\" alt=\"Kimi\"/><br/>\r\n        <sub>Kimi</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/minimax.png\" width=\"50\" alt=\"MiniMax\"/><br/>\r\n        <sub>MiniMax</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/openai.png\" width=\"50\" alt=\"OpenAI\"/><br/>\r\n        <sub>OpenAI</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/anthropic.png\" width=\"50\" alt=\"Anthropic\"/><br/>\r\n        <sub>Anthropic</sub>\r\n      </td>\r\n    </tr>\r\n    <tr>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/gemini.png\" width=\"50\" alt=\"Gemini\"/><br/>\r\n        <sub>Gemini</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/deepseek.png\" width=\"50\" alt=\"DeepSeek\"/><br/>\r\n        <sub>DeepSeek</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/groq.png\" width=\"50\" alt=\"Groq\"/><br/>\r\n        <sub>Groq</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/xai.png\" width=\"50\" alt=\"xAI\"/><br/>\r\n        <sub>xAI</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/mistral.png\" width=\"50\" alt=\"Mistral\"/><br/>\r\n        <sub>Mistral</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/perplexity.png\" width=\"50\" alt=\"Perplexity\"/><br/>\r\n        <sub>Perplexity</sub>\r\n      </td>\r\n    </tr>\r\n    <tr>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/together.png\" width=\"50\" alt=\"Together\"/><br/>\r\n        <sub>Together AI</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/fireworks.png\" width=\"50\" alt=\"Fireworks\"/><br/>\r\n        <sub>Fireworks</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/cerebras.png\" width=\"50\" alt=\"Cerebras\"/><br/>\r\n        <sub>Cerebras</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/cohere.png\" width=\"50\" alt=\"Cohere\"/><br/>\r\n        <sub>Cohere</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/nvidia.png\" width=\"50\" alt=\"NVIDIA\"/><br/>\r\n        <sub>NVIDIA</sub>\r\n      </td>\r\n      <td align=\"center\" width=\"100\">\r\n        <img src=\"./public/providers/siliconflow.png\" width=\"50\" alt=\"SiliconFlow\"/><br/>\r\n        <sub>SiliconFlow</sub>\r\n      </td>\r\n    </tr>\r\n  </table>\r\n  <p><i>...以及 20+ 更多提供商，包括 Nebius、Chutes、Hyperbolic 和自定义 OpenAI/Anthropic 兼容端点</i></p>\r\n</div>\r\n\r\n---\r\n\r\n## 💡 主要功能\r\n\r\n| 功能 | 作用 | 为什么重要 |\r\n|---------|--------------|----------------|\r\n| 🚀 **RTK Token 节省器**（[RTK](https://github.com/rtk-ai/rtk) ⭐40K） | 压缩工具输出（`git diff`、`grep`、`ls`、`tree`...）后再发送给 LLM | 每次请求节省 **20-40% 输入 tokens** |\r\n| 🪨 **Caveman 模式**（[Caveman](https://github.com/JuliusBrussee/caveman) ⭐52K） | 注入 caveman 风格提示词 → LLM 回复简洁，保留技术实质 | 节省 **高达 65% 输出 tokens** |\r\n| 🎯 **智能三层切换** | 自动路由：订阅 → 低价 → 免费 | 编程永不停歇，零停机时间 |\r\n| 📊 **实时配额追踪** | 实时 token 计数 + 重置倒计时 | 充分利用订阅价值 |\r\n| 🔄 **格式转换** | OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro ↔ Vertex | 兼容任何 CLI 工具 |\r\n| 👥 **多账户支持** | 每个提供商支持多个账户 | 负载均衡 + 冗余备份 |\r\n| 🔄 **自动 Token 刷新** | OAuth token 自动刷新 | 无需手动重新登录 |\r\n| 🎨 **自定义组合** | 创建无限模型组合 | 自定义适合你的切换策略 |\r\n| 📝 **请求日志** | 调试模式下的完整请求/响应日志 | 轻松排查问题 |\r\n| 💾 **云同步** | 跨设备同步配置 | 处处相同设置 |\r\n| 📊 **使用分析** | 追踪 tokens、成本、趋势 | 优化开支 |\r\n| 🌐 **任意部署** | 本地、VPS、Docker、Cloudflare Workers | 灵活部署选项 |\r\n\r\n<details>\r\n<summary><b>📖 功能详情</b></summary>\r\n\r\n### 🚀 RTK Token 节省器\r\n\r\n工具输出（`git diff`、`grep`、`find`、`ls`、`tree`、日志转储...）通常占用 30-50% 的提示词预算。RTK 在请求到达 LLM 之前检测并应用智能、无损压缩：\r\n\r\n- **过滤器：** `git-diff`、`git-status`、`grep`、`find`、`ls`、`tree`、`dedup-log`、`smart-truncate`、`read-numbered`、`search-list`\r\n- **自动检测：** 无需配置 — RTK 检查每个 `tool_result` 的前 1KB，选择合适的过滤器。\r\n- **安全设计：** 如果过滤器失败、抛出异常或使输出变大，RTK 会静默保留原始文本。错误永远不会中断你的请求。\r\n- **通用兼容：** 适用于所有格式（OpenAI、Claude、Gemini、Cursor、Kiro、OpenAI Responses），因为它在任何格式转换**之前**运行。\r\n- **默认开启：** 可随时在控制面板 → 端点设置中切换。\r\n\r\n```\r\n不使用 RTK：47K tokens 发送给 LLM\r\n使用 RTK：    28K tokens 发送给 LLM   (节省 40% · 相同上下文 · 相同答案)\r\n```\r\n\r\n### 🎯 智能三层切换\r\n\r\n创建具有自动切换功能的组合：\r\n\r\n```\r\n组合：\"my-coding-stack\"\r\n  1. cc/claude-opus-4-6        （你的订阅）\r\n  2. glm/glm-4.7               （低价备份，$0.6/1M）\r\n  3. if/kimi-k2-thinking       （免费备选）\r\n\r\n→ 配额用完或出错时自动切换\r\n```\r\n\r\n### 📊 实时配额追踪\r\n\r\n- 每个提供商的 token 消耗\r\n- 重置倒计时（5小时、每日、每周）\r\n- 付费等级的成本估算\r\n- 月度支出报告\r\n\r\n### 🔄 格式转换\r\n\r\n格式间无缝转换：\r\n- **OpenAI** ↔ **Claude** ↔ **Gemini** ↔ **Cursor** ↔ **Kiro** ↔ **Vertex** ↔ **Antigravity** ↔ **Ollama** ↔ **OpenAI Responses**\r\n- 你的 CLI 工具发送 OpenAI 格式 → 9Router 转换 → 提供商接收原生格式\r\n- 适用于任何支持自定义 OpenAI 端点的工具\r\n\r\n### 👥 多账户支持\r\n\r\n- 每个提供商添加多个账户\r\n- 自动轮询或基于优先级的路由\r\n- 当一个账户达到配额时切换到下一个\r\n\r\n### 🔄 自动 Token 刷新\r\n\r\n- OAuth token 在过期前自动刷新\r\n- 无需手动重新认证\r\n- 所有提供商的无缝体验\r\n\r\n### 🎨 自定义组合\r\n\r\n- 创建无限模型组合\r\n- 混合订阅、低价和免费等级\r\n- 为组合命名以便访问\r\n- 使用云同步跨设备共享组合\r\n\r\n### 📝 请求日志\r\n\r\n- 启用调试模式获取完整请求/响应日志\r\n- 追踪 API 调用、请求头和载荷\r\n- 排查集成问题\r\n- 导出日志进行分析\r\n\r\n### 💾 云同步\r\n\r\n- 跨设备同步提供商、组合和设置\r\n- 自动后台同步\r\n- 安全加密存储\r\n- 从任何地方访问你的设置\r\n\r\n#### 云运行时说明\r\n\r\n- 生产环境中优先使用服务端云变量：\r\n  - `BASE_URL`（云同步调度程序使用的内部回调 URL）\r\n  - `CLOUD_URL`（云同步端点基础 URL）\r\n- `NEXT_PUBLIC_BASE_URL` 和 `NEXT_PUBLIC_CLOUD_URL` 仍用于兼容性/UI，但服务端运行时现在优先使用 `BASE_URL`/`CLOUD_URL`。\r\n- 云同步请求现在使用超时 + 快速失败行为，以避免云 DNS/网络不可用时 UI 挂起。\r\n\r\n### 📊 使用分析\r\n\r\n- 追踪每个提供商和模型的 token 使用量\r\n- 成本估算和支出趋势\r\n- 月度报告和洞察\r\n- 优化你的 AI 支出\r\n\r\n> **💡 重要 - 了解控制面板成本：**\r\n> \r\n> 使用分析中显示的\"成本\"**仅用于追踪和比较目的**。\r\n> 9Router 本身**永远不会向你收费**。你只直接向提供商付款（如果使用付费服务）。\r\n> \r\n> **示例：** 如果你的控制面板显示使用 iFlow 模型时\"总成本 $290\"，这代表你如果直接使用付费 API 需要支付的金额。你的实际成本 = **$0**（iFlow 免费无限量）。\r\n> \r\n> 把它想象成一个\"节省追踪器\"，展示你通过使用免费模型或通过 9Router 路由节省了多少钱！\r\n\r\n### 🌐 任意部署\r\n\r\n- 💻 **本地** - 默认，离线可用\r\n- ☁️ **VPS/云** - 跨设备共享\r\n- 🐳 **Docker** - 一键部署\r\n- 🚀 **Cloudflare Workers** - 全球边缘网络\r\n\r\n</details>\r\n\r\n---\r\n\r\n## 💰 价格一览\r\n\r\n| 等级 | 提供商 | 成本 | 配额重置 | 适用场景 |\r\n|------|----------|------|-------------|----------|\r\n| **🚀 TOKEN 节省器** | **RTK（内置）** | **免费** | 始终开启 | **每次请求节省 20-40% tokens** |\r\n| **💳 订阅** | Claude Code (Pro/Max) | $20-200/月 | 5小时 + 每周 | 已有订阅的用户 |\r\n| | Codex (Plus/Pro) | $20-200/月 | 5小时 + 每周 | OpenAI 用户 |\r\n| | GitHub Copilot | $10-19/月 | 每月 | GitHub 用户 |\r\n| | Cursor IDE | $20/月 | 每月 | Cursor 用户 |\r\n| **💰 低价** | GLM-5.1 / GLM-4.7 | $0.6/1M | 每日 10AM | 预算备份 |\r\n| | MiniMax M2.7 | $0.2/1M | 5小时滚动 | 最便宜选项 |\r\n| | Kimi K2.5 | $9/月固定 | 10M tokens/月 | 可预测成本 |\r\n| **🆓 免费** | Kiro AI | $0 | 无限量 | Claude 4.5 + GLM-5 + MiniMax 免费 |\r\n| | OpenCode Free | $0 | 无限量 | 无需认证，自动获取模型 |\r\n| | Vertex AI | $300 额度 | 新 GCP 账户 | Gemini 3 Pro + DeepSeek + GLM-5 |\r\n\r\n**💡 专业提示：** RTK + Kiro AI + OpenCode Free 组合 = **$0 成本 + 节省 20-40% tokens**！\r\n\r\n---\r\n\r\n### 📊 理解 9Router 成本与计费\r\n\r\n**9Router 计费真相：**\r\n\r\n✅ **9Router 软件 = 永久免费**（开源，绝不收费）  \r\n✅ **控制面板\"成本\" = 仅用于显示/追踪**（不是实际账单）  \r\n✅ **你直接向提供商付款**（订阅或 API 费用）  \r\n✅ **免费提供商保持免费**（iFlow、Kiro、Qwen = $0 无限量）  \r\n❌ **9Router 永不发送发票** 或扣款\r\n\r\n**成本显示如何工作：**\r\n\r\n控制面板显示**估算成本**，如同你直接使用付费 API。这**不是计费** — 它是一个比较工具，展示你的节省。\r\n\r\n**示例场景：**\r\n```\r\n控制面板显示：\r\n• 总请求数：1,662\r\n• 总 Tokens：47M\r\n• 显示成本：$290\r\n\r\n实际检查：\r\n• 提供商：iFlow（免费无限量）\r\n• 实际支付：$0.00\r\n• $290 意味着什么：通过使用免费模型节省的金额！\r\n```\r\n\r\n**付款规则：**\r\n- **订阅提供商**（Claude Code、Codex）：通过他们的网站直接付款\r\n- **低价提供商**（GLM、MiniMax）：直接付款，9Router 只做路由\r\n- **免费提供商**（iFlow、Kiro、Qwen）：真正的永久免费，无隐藏费用\r\n- **9Router**：从不收取任何费用，永远不会\r\n\r\n---\r\n\r\n## 🎯 使用场景\r\n\r\n### 场景 1：\"我有 Claude Pro 订阅\"\r\n\r\n**问题：** 配额到期未用完，繁忙编码时遇到速率限制\r\n\r\n**解决方案：**\r\n```\r\n组合：\"maximize-claude\"\r\n  1. cc/claude-opus-4-7        （充分利用订阅）\r\n  2. glm/glm-5.1               （配额用完时的低价备份）\r\n  3. kr/claude-sonnet-4.5      （免费紧急备选）\r\n\r\n月成本：$20（订阅）+ ~$5（备份）= $25 总计\r\n对比：$20 + 遇到限制 = 沮丧\r\n```\r\n\r\n### 场景 2：\"我想零成本\"\r\n\r\n**问题：** 负担不起订阅，需要可靠的 AI 编码\r\n\r\n**解决方案：**\r\n```\r\n组合：\"free-forever\"\r\n  1. kr/claude-sonnet-4.5      （Claude 4.5 免费无限量）\r\n  2. kr/glm-5                  （通过 Kiro 免费使用 GLM-5）\r\n  3. oc/<auto>                 （OpenCode Free，无需认证）\r\n\r\n月成本：$0\r\n质量：生产级模型 + RTK 节省 20-40% tokens\r\n```\r\n\r\n### 场景 3：\"我需要 24/7 编码，不中断\"\r\n\r\n**问题：** 截止日期紧迫，不能承受停机\r\n\r\n**解决方案：**\r\n```\r\n组合：\"always-on\"\r\n  1. cc/claude-opus-4-7        （最佳质量）\r\n  2. cx/gpt-5.5                （第二个订阅）\r\n  3. glm/glm-5.1               （低价，每日重置）\r\n  4. minimax/MiniMax-M2.7      （最便宜，5小时重置）\r\n  5. kr/claude-sonnet-4.5      （免费无限量）\r\n\r\n结果：5 层切换 = 零停机时间\r\n月成本：$20-200（订阅）+ $10-20（备份）\r\n```\r\n\r\n### 场景 4：\"我想在 OpenClaw 中使用免费 AI\"\r\n\r\n**问题：** 需要在消息应用（WhatsApp、Telegram、Slack...）中使用 AI 助手，完全免费\r\n\r\n**解决方案：**\r\n```\r\n组合：\"openclaw-free\"\r\n  1. kr/claude-sonnet-4.5      （Claude 4.5 免费）\r\n  2. kr/glm-5                  （GLM-5 免费）\r\n  3. kr/MiniMax-M2.5           （MiniMax 免费）\r\n\r\n月成本：$0\r\n访问方式：WhatsApp、Telegram、Slack、Discord、iMessage、Signal...\r\n```\r\n\r\n---\r\n\r\n## ❓ 常见问题\r\n\r\n<details>\r\n<summary><b>📊 为什么我的控制面板显示高成本？</b></summary>\r\n\r\n控制面板追踪你的 token 使用情况，并显示**估算成本**，如同你直接使用付费 API。这**不是实际计费** — 它是一个参考，展示你通过使用免费模型或通过 9Router 路由现有订阅节省了多少钱。\r\n\r\n**示例：**\r\n- **控制面板显示：** \"$290 总成本\"\r\n- **实际情况：** 你在使用 iFlow（免费无限量）\r\n- **你的实际成本：** **$0.00**\r\n- **$290 的含义：** 你通过使用免费模型而不是付费 API **节省**的金额！\r\n\r\n成本显示是一个\"节省追踪器\"，帮助你了解使用模式和优化机会。\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>💳 9Router 会扣我的钱吗？</b></summary>\r\n\r\n**不会。** 9Router 是在你自己的电脑上运行的开源软件。它永远不会向你收取任何费用。\r\n\r\n**你只需支付：**\r\n- ✅ **订阅提供商**（Claude Code $20/月、Codex $20-200/月）→ 在他们的网站上直接付款\r\n- ✅ **低价提供商**（GLM、MiniMax）→ 直接付款，9Router 只是路由你的请求\r\n- ❌ **9Router 本身** → **永不收费，永远不会**\r\n\r\n9Router 是一个本地代理/路由器。它没有你的信用卡，不能发送发票，也没有计费系统。它是完全免费的软件。\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>🆓 免费提供商真的是无限量的吗？</b></summary>\r\n\r\n**是的！** 当前的免费提供商（Kiro、OpenCode Free、Vertex）是真正的免费，**无隐藏费用**。\r\n\r\n这些是各公司提供的免费服务：\r\n- **Kiro AI**：通过 AWS Builder ID / Google / GitHub OAuth 免费无限量使用 Claude 4.5 + GLM-5 + MiniMax\r\n- **OpenCode Free**：无认证直连代理，模型从 `opencode.ai/zen/v1/models` 自动获取\r\n- **Vertex AI**：新 Google Cloud 账户可获得 $300 免费额度（90 天）\r\n\r\n9Router 只是路由你的请求到它们 — 没有\"陷阱\"或未来的计费。它们是真正的免费服务，9Router 让它们易于使用并支持切换。\r\n\r\n**已停止的免费等级（不再推荐）：**\r\n- ❌ **iFlow**：曾是免费无限量，现在改为付费（2026）\r\n- ❌ **Qwen Code**：阿里巴巴于 2026-04-15 停止免费 OAuth 等级\r\n- ❌ **Gemini CLI**：仍可用，但与非 CLI 工具（Claude、Codex、Cursor...）一起使用可能会导致账户被封 — 仅在你坚持使用 Gemini CLI 本身时才使用\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>💰 如何最小化我的实际 AI 成本？</b></summary>\r\n\r\n**免费优先策略：**\r\n\r\n1. **从 100% 免费组合开始：**\r\n   ```\r\n   1. gc/gemini-3-flash (Google 每月 180K 免费)\r\n   2. if/kimi-k2-thinking (iFlow 无限量免费)\r\n   3. qw/qwen3-coder-plus (Qwen 无限量免费)\r\n   ```\r\n   **成本：$0/月**\r\n\r\n2. **仅在需要时添加低价备份：**\r\n   ```\r\n   4. glm/glm-4.7 ($0.6/1M tokens)\r\n   ```\r\n   **额外成本：只为实际使用的部分付费**\r\n\r\n3. **最后使用订阅提供商：**\r\n   - 仅当你已有订阅时\r\n   - 9Router 通过配额追踪帮助最大化其价值\r\n\r\n**结果：** 大多数用户可以仅使用免费等级以 $0/月运行！\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>📈 如果我的使用量突然激增怎么办？</b></summary>\r\n\r\n9Router 的智能切换可以防止意外费用：\r\n\r\n**场景：** 你正在进行编码冲刺，用尽了配额\r\n\r\n**没有 9Router：**\r\n- ❌ 达到速率限制 → 工作停止 → 沮丧\r\n- ❌ 或者：不慎累积大量 API 账单\r\n\r\n**有 9Router：**\r\n- ✅ 订阅达到限制 → 自动切换到低价等级\r\n- ✅ 低价等级变得昂贵 → 自动切换到免费等级\r\n- ✅ 编程永不停歇 → 可预测的成本\r\n\r\n**你掌控一切：** 在控制面板中设置每个提供商的支出限制，9Router 会遵守它们。\r\n\r\n</details>\r\n\r\n---\r\n\r\n## 📖 设置指南\r\n\r\n<details>\r\n<summary><b>🔐 订阅提供商（充分利用价值）</b></summary>\r\n\r\n### Claude Code (Pro/Max)\r\n\r\n```bash\r\n控制面板 → 提供商 → 连接 Claude Code\r\n→ OAuth 登录 → 自动 token 刷新\r\n→ 5小时 + 每周配额追踪\r\n\r\n模型：\r\n  cc/claude-opus-4-7\r\n  cc/claude-opus-4-6\r\n  cc/claude-sonnet-4-6\r\n  cc/claude-haiku-4-5-20251001\r\n```\r\n\r\n**专业提示：** 复杂任务使用 Opus，追求速度使用 Sonnet。9Router 按模型追踪配额！\r\n\r\n### OpenAI Codex (Plus/Pro)\r\n\r\n```bash\r\n控制面板 → 提供商 → 连接 Codex\r\n→ OAuth 登录（端口 1455）\r\n→ 5小时 + 每周重置\r\n\r\n模型：\r\n  cx/gpt-5.5\r\n  cx/gpt-5.4\r\n  cx/gpt-5.3-codex\r\n  cx/gpt-5.2-codex\r\n```\r\n\r\n### GitHub Copilot\r\n\r\n```bash\r\n控制面板 → 提供商 → 连接 GitHub\r\n→ 通过 GitHub 进行 OAuth\r\n→ 每月重置（每月 1 日）\r\n\r\n模型：\r\n  gh/gpt-5.4\r\n  gh/claude-opus-4.7\r\n  gh/claude-sonnet-4.6\r\n  gh/gemini-3.1-pro-preview\r\n  gh/grok-code-fast-1\r\n```\r\n\r\n### Cursor IDE\r\n\r\n```bash\r\n控制面板 → 提供商 → 连接 Cursor\r\n→ OAuth 登录\r\n→ 每月订阅\r\n\r\n模型：\r\n  cu/claude-4.6-opus-max\r\n  cu/claude-4.5-sonnet-thinking\r\n  cu/gpt-5.3-codex\r\n```\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>💰 低价提供商（备份）</b></summary>\r\n\r\n### GLM-5.1 / GLM-4.7（每日重置，$0.6/1M）\r\n\r\n1. 注册：[Zhipu AI](https://open.bigmodel.cn/)\r\n2. 从编程计划获取 API key\r\n3. 控制面板 → 添加 API Key：\r\n   - 提供商：`glm`\r\n   - API Key：`your-key`\r\n\r\n**使用：** `glm/glm-5.1`、`glm/glm-5`、`glm/glm-4.7`\r\n\r\n**专业提示：** 编程计划提供 3 倍配额，成本仅为 1/7！每日 10:00 AM 重置。\r\n\r\n### MiniMax M2.7（5小时重置，$0.20/1M）\r\n\r\n1. 注册：[MiniMax](https://www.minimax.io/)\r\n2. 获取 API key\r\n3. 控制面板 → 添加 API Key\r\n\r\n**使用：** `minimax/MiniMax-M2.7`、`minimax/MiniMax-M2.5`\r\n\r\n**专业提示：** 长上下文（1M tokens）的最便宜选项！\r\n\r\n### Kimi K2.5（$9/月固定）\r\n\r\n1. 订阅：[Moonshot AI](https://platform.moonshot.ai/)\r\n2. 获取 API key\r\n3. 控制面板 → 添加 API Key\r\n\r\n**使用：** `kimi/kimi-k2.5`、`kimi/kimi-k2.5-thinking`\r\n\r\n**专业提示：** 每月 $9 固定费用获得 10M tokens = 实际成本 $0.90/1M！\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>🆓 免费提供商（推荐）</b></summary>\r\n\r\n### Kiro AI（Claude 4.5 + GLM-5 + MiniMax 免费）\r\n\r\n```bash\r\n控制面板 → 连接 Kiro\r\n→ AWS Builder ID、AWS IAM Identity Center、Google 或 GitHub\r\n→ 无限量使用\r\n\r\n模型：\r\n  kr/claude-sonnet-4.5\r\n  kr/claude-haiku-4.5\r\n  kr/glm-5\r\n  kr/MiniMax-M2.5\r\n  kr/qwen3-coder-next\r\n  kr/deepseek-3.2\r\n```\r\n\r\n**专业提示：** Claude 最佳免费选项。无需 API key，无需付款，完全无限量。\r\n\r\n### OpenCode Free（无需认证，自动获取模型）\r\n\r\n```bash\r\n控制面板 → 连接 OpenCode Free\r\n→ 无需登录（直连代理）\r\n→ 模型从 opencode.ai/zen/v1/models 自动获取\r\n```\r\n\r\n**专业提示：** 最快的设置。连接后即可开始编码。\r\n\r\n### Vertex AI（新 GCP 账户 $300 免费额度）\r\n\r\n```bash\r\n控制面板 → 连接 Vertex AI\r\n→ 上传 Google Cloud 服务账户 JSON\r\n→ 在你的 GCP 项目中启用 Vertex AI API\r\n\r\n模型：\r\n  vertex/gemini-3.1-pro-preview\r\n  vertex/gemini-3-flash-preview\r\n  vertex/gemini-2.5-flash\r\n\r\nVertex 合作伙伴（通过 Vertex 提供 Anthropic / DeepSeek / GLM / Qwen）：\r\n  vertex-partner/glm-5-maas\r\n  vertex-partner/deepseek-v3.2-maas\r\n  vertex-partner/qwen3-next-80b-a3b-thinking-maas\r\n```\r\n\r\n**专业提示：** 新 Google Cloud 账户可获得 90 天内 $300 免费额度。足够日常编码使用。\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>🎨 创建组合</b></summary>\r\n\r\n### 示例 1：充分利用订阅 → 低价备份\r\n\r\n```\r\n控制面板 → 组合 → 创建新组合\r\n\r\n名称：premium-coding\r\n模型：\r\n  1. cc/claude-opus-4-7 (订阅主用)\r\n  2. glm/glm-5.1 (低价备份，$0.6/1M)\r\n  3. minimax/MiniMax-M2.7 (最便宜的备选，$0.20/1M)\r\n\r\n在 CLI 中使用：premium-coding\r\n\r\n月度成本示例（100M tokens）：\r\n  80M 通过 Claude（订阅）：$0 额外费用\r\n  15M 通过 GLM：$9\r\n  5M 通过 MiniMax：$1\r\n  总计：$10 + 你的订阅费用\r\n```\r\n\r\n### 示例 2：仅免费（零成本）\r\n\r\n```\r\n名称：free-combo\r\n模型：\r\n  1. kr/claude-sonnet-4.5 (Claude 4.5 免费无限量)\r\n  2. kr/glm-5 (通过 Kiro 免费使用 GLM-5)\r\n  3. vertex/gemini-3.1-pro-preview ($300 免费额度)\r\n\r\n成本：通过 RTK 永久 $0（+ 节省 20-40% tokens）！\r\n```\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>🔧 CLI 集成</b></summary>\r\n\r\n### Cursor IDE\r\n\r\n```\r\n设置 → 模型 → 高级：\r\n  OpenAI API Base URL：http://localhost:20128/v1\r\n  OpenAI API Key：[来自 9router 控制面板]\r\n  Model：cc/claude-opus-4-7\r\n```\r\n\r\n或使用组合：`premium-coding`\r\n\r\n### Claude Code\r\n\r\n编辑 `~/.claude/config.json`：\r\n\r\n```json\r\n{\r\n  \"anthropic_api_base\": \"http://localhost:20128/v1\",\r\n  \"anthropic_api_key\": \"your-9router-api-key\"\r\n}\r\n```\r\n\r\n### Codex CLI\r\n\r\n```bash\r\nexport OPENAI_BASE_URL=\"http://localhost:20128\"\r\nexport OPENAI_API_KEY=\"your-9router-api-key\"\r\n\r\ncodex \"your prompt\"\r\n```\r\n\r\n### OpenClaw\r\n\r\n**选项 1 — 控制面板（推荐）：**\r\n\r\n```\r\n控制面板 → CLI 工具 → OpenClaw → 选择模型 → 应用\r\n```\r\n\r\n**选项 2 — 手动：** 编辑 `~/.openclaw/openclaw.json`：\r\n\r\n```json\r\n{\r\n  \"agents\": {\r\n    \"defaults\": {\r\n      \"model\": {\r\n        \"primary\": \"9router/kr/claude-sonnet-4.5\"\r\n      }\r\n    }\r\n  },\r\n  \"models\": {\r\n    \"providers\": {\r\n      \"9router\": {\r\n        \"baseUrl\": \"http://127.0.0.1:20128/v1\",\r\n        \"apiKey\": \"sk_9router\",\r\n        \"api\": \"openai-completions\",\r\n        \"models\": [\r\n          {\r\n            \"id\": \"kr/claude-sonnet-4.5\",\r\n            \"name\": \"Claude Sonnet 4.5 (Kiro Free)\"\r\n          }\r\n        ]\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n> **注意：** OpenClaw 仅适用于本地 9Router。使用 `127.0.0.1` 而不是 `localhost` 以避免 IPv6 解析问题。\r\n\r\n### Cline / Continue / RooCode\r\n\r\n```\r\nProvider：OpenAI 兼容\r\nBase URL：http://localhost:20128/v1\r\nAPI Key：[来自控制面板]\r\nModel：cc/claude-opus-4-7\r\n```\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>🚀 部署</b></summary>\r\n\r\n### VPS 部署\r\n\r\n```bash\r\n# 克隆并安装\r\ngit clone https://github.com/decolua/9router.git\r\ncd 9router\r\nnpm install\r\nnpm run build\r\n\r\n# 配置\r\nexport JWT_SECRET=\"your-secure-secret-change-this\"\r\nexport INITIAL_PASSWORD=\"your-password\"\r\nexport DATA_DIR=\"/var/lib/9router\"\r\nexport PORT=\"20128\"\r\nexport HOSTNAME=\"0.0.0.0\"\r\nexport NODE_ENV=\"production\"\r\nexport NEXT_PUBLIC_BASE_URL=\"http://localhost:20128\"\r\nexport NEXT_PUBLIC_CLOUD_URL=\"https://9router.com\"\r\nexport API_KEY_SECRET=\"endpoint-proxy-api-key-secret\"\r\nexport MACHINE_ID_SALT=\"endpoint-proxy-salt\"\r\n\r\n# 启动\r\nnpm run start\r\n\r\n# 或使用 PM2\r\nnpm install -g pm2\r\npm2 start npm --name 9router -- start\r\npm2 save\r\npm2 startup\r\n```\r\n\r\n### Docker\r\n\r\n```bash\r\n# 构建镜像（从仓库根目录）\r\ndocker build -t 9router .\r\n\r\n# 运行容器（当前设置使用的命令）\r\ndocker run -d \\\r\n  --name 9router \\\r\n  -p 20128:20128 \\\r\n  --env-file /root/dev/9router/.env \\\r\n  -v 9router-data:/app/data \\\r\n  -v 9router-usage:/root/.9router \\\r\n  9router\r\n```\r\n\r\n便携命令（如果你已经在仓库根目录）：\r\n\r\n```bash\r\ndocker run -d \\\r\n  --name 9router \\\r\n  -p 20128:20128 \\\r\n  --env-file ./.env \\\r\n  -v 9router-data:/app/data \\\r\n  -v 9router-usage:/root/.9router \\\r\n  9router\r\n```\r\n\r\n容器默认值：\r\n- `PORT=20128`\r\n- `HOSTNAME=0.0.0.0`\r\n\r\n常用命令：\r\n\r\n```bash\r\ndocker logs -f 9router\r\ndocker restart 9router\r\ndocker stop 9router && docker rm 9router\r\n```\r\n\r\n### 环境变量\r\n\r\n| 变量 | 默认值 | 描述 |\r\n|----------|---------|-------------|\r\n| `JWT_SECRET` | 自动生成（`~/.9router/jwt-secret`） | 用于控制面板 auth cookie 的 JWT 签名密钥（设置可在多实例间共享） |\r\n| `INITIAL_PASSWORD` | `123456` | 当没有保存的哈希时首次登录的密码 |\r\n| `DATA_DIR` | `~/.9router` | 主应用数据库位置（`db.json`） |\r\n| `PORT` | 框架默认值 | 服务端口（示例中为 `20128`） |\r\n| `HOSTNAME` | 框架默认值 | 绑定主机（Docker 默认为 `0.0.0.0`） |\r\n| `NODE_ENV` | 运行时默认值 | 设置 `production` 用于部署 |\r\n| `BASE_URL` | `http://localhost:20128` | 云同步任务使用的服务端内部基础 URL |\r\n| `CLOUD_URL` | `https://9router.com` | 服务端云同步端点基础 URL |\r\n| `NEXT_PUBLIC_BASE_URL` | `http://localhost:3000` | 向后兼容/公开基础 URL（服务端运行时优先使用 `BASE_URL`） |\r\n| `NEXT_PUBLIC_CLOUD_URL` | `https://9router.com` | 向后兼容/公开云 URL（服务端运行时优先使用 `CLOUD_URL`） |\r\n| `API_KEY_SECRET` | `endpoint-proxy-api-key-secret` | 生成 API key 的 HMAC 密钥 |\r\n| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | 稳定机器 ID 哈希的盐值 |\r\n| `ENABLE_REQUEST_LOGS` | `false` | 在 `logs/` 下启用请求/响应日志 |\r\n| `AUTH_COOKIE_SECURE` | `false` | 强制 `Secure` auth cookie（在 HTTPS 反向代理后面设置为 `true`） |\r\n| `REQUIRE_API_KEY` | `false` | 在 `/v1/*` 路由上强制使用 Bearer API key（面向互联网部署时推荐） |\r\n| `HTTP_PROXY`、`HTTPS_PROXY`、`ALL_PROXY`、`NO_PROXY` | 空 | 用于上游提供商调用的可选出站代理 |\r\n\r\n注意：\r\n- 也支持小写代理变量：`http_proxy`、`https_proxy`、`all_proxy`、`no_proxy`。\r\n- `.env` 不会打包到 Docker 镜像中（`.dockerignore`）；使用 `--env-file` 或 `-e` 注入运行时配置。\r\n- 在 Windows 上，`APPDATA` 可用于本地存储路径解析。\r\n- `INSTANCE_NAME` 出现在较旧的文档/环境变量模板中，但当前运行时未使用。\r\n\r\n### 运行时文件和存储\r\n\r\n- 主应用状态：`${DATA_DIR}/db.json`（提供商、组合、别名、密钥、设置），由 `src/lib/localDb.js` 管理。\r\n- 使用历史和日志：`${DATA_DIR}/usage.json` 和 `${DATA_DIR}/log.txt`，由 `src/lib/usageDb.js` 管理。\r\n- 可选的请求/翻译器日志：`ENABLE_REQUEST_LOGS=true` 时位于 `<repo>/logs/...`。\r\n- `${DATA_DIR}` 和 `~/.9router` 在 Docker 容器中解析到同一位置 — 符号链接 `/root/.9router -> /app/data` 在构建时创建。\r\n\r\n</details>\r\n\r\n---\r\n\r\n## 📊 可用模型\r\n\r\n<details>\r\n<summary><b>查看所有可用模型</b></summary>\r\n\r\n**Claude Code（`cc/`）** - Pro/Max：\r\n- `cc/claude-opus-4-7`\r\n- `cc/claude-opus-4-6`\r\n- `cc/claude-sonnet-4-6`\r\n- `cc/claude-sonnet-4-5-20250929`\r\n- `cc/claude-haiku-4-5-20251001`\r\n\r\n**Codex（`cx/`）** - Plus/Pro：\r\n- `cx/gpt-5.5`\r\n- `cx/gpt-5.4`\r\n- `cx/gpt-5.3-codex`\r\n- `cx/gpt-5.2-codex`\r\n- `cx/gpt-5.1-codex-max`\r\n\r\n**GitHub Copilot（`gh/`）**：\r\n- `gh/gpt-5.4`\r\n- `gh/claude-opus-4.7`\r\n- `gh/claude-sonnet-4.6`\r\n- `gh/gemini-3.1-pro-preview`\r\n- `gh/grok-code-fast-1`\r\n\r\n**Cursor（`cu/`）** - 订阅：\r\n- `cu/claude-4.6-opus-max`\r\n- `cu/claude-4.5-sonnet-thinking`\r\n- `cu/gpt-5.3-codex`\r\n- `cu/kimi-k2.5`\r\n\r\n**GLM（`glm/`）** - $0.6/1M：\r\n- `glm/glm-5.1`\r\n- `glm/glm-5`\r\n- `glm/glm-4.7`\r\n\r\n**MiniMax（`minimax/`）** - $0.2/1M：\r\n- `minimax/MiniMax-M2.7`\r\n- `minimax/MiniMax-M2.5`\r\n\r\n**Kimi（`kimi/`）** - $9/月固定：\r\n- `kimi/kimi-k2.5`\r\n- `kimi/kimi-k2.5-thinking`\r\n\r\n**Kiro（`kr/`）** - 免费无限量：\r\n- `kr/claude-sonnet-4.5`\r\n- `kr/claude-haiku-4.5`\r\n- `kr/glm-5`\r\n- `kr/MiniMax-M2.5`\r\n- `kr/qwen3-coder-next`\r\n- `kr/deepseek-3.2`\r\n\r\n**OpenCode Free（`oc/`）** - 免费无需认证：\r\n- 从 `opencode.ai/zen/v1/models` 自动获取\r\n\r\n**Vertex AI（`vertex/`）** - $300 免费额度：\r\n- `vertex/gemini-3.1-pro-preview`\r\n- `vertex/gemini-3-flash-preview`\r\n- `vertex/gemini-2.5-flash`\r\n- `vertex-partner/glm-5-maas`\r\n- `vertex-partner/deepseek-v3.2-maas`\r\n\r\n</details>\r\n\r\n---\r\n\r\n## 🐛 故障排除\r\n\r\n**\"语言模型未提供消息\"**\r\n- 提供商配额耗尽 → 检查控制面板配额追踪器\r\n- 解决方案：使用组合切换或切换到更便宜的等级\r\n\r\n**速率限制**\r\n- 订阅配额用完 → 切换到 GLM/MiniMax\r\n- 添加组合：`cc/claude-opus-4-7 → glm/glm-5.1 → kr/claude-sonnet-4.5`\r\n\r\n**OAuth token 已过期**\r\n- 9Router 自动刷新\r\n- 如果问题持续：控制面板 → 提供商 → 重新连接\r\n\r\n**高成本**\r\n- 在控制面板 → 端点设置中启用 RTK（默认开启，节省 20-40% tokens）\r\n- 在控制面板中检查使用统计\r\n- 将主模型切换到 GLM/MiniMax\r\n- 对于非关键任务使用免费等级（Kiro、OpenCode Free、Vertex）\r\n\r\n**控制面板在错误端口打开**\r\n- 设置 `PORT=20128` 和 `NEXT_PUBLIC_BASE_URL=http://localhost:20128`\r\n\r\n**首次登录不工作**\r\n- 检查 `.env` 中的 `INITIAL_PASSWORD`\r\n- 如果未设置，回退密码是 `123456`\r\n\r\n**`logs/` 下没有请求日志**\r\n- 设置 `ENABLE_REQUEST_LOGS=true`\r\n\r\n---\r\n\r\n## 🛠️ 技术栈\r\n\r\n- **运行时**：Node.js 20+\r\n- **框架**：Next.js 16\r\n- **UI**：React 19 + Tailwind CSS 4\r\n- **数据库**：LowDB（基于 JSON 文件）\r\n- **流式传输**：Server-Sent Events (SSE)\r\n- **认证**：OAuth 2.0 (PKCE) + JWT + API Keys\r\n\r\n---\r\n\r\n## 📝 API 参考\r\n\r\n### 聊天补全\r\n\r\n```bash\r\nPOST http://localhost:20128/v1/chat/completions\r\nAuthorization: Bearer your-api-key\r\nContent-Type: application/json\r\n\r\n{\r\n  \"model\": \"cc/claude-opus-4-6\",\r\n  \"messages\": [\r\n    {\"role\": \"user\", \"content\": \"Write a function to...\"}\r\n  ],\r\n  \"stream\": true\r\n}\r\n```\r\n\r\n### 列出模型\r\n\r\n```bash\r\nGET http://localhost:20128/v1/models\r\nAuthorization: Bearer your-api-key\r\n\r\n→ 以 OpenAI 格式返回所有模型和组合\r\n```\r\n\r\n## 📧 支持\r\n\r\n- **网站**：[9router.com](https://9router.com)\r\n- **GitHub**：[github.com/decolua/9router](https://github.com/decolua/9router)\r\n- **问题**：[github.com/decolua/9router/issues](https://github.com/decolua/9router/issues)\r\n\r\n---\r\n\r\n## 👥 贡献者\r\n\r\n感谢所有帮助改进 9Router 的贡献者！\r\n\r\n[![Contributors](https://contrib.rocks/image?repo=decolua/9router&max=150&columns=15&anon=1&v=20260309)](https://github.com/decolua/9router/graphs/contributors)\r\n\r\n---\r\n\r\n## 📊 Star 图表\r\n\r\n[![Star Chart](https://starchart.cc/decolua/9router.svg?variant=adaptive)](https://starchart.cc/decolua/9router)\r\n\r\n\r\n\r\n## 🔀 分支\r\n\r\n**[OmniRoute](https://github.com/diegosouzapw/OmniRoute)** — 9Router 的全功能 TypeScript 分支。增加了 36+ 提供商、4 层自动切换、多模态 API（图像、嵌入、音频、TTS）、断路器、语义缓存、LLM 评估和精美的控制面板。368+ 单元测试。可通过 npm 和 Docker 使用。\r\n\r\n---\r\n\r\n## 🙏 致谢\r\n\r\n站在巨人的肩膀上构建：\r\n\r\n- **CLIProxyAPI** — 启发了这个 JavaScript 移植的原始 Go 实现。\r\n- **[RTK](https://github.com/rtk-ai/rtk)** ![Stars](https://img.shields.io/github/stars/rtk-ai/rtk?style=flat&color=yellow) — Rust token 节省器。9Router 将其压缩管道移植到 JS → 每次请求 **减少 20-40% 输入 tokens**。\r\n- **[Caveman](https://github.com/JuliusBrussee/caveman)** ![Stars](https://img.shields.io/github/stars/JuliusBrussee/caveman?style=flat&color=yellow) by **[@JuliusBrussee](https://github.com/JuliusBrussee)** — 病毒式传播的 *\"为什么用很多 token 当少的 token 就能搞定\"*。9Router 适配其提示词 → **减少 65% 输出 tokens**。\r\n\r\n非常感谢这些作者 — 没有他们的工作，9Router 的 token 节省功能就不会存在。在 GitHub 上给他们加星！\r\n\r\n---\r\n\r\n## 📄 许可证\r\n\r\nMIT 许可证 — 详见 [LICENSE](LICENSE)。\r\n\r\n---\r\n\r\n<div align=\"center\">\r\n  <sub>用 ❤️ 为 24/7 编程的开发者构建</sub>\r\n</div>","readmeFilename":"README.zh-CN.md"}