79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
from langgraph.constants import END
|
||
from langgraph.graph import StateGraph
|
||
|
||
from src.agents.common.toolagent import ToolAgent
|
||
|
||
from .context import Context
|
||
from .state import State
|
||
from .tools import get_tools
|
||
|
||
|
||
def tools_branch_continue(state: State):
|
||
messages = state.messages
|
||
last_message = messages[-1]
|
||
# 如果无工具调用则结束
|
||
if not last_message.tool_calls:
|
||
return "end"
|
||
else:
|
||
return "continue"
|
||
|
||
|
||
class ReActAgent(ToolAgent):
|
||
name = "ReActAgent"
|
||
description = "符合 ReAct 范式的智能体,可以通过调用工具来完成复杂任务。"
|
||
|
||
"""
|
||
提示词示例:
|
||
你是一个智能体助手
|
||
|
||
你的所有需要计算的工作不能自己计算,只能通过调用加密计算机工具进行,你只能通过调用该工具的方式进行计算才能得到正确答案。计算顺序是正常的。
|
||
|
||
例如 2+3+2,你必须调用两次加密计算机工具进行运算,最终结果为9。
|
||
"""
|
||
|
||
# TODO:[已完成] React智能体
|
||
'''
|
||
提示词示例:
|
||
你是一个智能体助手
|
||
|
||
你的所有需要计算的工作不能自己计算,只能通过调用加密计算机工具进行,你只能通过调用该工具的方式进行计算才能得到正确答案。计算顺序是正常的。
|
||
|
||
例如 2+3+2,你必须调用两次加密计算机工具进行运算,最终结果为9。
|
||
'''
|
||
|
||
def __init__(self, **kwargs):
|
||
super().__init__(**kwargs)
|
||
self.graph = None
|
||
self.checkpointer = None
|
||
self.context_schema = Context
|
||
self.agent_tools = None
|
||
|
||
def get_tools(self):
|
||
return get_tools()
|
||
|
||
async def get_graph(self, **kwargs):
|
||
# 创建 ReActAgent
|
||
"""构建图"""
|
||
if self.graph:
|
||
return self.graph
|
||
|
||
builder = StateGraph(State, context_schema=self.context_schema)
|
||
builder.add_node("agent", self.llm_call)
|
||
builder.add_node("tools", self.dynamic_tools_node)
|
||
builder.set_entry_point("agent")
|
||
# 添加条件边:agent 决定是否调用工具继续还是结束对话
|
||
builder.add_conditional_edges(
|
||
"agent",
|
||
tools_branch_continue,
|
||
{
|
||
"continue": "tools", # 调用工具
|
||
"end": END, # 结束对话
|
||
},
|
||
)
|
||
builder.add_edge("tools", "agent")
|
||
self.checkpointer = await self._get_checkpointer()
|
||
graph = builder.compile(checkpointer=self.checkpointer, name=self.name)
|
||
self.graph = graph
|
||
return graph
|
||
|