Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

[bot] OpenAI Batch API is not instrumented (mis-tagged as a generic LLM span)

オープン
#164 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
48/100
issue の種類
機能追加
明瞭さ
おおむね明確
活発さ
静か
技術スタック
java

調査の方向性

braintrust-sdk/src/main/java/dev/braintrust/instrumentation/InstrumentationSemConv.java から始め、特に tagOpenAIRequest()、tagOpenAIResponse()、getSpanName() を確認してから、OpenAI モジュールの BraintrustOpenAI.java と TracingHttpClient.java を調べます。既存の instrumentation テストで、比較可能な provider の batch 処理を検索します。Batch API の操作と利用可能な batch 結果データに適切な spans が付与され、create、retrieve、list、cancel のカバレッジが存在すれば作業は完了です。

索引モデルが issue の本文から書いたものです。

説明

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 on providerName + ":" + lastPathSegment. For POST /v1/batches, the last path segment is "batches", which matches neither the openai:completions nor openai:embeddings case, so it falls through to default -> lastSegment, yielding the literal span name "batches" instead of something descriptive like "openai.batches.create".
  • tagOpenAIRequest() (lines 110–141) unconditionally sets span_attributes = {"type":"llm"} (line 119) even though a batch-create call isn't itself a model invocation. It only reads metadata.model when requestJson.has("model") (line 129) and input_json from messages or an array-typed input (lines 133–137) — but a BatchCreateParams request body has none of these; it has input_file_id, endpoint (e.g. /v1/chat/completions), and completion_window. All of that is silently dropped.
  • tagOpenAIResponse() (lines 143–208) looks for choices or output for output_json (lines 149–153) and a top-level usage object for metrics (line 160) — a Batch object (returned by create/retrieve/list) has neither; it has id, 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-request custom_id + generative response.body results, including usage, 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 for batch under braintrust-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

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.java and TracingHttpClient.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/Batch under braintrust-sdk/instrumentation/openai_2_15_0/ — zero matches (no test or example exercises this API)
主要言語
Java
スター
21
フォーク
5
平均マージ
2日 34分
マージ済み PR(30日)
6

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

braintrustdata/braintrust-sdk-java のほかの issue

braintrustdata/braintrust-sdk-java の issue をすべて見る

似ている issue

Java の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。