数据截至 (上游 commit 92c146faa529)
工具系统:定义、注册与安全执行
30 秒导读: 模型只会"说话",本章讲 PraisonAI 怎么给它装上"手脚"——把一个 Python 函数变成模型能点名调用的工具,并让每一次真实调用都穿过一条受控管线(类型纠正、审批、熔断、重试、给外部内容打隔离标记)。MCP 服务器也被当成一批"外部工具"接进这条同样的管线。
本章在货架里的位置:上一章 Agent 单体与 chat 主循环 讲"模型什么时候决定要调工具";本章接手"决定之后,这次调用如何安全落地"。沙箱级隔离执行属于 第 06 章 范畴,本章不展开。
1. 这是什么(零基础也能懂)
一句话定义。 工具(tool)= 一个带名字、带参数说明的函数,模型可以在回话里说"我要调 get_weather(city='东京')",框架负责把这句话真正执行掉,再把结果喂回模型。
解决什么问题 / 给谁用。 大语言模型本身不能查数据库、不能读文件、不能发 HTTP 请求——它只能生成文本。工具系统就是那层"翻译 + 执法":
- 把开发者写的普通函数,翻译成模型看得懂的调用说明(JSON schema)。
- 模型说要调用时,把它给的参数校正、审批、执行,再把返回值安全地送回去。
给谁用:任何想让 agent "干实事"(而不只是聊天)的开发者。
它能做什么。
- 用一个
@tool装饰器把函数变工具,自动从函数签名生成参数 schema 。 - 用注册表统一管理工具、支持第三方插件自动发现。
- 执行时做:参数类型纠正、危险工具审批、故障熔断、失败重试退避、外部内容防注入包裹。
- 把 MCP(Model Context Protocol,一个让 agent 连外部工具服务器的开放协议)服务器整批挂成工具。
用起来什么样。 最小例子——定义一个工具,交给 agent:
# 示意,基于 README 的最小用法
from praisonaiagents import Agent, tool
@tool # 一个装饰器就够
def get_stock_price(company: str) -> str:
"""查询某公司股价。""" # docstring 变成给模型看的描述
return f"{company} 现价 100 USD"
agent = Agent(instructions="你是助手", tools=[get_stock_price])
agent.start("特斯拉股价多少?") # 模型自己决定调 get_stock_price(company="Tesla")
一句话直觉。 把工具系统想成餐厅后厨的"传菜 + 食品安全"制度:模型是点菜的客人(只会说菜名),工具定义是菜单(告诉客人有什么、怎么点),执行管线是后厨流水线(核对订单、检查过敏原、出问题重做),MCP 是外包的中央厨房(不在本店做,但也走同一套上菜流程)。