Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[bot] Google GenAI video generation (generateVideos / Veo) traced with materially less detail than text generation

Open
#176 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
55/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Active
Tech stack
java

Research direction

Start with BraintrustApiClient.java, especially tagSpan and the four transport overrides, then inspect BraintrustGenAITest.java and the Google GenAI generateVideos and getVideosOperation APIs. Add focused video-generation coverage and verify that request details, span classification, available metrics, and long-running-operation polling are represented with the intended fidelity.

Written by the indexing model from the issue text.

Description

Summary

The Google GenAI Java SDK (com.google.genai, v1.18.0, the version this module targets) exposes Models.generateVideos(...) (Veo video-generation models) and the associated long-running-operation polling API (client.operations.getVideosOperation(...)). Braintrust's Java GenAI instrumentation intercepts these calls only incidentally, through a generic HTTP-transport hook that was designed for generateContent. The result is spans that are silently mislabeled and largely empty for video generation — not a total absence of spans, but instrumentation with materially less detail/fidelity than the documented generate_content path.

What is missing

BraintrustApiClient (braintrust-sdk/instrumentation/genai_1_18_0/src/main/java/com/google/genai/BraintrustApiClient.java) intercepts every HTTP call made by the SDK by overriding the transport-level methods on ApiClient:

  • request(String, String, String, Optional<HttpOptions>) — line 186
  • request(String, String, byte[], Optional<HttpOptions>) — line 210
  • asyncRequest(String, String, String, Optional<HttpOptions>) — line 239
  • asyncRequest(String, String, byte[], Optional<HttpOptions>) — line 277

Because this hook is transport-level, a generateVideos call (and each operations.getVideosOperation poll of the resulting long-running operation) does produce a span — but tagSpan (lines 50–161) was written exclusively for the generateContent request/response shape:

  • Line 156 unconditionally sets braintrust.span_attributes to {"type": "llm"} for every call this client makes, including video-generation calls, which are not LLM chat-completion calls.
  • Lines 65–76 and 81–95 only promote model/systemInstruction/tools/toolConfig/safetySettings/cachedContent and generationConfig.{temperature,topP,topK,candidateCount,maxOutputTokens,stopSequences,responseMimeType,responseSchema} into braintrust.metadata/input_json. generateVideos requests use an entirely different shape (instances/parameters or prompt/image/video + a GenerateVideosConfig with fields like numberOfVideos, durationSeconds, aspectRatio, enhancePrompt, personGeneration) — none of these fields are extracted, so input_json for a video-generation span is effectively empty.
  • Lines 127–149 only look for usageMetadata.{promptTokenCount,candidatesTokenCount,totalTokenCount,cachedContentTokenCount} to populate braintrust.metrics. Video-generation responses have no such field, so metrics are silently skipped (not wrong, just absent) while the span is still tagged type: llm.
  • generateVideos returns a GenerateVideosOperation that is not done immediately; the caller polls client.operations.getVideosOperation(...) repeatedly until completion. Each poll produces its own disconnected span (named via URL-derived getOperation, e.g. get_videos_operation) rather than being correlated to the originating video-generation request — there is no long-running-operation span model, unlike the single request/response span Braintrust produces for generate_content.

There is no reference anywhere in this module (or its tests) to generateVideos, GenerateVideosOperation, GenerateVideosConfig, Veo, or getVideosOperation — confirmed via full-directory grep of braintrust-sdk/instrumentation/genai_1_18_0/.

Braintrust docs status

Checked https://www.braintrust.dev/docs/integrations/ai-providers/gemini (current as of this audit):

  • Java section documents only content-generation spans (generate_content, sync/async) and generateContentStream, with request metadata (model, contents, generation config), response, and token metrics.
  • No mention of video generation, generateVideos, or Veo models for any language (Java, Python, TypeScript, Go).
  • Status: not_found — video generation tracing is undocumented for Java (and for every other language) in the current docs.

Upstream sources

Local files inspected

  • braintrust-sdk/instrumentation/genai_1_18_0/src/main/java/com/google/genai/BraintrustApiClient.java — full file read; tagSpan (lines 50–161) and the four transport overrides (lines 186, 210, 239, 277) are the only interception points, and are generateContent-shaped.
  • braintrust-sdk/instrumentation/genai_1_18_0/src/test/java/dev/braintrust/instrumentation/genai/v1_18_0/BraintrustGenAITest.java — only tests sync generateContent; no video-generation test coverage.
  • Full-directory grep of braintrust-sdk/instrumentation/genai_1_18_0/ for generateImages|GenerateImages|predictLongRunning|generate_videos|video — zero matches.
Dominant language
Java
Stars
21
Forks
5
Avg merge
2d 7h
Merged PRs (30d)
8

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from braintrustdata/braintrust-sdk-java

All issues in braintrustdata/braintrust-sdk-java

Similar issues

More Java issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.