Pi Coding Agent instrumentation double-counts tokens and estimated cost in trace rollups (AgentSession.prompt carries summed LLM usage)
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 72/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- typescript
- Área
- observability
Línea de trabajo
Empieza leyendo js/src/instrumentation/plugins/pi-coding-agent-plugin.ts, en especial finishPiLlmSpan y finishPiPromptRun, para ver cómo se añade al span del prompt el uso de los spans secundarios y cómo se registra. Sigue un prompt con una llamada a un LLM y compara su acumulado con las métricas del LLM hoja. El trabajo estará terminado cuando el acumulado del trace contabilice el uso y el coste estimado una sola vez.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
With wrapPiCodingAgentSDK (braintrust 3.39.0, @earendil-works/pi-coding-agent 1.4.0), each AgentSession.prompt task span gets the summed token usage of its child llm spans, and it also carries metadata.model. Braintrust's trace rollups add the parent's metrics to the children's. As a result, the trace summary, the logs table and the trace header report exactly 2× the prompt, completion and cached tokens and 2× estimated_cost for every Pi run.
The instrumentation spec says parent task spans "MAY include aggregate token metrics for display, but SDKs SHOULD avoid making parent rollups look like independent billable LLM calls" (braintrust-spec/skills/instrumentation-spec/references/features/token-and-cost-metrics.md). Here the parent is priced and summed like an LLM call.
Where
js/src/instrumentation/plugins/pi-coding-agent-plugin.ts at [email protected]:
finishPiLlmSpanlogs the usage on the LLM span and also callsaddMetrics(promptState.metrics, usageMetrics)(L703-L707).finishPiPromptRunlogscleanMetrics(state.metrics)on theAgentSession.promptspan, together withextractModelMetadata(...)(L655-L667).
Minimal reproduction
- Call
braintrust.wrapPiCodingAgentSDK(pi), create anAgentSessionwith any model, and run onesession.prompt(...)that takes at least one LLM turn underinitLogger(...). - Run these two project-log queries on that trace:
-- trace rollup
SELECT id, metrics.prompt_tokens, metrics.estimated_cost
FROM project_logs('<project_id>', shape => 'summary') WHERE root_span_id = '<root>'
-- per span, grouped
SELECT span_attributes.name, span_attributes.type, sum(metrics.prompt_tokens) AS pt, sum(metrics.estimated_cost) AS cost
FROM project_logs('<project_id>') WHERE root_span_id = '<root>' AND metrics.prompt_tokens IS NOT NULL
GROUP BY 1, 2
Observed on one trace (gpt-6.1-sol via openai.responses.create, 11 LLM calls):
| span | type | prompt_tokens | estimated_cost |
|---|---|---|---|
openai.responses.create (×11) |
llm | 443,901 | 0.1708972 |
AgentSession.prompt |
task | 443,901 | 0.1708972 |
| summary rollup | 887,802 | 0.3417944 |
Across 19 consecutive traces, the ratio of summary to leaf-llm sums was 2.000 for both tokens and cost in every trace.
Expected
A trace's rollup equals the sum of its leaf llm spans. Either the prompt span should not carry summed usage (or should carry it under a non-rolled-up name), or it should not be priced or summed as a billable call.
Workaround we use
We sum span_attributes.type = 'llm' AND span_attributes.purpose IS NULL spans and ignore the summary's token and cost metrics.
- Lenguaje dominante
- TypeScript
- Estrellas
- 29
- Forks
- 21
- Merge medio
- 1 d 13 h
- PR fusionados (30 d)
- 67
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Sin plantilla de pull request
- Sin 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 braintrustdata/braintrust-sdk-javascript
-
pi-coding-agent: Pi 1.4 system messages dropped, so LLM spans have no system prompt or toolsPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
braintrustdata/braintrust-sdk-javascript#2662 ·
Los mantenedores suelen responder en 1 día
-
AI SDK tool spans don't respect `toModelOutput`Posiblemente ocupada @AbhiPrasad la tomó hace 2 días. Abiertotypescript
braintrustdata/braintrust-sdk-javascript#2651 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
High TypeScript checking cost from generated Zod 3 schemasPosiblemente ocupada @lforst la tomó hace 9 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 22/100
braintrustdata/braintrust-sdk-javascript#2624 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
[bot] Instrument Luma AI (17,324 weekly downloads)Posiblemente ocupada @karthiksenv la tomó hace 9 días. Abiertotypescript
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
braintrustdata/braintrust-sdk-javascript#2578 ·
Los mantenedores suelen responder en 1 día
-
[bot] Instrument Letta Agent SDK (87,205 weekly downloads)Posiblemente ocupada @karthiksenv la tomó hace 12 días. Abiertotypescript
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
braintrustdata/braintrust-sdk-javascript#2577 ·
Los mantenedores suelen responder en 1 día
Todos los issues de braintrustdata/braintrust-sdk-javascript
Issues similares
-
VS Code extension: clickable file links in chat drop the :line suffix, never jump to the lineAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
MoonshotAI/kimi-code#4398 ·
Los mantenedores suelen responder en 1 día
-
Xiaomi Mimo语音识别服务异常Abiertopending triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
Los mantenedores suelen responder en 1 día
-
package-lock.json : les binaires natifs macOS et Linux de unrs-resolver ont disparu depuis #1823Abiertobug dependencies
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
AxaFrance/design-system#2064 ·
Los mantenedores suelen responder en 3 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100