Skip to content

Conversation

@jayy-77
Copy link

@jayy-77 jayy-77 commented Feb 12, 2026

Please ensure you have read the contribution guide before creating a pull request.

Link to Issue or Description of Change

1. Link to an existing issue (if applicable):

2. Or, if no issue exists, describe the change:

If applicable, please follow the issue templates to provide as much detail as
possible.

Problem:
A clear and concise description of what the problem is.

Solution:
A clear and concise description of what you want to happen and why you choose
this solution.

Testing Plan

Please describe the tests that you ran to verify your changes. This is required
for all PRs that are not small documentation or typo fixes.

Unit Tests:

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

Please include a summary of passed pytest results.

Manual End-to-End (E2E) Tests:

Please provide instructions on how to manually test your changes, including any
necessary setup or configuration. Please provide logs or screenshots to help
reviewers better understand the fix.

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

Add any other context or screenshots about the feature request here.

@adk-bot adk-bot added the core [Component] This issue is related to the core interface and implementation label Feb 12, 2026
@adk-bot
Copy link
Collaborator

adk-bot commented Feb 12, 2026

Response from ADK Triaging Agent

Hello @jayy-77, thank you for creating this PR!

To help us review your contribution, could you please fill out the pull request template in the description? Specifically, we need:

  • A link to an associated issue or a detailed description of the change you're making.
  • A "Testing Plan" that describes how you've tested your changes, including unit tests and manual end-to-end tests.

This information is crucial for our reviewers to understand and verify your work efficiently. You can find more details in our contribution guidelines.

Thanks!

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @jayy-77, 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 significant improvements for dynamic agent management within the system. It enables agents to be reloaded and updated at runtime without service interruption, which is crucial for scenarios where agent configurations, such as instructions or tools, change frequently. These changes enhance the flexibility and responsiveness of the agent execution environment, particularly for live interaction sessions.

Highlights

  • Dynamic Agent Reloading in AdkWebServer: Implemented logic within the AdkWebServer to dynamically reload agents during live sessions. This ensures that any configuration changes, such as updated instructions from a config manager, are reflected without requiring a server restart. The system attempts to reload the agent from disk and falls back to the cached version if reloading fails.
  • AgentLoader Enhancements: Added a new reload_agent method to the AgentLoader utility, which forces an agent to be reloaded from disk by first removing it from the cache. The existing remove_agent_from_cache method also received an updated docstring for clarity.
  • Runner Agent Update Capabilities: Introduced an update_agent method in the Runner class, allowing the runner's internal agent reference to be updated at runtime. Additionally, the run_live method now accepts an optional agent parameter, enabling one-time overrides for specific live invocations, facilitating dynamic agent changes without instantiating a new Runner.

🧠 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.

Changelog
  • src/google/adk/cli/adk_web_server.py
    • Added conditional agent reloading logic in run_agent_live to support dynamic updates.
    • Modified run_agent_live to pass the reloaded agent to the agen call.
  • src/google/adk/cli/utils/agent_loader.py
    • Updated the docstring for remove_agent_from_cache to clarify its purpose for hot-reload scenarios.
    • Added a new reload_agent method to force agent reloading from disk, bypassing the cache.
  • src/google/adk/runners.py
    • Added an update_agent method to allow runtime modification of the runner's agent.
    • Introduced an optional agent parameter to the run_live method for per-invocation agent overrides.
    • Updated the run_live method's docstring to describe the new agent parameter.
    • Modified run_live to use the provided agent parameter if available, otherwise defaulting to the runner's agent.
Activity
  • No human activity has occurred on this pull request yet.
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.

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 valuable feature for dynamically updating agents in the Runner and AdkWebServer for hot-reloading configurations. However, it introduces a critical path traversal vulnerability where user-provided input from the WebSocket URL is used to construct file paths without sanitization, potentially leading to Remote Code Execution (RCE). Additionally, there's a critical issue in adk_web_server.py that will cause a runtime error and a potential consistency issue in runners.py. Detailed comments and suggestions have been provided to address these points and prevent the vulnerability.

Comment on lines +1720 to +1742
if self.reload_agents:
try:
# Force reload the agent from disk
self.agent_loader.remove_agent_from_cache(app_name)
agent_or_app = self.agent_loader.load_agent(app_name)

if isinstance(agent_or_app, App):
reloaded_agent = agent_or_app.root_agent
else:
reloaded_agent = agent_or_app

logger.info(
'Reloaded agent %s for live session (instructions may have updated)',
app_name
)
except Exception as e:
logger.warning(
'Failed to reload agent %s, using cached version: %s',
app_name, e
)
reloaded_agent = None
else:
reloaded_agent = None
Copy link
Contributor

Choose a reason for hiding this comment

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

security-critical critical

The run_agent_live WebSocket endpoint accepts an app_name parameter from the URL which is used to dynamically reload agent configurations. This app_name is passed directly to self.agent_loader.remove_agent_from_cache() and self.agent_loader.load_agent() without proper sanitization, leading to a critical Path Traversal vulnerability and potential Remote Code Execution (RCE). Additionally, the AdkWebServer class lacks a reload_agents attribute, which will cause an AttributeError at runtime. The agent reloading logic could also be simplified.

import os
import re

      # Perform security check for app_name to prevent path traversal.
      if not re.match(r'^[a-zA-Z0-9_]+$', app_name):
          await websocket.close(code=1008, reason='Invalid app_name format')
          return

      # More robust path validation
      agent_path = os.path.abspath(os.path.join(self.agents_dir, app_name))
      if not agent_path.startswith(os.path.abspath(self.agents_dir)):
          await websocket.close(code=1008, reason='Path traversal detected')
          return

Comment on lines +379 to +385
self.agent = agent
# Re-infer agent origin for the new agent
self._agent_origin_app_name, self._agent_origin_dir = (
self._infer_agent_origin(agent)
)
self._enforce_app_name_alignment()
logger.info('Updated runner agent to: %s', agent.name)
Copy link
Contributor

Choose a reason for hiding this comment

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

high

When update_agent is called, it updates self.agent but does not update self.app.root_agent if an App instance was provided to the Runner. This can lead to inconsistent behavior, as other parts of the Runner, like event compaction, might still use the old agent from self.app. To ensure consistency, you should also update self.app.root_agent.

    self.agent = agent
    if self.app:
      self.app.root_agent = agent
    # Re-infer agent origin for the new agent
    self._agent_origin_app_name, self._agent_origin_dir = (
        self._infer_agent_origin(agent)
    )
    self._enforce_app_name_alignment()
    logger.info('Updated runner agent to: %s', agent.name)

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

Labels

core [Component] This issue is related to the core interface and implementation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants