natapp + FastAPI + Dify 自定义工具接入实战教程

作者:燐妤
来源:CSDN

目录

natapp + FastAPI + Dify 自定义工具接入实战教程

前言

准备工作

第一步:使用 FastAPI 编写天气接口

weather_api.py

这里有两个非常关键的地方

1、必须开启 CORS

2、host 必须写 0.0.0.0

启动服务

第二步:使用 natapp 暴露本地服务

1、注册 natapp

2、下载客户端

3、获取公网地址

测试公网访问

natapp 免费版的坑

第三步:在 Dify 中创建自定义工具

OpenAPI Schema 示例

Dify 创建步骤

1、点击「工具」

2、创建工具

3、保存

一个很容易踩的坑

第四步:Agent 调用工具测试

1、新建 Agent

2、添加工具

3、写系统提示词

4、开始测试

常见问题

项目结构

总结


前言

最近在折腾 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 文件就能跑。


总结

整个流程其实并不复杂。

核心就三步:

  1. FastAPI 写接口
  2. natapp 暴露公网
  3. Dify 接 OpenAPI

真正容易卡人的地方其实只有两个:

  • CORS
  • natapp 域名变化

其它部分基本都比较顺。

等你把这套流程跑通后,其实已经不仅仅是“天气查询”了。

你完全可以继续扩展:

  • 公司内部系统
  • CRM
  • 数据接口
  • 自动化流程
  • 数据分析接口

都可以接入 Dify。

本质上:

就是把 AI 和你的业务系统连接起来。

后面能玩的东西会非常多。


每日励志文案:

半山腰总是最拥挤的,你得去山顶看看

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐