[Bug]: token usage rows always have model=NULL for local-runtime-v2 sessions (modelIdentity reads id, projected model carries model_id)
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- sqlite, typescript
Línea de trabajo
Lee packages/local-runtime-v2/src/service/session-system/owner.ts alrededor de modelIdentity() y sigue cómo llega su resultado a las filas de uso en pi-usage.ts. Comprueba la forma proyectada del modelo en packages/local-runtime-v2/src/service/turn-system/agent-host/assembly-context.ts; el issue identifica la discrepancia en el campo model_id. Confirma la corrección ejecutando la ruta de registro de uso de v2 y verificando que las nuevas filas de local_runtime_token_usage contengan el modelo.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Product or interface
Desktop app (also affects CLI TUI / headless / ACP — all paths that record usage through local-runtime-v2)
Version
Desktop 3.1.3 (macOS); source analysis at main 9a93560 (v0.6.5)
Platform
macOS
OS version and architecture
macOS 26 arm64
Issue area
Other (local usage ledger / local_runtime_token_usage)
Steps to reproduce
- Use MiniMax Code desktop 3.1.3 (or any build recording usage via
local-runtime-v2) for a normal coding session with a MiniMax model (e.g.minimax/MiniMax-M3.1-Flash). - Inspect
~/.minimax/v2/sqlite/runtime-state.sqlite:
SELECT model, count(*) FROM local_runtime_token_usage GROUP BY model;
-- after upgrading to 3.1.3: every new row has model = NULL
On my machine: 1314 rows written by the previous version all have model = 'minimax/MiniMax-M3'; all 7 rows written after the 3.1.3 upgrade have model = NULL (session layout v2-final-dated-session, so they went through the v2 runtime).
Expected and actual behavior
Expected: the model column records the model used for each turn (as the v1 runtime path did, and as the model column, the idx_local_runtime_token_usage_model_ts index, and the group=model query path in usage/repo/drizzle.ts all imply).
Actual: rows written by local-runtime-v2 always have model = NULL.
Downstream impact: every tool that reads this table for statistics (including the built-in summarizeGroupBy('model') API, which falls back to coalesce(model, 'unknown')) can only show "unknown" for new sessions. See also cc-switch #7705 where a third-party importer hits the same thing ("mcode session 用量导入模型恒为 unknown").
Root cause analysis (source at main 9a93560)
The v2 write chain feeds modelIdentity() a model object whose keys can never match:
packages/local-runtime-v2/src/service/turn-system/agent-host/assembly-context.ts—projectResolvedModel()returns{ provider, model_id: resolved.id, context_window, max_tokens, … }.MODEL_ALLOWLIST(lines 42–58) containsmodel_id/modelIdbut noidkey, so the projected object can never carryid.- That object flows to
executionModel(local-agent-host.ts:231) and then to the usage projector (committed-history-writer.ts:321→owner.ts:697). packages/local-runtime-v2/src/service/session-system/owner.ts:802-808—modelIdentity()readsReflect.get(model, 'id')only. With themodel_id-shaped object it always returnsnull, andpi-usage.tswritesmodel: nullintolocal_runtime_token_usage.
modelIdentity() matches the pi framework's Model shape ({ id, provider, … }, third_party/pi-mono/packages/ai/src/types.ts:593), which is why the compat layer's modelIdentity(turn.model) calls still produce correct provider/id strings. Only the v2 projected shape is broken — the same function consumes two shapes and one of them silently degrades to null.
Additional notes:
- Both files are unchanged since the initial import commit (c59cf53, 2026-09-18), so this is not a recent regression in the public history — it has been there since the first snapshot.
- The assistant messages themselves carry the model (e.g.
messages.jsonlentries have"model": "MiniMax-M3.1-Flash"keyed by the sameturnId), so a fallback atcommittedPiUsageRowswould also work.
Suggested fix (either or both)
// owner.ts
function modelIdentity(model: unknown): string | null {
if (!model || typeof model !== 'object') return null;
const provider = Reflect.get(model, 'provider');
const id = Reflect.get(model, 'id') ?? Reflect.get(model, 'model_id') ?? Reflect.get(model, 'modelId');
if (typeof provider === 'string' && typeof id === 'string') return `${provider}/${id}`;
return typeof id === 'string' ? id : null;
}
or in pi-usage.ts committedPiUsageRows: fall back to the assistant message's own model field when input.model is null.
Before submitting
- I have searched existing issues.
- I have included my version and removed sensitive information.
- Lenguaje dominante
- TypeScript
- Estrellas
- 2k
- Forks
- 259
- Merge medio
- 9 h 41 min
- PR fusionados (30 d)
- 143
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de MiniMax-AI/minimax-code
-
bug needs-triage tui
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
MiniMax-AI/minimax-code#481 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
bug cli documentation needs-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
MiniMax-AI/minimax-code#299 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
bug desktop needs-triage
Dificultad 3/5 1-2 días Aptitud para principiantes 56/100
MiniMax-AI/minimax-code#506 ·
Los mantenedores suelen responder en 1 día
-
tui
Dificultad 3/5 1-2 días Aptitud para principiantes 74/100
MiniMax-AI/minimax-code#505 ·
Los mantenedores suelen responder en 1 día
-
tui
Dificultad 2/5 1-3 horas Aptitud para principiantes 35/100
MiniMax-AI/minimax-code#504 ·
Los mantenedores suelen responder en 1 día
Todos los issues de MiniMax-AI/minimax-code
Issues similares
-
Edit: Travel Mix (RO)Abiertocheck:failed streams:edit
Dificultad 2/5 1-3 horas Aptitud para principiantes 64/100
iptv-org/iptv#55901 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 2 días
-
package:ios ships XCFrameworks with absolute symlinks, which SwiftPM refuses to extractPosiblemente ocupada @cusnirvladislav la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
callstackincubator/rock#740 ·
-
S: triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 2 días
-
RED ladder stopped @ 4db4ed91Abiertoarea:workflow bug ready-for-human
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
fil-donadoni/tolaria#6108 ·
Los mantenedores suelen responder en 1 día