diff --git a/.helloagents/CHANGELOG.md b/.helloagents/CHANGELOG.md index eef62b4..7ac114b 100644 --- a/.helloagents/CHANGELOG.md +++ b/.helloagents/CHANGELOG.md @@ -29,6 +29,9 @@ - **[usage/proxy]**: 使用日志记录上游失败详情并在日志状态列展示 - 方案: [202603141815_usage-log-status](archive/2026-03/202603141815_usage-log-status/) - 文件: apps/worker/migrations/0005_add_usage_error_fields.sql, apps/worker/src/db/schema.sql, apps/worker/src/services/usage.ts, apps/worker/src/routes/proxy.ts, apps/ui/src/core/types.ts, apps/ui/src/core/utils.ts, apps/ui/src/features/UsageView.tsx, tests/ui/usage-status.test.ts, .helloagents/modules/usage.md, .helloagents/modules/admin-ui.md +- **[admin-ui/usage]**: 状态列改为“状态码 + 错误码”,成功展示 `200 OK` + - 方案: [202603141925_usage-status-label](archive/2026-03/202603141925_usage-status-label/) + - 文件: apps/worker/src/routes/proxy.ts, apps/ui/src/core/utils.ts, apps/ui/src/features/UsageView.tsx, tests/ui/usage-status.test.ts, .helloagents/modules/usage.md, .helloagents/modules/admin-ui.md - **[worker/proxy]**: 移除临时调试日志(请求入口/出口与上游响应汇总) - 类型: 微调(无方案包) - 文件: apps/worker/src/index.ts, apps/worker/src/routes/proxy.ts @@ -168,6 +171,62 @@ - 类型: 微调(无方案包) - 文件: apps/worker/src/routes/proxy.ts +### 快速修改 + +- **[admin-ui]**: 修复模型广场渲染语法错误 — by lsy + - 类型: 快速修改(无方案包) + - 文件: apps/ui/src/features/ModelsView.tsx:16 +- **[admin-ui]**: 站点搜索加入防抖与使用日志状态码/摘要展示优化 — by lsy + - 类型: 快速修改(无方案包) + - 文件: apps/ui/src/features/SitesView.tsx, apps/ui/src/core/utils.ts, apps/ui/src/features/UsageView.tsx +- **[admin-ui]**: 提交操作增加即时防重复锁,避免连点重复创建 — by lsy + - 类型: 快速修改(无方案包) + - 文件: apps/ui/src/App.tsx + +## [0.9.4] - 2026-03-15 + +### 变更 +- **[usage/admin-ui]**: 使用日志改为服务端分页并支持渠道/令牌/模型搜索 — by lsy + - 方案: [202603150145_usage-log-pagination-and-channel-disable](archive/2026-03/202603150145_usage-log-pagination-and-channel-disable/) + - 决策: usage-log-pagination-and-channel-disable#D001(使用 offset+limit+total 分页协议) +- **[channels]**: 连通性测试不再覆盖已禁用渠道状态 — by lsy + - 方案: [202603150145_usage-log-pagination-and-channel-disable](archive/2026-03/202603150145_usage-log-pagination-and-channel-disable/) + +## [0.9.2] - 2026-03-14 + +### 变更 +- **[usage/proxy]**: 状态列仅展示日志状态码并支持错误详情查看,冷却改为窗口内连续失败触发 — by lsy + - 方案: [202603142337_usage-status-cooldown-tuning](archive/2026-03/202603142337_usage-status-cooldown-tuning/) + - 决策: usage-status-cooldown-tuning#D001(连续失败阈值冷却) + +## [0.9.1] - 2026-03-14 + +### 变更 +- **[proxy/models/settings/admin-ui]**: 移除模型能力 TTL,路由不再兜底并支持失败冷却配置 — by lsy + - 方案: [202603142241_remove-model-ttl-fix-routing](archive/2026-03/202603142241_remove-model-ttl-fix-routing/) + - 决策: remove-model-ttl-fix-routing#D001(移除模型能力 TTL) + +## [0.9.2] - 2026-03-15 + +### 变更 +- **[proxy/usage/admin-ui]**: 冷却仅对上游失败触发,使用日志列表仅展示状态码 — by lsy + - 方案: [202603150017_usage-status-cooldown-migration](archive/2026-03/202603150017_usage-status-cooldown-migration/) + - 决策: usage-status-cooldown-migration#D001(冷却仅针对上游/网络失败) + +## [0.9.3] - 2026-03-15 + +### 变更 +- **[proxy/usage]**: 所有调用写入日志,失败计数仅在成功时清零 — by lsy + - 方案: [202603150017_usage-status-cooldown-migration](archive/2026-03/202603150017_usage-status-cooldown-migration/) + - 决策: usage-status-cooldown-migration#D001(冷却仅针对上游/网络失败) + +## [0.9.0] - 2026-03-14 + +### 新增 +- **[admin-ui]**: 管理台体验升级(通知分级、确认弹窗、空状态 CTA、视觉主题与动效) — by lsy + - 方案: [202603142024_admin-ui-ux-upgrade](archive/2026-03/202603142024_admin-ui-ux-upgrade/) + - 决策: admin-ui-ux-upgrade#D001(统一通知与确认对话管理) + ## [0.8.4] - 2026-02-25 ### 变更 diff --git a/.helloagents/modules/admin-ui.md b/.helloagents/modules/admin-ui.md index f7472ba..956fc39 100644 --- a/.helloagents/modules/admin-ui.md +++ b/.helloagents/modules/admin-ui.md @@ -24,16 +24,25 @@ - openai/Anthropic/gemini 站点支持 base_url 为空时自动填充官方地址 - done-hub 站点仅使用 base_url,不再维护多地址输入 - 站点连通测试提示令牌成功/失败统计 -- 使用日志支持本地分页(默认 50 条)与固定高度滚动,并展示令牌、输入/输出 tokens、首 token 延迟、流式与推理强度 -- 使用日志状态列展示详细失败原因(状态码/错误码/摘要) -- 令牌管理采用列表视图(默认每页 10 条),生成令牌使用弹窗表单,并展示创建时间与前缀 +- 站点新增/修改完成后自动触发连通测试并提示结果 +- 使用日志支持服务端分页(默认 50 条)与固定高度滚动,并展示令牌、输入/输出 tokens、首 token 延迟、流式与推理强度 +- 使用日志支持按渠道/令牌/模型/状态码搜索并与分页联动 +- 使用日志状态列仅展示状态码,错误详情弹窗仅展示元信息(不展示错误片段) +- 令牌管理采用列表视图(默认每页 10 条),生成/编辑使用弹窗表单,支持过期时间(北京时间)与允许渠道(默认全开)并默认复制,列表展示创建时间、前缀、过期时间与渠道限制摘要 - 站点管理内置一键签到入口,展示今日签到结果(基于后台写回的 `last_checkin_*`) - 系统设置增加定时签到开关与时间(中国时间) +- 系统设置提供模型失败冷却分钟数配置 - 列表分页页脚统一使用页码导航 + 每页条数选择,并显示总页数,顶部不显示条数与每页选择 - Token 仅本地保存,不回显 - 移动端使用顶部栏 + 抽屉导航,侧边栏在桌面端保持固定 - 渠道/令牌列表在移动端以卡片形式展示,操作区改为网格按钮排列 - 数据面板、模型广场、使用日志表格在移动端支持横向滚动与字号收紧 +- 全局通知支持成功/提示/错误/信息分级展示,可关闭并自动消退 +- 删除类操作必须经过确认弹窗 +- 主要异步操作提供 loading 与按钮禁用态 +- 弹窗支持遮罩/ESC 关闭并自动聚焦首字段 +- 空状态提供清晰 CTA 引导下一步 +- 全局字体通过外部字体源加载,背景包含暖调渐变与轻纹理 ## 依赖关系 - `auth` / `channels` / `models` / `tokens` / `usage` / `dashboard` / `settings` 模块 diff --git a/.helloagents/modules/channels.md b/.helloagents/modules/channels.md index 712b0ea..51b4514 100644 --- a/.helloagents/modules/channels.md +++ b/.helloagents/modules/channels.md @@ -29,6 +29,7 @@ - 创建渠道时可传入自定义 `id`,未提供则自动生成 - 连通性测试会对调用令牌逐个调用 `/v1/models` 并汇总模型 - 至少一枚令牌测试成功时更新 `models_json` 并返回成功/失败统计 +- 连通性测试不会覆盖已禁用渠道的状态(保持 `disabled`) - New API 兼容层支持 `type`/`group`/`priority` 等字段映射,并保留扩展字段到 `metadata_json` - New API 标签(tag)存储在 `metadata_json.tag`,标签接口按该字段批量更新 - New API 分组列表从 `group_name` 字段解析,空时返回 `default` diff --git a/.helloagents/modules/models.md b/.helloagents/modules/models.md index 78cc506..cce144f 100644 --- a/.helloagents/modules/models.md +++ b/.helloagents/modules/models.md @@ -11,7 +11,6 @@ ## 行为规范 - 仅聚合启用状态的渠道 - 使用“模型广场测试结果”作为可用模型来源 -- 模型结果带 TTL(默认 2 小时,来自 settings),过期后回退到渠道声明模型列表(避免模型广场清空) - 模型归一化支持字符串数组与对象数组(对象取 `id` 字段) ## 依赖关系 diff --git a/.helloagents/modules/proxy.md b/.helloagents/modules/proxy.md index fda1332..c9b13d3 100644 --- a/.helloagents/modules/proxy.md +++ b/.helloagents/modules/proxy.md @@ -14,7 +14,8 @@ ## 行为规范 - 基于令牌鉴权 - 按渠道权重随机排序 -- 调用令牌按顺序选择,未配置时回退 `channels.api_key` +- 调用令牌按模型列表匹配选择,未配置或无列表时回退 `channels.api_key` +- 调用令牌模型列表来自渠道连通测试写回 - done-hub 仅使用 `base_url`,不再按多地址切换 - 支持从非流式 JSON、响应头与流式 SSE(含 `response.usage` 与 `usageMetadata`)解析 usage 字段 - 流式请求自动补 `stream_options.include_usage=true` 以便上游返回 usage @@ -26,8 +27,12 @@ - 允许 `metadata_json.endpoint_overrides` 覆盖 chat/embedding/image 上游地址(可用 `{model}` 占位) - 允许 `metadata_json.header_override` 与 `metadata_json.query_override` 注入额外上游请求头/查询参数 - Anthropic 默认注入 `anthropic-version=2023-06-01`,可通过 `header_override` 覆盖 -- 路由时优先使用模型能力表(TTL 内测试成功的模型),无能力记录时回退渠道声明模型列表 -- 上游失败/超时会记录到能力表并进入冷却期,冷却期内跳过对应渠道/模型 +- 路由时优先使用模型能力表记录(测试成功的模型),无能力记录时回退渠道声明模型列表 +- 当模型在任意渠道中都不被支持时返回 `no_available_channels`,不回退到全部渠道 +- 上游失败/超时会记录到能力表并进入冷却期(需在窗口内连续失败达到阈值),冷却期内跳过对应渠道/模型 +- 失败计数仅在成功响应时清零 +- 仅 429/5xx/408/timeout/exception 计入冷却,4xx 请求错误不触发冷却 +- 映射模型场景失败时同时记录下游模型错误,确保冷却窗口生效 - 上游成功响应会刷新能力表,清空错误并延长可用窗口 ## 依赖关系 diff --git a/.helloagents/modules/settings.md b/.helloagents/modules/settings.md index 632ed29..20e7728 100644 --- a/.helloagents/modules/settings.md +++ b/.helloagents/modules/settings.md @@ -4,7 +4,6 @@ - 维护系统级配置(如日志保留天数) - 为使用日志与面板提供统一配置读取 - 维护定时签到执行时间 -- 维护模型能力 TTL(模型广场与路由过滤窗口) - 维护模型失败冷却时间(运行时失败的渠道/模型冷却窗口) ## 接口定义 @@ -17,7 +16,6 @@ - 定时签到时间使用 `HH:mm` 格式(默认 `00:10`,中国时间) - 更新签到时间后会触发 `CheckinScheduler` 重新调度 - 若更新后当前时间已超过新签到时间,当日可再次触发自动签到 -- 模型能力 TTL 以小时计(默认 2 小时),用于控制“模型广场测试结果”的有效期 - 模型失败冷却以分钟计(默认 10 分钟),用于跳过最近失败的渠道/模型 ## 依赖关系 diff --git a/.helloagents/modules/tokens.md b/.helloagents/modules/tokens.md index a6e6f80..e4fca1d 100644 --- a/.helloagents/modules/tokens.md +++ b/.helloagents/modules/tokens.md @@ -15,8 +15,13 @@ ## 行为规范 - 令牌可通过 reveal 接口再次查看 - 默认允许所有渠道 +- 可选限制允许的渠道列表(`allowed_channels`),为空或未设置表示全开 - 额度消耗由代理调用记录 -- 管理台列表展示创建时间与 key_prefix 前缀 +- `expires_at` 为可选字段,留空表示永不过期 +- 管理台以北京时间输入过期时间,服务端统一转为 UTC 存储 +- 令牌过期后直接拒绝请求(`token_expired`),不自动更改状态 +- 管理台支持编辑名称/额度/状态/过期时间/允许渠道,新增令牌默认复制到剪贴板 +- 管理台列表展示创建时间与 key_prefix 前缀、过期时间 ## 依赖关系 - `tokens` 表 diff --git a/.helloagents/modules/usage.md b/.helloagents/modules/usage.md index d90d9b6..132a1be 100644 --- a/.helloagents/modules/usage.md +++ b/.helloagents/modules/usage.md @@ -9,12 +9,14 @@ - `GET /api/usage` 使用日志查询 ## 行为规范 -- 代理调用统一写入 `usage_logs` +- 代理调用统一写入 `usage_logs`(含无可用渠道/冷却提前返回) - 保留天数可配置,查询时触发清理 - 查询结果附带渠道与令牌名称 +- `GET /api/usage` 支持 `offset/limit` 分页并返回 `total` +- 支持按 `model/channel/token/status` 关键词搜索(保留 `channel_id/token_id` 精确过滤) - usage_logs 记录输入/输出 tokens、首 token 延迟、流式标记与推理强度 - 推理强度来自请求体 `reasoning` / `reasoning_effort` 字段 -- usage_logs 记录上游失败详情(status/code/message),用于日志状态展示 +- usage_logs 记录上游失败详情(status/code/message),日志列表仅展示状态码,详情弹窗仅展示元信息(不展示错误片段) ## 依赖关系 - `usage_logs` 表 diff --git a/apps/ui/index.html b/apps/ui/index.html index ba117e7..94a0a86 100644 --- a/apps/ui/index.html +++ b/apps/ui/index.html @@ -6,6 +6,13 @@ name="viewport" content="width=device-width, initial-scale=1.0" /> + + + +
+ {confirmState.message} +
++ 查看请求量、消耗与性能趋势。 +
++ 快速掌握请求表现、性能与消耗概况。 +
+请输入管理员密码登录管理台。
- +按回车键可快速提交。
+ {notice && ( ++ 当前聚合的模型与所属渠道清单。 +
+| + 模型 + | ++ 渠道 + | +
|---|---|
| + {model.id} + | ++ {model.channels.map((channel) => channel.name).join(" / ")} + | +
| - 模型 - | -- 渠道 - | -
|---|---|
| - {model.id} - | -- {model.channels.map((channel) => channel.name).join(" / ")} - | -
+ 同一模型失败后在该时间内跳过对应渠道。 +
+