natapp + FastAPI + Dify 自定义工具接入实战教程
作者:燐妤
来源:CSDN
目录
natapp + FastAPI + Dify 自定义工具接入实战教程
前言
最近在折腾 Dify 的 Agent 功能,发现它最有意思的地方,其实不是聊天,而是“调用工具”。
简单来说,你可以把自己写的接口接入进去,让 AI 自动帮你查数据、调接口、执行操作。
刚开始我以为会很复杂,结果实际跑下来发现:
- FastAPI 用来写接口
- natapp 用来做内网穿透
- Dify 用来接工具
三者组合起来,其实非常丝滑。
于是我拿一个“天气查询接口”做了完整测试,从本地开发到 Dify 成功调用,全部跑通。
这篇文章我尽量不用官方文档那种偏硬的写法,而是按照真实开发流程来讲,把踩过的坑也一起写进去,方便大家少绕路。
准备工作
开始之前,需要准备下面几个东西:
| 环境 | 说明 |
|---|---|
| Python | 建议 3.8+ |
| FastAPI | 用来写接口 |
| Uvicorn | FastAPI 运行服务 |
| natapp | 内网穿透 |
| Dify | Agent 平台 |
先检查 Python:
python --version
安装 FastAPI:
pip install fastapi uvicorn
后面天气接口还会用到 requests:
pip install requests
第一步:使用 FastAPI 编写天气接口
这里我使用的是天气 API 的免费接口。
FastAPI 最大的优点就是:
- 上手快
- 自动生成 OpenAPI
- 天然适合接 Dify
下面直接上代码。
weather_api.py
from fastapi import FastAPI, Query
from fastapi.middleware.cors import CORSMiddleware
import requests
import uvicorn
app = FastAPI(
title="天气查询 API",
version="1.0.0",
description="用于 Dify 调用的天气接口",
servers=[{"url": "你的公网地址", "description": "natapp 公网服务"}]
)
# 允许跨域
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/weather")
def get_weather(city: str = Query(..., description="城市名称")):
params = {
"appid": "你的appid",
"appsecret": "你的appsecret",
"version": "day",
"city": city
}
resp = requests.get("http://tianqiapi.com/xxxx", params=params)
data = resp.json()
return {
"city": data.get("city"),
"weather": data.get("wea"),
"temperature": data.get("tem"),
"humidity": data.get("humidity"),
"wind": data.get("win_speed")
}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
这里有两个非常关键的地方
1、必须开启 CORS
很多人第一次接 Dify 工具时都会卡这里。
如果不加:
CORSMiddleware
后面 Dify 调接口时会直接跨域报错。
2、host 必须写 0.0.0.0
不要写:
127.0.0.1
否则 natapp 无法转发。
正确写法:
host="0.0.0.0"
启动服务
运行:
python weather_api.py
浏览器访问:
http://localhost:8000/weather?city=北京
如果能看到 JSON 返回,说明接口没问题。
第二步:使用 natapp 暴露本地服务
Dify 无法直接访问你本地电脑。
所以必须做“内网穿透”。
这里我用的是 natapp。
原因很简单:
- 配置少
- 上手快
- 免费版够测试
1、注册 natapp
进入官网:
https://natapp.cn
注册账号。
然后创建免费隧道。
2、下载客户端
下载后解压。
打开命令行。
执行:
natapp -authtoken=你的authtoken
看到:
Tunnel Status Online
说明成功了。
3、获取公网地址
你会看到类似:
http://xxxxx.natappfree.cc
这个地址非常重要。
后面:
- OpenAPI
- Dify
- servers
都要用它。
测试公网访问
浏览器打开:
http://你的natapp域名/weather?city=上海
如果能正常返回数据,说明穿透成功。
natapp 免费版的坑
免费版域名会变。
基本三天左右就换一次。
所以如果你发现:
- 昨天还能调用
- 今天突然 404
先别怀疑代码。
大概率是域名变了。
第三步:在 Dify 中创建自定义工具
FastAPI 会自动生成 OpenAPI 文档。
访问:
http://你的natapp域名/openapi.json
就能看到。
OpenAPI Schema 示例
下面是一个精简后的版本:
{
"openapi": "3.1.0",
"info": {
"title": "天气查询 API",
"version": "1.0.0",
"description": "用于 Dify 调用的天气接口"
},
"servers": [
{
"url": "http://你的natapp域名",
"description": "natapp 公网服务"
}
],
"paths": {
"/weather": {
"get": {
"summary": "获取天气",
"description": "输入城市名,返回天气信息",
"operationId": "get_weather",
"parameters": [
{
"name": "city",
"in": "query",
"required": true,
"schema": {
"type": "string"
},
"description": "城市名称"
}
],
"responses": {
"200": {
"description": "成功返回天气信息"
}
}
}
}
}
}
Dify 创建步骤
进入 Dify 后:
1、点击「工具」
进入:
工具 -> 自定义工具
2、创建工具
填写:
- 工具名称
- Schema
- 鉴权方式
鉴权直接选:
无
即可。
3、保存
如果能看到:
get_weather
说明创建成功。
一个很容易踩的坑
很多人会漏掉:
servers
结果 Dify 一直报错。
一定要写:
"servers": [
{
"url": "你的公网地址"
}
]
第四步:Agent 调用工具测试
工具创建完成后。
接下来让 Agent 使用它。
1、新建 Agent
创建:
Agent 类型应用
2、添加工具
在工具栏中勾选:
天气查询
3、写系统提示词
这一部分非常重要。
很多时候不是接口有问题,而是提示词没写明白。
我这里的提示词很简单:
你是一个智能天气助手。
当用户询问天气时,
请使用 get_weather 工具查询。
city 参数需要传入城市名称。
查询后,用友好的语气回复用户。
其实不用写太复杂。
核心就几点:
- 用哪个工具
- 参数叫什么
- 什么情况下调用
说清楚就够了。
4、开始测试
输入:
上海今天天气怎么样?
正常情况下。
Agent 会自动调用:
get_weather
然后返回:
上海今天小雨,18℃,
东北风3级,湿度85%。
常见问题
| 问题 | 原因 | 解决方法 |
|---|---|---|
| Dify 创建失败 | 没写 servers | 补充 servers |
| 工具列表为空 | paths 写错 | 检查 operationId |
| 调用返回 404 | natapp 域名变化 | 更新公网地址 |
| Agent 不调用工具 | 提示词不明确 | 重写提示词 |
| 浏览器跨域错误 | 没开启 CORS | 添加 CORSMiddleware |
| 本地正常,公网失败 | host 写成 127.0.0.1 | 改成 0.0.0.0 |
项目结构
fastapi-dify-demo/
│
├── weather_api.py
├── openapi.json
└── README.md
结构很简单。
基本一个 py 文件就能跑。
总结
整个流程其实并不复杂。
核心就三步:
- FastAPI 写接口
- natapp 暴露公网
- Dify 接 OpenAPI
真正容易卡人的地方其实只有两个:
- CORS
- natapp 域名变化
其它部分基本都比较顺。
等你把这套流程跑通后,其实已经不仅仅是“天气查询”了。
你完全可以继续扩展:
- 公司内部系统
- CRM
- 数据接口
- 自动化流程
- 数据分析接口
都可以接入 Dify。
本质上:
就是把 AI 和你的业务系统连接起来。
后面能玩的东西会非常多。
每日励志文案:
半山腰总是最拥挤的,你得去山顶看看

810

被折叠的 条评论
为什么被折叠?



