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技能扩展的核心概念。传统的聊天是“一问一答”,基于模型已有的知识。而工具调用模式是“一问一查一答”:

  1. 你提问:“北京今天气温多少?”
  2. nanobot分析:识别出这是一个“查询天气”的意图。
  3. nanobot决策:决定调用“天气查询工具”。
  4. 工具执行:nanobot自动以北京为参数,调用一个真实的天气API(比如和风天气、OpenWeatherMap)。
  5. 获取结果:API返回真实的天气数据(如“晴,25°C”)。
  6. 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_tooltool_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代理最强大的地方。你可以引导模型组合使用多个工具。 例如,用户问:“帮我看看北京天气,如果下雨就提醒我带伞,并用英文告诉我。” 模型可以这样规划:

  1. 调用get_weather(“北京”)
  2. 分析返回结果,发现下雨。
  3. 生成中文提醒:“北京今天有雨,请带伞。”
  4. 调用translate_text(“北京今天有雨,请带伞。”, from_lang=“zh”, to_lang=“en”)
  5. 将英文结果返回给用户。

虽然当前的nanobot可能还不支持这种复杂的多步规划(这属于更高级的Agent框架能力),但了解这个方向很重要。

5. 总结:你的专属智能助理,由你定义

通过上面的步骤,我们已经成功地将nanobot从一个单纯的对话模型,升级为一个具备实时信息获取能力的实用助手。回顾一下我们做的事情:

  1. 理解核心:nanobot是一个轻量级AI代理框架,其强大之处在于“工具调用”能力。
  2. 技能扩展三步法
    • 找API:为你想添加的功能(天气、股票、翻译)寻找可靠的数据源。
    • 写工具:用Python编写一个函数,调用该API,并处理好输入输出和错误。
    • 注册上线:将工具函数按照nanobot的规范进行封装和注册,然后测试。
  3. 持续优化:通过优化工具描述、加强错误处理,让你的助手更聪明、更可靠。

这个过程就像给一个聪明的孩子配备不同的工具书和仪器。nanobot提供了“大脑”和“手脚”的协调机制,而你,作为开发者,负责为它打造各种各样的“工具”。除了本文提到的,你还可以为它添加:

  • 日历管理:连接Google Calendar API。
  • 邮件发送:通过SMTP协议。
  • 知识库问答:连接你自己的文档库(结合RAG技术)。
  • 智能家居控制:连接Home Assistant等平台。

nanobot的魅力正在于此:它用极简的代码,为你打开了构建个性化AI助理的大门。你不需要从头发明轮子,只需要专注于为你和你的用户创造最有价值的“技能”。现在,就动手试试,打造一个真正懂你、能帮你的数字伙伴吧。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐