fix: 修正访问控制与插件契约

This commit is contained in:
chuan
2026-08-15 17:17:08 +08:00
parent 660d215a06
commit 072ed8f168
19 changed files with 180 additions and 410 deletions
+1 -1
View File
@@ -132,7 +132,7 @@
| `quota_change` | 管理员修改本周期额度 | 增加为正,减少为负 |
| `cycle_reset` | 自动或手动开始新周期 | 新周期完整额度 |
每条账目保存用户 Key、额度周期、变动金额、变动后余额和发生时间请求扣费还会保存 Request IDExecution ID 和模型
每条账目保存用户 Key、额度周期、变动金额、变动后余额和发生时间请求扣费还会保存模型。账目结构预留 Request IDExecution ID,但当前目标 CPA 的 Usage 契约不提供这两个字段,因此实际扣费账目通常为空,不使用时间推测结果改写不可变账目
账目只追加、不修改、不删除,并通过唯一事件标识避免重复写入。额度状态用于快速读取当前余额,账目用于解释余额变化过程。
+11 -11
View File
@@ -26,19 +26,20 @@ CLIProxyAPI 会通过两个独立回调提供请求信息:
| 事实 | 来源 | 主要内容 |
| --- | --- | --- |
| 请求终态 | `request.complete` | Request ID、开始与结束时间、成功/失败/拒绝/取消、状态码和错误 |
| 最终用量 | `usage.handle` | Execution ID、实际上游、模型、Token、延迟和 Usage 结果 |
| 最终用量 | `usage.handle` | 实际上游、模型、Token、延迟和 Usage 结果 |
这两个回调可能乱序、重复或只到达其中一个,因此数据库分别保存原始事实,再建立请求明细查询投影。管理台看到的一行是查询结果,不会为了合并展示而修改原始事实或计费账目。
## 请求与重试
## 请求关联与独立用量
- Request ID 用于关联一次下游请求的生命周期。
- Execution ID 用于区分该请求的具体上游执行
- 同一次请求发生上游重试时,每次真实执行继续分别展示,不会把多个执行的 Token 或成本错误相加为一次执行
- 当前目标 CPA 的 Usage 契约不提供 Request ID 或 Execution IDRequest ID 和 Trace ID 来自独立的请求终态
- 每条可区分的 Usage 事实分别保存,不会为了得到一条整齐记录而把多个用量相加
- 当前契约无法保证把每次上游重试稳定标记为某个 Execution ID,因此管理台不声明这种保证。
- 没有 Usage 的拒绝、取消或失败请求仍然显示请求终态。
- 只有 Usage、暂时没有终态的记录也可以单独显示,终态到达后投影会自动更新。
部分旧版回调可能缺少 Request ID。系统仅在请求时间足够接近且匹配关系唯一时,将 Usage 与终态合并;存在并发歧义时宁可保留为两条,也不会错误关联到其他用户的请求。
系统仅在模型和请求时间足够接近且匹配关系唯一时,将 Usage 与终态合并;存在并发歧义时宁可保留为两条,也不会错误关联到其他用户的请求。
## 请求结果
@@ -55,19 +56,18 @@ CLIProxyAPI 会通过两个独立回调提供请求信息:
请求明细当前可以展示:
- 请求时间、Request ID、Execution ID、Trace ID
- 请求时间,以及请求终态能够提供的 Request ID 和 Trace ID
- 用户 Key 名称;
- 客户端请求模型和实际计费模型;
- 推理强度服务档位和速度模式
- 推理强度服务档位;
- 请求结果、HTTP 状态码和错误;
- 请求类型与端点;
- 实际上游 Auth ID、Auth Index 和认证类型;
- 首字延迟、生成速度;
- 输入、输出、推理、缓存读取、缓存写入和总 Token;
- 缓存率、成本、价格档位和 Fast 计价结果
- 客户端 IP。
- 缓存率、成本、价格档位和 Fast 计价结果
并非每种端点都能提供所有字段。字段无法由 CPA 回调可靠获得时保留为空,不使用猜测值。一次性 JSON/Compact 响应不展示不可比较的首字延迟和生成速度。
并非每种端点都能提供所有字段。管理接口为兼容历史数据保留 Execution ID、速度模式和客户端 IP 等可选字段,但当前目标 CPA 不提供这些值;字段无法可靠获得时保留为空,不使用猜测值。一次性 JSON/Compact 响应不展示不可比较的首字延迟和生成速度。
## 服务端分页
@@ -113,7 +113,7 @@ CLIProxyAPI 会通过两个独立回调提供请求信息:
## 数据一致性
- Usage 插入使用稳定事件标识,重复回调不会重复记录或扣费。
- Usage 插入使用内容事件标识,完全相同的重复回调不会重复记录或扣费。
- 请求终态按 Request ID 幂等更新。
- 回调乱序时,后到达的事实会重新同步查询投影。
- 失败、取消和孤立 Usage 不会为了界面整齐而被删除。
+3 -4
View File
@@ -75,11 +75,10 @@ Key 值允许 1–256 个非空白、非控制字符。未手动填写时,系
出现以下情况时,请求返回 HTTP 503 和错误码 `bound_upstream_unavailable`
- 绑定的账号已经不存在;
- 绑定账号被禁用或处于不可用状态
- 绑定账号不在本次请求的可用候选中;
- 绑定账号不在本次 CPA 实时可用候选中
- 调度完成后的实际上游与绑定账号不一致。
上游账号信息来自 CLIProxyAPI 的账号列表和实际调度候选插件只保存路由所需的账号标识、提供商、显示名称和状态,不读取或保存上游 Token、Cookie 等凭证内容。
上游账号信息来自 CLIProxyAPI 的账号列表和实际调度候选。持久化状态用于管理台展示,本次调度候选才是请求时的可用性依据,避免账号恢复后被旧状态继续拦截。插件只保存路由所需的账号标识、提供商、显示名称和状态,不读取或保存上游 Token、Cookie 等凭证内容。
## 默认 Key 与新建 Key
@@ -93,7 +92,7 @@ Key 值允许 1–256 个非空白、非控制字符。未手动填写时,系
该行为用于让已有 Codex/CLIProxyAPI 调用配置无需修改即可迁移到插件管理。
之后创建新 Key 时,系统先复制 `default` 当时的模型权限和上游路由,再应用管理员本次明确填写的设置。复制只发生在创建时,后续修改 `default` 不会影响已经创建的 Key。
之后创建新 Key 时,系统按稳定 ID `key_default` 复制默认 Key 当时的模型权限和上游路由,再应用管理员本次明确填写的设置。管理员重命名默认 Key 不影响继承。复制只发生在创建时,后续修改默认 Key 不会影响已经创建的 Key。
如果数据库中已经存在 Key,启动配置不会覆盖或重新创建 `default`