Commit Graph
109 Commits
Author SHA1 Message Date
chengqian a090fdd601 fix(channel):修复渠道权重被设置为0的问题 2026-08-14 18:47:45 +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
qian 540817a6a7 feat(channel):新增渠道调度状态显示 2026-08-08 09:09:07 +08:00
qian bc2f202f4f fix(channel):修复ali百炼渠道路径拼接问题 2026-08-08 02:03:31 +08:00
qian 780cd26be8 fix(db):修复数据库查询结果为空的问题 2026-08-08 01:19:52 +08:00
qian 6cf68b14b3 feat(wallet):管理后台钱包一键释放所有被冻结资产 2026-08-05 23:46:53 +08:00
qian 99cb57dcd2 refactor(wallet):预扣冻结金额完全走redis,提升数据库并发能力 2026-08-05 23:38:15 +08:00
qian c7d15d82a4 improve(admin):优化管理功能搜索条件 2026-08-04 22:50:57 +08:00
qian a73cf411a5 improve(ui):统一调整表格页面,将总数统计显示在左下角 2026-08-04 22:23:29 +08:00
chengqian 6ca1726298 fear(wallet):管理后台在租户钱包里面显示被冻结的资金 2026-08-04 14:35:58 +08:00
qian 2e0119ee85 improve(wallet):优化管理后台的钱包功能 2026-08-04 00:48:02 +08:00
qian 47ffb4e2a9 fix(model):修复模型设置价格后不能立即调用 2026-08-03 21:44:47 +08:00
qian 07369f2f30 improve(channel):调整渠道编辑表单 2026-08-03 21:38:34 +08:00
qian 6683ca6d40 fix(cache): 修复高并发下租户模型权限缓存缺失导致误判问题
- CheckTenantModelAccess 增加 L1/L2 双层缓存(TenantModelAccessCache,TTL 300s)
  区分「数据库无记录(IsNil=true,穿透到分组权限)」和「有记录」两种状态,
  高并发下不再每次请求都发起 LEFT JOIN 查询,消除连接池压满时的误判根因

- 修复 Cache.DeleteByPattern 遗漏 L1 gcache 清除和跨实例 pub/sub 通知的问题:
  原实现只做 Redis SCAN+批量 DEL,L1 条目靠 TTL 自然过期;
  改为 SCAN 收集所有 key → 批量 DEL L2 → 逐 key gcache.Remove + PUBLISH cache:invalidate,
  与 Cache.Delete 的三层清除行为对齐

- 新增 ClearTenantModelAccessCache(ctx, tenantID),以 {tenantID}:* 模式清除该租户缓存

- admin/tenant_model.go:BatchAssignModels / UpdateTenantModel / DeleteTenantModel
  三个写操作在 ClearTenantPriceCache 后追加 ClearTenantModelAccessCache 调用

- admin/model_group.go:invalidateTenantGroupCache 新增 ClearTenantModelAccessCache 调用,
  覆盖所有分组写操作(SetGroupModels / SetTenantGroups / UpdateModelGroup status 变更)
2026-08-02 23:59:00 +08:00
qian ab463ede83 improve(task):定时任务优化,显示中文名称 2026-08-02 17:52:21 +08:00
qian 03259a144a feat(admin):添加模型调用堆叠柱状图 2026-08-02 14:45:50 +08:00
qian f13b583c35 feat(admin):渠道模型能力页面添加字段使用说明 2026-08-02 14:20:35 +08:00
qian 49b05b66ad fix(admin):修复渠道测试功能使用上游模型名称的问题
之前渠道测试时使用的是系统内模型名称,而不是上游配置的模型名称,
导致测试请求失败(上游供应商无法识别系统内模型名)。

修复内容:
- 将查询目标从 mdl_models 表改为 chn_abilities 表
- 查询条件:channel_id + model_name + enabled=true
- 获取 upstream_model 字段作为上游模型名称发送测试请求

影响范围:
- internal/logic/admin/channel_testing.go
2026-08-02 13:49:11 +08:00
qian a24f9d29db feat(log):添加日志硬删除按钮,防止频繁错误影响数据库 2026-08-02 00:56:03 +08:00
qian 4bf835394d Merge branch 'main' into dev
# Conflicts:
#	web/admin/src/views/ai/ChannelDetailPage.vue
2026-08-01 23:03:23 +08:00
qian fae0d1efba chore:渠道倒序排序 2026-08-01 23:02:30 +08:00
Qian 2ef5a40c26 新的调度方式 (#14)
重构模型渠道调度系统
2026-08-01 22:55:08 +08:00
chengqian f4debdfab2 fix(channel):修复渠道无法修改协议 2026-07-31 15:19:01 +08:00
chengqian 8a8a96a012 fix(admin): 修复错误日志列表返回空元素 2026-07-30 14:26:34 +08:00
chengqian 245cedad47 fix(wallet): 修复预警阈值 nil 指针导致 /api/tenant/wallet 崩溃
warning_threshold 列可空,注册(Register)/后台建租户(CreateTenant)两条建钱包路径曾漏设该字段,导致这些租户的钱包阈值为 NULL。Wallet() 直接解引用 *w.WarningThreshold,owner/admin 访问 /api/tenant/wallet 时 panic recovered 500。

统一语义:warning_threshold = 0 表示关闭预警(也是新建默认值),正数 = 预警线,与告警引擎 alert.go「阈值 <= 0 视为未启用」一致。

- Wallet() 增加 nil 守卫,NULL 行按 0 返回,消除解引用崩溃
- 所有建钱包路径(懒初始化/Register/CreateTenant/EnsureWallet)显式写入 0,不再产生 NULL
- 管理后台阈值显示:>0 显示金额,否则显示「关闭」
2026-07-30 10:17:55 +08:00
martin 92c2cc033b refactor: deduplicate task and security logic 2026-07-26 14:07:53 +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 a7177cc6f5 fix: 修复 P2 可维护性与性能问题
- P2-3 ExportModelsJson N+1 改批量 WhereIn 查询定价
- P2-4 dashboard 聚合 Count 不再静默吞错,改 Warning 日志
- P2-5 promo_code/notification 的 map[string]any 返回值改 struct
- P2-6 CleanExpiredPreDeducts 改先 claim 再 release,避免多实例重复释放
- P2-7 trackPreDeduct 已由 P1-C 同步化+回滚覆盖,文档注明
- P2-8 支付金额容差比较改 decimal,消除 0.01 边界二进制误差
- P2-9 GetEnabledChannels 加 60s 进程内缓存,配置变更主动失效
- P2-10 OAuth callback 路径限定 provider 白名单 (github/google)
- P2-12 evaluateCondition eq 改浮点容差比较
- P2-13 api_metrics 加平台域调用方校验,防租户域误用泄露
- P2-14 删除 listProjectApiKeys 死代码
2026-07-26 12:31:41 +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 6665b1e113 refactor:重构渠道调度功能 2026-07-25 20:48:15 +08:00
martin 75bc4038db fix:修复文件管理可能导致的越权操作 2026-07-25 20:10:35 +08:00
martin 48c72f1eb4 chore:抽取公共方法降低重复代码 2026-07-25 19:59:28 +08:00
martin e9b5592666 fix:修复租户数据导出功能 2026-07-25 19:57:50 +08:00
qian 9374c64bad feat:用户多次输错密码被锁后可以由管理员解锁 2026-07-24 00:18:29 +08:00
chengqian c0a0d9b7ac Merge remote-tracking branch 'origin/fix/ai_check' into fix/ai_check 2026-07-23 22:10:02 +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 95e5283e28 fix:修复float金额带来的误差 2026-07-23 17:36:38 +08:00
qian 52ef686202 feat:模型列表显示模型可用渠道 2026-07-23 00:32:44 +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
chengqian 527a59d557 fix: 修复代码分析报告中的低优先级问题
- notification.go: containsAny 改用 strings.Contains 简化
- docs/openapi.go: buildOpenAPISpec 透传 ctx,消除 nil context
- batch_writer.go: 缓冲区溢出丢弃记录时增加计数与告警日志
- billing/wallet.go: 删除无调用方的死代码 CheckBalance
- tenant/open_platform.go: WebhookConfigUpdate 校验受影响行数
- tenant/member_import.go: 后台导入改用 WithoutCancel 保留 request_id
- session.go: GetSessionByID/RevokeSession 增加 user_type 隔离,
  防止 admin/tenant 跨控制台按 ID 吊销他人会话
2026-07-22 18:11:02 +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 c237fb6c3f fix:修复模型列表过滤参数无法筛选定价 2026-07-18 22:57:04 +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
79b9224968 注册功能优化 (#10)
* fix:修复权限问题

* fix:修复项目key类型错误问题

* fix:修复rbac权限问题

* fix:修复api密钥未及时失效的问题

* improve:优化渠道调度稳定性

* improve:优化路由

* fix:修复项目预算控制缺陷

* fix:加强限流等安全措施

* feat:添加限流相关字段的前端展示及接口字段

* improve:优化注册时密码要求,只需要字母和数字即可

* feat(setting):添加注册限流设置

* improve:优化前端数字类型转换

* chore:rbac权限放行

* feat:团队功能作为可选项,允许不设置团队的情况下进行注册

* feat:团队code只能设置一次

* improve:优化组织名称限制

* chore:合并数据库版本文件

---------

Co-authored-by: chengqian <wuchengqian@kkidc.com>
Co-authored-by: qian <wuchengqian5@163.com>
2026-06-23 23:07:36 +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
Qianandqian 501726b831 优化用户相关功能 (#8)
* improve(user):优化注册功能提示

* improve(user):优化邮箱大小写重复问题

* improve(user):添加密码强度指示器

* fix(setting):修复系统设置功能里面的数字转换问题

* feat(email):优化邮件发送功能

* chore(email):移除无用配置和日志

* fix(user):修复重置密码功能

* chore(ui):调整轮询间隔

* chore(ui):添加充值提示

* chore(ui):优化用户注册功能

* chore(sql):补充数据库变更文件

* fix(email):优化邮箱校验

---------

Co-authored-by: qian <wuchengqian5@163.com>
2026-06-17 22:47:26 +08:00
chengqian a1f637fb2a feat:添加用户协议文档管理功能 2026-06-11 17:49:55 +08:00
chengqian 6dc69944d1 feat:模型分组添加默认字段 2026-06-11 16:10:54 +08:00
chengqian 5f72629835 feat:添加模型数据来源 2026-06-11 15:11:00 +08:00