|
| 1 | +""" |
| 2 | +Demo Frontend Agent:内置 agent,负责在需要验证的节点调用前端 demo_frontend_tool, |
| 3 | +同一轮 run 内下发 function_call、等待前端回传结果并写入 session.state。 |
| 4 | +""" |
| 5 | + |
| 6 | +import logging |
| 7 | +import uuid |
| 8 | +from typing import AsyncGenerator |
| 9 | + |
| 10 | +from google.adk.agents import InvocationContext |
| 11 | +from google.adk.events import Event |
| 12 | + |
| 13 | +from agents.matmaster_agent.constant import ModelRole |
| 14 | +from agents.matmaster_agent.core_agents.base_agents.error_agent import ( |
| 15 | + ErrorHandleBaseAgent, |
| 16 | +) |
| 17 | +from agents.matmaster_agent.flow_agents.constant import ( |
| 18 | + DEMO_FRONTEND_TOOL, |
| 19 | + DEMO_FRONTEND_TOOL_RESULT_STATE_KEY, |
| 20 | +) |
| 21 | +from agents.matmaster_agent.sub_agents.built_in_agent.demo_frontend_agent.constant import ( |
| 22 | + DEMO_FRONTEND_AGENT_NAME, |
| 23 | +) |
| 24 | +from agents.matmaster_agent.sub_agents.built_in_agent.demo_frontend_agent.tool import ( |
| 25 | + demo_frontend_tool, |
| 26 | + wait_for_frontend_tool_result, |
| 27 | +) |
| 28 | +from agents.matmaster_agent.utils.event_utils import ( |
| 29 | + context_function_call_event, |
| 30 | + update_state_event, |
| 31 | +) |
| 32 | + |
| 33 | +logger = logging.getLogger(__name__) |
| 34 | + |
| 35 | + |
| 36 | +class DemoFrontendAgent(ErrorHandleBaseAgent): |
| 37 | + """ |
| 38 | + 内置 agent:调用前端 demo_frontend_tool(message/title), |
| 39 | + 同一轮 run 内 yield function_call → await 前端回传 → 写入 session.state。 |
| 40 | + """ |
| 41 | + |
| 42 | + def __init__(self): |
| 43 | + super().__init__(name=DEMO_FRONTEND_AGENT_NAME, tools=[demo_frontend_tool]) |
| 44 | + |
| 45 | + async def _run_events(self, ctx: InvocationContext) -> AsyncGenerator[Event, None]: |
| 46 | + function_call_id = f"added_{str(uuid.uuid4()).replace('-', '')[:24]}" |
| 47 | + yield context_function_call_event( |
| 48 | + ctx, |
| 49 | + self.name, |
| 50 | + function_call_id, |
| 51 | + DEMO_FRONTEND_TOOL, |
| 52 | + ModelRole, |
| 53 | + {'message': '请确认', 'title': '前端 Demo Tool'}, |
| 54 | + ) |
| 55 | + demo_result = await wait_for_frontend_tool_result( |
| 56 | + ctx.session.id, ctx.invocation_id, function_call_id |
| 57 | + ) |
| 58 | + ctx.session.state[DEMO_FRONTEND_TOOL_RESULT_STATE_KEY] = demo_result |
| 59 | + yield update_state_event( |
| 60 | + ctx, state_delta={DEMO_FRONTEND_TOOL_RESULT_STATE_KEY: demo_result} |
| 61 | + ) |
| 62 | + |
| 63 | + |
| 64 | +def init_demo_frontend_agent() -> DemoFrontendAgent: |
| 65 | + return DemoFrontendAgent() |
0 commit comments