当前位置: 首页 > web >正文

Python-MCPAgent开发-DeepSeek版本

Python-MCPAgent开发-DeepSeek版本

尝试Windows使用Python完成【McpServer】+【McpAgent】开发,当前使用OpenAI-Agents框架进行开发


1-核心知识点

  • 先完成【LLM】配置
  • 再完成【McpServer】开发
  • 再完成【Agent】开发
  • 完成【LLM】+【McpServer】+【Agent】请求互通

2-思路整理

1-开发思路

  • 1-熟悉【SSE模式的MCPServer】开发
  • 2-熟悉【stdio模式的MCPServer】开发
  • 3-熟悉【启动MCPServer】的三种方式
    • 3.1-直接启动:python mcp_server.py
    • 3.2-代码中uv使用:subprocess.Popen([“uv”, “run”, server_file])
    • 3.3-使用mcpInspector网页:mcp dev mcp_server.py
  • 4-熟悉【Agent增强外部能力】的两种方式
    • 4.1-调用tool:Agent(name=“Assistant”, instructions=“用中文回复”, tools=[get_weather])
    • 4.2-调用tool:Agent(name=“Assistant”, instructions=“用中文回复”, mcp_servers=[mcp_server])

2-Tool和MCP的区别

都可以通过【平台】把肚子填饱,但是是两种【经济模式】

  • 1)Tool->自家厨房
  • 2)MCP->快餐外卖(一套标准的经济体系,商家和骑手语言可以互通)

3-MCP Inspector调试-两种方式

  • 使用Node运行后-再调用Python脚本
  • 直接使用python的mcp[cline]命令

4-Agent调用3种方式

  • 1-直接使用tool
  • 2-运行mcpServer_sse(远程服务->直接运行+subprocess子进程)
  • 3-运行mcpServer_stdio(本地服务->直接运行)


3-参考网址

  • 1)OpenAI的官方文档:https://openai.github.io/openai-agents-python/
  • 2)MCP官网的Python样例:https://github.com/openai/openai-agents-python/tree/main
  • 3)个人开发代码仓库:https://gitee.com/enzoism/python_mcp_02_openai_agent

4-动手实践

1-【McpServer】开发

直接参考:https://blog.csdn.net/2301_77717148/article/details/147455632

  • openAI代码:https://github.com/openai/openai-agents-python/blob/main/examples/model_providers/custom_example_provider.py
  • 【McpServer】个人开发代码仓库:https://gitee.com/enzoism/python_mcp_client_server/tree/master/mcp_server

2-【McpClient】开发

直接参考官网记录开发过程

1-空工程初始化环境

mkdir my_project
cd my_project
python -m venv .venv

2-激活环境

# Windows
source .venv/Scripts/activate
# Mac
source .venv/bin/activate

3-添加依赖

对应的依赖是在激活的环境中

# 1-安装MCP和Openai-agents
pip install uv httpx mcp openai-agents

4-创建.env文件

添加对应的环境变量

BASE_URL=https://api.deepseek.com/v1
API_KEY=sk-XXX
MODEL_NAME=deepseek-chat

5-创建

直接参考MCP官网的PythonClient样例:https://github.com/openai/openai-agents-python/blob/main/examples/model_providers/custom_example_provider.py

补充说明:MCP官网的PythonClient样例,没有进行环境变量的加载,在代码中我们使用dotenv进行记载(
代码基本上就是复制过来了,只做了少量的修改)

import asyncio
import osfrom agents import (Agent,Model,ModelProvider,OpenAIChatCompletionsModel,RunConfig,Runner,function_tool,set_tracing_disabled,
)
from dotenv import load_dotenv
from openai import AsyncOpenAI# 环境变量加载相关# 加载.env文件
load_dotenv()
# 从.env文件中获取BASE_URL、API_KEY、MODEL_NAME信息
BASE_URL = os.getenv("BASE_URL") or ""
API_KEY = os.getenv("API_KEY") or ""
MODEL_NAME = os.getenv("MODEL_NAME") or ""if not BASE_URL or not API_KEY or not MODEL_NAME:raise ValueError("请通过环境变量或代码设置EXAMPLE_BASE_URL、EXAMPLE_API_KEY、EXAMPLE_MODEL_NAME。")"""
本例使用自定义提供程序调用Runner.run()的部分,并直接调用OpenAI进行其他操作。
步骤:1. 创建一个自定义的OpenAI客户端。
2. 创建一个使用自定义客户端的ModelProvider。
3. 在调用Runner.run()时使用ModelProvider,仅在我们想使用自定义LLM提供程序时。
注意,在本例中,我们假设您没有从platform.openai.com获取API密钥,因此禁用了跟踪。
如果您有API密钥,您可以选择设置`OPENAI_API_KEY`环境变量或调用set_tracing_export_api_key()来设置跟踪特定的密钥。
"""
# ①创建一个自定义的OpenAI客户端-Client
client = AsyncOpenAI(base_url=BASE_URL, api_key=API_KEY)
set_tracing_disabled(disabled=True)# ②创建一个使用自定义客户端的-ModelProvider
class DeepSeekModelProvider(ModelProvider):def get_model(self, model_name: str | None) -> Model:return OpenAIChatCompletionsModel(model=model_name or MODEL_NAME, openai_client=client)# ③实例化ModelProvider对象
CUSTOM_MODEL_PROVIDER = DeepSeekModelProvider()# ④定义一个工具函数
@function_tool
def get_weather(city: str):print(f"[debug] getting weather for {city}")return f"The weather in {city} is sunny."async def main():# ⑤创建一个Agentagent = Agent(name="Assistant", instructions="你只能用中文进行回复", tools=[get_weather])# ⑥获取Agent对话的结果result = await Runner.run(agent,"给我讲一个笑话吧!",run_config=RunConfig(model_provider=CUSTOM_MODEL_PROVIDER),)print(result.final_output)# ⑦获取Agent对话的结果-没有配置RunConfig使用的是OpenAI的默认模型# result = await Runner.run(#     agent,#     "给我讲一个笑话吧!",# )# print(result.final_output)if __name__ == "__main__":asyncio.run(main())

http://www.xdnf.cn/news/5516.html

相关文章:

  • MySQL索引原理以及SQL优化(二)
  • 【更新至2023年】1999-2023年上市公司人工智能词频统计数据(年报词频统计)
  • RGA模块讲解
  • 低代码平台与 AI 融合:从 Activity 流程到智能 ITSM 的落地实践
  • 单片机-STM32部分:12、I2C
  • 2003-2022年 地级市-政府干预程度指标数据-社科数据
  • springboot3整合SpringSecurity实现登录校验与权限认证
  • c++ 类的语法2
  • Windows使用虚拟环境执行sh脚本
  • 【深度学习】将本地工程上传到Colab运行的方法
  • (十一)Java面向对象进阶:深入理解抽象类、接口与内部类
  • 如何使用依赖注入来实现依赖倒置原则?
  • RK35XX 环境搭建
  • [ERTS2012] 航天器星载软件形式化模型驱动研发 —— 对 Scade 语言本身的影响
  • python打卡训练营打卡记录day22
  • Java SSM 框架(详解)
  • Java 多态:原理与实例深度剖析
  • 【Java学习日记36】:javabeen学生系统
  • [思维模式-30]:《本质思考力》-30- 计划经济与市场经济结合中的“自顶向下”与“自底向上”思维模式。
  • PXE安装Ubuntu系统
  • 免安装 + 快速响应Photoshop CS6 精简版低配置电脑修图
  • 计算机网络笔记(二十二)——4.4网际控制报文协议ICMP
  • # Anaconda3 常用命令
  • Grafana v12.0 引入了多项新功能和改进
  • KAG:通过知识增强生成提升专业领域的大型语言模型(四)
  • 【LeetCode Hot100 | 每日刷题】排序数组
  • 内存泄露,如何判断是资源泄露还是堆栈泄露?
  • Telnetlib 库完全指南
  • MySQL 索引与事务详解
  • 巧用promise.race实现nrm镜像源切换----nbsl