共计 2190 个字符,预计需要花费 6 分钟才能阅读完成。
什么是 Dify 的 Skill?
Skill 是 Dify 平台上可复用的 AI 能力模块,相当于一个封装好的智能服务。与普通 API 调用相比,Skill 具有以下特点:

- 语义化交互:能理解自然语言输入而不仅是结构化参数
- 上下文感知:可以维护对话状态和记忆
- 平台集成:直接接入 Dify 的技能市场和对话系统
开发环境准备
- 安装 Python 3.8+(推荐使用 pyenv 或 conda 管理版本)
- 注册 Dify 开发者账号并获取 API 密钥
- 安装必要工具包:
pip install dify-client requests python-dotenv
- 创建.env 文件存放凭证:
DIFY_API_KEY=your_api_key_here
WEATHER_API_KEY=your_weather_api_key
构建天气查询 Skill
1. 定义 Skill 元数据
创建 weather_skill.py 文件,首先声明技能基本信息:
from dify_client.models import SkillMeta
meta = SkillMeta(
name="weather_query",
display_name="天气查询",
description="根据城市名称查询实时天气情况",
version="1.0.0",
inputs=[{"name": "city", "type": "str", "required": True, "description": "城市名称"}
],
outputs={
"temperature": "float",
"conditions": "str",
"humidity": "float"
}
)
2. 对接天气 API
我们使用和风天气的免费 API(需自行注册):
import os
import requests
from dotenv import load_dotenv
load_dotenv()
WEATHER_API_URL = "https://devapi.qweather.com/v7/weather/now"
def get_weather(city: str):
params = {
"location": city,
"key": os.getenv("WEATHER_API_KEY")
}
try:
response = requests.get(WEATHER_API_URL, params=params)
response.raise_for_status()
data = response.json()
return {"temperature": data["now"]["temp"],
"conditions": data["now"]["text"],
"humidity": data["now"]["humidity"]
}
except Exception as e:
raise ValueError(f"天气查询失败: {str(e)}")
3. 完整 Skill 实现
使用 Dify SDK 包装业务逻辑:
from dify_client import DifyClient
from typing import Dict, Any
client = DifyClient(api_key=os.getenv("DIFY_API_KEY"))
@client.skill(meta=meta)
def weather_query(inputs: Dict[str, Any]) -> Dict[str, Any]:
"""
处理天气查询请求
:param inputs: 包含 city 参数的字典
:return: 标准化天气数据
"""city = inputs.get("city")
if not city:
raise ValueError("必须提供 city 参数")
try:
weather_data = get_weather(city)
return {
"success": True,
"data": weather_data,
"message": f"{city}天气查询成功"
}
except Exception as e:
return {
"success": False,
"error": str(e)
}
# 本地测试代码
if __name__ == "__main__":
print(weather_query({"city": "北京"}))
生产环境注意事项
性能优化
- 添加缓存层(如 Redis)存储频繁查询的城市天气
- 对第三方 API 调用设置超时(建议 3 - 5 秒)
- 使用异步 IO 处理并发请求
安全性
- 对输入城市名进行合法性校验(防注入攻击)
- 敏感配置(API 密钥)必须通过环境变量传递
- 启用 HTTPS 传输加密
错误监控
- 记录完整的错误日志(包括堆栈信息)
- 集成 Sentry 等监控工具
- 设置 API 调用失败报警阈值
进阶建议
- 技能组合:尝试将天气技能与出行建议技能链式调用
- 多模态扩展:增加返回天气图标或语音播报功能
- 国际化:支持多语言查询和响应
常见问题
Q: 测试时遇到 ”Invalid API Key” 错误怎么办?
A: 检查.env 文件是否与代码同级目录,确认重启了 IDE 或终端
Q: 如何提高天气查询的准确性?
A: 可以结合经纬度查询,或使用多个天气 API 源进行交叉验证
Q: 技能发布后如何更新?
A: 修改代码后需要递增 version 字段并重新部署
通过这个实例,你应该已经掌握了 Dify Skill 开发的基本流程。接下来可以尝试开发更复杂的技能,比如需要维护会话状态的餐厅推荐系统。记住多查阅官方文档,遇到问题时社区通常会有现成的解决方案。
正文完
