client_agent.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import asyncio
  2. import json
  3. import logging
  4. from langchain.agents import create_tool_calling_agent, AgentExecutor
  5. from langchain_core.prompts import ChatPromptTemplate
  6. from langchain_openai import ChatOpenAI
  7. from python_a2a.mcp import MCPClient
  8. from langchain_core.tools import tool
  9. from agent_learn.config import Config
  10. conf = Config()
  11. # 配置日志
  12. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
  13. logger = logging.getLogger(__name__)
  14. # 创建模型
  15. llm = ChatOpenAI(base_url=conf.base_url,
  16. api_key=conf.api_key,
  17. model=conf.model_name,
  18. temperature=0.1)
  19. async def test_mcp_tools():
  20. # 连接到服务端,端口 8010
  21. client = MCPClient("http://localhost:8010")
  22. try:
  23. # 步骤 1:获取可用工具列表
  24. tools = await client.get_tools()
  25. logger.info("可用工具列表:")
  26. for tool_info in tools:
  27. print(tool_info)
  28. logger.info(f"- {tool_info.get('name', '未知')}: {tool_info.get('description', '无描述')}")
  29. # 用两个无参数函数,把 MCP 工具交给 Agent 使用
  30. @tool("get_weather")
  31. async def get_weather_tool() -> str:
  32. """获取教学示例中的北京天气,不查询实时天气。"""
  33. return await client.call_tool("get_weather")
  34. @tool("query_high_frequency_question")
  35. async def query_high_frequency_question_tool() -> str:
  36. """获取教学示例中的高频问题和答案。"""
  37. return await client.call_tool("query_high_frequency_question")
  38. tools = [get_weather_tool, query_high_frequency_question_tool]
  39. # 创建prompt模板
  40. prompt_template = ChatPromptTemplate.from_messages([
  41. ("system", "你是一个乐于助人的助手,能够调用工具回答用户问题。工具不需要传参。"),
  42. ("human", "{input}"),
  43. ("placeholder", "{agent_scratchpad}"),
  44. ])
  45. # 构建工具调用代理
  46. agent = create_tool_calling_agent(llm, tools, prompt_template)
  47. # 创建代理执行器
  48. agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
  49. # 代理调用
  50. print("MCP客户端启动,输入'quit'退出")
  51. while True:
  52. # 接收用户查询
  53. query = input("\nQuery: ").strip()
  54. if query.lower() == "quit":
  55. break
  56. # 发送用户查询给代理,并打印
  57. try:
  58. response = await agent_executor.ainvoke({"input": query})
  59. print(f"response-->{response}")
  60. except Exception as e:
  61. print(f"工具调用失败:{e}")
  62. except Exception as e:
  63. logger.error(f"MCP 客户端出错:{str(e)}", exc_info=True)
  64. finally:
  65. await client.close()
  66. async def main():
  67. await test_mcp_tools()
  68. if __name__ == "__main__":
  69. asyncio.run(main())