Skip to content

feat: durable runtime support#4200

Open
marcusmotill wants to merge 5 commits intogoogle:mainfrom
marcusmotill:motill/durable-support
Open

feat: durable runtime support#4200
marcusmotill wants to merge 5 commits intogoogle:mainfrom
marcusmotill:motill/durable-support

Conversation

@marcusmotill
Copy link

@marcusmotill marcusmotill commented Jan 19, 2026

Moves runtime, event, and session service changes to a separate branch. These changes support deterministic execution required for durable integrations.

Problem:
The current implementation of SessionService, Event, and other core components relies directly on time.time() and uuid.uuid4(). These standard library functions are non-deterministic, which prevents the ADK from being used in deterministic execution environments (like Temporal workflows). In such environments, logic that depends on time or random IDs must be replayable and consistent across executions.

Solution:
Introduced google.adk.platform.time and google.adk.platform.uuid modules to abstract time and UUID generation.

  • Created google.adk.platform.time with get_time() and set_time_provider().
  • Created google.adk.platform.uuid with new_uuid() and set_id_provider().
  • Updated Event, SessionService, InvocationContext, and SqliteSessionService to use these new platform abstractions instead of time and uuid directly.

This allows runtimes to inject deterministic providers (e.g., Temporal's workflow.now() and side-effect-safe UUIDs) when running in a deterministic context, while defaulting to standard time and uuid for standard execution.

Testing Plan

Unit Tests:

  • I have added or updated unit tests for my change.
  • All unit tests pass locally.

Added new unit tests for the platform modules:

  • tests/unittests/platform/test_time.py: Verifies get_time, provider overriding, and resetting.
  • tests/unittests/platform/test_uuid.py: Verifies new_uuid, provider overriding, and resetting.
  • Updated tests/unittests/artifacts/test_artifact_service.py to match the new patterns.

Manual End-to-End (E2E) Tests:

Verified that the ADK continues to function correctly in standard (non-deterministic) environments, ensuring the default providers for time and UUIDs work as expected.

  • Ran existing agent workflows to confirm session creation and event logging still produce valid timestamps and IDs.

Checklist

  • I have read the CONTRIBUTING.md document.
  • I have performed a self-review of my own code.
  • I have commented my code, particularly in hard-to-understand areas.
  • I have added tests that prove my fix is effective or that my feature works.
  • New and existing unit tests pass locally with my changes.
  • I have manually tested my changes end-to-end.
  • Any dependent changes have been merged and published in downstream modules.

Additional context

These changes are a prerequisite for the Temporal integration, allowing the ADK to run safely inside Temporal workflows without breaking determinism guarantees.

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @marcusmotill, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a new runtime abstraction layer to centralize and control system-level operations such as retrieving the current time and generating unique identifiers. This change is fundamental for enabling deterministic execution, which is a key requirement for building durable integrations. By abstracting these operations, the system gains the flexibility to inject custom providers, facilitating testing and ensuring consistent behavior across different execution environments.

Highlights

  • New Runtime Abstraction Module: Introduced a new runtime module (src/google/adk/runtime.py) to abstract system primitives such as time retrieval and UUID generation. This module provides set_time_provider and set_id_provider functions, allowing custom implementations to be injected for deterministic behavior.
  • Integration with Event and Session Services: Modified Event (src/google/adk/events/event.py) and InMemorySessionService (src/google/adk/sessions/in_memory_session_service.py) to utilize the new runtime module for obtaining timestamps and generating unique identifiers, replacing direct calls to datetime.now().timestamp(), time.time(), and uuid.uuid4().
  • Comprehensive Unit Tests for Runtime Module: Added a new test file (tests/unittests/test_runtime.py) with unit tests for the runtime module, covering both default behavior and the functionality of setting and using custom time and ID providers.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@adk-bot adk-bot added the services [Component] This issue is related to runtime services, e.g. sessions, memory, artifacts, etc label Jan 19, 2026
@adk-bot
Copy link
Collaborator

adk-bot commented Jan 19, 2026

Response from ADK Triaging Agent

Hello @marcusmotill, thank you for creating this PR!

Could you please associate a GitHub issue with this PR? If there is no existing issue, could you please create one?

In addition, could you please provide a testing plan in the PR description?

This information will help reviewers to review your PR more efficiently. Thanks!

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a runtime module to abstract system primitives like time and UUID generation, which is a great step towards enabling deterministic execution for durable integrations. The changes in event.py and in_memory_session_service.py correctly adopt this new module. My review focuses on improving the maintainability and testability of the new runtime module by suggesting a way to centralize the default provider logic, which will simplify test setup and teardown.

@boyangsvl
Copy link
Collaborator

Thank you for the PR! Could you use a different name than 'runtime'? runtime is too general and may be confused with something else. Or you don't need a wrapper for time and id provider and make them top level.

Moves runtime, event, and session service changes to a separate branch.
These changes support deterministic execution required for durable integrations.
@marcusmotill marcusmotill force-pushed the motill/durable-support branch from 8e7a7bc to 5abb519 Compare February 19, 2026 03:41
@marcusmotill
Copy link
Author

/gemini summary

@gemini-code-assist
Copy link
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@marcusmotill
Copy link
Author

/gemini review

@gemini-code-assist
Copy link
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@marcusmotill marcusmotill marked this pull request as ready for review February 19, 2026 03:53
@gemini-code-assist
Copy link
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

services [Component] This issue is related to runtime services, e.g. sessions, memory, artifacts, etc

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

Comments