VertexAiSessionService: Event.id differs between the streamed event and getSession (id is not sent to Vertex and the appendEvent response is empty)
Maintainer thường phản hồi trong vòng 1 ngày
@hemasekhar-p đang làm issue này rồi.
Từ ngày 13/10/2026.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 45/100
Hướng nghiên cứu
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.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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
- Ngôn ngữ chính
- Java
- Star
- 1.7k
- Fork
- 433
- Merge trung bình
- 2 ngày 23 giờ
- Pull request đã merge (30 ngày)
- 52
Chuẩn bị môi trường
Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của google/adk-java
-
GeminiUtil placeholder user turn ("Continue output. DO NOT look at this line ...") is flagged by prompt injection filtersCó thể đã có người làm @hemasekhar-p đã nhận 6 ngày trước. Đang mởneeds review
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
google/adk-java#1628 · 1 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[spring-ai] Streaming responses ending with CJK punctuation (。!?) are misclassified as partial and never persisted to the sessionCó thể đã có người làm @hirematha đã nhận 9 ngày trước. Đang mởneeds review
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
google/adk-java#1608 · 3 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
runLive passes partial events to appendEvent and never aggregates text chunks, unlike ADK PythonCó thể đã có người làm @hemasekhar-p đã nhận 2 ngày trước. Đang mởneeds review
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 45/100
google/adk-java#1648 · 3 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
FirestoreSessionService compares event timestamps as text, reordering or skipping same-second eventsCó thể đã có người làm @hemasekhar-p đã nhận 2 ngày trước. Đang mởneeds review
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 50/100
google/adk-java#1646 · 3 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
FirestoreSessionService ignores `app:` / `user:` state prefixes, so app and user state are never shared across sessionsCó thể đã có người làm @hemasekhar-p đã nhận 2 ngày trước. Đang mởwaiting on reporter
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 45/100
google/adk-java#1645 · 2 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của google/adk-java
Issue tương tự
-
RRateLimiter acquire methods accept negative permits and raise available permits above the rate.Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 4 ngày
-
README 中的代码语言数量与当前目录不一致Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 75/100
krahets/hello-algo#1993 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
NationalSecurityAgency/ghidra#9884 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Status: Pending Review Type: Feature Request
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 82/100
OpenRefine/OpenRefine#8019 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[TEMP] pin maven version to 3.9.xCó thể đã có người làm @petrenyi-mark đã nhận hôm nay. Đang mở
Độ khó 2/5 Dưới một giờ Mức phù hợp với người mới 62/100