Sakurasan
|
d34d9bd2e6
|
feat(web): 用量明细展示缓存读/写与上游实际模型,补 1h 缓存写与思考口径
API:/api/v1/usage/logs 与 /api/v1/admin/usage 返回 cache_creation_tokens、
reasoning_tokens、cache_write_1h_tokens、served_model(types.ts 同步可选字段)。
前端:
- 模型列在被模型映射/聚合商改写时显示「→ 上游实际模型」,长名截断并可悬浮看全;
- 表格里 Token 列第二行显示缓存读/写(与成本直接相关),1h 缓存写与思考 token
放悬浮提示——两者直接上表格会把 Token 列撑到 255px,1280 宽下把「时间/原始」
挤出视野(实测 1146px vs 容器 1006px);移动卡两行都显示;
- 用量表协议列由 chat/completions 简化为 chat(表头已标明「API 格式」),
时间列改月-日 时:分、完整时间进 title;调整后桌面端表格宽度 1006px,
与容器一致、无横向滚动;
- 顺带修复控制台用量页 Button 未导入(上一页/下一页此前渲染不出来)。
验证:本地 mock 上游 + 临时 sqlite 实例与真实数据实测;1280 桌面与 390 窄屏
截图核对(表格 tableW == 容器宽度);vue-tsc、vitest、eslint、vite build 与
go vet、go test ./... 全绿。
|
2026-10-30 13:53:25 +08:00 |
|
Sakurasan
|
e7f8a5e5ad
|
fix(web): 渠道冷却是按原因分类的,提示不再写死「连续失败 X/3」
后端冷却策略已改成按失败原因区分(余额/配额类首次失败即冷却 30 分钟,其余按连续
进冷却次数指数退避 30s→60s→120s 封顶 10 分钟),前端还停留在「满 3 次进冷却 + 原始
秒数」的旧假设上,管理员看到的提示与真实状态对不上。
- Channel 类型补 cooldown_reason(network | server_error | rate_limited | quota_exhausted)
- 冷却提示带失败原因;配额类额外提示「需充值或换 key」——唯一重试不会自愈的场景,
应当让管理员直接处理而不是等 30 分钟再看
- 连续失败提示去掉硬编码的 /3(触发阈值随原因变化)
- 新增 fmtDur:1800 → 30m、5400 → 1h30m,替代直接显示秒数(附 4 组用例)
|
2026-10-30 02:48:59 +08:00 |
|
Sakurasan
|
854d0f5d8c
|
feat(web): 接入 ESLint 与 vitest,TrendChart hover 读数
- ESLint(flat config,vue essential + ts recommended)接入并清零:
webauthn.ts 标注为刻意的动态类型边界(文件级豁免),theme-init.js
修掉未用的 catch 变量
- vitest + jsdom 接入,build 前置跑测试;覆盖 format 工具、auth store
(token 只存内存、bootstrap 恢复、遗留键清理)、client.ts 401 拦截器
single-flight(自定义 axios adapter 模拟 401→refresh→重放)
- TrendChart:hover 命中区盖满槽位(窄条也可悬停),读数显示在头部行,
标签行联动高亮
- auth store bootstrap 顺手清理旧版 localStorage 遗留的 access token 键
|
2026-10-30 02:04:02 +08:00 |
|
Sakurasan
|
dfe31b5b4f
|
fix(web): 仪表盘 curl 示例模型名改用真实可用模型
硬编码的 gpt-test 让快速开始示例照抄必失败。并发拉取 /user/models
取第一个可用模型,拿不到时退回占位符。
|
2026-10-30 01:42:24 +08:00 |
|
Sakurasan
|
1f8af649ca
|
fix: 收尾 P2——登录恒定耗时、AdminUsage N+1、用量索引重塑与时区缝
- 登录失败路径补 argon2 恒定耗时校验(用户不存在/被禁用与密码错误的时序不可区分,抹掉用户名枚举面)
- AdminUsage 每行 2 次查询改批量预取(100 行分页省 200 次查询)
- usage_logs 补 key_id 索引与 (user,created)/(channel,created) 复合索引(schema v6);AutoMigrate 按名跳过已存在索引,旧库的复合索引需一次性删掉重建,用 system_configs 打标记防 PG 每次启动重演
- 用量统计默认窗口改 UTC(usage_daily 的 date 键是 UTC,非 UTC 服务器上图表窗口偏移一天)
- 注册 email 大小写归一;并发撞唯一索引回查后返回 409 而非 500
- PatchKey 的 name 校验与 CreateKey 对齐(1-64 字符),PATCH 不再能绕过
- TrendChart 条宽不超过槽位(点数多时不再互相重叠),超过 32 个点隐藏标签行
|
2026-10-29 03:05:56 +08:00 |
|
Sakurasan
|
4df2506a74
|
fix(web): access token 移出 localStorage;401 刷新 single-flight 并跳登录页
- access token 只存内存:XSS 拿不到持久凭据;刷新页面由 bootstrap 用 HttpOnly refresh cookie 静默换新;bootstrap 并发去重
- 并发 401 共享一次刷新(refresh 已是轮换式,各自刷新会互相踩);会话失效自动回登录页
- 防主题闪烁内联脚本挪到外部 theme-init.js(配合 CSP script-src 'self')
- 修 console 用量页与管理用户搜索的查询参数未编码;极小金额不再显示科学计数法;渠道表单数字输入清空后省略字段而非提交 0(权重 0 的渠道永远选不中)
- 改密成功后主动清会话回登录页(后端已递增 token_version,当前会话已作废)
|
2026-10-29 02:56:52 +08:00 |
|
Sakurasan
|
75c8ecd519
|
fix: 列表页卡片与表格的切换点抬到 lg,补上用户管理的移动端视图
手机上"溢出屏幕"的两个真因(375 / 769 / 1100 三档实测):
- 卡片↔表格切换卡在 md(768px),而侧栏也在 768 出现,吃掉 224px 加 48px 内边距后
内容区只剩 495px,渠道表自然宽 1097px —— 横屏手机、小平板、分屏(768~1023)
整张表被塞进 495px 的盒子里横向滚。改为 lg(1024px) 起才用表格;769px 实测
可见表格数为 0、docSW 等于视口宽。
- 用户管理页只有 720px 的表格、没有卡片回退,手机上只能横向滑整张表。
补移动端卡片(用户名/邮箱、角色与状态、ID/余额/注册时间、编辑与调余额),
表格改 hidden lg:block;1100px 实测 client=826 / scroll=826,铺满不滚。
- 顺带修掉上次改动留下的挤列问题:渠道表"近N小时"列被表格自动布局压到 95px
(min-w 只约束整表、不保证单列),四个指标折成 4 行。该列加 min-w-[190px]、
指标拆两行,并把 Key 并入名称行、启用并入健康行,8 列减到 6 列
(colspan 同步 7→6),自然宽 1125 → 1053。
编辑渠道弹窗 375px 下无溢出元素。遗留:渠道表在 1024~1325 视口仍需容器内横向滚动
(6 列数据表的固有行为,不动整页),卡片列表在 640~1023 仍是单列。
|
2026-10-19 09:25:52 +08:00 |
|
Sakurasan
|
c39c3e7da4
|
feat: 补齐上游细节、渠道观测与模型定价元数据
- 上游 429 的 Retry-After 转成渠道冷却时长(夹在 10 分钟内;比默认值短则不缩短,
否则 1s 就把坏渠道放回轮转)。失败计数改由 proxyOne 就地报——只有它读得到响应头。
- 故障转移时间预算 OT_PROXY_FAILOVER_BUDGET(默认 30s):只约束第二个及以后的渠道,
首个不受限(长回答本就要跑几分钟),但坏渠道不再把客户端拖到 N×timeout。
- 流式空闲心跳 OT_PROXY_STREAM_HEARTBEAT(默认 15s):补一行 SSE 注释 `: ping`,
防止 nginx/Cloudflare 的空闲超时掐掉长思考。心跳与正文共用一把写的锁,
gin 的 ResponseWriter 不是并发安全的;注释行不进转换也不计费。
- 渠道观测:GET /api/v1/admin/channels/stats?window=5m|1h|6h|24h|7d 聚合请求量、
成功率、P50/P95/max 延迟、成本与 top_errors;分位只取成功样本,canceled(客户端
主动断开)不计入渠道错误率。渠道页桌面表格加「近N小时」列、移动端加同内容条,
顶部可切窗口。
- 修一个让统计瞎掉的归因问题:全部渠道失败时 recordError 传的是 nil,
usage_logs 里 channel_id=0,这类失败在渠道维度完全看不见。改为归到最后一个
真正试过的渠道。
- 模型定价与元数据:Model 新增 cache_write_price(0 则回退输入价×1.25,可显式配
Anthropic 1h 的 ×2)、context_length 与 supports_tools/vision/reasoning;
finishUsage 走 CacheWritePriceOr()。/v1/models 叠加用户与密钥白名单过滤
(原来会把限制外的模型名直接泄漏在列表里)并返回元数据,价格不外泄。
- /v1/models 的 Anthropic 分支原是死代码:协议只按路径判,而两种客户端共用这个路径。
改为按 x-api-key / anthropic-version 头判,OpenAI SDK 从不发这两个头,互不影响。
- NewGateway 的十个位置参数换成 Options 结构体(三个 Duration 两个 int,传错编译期发现不了)。
新增 6 个用例:Retry-After 两种写法与夹顶、重试预算截止、空闲心跳出帧、
/v1/models 过滤与双形状、缓存写价两条路径、失败归因。
|
2026-10-17 04:09:39 +08:00 |
|
Sakurasan
|
d4c5263f1e
|
feat: 运行期渠道冷却可见并可手动恢复
运行期冷却只存在网关进程内存里,DB 的 health_status 看不见它:渠道被踢到
30s 冷却后,管理后台仍显示 healthy,模型也照常出现在 /v1/models,但请求
返回 503 no_channel,管理员只能去翻日志。
- channel.Service 增 RuntimeState(连续失败次数 + 冷却剩余)与 ClearRuntime;
Gateway 包装出 ChannelRuntime / RecoverChannel 供管理端调用。
- GET /api/v1/admin/channels 每项返回 runtime_fails 与 cooldown_seconds。
- 新增 POST /api/v1/admin/channels/:id/recover:清运行期冷却与失败计数,并把
探测写的 health_status 置回 healthy;不改 enabled,上游若真挂着,下一次探测
或再连续 3 次请求失败会重新把它踢掉。
- 渠道页健康列下方显示「冷却中 Ns」/「连续失败 n/3」,仅在冷却或探测不健康时
出现「立即恢复」按钮(卡片与桌面表格两套布局都覆盖)。
仍未处理:冷却到期是裸恢复、没有 half-open 试探;计数是进程内的,多实例各自
为战,要共享得等 Redis 那一步。
|
2026-10-17 01:19:03 +08:00 |
|
Sakurasan
|
e865f69a41
|
fix: 修掉模型调用链路上的四处失效逻辑
- 超时:NewGateway 里 gw_timeout*time.Second 把已是 Duration 的值二次换算,
int64 溢出后无论 OT_PROXY_TIMEOUT 填多少都等于没有超时,渠道 timeout_ms
也从没被读过。现在非流式用 context deadline 约束整段时长,流式只约束首包
(Transport.ResponseHeaderTimeout),正文不限时长,长回答不会被砍。
- 断连:上游请求改用 NewRequestWithContext 绑定客户端 context,客户端断开即
取消上游并记 canceled,不再空转生成继续付费;PATCH 已写 200 头后不再往
响应里追加错误体。
- 白名单:APIKey.AllowedModels 以前只存不用,现在 Auth 注入 context 并参与
判定(用户黑名单 > 密钥白名单 > 用户白名单 > 全局)。
- 选路:模型已有渠道绑定时只用绑定渠道,都不可用直接 503 no_channel,不再
把请求发给不认识它的渠道;新增运行期健康(连续 3 次网络错误/超时/429/5xx
进 30s 冷却,成功清零),与 60s 一次的 /models 探测互补。
- 密钥 API:PATCH 回显更新后的完整对象;限额填 0 统一视为不限制(原来
token 配额存 0 会让密钥第一次请求就被 429 打死,而请求配额存 0 又等于
不限制,两个字段语义相反);前端编辑框总是提交白名单,清空能真的取消。
测试:新增 proxy 链路集成测试(超时生效、流式不被截断、断连取消并记账、
密钥白名单 403、连续 429 后候选剔除)与 channel 用例(绑定模型不退全局、
冷却阈值与到期恢复、成功清零)。
|
2026-10-16 19:15:51 +08:00 |
|
Sakurasan
|
5cb428bba9
|
feat: increase default timeout to 5 minutes
|
2026-08-31 16:56:18 +08:00 |
|
Sakurasan
|
3a836bf0e9
|
fix: curl 示例复制按钮逃逸到页头叠加在退出按钮上
上轮移动端修复误删容器 relative,absolute 按钮向上冒泡定位到
页面顶端。加回 relative 使按钮回到代码块右上角。
|
2026-08-28 21:22:40 +08:00 |
|
Sakurasan
|
faf38e2fd3
|
fix: 修复移动端仪表盘横向溢出
375px 视口下页面被撑到 763px:快速开始卡片的 curl 示例 <pre>
固有宽度沿 flex/grid 链层层撑破祖先(子项默认 min-width:auto
不可收缩,overflow-x-auto 形同虚设)。
- ShellLayout:flex-1 容器与 main 加 min-w-0 切断宽度传播(所有页面受益)
- DashboardView:快速开始卡片各块加 min-w-0,pre 的边框/背景
移入 overflow-hidden 容器、自身横滚
Playwright 实测 375px 视口滚动宽度 763 → 375,与视口齐平
|
2026-08-28 20:12:08 +08:00 |
|
Sakurasan
|
939a98d389
|
feat: show channel name in admin usage logs
|
2026-08-28 16:40:23 +08:00 |
|
Sakurasan
|
305b3ed731
|
refactor: 删除无用的模型展示名(display_name)字段
该字段仅存取、从不展示:管理列表只渲染 name,/v1/models 与用户侧
均不返回它。与渠道绑定 upstream_model 的名字映射职责重叠且悬空。
- store.Model 结构体、admin CRUD、seed 数据移除 display_name
- 前端编辑弹窗输入框、表单状态、types.ts 同步移除
- 本地库已 ALTER TABLE DROP COLUMN;生产残留列无害
|
2026-08-27 09:57:30 +08:00 |
|
Sakurasan
|
a45a6e16bd
|
fix: API Key 前缀调整为 sk-ot-
|
2026-08-26 15:57:04 +08:00 |
|
Sakurasan
|
c78a473e59
|
feat: API Key 前缀改为 sk-ot
- apikey 包 prefix 常量 sk- → sk-ot(生成/校验/展示前缀统一驱动)
- 鉴权错误提示同步更新为 sk-ot 格式
- 测试断言改用常量,避免硬编码长度
- 前端 curl 示例与 README/PLANNING 文档同步
|
2026-08-25 00:34:50 +08:00 |
|
Sakurasan
|
8430ecc6c6
|
fix: use inline style for enabled channel highlight
|
2026-08-22 12:21:48 +08:00 |
|
Sakurasan
|
4aa8b79156
|
fix: use bg-accent-soft for enabled channel highlight
|
2026-08-22 12:17:45 +08:00 |
|
Sakurasan
|
94fd7fd40a
|
feat: add highlight for enabled channels
|
2026-08-22 12:09:33 +08:00 |
|
Sakurasan
|
048de4c9a8
|
feat: add enable/disable toggle for channels
|
2026-08-22 02:12:10 +08:00 |
|
Sakurasan
|
42214d6f5e
|
管理后台用量统计支持按用户筛选:用户名输入 + datalist 自动补全,精确匹配解析为 user_id
- types: UsageLog 补 user_id 字段
- UsageView: 新增用户筛选输入框,防抖 300ms 拉取 admin/users 候选做下拉补全
- search 时将用户名经 admin/users 精确解析为 user_id 再过滤 admin/usage;未找到用户时 toast 报错
- 支持清除筛选一键还原
|
2026-08-20 01:58:02 +08:00 |
|
Sakurasan
|
10f51cbdae
|
请求明细支持查看原始请求/响应:OT_PROXY_LOG_RAW 开关控制,仅管理员记录与可见,流式全量捕获
- 配置: ProxyConfig.LogRaw (OT_PROXY_LOG_RAW, 默认 false)
- 存储: usage_logs 新增 raw_request/raw_response 文本列 (AutoMigrate)
- 网关: NewGateway 接收 logRaw 参数
- handlers: 三个协议入口按 开关+管理员 条件记录原始请求体
- passthrough: 非流式 copyAndCapture 捕获响应, 流式 streamCopy 累积全部原始 SSE 行, finishUsage 统一写入
- admin API: AdminUsage 返回 raw_request/raw_response (仅管理员)
- 前端: 用量页新增查看入口, 弹窗 tab 切换请求/响应
- gitignore: 修正 server/web/ 忽略规则(尾随空格导致未生效)
|
2026-08-20 00:37:48 +08:00 |
|
 SakurasanandClaude
|
fcaafdc807
|
前端: Base URL 输入限长 + 列表截断防撑破
- Input 组件支持 maxlength 透传
- 渠道表单 4 个 Base URL 输入框限 255 字符
- 渠道列表 Base URL 单元格截断显示(max-w-220px)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-17 20:30:09 +08:00 |
|
 SakurasanandClaude
|
74424d980c
|
前端: 仪表盘快速开始卡片 + 移动端适配 + 主页 curl 用浏览器 host
- 仪表盘底部新增「快速开始」:Base URL(浏览器 host)+ 协议徽标 + curl 示例(可复制)
- 最近请求改为响应式两行(模型+状态 / token·成本·时间),窄屏不再挤压
- 主页调用演示改用 window.location.origin,去掉写死的 api.openteam.dev
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-17 20:30:03 +08:00 |
|
 SakurasanandClaude
|
c3dc28fb5b
|
前端: 仪表盘最近请求 canceled 显示灰色
- 控制台/管理后台仪表盘「最近请求」的 canceled 状态改为 neutral 灰色
- 与用量页保持一致的三态判断(success=ok / canceled=neutral / err)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 18:55:10 +08:00 |
|
 SakurasanandClaude
|
4137b6fe20
|
渠道: 远程候选按渠道过滤 + key 掩码 + 移除批量导入端点
- 远程模型候选只排除本渠道已允许的模型,同名模型可被多个渠道各自允许
- 渠道 key 掩码统一 xxxxxxx******Mq4Y(保留前 7 位与后 4 位)
- 移除已弃用的批量导入端点 POST /channels/:id/models/import
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 18:55:05 +08:00 |
|
 SakurasanandClaude
|
d0c879a2ed
|
模型定价: 悬空模型标记 + 一键清除 + 允许渠道只读
- 无渠道绑定的模型以「悬空」琥珀色徽标 + 卡片着色标记
- 新增「清除悬空」一键删除未绑定渠道的模型(DELETE /models/unused)
- 移除页面内「绑定渠道」弹窗与 chips 的解除按钮,渠道支持列表只在渠道抽屉管理
- 缺失提示带上渠道真实模型名(upstream_model)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 18:54:59 +08:00 |
|
 SakurasanandClaude
|
8194edb63d
|
前端: 用量页移动端卡片优化 + canceled 灰色 + 接口类型短标识
- 移动端卡片重排: 成本/状态右置, 协议在模型下方, 元信息分隔行
- canceled 状态徽章由 warn 改为 neutral(与成功/失败区分)
- 接口类型列改用短标识 chat/completions | responses | messages
- 管理后台页头搜索框移动端纵向排列
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 09:04:26 +08:00 |
|
 SakurasanandClaude
|
6f895acf63
|
前端: API Keys 移动端卡片布局 + 复制兼容
- 移动端(md 以下)以卡片列表替代横向滚动表格, 展示配额/过期/最近使用
- 桌面表格补充配额/过期列, 移除创建时间列
- copyText 支持 Clipboard API + execCommand 回退(HTTP 环境可用)
- 删除文案由"吊销"改为"删除(不可恢复)"
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 09:04:26 +08:00 |
|
 SakurasanandClaude
|
db83972b6f
|
渠道: 分协议 Base URL + 模型抽屉/远程拉取/操作图标
- 渠道支持分协议 base_url(chat/responses/messages 各一), 网关按协议选 base 直通
(如智谱三种格式不同 base, 一个渠道即可), UpstreamURL 按 proto 拼接
- 渠道模型改为下方抽屉: 当前绑定列表(内联改上游/解除)、从接口拉取(remote 预览+勾选添加)、手动添加
- 新增 /channels/:id/models/remote 预览接口; 操作按钮加 Phosphor 图标
- 修复 formats jsonb 更新未序列化问题; 手机端渠道卡片化
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 04:31:28 +08:00 |
|
 SakurasanandClaude
|
7c4e80afac
|
前端: 移动端适配 + 模型定价手动添加入口
- 表格加 min-w 窄屏横向滚动; 弹窗/资料网格窄屏换列; 顶栏/头部防溢出
- 渠道页移动卡片化、其余页面头部换行、Toast 自适应宽
- 模型定价页顶部加快捷输入(模型名直接进创建弹窗), 接口导入不全可手动补
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 04:31:14 +08:00 |
|
 SakurasanandClaude
|
9324a782d5
|
Passkey: 账户设置绑定 + 免密登录(WebAuthn)
- 引入 go-webauthn, Passkey 表存凭据, challenge 会话内存存储(带过期)
- API: /webauthn/register|login begin/complete, /webauthn/passkeys 列表/删除
- 配置 OT_WEBAUTHN_RP_ID/RP_ORIGIN/RP_NAME;登录成功发 JWT+refresh cookie
- 前端 lib/webauthn(编解码+凭据序列化+安全上下文检测), 账户设置绑定区, 登录页免密按钮
- 需 HTTPS 或 localhost(安全上下文)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 02:00:08 +08:00 |
|
 SakurasanandClaude
|
057b1b2c0b
|
侧栏: 导航项加 Phosphor 图标
- 用户菜单(仪表盘/API密钥/用量/账户设置/管理)与管理后台菜单(总览/渠道/模型/用户/用量/配置)
均加对应图标, 跨区跳转项(管理→/返回控制台→)用常规字重+箭头区分
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 01:59:58 +08:00 |
|
 SakurasanandClaude
|
40c1ae43e9
|
模型定价: 一致性检查与提示(渠道可用模型应全部纳入定价)
- /admin/models 返回每模型 used/needs_pricing/denied + summary(total/unpriced/missing)
- missing 检测孤儿绑定(渠道提供但目录缺失)
- 模型定价页: 缺失警告、在用未定价提示、已禁止/未定价徽章
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 01:34:22 +08:00 |
|
 SakurasanandClaude
|
b365779188
|
模型限制: 系统配置全局开放/禁止 + 用户级限制 + 网关拦截
- User 新增 allowed_models/denied_models(用户级模型限制)
- 系统配置 model_allowlist/model_denylist 全局策略, 保存即时失效网关缓存
- 网关 checkModelAllowed: 用户级 > 全局(禁止命中→403, 白名单非空→仅白名单)
- 三个协议处理器均校验, 错误按客户端协议格式返回
- 配置页"模型限制"卡片(全局允许/禁止多选); 用户编辑支持允许/禁止模型
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 01:34:12 +08:00 |
|
 SakurasanandClaude
|
866690b7ce
|
用户管理: 编辑按钮高亮 + 图标
- "编辑"按钮改为高亮(accent 边框/浅底/强调色) + PhNotePencil 图标
- "调余额"按钮加 PhCoins 图标
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 01:34:00 +08:00 |
|
 SakurasanandClaude
|
298bf89c90
|
用户管理: 编辑用户信息(用户名/邮箱/重置密码/角色/状态)
- AdminPatchUser 扩展 username/email/password 更新, 含唯一性与格式校验
- 编辑弹窗补充用户名/邮箱/重置密码字段(留空不改密码)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 00:57:15 +08:00 |
|
 SakurasanandClaude
|
79f3f4395c
|
渠道: 支持手工录入模型(无 /models) + 模型映射自定义名称
- AdminChannelAddModel 改为 upstream_model + custom_name:
无 /models 接口的渠道直接填上游模型名, 可选自定义名作为客户端调用名,
全局模型不存在时自动创建
- "支持的模型"弹窗: 手工添加 + 建议下拉(自建,紧贴输入框)/水平排列/交换位置
- 网关仍按绑定映射改写请求 model 字段
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 00:57:06 +08:00 |
|
 SakurasanandClaude
|
4d4d09ba58
|
渠道: 模型名称映射(网关生效 + 渠道侧管理)
- 候选渠道携带 upstream_model, prepareUpstream 改写请求体 model 字段为上游名
- 新增渠道视角绑定 CRUD: GET/POST/PATCH/DELETE /admin/channels/:id/models
- 前端渠道页新增"模型映射": 列出绑定、内联改上游名、解除、添加
- rewriteModel 三种协议通用(model 均在顶层)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 00:09:01 +08:00 |
|
 SakurasanandClaude
|
8d9940ad5a
|
渠道: Base URL 智能识别前缀/完整端点 + API 格式垂直堆叠
- upstreamURL 按内容智能拼接: 完整端点直接用 / 含 /v1 只拼资源路径 / 纯域名拼全路径
- resolveBaseURL 不再去 /v1, 交网关识别
- 渠道表 API 格式改垂直堆叠, 显示短标识 chat/completions / responses / messages
- 前端 Base URL 提示支持前缀或完整端点
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-16 00:08:52 +08:00 |
|
 SakurasanandClaude
|
512e46664c
|
导航: 统一分区侧栏 + 新增用量统计页
- ShellLayout 按所在分区显示独立菜单:
用户控制台(/console) 与 管理后台(/admin) 不混排, 各带跨区跳转(管理→/返回控制台→)
- /console 与 /admin 共用 ShellLayout, 移除 ConsoleLayout/AdminLayout 薄包装
- 新增 /admin/usage 用量统计页(全局请求明细, 按模型过滤+分页)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-15 20:55:56 +08:00 |
|
 SakurasanandClaude
|
a8e2cd214c
|
账户: 修改密码接口 + 账户设置页
- 后端 POST /auth/password: 校验旧密码(argon2id)后重哈希更新
- 前端 /console/settings 账户设置页: 个人资料卡 + 修改密码表单
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-15 20:55:45 +08:00 |
|
 SakurasanandClaude
|
eb57a09c5d
|
API 密钥: 支持编辑与高级选项, 修复 jsonb 白名单更新
- 前端密钥页新增"编辑": 改名/每日配额/模型白名单/状态切换
- 新建密钥展开"高级选项": 每日 Token/请求上限、模型白名单
- 修复 PATCH 更新 allowed_models(jsonb)不走序列化导致失败,
改为 JSON 字符串写入, 跨 SQLite/Postgres 可靠
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-15 20:55:26 +08:00 |
|
 SakurasanandClaude
|
d0bc28a4fe
|
渠道: 移除主页/favicon 特性, Base URL 可选+完整地址
- 回退渠道 homepage/favicon 字段与代理接口(未采用)
- Base URL 改为可选: 留空按供应商默认(openai/anthropic),
兼容兼容型渠道必须填; 填完整地址(含 /v1)时归一化去尾
- 网关 upstreamURL 兜底去 /v1, 避免路径重复
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-15 20:55:17 +08:00 |
|
 SakurasanandClaude
|
4f92d7e0a4
|
渠道: 新增主页字段 + 表格展示 favicon
- Channel 新增 homepage 字段(渠道主页)
- 后端 /admin/channels/:id/favicon 代理抓取 {homepage}/favicon.ico, 内存缓存 1h;
服务端抓取可解析 localhost/内网主页, 避免浏览器跨域
- 前端渠道表单加"渠道主页"输入; 表格新增主页列(favicon + 域名), 加载失败回退灰色地球图标
- mock 上游提供 /favicon.ico 演示
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-15 17:01:45 +08:00 |
|
 SakurasanandClaude
|
d9dcbc4fb3
|
渠道: 移除供应商下拉, 格式多选为唯一配置
- 前端渠道表单去掉"供应商"下拉, 只保留"支持的 API 格式"多选(默认 chat)
- 后端 provider 改为可选字段: 为空时按 formats 推断(仅 messages→anthropic,
含 responses→openai, 否则 compatible), 兼容旧数据
- 保存时校验至少选择一种格式
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-15 16:55:48 +08:00 |
|
 SakurasanandClaude
|
5eff32afd8
|
渠道支持多 API 格式 + 协议全名展示
- Channel 新增 formats(jsonb: chat|responses|messages), 一个渠道可同时声明
支持 OpenAI Chat Completions / OpenAI Responses API / Anthropic Messages
- 路由改为按渠道声明的 formats 决定直通/转换: 客户端协议在 formats 内直通,
否则转换为其首选支持格式(chat > messages > responses)
- 兼容旧数据: formats 为空时按 provider 推断(openai→chat+responses, anthropic→messages, compatible→chat)
- 前端: 渠道表/表单展示 API 格式(支持多选), usage 明细显示协议全名
(OpenAI Chat Completions / OpenAI Responses API / Anthropic Messages)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-15 16:47:03 +08:00 |
|
 SakurasanandClaude
|
6adadebaf0
|
前端: 修复浅色模式白字 + 主题优化
- 修 nav 激活态残留 text-zinc-50 导致浅色下白字白底
- @theme 令牌改实色字面量, 浅色用 [data-theme=light] 覆盖同一批 --color-*
- 新增 soft 令牌(accent/ok/warn/err, color-mix 运行时解析)替代烘焙的透明度修饰符,
修复 badge 实色底、focus ring 实线等问题
- ThemeToggle 改三选下拉(浅色/深色/跟随系统), 系统自动为显式选项
- 浅色强调色调深保证 WCAG 对比度, 全量复查无残留硬编码颜色类
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-15 16:30:11 +08:00 |
|
 SakurasanandClaude
|
a422034b2b
|
前端: 浅色模式 + 系统自动主题
- 引入语义化 CSS 变量令牌(bg/surface/edge/ink/muted/accent 等), data-theme 三态切换
- theme store(localStorage + 系统偏好跟随), 首屏内联脚本防主题闪烁
- ThemeToggle 组件(浅色/深色/跟随系统) 置于导航与控制台顶栏
- 全量替换硬编码 zinc/emerald/red 类为令牌, 图表基线/状态色随主题适配
- 浅色对比度校准(accent/err/warn 深浅各一套)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-15 16:20:43 +08:00 |
|