Skip to content

Get RecursionError when running using custom agents #461

Open
@hsuyuming

Description

@hsuyuming

Describe the bug
When i try to use agent.find_agent(agent_name), i get "RecursionError: maximum recursion depth exceeded in comparison" error message.

To Reproduce
Steps to reproduce the behavior:

  1. Create virtual env
python -m venv .venv
source .venv/bin/activate
pip install google-adk==0.3.0
  1. reproduce file (custom_agent_vertex.py)
# Full runnable code for the StoryFlowAgent example
import logging
from typing import AsyncGenerator
from typing_extensions import override

from google.adk.agents import LlmAgent, BaseAgent, LoopAgent, SequentialAgent
from google.adk.agents.invocation_context import InvocationContext
from google.genai import types
from google.adk.sessions import InMemorySessionService
from google.adk.runners import Runner
from google.adk.events import Event
from pydantic import BaseModel, Field

# --- Constants ---
APP_NAME = "story_app"
USER_ID = "12345"
SESSION_ID = "123344"
GEMINI_2_FLASH = "gemini-2.0-flash"

# --- Configure Logging ---
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


# --- Custom Orchestrator Agent ---
class StoryFlowAgent(BaseAgent):
    """
    Custom agent for a story generation and refinement workflow.

    This agent orchestrates a sequence of LLM agents to generate a story,
    critique it, revise it, check grammar and tone, and potentially
    regenerate the story if the tone is negative.
    """

    # --- Field Declarations for Pydantic ---
    # Declare the agents passed during initialization as class attributes with type hints
    story_generator: LlmAgent
    critic: LlmAgent
    reviser: LlmAgent
    grammar_check: LlmAgent
    tone_check: LlmAgent

    loop_agent: LoopAgent
    sequential_agent: SequentialAgent

    # model_config allows setting Pydantic configurations if needed, e.g., arbitrary_types_allowed
    model_config = {"arbitrary_types_allowed": True}

    def __init__(
        self,
        name: str,
        story_generator: LlmAgent,
        critic: LlmAgent,
        reviser: LlmAgent,
        grammar_check: LlmAgent,
        tone_check: LlmAgent,
    ):
        """
        Initializes the StoryFlowAgent.

        Args:
            name: The name of the agent.
            story_generator: An LlmAgent to generate the initial story.
            critic: An LlmAgent to critique the story.
            reviser: An LlmAgent to revise the story based on criticism.
            grammar_check: An LlmAgent to check the grammar.
            tone_check: An LlmAgent to analyze the tone.
        """
        # Create internal agents *before* calling super().__init__
        loop_agent = LoopAgent(
            name="CriticReviserLoop", sub_agents=[critic, reviser], max_iterations=2
        )
        sequential_agent = SequentialAgent(
            name="PostProcessing", sub_agents=[grammar_check, tone_check]
        )

        # Define the sub_agents list for the framework
        sub_agents_list = [
            story_generator,
            loop_agent,
            sequential_agent,
        ]

        # Pydantic will validate and assign them based on the class annotations.
        super().__init__(
            name=name,
            story_generator=story_generator,
            critic=critic,
            reviser=reviser,
            grammar_check=grammar_check,
            tone_check=tone_check,
            loop_agent=loop_agent,
            sequential_agent=sequential_agent,
            sub_agents=sub_agents_list, # Pass the sub_agents list directly
        )

    @override
    async def _run_async_impl(
        self, ctx: InvocationContext
    ) -> AsyncGenerator[Event, None]:
        """
        Implements the custom orchestration logic for the story workflow.
        Uses the instance attributes assigned by Pydantic (e.g., self.story_generator).
        """
        logger.info(f"[{self.name}] Starting story generation workflow.")

        # 1. Initial Story Generation
        logger.info(f"[{self.name}] Running StoryGenerator...")
        async for event in self.story_generator.run_async(ctx):
            logger.info(f"[{self.name}] Event from StoryGenerator: {event.model_dump_json(indent=2, exclude_none=True)}")
            yield event

        # Check if story was generated before proceeding
        if "current_story" not in ctx.session.state or not ctx.session.state["current_story"]:
             logger.error(f"[{self.name}] Failed to generate initial story. Aborting workflow.")
             return # Stop processing if initial story failed

        logger.info(f"[{self.name}] Story state after generator: {ctx.session.state.get('current_story')}")


        # 2. Critic-Reviser Loop
        logger.info(f"[{self.name}] Running CriticReviserLoop...")
        # Use the loop_agent instance attribute assigned during init
        async for event in self.loop_agent.run_async(ctx):
            logger.info(f"[{self.name}] Event from CriticReviserLoop: {event.model_dump_json(indent=2, exclude_none=True)}")
            yield event

        logger.info(f"[{self.name}] Story state after loop: {ctx.session.state.get('current_story')}")

        # 3. Sequential Post-Processing (Grammar and Tone Check)
        logger.info(f"[{self.name}] Running PostProcessing...")
        # Use the sequential_agent instance attribute assigned during init
        async for event in self.sequential_agent.run_async(ctx):
            logger.info(f"[{self.name}] Event from PostProcessing: {event.model_dump_json(indent=2, exclude_none=True)}")
            yield event

        # 4. Tone-Based Conditional Logic
        tone_check_result = ctx.session.state.get("tone_check_result")
        logger.info(f"[{self.name}] Tone check result: {tone_check_result}")

        if tone_check_result == "negative":
            logger.info(f"[{self.name}] Tone is negative. Regenerating story...")
            async for event in self.story_generator.run_async(ctx):
                logger.info(f"[{self.name}] Event from StoryGenerator (Regen): {event.model_dump_json(indent=2, exclude_none=True)}")
                yield event
        else:
            logger.info(f"[{self.name}] Tone is not negative. Keeping current story.")
            pass

        logger.info(f"[{self.name}] Workflow finished.")

# --- Define the individual LLM agents ---
story_generator = LlmAgent(
    name="StoryGenerator",
    model=GEMINI_2_FLASH,
    instruction="""You are a story writer. Write a short story (around 100 words) about a cat,
based on the topic provided in session state with key 'topic'""",
    input_schema=None,
    output_key="current_story",  # Key for storing output in session state
)

critic = LlmAgent(
    name="Critic",
    model=GEMINI_2_FLASH,
    instruction="""You are a story critic. Review the story provided in
session state with key 'current_story'. Provide 1-2 sentences of constructive criticism
on how to improve it. Focus on plot or character.""",
    input_schema=None,
    output_key="criticism",  # Key for storing criticism in session state
)

reviser = LlmAgent(
    name="Reviser",
    model=GEMINI_2_FLASH,
    instruction="""You are a story reviser. Revise the story provided in
session state with key 'current_story', based on the criticism in
session state with key 'criticism'. Output only the revised story.""",
    input_schema=None,
    output_key="current_story",  # Overwrites the original story
)

grammar_check = LlmAgent(
    name="GrammarCheck",
    model=GEMINI_2_FLASH,
    instruction="""You are a grammar checker. Check the grammar of the story
provided in session state with key 'current_story'. Output only the suggested
corrections as a list, or output 'Grammar is good!' if there are no errors.""",
    input_schema=None,
    output_key="grammar_suggestions",
)

tone_check = LlmAgent(
    name="ToneCheck",
    model=GEMINI_2_FLASH,
    instruction="""You are a tone analyzer. Analyze the tone of the story
provided in session state with key 'current_story'. Output only one word: 'positive' if
the tone is generally positive, 'negative' if the tone is generally negative, or 'neutral'
otherwise.""",
    input_schema=None,
    output_key="tone_check_result", # This agent's output determines the conditional flow
)

# --- Create the custom agent instance ---
story_flow_agent = StoryFlowAgent(
    name="StoryFlowAgent",
    story_generator=story_generator,
    critic=critic,
    reviser=reviser,
    grammar_check=grammar_check,
    tone_check=tone_check,
)

print(story_flow_agent.find_agent("StoryGenerator"))
  1. execute it
python custom_agent_vertex.py
  1. Error message
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in __repr_str__
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py", line 63, in <genexpr>
    return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__())
  File "/home/user/abehsu/adk-python/.venv/lib/python3.10/site-packages/pydantic/main.py", line 1205, in __repr__
    return f'{self.__repr_name__()}({self.__repr_str__(", ")})'
RecursionError: maximum recursion depth exceeded

Expected behavior
I think it should able to find the sub_agent named "StoryGenerator"

Screenshots
Error message:

Image

The error come from this when pydantic convert the object to string

Image

Desktop (please complete the following information):

  • OS: linux
  • Python version(python -V):Python 3.10.12
  • ADK version(pip show google-adk): 0.3.0

Metadata

Metadata

Labels

coreIssues related to the core interface and implementation

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions