外观
中转配置信息 API 与权益展示
走中转接口的插件,一律不要在代码里写死币数和次数。每个中转接口都有一份公开配置,后台改策略插件自动跟着变:
http
GET {ZhinianHost.BASE_URL}/api/v1/{route}/config # 无需登录
{ "code": 0, "msg": "ok",
"data": {
"route": "ai-images-generations",
"remark": "AI生图-GPT Image 2-1k", // 后台起的人话名字(内部标识,卡片里不展示)
"mode": "user", // user = 需登录按用户计次;其余 = 客户端令牌模式
"consumeMode": "paid", // 消费策略主轴(free / paid),见下表
"consumeCoins": 8, // 单次消耗执念币
"freeDailyLimit": -1, // -1 = 不限次数,0 = 该通道被关闭
"paidDailyLimit": -1,
"memberDailyLimit": 60, // 会员单日免费次数(-1 = 不限)
"memberFallbackPaid": true, // 会员额度用尽时降级为付费(用尽后是否扣执念币)
"clientTokenDailyLimit": -1,
"enabled": true // false = 接口暂停服务
} }consumeMode 是策略主轴,判定逻辑与后端 ApiRelayService.checkAccessAndRateLimit 一一对应(写权益文案前先看这张表)。后台只有两个策略:免费(free)与 付费(paid);付费策略上的"会员额度用尽时降级为付费"开关单独存成 memberFallbackPaid,不是策略值:
| consumeMode | 后端真实行为 |
|---|---|
free | 不扣币,只看 freeDailyLimit |
paid+ memberFallbackPaid: false | 非会员一律扣 consumeCoins;会员额度内不扣币,额度用尽返回 429「今日会员额度已用尽,请明天再来」(不接着扣) |
paid+ memberFallbackPaid: true | 非会员一律扣 consumeCoins;会员额度内不扣币,用尽后接着扣 consumeCoins(受 paidDailyLimit 限制) |
TIP
现成工具,别自己造。obsession-shared 已经封装好这件事:工具层 com.hualuo.zhinian.box.common.relay(RelayConfigClient 取配置、Benefits 把策略转成权益文案),卡片层 com.hualuo.zhinian.box.common.ui.BenefitCard(「权益说明」卡片,样式已按 UI 规范封好)。插件侧一行到位:
kotlin
val relay = RelayConfigClient.fetch("ai-images-generations") // 带 5 分钟缓存,失败返回 null
RelayConfigClient.cached("ai-images-generations") // 首帧同步取缓存,页面不闪
BenefitCard(config = relay) // 「权益说明」卡片
relay?.consumeCoins // 单次消耗也用它,别再另开接口六条约定:
| 规则 | 原因 |
|---|---|
只有 paid(付费)策略才渲染 | 免费接口不用跟用户解释"这是免费的";免费 / 令牌 / 未知策略返回空列表,卡片自动不画,插件不用自己判断 |
| 币数、次数只从这份配置读 | 写死就只能等插件发版才能跟后台变化 |
-1 = 不限次数,0 = 该通道被关闭 | 两者都不渲染次数行 —— 没有次数行就等于不限,别写"每天 0 次" |
| 币数任何时候都要渲染,开关只管「会员额度用尽后还接着扣不扣」 | 非会员一律扣 consumeCoins,所以币数行跟开关开合无关;开关只影响会员 —— 关掉时会员额度用尽直接拒绝,没有付费通道。币数前缀由卡片按 memberDailyLimit + 开关自动算,别自己写死(写死"超出后"会在会员不限次、或会员没有免费段时说出逻辑不通的句子)。「会员额度用尽后今日不可用」这类预警也是卡片自动加的 |
| 取不到配置时整块不渲染,不报错、不占位 | 权益是补充说明,不该让页面变空或弹错 |
| 一张页面只放一张权益卡片,放在主内容之后 | 它是说明不是主内容;主内容一屏一个 |
文案只讲策略,不讲当前账号状态:不写"你已是会员 / 你还不是会员",也不出现路由名、配置名、接口名 —— 会员状态会过期,缓存旧了就显示错;内部概念用户也不关心。
WARNING
不要各插件复制一份。MediaExporter 曾经每插件一份(13 份副本、API 已开始分叉),现已统一到 obsession-shared 的 com.hualuo.zhinian.box.common.mediaexport.MediaExporter。14 个插件的本地副本已全部删除并切到 shared 版。中转配置读取与权益卡片一律用 obsession-shared 里的,不要再建副本。