forked from lingyuzeng/agent
add mcp use method
This commit is contained in:
52
examples/mcp_modes/direct_tool_loop.py
Normal file
52
examples/mcp_modes/direct_tool_loop.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# examples/mcp_modes/direct_tool_loop.py
|
||||
import asyncio
|
||||
from langchain_core.messages import HumanMessage, ToolMessage
|
||||
from langgraph_qwen.chat_model import ChatQwenOpenAICompat
|
||||
from langgraph_qwen.mcp import load_mcp_tools
|
||||
|
||||
PHASE1_SERVERS = {
|
||||
"math": {"command":"python","args":["/abs/path/to/math_server.py"],"transport":"stdio"}
|
||||
}
|
||||
PHASE2_SERVERS = {
|
||||
"weather": {"url":"http://127.0.0.1:8000/mcp/","transport":"streamable_http"}
|
||||
}
|
||||
|
||||
async def main(max_steps: int = 8):
|
||||
# ★ 比如不同阶段加载不同工具集
|
||||
tools_phase1 = await load_mcp_tools(servers=PHASE1_SERVERS)
|
||||
tools_phase2 = await load_mcp_tools(servers=PHASE2_SERVERS)
|
||||
|
||||
model = ChatQwenOpenAICompat(temperature=0).bind_tools(
|
||||
tools_phase1 + tools_phase2
|
||||
).bind(tool_choice="auto")
|
||||
|
||||
tool_map = {t.name: t for t in (tools_phase1 + tools_phase2)}
|
||||
msgs = [HumanMessage(content="先用数学工具算 12*(3+5),再查北京天气,最后给一句总结。")]
|
||||
|
||||
for _ in range(max_steps):
|
||||
ai = await model.ainvoke(msgs)
|
||||
msgs.append(ai)
|
||||
calls = getattr(ai, "tool_calls", []) or ai.additional_kwargs.get("tool_calls", [])
|
||||
if not calls:
|
||||
break
|
||||
for call in calls:
|
||||
name, args, call_id = call.get("name"), call.get("args", {}), call.get("id") or ""
|
||||
tool = tool_map.get(name)
|
||||
if not tool:
|
||||
msgs.append(ToolMessage(tool_call_id=call_id, content=f"Unknown tool: {name}"))
|
||||
continue
|
||||
try:
|
||||
if hasattr(tool, "ainvoke"):
|
||||
out = await tool.ainvoke(args)
|
||||
else:
|
||||
out = tool.invoke(args)
|
||||
msgs.append(ToolMessage(tool_call_id=call_id, content=str(out)))
|
||||
except Exception as e:
|
||||
msgs.append(ToolMessage(tool_call_id=call_id, content=f"Error: {e}"))
|
||||
|
||||
final = await model.ainvoke(msgs)
|
||||
print("=== Final ===")
|
||||
print(final.content)
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user