diff --git a/README.md b/README.md index cb7a48e7..553aa3cb 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,159 @@ 9Router is a local AI routing gateway with provider fallback and token-saving features. -## Quick Start +![9Router](images/9router.png) -### Install +## New Features -#### Docker +### Proxy Fitness + +Monitor proxy health and egress location to keep routed requests reliable. + +![Proxy Fitness](images/proxy-fitnes.png) + +### Smart Rotation + +Automatically rotate proxy pools and provider connections for better availability. + +![Smart Rotation](images/smart-rotation.png) + +## Installation for Beginners + +The easiest installation method is Docker. Docker runs 9Router in a container, so you do not need to install Node.js, npm, or the application dependencies manually. + +### 1. Install Docker + +Install Docker Desktop on Windows or macOS, or install Docker Engine and Docker Compose on Linux: + +- [Docker Desktop](https://www.docker.com/products/docker-desktop/) +- [Docker Engine for Linux](https://docs.docker.com/engine/install/) + +After installation, open a terminal and check that Docker is available: + +```bash +docker --version +docker compose version +``` + +Both commands should print a version number. + +### 2. Download the project + +Clone this repository, then enter its folder: + +```bash +git clone https://github.com/mhiqrambg/9router-mibp-version.git +cd 9router-mibp-version +``` + +If Git is not installed, download the repository as a ZIP file from GitHub and open the extracted folder in a terminal. + +### 3. Create the environment file + +Create `.env` from the example file: ```bash cp .env.example .env +``` + +Open `.env` in a text editor and change at least these values: + +```env +JWT_SECRET=replace-with-a-long-random-secret +INITIAL_PASSWORD=replace-with-your-dashboard-password +API_KEY_SECRET=replace-with-another-long-random-secret +MACHINE_ID_SALT=replace-with-another-random-secret +REQUIRE_API_KEY=true +``` + +Do not share `.env` or commit it to Git. It contains the dashboard password and security secrets. On Linux or macOS, you can generate random values with: + +```bash +openssl rand -hex 32 +``` + +Use a different generated value for each secret. + +### 4. Start 9Router + +Run this command in the project folder: + +```bash docker compose up -d ``` -Dashboard: `http://localhost:20128/dashboard` +The first run downloads the 9Router and Headroom images. The `-d` option keeps them running in the background. -API endpoint: `http://localhost:20128/v1` +Check the containers: -#### From Source +```bash +docker compose ps +``` + +Both `9router` and `headroom` should have a running status. + +### 5. Open the dashboard + +Open this address in your browser: + +```text +http://localhost:20128/dashboard +``` + +Log in with the `INITIAL_PASSWORD` value from `.env`. + +### 6. Create an API key + +In the dashboard, open **Endpoint & Key** and create a key. Keep the complete key that starts with `sk-`. + +Use it when calling the API: + +```bash +curl http://localhost:20128/v1/models \ + -H "Authorization: Bearer YOUR_API_KEY" +``` + +For a server exposed through a domain, replace the URL with your domain: + +```bash +curl https://your-domain.example/v1/models \ + -H "Authorization: Bearer YOUR_API_KEY" +``` + +Remote requests without a valid API key are rejected. The API key is stored in the application database, not in `.env`. + +### Useful Docker commands + +View live logs: + +```bash +docker compose logs -f 9router +``` + +Restart the application: + +```bash +docker compose restart 9router +``` + +Stop the services without deleting data: + +```bash +docker compose down +``` + +Update to the latest image: + +```bash +docker compose pull +docker compose up -d +``` + +The Docker volume named `9router-data` keeps your settings, providers, and API keys when the container is recreated. + +### Install from source + +This option is intended for development. Install Node.js 22 or newer, then run: ```bash cp .env.example .env @@ -25,7 +162,7 @@ npm install PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev ``` -Before starting, set at least `JWT_SECRET` and `INITIAL_PASSWORD` in `.env`. +Open `http://localhost:20128/dashboard` after the development server starts. ### Update diff --git a/README.zh-CN.md b/README.zh-CN.md deleted file mode 100644 index 1b2bedd2..00000000 --- a/README.zh-CN.md +++ /dev/null @@ -1,1315 +0,0 @@ - -
- 9Router Dashboard - - # 9Router - 免费 AI 路由器与 Token 节省器 - - **编程永不停歇。使用 RTK + 自动切换到免费/低价 AI 模型,节省 20-40% 的 tokens。** - - **将所有 AI 编程工具(Claude Code、Cursor、Antigravity、Copilot、Codex、Gemini、OpenCode、Cline、OpenClaw...)连接到 40+ AI 提供商和 100+ 模型。** - - [![npm](https://img.shields.io/npm/v/9router.svg)](https://www.npmjs.com/package/9router) - [![Downloads](https://img.shields.io/npm/dm/9router.svg)](https://www.npmjs.com/package/9router) - [![License](https://img.shields.io/npm/l/9router.svg)](https://github.com/decolua/9router/blob/main/LICENSE) - - decolua%2F9router | Trendshift - - [🚀 快速开始](#-快速开始) • [💡 功能特点](#-主要功能) • [📖 设置指南](#-设置指南) • [🌐 网站](https://9router.com) - - [🇻🇳 Tiếng Việt](./i18n/README.vi.md) • [🇨🇳 中文](./i18n/README.zh-CN.md) • [🇯🇵 日本語](./i18n/README.ja-JP.md) -
- ---- - -## 🤔 为什么选择 9Router? - -**告别浪费金钱、tokens 和触碰限制的困扰:** - -- ❌ 订阅配额每月到期却未使用 -- ❌ 速率限制在编程中途打断你 -- ❌ 工具输出(git diff、grep、ls...)快速消耗 tokens -- ❌ 昂贵的 API(每个提供商 $20-50/月) -- ❌ 需要手动在提供商之间切换 - -**9Router 解决这一切:** - -- ✅ **RTK Token 节省器** - 自动压缩 tool_result 内容,每次请求节省 20-40% tokens -- ✅ **充分利用订阅** - 追踪配额,在重置前用尽每一分额度 -- ✅ **自动切换** - 订阅 → 低价 → 免费,零停机时间 -- ✅ **多账户支持** - 按提供商在账户之间轮询 -- ✅ **通用兼容** - 支持 Claude Code、Codex、Cursor、Cline 以及任何 CLI 工具 - ---- - -## 🔄 工作原理 - -``` -┌─────────────┐ -│ 你的 CLI │ (Claude Code、Codex、OpenClaw、Cursor、Cline...) -│ 工具 │ -└──────┬──────┘ - │ http://localhost:20128/v1 - ↓ -┌─────────────────────────────────────────────┐ -│ 9Router(智能路由器) │ -│ • RTK Token 节省器(减少 tool_result tokens)│ -│ • 格式转换(OpenAI ↔ Claude) │ -│ • 配额追踪 │ -│ • 自动刷新 token │ -└──────┬──────────────────────────────────────┘ - │ - ├─→ [第一层:订阅] Claude Code、Codex、GitHub Copilot - │ ↓ 配额耗尽 - ├─→ [第二层:低价] GLM ($0.6/1M)、MiniMax ($0.2/1M) - │ ↓ 预算超限 - └─→ [第三层:免费] Kiro、OpenCode Free、Vertex ($300 额度) - -结果:编程永不停歇,最小成本 + 通过 RTK 节省 20-40% tokens -``` - ---- - -## ⚡ 快速开始 - -**1. 全局安装:** - -```bash -npm install -g 9router -9router -``` - -🎉 控制面板在 `http://localhost:20128` 打开 - -**2. 连接免费提供商(无需注册):** - -控制面板 → 提供商 → 连接 **Kiro AI**(约 50 积分/月免费:Claude 4.5 + GLM-5 + MiniMax)或 **OpenCode Free**(无需认证)→ 完成! - -**3. 在 CLI 工具中使用:** - -``` -Claude Code/Codex/OpenClaw/Cursor/Cline 设置: - Endpoint: http://localhost:20128/v1 - API Key: [从控制面板复制] - Model: kr/claude-sonnet-4.5 -``` - -**就这么简单!** 开始使用免费 AI 模型编程。 - -**替代方案:从源码运行(本仓库):** - -本仓库的包是私有的(`9router-app`),所以源码/Docker 执行是预期的本地开发方式。 - -```bash -cp .env.example .env -npm install -PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev -``` - -生产模式: - -```bash -npm run build -PORT=20128 HOSTNAME=0.0.0.0 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run start -``` - -默认 URL: -- 控制面板:`http://localhost:20128/dashboard` -- OpenAI 兼容 API:`http://localhost:20128/v1` - ---- - -## 视频教程 - -
- - - - - - - - - - - - -
- - 9Router Setup Tutorial -
- 🇺🇸 English
- 9Router + Claude Code 免费设置
by Build AI With Hamid
-
- - Tiết kiệm chi phí LLM với 9Router -
- 🇻🇳 Tiếng Việt
- 使用 9Router 节省 OpenClaw 的 LLM 成本
by Mì AI
-
- - Claude Code FREE Forever -
- 🇺🇸 English
- Claude Code 免费永久使用 — 无限模型
by Build AI With Hamid
-
- - Claude CLI Free Setup -
- 🇺🇸 English
- 使用 9Router 免费设置 Claude CLI 🚀
by CodeVerse Soban
-
- - Cài đặt OpenClaw Free A-Z -
- 🇻🇳 Tiếng Việt
- 从零开始安装 OpenClaw 免费版 + 9Router
by Mai Gia
-
- - FREE OpenClaw with Claude Opus -
- 🇺🇸 English
- 免费 OpenClaw + Claude Opus 4.6
by Build AI With Hamid
-
- -
- -> 🎬 **制作了关于 9Router 的视频?** 提交 [Pull Request](https://github.com/decolua/9router/pulls),将你的视频添加到此部分 — 我们会合并它! - ---- - -## 🛠️ 支持的 CLI 工具 - -9Router 与所有主流 AI 编程工具无缝协作: - -
- - - - - - - - - - - - - - - - - -
- Claude Code
- Claude-Code -
- OpenClaw
- OpenClaw -
- Codex
- Codex -
- OpenCode
- OpenCode -
- Cursor
- Cursor -
- Antigravity
- Antigravity -
- Cline
- Cline -
- Continue
- Continue -
- Droid
- Droid -
- Roo
- Roo -
- Copilot
- Copilot -
- Kilo Code
- Kilo Code -
-
- ---- - -## 🌐 支持的提供商 - -### 🔐 OAuth 提供商 - -
- - - - - - - - -
- Claude Code
- Claude-Code -
- Antigravity
- Antigravity -
- Codex
- Codex -
- GitHub
- GitHub -
- Cursor
- Cursor -
-
- -### 🆓 免费提供商 - -
- - - - - - -
- Kiro
- Kiro AI
- Claude 4.5 + GLM-5 + MiniMax
每月 50 积分免费
-
- OpenCode Free
- OpenCode Free
- 无需认证 • 自动获取模型
免费(模型列表会变)
-
- Vertex AI
- Vertex AI
- Gemini 3 Pro + GLM-5 + DeepSeek
$300 免费额度
-
-
- -> **注意:** iFlow、Qwen Code 和 Gemini CLI 的免费等级已于 2026 年停止。请改用 Kiro / OpenCode Free / Vertex。 -> -> **Kiro AI** 于 2025 年 9 月转为付费模式 — 免费等级现在上限为**每月 50 积分**(新账户前 30 天另加 500 试用积分)。付费档位:Pro $20/月(1,000 积分)、Pro+ $40/月(2,000)、Pro Max $100/月(5,000)、Power $200/月(10,000)。 -> **OpenCode Free** 的模型列表会随时间变化(部分模型仅限时免费)— 可能随时变更,恕不另行通知。 -> **Vertex AI**:新 GCP 账户的 $300 免费额度仍然有效,但自 2026 年 3 月起 **Gemini API 端点不再消耗这些额度** — 请改用 **Vertex AI Studio** 端点。 - -### 🔑 API Key 提供商(40+) - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
- OpenRouter
- OpenRouter -
- GLM
- GLM -
- Kimi
- Kimi -
- MiniMax
- MiniMax -
- OpenAI
- OpenAI -
- Anthropic
- Anthropic -
- Gemini
- Gemini -
- DeepSeek
- DeepSeek -
- Groq
- Groq -
- xAI
- xAI -
- Mistral
- Mistral -
- Perplexity
- Perplexity -
- Together
- Together AI -
- Fireworks
- Fireworks -
- Cerebras
- Cerebras -
- Cohere
- Cohere -
- NVIDIA
- NVIDIA -
- SiliconFlow
- SiliconFlow -
-

...以及 20+ 更多提供商,包括 Nebius、Chutes、Hyperbolic 和自定义 OpenAI/Anthropic 兼容端点

-
- ---- - -## 💡 主要功能 - -| 功能 | 作用 | 为什么重要 | -|---------|--------------|----------------| -| 🚀 **RTK Token 节省器**([RTK](https://github.com/rtk-ai/rtk) ⭐40K) | 压缩工具输出(`git diff`、`grep`、`ls`、`tree`...)后再发送给 LLM | 每次请求节省 **20-40% 输入 tokens** | -| 🪨 **Caveman 模式**([Caveman](https://github.com/JuliusBrussee/caveman) ⭐52K) | 注入 caveman 风格提示词 → LLM 回复简洁,保留技术实质 | 节省 **高达 65% 输出 tokens** | -| 🎯 **智能三层切换** | 自动路由:订阅 → 低价 → 免费 | 编程永不停歇,零停机时间 | -| 📊 **实时配额追踪** | 实时 token 计数 + 重置倒计时 | 充分利用订阅价值 | -| 🔄 **格式转换** | OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro ↔ Vertex | 兼容任何 CLI 工具 | -| 👥 **多账户支持** | 每个提供商支持多个账户 | 负载均衡 + 冗余备份 | -| 🔄 **自动 Token 刷新** | OAuth token 自动刷新 | 无需手动重新登录 | -| 🎨 **自定义组合** | 创建无限模型组合 | 自定义适合你的切换策略 | -| 📝 **请求日志** | 调试模式下的完整请求/响应日志 | 轻松排查问题 | -| 💾 **云同步** | 跨设备同步配置 | 处处相同设置 | -| 📊 **使用分析** | 追踪 tokens、成本、趋势 | 优化开支 | -| 🌐 **任意部署** | 本地、VPS、Docker、Cloudflare Workers | 灵活部署选项 | - -
-📖 功能详情 - -### 🚀 RTK Token 节省器 - -工具输出(`git diff`、`grep`、`find`、`ls`、`tree`、日志转储...)通常占用 30-50% 的提示词预算。RTK 在请求到达 LLM 之前检测并应用智能、无损压缩: - -- **过滤器:** `git-diff`、`git-status`、`grep`、`find`、`ls`、`tree`、`dedup-log`、`smart-truncate`、`read-numbered`、`search-list` -- **自动检测:** 无需配置 — RTK 检查每个 `tool_result` 的前 1KB,选择合适的过滤器。 -- **安全设计:** 如果过滤器失败、抛出异常或使输出变大,RTK 会静默保留原始文本。错误永远不会中断你的请求。 -- **通用兼容:** 适用于所有格式(OpenAI、Claude、Gemini、Cursor、Kiro、OpenAI Responses),因为它在任何格式转换**之前**运行。 -- **默认开启:** 可随时在控制面板 → 端点设置中切换。 - -``` -不使用 RTK:47K tokens 发送给 LLM -使用 RTK: 28K tokens 发送给 LLM (节省 40% · 相同上下文 · 相同答案) -``` - -### 🎯 智能三层切换 - -创建具有自动切换功能的组合: - -``` -组合:"my-coding-stack" - 1. cc/claude-opus-4-6 (你的订阅) - 2. glm/glm-4.7 (低价备份,$0.6/1M) - 3. if/kimi-k2-thinking (免费备选) - -→ 配额用完或出错时自动切换 -``` - -### 📊 实时配额追踪 - -- 每个提供商的 token 消耗 -- 重置倒计时(5小时、每日、每周) -- 付费等级的成本估算 -- 月度支出报告 - -### 🔄 格式转换 - -格式间无缝转换: -- **OpenAI** ↔ **Claude** ↔ **Gemini** ↔ **Cursor** ↔ **Kiro** ↔ **Vertex** ↔ **Antigravity** ↔ **Ollama** ↔ **OpenAI Responses** -- 你的 CLI 工具发送 OpenAI 格式 → 9Router 转换 → 提供商接收原生格式 -- 适用于任何支持自定义 OpenAI 端点的工具 - -### 👥 多账户支持 - -- 每个提供商添加多个账户 -- 自动轮询或基于优先级的路由 -- 当一个账户达到配额时切换到下一个 - -### 🔄 自动 Token 刷新 - -- OAuth token 在过期前自动刷新 -- 无需手动重新认证 -- 所有提供商的无缝体验 - -### 🎨 自定义组合 - -- 创建无限模型组合 -- 混合订阅、低价和免费等级 -- 为组合命名以便访问 -- 使用云同步跨设备共享组合 - -### 📝 请求日志 - -- 启用调试模式获取完整请求/响应日志 -- 追踪 API 调用、请求头和载荷 -- 排查集成问题 -- 导出日志进行分析 - -### 💾 云同步 - -- 跨设备同步提供商、组合和设置 -- 自动后台同步 -- 安全加密存储 -- 从任何地方访问你的设置 - -#### 云运行时说明 - -- 生产环境中优先使用服务端云变量: - - `BASE_URL`(云同步调度程序使用的内部回调 URL) - - `CLOUD_URL`(云同步端点基础 URL) -- `NEXT_PUBLIC_BASE_URL` 和 `NEXT_PUBLIC_CLOUD_URL` 仍用于兼容性/UI,但服务端运行时现在优先使用 `BASE_URL`/`CLOUD_URL`。 -- 云同步请求现在使用超时 + 快速失败行为,以避免云 DNS/网络不可用时 UI 挂起。 - -### 📊 使用分析 - -- 追踪每个提供商和模型的 token 使用量 -- 成本估算和支出趋势 -- 月度报告和洞察 -- 优化你的 AI 支出 - -> **💡 重要 - 了解控制面板成本:** -> -> 使用分析中显示的"成本"**仅用于追踪和比较目的**。 -> 9Router 本身**永远不会向你收费**。你只直接向提供商付款(如果使用付费服务)。 -> -> **示例:** 如果你的控制面板显示使用 Kiro 免费模型时"总成本 $290",这代表你如果直接使用付费 API 需要支付的金额。你的实际成本 = **$0**(Kiro 免费等级:约 50 积分/月)。 -> -> 把它想象成一个"节省追踪器",展示你通过使用免费模型或通过 9Router 路由节省了多少钱! - -### 🌐 任意部署 - -- 💻 **本地** - 默认,离线可用 -- ☁️ **VPS/云** - 跨设备共享 -- 🐳 **Docker** - 一键部署 -- 🚀 **Cloudflare Workers** - 全球边缘网络 - -
- ---- - -## 💰 价格一览 - -| 等级 | 提供商 | 成本 | 配额重置 | 适用场景 | -|------|----------|------|-------------|----------| -| **🚀 TOKEN 节省器** | **RTK(内置)** | **免费** | 始终开启 | **每次请求节省 20-40% tokens** | -| **💳 订阅** | Claude Code (Pro/Max) | $20-200/月 | 5小时 + 每周 | 已有订阅的用户 | -| | Codex (Plus/Pro) | $20-200/月 | 5小时 + 每周 | OpenAI 用户 | -| | GitHub Copilot | $10-19/月 | 每月 | GitHub 用户 | -| | Cursor IDE | $20/月 | 每月 | Cursor 用户 | -| **💰 低价** | GLM-5.1 / GLM-4.7 | $0.6/1M | 每日 10AM | 预算备份 | -| | MiniMax M2.7 | $0.2/1M | 5小时滚动 | 最便宜选项 | -| | Kimi K2.5 | $9/月固定 | 10M tokens/月 | 可预测成本 | - | **🆓 免费** | Kiro AI | $0 | 50 积分/月 | Claude 4.5 + GLM-5 + MiniMax 免费(之上为付费档位) | - | | OpenCode Free | $0 | varies* | 无需认证,自动获取模型(列表会变化) | - | | Vertex AI | $300 额度 | 新 GCP 账户 | Gemini 3 Pro + DeepSeek + GLM-5(使用 Vertex AI Studio 端点消耗免费额度) | - -**💡 专业提示:** RTK + Kiro AI + OpenCode Free 组合 = **$0 成本 + 节省 20-40% tokens**! - ---- - -### 📊 理解 9Router 成本与计费 - -**9Router 计费真相:** - -✅ **9Router 软件 = 永久免费**(开源,绝不收费) -✅ **控制面板"成本" = 仅用于显示/追踪**(不是实际账单) -✅ **你直接向提供商付款**(订阅或 API 费用) -✅ **免费提供商保持免费**(Kiro 约 50 积分/月、OpenCode Free、Vertex $300 额度 = 在免费额度内 $0)— 注意 iFlow/Qwen/Gemini CLI 免费等级已于 2026 年停止 -❌ **9Router 永不发送发票** 或扣款 - -**成本显示如何工作:** - -控制面板显示**估算成本**,如同你直接使用付费 API。这**不是计费** — 它是一个比较工具,展示你的节省。 - -**示例场景:** -``` -控制面板显示: -• 总请求数:1,662 -• 总 Tokens:47M -• 显示成本:$290 - -实际检查: -• 提供商:Kiro(免费等级:约 50 积分/月) -• 实际支付:$0.00 -• $290 意味着什么:通过使用免费模型节省的金额! -``` - -**付款规则:** -- **订阅提供商**(Claude Code、Codex):通过他们的网站直接付款 -- **低价提供商**(GLM、MiniMax):直接付款,9Router 只做路由 -- **免费提供商**(Kiro、OpenCode Free、Vertex):真正的免费,在免费额度内无隐藏费用 -- **9Router**:从不收取任何费用,永远不会 - ---- - -## 🎯 使用场景 - -### 场景 1:"我有 Claude Pro 订阅" - -**问题:** 配额到期未用完,繁忙编码时遇到速率限制 - -**解决方案:** -``` -组合:"maximize-claude" - 1. cc/claude-opus-4-7 (充分利用订阅) - 2. glm/glm-5.1 (配额用完时的低价备份) - 3. kr/claude-sonnet-4.5 (免费紧急备选) - -月成本:$20(订阅)+ ~$5(备份)= $25 总计 -对比:$20 + 遇到限制 = 沮丧 -``` - -### 场景 2:"我想零成本" - -**问题:** 负担不起订阅,需要可靠的 AI 编码 - -**解决方案:** -``` -组合:"free-forever" - 1. kr/claude-sonnet-4.5 (通过 Kiro 免费使用 Claude 4.5,约 50 积分/月) - 2. kr/glm-5 (通过 Kiro 免费使用 GLM-5) - 3. oc/ (OpenCode Free,无需认证) - -月成本:$0 -质量:生产级模型 + RTK 节省 20-40% tokens -``` - -### 场景 3:"我需要 24/7 编码,不中断" - -**问题:** 截止日期紧迫,不能承受停机 - -**解决方案:** -``` -组合:"always-on" - 1. cc/claude-opus-4-7 (最佳质量) - 2. cx/gpt-5.5 (第二个订阅) - 3. glm/glm-5.1 (低价,每日重置) - 4. minimax/MiniMax-M2.7 (最便宜,5小时重置) - 5. kr/claude-sonnet-4.5 (通过 Kiro 免费使用,约 50 积分/月) - -结果:5 层切换 = 零停机时间 -月成本:$20-200(订阅)+ $10-20(备份) -``` - -### 场景 4:"我想在 OpenClaw 中使用免费 AI" - -**问题:** 需要在消息应用(WhatsApp、Telegram、Slack...)中使用 AI 助手,完全免费 - -**解决方案:** -``` -组合:"openclaw-free" - 1. kr/claude-sonnet-4.5 (Claude 4.5 免费) - 2. kr/glm-5 (GLM-5 免费) - 3. kr/MiniMax-M2.5 (MiniMax 免费) - -月成本:$0 -访问方式:WhatsApp、Telegram、Slack、Discord、iMessage、Signal... -``` - ---- - -## ❓ 常见问题 - -
-📊 为什么我的控制面板显示高成本? - -控制面板追踪你的 token 使用情况,并显示**估算成本**,如同你直接使用付费 API。这**不是实际计费** — 它是一个参考,展示你通过使用免费模型或通过 9Router 路由现有订阅节省了多少钱。 - -**示例:** -- **控制面板显示:** "$290 总成本" -- **实际情况:** 你在使用 Kiro 免费模型(约 50 积分/月) -- **你的实际成本:** **$0.00** -- **$290 的含义:** 你通过使用免费模型而不是付费 API **节省**的金额! - -成本显示是一个"节省追踪器",帮助你了解使用模式和优化机会。 - -
- -
-💳 9Router 会扣我的钱吗? - -**不会。** 9Router 是在你自己的电脑上运行的开源软件。它永远不会向你收取任何费用。 - -**你只需支付:** -- ✅ **订阅提供商**(Claude Code $20/月、Codex $20-200/月)→ 在他们的网站上直接付款 -- ✅ **低价提供商**(GLM、MiniMax)→ 直接付款,9Router 只是路由你的请求 -- ❌ **9Router 本身** → **永不收费,永远不会** - -9Router 是一个本地代理/路由器。它没有你的信用卡,不能发送发票,也没有计费系统。它是完全免费的软件。 - -
- -
-🆓 免费提供商真的是无限量的吗? - -**基本上是!** 当前的免费提供商(Kiro、OpenCode Free、Vertex)是真正的免费,但免费等级有上限: - -这些是各公司提供的免费服务: -- **Kiro AI**:通过 AWS Builder ID / Google / GitHub OAuth 使用,免费等级约**每月 50 积分**(新账户前 30 天另加 500 试用积分)。之上提供付费档位。 -- **OpenCode Free**:无认证直连代理,模型从 `opencode.ai/zen/v1/models` 自动获取。免费模型列表会随时间变化(部分模型仅限时免费)— 可能随时变更。 -- **Vertex AI**:新 Google Cloud 账户可获得 $300 免费额度(90 天)。自 2026 年 3 月起 Gemini API 端点不再消耗这些额度 — 请改用 **Vertex AI Studio** 端点。 - -9Router 只是路由你的请求到它们 — 没有"陷阱"或未来的计费。它们是真正的免费服务,9Router 让它们易于使用并支持切换。 - -**已停止的免费等级(不再推荐):** -- ❌ **iFlow**:曾是免费无限量,现在改为付费(2026) -- ❌ **Qwen Code**:阿里巴巴于 2026-04-15 完全停止免费 OAuth 等级 -- ❌ **Gemini CLI**:Google 已于 2026-06-18 完全停止服务(由闭源的 Antigravity CLI 取代)。已停止 — 请勿使用。 - -
- -
-💰 如何最小化我的实际 AI 成本? - -**免费优先策略:** - -1. **从 100% 免费组合开始:** - ``` - 1. kr/glm-5 (通过 Kiro 免费使用 GLM-5,约 50 积分/月) - 2. OpenCode Free 模型(无认证,自动获取) - 3. Vertex AI Gemini 3 Pro(使用 Vertex AI Studio 端点 + $300 额度) - ``` - **成本:$0/月**(在 Kiro 免费积分上限内;OpenCode/Vertex 受各自免费等级限制) - -2. **仅在需要时添加低价备份:** - ``` - 4. glm/glm-4.7 ($0.6/1M tokens) - ``` - **额外成本:只为实际使用的部分付费** - -3. **最后使用订阅提供商:** - - 仅当你已有订阅时 - - 9Router 通过配额追踪帮助最大化其价值 - -**结果:** 大多数用户可以仅使用免费等级以 $0/月运行! - -
- -
-📈 如果我的使用量突然激增怎么办? - -9Router 的智能切换可以防止意外费用: - -**场景:** 你正在进行编码冲刺,用尽了配额 - -**没有 9Router:** -- ❌ 达到速率限制 → 工作停止 → 沮丧 -- ❌ 或者:不慎累积大量 API 账单 - -**有 9Router:** -- ✅ 订阅达到限制 → 自动切换到低价等级 -- ✅ 低价等级变得昂贵 → 自动切换到免费等级 -- ✅ 编程永不停歇 → 可预测的成本 - -**你掌控一切:** 在控制面板中设置每个提供商的支出限制,9Router 会遵守它们。 - -
- ---- - -## 📖 设置指南 - -
-🔐 订阅提供商(充分利用价值) - -### Claude Code (Pro/Max) - -```bash -控制面板 → 提供商 → 连接 Claude Code -→ OAuth 登录 → 自动 token 刷新 -→ 5小时 + 每周配额追踪 - -模型: - cc/claude-opus-4-7 - cc/claude-opus-4-6 - cc/claude-sonnet-4-6 - cc/claude-haiku-4-5-20251001 -``` - -**专业提示:** 复杂任务使用 Opus,追求速度使用 Sonnet。9Router 按模型追踪配额! - -### OpenAI Codex (Plus/Pro) - -```bash -控制面板 → 提供商 → 连接 Codex -→ OAuth 登录(端口 1455) -→ 5小时 + 每周重置 - -模型: - cx/gpt-5.5 - cx/gpt-5.4 - cx/gpt-5.3-codex - cx/gpt-5.2-codex -``` - -### GitHub Copilot - -```bash -控制面板 → 提供商 → 连接 GitHub -→ 通过 GitHub 进行 OAuth -→ 每月重置(每月 1 日) - -模型: - gh/gpt-5.4 - gh/claude-opus-4.7 - gh/claude-sonnet-4.6 - gh/gemini-3.1-pro-preview - gh/grok-code-fast-1 -``` - -### Cursor IDE - -```bash -控制面板 → 提供商 → 连接 Cursor -→ OAuth 登录 -→ 每月订阅 - -模型: - cu/claude-4.6-opus-max - cu/claude-4.5-sonnet-thinking - cu/gpt-5.3-codex -``` - -
- -
-💰 低价提供商(备份) - -### GLM-5.1 / GLM-4.7(每日重置,$0.6/1M) - -1. 注册:[Zhipu AI](https://open.bigmodel.cn/) -2. 从编程计划获取 API key -3. 控制面板 → 添加 API Key: - - 提供商:`glm` - - API Key:`your-key` - -**使用:** `glm/glm-5.1`、`glm/glm-5`、`glm/glm-4.7` - -**专业提示:** 编程计划提供 3 倍配额,成本仅为 1/7!每日 10:00 AM 重置。 - -### MiniMax M2.7(5小时重置,$0.20/1M) - -1. 注册:[MiniMax](https://www.minimax.io/) -2. 获取 API key -3. 控制面板 → 添加 API Key - -**使用:** `minimax/MiniMax-M2.7`、`minimax/MiniMax-M2.5` - -**专业提示:** 长上下文(1M tokens)的最便宜选项! - -### Kimi K2.5($9/月固定) - -1. 订阅:[Moonshot AI](https://platform.moonshot.ai/) -2. 获取 API key -3. 控制面板 → 添加 API Key - -**使用:** `kimi/kimi-k2.5`、`kimi/kimi-k2.5-thinking` - -**专业提示:** 每月 $9 固定费用获得 10M tokens = 实际成本 $0.90/1M! - -
- -
-🆓 免费提供商(推荐) - -### Kiro AI(Claude 4.5 + GLM-5 + MiniMax 免费) - -```bash -控制面板 → 连接 Kiro -→ AWS Builder ID、AWS IAM Identity Center、Google 或 GitHub -→ 无限量使用 - -模型: - kr/claude-sonnet-4.5 - kr/claude-haiku-4.5 - kr/glm-5 - kr/MiniMax-M2.5 - kr/qwen3-coder-next - kr/deepseek-3.2 -``` - -**专业提示:** Claude 最佳免费选项。无需 API key,无需付款,完全无限量。 - -### OpenCode Free(无需认证,自动获取模型) - -```bash -控制面板 → 连接 OpenCode Free -→ 无需登录(直连代理) -→ 模型从 opencode.ai/zen/v1/models 自动获取 -``` - -**专业提示:** 最快的设置。连接后即可开始编码。 - -### Vertex AI(新 GCP 账户 $300 免费额度) - -```bash -控制面板 → 连接 Vertex AI -→ 上传 Google Cloud 服务账户 JSON -→ 在你的 GCP 项目中启用 Vertex AI API - -模型: - vertex/gemini-3.1-pro-preview - vertex/gemini-3-flash-preview - vertex/gemini-2.5-flash - -Vertex 合作伙伴(通过 Vertex 提供 Anthropic / DeepSeek / GLM / Qwen): - vertex-partner/glm-5-maas - vertex-partner/deepseek-v3.2-maas - vertex-partner/qwen3-next-80b-a3b-thinking-maas -``` - -**专业提示:** 新 Google Cloud 账户可获得 90 天内 $300 免费额度。足够日常编码使用。 - -
- -
-🎨 创建组合 - -### 示例 1:充分利用订阅 → 低价备份 - -``` -控制面板 → 组合 → 创建新组合 - -名称:premium-coding -模型: - 1. cc/claude-opus-4-7 (订阅主用) - 2. glm/glm-5.1 (低价备份,$0.6/1M) - 3. minimax/MiniMax-M2.7 (最便宜的备选,$0.20/1M) - -在 CLI 中使用:premium-coding - -月度成本示例(100M tokens): - 80M 通过 Claude(订阅):$0 额外费用 - 15M 通过 GLM:$9 - 5M 通过 MiniMax:$1 - 总计:$10 + 你的订阅费用 -``` - -### 示例 2:仅免费(零成本) - -``` -名称:free-combo -模型: - 1. kr/claude-sonnet-4.5 (通过 Kiro 免费使用 Claude 4.5,约 50 积分/月) - 2. kr/glm-5 (通过 Kiro 免费使用 GLM-5) - 3. vertex/gemini-3.1-pro-preview ($300 免费额度) - -成本:通过 RTK 永久 $0(+ 节省 20-40% tokens)! -``` - -
- -
-🔧 CLI 集成 - -### Cursor IDE - -``` -设置 → 模型 → 高级: - OpenAI API Base URL:http://localhost:20128/v1 - OpenAI API Key:[来自 9router 控制面板] - Model:cc/claude-opus-4-7 -``` - -或使用组合:`premium-coding` - -### Claude Code - -编辑 `~/.claude/config.json`: - -```json -{ - "anthropic_api_base": "http://localhost:20128/v1", - "anthropic_api_key": "your-9router-api-key" -} -``` - -### Codex CLI - -```bash -export OPENAI_BASE_URL="http://localhost:20128" -export OPENAI_API_KEY="your-9router-api-key" - -codex "your prompt" -``` - -### OpenClaw - -**选项 1 — 控制面板(推荐):** - -``` -控制面板 → CLI 工具 → OpenClaw → 选择模型 → 应用 -``` - -**选项 2 — 手动:** 编辑 `~/.openclaw/openclaw.json`: - -```json -{ - "agents": { - "defaults": { - "model": { - "primary": "9router/kr/claude-sonnet-4.5" - } - } - }, - "models": { - "providers": { - "9router": { - "baseUrl": "http://127.0.0.1:20128/v1", - "apiKey": "sk_9router", - "api": "openai-completions", - "models": [ - { - "id": "kr/claude-sonnet-4.5", - "name": "Claude Sonnet 4.5 (Kiro Free)" - } - ] - } - } - } -} -``` - -> **注意:** OpenClaw 仅适用于本地 9Router。使用 `127.0.0.1` 而不是 `localhost` 以避免 IPv6 解析问题。 - -### Cline / Continue / RooCode - -``` -Provider:OpenAI 兼容 -Base URL:http://localhost:20128/v1 -API Key:[来自控制面板] -Model:cc/claude-opus-4-7 -``` - -
- -
-🚀 部署 - -### VPS 部署 - -```bash -# 克隆并安装 -git clone https://github.com/decolua/9router.git -cd 9router -npm install -npm run build - -# 配置 -export JWT_SECRET="your-secure-secret-change-this" -export INITIAL_PASSWORD="your-password" -export DATA_DIR="/var/lib/9router" -export PORT="20128" -export HOSTNAME="0.0.0.0" -export NODE_ENV="production" -export NEXT_PUBLIC_BASE_URL="http://localhost:20128" -export NEXT_PUBLIC_CLOUD_URL="https://9router.com" -export API_KEY_SECRET="endpoint-proxy-api-key-secret" -export MACHINE_ID_SALT="endpoint-proxy-salt" - -# 启动 -npm run start - -# 或使用 PM2 -npm install -g pm2 -pm2 start npm --name 9router -- start -pm2 save -pm2 startup -``` - -### Docker - -```bash -# 构建镜像(从仓库根目录) -docker build -t 9router . - -# 运行容器(当前设置使用的命令) -docker run -d \ - --name 9router \ - -p 20128:20128 \ - --env-file /root/dev/9router/.env \ - -v 9router-data:/app/data \ - -v 9router-usage:/root/.9router \ - 9router -``` - -便携命令(如果你已经在仓库根目录): - -```bash -docker run -d \ - --name 9router \ - -p 20128:20128 \ - --env-file ./.env \ - -v 9router-data:/app/data \ - -v 9router-usage:/root/.9router \ - 9router -``` - -容器默认值: -- `PORT=20128` -- `HOSTNAME=0.0.0.0` - -常用命令: - -```bash -docker logs -f 9router -docker restart 9router -docker stop 9router && docker rm 9router -``` - -### 环境变量 - -| 变量 | 默认值 | 描述 | -|----------|---------|-------------| -| `JWT_SECRET` | 自动生成(`~/.9router/jwt-secret`) | 用于控制面板 auth cookie 的 JWT 签名密钥(设置可在多实例间共享) | -| `INITIAL_PASSWORD` | `123456` | 当没有保存的哈希时首次登录的密码 | -| `DATA_DIR` | `~/.9router` | 主应用数据库位置(`db.json`) | -| `PORT` | 框架默认值 | 服务端口(示例中为 `20128`) | -| `HOSTNAME` | 框架默认值 | 绑定主机(Docker 默认为 `0.0.0.0`) | -| `NODE_ENV` | 运行时默认值 | 设置 `production` 用于部署 | -| `BASE_URL` | `http://localhost:20128` | 云同步任务使用的服务端内部基础 URL | -| `CLOUD_URL` | `https://9router.com` | 服务端云同步端点基础 URL | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:3000` | 向后兼容/公开基础 URL(服务端运行时优先使用 `BASE_URL`) | -| `NEXT_PUBLIC_CLOUD_URL` | `https://9router.com` | 向后兼容/公开云 URL(服务端运行时优先使用 `CLOUD_URL`) | -| `API_KEY_SECRET` | `endpoint-proxy-api-key-secret` | 生成 API key 的 HMAC 密钥 | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | 稳定机器 ID 哈希的盐值 | -| `ENABLE_REQUEST_LOGS` | `false` | 在 `logs/` 下启用请求/响应日志 | -| `AUTH_COOKIE_SECURE` | `false` | 强制 `Secure` auth cookie(在 HTTPS 反向代理后面设置为 `true`) | -| `REQUIRE_API_KEY` | `false` | 在 `/v1/*` 路由上强制使用 Bearer API key(面向互联网部署时推荐) | -| `HTTP_PROXY`、`HTTPS_PROXY`、`ALL_PROXY`、`NO_PROXY` | 空 | 用于上游提供商调用的可选出站代理 | - -注意: -- 也支持小写代理变量:`http_proxy`、`https_proxy`、`all_proxy`、`no_proxy`。 -- `.env` 不会打包到 Docker 镜像中(`.dockerignore`);使用 `--env-file` 或 `-e` 注入运行时配置。 -- 在 Windows 上,`APPDATA` 可用于本地存储路径解析。 -- `INSTANCE_NAME` 出现在较旧的文档/环境变量模板中,但当前运行时未使用。 - -### 运行时文件和存储 - -- 主应用状态:`${DATA_DIR}/db.json`(提供商、组合、别名、密钥、设置),由 `src/lib/localDb.js` 管理。 -- 使用历史和日志:`${DATA_DIR}/usage.json` 和 `${DATA_DIR}/log.txt`,由 `src/lib/usageDb.js` 管理。 -- 可选的请求/翻译器日志:`ENABLE_REQUEST_LOGS=true` 时位于 `/logs/...`。 -- `${DATA_DIR}` 和 `~/.9router` 在 Docker 容器中解析到同一位置 — 符号链接 `/root/.9router -> /app/data` 在构建时创建。 - -
- ---- - -## 📊 可用模型 - -
-查看所有可用模型 - -**Claude Code(`cc/`)** - Pro/Max: -- `cc/claude-opus-4-7` -- `cc/claude-opus-4-6` -- `cc/claude-sonnet-4-6` -- `cc/claude-sonnet-4-5-20250929` -- `cc/claude-haiku-4-5-20251001` - -**Codex(`cx/`)** - Plus/Pro: -- `cx/gpt-5.5` -- `cx/gpt-5.4` -- `cx/gpt-5.3-codex` -- `cx/gpt-5.2-codex` -- `cx/gpt-5.1-codex-max` - -**GitHub Copilot(`gh/`)**: -- `gh/gpt-5.4` -- `gh/claude-opus-4.7` -- `gh/claude-sonnet-4.6` -- `gh/gemini-3.1-pro-preview` -- `gh/grok-code-fast-1` - -**Cursor(`cu/`)** - 订阅: -- `cu/claude-4.6-opus-max` -- `cu/claude-4.5-sonnet-thinking` -- `cu/gpt-5.3-codex` -- `cu/kimi-k2.5` - -**GLM(`glm/`)** - $0.6/1M: -- `glm/glm-5.1` -- `glm/glm-5` -- `glm/glm-4.7` - -**MiniMax(`minimax/`)** - $0.2/1M: -- `minimax/MiniMax-M2.7` -- `minimax/MiniMax-M2.5` - -**Kimi(`kimi/`)** - $9/月固定: -- `kimi/kimi-k2.5` -- `kimi/kimi-k2.5-thinking` - -**Kiro(`kr/`)** - 免费(约 50 积分/月,之上为付费档位): -- `kr/claude-sonnet-4.5` -- `kr/claude-haiku-4.5` -- `kr/glm-5` -- `kr/MiniMax-M2.5` -- `kr/qwen3-coder-next` -- `kr/deepseek-3.2` - -**OpenCode Free(`oc/`)** - 免费无需认证: -- 从 `opencode.ai/zen/v1/models` 自动获取 - -**Vertex AI(`vertex/`)** - $300 免费额度: -- `vertex/gemini-3.1-pro-preview` -- `vertex/gemini-3-flash-preview` -- `vertex/gemini-2.5-flash` -- `vertex-partner/glm-5-maas` -- `vertex-partner/deepseek-v3.2-maas` - -
- ---- - -## 🐛 故障排除 - -**"语言模型未提供消息"** -- 提供商配额耗尽 → 检查控制面板配额追踪器 -- 解决方案:使用组合切换或切换到更便宜的等级 - -**速率限制** -- 订阅配额用完 → 切换到 GLM/MiniMax -- 添加组合:`cc/claude-opus-4-7 → glm/glm-5.1 → kr/claude-sonnet-4.5` - -**OAuth token 已过期** -- 9Router 自动刷新 -- 如果问题持续:控制面板 → 提供商 → 重新连接 - -**高成本** -- 在控制面板 → 端点设置中启用 RTK(默认开启,节省 20-40% tokens) -- 在控制面板中检查使用统计 -- 将主模型切换到 GLM/MiniMax -- 对于非关键任务使用免费等级(Kiro、OpenCode Free、Vertex) - -**控制面板在错误端口打开** -- 设置 `PORT=20128` 和 `NEXT_PUBLIC_BASE_URL=http://localhost:20128` - -**首次登录不工作** -- 检查 `.env` 中的 `INITIAL_PASSWORD` -- 如果未设置,回退密码是 `123456` - -**`logs/` 下没有请求日志** -- 设置 `ENABLE_REQUEST_LOGS=true` - ---- - -## 🛠️ 技术栈 - -- **运行时**:Node.js 20+ -- **框架**:Next.js 16 -- **UI**:React 19 + Tailwind CSS 4 -- **数据库**:LowDB(基于 JSON 文件) -- **流式传输**:Server-Sent Events (SSE) -- **认证**:OAuth 2.0 (PKCE) + JWT + API Keys - ---- - -## 📝 API 参考 - -### 聊天补全 - -```bash -POST http://localhost:20128/v1/chat/completions -Authorization: Bearer your-api-key -Content-Type: application/json - -{ - "model": "cc/claude-opus-4-6", - "messages": [ - {"role": "user", "content": "Write a function to..."} - ], - "stream": true -} -``` - -### 列出模型 - -```bash -GET http://localhost:20128/v1/models -Authorization: Bearer your-api-key - -→ 以 OpenAI 格式返回所有模型和组合 -``` - -## 📧 支持 - -- **网站**:[9router.com](https://9router.com) -- **GitHub**:[github.com/decolua/9router](https://github.com/decolua/9router) -- **问题**:[github.com/decolua/9router/issues](https://github.com/decolua/9router/issues) - ---- - -## 👥 贡献者 - -感谢所有帮助改进 9Router 的贡献者! - -[![Contributors](https://contrib.rocks/image?repo=decolua/9router&max=150&columns=15&anon=1&v=20260309)](https://github.com/decolua/9router/graphs/contributors) - ---- - -## 📊 Star 图表 - -[![Star Chart](https://starchart.cc/decolua/9router.svg?variant=adaptive)](https://starchart.cc/decolua/9router) - - - -## 🔀 分支 - -**[OmniRoute](https://github.com/diegosouzapw/OmniRoute)** — 9Router 的全功能 TypeScript 分支。增加了 36+ 提供商、4 层自动切换、多模态 API(图像、嵌入、音频、TTS)、断路器、语义缓存、LLM 评估和精美的控制面板。368+ 单元测试。可通过 npm 和 Docker 使用。 - ---- - -## 🙏 致谢 - -站在巨人的肩膀上构建: - -- **CLIProxyAPI** — 启发了这个 JavaScript 移植的原始 Go 实现。 -- **[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**。 -- **[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**。 - -非常感谢这些作者 — 没有他们的工作,9Router 的 token 节省功能就不会存在。在 GitHub 上给他们加星! - ---- - -## 📄 许可证 - -MIT 许可证 — 详见 [LICENSE](LICENSE)。 - ---- - -
- 用 ❤️ 为 24/7 编程的开发者构建 -
\ No newline at end of file diff --git a/images/9router.png b/images/9router.png index 283210a2..7b0a56cd 100644 Binary files a/images/9router.png and b/images/9router.png differ diff --git a/images/fusion-combo-ui.png b/images/fusion-combo-ui.png deleted file mode 100644 index 8799d720..00000000 Binary files a/images/fusion-combo-ui.png and /dev/null differ diff --git a/images/proxy-fitnes.png b/images/proxy-fitnes.png new file mode 100644 index 00000000..c4487271 Binary files /dev/null and b/images/proxy-fitnes.png differ diff --git a/images/smart-rotation.png b/images/smart-rotation.png new file mode 100644 index 00000000..cbf8de0f Binary files /dev/null and b/images/smart-rotation.png differ diff --git a/src/app/(dashboard)/dashboard/profile/page.js b/src/app/(dashboard)/dashboard/profile/page.js index 6e1df0af..806b85ac 100644 --- a/src/app/(dashboard)/dashboard/profile/page.js +++ b/src/app/(dashboard)/dashboard/profile/page.js @@ -1167,6 +1167,14 @@ export default function ProfilePage() {

{APP_CONFIG.name} v{APP_CONFIG.version}

Local Mode - All data stored on your machine

+ + MIBP Edition +
diff --git a/src/shared/components/Header.js b/src/shared/components/Header.js index c3bbe606..dd000468 100644 --- a/src/shared/components/Header.js +++ b/src/shared/components/Header.js @@ -8,7 +8,6 @@ import ProviderIcon from "@/shared/components/ProviderIcon"; import HeaderMenu from "@/shared/components/HeaderMenu"; import HeaderLanguage from "@/shared/components/HeaderLanguage"; import ThemeToggle from "@/shared/components/ThemeToggle"; -import DonateModal from "@/shared/components/DonateModal"; import { useHeaderSearchStore } from "@/store/headerSearchStore"; import { OAUTH_PROVIDERS, APIKEY_PROVIDERS } from "@/shared/constants/config"; import { MEDIA_PROVIDER_KINDS, AI_PROVIDERS } from "@/shared/constants/providers"; @@ -183,7 +182,6 @@ export default function Header({ onMenuClick, showMenuButton = true }) { const pathname = usePathname(); const [displayName, setDisplayName] = useState(""); const [loginMethod, setLoginMethod] = useState(""); - const [donateOpen, setDonateOpen] = useState(false); // Memoize page info to prevent unnecessary recalculations const pageInfo = useMemo(() => getPageInfo(pathname), [pathname]); @@ -313,19 +311,20 @@ export default function Header({ onMenuClick, showMenuButton = true }) { )} - + code + MIBP Edition + - setDonateOpen(false)} /> ); } diff --git a/src/shared/components/Sidebar.js b/src/shared/components/Sidebar.js index 2f329da2..fa52dc2c 100644 --- a/src/shared/components/Sidebar.js +++ b/src/shared/components/Sidebar.js @@ -347,6 +347,17 @@ export default function Sidebar({ onClose }) { + + {/* Remote Promo Modal */}