[bot] OpenAI Batch API is not instrumented (mis-tagged as a generic LLM span)
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 48/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bastante claro
- Estado de actividad
- Tranquilo
- Stack tecnológico
- java
- Área
- observability-sre
Línea de trabajo
Comienza con braintrust-sdk/src/main/java/dev/braintrust/instrumentation/InstrumentationSemConv.java, especialmente con tagOpenAIRequest(), tagOpenAIResponse() y getSpanName(), y después inspecciona los archivos BraintrustOpenAI.java y TracingHttpClient.java del módulo de OpenAI. Busca en las pruebas de instrumentación existentes un manejo comparable de batches del proveedor; el trabajo estará terminado cuando las operaciones de Batch API y los datos de resultados de batch disponibles reciban spans adecuados y exista cobertura para create, retrieve, list y cancel.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
The OpenAI instrumentation module (openai_2_15_0) generically intercepts every HTTP call via TracingHttpClient (swapped into ClientOptions.httpClient/originalHttpClient), so a call to client.batches().create(...) (or .retrieve()/.list()/.cancel()) does produce a span — but the shared tagging logic in InstrumentationSemConv has no awareness of the Batch API's request/response shape, so the span is actively mis-tagged rather than simply absent: it's marked span_attributes.type = "llm" as if it were a real model call, given a low-information span name ("batches"), and gets no model metadata, no input_json, and no output_json/metrics.
The OpenAI Batch API lets you submit up to 50,000 chat-completion/embeddings/responses/moderation requests as a single async job (POST /v1/batches); the job's eventual output file contains one JSONL line per request with the same generative output (token usage, model output) that this SDK already spans for synchronous calls — but none of that ever gets a Braintrust span today.
What is missing
In braintrust-sdk/src/main/java/dev/braintrust/instrumentation/InstrumentationSemConv.java:
getSpanName()(lines 518–529) switches onproviderName + ":" + lastPathSegment. ForPOST /v1/batches, the last path segment is"batches", which matches neither theopenai:completionsnoropenai:embeddingscase, so it falls through todefault -> lastSegment, yielding the literal span name"batches"instead of something descriptive like"openai.batches.create".tagOpenAIRequest()(lines 110–141) unconditionally setsspan_attributes = {"type":"llm"}(line 119) even though a batch-create call isn't itself a model invocation. It only readsmetadata.modelwhenrequestJson.has("model")(line 129) andinput_jsonfrommessagesor an array-typedinput(lines 133–137) — but aBatchCreateParamsrequest body has none of these; it hasinput_file_id,endpoint(e.g./v1/chat/completions), andcompletion_window. All of that is silently dropped.tagOpenAIResponse()(lines 143–208) looks forchoicesoroutputforoutput_json(lines 149–153) and a top-levelusageobject formetrics(line 160) — aBatchobject (returned by create/retrieve/list) has neither; it hasid,status,output_file_id,error_file_id,request_counts, and timestamps. None of this is captured, and there is no instrumentation at all of retrieving/parsing the completed batch's output file (where the actual per-requestcustom_id+ generativeresponse.bodyresults, includingusage, become available) — so even a fully successful, completed batch job produces zero spans reflecting its actual generative work.- No test or example anywhere in the repo exercises
client.batches()in any form (confirmed via grep forbatchunderbraintrust-sdk/instrumentation/openai_2_15_0/— zero matches).
Braintrust docs status: not_found
Checked https://www.braintrust.dev/docs/integrations/ai-providers/openai across all per-language sections (TypeScript, Python, Ruby, Go, Java, .NET): no mention of "batch" or "batches" anywhere. Its "What Braintrust traces" tables list only Chat Completion, Embedding, Moderation, openai.responses.create/parse/compact, Transcription, Translation, Speech, and Image Generation/Edit/Variation — the Batch API is absent for every language, not just Java. A broader site search only surfaces unrelated uses of "batch" (eval batches, UI batch labeling, batch-ingested span timestamps in the changelog).
Note: this repo's own gap-audit history already treats "Batch API not instrumented, mis-tagged as a generic LLM span" as a valid, in-scope finding — see the already-filed and still-open #155 for Anthropic's Message Batches API, which this issue mirrors for the OpenAI provider (a distinct upstream API/SDK, not a duplicate).
Upstream sources
- Official OpenAI Batch API reference: https://platform.openai.com/docs/api-reference/batch (create/retrieve/list/cancel sub-pages) and guide: https://platform.openai.com/docs/guides/batch — submit up to 50,000 requests (200MB input file) for async processing, typically within 24h, at a 50% cost discount vs. synchronous calls.
- Official
openai-javaSDK exposes this directly:openai-java-core/src/main/kotlin/com/openai/services/blocking/BatchService.ktandBatchServiceImpl.kt(https://github.com/openai/openai-java) definecreate(BatchCreateParams): Batch(POST /batches),retrieve(batchId),list(), andcancel(batchId)(POST /batches/{batch_id}/cancel). Also documented at https://developers.openai.com/api/reference/java/resources/batches. - Request/response shape: create request has
input_file_id,endpoint(/v1/chat/completions,/v1/embeddings,/v1/responses, or/v1/moderations),completion_window(currently only"24h"); output JSONL lines (fetched viaoutput_file_id) havecustom_id,response.body(the real chat-completion/embedding/responses result includingusage), anderror— structurally analogous to Anthropic's Message Batches results. Source: https://developers.openai.com/api/docs/guides/batch.
Local repo files inspected
braintrust-sdk/src/main/java/dev/braintrust/instrumentation/InstrumentationSemConv.java— lines 110–141 (tagOpenAIRequest), 143–208 (tagOpenAIResponse), 518–529 (getSpanName)braintrust-sdk/instrumentation/openai_2_15_0/src/main/java/dev/braintrust/instrumentation/openai/v2_15_0/BraintrustOpenAI.javaandTracingHttpClient.java— generic transport-swap; produces a span for any OpenAI HTTP call including/v1/batches, with no batch-specific logic- Repo-wide grep for
batch/Batchunderbraintrust-sdk/instrumentation/openai_2_15_0/— zero matches (no test or example exercises this API)
- Lenguaje dominante
- Java
- Estrellas
- 21
- Forks
- 5
- Merge medio
- 2 d 7 h
- PR fusionados (30 d)
- 8
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-java
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Todos los issues de braintrustdata/braintrust-sdk-java
Issues similares
-
executions.Query — startDate and timeRange filters are sent with inverted comparison operators Abiertoarea/plugin
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
kestra-io/plugin-kestra#190 ·
-
litertlm-android AAR ships no consumer ProGuard rules → "mid == null" SIGABRT in minified apps Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
google-ai-edge/LiteRT-LM#3739 ·
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
-
Add canonical URLs and a sitemap Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
integra-team-red/meet-map#249 ·
-
[Studio][Bug] Cancelled create-user dialog keeps the password and admin switch for the next attempt Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
apache/rocketmq-dashboard#5064 ·