[Bug]: local_runtime_token_usage keeps model NULL for historical rows, so downstream tooling cannot price them
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 活発
- 技術スタック
- sqlite, typescript
調査の方向性
Start by locating the code that writes local_runtime_token_usage and the migration or initialization path for that table. Then inspect how session records provide history_relative_dir and how messages.jsonl stores message.model and turn_id. Decide how historical rows with missing session history should be handled; done means the chosen backfill or diagnostic makes missing model data observable and avoids misattributing rows.
索引モデルが issue の本文から書いたものです。
説明
Product or interface
Desktop app (the local-runtime usage ledger that third-party tooling reads).
Version
Desktop app 3.1.6 (build from 2026-10-23). The ledger lives in
~/.minimax/v2/sqlite/runtime-state.sqlite, table local_runtime_token_usage.
Platform
macOS (Apple Silicon).
OS version and architecture
macOS 27.0.1, arm64.
Issue area
Runtime / local-runtime — token usage ledger (local_runtime_token_usage).
Steps to reproduce
-
Use MCode on a build that predates the model being written, then upgrade to a
build that writes it (the fix is visible in the current build: rows written
after 2026-10-24 01:06 local carrymodel = 'minimax/MiniMax-M3.1-Flash'). -
Inspect the ledger:
sqlite3 ~/.minimax/v2/sqlite/runtime-state.sqlite \ "SELECT model, COUNT(*), SUM(input_tokens+output_tokens) FROM local_runtime_token_usage GROUP BY model;"On my machine:
| | 2928 | 30859470 | minimax/MiniMax-M3.1-Flash | 105 | 5845270Every row written before the fix has
model IS NULL; only rows written after
it carry a model.
Expected and actual behavior
Expected: the ledger records the model for every usage row, so downstream
tooling can attribute usage to a model.
Actual: historical rows keep model IS NULL forever. Third-party usage
trackers that read this ledger (for example vibe-usage, which reads
local_runtime_token_usage and prices each bucket by its model string) show
those rows as model unknown and therefore cost $0.00, even though the model
is unambiguous.
Why it matters
The model is recoverable from data the runtime already keeps: the per-session
history files under ~/.minimax/v2/sessions/<history_relative_dir>/messages.jsonl
carry message.model and turn_id for every assistant turn. Joining those to
the ledger rows by session_id + turn_id recovers the model for 100% of the
rows I could check (2 621 / 2 621 exact matches by turn_id, the remainder
recovered from the session's dominant model).
Proposal
- One-off backfill. A migration that fills
modelfor rows where it is
NULL, reading the model from the session history files (the runtime owns
those files, so this does not widen any privacy boundary). A reference
implementation is available — happy to open a PR if this is welcome, but I
understand the repository currently only accepts contributions from
collaborators, so an issue is the right route. - Or: surface it. When the ledger has rows with a NULL model, report the
count somewhere observable (astatus/diagnostics command or a log line),
so tooling and users can tell "no model recorded" apart from "zero usage". - Or: both.
Reference implementation
The recovery I used (Python 3, read-only on the ledger, writes only the model
column of rows where it is NULL):
# 1. (session_id, turn_id) -> model, from the session history files
for session_id, rel in sqlite3.connect(DB).execute(
"SELECT session_id, history_relative_dir FROM local_runtime_sessions "
"WHERE history_relative_dir IS NOT NULL"):
for line in open(f"~/.minimax/v2/sessions/{rel}/messages.jsonl"):
obj = json.loads(line)
msg = obj.get("message") or {}
if msg.get("model"):
turn2model[(session_id, obj.get("turn_id"))] = msg["model"]
# 2. fill the NULL rows
UPDATE local_runtime_token_usage SET model = ? WHERE id = ? # turn_id match
# (fallback: the session's dominant model, for rows whose turn is gone)
Related
- Third-party tracker side:
vibe-cafe/vibe-usage#127adds mcode session
records; the missingmodelon historical rows is the remaining reason those
rows still price at $0.00.
- 主要言語
- TypeScript
- スター
- 2k
- フォーク
- 259
- 平均マージ
- 14時間 20分
- マージ済み PR(30日)
- 56
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
MiniMax-AI/minimax-code のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
MiniMax-AI/minimax-code#507 ·
メンテナーはふだん 1 日以内に返信
-
bug needs-triage tui
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
MiniMax-AI/minimax-code#481 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug cli documentation needs-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
MiniMax-AI/minimax-code#299 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 38/100
MiniMax-AI/minimax-code#539 ·
メンテナーはふだん 1 日以内に返信
-
needs-triage question
難易度 1/5 1時間未満 初心者へのやさしさ 25/100
MiniMax-AI/minimax-code#537 ·
メンテナーはふだん 1 日以内に返信
MiniMax-AI/minimax-code の issue をすべて見る
似ている issue
-
bug require-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
expressjs/expressjs.com#2549 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 83/100
umami-software/umami#4686 · コメント 1 件 ·
メンテナーはふだん 2 日以内に返信
-
[Bug]: Device screenshot fails with 500 on iPhone Duo (Xcode 27.2): serve-sim calls simctl without --display対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
pingdotgg/t3code#24900 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
inu-appcenter/UNIDorm-web#411 ·
メンテナーはふだん 1 日以内に返信
-
🐛 bug
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 2 日以内に返信