[bot] Google GenAI Multimodal Live API sessions not instrumented
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/instrumentation/genai_1_18_0/src/main/java/com/google/genai/BraintrustApiClient.java y BraintrustInstrumentation.java; después, inspecciona los puntos de entrada client.aio.live.connect() y AsyncSession de Google GenAI. Compara la instrumentación de solicitudes existente con la Live API basada en WebSocket y usa BraintrustGenAITest.java como punto de partida para las pruebas. La tarea estará terminada cuando las sesiones de Live API y sus interacciones relevantes tengan cobertura de instrumentación sin romper las pruebas existentes de generateContent.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
The Google GenAI Java SDK has a stable Multimodal Live API (client.aio.live.connect() → AsyncSession) that enables real-time, bidirectional text and audio generation over WebSocket. This API surface is completely invisible to the current Braintrust instrumentation because BraintrustApiClient only wraps HTTP-based ApiClient.request() and asyncRequest() methods — WebSocket connections use an entirely separate transport that is never intercepted.
Braintrust already documents Live API tracing for Python (client.aio.live.connect() sessions and "tool calls made during Live API sessions"), but there is no equivalent Java instrumentation.
What is missing
BraintrustApiClient (the core instrumentation class, placed in the com.google.genai package to access package-private ApiClient) overrides exactly four methods:
ApiResponse request(String, String, String, Optional<HttpOptions>) // line 186
ApiResponse request(String, String, byte[], Optional<HttpOptions>) // line 210
CompletableFuture<ApiResponse> asyncRequest(String, String, String, ...) // line 239
CompletableFuture<ApiResponse> asyncRequest(String, String, byte[], ...) // line 277
The Live API is not HTTP — it uses WebSocket (WSS) via org.java_websocket.client.WebSocketClient internally. The entry point is:
client.aio.live.connect(model, LiveConnectConfig) // → CompletableFuture<AsyncSession>
AsyncSession then provides:
sendClientContent(LiveSendClientContentParameters)— sends text/content turnssendRealtimeInput(LiveSendRealtimeInputParameters)— streams real-time audio/video inputsendToolResponse(LiveSendToolResponseParameters)— responds to model tool callsreceive(Consumer<LiveServerMessage>)— registers callback for server messages
None of these are reachable via ApiClient.request(), so no spans are created for Live API sessions.
Why this is a distinct gap from #61
Issue #61 covers generateContentStream() not being instrumented (missing streaming HTTP method overrides). The Live API is fundamentally different:
- Uses WebSocket (WSS), not HTTP SSE
- Accessed via
client.aio.live, notclient.models - Supports multi-turn real-time sessions, not single request/response
- Even if #61 is fixed, Live API sessions would remain completely uninstrumented
Braintrust docs status
Braintrust docs at https://www.braintrust.dev/docs/integrations/ai-providers/gemini document Live API tracing for Python:
client.aio.live.connect()— supported (Python)- "async Live API round-trips" — supported (Python)
- "tool calls made during Live API sessions" — supported (Python)
- Java Live API: not_found — no mention in Java SDK documentation
Upstream sources
- Google GenAI Java SDK Live API: introduced in v0.3.0 (2025-03-28), stable and progressively enhanced through v1.18.0 (the version this module targets) — https://github.com/googleapis/java-genai
- Google GenAI Java SDK changelog: v0.3.0 "add types for Live API" and "Support Live API", v1.0.0 "add async support for Live API"
- Gemini Live API docs: https://ai.google.dev/api/multimodal-live — real-time, bidirectional generative execution surface for text and audio
Local files inspected
braintrust-sdk/instrumentation/genai_1_18_0/src/main/java/com/google/genai/BraintrustApiClient.java— lines 186–312: onlyrequest()andasyncRequest()are overridden; no WebSocket or Live API interceptionbraintrust-sdk/instrumentation/genai_1_18_0/src/main/java/com/google/genai/BraintrustInstrumentation.java— wrapsApiClientintoClient; noliveclient wrappingbraintrust-sdk/instrumentation/genai_1_18_0/src/test/java/dev/braintrust/instrumentation/genai/v1_18_0/BraintrustGenAITest.java— tests only sync/asyncgenerateContent; no Live API tests
- 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 ·
-
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 ·
-
Consent portal: creating a duplicate Purpose shows a generic error instead of "already exists" Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
wso2/dpdp-accelerator#287 ·