快速理解
SimpleLLMFunc 的工具系统让 LLM 可以调用外部函数和 API,执行计算、查询、文件操作或多模态处理。框架会把 Python 函数自动转换成模型可理解的工具描述。类型推断
自动从函数签名中提取参数类型和说明。
Docstring 解析
支持从 docstring 中抽取参数描述。
JSON Schema 生成
自动生成符合 Function Calling 的工具描述。
多返回类型
支持基本类型、结构化数据和多模态返回。
两种创建方式
支持装饰器方式和继承方式。
长文本截断
超长文本结果可自动落盘并截断回传。
支持的数据类型(参数类型)
支持的参数类型
支持的参数类型
- 基本类型:
str、int、float、bool - 容器类型:
List[T]、Dict[K, V] - 多模态类型:
Text、ImgPath、ImgUrl - 多模态列表:
List[Text]、List[ImgPath]、List[ImgUrl] - Pydantic 模型
- 带默认值的可选参数
- 复杂嵌套结构
参数类型限制
参数类型限制
LLM 提供给工具的参数本质上仍然是 JSON 支持的数据类型,因此
Tuple、Set 这类容器通常不适合作为工具参数。支持的返回类型
工具函数可以返回多种数据格式,框架会自动处理并传递给 LLM。基本返回类型
基本返回类型
str- JSON 可序列化对象:
dict、list、int、float、bool、None - Pydantic 模型
多模态返回类型
多模态返回类型
ImgUrlImgPathTuple[str, ImgUrl]Tuple[str, ImgPath]
返回类型示例
返回类型处理机制
框架如何处理返回值
框架如何处理返回值
- 基本类型直接序列化回传
ImgUrl直接作为网络图片使用ImgPath会转换为 base64 data URL- 文本 + 图片会被组合成多模态消息
- 不支持的返回类型会回退为字符串
多模态返回的特殊处理
多模态返回的特殊处理
当工具返回图片或文本+图片组合时,框架会用
assistant + user 的多模态消息对替代标准 tool 消息,因为 OpenAI tool call 消息本身不能直接携带多模态内容。返回类型注意事项
返回类型注意事项
- 本地图片路径必须存在且可读
- 网络图片 URL 应公开可访问
- 组合类型必须是
(str, ImgPath)或(str, ImgUrl) - 避免返回过大的数据结构
长文本截断功能
当工具可能返回非常长的文本结果时,例如代码执行输出或大规模搜索结果,可以启用too_long_to_file 自动处理。
启用方式:
@tool 装饰器要求被装饰的函数本身定义为 async def,以便在异步执行链路中无缝协作。- 仅在工具可能返回大量文本时启用
- 启用后,agent 需要具备文件读取能力,例如
FileToolset或PyRepl - 对于结构化返回值(
dict、list)该功能不会生效
内置工具集
FileToolset(文件工具)
提供安全的文件读取、搜索与编辑能力,并带哈希校验以避免陈旧写入。默认只允许访问工作区内的非隐藏文件。工具列表
工具列表
read_file:读取文件内容,可指定起止行并附带行号grep:在工作区内进行正则搜索,必须提供path_patternsed:按行范围做正则替换,需先read_fileecho_into:覆盖写入整个文件,需先read_file
注意事项
注意事项
- 修改前务必先
read_file grep必须提供path_pattern- 隐藏文件和隐藏目录默认不可访问
使用方法
基本语法
方式一:装饰器方式(推荐)
方式二:继承方式(兼容旧版本)
参数说明
@tool 装饰器参数
@tool 装饰器参数
name:必需,工具名称description:必需,工具简短描述best_practices:可选,工具最佳实践提示prompt_injection_builder:可选,动态注入器too_long_to_file:可选,是否启用长文本截断
函数要求
函数要求
- 建议补全类型标注
- 建议编写详细 docstring,尤其是
Args - 建议显式声明返回类型
工具调用流程
实现方法
核心类结构
Parameter 类
Tool 类
关键实现细节
参数提取机制
系统通过以下步骤提取函数参数信息:- 签名分析: 使用
inspect.signature()获取函数签名 - 类型提示: 使用
get_type_hints()获取类型标注 - 文档解析: 使用正则表达式解析 docstring 中的参数描述
- 默认值处理: 识别可选参数和默认值
类型转换规则
文档字符串解析
系统支持标准的 docstring 格式:兼容写法
装饰器方式示例
继承方式示例
工具使用示例
将 @llm_function 暴露为工具(Agent as a Tool)
当你希望一个上层 agent 把下层 specialist 当成工具调用时,可以把
@tool 叠加在 @llm_function 外层:
- 推荐顺序写成
@tool外层、@llm_function内层。 - 子 agent 推荐使用
@llm_function(enable_event=False),这样它表现为普通asynctool。 @llm_chat返回的是异步生成器;如果一定要把它当工具复用,通常需要先写一个手动 wrapper。- 可运行完整示例见
examples/agent_as_tool_example.py。
高级用法
工具序列化和检查
动态工具创建
工具链组合
返回类型最佳实践
选择合适的返回类型
- 文本输出优先: 如果工具主要产生文本结果,使用
str或结构化的Dict - 结构化数据: 复杂数据使用
Dict或List,便于 LLM 理解和处理 - 多模态内容: 需要展示图片时使用
ImgPath、ImgUrl或组合类型 - 组合输出: 需要同时提供说明和图片时使用
Tuple[str, ImgPath/ImgUrl]
性能优化建议
错误处理模式
多模态类型详细说明
工具系统提供了强大而灵活的扩展机制,让 LLM 能够调用各种外部功能。通过装饰器方式,开发者可以轻松地将现有函数转换为 LLM 可用的工具,而继承方式则提供了更多的自定义控制。系统自动处理类型转换和参数验证,确保工具调用的安全性和准确性。 关键要点总结:
- 支持多种返回类型:基本类型、JSON对象、多模态内容
- 多模态支持:单独图片或文本+图片组合
- 自动类型转换:本地图片转base64,网络图片直接使用URL
- 错误处理:推荐返回结构化的错误信息
- 性能考虑:避免返回过大数据,网络图片使用低细节级别