| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat(hooks): add pre_auth hook framework + minimal demo 新增可选的 pre_auth hook 框架,让定制逻辑(加前缀/查表转换/拒审等) 以 cdylib 插件形式接入,gateway 不需要为每家定制逻辑重编。 架构: - boom-hooks-sdk (叶子 crate,0 个 boom-* 依赖): 定义 wire types (PreAuthRequest/Action/Response) + pre_auth_entry/hook_init_entry helper,封装 catch_unwind + JSON 序列化 + buffer 写入 + return code - boom-main/src/hooks/mod.rs: HookRegistry 用 libloading 加载 .so, Symbol<'static> transmute(lib Arc 在同 struct 保活),failure_mode 在 registry 层消化(allow 降级走原生认证,deny 返回 500) - boom-config: HooksConfig/PreAuthHookConfig,默认全关闭 - extractor: 认证入口插入 pre_auth 调用点,5 种 outcome (NoHook/Continue/Replace/Reject/Deny) 安全边界: - C ABI + JSON wire protocol(跨 .so 不传 Rust 类型) - catch_unwind 隔离 plugin panic - allowed_headers 白名单(默认全屏蔽,避免敏感 header 泄漏) - hook 可选: 不配置时零开销走原路径;加载失败启动报错; 运行期 panic 按 failure_mode 兜底 仓库根目录 hook/ 是一个最简 pre_auth demo,独立 workspace: - mask_key(): 前 3 字符 + 中间全 * (len-9) + 末 6,长度 < 9 退化为全脱敏 + (len=N) 避免泄漏 - pre_auth 符号打印 masked key + allowed_headers 到 stderr, 返回 Continue 让 gateway 用原 raw_key 走原生认证 - 5 个单元测试覆盖 13/15/9 字符边界、过短、Unicode 场景 Signed-off-by: liqiang <liqiang64@huawei.com> | 5 天前 | |
feat: 独立 boom-quota 模块 + team/key 双层配额计费体系 新增 boom-quota crate 作为配额计费的独立模块(仅依赖 boom-core), 集中后续配额相关演进。实现完整的 team+key 双层限制: - team: concurrency / rpm / window / tpm-1min / total-tpm / total-cost - key: concurrency / rpm / window / tpm-1min / total-tpm / total-cost - key 限制被框在 team 之下;任一层超限即拒绝,错误信息含 scope/ scope_id/plan_name/limit_type。 - 计费 token 数来自 vllm 返回(非自算),cost 按 model_info 中 input/output_cost_per_million_tokens 费率计算。 缓存命中/不命中分计费: - ModelCostRate 新增 cached_input_cost_per_token 字段;compute_cost 按 (input-cached)×input价 + cached×cached价 + output×output价 计算。 - cached_tokens 数据来自 vllm usage chunk 的 prompt_tokens_details.cached_tokens,经 UsageTrackerState 传递到 LoggedStream::drop / 非流式响应完成时调 PlanCharge::settle。 - cached_input_cost_per_million_tokens 缺省 0 时回退为按 input 价计 (向后兼容)。 计费模板(cost_templates): - 顶层配置 cost_templates 定义可复用的命名费率模板(input/cached/ output 三档价)。 - model_info.cost_template 引用模板名;模板字段优先于 inline 字段, 避免歧义。模板名找不到时 warn 并回退到 inline 字段,不静默按 0 计费。 配置面单位改为百万 token: - YAML 字段重命名为 *_per_million_tokens(input/cached/output), 值用 0.27 而非 0.00000027,配置更直观。 - state.rs 解析时把 per_million_tokens 除以 1e6 转为内部 per-token Decimal 费率。ModelCostRate 内部字段名保持 *_per_token(计费粒度), compute_cost / settle_usage 公式不变;DB cost 仍存 micros(计算后金额, 非费率),向后兼容已有数据。 持久化:cumulative counters 持久化到 boom_rate_limit_cumulative, 1-min TPM 窗口复用 boom_rate_limit_state。30s dirty-sync 后台任务 保证崩溃损失 ≤ 30s;启动时 restore_from_db 全量恢复。 架构: - boom-quota 仅依赖 boom-core(叶子模块)。 - 不破坏既有 AppState 生命周期 / AdminCommand 模式 / 热加载规则。 - PlanStore 扩展 team_assignments,team plan 拒绝分配给 key(warn + default_plan 回退),member_plan 为 team 下 key 的默认 plan。 - PlanType 在 boom-core 定义为单一来源,boom-config / boom-limiter 均从 boom_core::types::PlanType re-export。 - cost 在 DB 存为 BIGINT micros (1e-6 USD),避免 rust_decimal 的 sqlx 集成问题。 Dashboard 配额看板(本次新增): - DashboardState 加 quota_store: Arc<QuotaStore> 字段,main.rs 调用 方同步更新。 - /user/usage 重写为多维 window + cumulative:按 window_secs 分组, 每组 dims 字典含 counts/tokens/costs,cumulative 单独一块。 - 6 个 admin quota 端点:/admin/quota/{overview,team/{id},unassigned, key/{hash}/windows,reset/key/{hash},reset/team/{id}};累计数据 全部用 SQL JOIN 拿,避免 N+1 内存扫描。 - QuotaStore 加 peek_key_windows / peek_team_windows / scan_windows_with_prefix 批量读 API;WindowInfo 结构暴露给 dashboard。 - 前端 normalizeWindowLimit 兼容 2 元素数组、4 元素数组、对象三种 WindowLimit 序列化格式;renderPlan/renderUsage/renderPlansTable 全部修复;多维 window 合并成一张宽卡,cumulative 单独一张。 - 新增 admin-quota section:overview → team 详情/无 team 详情切换, 分页+搜索+排序+reset key/team(key 数量上万时分页 + 搜索足够)。 Signed-off-by: liqiang <liqiang64@huawei.com> Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: liqiang <liqiang64@huawei.com> | 28 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 5 天前 | ||
| 28 天前 |