<p align="center">
  <img src="src-tauri/icons/logo.png" alt="AAStation Logo" width="128" height="128" />
</p>

<h1 align="center">AAStation</h1>

<p align="center">
  <strong>本地 AI API 代理工具</strong>
</p>

<p align="center">
  画个图，把 AI 请求转发到你想用的供应商
</p>

<br>

<p align="center">
  <a href="https://github.com/QinMoXX/AAStation/releases">
    <img src="https://img.shields.io/badge/version-0.9.3-blue" alt="Version" />
  </a>
  <img src="https://img.shields.io/badge/platform-Windows-green" alt="Platform" />
  <img src="https://img.shields.io/badge/license-MIT-yellow" alt="License" />
</p>

<p align="center">
  <a href="#安装使用">安装使用</a> · <a href="#english">English</a>
</p>

---

**简体中文**

## 它解决什么问题？

你在本地用 Claude Code、OpenCode、Codex CLI 这类工具时，请求只能走一个供应商。如果你想：

- 让 Claude Code 用 DeepSeek 或智谱的模型
- 同时接入多个供应商，挂了一个自动切到另一个
- 按模型名、路径等条件把请求分发给不同的服务

<br>

<p align="center">
  <img src="public/Snipaste_2026-04-26_21-36-04.png" alt="AAStation 主界面" />
</p>

<br>

## 怎么做到的

你在画布上拖拽四种节点，连成一条链路，代理就按这条链路转发请求：

| 节点 | 作用 |
|------|------|
| **应用 (Application)** | 代表一个客户端工具，每个应用监听一个独立端口 |
| **路由器 (Switcher)** | 按条件分发请求（模型名、路径、请求头） |
| **分配器 (Poller)** | 在多个供应商中自动选择（按权重 / 健康状态 / 额度余量） |
| **供应商 (Provider)** | 一个 AI 服务端点，配好 API Key 即可使用 |

最简单的链路只需要 **应用 → 供应商** 两步。

<br>

## 主要特性

- **可视化配置** — 拖拽连线搭建请求链路，不需要写配置文件
- **智能切换** — 供应商故障时自动切换，支持权重、健康优先、额度余量等策略
- **一键配置客户端** — 自动写入 Claude Code、OpenCode、Codex CLI 的代理设置
- **实时监控** — 请求数、Token 用量、延迟、成功率一目了然
- **供应商健康状态** — 正常 / 降级 / 熔断 / 半开，状态持久化
- **消息悬浮窗** — 桌面悬浮窗实时展示请求和响应内容，支持打字机动画和流式指示
- **系统托盘** — 后台运行，支持开机自启
- **自动更新** — 启动时检查，一键安装新版本

<br>

## 消息悬浮窗

开启后在桌面显示一个半透明悬浮窗，实时展示代理转发的请求和响应内容：

在「设置 → 通用」中开启"消息悬浮窗"即可使用。

<br>

## 内置供应商预设

开箱即用，填上 API Key 就能连：

DeepSeek · 智谱 AI · 阿里云百炼 · MiniMax · Kimi · 火山方舟 · OpenRouter · 腾讯云 · 讯飞 Coding Plan

也支持自定义供应商，填写 Base URL 和模型即可。

<br>

## 常用客户端一键配置

添加Claude Code、OpenCod、Codex CLI 应用节点后，设置界面点击"写入配置" 一键配置。

> **Codex CLI 注意**：AAStation 不支持修改旧版 Codex 配置；新版 Codex 改用 Responses API，兼容性有限。建议优先使用 **Claude Code** 或 **OpenCode**。（详见 [Codex 官方说明](https://github.com/openai/codex/discussions/7782)）。

<br>

## 安装使用

<br>

### 直接安装

从 [Releases](https://github.com/QinMoXX/AAStation/releases) 下载安装包，安装后打开。

<br>

### 从源码构建

> 前置条件：[Node.js](https://nodejs.org/) v18+、[Rust](https://www.rust-lang.org/tools/install)、[Visual Studio Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)（Windows 需安装"桌面开发"工作负载）

```bash
git clone https://github.com/QinMoXX/AAStation.git
cd AAStation
npm install
npm run tauri dev    # 开发模式
npm run tauri build  # 构建安装包
```

<br>

## 操作教程

### 场景一：最简链路 — 直连一个供应商

最基础的用法：让 AI 客户端通过 AAStation 使用某个供应商的模型。

**1. 添加供应商和应用节点**

点击左侧工具栏的 **+** 按钮，分别添加一个供应商节点（如 DeepSeek）和一个应用节点（选择客户端类型），填入 API Key。

![添加节点和连线](public/export-1779549166616.gif)

**2. 连线**

从应用节点右侧的连接点拖一条线到供应商节点左侧，完成。

**3. 配置客户端**

进入 **设置 → 应用设置**，选择客户端类型和刚添加的应用节点，点击「写入配置」。

> 配置写入时会自动备份原有配置，方便以后恢复。

![一键配置客户端](public/export-1779549972083.gif)

**4. 启动代理**

回到主界面，点击「开启代理」按钮。状态栏显示代理运行中即表示成功。

![启动代理](public/export-1779550174142.gif)

完成！现在你的 AI 客户端就会通过 AAStation 使用指定的供应商模型了。

<br>

### 场景二：按模型分流

想让不同模型走不同供应商？在中间加一个**路由器**节点。

**链路结构：** `应用 → 路由器 → 多个供应商`

1. 在应用和供应商之间加入「路由器」节点，连接多个供应商
2. 点击路由器节点，在右侧面板添加路由规则，例如：
   - 模型名 `claude-sonnet` → 走 DeepSeek
   - 模型名 `claude-opus` → 走智谱 AI
   - 其他模型 → 走默认供应商

![按模型分流](public/export-1779550853223.gif)

> 支持按模型名、路径前缀、请求头三种条件匹配。

<br>

### 场景三：多供应商智能切换

多个供应商都有额度？用**分配器**节点自动选择和切换。

**链路结构：** `应用 → 分配器 → 多个供应商`

1. 在应用和供应商之间加入「分配器」节点，连接多个供应商
2. 点击分配器节点，在右侧面板选择轮询策略：
   - **权重** — 按比例分配请求
   - **健康优先** — 优先选择响应最快的供应商
   - **剩余额度优先** — 优先使用剩余 Token 最多的供应商
3. （可选）在供应商节点中设置每日/每月 Token 预算，达到上限后自动跳过

![智能切换](public/export-1779552796912.gif)

> 某个供应商故障或额度用完时，自动切换到下一个，保证请求不断。

<br>

### 场景四：实时监控

**监控面板**

切换到「监控」标签页，查看请求数、Token 用量、延迟、成功率等实时数据。

![监控面板](public/export-1779553385914.gif)

**消息悬浮窗**

在 **设置 → 通用** 中开启「消息悬浮窗」，桌面会显示一个半透明窗口，实时展示每条请求和响应的内容，支持打字机动画。

![消息悬浮窗](public/export-1779553895428.gif)

<br>

### 完整链路示例

一个综合了以上所有元素的完整链路：

![完整链路](public/Snipaste_2026-05-24_00-41-38.png)

---

<a name="english"></a>

<br>

## English

### What problem does it solve?

When you use tools like Claude Code, OpenCode, or Codex CLI locally, your requests can only go to one provider. What if you want to:

- Use DeepSeek or Zhipu models with Claude Code
- Connect multiple providers and auto-switch when one goes down
- Route requests to different services based on model name, path, or headers

AAStation runs a **local proxy server** that forwards your AI API requests according to rules you define visually.

<br>

### How it works

You drag four types of nodes on a canvas and connect them into a pipeline. The proxy forwards requests along that pipeline:

| Node | Purpose |
|------|---------|
| **Application** | Represents a client tool, each listening on its own port |
| **Switcher** | Routes requests by conditions (model name, path, headers) |
| **Poller** | Picks the best provider (by weight / health / remaining quota) |
| **Provider** | An AI service endpoint — add your API Key and go |

The simplest pipeline is just **Application → Provider**.

<br>

### Features

- **Visual configuration** — Drag and connect to build request pipelines, no config files needed
- **Smart failover** — Auto-switches providers on failure, with weight/health/quota strategies
- **One-click client setup** — Auto-writes proxy config for Claude Code, OpenCode, and Codex CLI
- **Real-time monitoring** — Request count, token usage, latency, success rate at a glance
- **Provider health status** — Normal / degraded / circuit-break / half-open, persisted across restarts
- **Floating message monitor** — Desktop overlay window showing live request/response content with typewriter animation and streaming indicator
- **System tray** — Runs in background, supports auto-start
- **Auto-update** — Checks on startup, one-click install

<br>

### Built-in Provider Presets

Ready to use — just add your API Key:

DeepSeek · Zhipu AI · Alibaba Bailian · MiniMax · Kimi · Volcengine Ark · OpenRouter · Tencent Cloud · iFlytek Coding Plan

Custom providers are also supported — just fill in the Base URL and models.

<br>

### Install

Download the installer from [Releases](https://github.com/QinMoXX/AAStation/releases).

<br>

### Build from Source

> Prerequisites: [Node.js](https://nodejs.org/) v18+, [Rust](https://www.rust-lang.org/tools/install), [Visual Studio Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/) (Windows, "Desktop development" workload)

```bash
git clone https://github.com/QinMoXX/AAStation.git
cd AAStation
npm install
npm run tauri dev    # Dev mode
npm run tauri build  # Build installer
```

<br>

### Tutorial

#### Scenario 1: Direct Connection (App → Provider)

The simplest setup: route your AI client through AAStation to a single provider.

**1. Add nodes**

Click the **+** button in the toolbar to add a provider (e.g. DeepSeek) and an application node. Fill in your API Key.

![Add and connect nodes](public/export-1779549166616.gif)

**2. Connect**

Drag a line from the application node's right handle to the provider node's left handle.

**3. Configure the client**

Go to **Settings → Apps**, select the client type and application node, then click "Write Config".

> Your existing config is automatically backed up before writing.

![One-click client config](public/export-1779549972083.gif)

**4. Start the proxy**

Click "Start Proxy" on the main interface. The status bar will show the proxy is running.

![Start proxy](public/export-1779550174142.gif)

Done! Your AI client now uses the provider through AAStation.

<br>

#### Scenario 2: Model-Based Routing

Route different models to different providers using a **Switcher** node.

**Pipeline:** `App → Switcher → Multiple Providers`

1. Add a Switcher node between the app and multiple providers
2. Configure routing rules in the side panel, e.g.:
   - Model `claude-sonnet` → DeepSeek
   - Model `claude-opus` → Zhipu AI
   - Others → default provider

![Model-based routing](public/export-1779550853223.gif)

> Match by model name, path prefix, or HTTP header.

<br>

#### Scenario 3: Smart Failover

Have multiple provider accounts? Use a **Poller** node for automatic selection and failover.

**Pipeline:** `App → Poller → Multiple Providers`

1. Add a Poller node between the app and multiple providers
2. Choose a strategy in the side panel:
   - **Weight** — Distribute requests by ratio
   - **Health First** — Prefer the fastest-responding provider
   - **Remaining Quota** — Prefer providers with the most tokens left
3. (Optional) Set daily/monthly token budgets on provider nodes

![Smart failover](public/export-1779552796912.gif)

> When a provider fails or runs out of quota, requests automatically fall over to the next one.

<br>

#### Scenario 4: Real-Time Monitoring

**Dashboard**

Switch to the **Monitor** tab to see request count, token usage, latency, and success rate in real time.

![Monitor dashboard](public/export-1779553385914.gif)

**Floating Message Window**

Enable "Floating Message Window" in **Settings → General** — a translucent overlay shows live request/response content with typewriter animation.

![Floating window](public/export-1779553895428.gif)

<br>

#### Full Pipeline Example

A complete pipeline combining all the elements above:

![Full pipeline](public/Snipaste_2026-05-24_00-41-38.png)
