openclaw技能扩展:nanobot集成天气API、股票查询、翻译等实用工具
openclaw技能扩展:nanobot集成天气API、股票查询、翻译等实用工具
1. 引言:从对话到行动,让AI助手真正“有用”
你用过不少AI聊天机器人吧?它们能回答你的问题,陪你聊天,甚至帮你写代码。但很多时候,你可能会觉得,它们好像还差了点什么——比如,你问它“上海明天天气怎么样?”,它只能告诉你“我无法获取实时信息”;你问它“腾讯的股价现在多少?”,它也只能表示爱莫能助。
这背后的原因很简单:大多数AI模型是“闭门造车”的,它们只知道自己训练时学到的知识,无法主动连接外部的世界,去调用那些能提供实时、动态信息的服务。
今天要聊的 nanobot,就是来解决这个问题的。它不是一个普通的聊天机器人,而是一个“技能扩展”能力极强的AI助手。你可以把它理解为一个“大脑”,而各种API(比如天气、股票、翻译)就是它的“手”和“眼睛”。通过简单的配置,你就能教会它查询天气、查看股价、翻译文本,甚至更多。
这篇文章,我就带你一步步解锁nanobot的这些实用技能,看看这个仅用约4000行代码实现的超轻量级助手,如何从一个“知识渊博的聊天伙伴”,进化成一个“能帮你干实事的生活工作小帮手”。
2. nanobot初印象:轻量但强大的AI代理核心
在深入技能扩展之前,我们先快速了解一下nanobot到底是什么。
2.1 极简设计,核心功能不打折
nanobot的设计哲学非常清晰:用最少的代码,做最核心的事。它的核心是一个AI代理(Agent),能够理解你的意图,并决定调用哪个工具(比如一个函数、一个API)来完成任务。
- 代码量对比:它的灵感来源于OpenClaw,但代码量从后者的数十万行精简到了约4000行,体积缩小了99%。这意味着更快的启动速度、更低的内存占用,以及更清晰的代码结构,方便你理解和二次开发。
- 技术栈:它内置了使用vLLM高效部署的Qwen2.5-4B-Instruct模型。这个模型在指令跟随和工具调用方面表现不错,是nanobot“智能”的来源。交互界面则基于Chainlit,提供了一个清爽的Web聊天界面。
- 多通道支持:除了Web界面,nanobot还支持配置成QQ机器人、微信机器人等,让你能在熟悉的聊天软件里使用它。文章开头提供的教程已经详细展示了如何配置QQ机器人。
简单说,nanobot提供了一个非常干净的“大脑”框架。它负责理解你说的话(意图识别),并管理一堆可用的“工具”(技能)。我们的目标,就是为它装备更多、更好用的工具。
2.2 理解“工具调用”模式
这是nanobot技能扩展的核心概念。传统的聊天是“一问一答”,基于模型已有的知识。而工具调用模式是“一问一查一答”:
- 你提问:“北京今天气温多少?”
- nanobot分析:识别出这是一个“查询天气”的意图。
- nanobot决策:决定调用“天气查询工具”。
- 工具执行:nanobot自动以北京为参数,调用一个真实的天气API(比如和风天气、OpenWeatherMap)。
- 获取结果:API返回真实的天气数据(如“晴,25°C”)。
- nanobot组织回答:将API返回的数据组织成自然语言回复给你:“北京今天天气晴朗,气温大约25摄氏度。”
整个过程对你是透明的,你感觉就是在和一个无所不知的助手聊天。接下来,我们就来亲手为它添加几个最常用的工具。
3. 实战:为nanobot添加三大实用技能
我们选择三个最典型的场景:天气查询、股票信息查询和文本翻译。这些功能几乎每个人都会用到。
3.1 技能一:实时天气查询
让nanobot学会查天气,是让它“连接现实世界”的第一步。
第一步:获取天气API 你需要一个提供天气数据的服务。国内开发者常用的是和风天气,国外则常用OpenWeatherMap。它们都提供免费的额度,足够个人使用。以和风天气为例,注册后获取你的API Key。
第二步:编写天气查询工具函数 在nanobot的项目结构中,工具(Tools)通常定义在特定的目录下(如tools/)。你需要创建一个新的Python文件,例如weather_tool.py。
# tools/weather_tool.py
import requests
import json
from typing import Optional
from pydantic import BaseModel, Field
# 定义工具的输入参数模型
class WeatherQueryInput(BaseModel):
city: str = Field(description="要查询天气的城市名称,例如:北京、Shanghai")
# 工具函数本身
def get_weather(city: str) -> str:
"""
根据城市名称查询实时天气情况。
"""
# 替换成你从和风天气获取的API Key
api_key = "YOUR_HEFENG_API_KEY"
# 1. 先通过城市名获取城市ID(和风天气需要)
geo_url = f"https://geoapi.qweather.com/v2/city/lookup?location={city}&key={api_key}"
try:
geo_resp = requests.get(geo_url, timeout=10)
geo_data = geo_resp.json()
if geo_data['code'] != '200' or not geo_data['location']:
return f"抱歉,未找到城市 '{city}' 的信息。"
city_id = geo_data['location'][0]['id']
city_name = geo_data['location'][0]['name']
# 2. 用城市ID查询实时天气
weather_url = f"https://devapi.qweather.com/v7/weather/now?location={city_id}&key={api_key}"
weather_resp = requests.get(weather_url, timeout=10)
weather_data = weather_resp.json()
if weather_data['code'] != '200':
return "天气查询服务暂时不可用。"
now = weather_data['now']
weather_text = f"{city_name}当前天气:{now['text']},气温{now['temp']}°C,体感温度{now['feelsLike']}°C,湿度{now['humidity']}%,风向{now['windDir']},风力{now['windScale']}级。"
return weather_text
except requests.exceptions.RequestException as e:
return f"网络请求出错:{e}"
except (KeyError, json.JSONDecodeError) as e:
return f"处理天气数据时出错:{e}"
# 这是暴露给nanobot的工具定义
weather_tool = {
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的实时天气信息,包括天气状况、温度、湿度、风力等。",
"parameters": WeatherQueryInput.schema(),
}
}
# 工具函数映射
tool_function_map = {
"get_weather": get_weather
}
第三步:注册工具到nanobot 你需要在nanobot的配置或启动流程中,将这个新工具注册进去。具体方式可能因nanobot版本而异,通常是在主配置文件或初始化代码中加载你的weather_tool模块,并将weather_tool和tool_function_map告知nanobot的代理系统。
第四步:测试 启动nanobot,在Chainlit界面或配置好的QQ机器人里问:“上海今天天气怎么样?” 你应该能看到它调用API并返回真实的天气信息。
3.2 技能二:股票价格查询
对于关注金融市场的朋友,这个功能非常实用。
第一步:选择股票API 免费的股票API有不少限制,但对于简单查询,一些财经数据网站提供的接口或免费的SDK(如akshare)可以满足需求。这里以使用akshare为例(需安装:pip install akshare)。
第二步:编写股票查询工具
# tools/stock_tool.py
import akshare as ak
from typing import Optional
from pydantic import BaseModel, Field
class StockQueryInput(BaseModel):
symbol: str = Field(description="股票代码,支持A股(如sz000001)、港股(如hk00700)、美股(如AAPL)。对于A股,需加上交易所前缀(sh或sz)。")
def get_stock_price(symbol: str) -> str:
"""
查询指定股票代码的实时价格或最新行情。
"""
try:
# 处理A股代码(akshare需要‘股票代码’格式,如‘000001’)
if symbol.lower().startswith(('sh', 'sz')):
# 去除交易所前缀
code = symbol[2:]
market = "sz" if symbol.lower().startswith('sz') else "sh"
# 使用akshare的`stock_zh_a_spot_em`接口
df = ak.stock_zh_a_spot_em()
stock_info = df[df['代码'] == code]
if not stock_info.empty:
name = stock_info.iloc[0]['名称']
price = stock_info.iloc[0]['最新价']
change = stock_info.iloc[0]['涨跌幅']
return f"{name}({symbol}) 最新价:{price}元,涨跌幅:{change}%"
else:
return f"未找到A股股票代码 {symbol} 对应的信息。"
# 此处可以扩展港股、美股的逻辑,需要调用其他接口
else:
# 示例:简单返回,实际需对接其他API
return f"股票代码 {symbol} 的查询功能(非A股)正在完善中,目前主要支持A股(如sz000001)。"
except Exception as e:
return f"查询股票信息时发生错误:{e}"
stock_tool = {
"type": "function",
"function": {
"name": "get_stock_price",
"description": "查询股票的最新交易价格和涨跌幅。支持A股(格式如sz000001)、港股、美股代码。",
"parameters": StockQueryInput.schema(),
}
}
tool_function_map = {
"get_stock_price": get_stock_price
}
第三步:注册并测试 同样注册工具后,你可以问:“腾讯控股的股价多少?”(需使用港股代码,如hk00700,具体取决于你的API支持)或“茅台股票(sh600519)现在什么价?”。
3.3 技能三:多语言文本翻译
翻译是另一个高频需求。我们可以利用免费的翻译API,如百度翻译开放平台或腾讯云翻译。
第一步:获取翻译API密钥 以百度翻译为例,注册开发者并创建通用翻译服务,获得App ID和密钥。
第二步:编写翻译工具
# tools/translation_tool.py
import hashlib
import random
import requests
import json
from pydantic import BaseModel, Field
from typing import Optional
class TranslationInput(BaseModel):
text: str = Field(description="需要翻译的文本内容")
from_lang: str = Field(default="auto", description="源语言代码,例如:zh(中文)、en(英文)、ja(日文)。‘auto’表示自动检测。")
to_lang: str = Field(description="目标语言代码,例如:en(英文)、zh(中文)、jp(日文)。")
def translate_text(text: str, from_lang: str = "auto", to_lang: str = "en") -> str:
"""
将文本从一种语言翻译到另一种语言。
"""
# 你的百度翻译API信息
appid = "YOUR_BAIDU_APP_ID"
secret_key = "YOUR_BAIDU_SECRET_KEY"
salt = str(random.randint(32768, 65536))
sign_str = appid + text + salt + secret_key
sign = hashlib.md5(sign_str.encode()).hexdigest()
url = "https://fanyi-api.baidu.com/api/trans/vip/translate"
params = {
'q': text,
'from': from_lang,
'to': to_lang,
'appid': appid,
'salt': salt,
'sign': sign
}
try:
response = requests.get(url, params=params, timeout=10)
result = response.json()
if 'trans_result' in result:
translated_text = result['trans_result'][0]['dst']
return translated_text
else:
return f"翻译失败:{result.get('error_msg', '未知错误')}"
except Exception as e:
return f"请求翻译API时出错:{e}"
translation_tool = {
"type": "function",
"function": {
"name": "translate_text",
"description": "将文本从一种语言翻译成另一种语言。支持中文、英文、日文等多种语言。",
"parameters": TranslationInput.schema(),
}
}
tool_function_map = {
"translate_text": translate_text
}
第三步:注册并测试 注册后,你可以对nanobot说:“把‘你好,世界’翻译成英文。”或者“Translate ‘How are you?’ into Chinese.”
4. 高级技巧与最佳实践
添加了几个基础工具后,你可能想让它更智能、更稳定。
4.1 让工具描述更精准
工具函数的description字段至关重要。nanobot的AI模型依靠它来决定是否以及何时调用该工具。描述要清晰、具体,包含典型用例。
- 好的描述:“查询指定城市的实时天气信息,包括天气状况、温度、湿度、风力等。”
- 模糊的描述:“获取天气数据。”
4.2 处理复杂的用户查询
用户不会总是规规矩矩地说“查询北京的天气”。他们可能会说:“北京明天是不是要下雨?”或者“上海气温如何?” 这就需要你的工具函数有一定的鲁棒性,或者通过提示工程(Prompt Engineering)让模型更好地理解用户意图。nanobot的底层模型Qwen2.5-4B-Instruct在这方面已经不错,但清晰的工具描述能极大提升匹配准确率。
4.3 错误处理与友好回复
注意看上面代码中的try...except块。网络请求可能失败,API可能返回错误,用户可能输入无效的城市名或股票代码。你的工具函数必须妥善处理这些异常,并返回一个对用户友好的错误信息,而不是让Python异常直接抛给用户。
4.4 组合技能,实现复杂任务
这是AI代理最强大的地方。你可以引导模型组合使用多个工具。 例如,用户问:“帮我看看北京天气,如果下雨就提醒我带伞,并用英文告诉我。” 模型可以这样规划:
- 调用
get_weather(“北京”)。 - 分析返回结果,发现下雨。
- 生成中文提醒:“北京今天有雨,请带伞。”
- 调用
translate_text(“北京今天有雨,请带伞。”, from_lang=“zh”, to_lang=“en”)。 - 将英文结果返回给用户。
虽然当前的nanobot可能还不支持这种复杂的多步规划(这属于更高级的Agent框架能力),但了解这个方向很重要。
5. 总结:你的专属智能助理,由你定义
通过上面的步骤,我们已经成功地将nanobot从一个单纯的对话模型,升级为一个具备实时信息获取能力的实用助手。回顾一下我们做的事情:
- 理解核心:nanobot是一个轻量级AI代理框架,其强大之处在于“工具调用”能力。
- 技能扩展三步法:
- 找API:为你想添加的功能(天气、股票、翻译)寻找可靠的数据源。
- 写工具:用Python编写一个函数,调用该API,并处理好输入输出和错误。
- 注册上线:将工具函数按照nanobot的规范进行封装和注册,然后测试。
- 持续优化:通过优化工具描述、加强错误处理,让你的助手更聪明、更可靠。
这个过程就像给一个聪明的孩子配备不同的工具书和仪器。nanobot提供了“大脑”和“手脚”的协调机制,而你,作为开发者,负责为它打造各种各样的“工具”。除了本文提到的,你还可以为它添加:
- 日历管理:连接Google Calendar API。
- 邮件发送:通过SMTP协议。
- 知识库问答:连接你自己的文档库(结合RAG技术)。
- 智能家居控制:连接Home Assistant等平台。
nanobot的魅力正在于此:它用极简的代码,为你打开了构建个性化AI助理的大门。你不需要从头发明轮子,只需要专注于为你和你的用户创造最有价值的“技能”。现在,就动手试试,打造一个真正懂你、能帮你的数字伙伴吧。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐

所有评论(0)