VertexAiSessionService: Event.id differs between the streamed event and getSession (id is not sent to Vertex and the appendEvent response is empty)
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 45/100
Línea de trabajo
Start with VertexAiSessionService.appendEvent and SessionJsonConverter in com.google.adk.sessions, then compare event serialization with the Python fix linked in the issue. Check how the REST rawEvent field can preserve the ADK id and how session loading chooses an id. Done means the streamed event and the event returned by getSession retain the same id, with tests covering the round trip.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Describe the bug
With VertexAiSessionService, the same logical event has two different ids depending on how it is observed:
| Observed via | Event.id |
|---|---|
Runner.runAsync(...) stream |
ADK-generated UUID (Event.generateEventId()) |
getSession(...) afterwards |
Vertex resource id (last segment of the event name) |
InMemorySessionService keeps the ADK UUID, so the two services behave differently and the problem does not show up in local development.
Where (checked on 1.8.0 and 1.10.1)
BaseLlmFlowcreates the id withEvent.generateEventId()(a random UUID) and resets it for each resulting event.Runner.runAsynccallssessionService.appendEvent(session, event)for every non-partial event, then emits the event to the caller.VertexAiSessionService.appendEventsendsSessionJsonConverter.convertEventToJson(e)to:appendEvent. That JSON containsauthor,invocationId,timestamp,actions,eventMetadataandcontent, but no event id, and norawEvent(there is no reference torawEventanywhere incom.google.adk.sessionsin these versions).VertexAiClient.appendEventonly checks the response body forClientExceptionand returnsCompletable.complete().VertexAiSessionService.appendEventthen returns the local event (.toSingleDefault(e)), so the caller keeps the ADK UUID.- On
getSession,SessionJsonConverterrebuilds the id from the API resource name:
.id(Iterables.getLast(Splitter.on('/').split(apiEvent.get("name").toString())))
What the API allows
From the SessionEvent REST reference:
nameis documented as "Identifier. The resource name of the event" (…/sessions/{session}/events/{event}). There is no other field meant to carry a client-assigned event id.rawEventis "Optional. Weakly typed raw event data in proto struct format."sessions.appendEventreturns an empty body on success, so the id created by the service is not available at append time.
Documentation
The Events documentation says that the session service "records the event as it received it" (in the Python description) and recommends using event.id to reference specific occurrences. This does not hold for VertexAiSessionService: the id seen during the run is never stored and is replaced on reload.
Impact
Anything that correlates a streamed event with its persisted form by Event.id breaks. In our case (a chat UI built on top of an AG-UI endpoint), message ids sent to the client while streaming do not match the ids returned when the conversation is reloaded, so per-message state (for example feedback) can be attached to an id that no longer exists. The only workaround we found is to reload the session after the run and pair events by invocationId and order while checking the text, which is fragile.
Expected behavior
One of:
- Persist the ADK id (for example in
rawEvent, as ADK Python now does) and prefer it over the resource name when reading; or - Make the id assigned by Vertex available to the caller at append time (not possible today since the response is empty); or
- If neither is possible, document that
Event.idis not stable across streaming and reload on this service.
Related
- google/adk-python#6530: same behavior in Python, closed as a bug and fixed by keeping the id stored in
raw_event(commit 864914b). The Java converter does not writerawEvent, so that fix does not port directly. - google/adk-go#1329: same behavior in Go (open), noting that
SessionEventhas no field for a client event id.
Environment
google-adk1.8.0 (the same code is present in 1.10.1)VertexAiSessionServiceon Vertex AI Agent Engine sessions
- Lenguaje dominante
- Java
- Estrellas
- 1.7k
- Forks
- 433
- Merge medio
- 2 d 21 h
- PR fusionados (30 d)
- 43
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la 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 google/adk-java
-
GeminiUtil placeholder user turn ("Continue output. DO NOT look at this line ...") is flagged by prompt injection filtersPosiblemente ocupada @hemasekhar-p la tomó hace 5 días. Abiertoneeds review
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
google/adk-java#1628 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
[spring-ai] Streaming responses ending with CJK punctuation (。!?) are misclassified as partial and never persisted to the sessionPosiblemente ocupada @hirematha la tomó hace 8 días. Abiertoneeds review
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
google/adk-java#1608 · 3 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
runLive passes partial events to appendEvent and never aggregates text chunks, unlike ADK PythonPosiblemente ocupada @hemasekhar-p la tomó hace 1 día. Abiertowaiting on reporter
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
google/adk-java#1648 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
FirestoreSessionService compares event timestamps as text, reordering or skipping same-second eventsPosiblemente ocupada @hemasekhar-p la tomó hace 1 día. Abiertowaiting on reporter
Dificultad 3/5 1-2 días Aptitud para principiantes 50/100
google/adk-java#1646 · 2 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
FirestoreSessionService ignores `app:` / `user:` state prefixes, so app and user state are never shared across sessionsPosiblemente ocupada @hemasekhar-p la tomó hace 1 día. Abiertowaiting on reporter
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
google/adk-java#1645 · 2 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
Todos los issues de google/adk-java
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
wildfly/wildfly-launcher#99 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
traccar/traccar#6076 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Flight SQL JDBC parses boolean properties case-sensitively, silently disabling TLS for useEncryption=TRUEPosiblemente ocupada @Arawoof06 la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
apache/arrow-java#1357 ·
Los mantenedores suelen responder en 1 día
-
[Bug] Demo alert imports accept empty and oversized rule documentsPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
apache/rocketmq-dashboard#6610 ·
Los mantenedores suelen responder en 3 días