# vortex
**Repository Path**: shaipe/vortex
## Basic Information
- **Project Name**: vortex
- **Description**: Vortex 不只是 AI 网关——它是你的免费额度情报站、Key 保险柜、协议翻译官。
- **Primary Language**: Rust
- **License**: MIT
- **Default Branch**: main
- **Homepage**: https://ht-shaipe.github.io/vortex/
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-12
- **Last Updated**: 2026-09-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Vortex AI Gateway
> 统一的 AI 网关 — 将多家 AI 提供商聚合为 OpenAI / Anthropic 兼容 API
Vortex 是一个基于 **Rust (Actix-Web) + Vue 3** 构建的 AI 网关应用。它在本地启动一个 OpenAI 兼容的 API 服务器,将请求路由到多个 AI 提供商(OpenAI、Anthropic、Google Gemini、DeepSeek 等),支持弹性重试、API 密钥管理和用量统计。
支持两种运行模式:
- **桌面模式** — 基于 Tauri 2 的桌面应用,内嵌 HTTP 服务器 + 系统托盘 + IPC 命令
- **Web 模式** — 纯 actix-web 服务器(`vortex-server`),不依赖 Tauri,适合服务器部署
## 特性
- **多家内置 AI 提供商** — OpenAI、Anthropic、Google Gemini、DeepSeek、Groq、xAI、Mistral、OpenRouter、NVIDIA NIM、Cloudflare AI、Ollama、SiliconFlow、HuggingFace、Qwen、MiniMax、Z.AI (GLM)、火山方舟、商汤日日新,以及自定义 OpenAI 兼容端点
- **OpenAI / Anthropic 双协议入口** — `/v1/chat/completions` 与 `/v1/messages` 两套端点,无需修改客户端代码,直接替换 `base_url` 即可
- **智能体一键接入** — 自动检测本机已安装的 AI 编程智能体(Claude Code、Codex、OpenCode、Qwen Code 等 12 种),预览将要写入的配置变更后一键接入 Vortex 网关;写入前自动备份,支持一键恢复到配置前状态
- **跨格式转换** — 自动将 Anthropic/Gemini 请求和响应转换为 OpenAI 格式,包括 SSE 流式响应
- **弹性机制** — 连接级与模型级双层熔断器 + 指数退避重试:连接连续失败 5 次熔断 60 秒,单个模型连续失败 3 次独立熔断(下线/无权限等确定性故障更快隔离);熔断期间下游收到 503 与友好提示,冷却后自动探测恢复
- **上游错误透传** — 上游返回 4xx/5xx 时原样透传状态码与错误响应体,客户端可直接看到上游真实报错,便于排查
- **模型映射 + 故障转移** — 自定义虚拟模型名映射到多个真实模型目标,按优先级自动故障转移,免费额度组成"永动机"
- **模型自动归纳** — 按模型家族自动将同族模型(如 gpt-4o、gpt-4o-2024-08-06、glm-5.3-flash:free)归纳为虚拟名,单模型家族同样生成同名别名保证全覆盖;开启「隐藏已映射的真实模型」后 `/v1/models` 仅输出虚拟模型列表,减少使用者选择负担
- **安全存储** — API 密钥使用 AES-256-GCM 加密存储
- **访问令牌开箱即用** — 首次启动默认开启 Token 鉴权并自动生成访问令牌,接入指南页一键复制并代入示例代码;多数客户端要求 API Key 字段非空才能发起请求,无需额外配置即可接入
- **用量统计** — 按提供商、模型、时间维度记录请求数、Token 用量和成本;缓存创建/读取与推理 Token 从上游真实提取落库,不再恒为 0;上游未返回用量时自动按文本长度估算(中文 1 字 ≈ 1 token,其他 4 字符 ≈ 1 token),日志与统计中标记估算请求数,区分估算值与真实值
- **免费 Token 目录** — 内置 43 个可申请免费额度的 AI 平台(国内 / 海外 / 本地部署),标注是否支持 API、是否需绑卡与实名,支持自行提交推荐并保存到本地
- **内置对话** — 应用内直接对话测试,支持会话分支树、模型选择、流式输出,数据持久化到 localStorage
- **模型选择对话框** — 获取远程模型后弹出对话框,checkbox 多选批量管理,支持搜索与全选
- **自动更新** — 基于 tauri-plugin-updater,启动时静默检查 GitHub Releases,运行期间每 6 小时自动复查(同一版本不重复提醒),发现新版本提示下载安装
- **通知系统** — 从远程通知中心拉取站内通知,未读通知弹出桌面提示,已读状态持久化到本地
- **桌面应用** — 系统托盘常驻(显示窗口 / 启动代理 / 停止代理 / 退出),Vue 3 管理界面,多窗口支持(主窗口 + 状态面板小窗口)
## 快速开始
### 直接下载
预编译安装包发布在 [GitHub Releases](https://github.com/ht-shaipe/vortex/releases/latest):
| 平台 | 产物 |
|---|---|
| Windows 10 / 11 · x64 | `Vortex_<版本>_x64-setup.exe`(NSIS)、`Vortex_<版本>_x64_en-US.msi` |
| macOS · Apple 芯片 | `Vortex_<版本>_aarch64.dmg` |
| macOS · Intel | `Vortex_<版本>_x64.dmg` |
| Linux · x64 | `Vortex_<版本>_amd64.AppImage`、`Vortex_<版本>_amd64.deb` |
产物由 `.github/workflows/release.yml` 在推送 `v*` tag(或手动触发 workflow_dispatch)时构建并发布。
官网的下载区会在运行时拉取最新 Release,把按钮直接指向上述文件,因此**文件名带版本号不需要手工维护**。
> macOS 产物未做 Apple 公证,首次打开需右键 → 打开;Windows 若弹 SmartScreen 提示,选「更多信息 → 仍要运行」。
#### macOS 提示「已损坏,无法打开」
从浏览器下载的 `.dmg` 安装后,macOS Gatekeeper 会给应用打上隔离属性(`com.apple.quarantine`),导致打开时提示 **「"Vortex"已损坏,无法打开。你应该将它移到废纸篓。」**。应用本身没有损坏,清除隔离属性即可:
```bash
xattr -cr /Applications/Vortex.app
```
在终端中执行上述命令后,再双击打开 Vortex 即可正常运行。如果仍无法打开,前往 **系统设置 → 隐私与安全性**,在底部找到关于 Vortex 的提示,点击「仍要打开」。
### 环境要求
- [Rust](https://rustup.rs/) 1.70+ (stable)
- [Bun](https://bun.sh/)(仓库带 `bun.lock`,推荐)或 [Node.js](https://nodejs.org/) 20.19+ / 22.12+
- [Tauri 2 CLI](https://v2.tauri.app/) 前置依赖(参见 [Tauri 官方文档](https://v2.tauri.app/start/prerequisites/))
### 从源码安装与运行
```bash
# 安装前端依赖
bun install # 或 npm install / pnpm install
# 开发模式(同时启动前端和 Rust 后端)
bun run tauri dev
# 构建生产版本
bun run tauri build
```
开发模式下:
- 前端开发服务器:`http://localhost:1420`
- API 网关服务器:`http://localhost:10168`
### Web 模式部署
不依赖 Tauri,纯 actix-web 服务器,适合服务器/无桌面环境部署:
```bash
# 编译并运行
cargo run -p vortex-gateway --bin vortex-server
# 或先编译再运行
cargo build -p vortex-gateway --bin vortex-server --release
./target/release/vortex-server
```
启动后监听 `0.0.0.0:10168`,提供 `/api/*` 管理端点和 `/v1/*` 代理端点。按 `Ctrl+C` 优雅关闭。
> Web 模式下前端需单独部署(如 nginx 托管 `vite build` 产物),通过 `runtime.kind === 'web'` 自动切换到 HTTP API 通道。
### 使用网关
启动后,将你的 AI 客户端的 `base_url` 指向 Vortex:
```
http://localhost:10168/v1
```
**示例 — 使用 OpenAI Python SDK:**
```python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:10168/v1",
api_key="vx-4f2a9c1e8b7d4a6f9c3e2b1a8d5f7c40" # 通过 POST /api/keys 创建的网关密钥
)
response = client.chat.completions.create(
model="openai/gpt-4o", # 使用 provider/model 格式
messages=[{"role": "user", "content": "Hello!"}]
)
```
**示例 — 使用 cURL:**
```bash
curl http://localhost:10168/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer vx-4f2a9c1e8b7d4a6f9c3e2b1a8d5f7c40" \
-d '{
"model": "deepseek/deepseek-chat",
"messages": [{"role": "user", "content": "Hello!"}]
}'
```
### 模型指定方式
| 格式 | 示例 | 说明 |
|------|------|------|
| `provider/model` | `openai/gpt-4o` | 显式指定提供商和模型 |
| `alias-model` | `ds-deepseek-chat` | 使用提供商别名前缀 |
## 内置提供商
| 提供商 | 别名 | API 格式 | 服务类型 | 免费层 |
|--------|------|----------|----------|--------|
| OpenAI | `oa` | openai | llm, embedding, image | - |
| Anthropic | `an` | anthropic | llm | - |
| Google Gemini | `gm` | gemini | llm, embedding | ✓ |
| DeepSeek | `ds` | openai | llm | ✓ |
| Groq | `gq` | openai | llm | ✓ |
| xAI (Grok) | `xa` | openai | llm | - |
| Mistral | `ml` | openai | llm, embedding | - |
| OpenRouter | `or` | openai | llm, image | ✓ |
| NVIDIA NIM | `nv` | openai | llm, embedding | ✓ |
| Cloudflare AI | `cf` | cloudflare | llm, embedding, image | ✓ |
| Ollama (Local) | `ol` | openai | llm, embedding | ✓ (无认证) |
| SiliconFlow | `sf` | openai | llm, image | ✓ |
| HuggingFace | `hf` | openai | llm, embedding | ✓ |
| Qwen (通义千问) | `qw` | openai | llm, embedding | ✓ |
| MiniMax | `mm` | openai | llm | - |
| Z.AI (GLM) | `zi` | openai | llm | - |
| 火山方舟 Code Plan | `vc` | openai | llm | - |
| 火山方舟 Agent Plan | `va` | openai | llm | - |
| 商汤日日新 | `sn` | openai | llm | - |
| Custom | `cx` | openai | llm, embedding | - |
## 配置
### 环境变量
| 变量 | 默认值 | 说明 |
|------|--------|------|
| `VORTEX_PORT` | `10168` | API 服务器端口 |
| `VORTEX_DATA_DIR` | 系统数据目录/vortex | 数据存储目录 |
| `VORTEX_ENCRYPTION_KEY` | 自动生成 | API 密钥加密密钥(32 字节十六进制) |
| `VORTEX_REQUIRE_API_KEY` | `false` | 是否要求客户端提供 API Key |
| `VORTEX_FREE_TOKENS_REMOTE` | `https://hub.htui.cc/api/edge/free_tokens` | 免费 Token 远程服务地址 |
| `VORTEX_LOG_LEVEL` | `info` | 日志级别 |
### 管理界面
打开桌面应用可访问以下页面(左侧导航,从上到下):
| 页面 | 路由 | 说明 |
|------|------|------|
| 接入指南 | `/guide` | 客户端接入示例与模型指定方式,展示访问令牌(可复制)并代入示例代码;下方自动检测本机 AI 编程智能体并支持一键接入 / 恢复配置 |
| 实时路由 | `/live-routing` | 网关拓扑、Base URL、API 端点一览(默认首页) |
| 订阅 | `/subscriptions` | 提供商连接管理 —— 添加 API Key、测试连接;含新建 / 自定义 / 编辑子页 |
| 模型映射 | `/model-aliases` | 虚拟模型名与多目标故障转移配置 |
| 免费 Token | `/free-tokens` | 免费额度站点目录 —— 卡片 / 表格双视图、按区域与「是否支持 API」筛选、提交与删除本地推荐 |
| 请求日志 | `/request-log` | 请求流水与用量明细 |
| 统计 | `/statistics` | 端点统计(KPI / 热力图 / 趋势 / 端点表)、用量统计(应用来源 / 日模型明细) |
| 同步 | `/sync` | cc-switch 迁移、WebDAV 云备份、本地配置导出与导入 |
| 对话 | `/chat` | 内置对话客户端 —— 会话分支树、模型选择、流式输出 |
| 设置 | `/settings` | 通用设置 / 安全与访问(Token 鉴权、访问令牌、CORS)/ 高级设置 |
| 关于 | `/about` | 版本与项目信息、检查更新 |
> **同步页现状**:cc-switch 迁移与本地配置导出 / 导入已可用;WebDAV 的测试、备份、恢复与云端备份列表需要后端命令支持,当前 UI 已就绪,调用会提示「后端未接入」。适配层位于 `src/api/sync.ts`,接入后只需替换其中的桩函数。
## API 端点
### OpenAI 兼容端点 (`/v1`)
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/v1/chat/completions` | 聊天补全(支持流式) |
| POST | `/v1/messages` | Anthropic Messages 兼容(协议转换,支持流式) |
| GET | `/v1/models` | 模型列表 |
| POST | `/v1/embeddings` | 文本嵌入 |
| POST | `/v1/images/generations` | 图像生成 |
### 管理端点 (`/api`)
| 方法 | 路径 | 说明 |
|------|------|------|
| GET/POST | `/api/providers` | 提供商连接列表/创建 |
| GET/PATCH/DELETE | `/api/providers/{id}` | 单个提供商连接操作 |
| POST | `/api/providers/{id}/test` | 测试提供商连接 |
| GET | `/api/providers/{id}/apikey` | 获取解密后的真实 API 密钥(用于前端复制) |
| POST | `/api/providers/preview-models` | 预览远程可用模型列表(无需先保存连接) |
| GET/POST | `/api/keys` | API 密钥列表/创建 |
| GET/DELETE | `/api/keys/{id}` | 单个 API 密钥操作 |
| GET | `/api/usage` | 用量记录 |
| GET | `/api/usage/stats` | 用量统计 |
| GET/PATCH | `/api/settings` | 设置 |
| GET/POST | `/api/free-tokens` | 免费 Token 站点列表 / 提交推荐 |
| DELETE | `/api/free-tokens/{id}` | 删除用户提交的推荐(内置条目不可删) |
| GET/POST | `/api/model-aliases` | 模型别名列表/创建 |
| GET/PATCH/DELETE | `/api/model-aliases/{id}` | 单个模型别名操作 |
| GET | `/api/system/status` | 系统运行状态快照 |
| POST | `/api/system/proxy/start` | 启动代理服务器 |
| POST | `/api/system/proxy/stop` | 停止代理服务器 |
| GET | `/api/agents/detect` | 检测已安装智能体 |
| POST | `/api/agents/preview` | 预览智能体配置变更 |
| POST | `/api/agents/apply` | 应用智能体配置 |
| POST | `/api/agents/restore` | 恢复智能体配置 |
| GET | `/api/agents/backups` | 列出配置备份 |
| POST | `/api/chat/cancel` | 取消流式对话 |
| GET | `/api/health` | 健康检查 |
详细架构与内部实现参见 [ARCHITECTURE.md](./ARCHITECTURE.md)。
## 技术栈
### 后端 (Rust)
- **Workspace 4 crate** — `vortex-store`(数据层)← `vortex-router`(路由引擎)← `vortex-gateway`(HTTP 网关 + services)← `src-tauri`(Tauri 桌面应用)
- Actix-Web 4 — HTTP 服务器(桌面模式内嵌 / Web 模式独立 `vortex-server` binary)
- rusqlite + r2d2 — SQLite 数据库(WAL 模式,连接池)
- awc + openssl — 统一 HTTP 客户端(管理链路与上游链路共用,OpenSSL 3 指纹兼容 + HTTP/2)
- aes-gcm — API 密钥加密
- tokio — 异步运行时
- Tauri 2 — 桌面应用框架(仅 `src-tauri`,Web 模式不依赖)
- tauri-plugin-updater — 自动更新
- tauri-plugin-process — 进程管理(重启应用)
- tauri-plugin-autostart — 开机自启
### 前端 (Vue 3)
- Vue 3.5 + TypeScript (strict) — UI 框架
- Element Plus — UI 组件库
- Ant Design Vue — 辅助组件库(a-card、a-timeline 等)
- UnoCSS — 原子化 CSS
- Pinia — 状态管理
- Vue Router — 路由(Web 端 hash / Tauri 端 history 模式)
- ECharts 6 + vue-echarts — 图表可视化
- highlight.js — 语法高亮
- Vite — 构建工具
## 项目结构
```
vortex/
├── crates/ # Rust workspace crates
│ ├── vortex-store/ # 数据层 — config / db / encryption / migrations / error
│ ├── vortex-router/ # 路由引擎 — proxy / providers / routing / translator / context
│ └── vortex-gateway/ # HTTP 网关 — api / services / agent_integrations / AppState
│ └── src/bin/vortex-server.rs # Web 模式独立 binary(不依赖 Tauri)
├── src-tauri/ # Tauri 桌面应用(薄壳)— tauri_cmds 薄包装 + run() + main
├── src/ # 前端源代码 (Vue 3 + TypeScript)
│ ├── api/ # 请求层与双通道适配 (client / providers / keys / usage / settings / stats / chat / sync / freeTokens / notifications / system / agents)
│ ├── components/ # Vue 组件 (layout / chat / stats / sync / ui)
│ ├── composables/ # 组合式函数 (useTheme / useThemeColors / useUpdater / useNotifications)
│ ├── lib/ # 工具函数 (range / dateRange / format / usageChart / runtime)
│ ├── router/ # 路由配置
│ ├── stores/ # Pinia 状态管理
│ ├── styles/ # 设计系统 (cc-theme.css / cc-components.css)
│ ├── types/ # 类型定义
│ └── views/ # 页面视图 (16 个 .vue 文件)
├── docs/ # 项目官网与文档
│ ├── index.html # 官网落地页(原生 HTML/CSS/JS 零依赖)
│ ├── wechat/ # 公众号系列文章
│ └── promo/ # 视频脚本等宣传材料
├── Cargo.toml # workspace 根配置
├── package.json # 前端配置
└── src-tauri/Cargo.toml # Tauri 桌面应用配置
```
依赖链:`vortex-store ← vortex-router ← vortex-gateway ← src-tauri`。Web 项目复用前三个 crate,不需要 `src-tauri`。
详细架构参见 [ARCHITECTURE.md](./ARCHITECTURE.md)。
## 开发
```bash
# 前端开发
bun run dev # Vite 开发服务器 (http://localhost:1420)
bun run build # 类型检查 (vue-tsc) + 构建
bun run preview # 预览构建产物
# 后端开发(workspace)
cargo build # 编译所有 crate
cargo check # 快速类型检查
cargo clippy # 代码检查
cargo test # 运行测试
# 单 crate 操作
cargo build -p vortex-store # 仅编译数据层
cargo build -p vortex-router # 仅编译路由引擎
cargo build -p vortex-gateway # 仅编译 HTTP 网关
# Web 模式(独立 binary,不依赖 Tauri)
cargo run -p vortex-gateway --bin vortex-server
cargo build -p vortex-gateway --bin vortex-server --release
# 桌面模式(完整开发)
bun run tauri dev # 同时启动前端 + Tauri 后端
bun run tauri build # 构建桌面安装包
```
> **类型检查的已知问题**:`bun run build` 会先跑 `vue-tsc --noEmit`。当前 `typescript@7` 与 `vue-tsc@3` 组合会抛 `ERR_PACKAGE_PATH_NOT_EXPORTED: './lib/tsc' is not defined by "exports"`,属于依赖版本兼容问题而非代码错误。需要验证构建产物时直接执行 `npx vite build`(跳过类型检查)。
## 官网
`docs/index.html` 是项目的独立静态落地页,原生 HTML/CSS/JS 实现、零构建依赖,配色沿用应用主题(`src/styles/cc-theme.css`)的深紫强调色。
```bash
# 直接打开
open docs/index.html
# 或起一个本地静态服务
python3 -m http.server 8080 --directory docs
```
页面结构:Hero → 数据概览 → 接入范围 → 特性 → 界面预览 → 快速开始 → 请求流程 → 下载安装 → FAQ。
截图位于 `docs/assets/screens/`,取自本机开发实例,更新 UI 后可重新截取替换。
> 下载区的按钮由 `docs/assets/app.js` 在运行时请求 `api.github.com` 解析最新 Release 的产物地址,
> 静态 HTML 里只放「指向 Releases 页面」的兜底链接 —— 因为安装包文件名带版本号,写死必然过期。
> 官网刻意不逐个列出上游平台的厂商名:站点只讲接入能力(云端 API / 聚合中转 / 本地推理 / 自定义端点)与协议兼容性,具体清单以应用内「订阅」页和本 README 的「内置提供商」表为准,避免站点与注册表脱节。
## 许可证
本项目基于 [MIT 许可证](./LICENSE) 开源。你可以自由使用、修改、分发和商用本软件,但须保留版权声明与许可证文本。
> Copyright (c) 2026 Vortex