qian
|
15ec726f68
|
improve(log):优化渠道日志揭露,方便排查问题
|
2026-09-01 00:11:32 +08:00 |
|
qian
|
cd019cf817
|
feat(billing):新增本位币设置,初始化时可选择全局货币单位,一旦设置就不能修改
|
2026-08-29 10:22:47 +08:00 |
|
chengqian
|
96bcd3e46f
|
fix(channel):修复渠道更新key后无法立即生效
|
2026-08-28 16:55:28 +08:00 |
|
qian
|
e8dfe9499d
|
improve(log):优化日志输出
|
2026-08-27 23:36:20 +08:00 |
|
chengqian
|
ce59b12622
|
fix(cron): 兜底任务 panic,并支持自定义渠道探测间隔
panic 兜底:cron.New() 默认不带 Recover 链,robfig/cron v3 的 startJob 是裸的
`go func(){ j.Run() }()`——任意一个定时任务 panic 会直接崩掉整个进程,而不只是让该
任务失败。在 runJobInternal 内兜住并转成普通 error,进程存活且失败经 recordExecution
落进 sys_cron_jobs,管理后台可见,不再表现为一次无声重启。堆栈只进日志,避免撑爆
last_error 的展示。渠道自动探测再加一层 per-channel recover:单个渠道 panic 只跳过
自己,本轮剩余渠道继续(否则整轮被中断)。
探测间隔可配置:新增 channel_auto_test_interval_minutes(默认 5,范围 1-1440),
原先固定 */5 * * * *。用 @every 而非 */N——*/N 只在 N<60 时有意义,*/90 会被静默
解析成 */30,给出与配置不符的频率;@every 还让各实例按启动时刻错开,不会所有实例
卡在同一分钟同时探测。
配套两处基础能力:CronScheduler 记录 cron.EntryID 并新增 Reschedule(先加新条目、
成功后再摘旧条目,非法表达式时保持原调度,避免一次错配把任务彻底摘出调度器);
ConfigService 新增 OnSettingsChanged 回调钩子,挂在既有的 settings:changed 订阅上,
使配置变更能触发动作而不只是让缓存失效,多实例各自重排、无需重启。
|
2026-08-27 21:59:45 +08:00 |
|
chengqian
|
1f3489c37d
|
docs(dispatch): 修正健康度列注释与过时文档,清理两个僵尸字段
chn_health_scores 的列注释仍写着健康体系重写前的加权公式(成功率×0.40 + 延迟分×0.25
+ 稳定性×0.20 + 连续失败分×0.15),而实际实现是 avg(succ_ewma)^α×100。注释经
gf gen dao 流入 entity/do/dao,是全链路唯一会主动误导后来人的地方。迁移 000017 改写
health_score / success_rate / latency_ms / calculated_at 的 COMMENT 为实际口径。
stability_score / consecutive_failures 自重写后从未被更新,只在建渠道和重置健康度时
写入常量,趋势图与调度均不消费,却仍通过 HealthTrendPoint 返给前端。改为:注释标注
【已废弃】、代码停止写入与查询、从趋势接口响应中移除。保留列不删除以免破坏历史快照;
chn_health_snapshots.stability_score 为 NOT NULL 且无默认值,迁移补 DEFAULT 0,
否则代码停写后插入会失败。
docs/reference/多项目渠道调度对比.md 的 team-api 部分描述的是重写前的实现(引用的
relay/scheduler/、internal/logic/relay/health.go 均已删除),加时效声明并指明现行口径。
注意:迁移执行后需重跑 gf gen dao 刷新 entity/do/dao 中的列注释。
|
2026-08-27 21:59:44 +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
|
5cae607d19
|
feat(channel):允许禁用的渠道进行模型测试操作
|
2026-08-20 01:03:48 +08:00 |
|
qian
|
add95ca5ab
|
feat(model):模型定价分时功能
|
2026-08-20 01:03:47 +08:00 |
|
qian
|
6778c84ace
|
feat(model):新增缓存监控指标
|
2026-08-16 23:59:00 +08:00 |
|
Qian
|
2ef5a40c26
|
新的调度方式 (#14)
重构模型渠道调度系统
|
2026-08-01 22:55:08 +08:00 |
|
martin
|
92c2cc033b
|
refactor: deduplicate task and security logic
|
2026-07-26 14:07:53 +08:00 |
|
martin
|
35a20cffeb
|
fix: 修复 P1-Resource 资源/SSRF 类问题
- P1-R1 rehostFromURL SSRF:syncImageDownloadClient 改用 SSRF 加固的
DialContext,dial 阶段拒绝 loopback/link-local/私网/multicast/unspecified,
用已校验 IP 直拨号杜绝 DNS rebinding;入口加 validateSSRFURL 预检(仅
http/https、字面量内网 IP 直接拒)。新增 isForbiddenIP/validateSSRFURL 单测。
- P1-R2 payment LockOrder 竞态:sync.Map + 手工引用计数改为 256 分片
sharded mutex(FNV-1a),同订单恒命中同分片,无引用计数/Delete,内存恒定。
公共 API 不变;同步更新 callback_test.go,-race 通过。
- P1-R4 OAuth 无超时:新增 oauthHTTPClient(10s 超时),替换全部 5 处
http.DefaultClient.Do / http.Post 出站请求。
- P1-R5 告警派发 goroutine 无上限:新增 goDispatchAlertNotifications,
阻塞式信号量(容量 16)封顶并发 + WithTimeout(30s) 兜底,不丢通知仅排队。
|
2026-07-26 12:54:41 +08:00 |
|
martin
|
4cc6ff307e
|
fix: 修复 P1 事务边界问题
- P1-T1 SetTenantGroups/SetGroupModels 删-插包进事务,避免插入失败清空关联
- P1-T2 ApiKeyUpdate 主表与 scope 更新同事务,缓存失效移到提交后
- P1-T3 InvalidateWallet 移到 FulfillOrder 事务提交后,避免缓存污染窗口
- P1-T4 handleDeletionRequest 跨 4 表删改包进事务,杜绝中间态
- P1-T5 subscribePlanTx 加事务级 advisory lock,串行化同租户订阅
|
2026-07-26 12:41:28 +08:00 |
|
martin
|
a6ed67d841
|
fix: 完成 P3 细节优化项
依据《代码分析结果.md》P3 章节,逐条修复 20 项细节问题:
正确性修复:
- P3-1 锁定剩余分钟改用 math.Ceil,避免「0.9 分钟」显示为「0 分钟」
- P3-12 移除 CheckAndUpgradeLevel 中恒真的 hasUpdate 标志
- P3-14 移除 CheckTrialExpiry 中恒真表达式(count > 0 || true)调试残留,改用 RowsAffected
- P3-2 成员不存在统一返回 NewNotFoundError(404),与其它方法语义一致
安全加固:
- P3-6 X-Request-Id 加格式校验 ^[A-Za-z0-9-]{1,64}$,防日志注入
- P3-7 新增公共 EscapeLikePattern,转义 admin LIKE 搜索的 %/_ 通配符
- P3-8 Encrypt 输出加 v1: 版本前缀,Decrypt 兼容无前缀历史密文
- P3-9 turnstile 响应体读取加 64KB 上限,防内存耗尽
- P3-11 backup codes 熵由 48-bit 提升到 64-bit
- P3-15 recordAudit 对 multipart/二进制体跳过 Unmarshal 与原文落库
- P3-17 错误日志按 Content-Type 跳过 multipart/二进制体读取
- P3-16 HandleRealtime 加 panic recover 与连接生命周期日志
可维护性/一致性:
- P3-3 oauth.go 时间格式统一为 time.RFC3339
- P3-5 MsgSuccess 统一为 ok,response.go 改用常量引用
- P3-4 错误码分段策略加注释,说明空洞与跳跃的成因
- P3-13 ModelMultiplier 占位语义加注释(计费公式设计位 + 快照列)
- P3-19 抽取 registerCronJobs,主启动流程清爽
重构:
- P3-18 删除死代码 BuildBillingSummary/SummaryParams(仅测试引用),保留共用 helper
- P3-20 抽取 relay.InvalidateMemberModelScopeCache 单一失效入口,
消除三处 member_model 前缀字面量重复(原为有意跨包失效,原建议改名会破坏)
经核实保留 + 文档化:
- P3-10 TOTP 暂保留 SHA-1:totp.Validate 硬编码 SHA-1 且存储不保存算法元信息,
直接切 SHA-256 会导致校验恒失败,需配合 schema 改动,超出 P3 范围
|
2026-07-26 12:16:33 +08:00 |
|
martin
|
b7e71c685f
|
fix: 修复并发与一致性问题
|
2026-07-26 11:45:03 +08:00 |
|
martin
|
6665b1e113
|
refactor:重构渠道调度功能
|
2026-07-25 20:48:15 +08:00 |
|
martin
|
75bc4038db
|
fix:修复文件管理可能导致的越权操作
|
2026-07-25 20:10:35 +08:00 |
|
martin
|
e9b5592666
|
fix:修复租户数据导出功能
|
2026-07-25 19:57:50 +08:00 |
|
chengqian
|
108078614d
|
fix: 金额 float64 → decimal 全链路迁移,消除浮点累积漂移
将全库资金金额从 float64 迁移到 shopspring/decimal,落定边界架构:
入口 NewFromFloat → 内部多步运算全程 decimal → 出口 InexactFloat64;
DB NUMERIC(20,10) 走 driver.Valuer 精确直传,Redis 钱包用整数 micro-USD,
CNY→USD 换汇仅在 payment.FulfillOrder recharge 分支。
- money.go 重写为 decimal 原生(运算/收敛/比较/边界/micro 工具)
- billing/tenant/admin/payment/open/task 各层金额运算 decimal 化
- entity/do 资金列重生成为 decimal.Decimal(可空列 *decimal.Decimal)
- 000013 迁移:非金额 NUMERIC 列 → double precision(5 表 13 列)
- Res 出口 .InexactFloat64() 收敛,JSONB 快照缝隙显式转 float64
- CLAUDE.md 新增 decimal 强约束;补充迁移基线/完成总结文档
|
2026-07-23 22:08:54 +08:00 |
|
chengqian
|
8a68f6a501
|
fix: 修复代码分析报告中的中等优先级问题
修复 docs/claude代码分析.md 中等优先级的 8 项确认问题:
- tenant/project.go:ProjectUpdate/Archive/Unarchive 的 UPDATE 补上
tenant_id 过滤,恢复写操作租户隔离约定
- taskchannel(ali/sora/suno/volcengine/midjourney):裸 http.Client 改为
common.NewPooledClient(走连接池 + 尊重渠道 UseProxy),不再丢弃
BuildRequestHeader 的错误
- handler/public/payment.go:支付回调失败补日志,伪造/篡改尝试可追溯
- billing/wallet.go + payment/fulfill.go:新增导出 InvalidateWallet
同时清进程内 walletCache 与 Redis,消除充值后读到旧余额
- logic/task/task.go:ExecuteTask 领取任务改为原子 CAS,多副本不再重复执行
- middleware/rbac.go:matchPermission 后缀匹配改为按路径分段边界,
修复 /test 规则误命中 .../latest
- admin/channel.go + channel_oauth.go:渠道→密钥跨表写入包进事务,
杜绝孤儿渠道
- admin/promo_code.go:CreatePromoCode 增加字段白名单,对齐 UpdatePromoCode
另有 6 项经评估暂不修改(配额非原子/补扣负数/无 jti token/setup 竞态/
crypto AAD/turnstile 校验),原因见分析报告说明。
|
2026-07-22 18:43:38 +08:00 |
|
 Qianandchengqian
|
be9e707bfd
|
修复异步图片导致的多个问题 (#12)
* fix:修复响应污染问题
* fix:修改存储相关文件为中文注释
* fix:修复二次退款问题
* fix:修复多个考虑不全面问题
1.误删用户数据
2.R2存储默认区域
3.删除失败导致孤儿记录
4.网络抖动事变时重试
5.前端无限次请求获取图片
6.文件管理权限
* fix:修复字符串截断异常问题和文件下载超时问题
* fix:修复多图问题
* fix:异步生成图片时未配置oss提示错误信息
* fix:修复关闭异步后同步生成出错问题
* feat:新增文件存储测试功能,防止设置后不生效
* fix:修复同步图片转异步后计费错误
* fix:修复无下限扣款问题
* fix:修复结算重复扣款问题
* fix:修复计费出错导致的0费用结算
* fix:修复回调双重履约
* fix:修复预扣事务
* fix:修复费用字段类型问题
* fix:修复缓存问题
* fix:修复安全问题
* fix:修复数据库操作事务问题
* refactor:重构事务使用方式,改为官方推荐的dao形式
* fix:修复余额更新隐患
* fix:修复N+1查询问题
* fix:修复密钥安全问题
* fix:结算失败时打印错误日志
* improve:优化扣款
* fix:修复用户接口越权
---------
Co-authored-by: chengqian <wuchengqian@kkidc.com>
|
2026-07-22 17:53:18 +08:00 |
|
qian
|
5c19806752
|
fix:修复任务日志中平台信息错误
|
2026-07-18 01:31:44 +08:00 |
|
 
|
fa053529af
|
图片请求统一异步处理 (#11)
* fix:未导入unicode包
* feat:图片异步转换
* feat:添加R2支持
* feat:新增文件管理
* fix:修复错误信息双写导致响应异常
* chore:渠道列表中添加快捷启用停止按钮
* fix:修复模型异常终端导致报错的问题
* improve:优化无可用渠道的日志打印,减少日志污染
* fix:在线体验出错缺少提示信息
* fix:修复日志库问题,只有请求日志保存到独立的库中
* feat:新增阿里图片模型说明文档
* fix:阿里千问图片生成
* fix:修复图片异步控制无效问题
* improve:优化文件展示,支持缩略图查看
* feat:实时监控中添加图片异步转换池状态信息
* improve:优化在线体验页面布局
* fix:修复异步任务状态显示异常问题
* feat:图片异步任务停止时等待任务完成后再退出程序
* chore:调整存储路径
---------
Co-authored-by: qian <wuchengqian5@163.com>
Co-authored-by: chengqian <wuchengqian@kkidc.com>
|
2026-07-18 00:26:13 +08:00 |
|
 
|
22ee0aa112
|
修复安全问题 (#9)
* fix:修复权限问题
* fix:修复项目key类型错误问题
* fix:修复rbac权限问题
* fix:修复api密钥未及时失效的问题
* improve:优化渠道调度稳定性
* improve:优化路由
* fix:修复项目预算控制缺陷
* fix:加强限流等安全措施
* feat:添加限流相关字段的前端展示及接口字段
* improve:优化注册时密码要求,只需要字母和数字即可
* feat(setting):添加注册限流设置
* improve:优化前端数字类型转换
* chore:rbac权限放行
---------
Co-authored-by: chengqian <wuchengqian@kkidc.com>
Co-authored-by: qian <wuchengqian5@163.com>
|
2026-06-23 22:47:54 +08:00 |
|
qian
|
6809081f37
|
feat(model):veo视频模型适配
|
2026-06-13 09:26:37 +08:00 |
|
qian
|
455dbe48f5
|
fix:修复程序退出时卡住的问题
|
2026-06-09 22:20:37 +08:00 |
|
chengqian
|
a219a1f67e
|
fix:系统优雅退出
|
2026-06-08 17:39:21 +08:00 |
|
martin
|
06aff72726
|
fix(log):修复请求审计日志中视频类型的任务用时信息为0
|
2026-06-06 23:20:47 +08:00 |
|
qian
|
f0ac2d90d4
|
fix:移除用户和key级别的并发限制
|
2026-06-05 21:11:38 +08:00 |
|
chengqian
|
cfc6b2589a
|
fix:统一系统货币单位规则
|
2026-06-04 13:52:19 +08:00 |
|
qian
|
62826d9140
|
improve:清除未使用的数据表
|
2026-06-04 08:10:06 +08:00 |
|
qian
|
479340d4ea
|
feat(audit):审计表单独存储到其他数据库中
|
2026-06-04 01:02:51 +08:00 |
|
chengqian
|
ccf457592b
|
fix(relay):修复多个并发问题
|
2026-06-03 17:03:09 +08:00 |
|
qian
|
a59b8850f0
|
fi:中间件和数据库
|
2026-06-03 15:34:38 +08:00 |
|
qian
|
2793a6467c
|
improve(style):按照goframe推荐方式优化代码
|
2026-05-30 09:31:40 +08:00 |
|
qian
|
5d48dbcdc2
|
refactor(plan):移除套餐相关的所有修改
|
2026-05-25 22:26:32 +08:00 |
|
qian
|
cbe1317f7c
|
refactor(pay):重构套餐和支付功能
|
2026-05-24 11:42:33 +08:00 |
|
qian
|
e251787051
|
fix(bill):修复并发扣费问题
|
2026-05-22 00:01:48 +08:00 |
|
qian
|
555bddf5c3
|
refactor(payment):重构支付功能
|
2026-05-21 23:06:01 +08:00 |
|
qian
|
0f76ed36b2
|
fix(monitor):修复实时监控只能监控对话模型的问题
|
2026-05-20 12:51:46 +08:00 |
|
qian
|
e4ec55ccf2
|
refactor(wallet):重构钱包功能,支持查看冻结信息
|
2026-05-20 12:42:13 +08:00 |
|
qian
|
2ce06a0274
|
fix(model):视频模型计费相关
|
2026-05-20 08:35:17 +08:00 |
|
qian
|
b04e656667
|
Merge branch 'feat/video' into dev
|
2026-05-20 00:40:51 +08:00 |
|
qian
|
5084406687
|
feat(model):添加对火山视频模型的支持
|
2026-05-19 23:28:54 +08:00 |
|
qian
|
1b6134a890
|
feat(model):视频大模型添加请求审计和用量记录
|
2026-05-19 00:45:02 +08:00 |
|
qian
|
ef2845af3a
|
feat(model):新增视频类型的大模型支持
|
2026-05-19 00:33:02 +08:00 |
|
qian
|
e34681a911
|
feat(model):seedance 2.0计费优化
|
2026-05-17 22:09:07 +08:00 |
|
qian
|
bc058cee45
|
refactor(task):重构大模型异步任务日志功能
|
2026-05-16 19:52:08 +08:00 |
|
qian
|
3405280224
|
后端功能首次提交
|
2026-05-10 12:21:27 +08:00 |
|