DeepSeek实战--自定义工具
1. 背景
当前已经有很多AI基础平台(比如:扣子、Dify),用户可以快速搭建Agent,那怎样将已有的接口能力给大模型调用呢 ? 今天我们来探索一个,非常高效、快捷的方案:将http接口做成Dify平台的工具,然后编排到Agent中,实现对应业务功能。
2. 环境准备
- python 版本:3.12.5
- LLM: deepseek-chat
- Dify:账号、地址
- 依赖包:pip install fastapi uvicorn psutil
3. 实战
Step1:
通过Lingma写一个查询服务器配置的http接口代码
提示词
帮我用 FastAPI 开发一个HTTP Server,获取当前服务器cpu、内存情况。另外,你还需要把 OpenAPI 相关的配置写好,比如server,operator_id等。
生成代码
from fastapi import FastAPI
import psutil
import platform# 创建 FastAPI 应用实例
app = FastAPI(title="服务器监控API",description="用于获取服务器CPU和内存使用情况的API服务",version="1.0.0",servers=[{"url": "http://localhost:8100", "description": "本地开发服务器"},{"url": "http://<你服务器>:8100", "description": "生产服务器"}]
)# 添加自定义OpenAPI配置
app.openapi_tags = [{"name": "monitor","description": "服务器监控相关接口"}
]@app.get("/system/info", tags=["monitor"], summary="获取系统信息")
async def get_system_info(operator_id: str = None):"""获取服务器CPU和内存使用情况参数:- operator_id: 操作员ID(可选)返回:- cpu_percent: CPU使用率(%)- memory_percent: 内存使用率(%)- memory_total: 总内存(MB)- memory_available: 可用内存(MB)- memory_used: 已使用内存(MB)- platform: 系统平台信息- operator_id: 操作员ID(如果提供)"""# 获取CPU使用率cpu_percent = psutil.cpu_percent(interval=1)# 获取内存信息memory = psutil.virtual_memory()# 构造返回数据system_info = {"cpu_percent": cpu_percent,"memory_percent": memory.percent,"memory_total": round(memory.total / (1024 ** 2), 2),"memory_available": round(memory.available / (1024 ** 2), 2),"memory_used": round(memory.used / (1024 ** 2), 2),"platform": platform.platform(),}# 如果提供了operator_id,则添加到返回结果中if operator_id:system_info["operator_id"] = operator_idreturn system_info@app.get("/health", tags=["monitor"], summary="健康检查")
async def health_check():"""服务健康检查接口"""return {"status": "healthy"}# 如果需要自定义OpenAPI配置,可以重写openapi方法
def custom_openapi():# 修复递归调用问题:保存原始的openapi方法if app.openapi_schema:return app.openapi_schema# 调用FastAPI原始的openapi方法生成schemaopenapi_schema = FastAPI.openapi(app)openapi_schema["info"]["x-logo"] = {"url": "https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png"}app.openapi_schema = openapi_schemareturn app.openapi_schema# 修复递归调用问题:只在openapi_schema为None时才执行自定义逻辑
app.openapi = custom_openapiif __name__ == "__main__":import uvicorn# 开发环境 - 仅本地访问(推荐)# uvicorn.run(app, host="127.0.0.1", port=8100)# 生产环境 - 建议通过反向代理(如nginx)访问,不直接对外# uvicorn.run(app, host="127.0.0.1", port=8100)# 开发/测试环境 - 允许外部访问uvicorn.run(app, host="0.0.0.0", port=8100)
Step2:部署到服务器,验证http服务
启动python应用
在浏览器输入 < 公网 IP>:8100/openapi.json 看看效果
Step3:Dify 自定义工具
1)自定义工具
2)配置Schema
Schema 内容就是上面,在浏览器输入 < 公网 IP>:8100/openapi.json 输出的结果
Step4:搭建Agent调用工具
1)创建一个 Agent 测试一下工具的调用
2)配置Agent
Step5:检阅成果
4. 总结
1)将python代码部署到服务器后,无法通过公网ip访问,折腾了1~2h,结果发现是FastAPI 默认只能在本地访问;
2)在Dify 配置Agent的时候,发现llm节点,调用工具后,无法透传到后续节点,然后将工具节点加载到llm节点前解决;
3)Dify 上下变量引用,无法在llm节点提示词中,引用json格式数据。研究了一下发现是,Dify的bug ,用占位符可以正常引入json格式变量。