feat(gateway): SaaS P2 计量·增量2 —— 积分账本 + 物化余额 + 用量 rollup
- credit_ledger(append-only):grant/usage/adjust 分录,扣量/充值的事实源。 - tenant.credit_balance_micro:物化余额(= 账本之和),用量扣、充值增。 - usage_rollup:租户/天 upsert 累加(配额/账单读一行,不扫明细)。 - 消费 usage_event 一个事务内:落明细 → applyUsageCredit(账本负分录+扣余额) → upsertRollup(累加)。幂等锚在 usage_event.task_id 唯一:RowsAffected==0(重投) 则跳过账本/余额/rollup,绝不重复计费。软扣:余额可为负(不拦,硬闸留 P4)。 - GrantCredits 充值/发放 API(记 grant 分录+增余额;增量3 admin 接)。 live 验证:ledger 负分录(ref=task_id) / 余额递减 / rollup 两任务累加(count=2,tok/credits求和) / **balance==seed+SUM(ledger) 不变量成立**(物化余额 == 账本真值)。 增量3(GET /admin/usage 趋势+余额)待做。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+14
-1
@@ -175,7 +175,20 @@ RBAC 未做,暂以单管理员账号代理;概览口径必须是**系统级*
|
||||
误过滤的回归;RecentTasks/RecentRuns 按 owner+tenant 过滤"我的运行"(raw Table 查询手动补);
|
||||
BackfillRowTenants 扩到 doc/doc_link/task/eval。live 验证:创建自动填/异步补/跨用户读被过滤/admin
|
||||
全局口径全过。**PG 核心表(KB/Agent/Task/Eval/Doc/DocLink)隔离闭合。**
|
||||
- [ ] Redis/MinIO/Milvus/Neo4j 的 tenant 前缀/namespace(各存储隔离,PG 已闭合)| M
|
||||
- [~] Redis/MinIO/Milvus/Neo4j 的 tenant 前缀 —— **实为已隔离,暂缓**:`scopedKB=userID+"/"+name`
|
||||
贯穿全存储(Milvus expr / Neo4j `{kb}` / MinIO key `owner/kb/doc` / Redis 按 user 键),userID 服务端注入
|
||||
不可伪造 → 已按 owner 隔离;owner→tenant 1:1 故亦按租户隔离。仅当**多成员租户共享同一 KB**(工作区)
|
||||
时才需把命名空间从 `owner/name` 改 `tenant/name`——按需求拉动,别过早抽象。
|
||||
- **[~] P2 用量计量(SAAS_P2_DESIGN.md)** —— 积分为单位(token 直计=汇率1),扣量走扣积分。
|
||||
- [x] **增量1:链路 + 明细 + 折算**✅(d032c19)—— Meta/契约加 tenant→dispatcher 带;`usage_event`
|
||||
追加式明细(task_id 唯一幂等);credits(token基准×credit_weight) + cost(Pricing)折算落库。live 验证折算数学+租户传播。
|
||||
- [x] **增量2:账本 + 余额 + rollup**✅ —— `credit_ledger`(append-only,grant/usage/adjust) +
|
||||
`tenant.credit_balance_micro` 物化余额(软扣可负) + `usage_rollup`(租户/天 upsert 累加);
|
||||
消费 usage_event 时**一个事务内**落明细→扣积分(账本+余额)→累加 rollup,幂等锚在 usage_event.task_id
|
||||
唯一(RowsAffected==0→重投跳过,绝不重复计费);`GrantCredits` 充值 API(增量3 admin 接)。
|
||||
live 验证:ledger 负分录 / 余额递减 / rollup 两任务累加 / **balance==seed+SUM(ledger) 不变量成立**。
|
||||
- [ ] 增量3:`GET /admin/usage`(用量+积分+成本+余额趋势) | S
|
||||
- [ ] (P4 硬拦截 `CREDIT_ENFORCE` / 充值发放 / 前端用量页 —— 需求拉动)
|
||||
- [ ] 真正的 RBAC:User 加 role 字段 + 角色/权限表,`RequireAdmin`(middleware/auth.go:46) 从白名单升级为角色校验 | M
|
||||
- [ ] 用户管理接口:列举 / 禁用 / 改角色(现仅注册/登录/查我,handler/auth.go)| M
|
||||
- [ ] 多租户:Task/Eval/KB/Agent 加 tenant_id,owner_id 之上补租户隔离边界 + 租户表/关联表(store 全表,单租户假设)| L
|
||||
|
||||
Reference in New Issue
Block a user