[bot] Google GenAI Batches API is not instrumented (mis-tagged as a generic LLM span)
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 38/100
- issue の種類
- 機能追加
- 明瞭さ
- おおむね明確
- 活発さ
- 静か
- 技術スタック
- java
調査の方向性
braintrust-sdk/instrumentation/genai_1_18_0/src/main/java/com/google/genai/BraintrustApiClient.java、特にtagSpan()から始め、続いてBraintrustInstrumentation.javaを調べて、clientと非同期batchのエントリポイントを確認します。google-genai Batches APIの形状を既存のinstrumentationと比較し、create、get、list、cancel、および完了済みの結果について追加すべきテストを特定します。完了条件は、Batch操作に適切なspanデータと回帰テストのカバレッジがあり、BatchJob metadataを生成出力として扱わないことです。
索引モデルが issue の本文から書いたものです。
説明
Summary
The genai_1_18_0 module instruments Google's google-genai Java SDK by subclassing its package-private ApiClient (com.google.genai.BraintrustApiClient) and swapping it into every service object on the Client, including client.batches and client.async.batches (BraintrustInstrumentation.wrapClient, lines 36–52). This means a call to client.batches.create(...)/.get(...)/.list(...)/.cancel(...)/.createEmbeddings(...) does produce a span — but BraintrustApiClient.tagSpan() has no awareness of the Batches API's request/response shape, so the span is mis-tagged: it's marked span_attributes.type = "llm" as if it were a real generation call, but the request/response field extraction (built for generateContent-shaped bodies) finds essentially nothing meaningful to populate.
What is missing
In braintrust-sdk/instrumentation/genai_1_18_0/src/main/java/com/google/genai/BraintrustApiClient.java, tagSpan() (lines 50–161):
- Request metadata extraction (lines 65–76) looks for top-level
model,systemInstruction,tools,toolConfig,safetySettings,cachedContent. AbatchGenerateContentrequest body wraps everything under abatchobject ({"batch": {"displayName": ..., "inputConfig": {...}}}), and acreateEmbeddingsbatch job body is shaped aroundEmbeddingsBatchJobSource/CreateEmbeddingsBatchJobConfig— none of the expected top-level fields exist, so metadata stays essentially empty. input_jsonconstruction (lines 97–113) only populatesmodel/contents/config(fromgenerationConfig) — a batch-create body has none of these at top level (the model is only present in the URL path, e.g.{model}:batchGenerateContent, andgetModel(genAIEndpoint)(used as a fallback at line 102) is the only path by whichmodelwould end up ininput_jsonat all); the batch's actual per-itemcontents/generation requests (whether inline or file/GCS-referenced) are never captured.- Response handling (lines 116–150) dumps the whole response body as
output_json(line 125) — for a batch create/get call, that whole body is justBatchJobresource metadata (name,state,createTime, etc.), not generative output — and readsusageMetadatafor metrics (line 128), which aBatchJobresponse never has. There is no instrumentation at all of retrieving a completed batch's actual per-request results (where real generation outputs andusageMetadatabecome available), so even a fully successful batch job produces a span withtype: "llm"but no meaningful input, output, or token metrics. - No test or example anywhere in the repo exercises
client.batchesin any form (confirmed via grep forbatchunderbraintrust-sdk/instrumentation/genai_1_18_0/— the only match isBraintrustInstrumentation.java's own field-swap wiring, not a test).
Braintrust docs status: not_found
Checked https://www.braintrust.dev/docs/integrations/ai-providers/gemini in full: no mention of batchGenerateContent, Batches, or batch/async generation jobs anywhere, in any language. The only "batch"-adjacent mention is batchEmbedContents, and only in the unrelated context of AI proxy/gateway passthrough support for embeddings ("The gateway also supports Gemini's native embedContent and batchEmbedContents endpoints") — not span/tracing coverage, and not the Batches job API this issue is about.
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 Google GenAI provider (a distinct upstream API/SDK/module, not a duplicate).
Upstream sources
- Gemini API "Batch Mode" (
batchGenerateContent) — official docs: https://ai.google.dev/gemini-api/docs/batch-api and https://ai.google.dev/gemini-api/docs/batch-mode. Async, 50%-discounted, ~24h turnaround; supports inline requests or file/JSONL upload. - Vertex AI batch predictions for Gemini (and partner models) via GCS/BigQuery: https://docs.cloud.google.com/vertex-ai/generative-ai/docs/maas/capabilities/batch-prediction, with a Java-specific sample using the same
com.google.genai.Batchesclass: https://docs.cloud.google.com/vertex-ai/generative-ai/docs/samples/googlegenaisdk-batchpredict-with-gcs. - Official
google-genaiJava SDK exposes this directly:com.google.genai.Batches(googleapis/java-genai,src/main/java/com/google/genai/Batches.java), javadoc at https://googleapis.github.io/java-genai/javadoc/com/google/genai/Batches.html —create(String model, BatchJobSource, CreateBatchJobConfig),createEmbeddings(...)(experimental),get(...),cancel(...),delete(...),list(...), all returning/operating onBatchJob.
Local repo files inspected
braintrust-sdk/instrumentation/genai_1_18_0/src/main/java/com/google/genai/BraintrustApiClient.java— lines 50–161 (tagSpan)braintrust-sdk/instrumentation/genai_1_18_0/src/main/java/com/google/genai/BraintrustInstrumentation.java— lines 22–57 (wrapClient), confirmingclient.batches/client.async.batchesare explicitly wired to the same instrumentedApiClient(lines 37, 47) and therefore do produce (mis-tagged) spans rather than bypassing instrumentation entirely- Repo-wide grep for
batch/Batch/batchGenerateContent/BatchJobunderbraintrust-sdk/instrumentation/genai_1_18_0/— only match is the field-swap wiring above; no test or example exercises the Batches API
- 主要言語
- Java
- スター
- 21
- フォーク
- 5
- 平均マージ
- 2日 34分
- マージ済み PR(30日)
- 6
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
braintrustdata/braintrust-sdk-java のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
braintrustdata/braintrust-sdk-java の issue をすべて見る
似ている issue
-
CalendarEventAttendance/get returns eventAttendanceStatus while the doc says attendanceStatus対応中かも @chibenwa が今日担当しました。 オープンbug claude
難易度 1/5 1時間未満 初心者へのやさしさ 90/100
linagora/tmail-backend#2697 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
apache/skywalking#14120 ·
メンテナーはふだん 1 日以内に返信
-
[BUG] Case-insensitive search suggestions miss items when the JVM default locale is Turkish対応中かも @thswlsqls が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
HMCL-dev/HMCL#6943 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
NameAllocator generates colliding identifiers with ignorable characters対応中かも @PHJ2000 が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
メンテナーはふだん 1 日以内に返信