[bot] Anthropic Messages API: `usage.output_tokens_details.thinking_tokens` not captured in span metrics
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 72/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Tranquilo
- Stack tecnológico
- ruby
- Área
- observability
Línea de trabajo
Comienza con Common.parse_usage_tokens en lib/braintrust/contrib/anthropic/instrumentation/common.rb y luego sigue sus llamadores en messages.rb y beta_messages.rb, incluida la finalización del streaming. Confirma cómo los campos de uso existentes se convierten en métricas del span y verifica que output_tokens_details.thinking_tokens se capture tanto para la instrumentación estable como para la beta de la Messages API.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
Anthropic SDK v1.44.0 added usage.output_tokens_details to Messages API responses. This nested object contains thinking_tokens — the number of output tokens consumed by extended thinking/reasoning. The Braintrust Ruby SDK does not capture this field. Users who enable extended thinking via anthropic.messages.create(thinking: {...}, ...) or via the beta messages API have no visibility into their thinking token consumption.
This is distinct from issue #164 (RubyLLM extended thinking), which covers the ruby_llm gem. This issue covers the direct anthropic gem instrumentation.
What is missing
The Anthropic Messages API now returns:
"usage": {
"input_tokens": 2095,
"output_tokens": 503,
"cache_creation_input_tokens": 2051,
"cache_read_input_tokens": 2051,
"output_tokens_details": {
"thinking_tokens": 312
}
}
output_tokens_details.thinking_tokens is the count of tokens the model generated as internal reasoning (always ≤ output_tokens). Capturing it allows users to:
- Attribute cost to extended thinking vs. standard output
- Diagnose cases where reasoning dominates total output tokens
- Compare thinking token spend across requests
Why it is dropped today
Common.parse_usage_tokens in lib/braintrust/contrib/anthropic/instrumentation/common.rb iterates over the top-level usage hash and skips any value that is not Numeric:
usage_hash.each do |key, value|
next unless value.is_a?(Numeric) # ← skips output_tokens_details (a Hash)
...
end
output_tokens_details maps to {thinking_tokens: 312}, which fails the Numeric check and is silently dropped. No field in the existing field_map covers it.
The same gap applies to both the stable Messages API instrumentation (messages.rb) and the beta Messages API instrumentation (beta_messages.rb), since both delegate to Common.parse_usage_tokens.
Braintrust docs status
not_found — The Braintrust Anthropic integration docs at https://www.braintrust.dev/docs/providers/anthropic list prompt_tokens, completion_tokens, and cache metrics as captured but do not mention thinking tokens or output_tokens_details.
Upstream sources
- Anthropic Messages API reference —
usage.output_tokens_details.thinking_tokensfield: https://platform.claude.com/docs/en/api/messages - Anthropic Ruby SDK changelog — v1.44.0 added
output_tokens_detailsand mid-conversation usage details: https://github.com/anthropics/anthropic-sdk-ruby/blob/main/CHANGELOG.md
Local files inspected
lib/braintrust/contrib/anthropic/instrumentation/common.rb—parse_usage_tokensmethod (lines 14–48): 4-fieldfield_map;Numericguard silently drops nested objects likeoutput_tokens_detailslib/braintrust/contrib/anthropic/instrumentation/messages.rb—set_metrics(line 132) callsCommon.parse_usage_tokens; also captures streaming output viafinalize_stream_spanlib/braintrust/contrib/anthropic/instrumentation/beta_messages.rb— sameparse_usage_tokenscall pattern
- Lenguaje dominante
- Ruby
- Estrellas
- 9
- Forks
- 10
- Merge medio
- 22 h 10 min
- PR fusionados (30 d)
- 6
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-ruby
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
[BOT ISSUE] OpenAI Chat Completions missing reasoning model and web search metadata parameters Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
-
Dificultad 3/5 1-2 días Aptitud para principiantes 65/100
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 38/100
Todos los issues de braintrustdata/braintrust-sdk-ruby
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
bug
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
riscv/riscv-unified-db#2626 ·
-
Component: GLib
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
ds-drift
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
we-promise/sure#3693 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
simp/pupmod-simp-simp#395 ·