root
7941b4110a
refactor(billing)!: 计费全部沉入插件,内核零 billing 代码;规则由插件自持
按维护者要求(issue #1 回复方向):内核不处理任何 billing 特有逻辑;插件有完整
OS 权限,自己保存配置文件。据此不再保留任何"内核 ↔ billing 插件"的专用对接。
## 内核(删除)
- `internal/billing`(Go 编译器 + 测试):删除;
- `internal/core` 的 billing 接口/降级应用/规则加载:删除(含 `billingPath`);
- `internal/gateway` 的 `/api/plugins/billing/rules` 端点与测试:删除;
- `config` 的 `BillingDSL/Profile/Rule/Token/Peak/LongContext` 与校验、
`billing:`/`billing_file:` 配置段:删除。系统配置里不再有 billing 段。
内核只保留所有插件通用的能力:加载 .lua、插件状态持久化、插件目录
(`__llmsproxy_plugin_dir`)、`plugin.http` 路由、插件可用的 io/os。
## 插件(billing.lua)
- 规则文件移到**插件自己的目录**:`<plugin_dir>/billing.json`,由插件用 io 自己
读写(tmp + rename 原子替换);加载插件时自己读文件并编译;
- 规则以**源名** `source` 为键(`url:"*"` 仅表示全局模型价目表):URL→源名映射
属于内核配置,插件不为它和内核对接;编辑页在浏览器里取 `/api/sources` 选源名;
- 规则编辑 API 改为插件自己的 `/api/plugins/http/billing/rules`
(GET/PUT/POST/DELETE,roles=admin),写盘也在插件内完成;
- 计费账目仍在插件状态文件(内核通用持久化)`<plugin_dir>/.billing.state.json`;
- `priceFor` 落地 profile 级 `default` 策略与显式 `mode=unpriced` 的优先级。
## 迁移
生产已迁移:`config.yaml` 的 `billing:` 规则转为 `plugins/billing.json`(按源名
重写),并从系统配置中移除;规则文件与系统配置从此各自独立保存。
## 判据
- `internal/lua/billing_rules_test.go`:插件自写 billing.json 并重启恢复、
free/subscription/token/通配符编译语义、1e6+1e6 token = 0.75 端到端、
非法规则被拒且不覆盖旧文件、reasoning/long_context/peak;
- `internal/lua/billing_test.go`:profile default 策略三态 + 显式 unpriced 优先;
- `internal/lua/billing_ui_test.go`:规则编辑页仍挂在 billing 页内、列宽/列数守卫。
2026-10-20 18:57:23 +08:00
..
2026-10-14 15:43:09 +08:00
2026-10-14 15:35:49 +08:00
2026-10-13 13:42:45 +08:00
2026-10-14 20:00:58 +08:00
2026-10-14 20:00:58 +08:00
2026-10-14 15:24:24 +08:00
2026-10-16 20:47:14 +08:00
2026-10-13 13:42:45 +08:00
2026-10-14 16:18:27 +08:00
2026-10-14 16:18:27 +08:00
2026-10-16 07:51:21 +08:00
2026-10-14 20:00:58 +08:00
2026-10-19 16:26:59 +08:00
2026-10-16 00:56:14 +08:00
2026-10-13 16:51:15 +08:00
2026-10-13 16:51:15 +08:00
2026-10-19 13:43:18 +08:00
2026-10-13 16:51:15 +08:00
2026-10-20 09:13:56 +08:00
2026-10-11 20:50:52 +08:00
2026-10-19 16:26:59 +08:00
2026-10-16 13:51:36 +08:00
2026-10-14 20:00:58 +08:00
2026-10-19 16:26:59 +08:00
2026-10-19 17:21:22 +08:00
2026-10-13 15:44:51 +08:00
2026-10-13 13:42:45 +08:00
2026-10-13 13:42:45 +08:00
2026-10-19 16:26:59 +08:00
2026-10-13 13:42:57 +08:00
2026-10-16 21:49:12 +08:00
2026-10-13 13:42:45 +08:00
2026-10-13 07:41:42 +08:00
2026-10-15 22:43:08 +08:00
2026-10-19 16:26:59 +08:00
2026-10-20 09:54:06 +08:00
2026-10-13 13:42:57 +08:00
2026-10-20 08:27:28 +08:00
2026-10-19 16:26:59 +08:00
2026-10-19 16:26:59 +08:00
2026-10-14 20:00:58 +08:00
2026-10-19 22:32:18 +08:00
2026-10-13 15:52:26 +08:00
2026-10-13 13:42:57 +08:00
2026-10-20 08:27:28 +08:00
2026-10-20 08:27:28 +08:00
2026-10-19 16:26:59 +08:00
2026-10-20 08:27:28 +08:00
2026-10-14 20:12:10 +08:00
2026-10-13 13:42:57 +08:00
2026-10-13 13:42:57 +08:00
2026-10-20 10:12:51 +08:00
2026-10-17 17:38:23 +08:00
2026-10-13 13:42:45 +08:00
2026-10-17 17:38:23 +08:00
2026-10-13 13:42:45 +08:00
2026-10-17 17:38:23 +08:00
2026-10-20 09:38:39 +08:00
2026-10-20 09:13:56 +08:00
2026-10-16 00:56:14 +08:00
2026-10-17 17:38:23 +08:00
2026-10-17 17:38:23 +08:00
2026-10-14 16:09:22 +08:00
2026-10-16 13:51:36 +08:00
2026-10-16 17:44:04 +08:00
2026-10-15 08:22:57 +08:00
2026-10-15 08:22:57 +08:00
2026-10-15 20:30:33 +08:00
2026-10-15 08:22:57 +08:00
2026-10-16 01:38:34 +08:00
2026-10-17 00:01:00 +08:00
2026-10-13 13:42:57 +08:00
2026-10-13 15:38:35 +08:00
2026-10-13 15:38:35 +08:00
2026-10-19 16:26:59 +08:00
2026-10-20 18:57:23 +08:00
2026-10-11 20:50:52 +08:00
2026-10-13 13:42:57 +08:00
2026-10-15 08:22:57 +08:00
2026-10-14 16:00:34 +08:00
2026-10-13 13:42:57 +08:00
2026-10-11 13:52:29 +08:00
2026-10-19 16:26:59 +08:00
2026-10-19 16:26:59 +08:00
2026-10-13 16:11:11 +08:00
2026-10-07 17:37:22 +08:00
2026-10-19 16:26:59 +08:00
2026-10-13 13:42:45 +08:00