fix: Load agent/app before creating session

This change loads the agent or app from the specified directory before creating the session. This allows using the correct application name (from the `App` object if applicable) when initializing the session, rather than always defaulting to the folder name. The variable `root_agent` is also renamed to `agent_or_app` to better reflect that it can be either an Agent or an App

Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 833839070
This commit is contained in:
George Weale
2025-11-18 09:09:22 -08:00
committed by Copybara-Service
parent 4dd28a3970
commit 236f562cd2
2 changed files with 69 additions and 9 deletions
+12 -9
View File
@@ -155,19 +155,22 @@ async def run_cli(
credential_service = InMemoryCredentialService()
user_id = 'test_user'
session = await session_service.create_session(
app_name=agent_folder_name, user_id=user_id
)
root_agent = AgentLoader(agents_dir=agent_parent_dir).load_agent(
agent_or_app = AgentLoader(agents_dir=agent_parent_dir).load_agent(
agent_folder_name
)
session_app_name = (
agent_or_app.name if isinstance(agent_or_app, App) else agent_folder_name
)
session = await session_service.create_session(
app_name=session_app_name, user_id=user_id
)
if not is_env_enabled('ADK_DISABLE_LOAD_DOTENV'):
envs.load_dotenv_for_agent(agent_folder_name, agent_parent_dir)
if input_file:
session = await run_input_file(
app_name=agent_folder_name,
app_name=session_app_name,
user_id=user_id,
agent_or_app=root_agent,
agent_or_app=agent_or_app,
artifact_service=artifact_service,
session_service=session_service,
credential_service=credential_service,
@@ -186,16 +189,16 @@ async def run_cli(
click.echo(f'[{event.author}]: {content.parts[0].text}')
await run_interactively(
root_agent,
agent_or_app,
artifact_service,
session,
session_service,
credential_service,
)
else:
click.echo(f'Running agent {root_agent.name}, type exit to exit.')
click.echo(f'Running agent {agent_or_app.name}, type exit to exit.')
await run_interactively(
root_agent,
agent_or_app,
artifact_service,
session,
session_service,
+57
View File
@@ -27,6 +27,7 @@ from typing import Tuple
import click
from google.adk.agents.base_agent import BaseAgent
from google.adk.apps.app import App
import google.adk.cli.cli as cli
import pytest
@@ -108,6 +109,28 @@ def fake_agent(tmp_path: Path):
return parent_dir, "fake_agent"
@pytest.fixture()
def fake_app_agent(tmp_path: Path):
"""Create an agent package that exposes an App."""
parent_dir = tmp_path / "agents"
parent_dir.mkdir()
agent_dir = parent_dir / "fake_app_agent"
agent_dir.mkdir()
(agent_dir / "__init__.py").write_text(dedent("""
from google.adk.agents.base_agent import BaseAgent
from google.adk.apps.app import App
class FakeAgent(BaseAgent):
def __init__(self, name):
super().__init__(name=name)
root_agent = FakeAgent(name="fake_root")
app = App(name="custom_cli_app", root_agent=root_agent)
"""))
return parent_dir, "fake_app_agent", "custom_cli_app"
# _run_input_file
@pytest.mark.asyncio
async def test_run_input_file_outputs(
@@ -166,6 +189,40 @@ async def test_run_cli_with_input_file(fake_agent, tmp_path: Path) -> None:
)
@pytest.mark.asyncio
async def test_run_cli_app_uses_app_name_for_sessions(
fake_app_agent, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
"""run_cli should honor the App-provided name when creating sessions."""
parent_dir, folder_name, app_name = fake_app_agent
created_app_names: List[str] = []
original_session_cls = cli.InMemorySessionService
class _SpySessionService(original_session_cls):
async def create_session(self, *, app_name: str, **kwargs: Any) -> Any:
created_app_names.append(app_name)
return await super().create_session(app_name=app_name, **kwargs)
monkeypatch.setattr(cli, "InMemorySessionService", _SpySessionService)
input_json = {"state": {}, "queries": ["ping"]}
input_path = tmp_path / "input_app.json"
input_path.write_text(json.dumps(input_json))
await cli.run_cli(
agent_parent_dir=str(parent_dir),
agent_folder_name=folder_name,
input_file=str(input_path),
saved_session_file=None,
save_session=False,
)
assert created_app_names
assert all(name == app_name for name in created_app_names)
# _run_cli (interactive + save session branch)
@pytest.mark.asyncio
async def test_run_cli_save_session(