Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,4 @@ test-results/
# VitePress docs build artifacts
docs/.vitepress/dist/
docs/.vitepress/cache/
.claude/scheduled_tasks.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-05-31
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
## Context

AutoRouter 的 CLIProxyAPI 管理页面(`system/cliproxy`)目前包含实例表格和账号面板两个区块,支持实例 CRUD、连通性检测、账号同步/启停/字段编辑、OAuth 登录(3 个 Provider)和上游创建。CLIProxyAPI 原生 WebUI 则额外提供认证文件上传/下载/删除、日志查看、OAuth 回调提交、6 个 Provider 支持等能力。本次变更在现有页面基础上扩展,补齐这些管理能力。

### 当前页面结构

```
┌─────────────────────────────────────────────────┐
│ Topbar: CLIProxyAPI │
├─────────────────────────────────────────────────┤
│ Card: Instances [+ Add] │
│ ┌─────┬──────┬────────────┬────────┬──────────┐ │
│ │Name │ Mode │ Proxy URL │ Status │ Actions │ │
│ ├─────┼──────┼────────────┼────────┼──────────┤ │
│ │ ... │ ... │ ... │ Badge │ ⋯ Menu │ │
│ └─────┴──────┴────────────┴────────┴──────────┘ │
├─────────────────────────────────────────────────┤
│ Card: OAuth Accounts (选中实例后显示) │
│ [OAuth Login] [Sync Accounts] │
│ ┌──────┬──────────┬────────┬───────┬──────────┐ │
│ │ File │ Provider │ Status │Models │ Actions │ │
│ ├──────┼──────────┼────────┼───────┼──────────┤ │
│ │ ... │ Badge │ Badge │ N │ ⋯ Menu │ │
│ └──────┴──────────┴────────┴───────┴──────────┘ │
└─────────────────────────────────────────────────┘
```

## Goals / Non-Goals

**Goals:**

1. 在现有 CLIProxyAPI 管理页面中补齐认证文件管理(上传、下载、删除)、模型列表查看、账号详情查看、OAuth 回调提交、实例日志查看、关联上游查看共 6 个功能区
2. 将 OAuth Provider 从 3 个扩展到 6 个
3. 实例表格增加行内启停切换
4. 所有新增功能复用现有架构模式,保持代码风格一致

**Non-Goals:**

1. 不引入 CLIProxyAPI 的配置管理(config.yaml 读写)——远程修改运行时配置安全风险高
2. 不引入 AI Provider 密钥管理——AutoRouter 的上游管理已覆盖此能力
3. 不引入配额管理——与 AutoRouter 的 billing 系统概念重叠
4. 不引入 Ampcode 集成——小众 Provider,后续按需添加

## Decisions

### D1: 页面布局扩展策略

在现有两个 Card(实例表格 + 账号面板)的基础上,新增两个 Card(关联上游面板 + 日志面板),均在选中实例后显示。页面纵向排列顺序为:实例表格 → 账号面板 → 关联上游面板 → 日志面板。

**备选方案**:使用 Tab 切换不同面板。放弃原因:当前面板数量有限(4 个),纵向排列更符合现有布局风格且一目了然。

### 扩展后页面布局

```
┌──────────────────────────────────────────────────────┐
│ Topbar: CLIProxyAPI │
├──────────────────────────────────────────────────────┤
│ Card: Instances [+ Add] │
│ ┌──────┬──────┬────────────┬────────┬───────────────┐│
│ │Name │ Mode │ Proxy URL │ Status │ Actions ││
│ ├──────┼──────┼────────────┼────────┼───────────────┤│
│ │ ... │ ... │ ... │[Toggle]│ ⋯ Menu ││
│ └──────┴──────┴────────────┴────────┴───────────────┘│
│ ▲ │
│ 行内 Switch 启停切换 │
├──────────────────────────────────────────────────────┤
│ Card: OAuth Accounts (选中实例后) │
│ [OAuth Login] [Upload Auth File] [Sync Accounts] │
│ ┌──────┬────────┬──────┬───────┬──────┬─────────────┐│
│ │ File │Provider│Status│Models │Prefix│ Actions ││
│ ├──────┼────────┼──────┼───────┼──────┼─────────────┤│
│ │ ... │ Badge │Badge │ N 👁 │ ... │⋯ Menu ││
│ └──────┴────────┴──────┴───────┴──────┴─────────────┘│
│ ▲ │
│ 模型数可点击查看列表;Menu 增加详情/删除 │
├──────────────────────────────────────────────────────┤
│ Card: Linked Upstreams (选中实例后) │
│ ┌──────────────┬──────────┬────────────┬────────────┐│
│ │ Upstream Name│ Provider │ Type │ Account ││
│ ├──────────────┼──────────┼────────────┼────────────┤│
│ │ ... Pool │ codex │ Pool │ — ││
│ │ ... Account │ anthropic│ Single │ alice.json ││
│ └──────────────┴──────────┴────────────┴────────────┘│
├──────────────────────────────────────────────────────┤
│ Card: Instance Logs (选中实例后) │
│ [Refresh] 搜索框 时间范围选择 │
│ ┌────────────────────────────────────────────────────┐│
│ │ 2025-05-31 10:23:45 [INFO] request forwarded ... ││
│ │ 2025-05-31 10:23:46 [WARN] auth token expired ... ││
│ │ ... ││
│ └────────────────────────────────────────────────────┘│
└──────────────────────────────────────────────────────┘
```

### D2: 管理 API 客户端扩展方式

在现有 `cliproxy-management-client.ts` 中新增 5 个方法:`deleteAuthFile`、`uploadAuthFile`、`downloadAuthFile`、`submitOAuthCallback`、`getLogs`。保持与现有方法相同的模式:接受 `CliproxyManagementTarget`、调用 `requestManagementApi`、返回类型化结果。

`downloadAuthFile` 较特殊,返回的是原始 JSON 文本而非解析后的对象,需要在 `requestManagementApi` 之外单独处理响应。

### D3: OAuth Provider 扩展方式

在 `cliproxy-management-client.ts` 中扩展 `CLIPROXY_OAUTH_PROVIDERS` 常量和 `AUTH_URL_ENDPOINT` 映射。新增 Provider 对应的端点为:

| Provider | 端点片段 | 特殊参数 |
|----------|----------|----------|
| xAI/Grok | `xai-auth-url` | 无 |
| Antigravity | `antigravity-auth-url` | 无 |
| Kimi | `kimi-auth-url` | 无(无自动回调,需配合 OAuth callback 手动提交) |

前端 `CLIPROXY_PROVIDERS` 类型和 UI 选项列表同步扩展。`cliproxy-upstream-preset.ts` 中的 `CLIPROXY_UPSTREAM_PRESETS` 暂不扩展(新 Provider 的路径约定尚未确定),池上游创建仍限于原有 3 个 Provider。

**备选方案**:同时扩展 upstream preset 支持 6 个 Provider。放弃原因:xAI/Antigravity/Kimi 的 CLIProxyAPI 路径后缀和路由能力尚未有稳定约定,留作后续独立变更。

### D4: Admin 路由组织

新增路由全部放在 `src/app/api/admin/cliproxy/instances/[id]/` 下,保持与现有路由树一致:

```
instances/[id]/
├── auth-accounts/... (existing)
├── oauth-login/... (existing)
├── pool-upstreams/ (existing)
├── test/ (existing)
├── auth-files/ (NEW)
│ ├── route.ts POST: upload
│ └── [name]/
│ ├── route.ts GET: download, DELETE: delete
├── oauth-callback/ (NEW)
│ └── route.ts POST: submit callback
├── logs/ (NEW)
│ └── route.ts GET: fetch logs
└── linked-upstreams/ (NEW)
└── route.ts GET: list linked upstreams
```

### D5: 认证文件删除与本地缓存清理

删除操作分两步:先调用 CLIProxyAPI `DELETE /v0/management/auth-files` 删除上游文件,成功后删除本地 `cliproxy_auth_accounts` 中对应的缓存记录。CLIProxyAPI 侧删除失败则整体失败,不触及本地缓存。

### D6: 日志面板实现

日志面板使用简单的增量拉取模式(`GET /v0/management/logs`),由前端手动刷新或设置自动刷新间隔。日志内容以等宽字体渲染,支持关键词筛选(前端过滤)。不使用 SSE 或 WebSocket 实时推送,保持实现简单。

**备选方案**:日志实时推送。放弃原因:CLIProxyAPI 管理 API 不提供日志推送端点,且 AutoRouter 在中间层做推送会增加不必要的复杂度。

### D7: 关联上游面板数据来源

直接查询 AutoRouter 本地 `upstreams` 表中 `cliproxyInstanceId` 匹配所选实例的记录。不需要调用 CLIProxyAPI 管理 API。查询结果包含上游名称、Provider、类型(池/单账号)、绑定的账号文件名。

## Risks / Trade-offs

**[CLIProxyAPI 版本兼容]** → 新增的管理 API 端点(auth-files 上传/下载/删除、oauth-callback、logs)可能在旧版本 CLIProxyAPI 中不存在。采用防御性处理:管理 API 调用失败时返回可理解的错误信息,不影响其他功能。

**[认证文件上传安全]** → 上传的 JSON 可能包含恶意内容。AutoRouter 仅做格式校验(合法 JSON),实际内容由 CLIProxyAPI 负责校验和处理。Admin API 本身需要 ADMIN_TOKEN 鉴权,风险可控。

**[日志体积]** → CLIProxyAPI 日志可能较大。前端限制单次拉取行数(默认 200 行),并支持时间范围过滤以控制返回体积。

**[新 Provider 无 upstream preset]** → xAI/Antigravity/Kimi 暂不支持一键创建池上游。OAuth 登录和账号管理可正常使用,上游创建需通过通用上游管理界面手动配置。
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
## Why

CLIProxyAPI 原生 WebUI(Management Center)提供了 8 个功能页面(仪表盘、配置管理、Provider 密钥、认证文件管理、OAuth 登录、配额管理、日志、系统信息),而 AutoRouter 当前仅覆盖了实例 CRUD、账号同步/启停/字段编辑和 3 个 Provider 的 OAuth 登录。管理员在日常运维中需要频繁切换到 CLIProxyAPI 原生面板完成认证文件管理、日志查看、模型列表查看等操作,体验割裂且效率低下。本次变更将 CLIProxyAPI 原生面板中最高价值的管理能力集成到 AutoRouter 管理端,使管理员在单一界面内完成绝大多数 CLIProxyAPI 运维操作。

## What Changes

### 前端增强(后端已有数据或接口,仅需前端入口)

- 账号表格增加**模型列表查看**操作,弹窗展示该账号可用的具体模型列表(后端 `getAuthFileModels` 已实现)
- 账号表格增加**详情查看**操作,弹窗展示 email、status、status_message、raw_metadata 快照、last_synced_at 等完整元数据
- CLIProxyAPI 页面增加**关联上游**面板,展示某实例下所有关联的池上游和单账号上游(upstreams 表已有 `cliproxyInstanceId` 字段)
- 实例表格行内增加**快捷启停切换**,无需打开编辑弹窗

### 新增后端路由与前端(管理 API 透传至 CLIProxyAPI)

- **认证文件删除**:透传 `DELETE /v0/management/auth-files` 到 CLIProxyAPI,同时移除本地缓存
- **认证文件上传**:透传 `POST /v0/management/auth-files` 到 CLIProxyAPI,上传 JSON 格式认证文件并触发同步
- **认证文件下载**:透传 `GET /v0/management/auth-files/download?name=...`,下载认证文件原始 JSON
- **OAuth 回调 URL 手动提交**:透传 `POST /v0/management/oauth-callback`,在自动回调不可达时允许管理员手动粘贴回调 URL 完成登录
- **CLIProxyAPI 实例日志查看**:透传 `GET /v0/management/logs`,在 AutoRouter 管理端按时间范围查看 CLIProxyAPI 运行日志

### OAuth Provider 扩展

- 将 OAuth 登录支持的 Provider 从 3 个(Codex、Anthropic、Gemini)扩展到 6 个,新增 xAI/Grok、Antigravity、Kimi

## Capabilities

### New Capabilities

- `cliproxy-auth-file-operations`: 认证文件的上传、下载、删除操作,涵盖管理 API 客户端扩展、Admin 路由、前端弹窗
- `cliproxy-instance-logs`: CLIProxyAPI 实例日志查看,涵盖管理 API 客户端扩展、Admin 路由、前端日志面板
- `cliproxy-oauth-callback`: OAuth 回调 URL 手动提交,涵盖管理 API 客户端扩展、Admin 路由、前端输入弹窗

### Modified Capabilities

- `cliproxy-admin-ui`: 实例表格增加行内启停切换、页面增加关联上游面板
- `cliproxy-oauth-account-management`: 账号表格增加模型列表查看和详情查看操作、OAuth Provider 列表从 3 个扩展到 6 个

## Impact

**后端**
- `cliproxy-management-client.ts`:新增 `deleteAuthFile`、`uploadAuthFile`、`downloadAuthFile`、`submitOAuthCallback`、`getLogs` 5 个上游调用方法;`CLIPROXY_OAUTH_PROVIDERS` 常量从 3 项扩展到 6 项,`AUTH_URL_ENDPOINT` 对应扩展
- `cliproxy-auth-account-service.ts`:新增 `deleteCliproxyAuthAccount` 方法(删除上游认证文件后移除本地缓存)
- 新增 Admin 路由:`instances/[id]/auth-files/upload`、`instances/[id]/auth-files/[name]/download`、`instances/[id]/auth-files/[name]/delete`、`instances/[id]/oauth-callback`、`instances/[id]/logs`
- `cliproxy-instance-crud.ts`:新增 `toggleCliproxyInstanceEnabled` 快捷方法
- 新增 Admin 路由:`instances/[id]/upstreams`(查询关联上游)

**前端**
- 新增组件:`cliproxy-account-models-dialog.tsx`、`cliproxy-account-detail-dialog.tsx`、`cliproxy-auth-file-upload-dialog.tsx`、`cliproxy-auth-file-download-button.tsx`、`cliproxy-oauth-callback-dialog.tsx`、`cliproxy-instance-logs-panel.tsx`、`cliproxy-linked-upstreams-panel.tsx`
- 修改组件:`cliproxy-instances-table.tsx`(行内启停)、`cliproxy-accounts-table.tsx`(新增模型/详情/删除操作)、`cliproxy-accounts-panel.tsx`(新增上传按钮)、`cliproxy-oauth-login-dialog.tsx`(6 个 Provider)
- `use-cliproxy.ts`:新增对应的 hooks
- `src/types/cliproxy.ts`:新增类型定义
- `src/messages/en.json` 和 `zh-CN.json`:新增国际化文案
Loading
Loading