step5_qwen_agent_use_mcp.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. """
  2. 第 5 步:让 Qwen Agent 自己决定是否调用 MCP 工具。
  3. 前面 step2/step3 是我们在代码里手动调用工具:
  4. tool_map["search_hotels"].ainvoke(...)
  5. 这一步变成:
  6. 用户用自然语言提问
  7. Qwen 判断该调用 search_transport 还是 search_hotels
  8. MCP Server 执行工具
  9. Qwen 根据工具结果回答
  10. 运行:
  11. python step5_qwen_agent_use_mcp.py
  12. """
  13. from __future__ import annotations
  14. import asyncio
  15. import os
  16. import sys
  17. from pathlib import Path
  18. from dotenv import load_dotenv
  19. from langchain.agents import create_agent
  20. from langchain_mcp_adapters.client import MultiServerMCPClient
  21. from langchain_openai import ChatOpenAI
  22. def build_qwen_model() -> ChatOpenAI:
  23. load_dotenv()
  24. api_key = os.getenv("DASHSCOPE_API_KEY")
  25. if not api_key:
  26. raise RuntimeError("请先在 .env 里填写 DASHSCOPE_API_KEY。")
  27. return ChatOpenAI(
  28. api_key=api_key,
  29. base_url=os.getenv("QWEN_BASE_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1"),
  30. model=os.getenv("QWEN_MODEL", "qwen-plus"),
  31. temperature=0.2,
  32. )
  33. async def main() -> None:
  34. server_file = Path(__file__).with_name("my_mcp_demo.py").resolve()
  35. client = MultiServerMCPClient(
  36. {
  37. "travel-tools": {
  38. "transport": "stdio",
  39. "command": sys.executable,
  40. "args": [str(server_file)],
  41. }
  42. }
  43. )
  44. tools = await client.get_tools()
  45. print("Qwen Agent 可用的 MCP 工具:", [tool.name for tool in tools])
  46. model = build_qwen_model()
  47. agent = create_agent(
  48. model=model,
  49. tools=tools,
  50. system_prompt=(
  51. "你是一个旅行助手。"
  52. "当用户询问住宿时,优先使用 search_hotels 工具;"
  53. "当用户询问城市间交通时,优先使用 search_transport 工具;"
  54. "拿到工具结果后,用中文自然语言回答。"
  55. ),
  56. )
  57. result = await agent.ainvoke(
  58. {
  59. "messages": [
  60. {
  61. "role": "user",
  62. "content": "我想 2026-08-15 从成都去重庆玩 3 天 2 晚,帮我看看交通和住宿怎么安排。",
  63. }
  64. ]
  65. }
  66. )
  67. print("\nQwen Agent 最终回答:")
  68. print(result["messages"][-1].content)
  69. if __name__ == "__main__":
  70. asyncio.run(main())