Pi Coding Agent instrumentation double-counts tokens and estimated cost in trace rollups (AgentSession.prompt carries summed LLM usage)
I maintainer di solito rispondono entro 1 giorno
@AbhiPrasad ci sta già lavorando.
Dal 26/10/2026.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 72/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- typescript
- Ambito
- observability
Direzione di ricerca
Inizia leggendo js/src/instrumentation/plugins/pi-coding-agent-plugin.ts, in particolare finishPiLlmSpan e finishPiPromptRun, per vedere come l’utilizzo degli span figli viene aggiunto allo span del prompt e registrato. Segui un prompt con una chiamata LLM e confronta il suo totale con le metriche dell’LLM foglia. Il lavoro è terminato quando il totale della trace conteggia una sola volta l’utilizzo e il costo stimato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- TypeScript
- Stelle
- 29
- Fork
- 21
- Merge medio
- 1g 15h
- PR unite (30g)
- 76
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di braintrustdata/braintrust-sdk-javascript
-
typescript
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
braintrustdata/braintrust-sdk-javascript#2686 ·
I maintainer di solito rispondono entro 1 giorno
-
typescript
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
braintrustdata/braintrust-sdk-javascript#2685 ·
I maintainer di solito rispondono entro 1 giorno
-
[bot] Cloudflare Workers AI `queueRequest` (batch) inference is explicitly excluded from tracingApertacloudflare typescript
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
braintrustdata/braintrust-sdk-javascript#2684 ·
I maintainer di solito rispondono entro 1 giorno
-
High TypeScript checking cost from generated Zod 3 schemasForse già presa @lforst l’ha presa 15 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 22/100
braintrustdata/braintrust-sdk-javascript#2624 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
[bot] Instrument Luma AI (17,324 weekly downloads)Forse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Apertatypescript
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
braintrustdata/braintrust-sdk-javascript#2578 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di braintrustdata/braintrust-sdk-javascript
Issue simili
-
bug ready-for-agent
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
PhyberApex/kuroshiro#1687 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
microsoft/monaco-editor#5563 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 86/100
awslabs/visual-asset-management-system#937 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100