Commit Graph
274 Commits
Author SHA1 Message Date
chengqian a5e2ecf527 fix(dispatch): 渠道健康聚合只统计有真实上报的模型,降级时保留库中旧值
渠道展示分是目录内全部模型 succ_ewma 的算术平均,而无流量模型读到的是乐观默认满分。
20 个模型的渠道死掉 1 个(succ→0.05)仍能算出 avgSucc≈0.95、91 分绿灯,恰好掩盖了
模型级熔断要隔离的典型场景。改为只统计 HasHealth 的模型;全渠道无真实上报时
Counted=0,保留库中上一次的分数而不是用默认满分覆盖历史结论。

Redis 读失败(Degraded)时跳过落盘并打 Warning:照常落盘会把全渠道健康分刷成 100,
连带 chn_health_snapshots 把假象写进历史趋势,事故期间的曲线反而全绿。自动禁用判定
一并跳过——该操作不可逆,不能基于不可信读值触发。

聚合逻辑抽成纯函数 aggregateChannelHealth 以便单测;另新增 RequestHealthSnapshot
按需重算入口(维护循环消费,满则丢弃由下一轮兜底),供渠道测试/重置健康度接入。
健康上报是 fire-and-forget,重算前等 500ms 让 worker 落完 Redis。
2026-08-27 21:59:43 +08:00
chengqian 3f3fc43856 fix(dispatch): 健康读值区分「无数据」与「读失败」,Redis 降级不再清零健康记忆
ReadRuntime 此前对「该模型没有流量」和「Redis 读失败」返回同样的乐观默认值
succ=1,调用方无从分辨。后果是 catalog.Rebuild 会用这批默认值重建快照,把上一轮
真实的 EWMA 覆盖掉——注释声称的 last-known 语义实际没有兑现,Redis 抖一下全渠道
healthFactor 集体回满分。

RuntimeReadout 新增 HasHealth(确有真实上报,脏值/精确 0/字段缺失都不算)与
Degraded(读失败,读值整体不可信)两个标记;Rebuild 在 Degraded 时沿用上一份快照的
健康读值,无历史可沿用才保持乐观默认(新实例启动即遇 Redis 故障不应把全渠道判死)。
2026-08-27 21:59:43 +08:00
chengqian 3035fa118c fix(dispatch): 修复 HMGET 判空失效导致冷渠道健康分被读成 0
ReadRuntime 用 `!vals[0].IsNil()` 判断 HMGET 结果是否存在,但 gredis 把 Redis
nil 数组元素包装成非 nil 空 gvar(IsNil() 恒为 false、Float64() 静默返回 0),
导致所有从未被真实流量访问过的渠道×模型被读成健康 0 分而非默认满分 1.0:管理
后台渠道健康度全线坍缩(如某渠道 (1.0+0)/2 → 0.5²×100=25 长期不动),调度侧
healthFactor 同样归零,冷模型路由权重被压死。

GET/HGET 单值回复的 IsNil() 正常,仅数组回复有此坑;仓库内 HMGET 调用点仅
ReadRuntime 与 readBreaker 两处,后者因默认值 BreakerClosed 恰为零值而侥幸
无害,一并改为按字符串判空。

- ReadRuntime:TrimSpace 判空 + ParseFloat 值域校验(succ 取 0<f<=1,EWMA
  由正数衰减而来不会精确到达 0,精确 0 视为异常数据)
- 回归测试:key 不存在须回落默认值、空串/非法值/精确 0 防御
- 通用规则写入 goframe-conventions.md 框架使用错误记录

同时补齐探测与健康分的可观测性(本次排查绕行三次的直接原因是全链路静默):

- [ChannelProbe] 探测全流程:轮次起止、模型与上游映射、结果、是否上报健康
- [ChannelHealth] 健康分变化:EWMA 变化点(Outcome.Probe 区分探测/真实流量
  来源)、快照落盘含各模型 succ 明细、维护轮次覆盖摘要
- 快照落库失败由 Debug 升为 Warning(此前静默,健康分冻结无从定位)
- 探测目标不在调度目录时告警(该场景健康分不落盘且渠道不参与调度)
- 变化类日志按「分数实际移动」触发,稳态降为 Debug,避免生产流量刷屏
2026-08-27 21:59:42 +08:00
qian 08c885aa6c fix(web):修复前端缓存导致点击页面没反应 2026-08-27 00:08:31 +08:00
chengqian d2e3794e3a fix(channel):修复渠道健康分数一直下降的问题 2026-08-26 16:49:25 +08:00
chengqian f6a3e3a2f2 improve(ui):优化价格计费 2026-08-20 17:00:14 +08:00
chengqian 7d82cb0cc1 feat(model):优化响应头 2026-08-20 15:19:27 +08:00
chengqian 6a49559147 fix(model):修复大模型接口把关键信息泄露给用户的问题 2026-08-20 14:29:57 +08:00
chengqian ccdb314ecd Merge remote-tracking branch 'origin/dev' into dev 2026-08-20 11:45:46 +08:00
qian 40e91d9450 feat(channel):新增渠道调试日志功能 2026-08-20 10:34:15 +08:00
qian 3a075047bb improve(ui):优化模型广场显示分时价格 2026-08-20 01:25:51 +08:00
qian 5cae607d19 feat(channel):允许禁用的渠道进行模型测试操作 2026-08-20 01:03:48 +08:00
qian ee96a5b866 feat(model):优化模型价格设置功能 2026-08-20 01:03:48 +08:00
qian add95ca5ab feat(model):模型定价分时功能 2026-08-20 01:03:47 +08:00
chengqian 54ccfb9b80 feat(usage):用量记录添加统计信息 2026-08-19 20:54:52 +08:00
chengqian 330d02f19d feat(channel):渠道详情页显示模型监控信息 2026-08-19 18:34:21 +08:00
chengqian 949957755e fix(channel):修复渠道调度问题,单模型异常不再影响整个渠道 2026-08-19 18:34:20 +08:00
qian 8a7f0f2760 Merge branch 'main' into feat/responses
# Conflicts:
#	docs/reference/goframe-conventions.md
#	internal/logic/admin/channel.go
#	web/tenant/src/views/service/ApiKeysPage.vue
2026-08-18 23:02:33 +08:00
qian 42dfe41b60 improve(ui):统一用户端的api密钥和项目详情的api密钥界面 2026-08-18 22:56:44 +08:00
qian 9a3ce06775 improve(ui):优化后台图表显示效果 2026-08-18 22:37:42 +08:00
qian ed82af4180 fix(apikey):修复在线体验获取到无效key的问题 2026-08-18 22:32:58 +08:00
qian 3073c6fd5e fix(channel):修复渠道修改base url地址后不匹配问题 2026-08-18 00:29:37 +08:00
chengqian c9b6d1947c feat(model):优化模型性能监控,支持查看指定渠道状态 2026-08-17 17:37:23 +08:00
chengqian 922003e758 feat(model):claude模型5m/1h缓存收费 2026-08-17 17:37:23 +08:00
chengqian 6f96eb4150 Merge remote-tracking branch 'origin/feat/responses' into feat/responses
# Conflicts:
#	docs/reference/goframe-conventions.md
2026-08-17 10:02:05 +08:00
qian 6696b417ad fix(log):token用量转换问题 2026-08-17 10:01:04 +08:00
qian 1f5b1635d4 fix(log):修复日志记录非utf-8字符串报错问题 2026-08-17 07:59:11 +08:00
qian 6255930d0d feat(model):添加渠道监控 2026-08-17 07:44:56 +08:00
qian 6778c84ace feat(model):新增缓存监控指标 2026-08-16 23:59:00 +08:00
qian f482cadac9 fix(log):修复各个协议转换时缓存token数丢失的问题 2026-08-16 23:24:19 +08:00
qian bb0de90181 fix(log):修复日志写入遇到特殊字符报错的问题 2026-08-16 20:11:49 +08:00
qian 5d25673c06 feat(relay):完善responses协议 2026-08-16 19:58:20 +08:00
qian 3a63420152 chore:测试在线升级功能 2026-08-15 17:01:29 +08:00
martin e161401368 feat(update):支持指定二进制更新地址,便于本地测试更新功能 2026-08-15 16:34:23 +08:00
martin 77cb3d0a01 feat(update):优化版本解析,移除 v 前缀 2026-08-15 16:08:12 +08:00
martin 1a85916e79 feat(update):优化程序更新启动方式 2026-08-15 15:57:13 +08:00
qian c286d4d2df fix(update):修复在线更新多个问题 2026-08-15 13:56:55 +08:00
qian 36b8450d06 fix(toast):修复提示信息描述重复问题 2026-08-15 00:45:11 +08:00
qian 27f4770623 fix(update):修复升级回滚未等待信号的问题 2026-08-15 00:38:11 +08:00
qian 196b0d0b5e fix(update):修复回滚操作未等待就直接退出 2026-08-15 00:30:31 +08:00
qian 1969214163 fix(member):修复成员列表导出字段与表格不一致的问题 2026-08-15 00:25:42 +08:00
qian 984699b0e5 fix(sys):修复服务器更新跨分区复制文件导致的重命名失败问题 2026-08-15 00:25:42 +08:00
qian aeccc9946b fix(sys):修复版本检查不能及时获取最新版本的问题 2026-08-15 00:25:42 +08:00
qian 06d5784e58 fix(marketplace):修复模型广场查询模型权限报错问题 2026-08-15 00:25:42 +08:00
qian a1f15ab5b1 feat(ui):新增模型缓存价格显示 2026-08-14 22:26:12 +08:00
chengqian a090fdd601 fix(channel):修复渠道权重被设置为0的问题 2026-08-14 18:47:45 +08:00
chengqian 85ccf083d2 fix(channel):修复渠道权重被设置为0的问题 2026-08-14 18:27:25 +08:00
chengqian bf7123148e feat(model):responses协议和chat的优化处理 2026-08-14 18:14:11 +08:00
chengqian b5a1770018 feat(model):支持responses协议 2026-08-14 16:24:58 +08:00
chengqian ebd2664d67 Merge branch 'dev' 2026-08-14 15:36:32 +08:00