[bot] OpenAI Batch API is not instrumented (mis-tagged as a generic LLM span)
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 48/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Ít trao đổi
- Công nghệ
- java
- Lĩnh vực
- observability-sre
Hướng nghiên cứu
Bắt đầu với braintrust-sdk/src/main/java/dev/braintrust/instrumentation/InstrumentationSemConv.java, đặc biệt là tagOpenAIRequest(), tagOpenAIResponse() và getSpanName(), sau đó kiểm tra BraintrustOpenAI.java và TracingHttpClient.java trong module OpenAI. Tìm trong các test instrumentation hiện có cách xử lý batch tương tự của provider; công việc hoàn tất khi các thao tác của Batch API và dữ liệu kết quả batch hiện có nhận được các span phù hợp, đồng thời có coverage cho create, retrieve, list và cancel.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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)
- Ngôn ngữ chính
- Java
- Star
- 21
- Fork
- 5
- Merge trung bình
- 2 ngày 7 giờ
- Pull request đã merge (30 ngày)
- 8
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của braintrustdata/braintrust-sdk-java
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Tất cả issue của braintrustdata/braintrust-sdk-java
Issue tương tự
-
executions.Query — startDate and timeRange filters are sent with inverted comparison operators Đang mởarea/plugin
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
kestra-io/plugin-kestra#190 ·
-
litertlm-android AAR ships no consumer ProGuard rules → "mid == null" SIGABRT in minified apps Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
google-ai-edge/LiteRT-LM#3739 ·
-
Add canonical URLs and a sitemap Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
integra-team-red/meet-map#249 ·
-
[Studio][Bug] Cancelled create-user dialog keeps the password and admin switch for the next attempt Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
apache/rocketmq-dashboard#5064 ·
-
Consent portal: creating a duplicate Purpose shows a generic error instead of "already exists" Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
wso2/dpdp-accelerator#287 ·