Describe the Bug:
The LlmAgent parameter instruction (basically the prompt) can either be a string or an InstructionProvider , which is a callable that receives a ReadonlyContext and returns an instruction string (sync or async):
llm_agent.py: instruction: Union[str, InstructionProvider] = ''
However, if you create an Agent using an InstructionProvider, the A2A agent card builder fails, because it’s expecting a string not a function in agent.instruction:
def _build_llm_agent_description_with_instructions(agent: LlmAgent) -> str:
....
if agent.instruction:
instruction = _replace_pronouns(agent.instruction)
...
def _replace_pronouns(text: str) -> str:
...
return re.sub(
pattern,
lambda match: pronoun_map[match.group(1).lower()],
text, # <-- this parameter must be a string
flags=re.IGNORECASE,
)
Steps to Reproduce:
- Create an agent where the
instruction parameter is an InstructionProvider (ie a function).
- Pass the agent into the
build_card function in a2a.py
Expected Behavior:
The agent should build and run just fine.
Observed Behavior:
Stack trace inside the build_card call:
File ".venv/lib/python3.13/site-packages/google/adk/a2a/utils/agent_card_builder.py", line 74, in build
primary_skills = await _build_primary_skills(self._agent)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.13/site-packages/google/adk/a2a/utils/agent_card_builder.py", line 102, in _build_primary_skills
return await _build_llm_agent_skills(agent)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.13/site-packages/google/adk/a2a/utils/agent_card_builder.py", line 112, in _build_llm_agent_skills
agent_description = _build_llm_agent_description_with_instructions(agent)
File ".venv/lib/python3.13/site-packages/google/adk/a2a/utils/agent_card_builder.py", line 339, in _build_llm_agent_description_with_instructions
instruction = _replace_pronouns(agent.instruction)
File ".venv/lib/python3.13/site-packages/google/adk/a2a/utils/agent_card_builder.py", line 377, in _replace_pronouns
return re.sub(
~~~~~~^
pattern,
^^^^^^^^
...<2 lines>...
flags=re.IGNORECASE,
^^^^^^^^^^^^^^^^^^^^
)
^
File ".venv/lib/python3.13/re/__init__.py", line 208, in sub
return _compile(pattern, flags).sub(repl, string, count)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
TypeError: expected string or bytes-like object, got 'function'
Environment Details:
- ADK Library Version (pip show google-adk): 1.33.0
- Desktop OS: MacOs
- Python Version (python -V): 3.13
Model Information:
- Are you using LiteLLM:No
- Which model is being used: claude-opus-4.6, but it happens for any model
🟡 Optional Information
Providing this information greatly speeds up the resolution process.
Regression:
Did this work in a previous version of ADK?
Don't know
Logs:
Please attach relevant logs. Wrap them in code blocks (```) or attach a
text file.
Screenshots / Video:
If applicable, add screenshots or screen recordings to help explain
your problem.
Additional Context:
Add any other context about the problem here.
Minimal Reproduction Code:
Please provide a code snippet or a link to a Gist/repo that isolates the issue.
How often has this issue occurred?:
Describe the Bug:
The LlmAgent parameter
instruction(basically the prompt) can either be astringor anInstructionProvider , which is a callable that receives a ReadonlyContext and returns an instruction string (sync or async):llm_agent.py:
instruction: Union[str, InstructionProvider] = ''However, if you create an Agent using an InstructionProvider, the A2A agent card builder fails, because it’s expecting a string not a function in
agent.instruction:Steps to Reproduce:
instructionparameter is anInstructionProvider(ie a function).build_cardfunction in a2a.pyExpected Behavior:
The agent should build and run just fine.
Observed Behavior:
Stack trace inside the build_card call:
Environment Details:
Model Information:
🟡 Optional Information
Providing this information greatly speeds up the resolution process.
Regression:
Did this work in a previous version of ADK?
Don't know
Logs:
Please attach relevant logs. Wrap them in code blocks (```) or attach a
text file.
Screenshots / Video:
If applicable, add screenshots or screen recordings to help explain
your problem.
Additional Context:
Add any other context about the problem here.
Minimal Reproduction Code:
Please provide a code snippet or a link to a Gist/repo that isolates the issue.
How often has this issue occurred?: