平台管理与系统管理员
平台管理是云端商业运营的控制面:独立于用户账号体系的 admin 账号、覆盖用户/空间/计费/模型目录/系统配置的管理后台,以及支撑按量计费的账单与支付链路。本页按模块讲清管理后台能做什么、门控口径在哪里、计费的钱怎么算。
概念
| 概念 | 说明 |
|---|---|
| admin 账号 | 独立账号体系(AdminUser,app/models/admin.py),与用户表分离,token 以 is_admin=True 解码 |
| 平台厂商接口 | ModelProviderAccount:平台侧持有的上游厂商 key 与余额,是「系统模型按量」通道的出资方 |
| feature_flags | 系统级功能开关,含会员总开关 membership_enabled |
| plans | 会员定价方案(app/models/billing.py 的 Plan),价格与 features 门控清单 |
| 模型目录 | 全站可选模型清单:BYOK 16 款(0 价)+ 平台系统行 8 款 + opencode 聚合 41 款 |
管理后台模块
admin 后台路由统一挂在 /api/admin/ 下(app/api/admin/endpoints/),独立登录入口 /api/admin/auth/login,管理员操作落 AdminAuditLog 审计表:
| 模块 | 端点文件 | 职责 |
|---|---|---|
| 仪表盘 | dashboard.py | 经营总览 |
| 用户管理 | users.py | 列表/详情(含订阅与余额)、状态(active/inactive/banned)、手动调 tier、删除 |
| 空间管理 | tenants.py | 租户 CRUD、席位与成员数 |
| 计费管理 | billing.py | 计费统计、订阅列表、优惠码(coupon)全生命周期 |
| 模型目录 | llm_models.py | 模型行 CRUD、平台厂商接口管理 |
| 系统配置 | system.py | 系统健康(DB/磁盘/内存/Ollama)、系统配置与 feature_flags、支付配置(加密存储、掩码回显) |
| 监控指标 | monitoring.py、metrics.py | Prometheus 抓取端点、业务指标 |
| 其他 | content.py、logs.py、reports.py、gdpr.py、support.py | 内容管理、日志、运营日报查阅、GDPR 合规、工单 |
平台厂商接口与余额巡检
平台按量通道(sys- 前缀模型行)走 ModelProviderAccount 里登记的平台 key 扣费。管理后台可见可管的厂商接口共 4 家:opencode / deepseek / dashscope / glm。
- 账户字段含
balance_cny/balance_usd(余额登记)、failure_count/last_failure_at(健康度)、is_active/priority(调度口径)。 - 连通性测试:
POST /api/admin/.../provider-accounts/{id}/test走生产分发路径实测,不是裸 ping。 - 安全:
base_url更新过 SSRF 校验——必须是 http/https、禁 localhost/内网 IP/保留地址。 - 运维口径:构建类任务先查上游余额。平台账户余额可以为负(DeepSeek 账户曾到 -0.17 并置
is_available=false),图谱构建/自动进化直连欠费账户会整链失败——「模型不通」先巡检余额与失败计数,再怀疑代码。
会员与定价门控
- 会员总开关:
feature_flags.membership_enabled(默认开=缺键即开),判定入口billing_service.check_feature_access;关闸期间全员放行。桌面侧desktop_gate.membership_enforced同口径,断网沿用缓存、NULL fail-closed。 - plans:
Plan行以 slug 为身份(显示名绝不当身份字段回写),价格以分存储(price_monthly/price_yearly),features/limits为 JSON 清单;续费/权限/tier 判定全走 plan features,不写死 slug 判断。 - 现行方案:Pro 三档同权(原价 / 6 折 / 3 折,功能完全一致),slug=storage 档独有每月返 ¥3 按量余额;折扣档不返 ¥3、不能用优惠码。
- 改 plan 结构/价格/features 必须同步测试夹具:测试库的 plans 是 conftest fixture 播种的(血泪#66)。
模型目录管理
- 目录行即账单数据:BYOK 行为 0 价非系统行(用户级 key 自付),平台行为
sys-前缀有价is_system行。在架:BYOK 16 款 + 平台 8 款 + opencode 聚合 41 款。 - 目录行不是通道分类器:本地模型为记用量也有目录行,通道判定必须走
app/services/llm_service/channel_policy.py(local 优先于目录查表),新增模型/通道代码只问「过没过 channel_policy」。 - 管理端 CRUD 见
llm_models.py(模型行)与厂商接口端点;前端选型回填唯一入口是consoleModel.ts。
支付计费链路
账单服务 app/services/llm_billing_service.py 与支付服务 app/services/payment_service.py 的关键机制:
| 机制 | 实现 | 说明 |
|---|---|---|
| 乐观锁重试 | _atomic_update_balance / ConcurrentModificationError | 余额更新按版本号比较-交换;fail_with_retry 等封装冲突最多重试 3 次 |
| 冻结-结算-释放 | freeze / complete / fail | 调用前冻结预估价、成功结算实价、失败释放冻结;冻结超时由 sweep_stale_pending_records 清扫 |
| 验签 fail-closed | 微信 verify_webhook(payment_providers/wechat.py) | enabled 但凭证缺失时拒绝放行;验签异常一律返回 None,不放过伪造回调 |
| 回调幂等 | _apply_payment_result | 终态保护(refunded/failed 不可再迁移)、已处理通知不重复充值/续订 |
| 微信退款 | out_refund_no 逐笔唯一 | 部分退款可多次发起,幂号取「订单号+时间戳+随机段」 |
| 返 ¥3 | grant_pro_monthly_bonus | 幂等:reference_id = pro_bonus:{subscription_id}:{month},同月只发一次,按 features 门控 |