mirror of
https://github.com/EvolutionAPI/adk-python.git
synced 2025-12-18 19:32:21 -06:00
Prevent session state injection for provider supplied instructions
When the user provides instruction provider, we assume that they will inject the session state parameters if needed. This assumption allows users to return code snippets in the instruction provider without any template replacement. PiperOrigin-RevId: 759705471
This commit is contained in:
committed by
Copybara-Service
parent
5ee17a3268
commit
9e9dfa7472
@@ -307,31 +307,53 @@ class LlmAgent(BaseAgent):
|
||||
ancestor_agent = ancestor_agent.parent_agent
|
||||
raise ValueError(f'No model found for {self.name}.')
|
||||
|
||||
async def canonical_instruction(self, ctx: ReadonlyContext) -> str:
|
||||
async def canonical_instruction(
|
||||
self, ctx: ReadonlyContext
|
||||
) -> tuple[str, bool]:
|
||||
"""The resolved self.instruction field to construct instruction for this agent.
|
||||
|
||||
This method is only for use by Agent Development Kit.
|
||||
|
||||
Args:
|
||||
ctx: The context to retrieve the session state.
|
||||
|
||||
Returns:
|
||||
A tuple of (instruction, bypass_state_injection).
|
||||
instruction: The resolved self.instruction field.
|
||||
bypass_state_injection: Whether the instruction is based on
|
||||
InstructionProvider.
|
||||
"""
|
||||
if isinstance(self.instruction, str):
|
||||
return self.instruction
|
||||
return self.instruction, False
|
||||
else:
|
||||
instruction = self.instruction(ctx)
|
||||
if inspect.isawaitable(instruction):
|
||||
instruction = await instruction
|
||||
return instruction
|
||||
return instruction, True
|
||||
|
||||
async def canonical_global_instruction(self, ctx: ReadonlyContext) -> str:
|
||||
async def canonical_global_instruction(
|
||||
self, ctx: ReadonlyContext
|
||||
) -> tuple[str, bool]:
|
||||
"""The resolved self.instruction field to construct global instruction.
|
||||
|
||||
This method is only for use by Agent Development Kit.
|
||||
|
||||
Args:
|
||||
ctx: The context to retrieve the session state.
|
||||
|
||||
Returns:
|
||||
A tuple of (instruction, bypass_state_injection).
|
||||
instruction: The resolved self.global_instruction field.
|
||||
bypass_state_injection: Whether the instruction is based on
|
||||
InstructionProvider.
|
||||
"""
|
||||
if isinstance(self.global_instruction, str):
|
||||
return self.global_instruction
|
||||
return self.global_instruction, False
|
||||
else:
|
||||
global_instruction = self.global_instruction(ctx)
|
||||
if inspect.isawaitable(global_instruction):
|
||||
global_instruction = await global_instruction
|
||||
return global_instruction
|
||||
return global_instruction, True
|
||||
|
||||
async def canonical_tools(
|
||||
self, ctx: ReadonlyContext = None
|
||||
|
||||
@@ -53,18 +53,24 @@ class _InstructionsLlmRequestProcessor(BaseLlmRequestProcessor):
|
||||
if (
|
||||
isinstance(root_agent, LlmAgent) and root_agent.global_instruction
|
||||
): # not empty str
|
||||
raw_si = await root_agent.canonical_global_instruction(
|
||||
ReadonlyContext(invocation_context)
|
||||
raw_si, bypass_state_injection = (
|
||||
await root_agent.canonical_global_instruction(
|
||||
ReadonlyContext(invocation_context)
|
||||
)
|
||||
)
|
||||
si = await _populate_values(raw_si, invocation_context)
|
||||
si = raw_si
|
||||
if not bypass_state_injection:
|
||||
si = await _populate_values(raw_si, invocation_context)
|
||||
llm_request.append_instructions([si])
|
||||
|
||||
# Appends agent instructions if set.
|
||||
if agent.instruction: # not empty str
|
||||
raw_si = await agent.canonical_instruction(
|
||||
raw_si, bypass_state_injection = await agent.canonical_instruction(
|
||||
ReadonlyContext(invocation_context)
|
||||
)
|
||||
si = await _populate_values(raw_si, invocation_context)
|
||||
si = raw_si
|
||||
if not bypass_state_injection:
|
||||
si = await _populate_values(raw_si, invocation_context)
|
||||
llm_request.append_instructions([si])
|
||||
|
||||
# Maintain async generator behavior
|
||||
|
||||
Reference in New Issue
Block a user