Route response item IDs through a shared generator (#59312)

## What changed

Introduce `ItemIdGenerator` and pass the runtime-owned generator through sessions, model clients, history, hooks, tool outputs, and memory requests. Keep UUIDv7 generation as the default and replace direct calls to `ResponseItemId::new` with the shared callable.

Preserve existing item IDs and backfill missing or empty IDs through the same generator, including forked history before reconstruction and persistence.

## Testing

Extend coverage for UUIDv7 IDs on user messages, agent messages, and additional tools, and assert that forked model context matches the backfilled items persisted to history.

GitOrigin-RevId: 0dd9ccf0f46f0f1005a6acfc740133b03ce82259
This commit is contained in:
Ruslan Nigmatullin
2026-11-04 04:02:00 +00:00
committed by copyberry
parent f2b94ef8b5
commit d84c872464
68 changed files with 634 additions and 336 deletions
@@ -1,5 +1,4 @@
use super::ConfigurationReasoning;
use crate::ResponseItemId;
use crate::models::ResponseItem;
use crate::openai_models::ReasoningEffort;
use pretty_assertions::assert_eq;
@@ -21,7 +20,9 @@ fn configuration_update_round_trips_without_message_fields() {
}
);
item.set_id(Some(ResponseItemId::new("configuration-id")));
item.set_id(Some(crate::uuid_v7_item_id_generator_for_test()(
"configuration-id",
)));
item.set_turn_id_if_missing("turn-id");
item.set_create_time_if_missing(serde_json::Number::from(123));
assert_eq!(