OpenHuman 账单与用量体系解析:云端计费 RPC 与本地实时成本仪表盘
OpenHuman 账单与用量体系解析云端计费 RPC 与本地实时成本仪表盘【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhumanOpenHuman 将钱花在哪里拆成两个相互独立又互补的台账面向托管后端的Billing计费以及完全留在本地的Cost Usage成本与用量。本指南以 billing-and-usage.md 为核心脉络结合仓库中src/openhuman/hosted/billing与src/openhuman/platform/cost的源码实现讲解套餐、积分、自动充值、优惠券的 RPC 接入方式以及按 token 实时核算成本、执行预算封顶、渲染 7 天仪表盘的完整机制。读完你将掌握如何配置[cost]预算块、理解check_budget的强制语义边界、区分云端账单与本地用量的数据流向并能在源码中定位每一条费用链路。双台账架构Billing 与 Cost Usage 的分工OpenHuman 刻意维护两套账本它们的归属与生命周期完全不同Billing计费你向托管后端支付的费用——套餐、积分充值、已保存卡片、优惠券全部经 Stripe 或 Coinbase 结算。它存在于云端。Cost Usage成本与用量Agent 替你消费的 token 所折算的美元成本按每次 provider 调用在本地追踪让你在账单落地之前就能看到并封顶真实的 token 开销。一句话概括文档的定位前者活在云端后者从不离开你的工作区workspace。在源码中这两块分别由 src/openhuman/hosted/billingRPC 适配器和 src/openhuman/platform/cost/README.md本地成本追踪模块承载下文分两部分深入。Part 1Billing 云端计费薄 RPC 适配器不含任何支付逻辑billing域是一个薄 RPC 适配器本身不持有支付逻辑或状态。从 ops.rs 的模块注释可以确认其安全模型每个操作都携带通过auth_store_session保存的 app-session JWT以Authorization: Bearer …头发送 HTTPS 请求到托管后端/payments/*、/coupons/*并把后端的 JSON 响应原样透传给调用方授权、套餐归属与支付策略全部由后端强制执行本地不复制任何服务端授权逻辑会话缺失或失效时直接透传后端的401/403get_authed_value通过flatten_authed_error把预期的Unauthorized映射成SESSION_EXPIRED哨兵让 JSON-RPC 层将其归类为会话过期并跳过 Sentry 上报见 ops.rsJWT 与卡片数据永不写入日志日志只记录脱敏后的状态码与路径。在发 HTTP 请求之前适配器只做轻量输入校验同样见 ops.rsplan / coupon / payment-method id 必须非空trim后判空amountUsd必须是有限正数is_finite() 0见top_up_creditsgateway 白名单仅允许stripe/coinbasenormalize_gateway空或纯空白网关会被归一化为 Stripe。套餐与定价三个套餐各提供月度与年度两种计费周期套餐月度年度相对按量付费的每调用折扣Free$0$0无按量付费基线Basic$19.99$199每次调用便宜 50%Pro$199.99$1,799.99每次调用便宜 90%文档特别强调更高套餐并不是解锁更多功能而是降低相对按量付费基线的每调用毛利。所有套餐都能访问一切——你购买的是更便宜的推理而不是被门控的能力。支付渠道系统只接入两条网关Stripe套餐购买Checkout 会话、客户账单门户billing portal、积分充值、已存卡管理SetupIntent与自动充值。Coinbase Commerce加密货币支付用于积分充值与年度账单。两个默认值值得注意top_up_credits默认走stripe网关create_coinbase_charge的interval默认是annual源码中unwrap_or(annual)见 ops.rs。积分、充值、自动充值在订阅之外你持有一个USD 积分余额。可以读取余额GET /payments/credits/balance分页浏览交易历史GET /payments/credits/transactions?limitoffset默认limit20、offset0见 ops.rs通过任一网关充值POST /payments/credits/top-up请求体为{ amountUsd, gateway }其中gateway缺省为stripe自动充值Auto-recharge仅 Stripe当余额偏低时从已存卡自动补充积分可以读取和更新设置GET/PATCH /payments/credits/auto-recharge并列出 / 新增 / 更新 / 删除已存卡/payments/credits/auto-recharge/cards系列端点。添加卡片会创建 Stripe SetupIntentPOST /payments/credits/auto-recharge/cards/setup-intent删除卡片被视为危险操作。优惠券优惠券码向后端兑换POST /coupons/redeem请求体{ code }code 必须非空并可通过GET /coupons/me列出当前账户已兑换的优惠券。对应源码见 ops.rs。桌面端 Billing 面板与 Agent 工具桌面端Settings → Billing面板刻意不内嵌支付 UI而是链接到托管的 Webbilling dashboard——那是管理套餐、卡片与发票的唯一入口。Agent 可以通过默认开启的只读工具读取账单状态当前套餐、余额、交易、卡片、优惠券、Stripe 门户链接所有涉及资金移动或支付方式的写操作则默认关闭受billing_writes开关控制且删除卡片被标记为危险操作。这与 settings_agent/agent.toml 中的注释一致Settings Agent 只继承会话/凭据/OAuth 读取等只读账户状态资金移动与团队管理相关的写工具族不在此列。RPC 面15 个方法命名空间billing暴露为openhuman.billing_*。从 schemas.rs 可以列出完整 15 个注册控制器方法后端端点说明billing_get_current_planGET /payments/stripe/currentPlan当前套餐billing_get_balanceGET /payments/credits/balance积分余额billing_purchase_planPOST /payments/stripe/purchasePlan创建套餐购买会话参数{ plan }billing_create_portal_sessionPOST /payments/stripe/portal客户账单门户会话billing_top_upPOST /payments/credits/top-up积分充值{ amountUsd, gateway }billing_create_coinbase_chargePOST /payments/coinbase/charge加密支付链接{ plan, interval }billing_get_transactionsGET /payments/credits/transactions交易历史limit/offsetbilling_get_auto_rechargeGET /payments/credits/auto-recharge自动充值设置billing_update_auto_rechargePATCH /payments/credits/auto-recharge更新自动充值设置billing_get_cardsGET /payments/credits/auto-recharge/cards已存卡列表billing_create_setup_intentPOST /payments/credits/auto-recharge/cards/setup-intent创建 SetupIntentbilling_update_cardPATCH /payments/credits/auto-recharge/cards/{id}更新已存卡billing_delete_cardDELETE /payments/credits/auto-recharge/cards/{id}删除已存卡危险billing_redeem_couponPOST /coupons/redeem兑换优惠券billing_get_couponsGET /coupons/me已兑换优惠券列表Part 2Cost Usage 本地成本仪表盘cost域完全本地化。其核心职责在 platform/cost/README.md 中有完整定义把每次 provider 调用的 token 用量与折算的美元成本追加写入 append-only JSONL 文件workspace/state/costs.jsonl在内存中维护日/月聚合执行预算封顶并通过 JSON-RPC 提供 7 天仪表盘。Agent 回合循环每次 provider 调用后记录遥测与仪表盘处理器共享同一个进程级单例追踪器因此每次调用恰好持久化一次。本地 JSONL 存储与进程级单例存储路径workspace/state/costs.jsonl每行一条CostRecord写入采用write sync_all保证持久性首次CostTracker::new时会做遗留数据迁移旧路径workspace/.openhuman/costs.db会被改名失败则回退为复制到新路径见 tracker.rs全局单例由OnceCellArcCostTracker承载global.rsinit_global幂等且初始化失败只记日志、绝不 panic未初始化的调用方把缺失当作软 no-op存储层同时维护daily_cost_usd/monthly_cost_usd缓存在日/月翻卷时通过全文件扫描重建损坏的行跳过并记warn。实时 token 与成本追踪每次调用的成本由 token 数与每百万 token 单价计算得出TokenUsage::new非有限或负数的价格被钳制为0.0。判定优先级是若 provider 回传了权威的charged_amount_usd该值直接胜出记录标记为CostSource::ProviderCharged否则回退到内置静态定价目录已知模型的每百万 token 价格记录标记为CostSource::Estimated。build_token_usageglobal.rs还包含几个关键细节全零用量跳过input0 output0 charged0.0时返回None不落盘避免不回报用量的 provider 虚增请求计数缓存输入 token 会被钳制到input_tokens以内cached_input_tokens.min(input_tokens)时间统一按UTC分桶naive_utc().date()以 model 为分桶键provider由provider/model前缀推导会话级VecCostRecord支撑get_summary的 session 维度汇总。默认定价目录来自 identity_cost.rs单位USD / 1M tokens模型标识与 types_part_01.rs 中的托管模型注册表对应模型 tier标识输入单价输出单价Reasoningreasoning-v10.842.52Chatchat-v10.602.50Reasoning Quickreasoning-quick-v10.602.50Agenticagentic-v10.451.80Codingcoding-v10.903.30Burstburst-v10.2080.208双向统一价此外还有独立的 embedding 成本记录路径record_embedding_usage以provider/model如voyage/voyage-3为桶键经catalog::estimate_cost_usd定价若模型不在定价目录中则以零成本记录并打日志绝不伪造费率且该路径非致命、不会中断 embed 或召回回合。预算与强制[cost]配置块预算强制在[cost]配置块下配置配置项默认值作用enabledtrue只门控强制不门控遥测采集daily_limit_usd10.00硬性每日上限monthly_limit_usd100.00硬性每月上限warn_at_percent80check_budget的告警阈值百分比一个典型的config.toml片段[cost] enabled true daily_limit_usd 10.0 monthly_limit_usd 100.0 warn_at_percent 80 [cost.dashboard] enabled true currency USD warn_threshold 0.8 alert_threshold 0.95check_budget返回三态Allowed、Warning达到告警阈值、Exceeded超过日或月上限。源码中的判定顺序tracker.rs是先算projected 当前花费 本次预估先比日上限、再比月上限、最后比告警阈值warn_at_percent.min(100) / 100换算成百分比阈值命中即返回对应状态。最关键的一个细节enabled控制的是强制而不是采集。当enabled false时check_budget直接返回Allowed硬性上限关闭但 Agent 路径走的是record_usage_unconditional无条件记录costs.jsonl照常增长只是record_usage有条件版变成 no-op见 tracker.rs。这是成本仪表盘 PR 引入的刻意行为变更global.rs 在初始化时会为升级用户打一条warn日志说明让用户在开启硬性封顶之前先积累并审查历史花费。要隐藏面板设dashboard.enabled false要清空历史直接删除 JSONL 文件即可它完全本地、从不离开工作区。另一个容易踩的边界源码注释 #5016check_budget只针对managedOpenHuman 积分推理累计——自带 keyBYOK与本地推理由用户自己的 provider 计费会记录进仪表盘供查看但不计入预算上限、也永远不会因预算拒绝请求。纯 BYOK 用户的管理支出为零因此永远无法触发该闸门仪表盘中的month_to_date_usd虽展示全路由总额但预算利用率与状态只按 managed 花费计算tracker.rs避免出现对着一个永远不会触发的上限把仪表盘灌到 100%的幻影限制。7 天仪表盘Settings → Usage LimitsSettings →Usage Limits承载成本仪表盘与后台活动控制同页。它渲染7 天每日历史缺失天零填充最旧在前由get_daily_history的 BTreeMap 分桶保证见 tracker.rstoken 用量图表月度节奏预估monthly_pace_usd 日均值 × 30预算利用率与状态按模型拆分的成本占比。仪表盘的配色按月度预算的分数切换柱子到达warn_threshold默认0.8变琥珀色到达alert_threshold默认0.95变红色。budget_utilization显示时被钳制到1.0但budget_status由未钳制的原始值计算月上限非正数时状态强制为Normal、利用率为0.0。面板约每 10 秒轮询一次并显示 Updated Ns ago 的新鲜度胶囊。当全局追踪器尚未初始化例如启动竞态或构造失败时RPC 层通过resolve_tracker构建一个只读回退追踪器rpc.rs它与真实追踪器共享同一份 JSONL 文件按工作区路径缓存构造错误会在FALLBACK_ERROR_TTL30 秒内重放避免 UI 的 ~10 秒轮询反复锤击一个坏工作区。RPC 面命名空间cost暴露为openhuman.cost_*方法输入输出cost_get_dashboard无7 天分桶、汇总指标、预算利用率/状态、按模型拆分cost_get_daily_historydays?默认 7钳制在 1~366有序每日条目最旧在前缺口零填充cost_get_summary无实时 session / 日 / 月成本汇总RPC DTOCostDashboardDto、DailyCostEntryDto、ModelStatsDto、CostSummaryDto、UsageLogRecordDto见 rpc.rs在领域类型之上补充展示字段provider由provider/model前缀推导、percent_of_total以及来自cost.dashboard的阈值与enabled标志。这三个方法还作为只读、默认开启的 Agent 工具暴露给 Settings Agent见 settings_agent/agent.toml让 Agent 能自查自己的开销。同时cost_get_*工具遵循与账单相同的原则只读、默认开任何资金写操作都默认关。预算门在 Agent 运行时中的落地OpenHumanBudgetGate预算检查并非只服务于仪表盘展示——它直接参与 Agent 运行时的准入控制。budget_gate.rs 将 OpenHuman 的三个计量关注点汇聚到统一的BudgetGatetrait 上准入与背压scheduler_gate::wait_for_capacity持有全局单槽 LLM 信号量与 AC 电源 / CPU / 登出策略退避预算拒绝与记账CostTracker::check_budget与record_provider_usage经catalog::estimate_cost_usd定价压缩建议Agent 的 TokenJuice 配置档决定它能容忍多大程度的有损压缩。关键行为都有源码依据acquire先查预算、后排队超预算的调用在拿到全局 LLM 槽位之前就被拒绝TinyAgentsError::LimitExceeded避免一个付不起的调用占用本该给可负担调用的槽位未入目录的模型按0.0估算未知不等于免费且零估算只会让check_budget更宽松、不会制造拒绝交互式回合不进入后台调度闸门只有 cron / 潜意识 tick / 内存 worker 等后台工作通过as_background_work选择进入compression_hint用原子变量缓存三态预算压力PRESSURE_NORMAL/PRESSURE_WARNING/PRESSURE_EXCEEDED让运行时在回合每轮迭代之间都能廉价读取上下文利用率只用于升级已由预算触发的软提示ESCALATE_AT_UTILIZATION 0.9绝不单独发起压缩提示压缩提示最终经cap_hint按 Agent 的 TokenJuice 档位封顶Off一律返回NoneLight把Hard降为Soft并且提示是并集语义——本闸门不请求压缩 ≠ 禁止压缩。预算读取失败如 JSONL 损坏不构成拒绝——坏文件不该让任何 Agent 都无法运行因此按无预算意见放行并打日志。成本与 token 压缩让每一分钱都花得更少因为成本追踪的是真实 token 数任何能缩减 prompt 的机制都会直接降低开销TokenJuice token 压缩减少每次调用发送的 token 数模型路由把任务派发给能胜任的最廉价模型。两者最终都会体现为仪表盘上更低的柱子与更慢的预算消耗——这也是budget_gate在预算吃紧时主动给出压缩提示的原因预算压力驱动的压缩建议直接作用于每次调用的 token 成本。运维实践要点速查场景做法只想看历史、暂不封顶cost.enabled false遥测照常记录隐藏仪表盘面板cost.dashboard.enabled false清空成本历史删除workspace/state/costs.jsonl本地文件不会外传调低告警灵敏度改warn_at_percent预算检查与dashboard.warn_threshold/alert_threshold图表配色均为月度预算的分数排查没扣钱却超限检查是否误把 BYOK/本地推理计入 managed 预算——check_budget只对 managed 路由生效升级后的遗留数据旧.openhuman/costs.db会在首次初始化时自动迁移到新 JSONL 路径参见Token 压缩TokenJuice模型路由成本追踪模块设计与关键文件计费 RPC 适配器实现成本配置结构体与默认定价目录【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考