跳转至

注册第一个 Python 工具

本页将把普通 Python 函数注册为工具,让 Agent 查询课程信息。

预计时间:10 分钟。

前置条件

1. 编写代码

新建 first_tool.py,写入:

import asyncio
import os

import bumblehive


COURSES = {
    "Python 入门": "周一 10:00,教学楼 A101",
}


async def main() -> None:
    config = bumblehive.RuntimeArguments(
        model=os.environ["BUMBLEHIVE_MODEL"],
        api_key=os.environ["BUMBLEHIVE_API_KEY"],
        base_url=os.environ["BUMBLEHIVE_BASE_URL"],
        agent_instructions=("回答课程问题前,必须先调用 get_course_info 工具。"),
        tool_names=["get_course_info"],
    )
    async with bumblehive.from_config(config) as runtime:
        @runtime.tools.tool(
            name="get_course_info",
            description="查询指定课程的上课时间和地点。",
        )
        def get_course_info(course: str) -> str:
            return COURSES.get(course, f"没有找到课程:{course}")

        result = await runtime.run("Python 入门课在什么时候、什么地点上课?")

    if result.error is not None:
        print(f"运行失败 [{result.error.code}]:{result.error.message}")
        return

    print(f"工具:{', '.join(result.tools_used) or '未调用工具'}")
    print(f"回答:{result.final_content}")


if __name__ == "__main__":
    asyncio.run(main())

2. 运行

python first_tool.py

预期输出类似:

工具:get_course_info
回答:Python 入门课在周一 10:00,于教学楼 A101 上课。

回答的具体文字可能不同,但“工具”一行应该包含 get_course_info

工具是什么?

模型本身不知道你项目中的实时数据。工具可以理解为你提供给模型的“可调用函数”。

这个示例的过程是:

用户询问课程 → 模型选择 get_course_info → Runtime 执行函数 → 模型根据结果回答

代码说明

  • @runtime.tools.tool(...) 把下面的 Python 函数注册为工具。
  • name 指定模型看到的工具名称。
  • 参数类型 course: str 会帮助 Bumblehive 生成工具参数说明。
  • description 告诉模型这个工具能做什么。
  • tool_names=["get_course_info"] 表示只向模型开放这个工具。
  • result.tools_used 记录本次成功执行过的工具名称。

工具可以是同步函数,也可以使用 async def 定义异步函数。

工具会执行真实代码

只注册当前 Agent 确实需要的工具。自定义工具如果可以访问文件、数据库或网络,应在函数内部做好权限和参数检查。

常见问题

Agent 没有调用工具

确认 agent_instructions 明确要求先调用工具,并检查 tool_names 中的名称与装饰器中的 name 完全一致。

提示 Unknown tools

工具必须在调用 runtime.run() 之前通过 @runtime.tools.tool(...) 注册,并且名称必须出现在 tool_names 中。

工具收到了错误参数

为函数参数添加准确的 Python 类型,并让 description 清楚说明输入要求。Bumblehive 会在执行前校验参数。

下一步

选择接下来的学习路径