feat(usage): import Grok Build official-mode usage from session logs

Grok CLI's official OAuth mode cannot be routed through the local proxy
(empty config is the mode switch, so there is no injection point), which
left official-mode usage invisible. Add session_usage_grokbuild to
import usage from ~/.grok/sessions updates.jsonl:

- Only turn_completed events carry usage; each event is the independent
  per-turn total (accumulated across inference loops within one prompt),
  so events are imported at face value. Do not reintroduce differencing
  of adjacent events: counters reset every turn and differencing would
  massively under-record.
- Cost priority: reported costUsdTicks (1 tick = 1e-10 USD) wins when
  complete, because the backfill only repairs rows with total <= 0 and
  can never correct a positive mispriced value; local pricing fills the
  breakdown and raises a drift warning above max(1% of reported, 1e-6).
  costIsPartial marks the reported value a lower bound: prefer a full
  local recompute when the model is priced, else record the lower bound.
- Idempotency key grok_session:{session}:{prompt_id}:{model} anchors on
  the upstream per-turn UUID (index fallback only when prompt_id is
  empty), so rewind truncation cannot shift keys and double count;
  orphan rows from truncated turns are kept since the tokens were spent.
- Anti double-count vs proxy takeover: 10min settle window plus a
  time-window guard over recent grokbuild proxy activity; guarded skips
  never mark files as synced.
- Seed grok-4.5-build pricing 2/6/0.30, back-derived from exact
  costUsdTicks samples (cache read bills at 0.30, not the listed 0.50).
- Map _grok_session to a friendly provider display name and refresh the
  takeover-capability comment in services/proxy.rs.
This commit is contained in:
Jason
2026-07-23 17:00:03 +08:00
parent 3cf84ca362
commit cd161f4401
6 changed files with 1201 additions and 2 deletions
+5 -2
View File
@@ -1505,8 +1505,11 @@ impl ProxyService {
/// Grok Build live 是否具备可接管的自定义模型表。
///
/// 官方态 liveGrok CLI 自带 OAuth 登录、无 `[model.*]` 表)没有注入
/// 占位符的落点,且官方供应商本就禁止经代理接管(封号风险),调用方
/// 应跳过接管或直接报错。
/// 占位符的落点Grok CLI 以「config 是否为空」区分官方 OAuth / 自定义
/// 供应商两种模式,表达不出「官方 OAuth + 自定义 base_url」。官方供应商
/// 的接管能力门见 `official_provider_supports_proxy_takeover`(按应用逐个
/// 开,目前仅 Codex),调用方应跳过接管或直接报错。官方态的用量统计由
/// `session_usage_grokbuild` 从会话日志导入,不依赖代理。
fn grok_live_config_supports_takeover(config: &Value) -> bool {
config
.get("config")