Skip to content

Commit 621cbdc

Browse files
committed
refactor:将demo_frontend_tool移至内置agent以增强工具组织和代码可维护性
1 parent 4ca4423 commit 621cbdc

6 files changed

Lines changed: 91 additions & 26 deletions

File tree

agents/matmaster_agent/agent.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
)
1212
from agents.matmaster_agent.constant import MATMASTER_AGENT_NAME
1313
from agents.matmaster_agent.flow_agents.agent import MatMasterFlowAgent
14-
from agents.matmaster_agent.flow_agents.demo_frontend_tool import demo_frontend_tool
1514
from agents.matmaster_agent.llm_config import (
1615
MatMasterLlmConfig,
1716
)
@@ -30,7 +29,6 @@ def init_matmaster_agent() -> LlmAgent:
3029
matmaster_agent = MatMasterFlowAgent(
3130
name=MATMASTER_AGENT_NAME,
3231
model=MatMasterLlmConfig.default_litellm_model,
33-
tools=[demo_frontend_tool],
3432
before_agent_callback=[
3533
matmaster_prepare_state,
3634
matmaster_set_lang,

agents/matmaster_agent/flow_agents/agent.py

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import copy
22
import json
33
import logging
4-
import uuid
54
from asyncio import CancelledError
65
from typing import AsyncGenerator
76

@@ -40,15 +39,10 @@
4039
ChatAgentInstruction,
4140
)
4241
from agents.matmaster_agent.flow_agents.constant import (
43-
DEMO_FRONTEND_TOOL,
44-
DEMO_FRONTEND_TOOL_RESULT_STATE_KEY,
4542
MATMASTER_FLOW,
4643
MATMASTER_FLOW_PLANS,
4744
MATMASTER_GENERATE_NPS,
4845
)
49-
from agents.matmaster_agent.flow_agents.demo_frontend_tool import (
50-
wait_for_frontend_tool_result,
51-
)
5246
from agents.matmaster_agent.flow_agents.execution_agent.agent import (
5347
MatMasterSupervisorAgent,
5448
)
@@ -125,14 +119,16 @@
125119
PLAN,
126120
UPLOAD_FILE,
127121
)
122+
from agents.matmaster_agent.sub_agents.built_in_agent.demo_frontend_agent import (
123+
init_demo_frontend_agent,
124+
)
128125
from agents.matmaster_agent.sub_agents.mapping import (
129126
AGENT_CLASS_MAPPING,
130127
ALL_AGENT_TOOLS_LIST,
131128
)
132129
from agents.matmaster_agent.sub_agents.tools import ALL_TOOLS
133130
from agents.matmaster_agent.utils.event_utils import (
134131
all_text_event,
135-
context_function_call_event,
136132
context_function_event,
137133
is_text,
138134
send_error_event,
@@ -225,6 +221,8 @@ def after_init(self):
225221
instruction='',
226222
)
227223

224+
self._demo_frontend_agent = init_demo_frontend_agent()
225+
228226
self.sub_agents = [
229227
self.chat_agent,
230228
self.handle_upload_agent,
@@ -811,20 +809,9 @@ async def _run_async_impl(
811809
yield quota_remaining_event
812810
return
813811

814-
# 在需要验证的节点调用前端 demo_frontend_tool(同一轮 run:yield function_call 后 await 前端回传)
815-
function_call_id = f"added_{str(uuid.uuid4()).replace('-', '')[:24]}"
816-
yield context_function_call_event(
817-
ctx,
818-
self.name,
819-
function_call_id,
820-
DEMO_FRONTEND_TOOL,
821-
ModelRole,
822-
{'message': '请确认', 'title': '前端 Demo Tool'},
823-
)
824-
demo_result = await wait_for_frontend_tool_result(
825-
ctx.session.id, ctx.invocation_id, function_call_id
826-
)
827-
ctx.session.state[DEMO_FRONTEND_TOOL_RESULT_STATE_KEY] = demo_result
812+
# 在需要验证的节点调用内置 demo_frontend_agent(其内挂 demo_frontend_tool,同一轮 run 内等前端回传)
813+
async for demo_event in self._demo_frontend_agent.run_async(ctx):
814+
yield demo_event
828815

829816
# 上传文件特殊处理
830817
async for handle_upload_event in self.handle_upload_agent.run_async(ctx):
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from agents.matmaster_agent.sub_agents.built_in_agent.demo_frontend_agent.agent import (
2+
DemoFrontendAgent,
3+
init_demo_frontend_agent,
4+
)
5+
from agents.matmaster_agent.sub_agents.built_in_agent.demo_frontend_agent.tool import (
6+
set_frontend_tool_result,
7+
wait_for_frontend_tool_result,
8+
)
9+
10+
__all__ = [
11+
'DemoFrontendAgent',
12+
'init_demo_frontend_agent',
13+
'set_frontend_tool_result',
14+
'wait_for_frontend_tool_result',
15+
]
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DEMO_FRONTEND_AGENT_NAME = 'demo_frontend_agent'

agents/matmaster_agent/flow_agents/demo_frontend_tool.py renamed to agents/matmaster_agent/sub_agents/built_in_agent/demo_frontend_agent/tool.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
"""
22
前端 Demo Tool:ADK 侧注册为 FunctionTool,实际执行由前端完成,返回值在同轮 run 内回传。
33
4-
- 在 flow/agent 的 tools 里增加本模块的 demo_frontend_tool,即可在需要验证的节点调用
5-
例如:demo_frontend_tool(message="请确认", title="前端 Demo Tool")
4+
- 本 tool 挂在 demo_frontend_agent 的 tools 里;flow 在需要验证的节点调用该 agent 即可。
65
- 前端收到 function_call 后展示卡片,用户操作后通过 API 调用 set_frontend_tool_result
7-
传入 (session_id, invocation_id, function_call_id, result),本侧 await 即返回并继续
6+
传入 (session_id, invocation_id, function_call_id, result),本侧 await 即返回并继续
87
"""
98

109
import asyncio

0 commit comments

Comments
 (0)