Dify系列(五):自定义工具从 Function Call 到自定义 API 接口实战
摘要:本文是Dify学习系列的第五篇,重点讲解工具(Tools)的开发与使用。通过Function Call机制,大语言模型可调用外部API获取实时数据。文章详细演示了:1) Function Call工作原理;2) Dify中插件的分类与使用;3) 使用FastAPI开发天气查询接口;4) 通过natapp实现内网穿透;5) 在Dify创建自定义工具并集成到Agent中。最终实现智能体实时查询天
摘要:本文是 Dify 学习系列的第五篇,聚焦于工具(Tools)的开发与使用。你将学习 Function Call 的核心原理,理解插件在 Dify 中的定位,掌握内置工具的使用方法。重点是通过 natapp 内网穿透工具将本地服务暴露到公网,并结合 FastAPI 开发天气查询接口,最终在 Dify 中创建自定义工具并在 Agent 中调用,让智能体具备实时获取外部信息的能力。
1. 什么是 Function Call
2023 年 6 月 13 日,OpenAI 公布了 Function Call(函数调用)功能。该功能指的是在语言模型中集成外部功能或 API 的调用能力,这意味着模型可以在生成文本的过程中调用外部函数或服务,获取额外的数据或执行特定的任务。
1.1 Function Call 的流程
用户请求 → 大模型判断是否调用函数 → 函数结果返回大模型 → 给出答案
没有 Function Call 时的模式:
- 用户(Client)发请求给我们的服务(Chat Server)
- 我们的服务(Chat Server)给 GPT 提示词
- 重复执行
有 Function Call 时的模式:
- 用户(Client)发请求 prompt 以及 functions 给我们的服务(Chat Server)
- GPT 模型根据用户的 prompt,判断是用普通文本还是函数调用的格式响应我们的服务(Chat Server)
- 如果是函数调用格式,那么 Chat Server 就会执行这个函数,并将结果返回给 GPT
- 模型使用提供的数据,用连贯的文本响应
注意:大模型的 Function Call 不会调用函数,仅返回函数的参数。开发者利用模型输出的参数在应用中调用函数。
2. Dify 中应用 Function Call
在 Dify 中,Function Call 相当于插件。插件是一个工具集,包含一个或多个工具,每个工具对应一个可调用的 API。
核心机制不变:模型通过阅读【插件描述】来决定是否调用该插件。
在 Dify 中,插件分为两类:
- 第三方插件:由 Dify 官方或社区提供的现成工具
- 自定义插件:开发者自己开发的 API 接口
3. 在 Dify 中使用免费插件
3.1 查看工具
在 Dify 主页中打开工具页面:

在 Dify 市场中,可以查找需要的插件工具。需要注意的是,插件分为免费插件和需要申请 API Key 的收费插件。
3.2 使用时间工具
新建空白应用,选择 Agent 类型,然后创建。

点击添加工具,在全部工具下选择时间插件中的“获取当前时间”。

添加成功后,需要设置地区:


3.3 验证结果
现在可以与 Agent 对话,测试时间查询功能:

4. 使用 natapp 暴露本地服务
接下来,我们开发一个自定义的天气查询工具,并通过 natapp 将本地服务暴露到公网。
4.1 天气查询接口
访问 http://tianqiapi.com/index/doc?version=day,该网站提供实况天气接口。需要注册账号,获取自己的 appid 和 appsecret。
4.2 脚本开发
使用 FastAPI 编写后端接口:
import requests
from fastapi import FastAPI
# 内置服务器
import uvicorn
from starlette.middleware.cors import CORSMiddleware
app = FastAPI(
title="天气查询 API",
version="1.0.0",
description="用于 Dify 调用的天气接口",
servers=[
{"url": "你的公网服务", "description": "natapp 公网服务"}
]
)
# 添加 CORS 支持(重要!Dify 调用时需要)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
# 查询所有数据
@app.get("/get_all")
def get_all(city: str):
return requests.get(f"http://v1.yiketianqi.com/free/day?appid=你的appid&appsecret=你的appsecret&unescape=1&city={city}").json()
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=8080)
注意:请将代码中的
你的appid和你的appsecret替换为实际注册获取的值。
4.3 使用 natapp 暴露本地服务
步骤 1:注册 natapp 账号
访问 natapp.cn 注册账号(手机号注册和实名认证)。
步骤 2:获取 authtoken
登录后,在后台找到 我的隧道 → 购买免费隧道 → 记录 authtoken。

购买免费隧道时,需要按照脚本中的端口号填写(本例为 8080):

记录 authtoken:
步骤 3:下载 natapp 客户端
访问 下载页面:

下载 Windows 版本(natapp_windows_amd64_xxx.zip),解压到文件夹,如 C:\natapp\。
步骤 4:启动 natapp
打开命令行,进入 natapp 目录,运行:
cd C:\natapp
natapp -authtoken=你的authtoken
成功后会显示:

步骤 5:公网测试
在浏览器访问:
http://你的natapp域名/get_all?city=北京
应该返回与本地测试相同的 JSON 数据:

5. 在 Dify 中创建自定义工具
5.1 获取 OpenAPI Schema
FastAPI 会自动生成 OpenAPI 文档,访问:
http://你的natapp域名/openapi.json
确保服务器运行的情况下,打开网站,复制完整的 JSON 结构:

5.2 在 Dify 中创建自定义工具
步骤 1:进入工具管理页面
步骤 2:创建新工具

填写以下信息:
| 字段 | 填写内容 |
|---|---|
| 名称 | 天气查询 |
| Schema | 粘贴上面完整的 OpenAPI JSON(确保包含 servers 字段) |
| 鉴权方法 | 选择 无(接口代码中没有进行鉴权) |
步骤 3:保存并验证
点击保存后,下方 可用工具 表格应显示:
如果看到这个列表,说明工具创建成功!
6. 在 Dify Agent 中使用自定义工具
6.1 创建 Agent 应用
进入 Dify 工作室,创建一个新的 Agent 类型应用:

6.2 添加工具和配置提示词
在 Agent 配置页面,找到 工具 区域,点击 添加工具,在列表中找到 天气查询 工具,勾选启用。
在系统提示词中说明工具的使用方式,例如:
你是一个智能天气助手。当用户询问天气时,请使用 get_all 工具查询。
工具参数 city 需要传入城市名称。
查询到结果后,用友好的语气告诉用户天气情况。

6.3 测试
现在可以测试自定义天气工具的效果:

可以看到,当用户询问天气时,Agent 自动调用了我们自定义的天气查询工具,并返回了准确的天气信息。
小结
下一篇将进入 工作流与 Agent 的学习,深入讲解工作流与 Agent 的区别、可视化编排的实现方式,以及如何通过工作流构建复杂的业务逻辑。
更多推荐
所有评论(0)