当前位置: 首页 > news >正文

工具系统设计:从抽象基类到 JSON Schema 的完整实现

引言

工具调用(Function Calling)是现代 AI Agent 的核心能力。CountBot 实现了一套完整的工具系统,包含 12+ 内置工具,支持参数验证、审计日志和动态注册。本文将深入分析其设计与实现。

工具抽象基类

class Tool(ABC): _TYPE_MAP = { "string": str, "integer": int, "number": (int, float), "boolean": bool, "array": list, "object": dict, } @property @abstractmethod def name(self) -> str: ... @property @abstractmethod def description(self) -> str: ... @property @abstractmethod def parameters(self) -> dict[str, Any]: ... @abstractmethod async def execute(self, **kwargs: Any) -> str: ...

设计要点:

  • 使用@property+@abstractmethod确保子类必须提供元数据
  • parameters返回标准 JSON Schema,与 OpenAI Function Calling 格式完全兼容
  • execute统一返回str,简化结果处理

参数验证系统

Tool 基类内置了递归的 JSON Schema 验证器:

def validate_params(self, params: dict[str, Any]) -> list[str]: schema = self.parameters or {} return self._validate(params, {**schema, "type": "object"}, "") def _validate(self, val, schema, path) -> list[str]: t = schema.get("type") errors = [] # 类型检查 if t in self._TYPE_MAP and not isinstance(val, self._TYPE_MAP[t]): return [f"{label} should be {t}"] # 枚举检查 if "enum" in schema and val not in schema["enum"]: errors.append(f"{label} must be one of {schema['enum']}") # 数值范围 if t in ("integer", "number"): if "minimum" in schema and val < schema["minimum"]: errors.append(f"{label} must be >= {schema['minimum']}") # 递归验证嵌套对象和数组 if t == "object": for k in schema.get("required", []): if k not in val: errors.append(f"missing required {k}") return errors

这个验证器在工具执行前自动运行,防止无效参数导致的运行时错误。

工具注册表

class ToolRegistry: def __init__(self): self._tools: dict[str, Tool] = {} self._audit_enabled: bool = True self._session_id: str | None = None def register(self, tool: Tool) -> None: if tool.name in self._tools: raise ValueError(f"Tool '{tool.name}' is already registered") self._tools[tool.name] = tool def get_definitions(self) -> list[dict]: """获取所有工具的 OpenAI 格式定义""" return [tool.get_definition() for tool in self._tools.values()]

注册表负责:

  • 工具的注册/注销/查询
  • 生成 OpenAI 格式的工具定义列表
  • 管理审计日志和会话上下文

统一注册入口

setup.py提供了统一的工具注册函数:

def register_all_tools(workspace, command_timeout=30, ...) -> ToolRegistry: tools = ToolRegistry() # 1. 文件系统工具 tools.register(ReadFileTool(workspace)) tools.register(WriteFileTool(workspace)) tools.register(EditFileTool(workspace)) tools.register(ListDirTool(workspace)) # 2. Shell 工具 tools.register(ExecTool(workspace, timeout=command_timeout)) # 3. Web 工具(条件注册) if brave_api_key: tools.register(WebSearchTool(api_key=brave_api_key)) tools.register(WebFetchTool()) # 4. 子代理工具(条件注册) if subagent_manager: tools.register(SpawnTool(subagent_manager)) # 5. 记忆工具、截图工具、文件搜索工具... return tools

条件注册模式确保只有配置了必要依赖的工具才会被注册。

内置工具一览

工具名功能
read_fileReadFileTool读取文件内容
write_fileWriteFileTool写入文件
edit_fileEditFileTool编辑文件(按文本或行号)
list_dirListDirTool列出目录内容
execExecTool执行 Shell 命令
web_fetchWebFetchTool抓取网页内容
spawnSpawnTool生成子代理
screenshotScreenshotTool屏幕截图
file_searchFileSearchTool文件内容搜索
memory_write/search/readMemory*Tool记忆读写搜索
send_mediaSendMediaTool发送媒体到渠道

工作空间沙箱

文件系统工具通过WorkspaceValidator实现路径沙箱:

class WorkspaceValidator: def __init__(self, workspace: Path, restrict_to_workspace: bool = True): self._workspace = workspace.resolve() self._restrict = restrict_to_workspace def validate_path(self, path: str) -> Path: resolved = (self._workspace / path).resolve() if self._restrict and not str(resolved).startswith(str(self._workspace)): raise ValueError(f"路径 {path} 超出工作空间范围") return resolved

这确保 AI Agent 无法访问工作空间之外的文件,是安全设计的关键一环。

工具定义生成

每个工具通过get_definition()生成 OpenAI 兼容的函数定义:

def get_definition(self) -> dict[str, Any]: return { "type": "function", "function": { "name": self.name, "description": self.description, "parameters": self.parameters, }, }

这些定义会被传递给 LLM,让 LLM 了解可用的工具及其参数格式。

总结

CountBot 的工具系统展示了如何构建一个类型安全、可扩展、安全可控的 AI 工具框架。通过 ABC 定义接口、JSON Schema 描述参数、注册表管理生命周期、沙箱保障安全,形成了一套完整的工具管理方案。

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!​

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示

​因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

四、AI大模型商业化落地方案

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

http://www.jsqmd.com/news/407696/

相关文章:

  • DeepSeek助力云原生AI降本:容器化部署资源优化与算力利用率提升技巧
  • 用Accelerate库三行代码搞定PyTorch分布式训练:从工程噩梦到生产级范式重构
  • 基于FAST与MATLAB SIMULINK联合仿真模型的非线性风力发电机变桨控制研究:独立与...
  • 2026年GEO优化公司选择攻略,靠谱品牌有哪些 - 工业品牌热点
  • 2026年评价高的医疗器械生产许可证公司推荐:软件医疗器械注册、软件医疗器械生产许可证代办选择指南 - 优质品牌商家
  • AI应用架构师必看:上下文理解增强方案的架构安全
  • PE系统镜像集合
  • 2026年靠谱的销量高的面部精油品牌排名,花悠花上榜 - myqiye
  • 必看!2026年防潮环保板材品牌排名推荐,涵盖性能、质量和环保等 - 睿易优选
  • 2026年上海热门婚纱摄影排名揭晓,欧式海景摄影靠谱品牌有哪些 - 工业品网
  • 爬坡能力强的电动车排行榜2026年度高口碑推荐榜单 - 睿易优选
  • 计算机毕业设计springboot重修课程信息管理系统 基于SpringBoot的高校补考重修一体化管理平台 SpringBoot框架下的学业预警与课程重修智能服务系统
  • 2026年广州等地有实力的中欧铁路物流品牌企业推荐与排名 - 工业品牌热点
  • 计算机毕业设计springboot中医药科普系统 基于Spring Boot的传统医药文化数字化传播平台 Spring Boot框架下中草药知识普及与互动学习系统
  • 必看!2026年高品质电暖桌品牌推荐榜单,满足了消费者的多重需求 - 睿易优选
  • 2026江门跨境物流推荐,易斯拉国际物流靠谱排名靠前 - 工业品网
  • 求推荐2026年北京北大青鸟华巨校区平台 性价比高的有哪些 - 工业品牌热点
  • 鸿蒙应用开发UI基础第七节:DeepLinking与AppLinking应用链接实战——跨应用跳转
  • 2026年福州宁德口碑好的源头定制橱柜厂家推荐,优质生产商全解析 - myqiye
  • 探寻玻璃钢破碎机器多少钱一台,靠谱厂家有哪些? - 工业品网
  • 2026年石家庄口碑好的柴油发电机组实力厂家推荐,专业定制与服务全解析 - 工业设备
  • 技术视角下的2025年海外短剧市场:43亿爆款背后的产品逻辑与增长策略
  • 2026石狮校服按需定制厂家排名,推荐高性价比的品牌 - 工业推荐榜
  • 2026年评价高的空气能热水器安装公司推荐:空气能采暖设备安装厂家、成都空气能热水器厂家、成都空气能采暖设备厂选择指南 - 优质品牌商家
  • 聊聊信泰楼文具品牌影响力,信泰楼荧光笔记号笔好用吗 - myqiye
  • 前程无忧AI产品家族再添新成员,深度赋能HR决策力 - 速递信息
  • 安装安卓模拟器后wsl 闪退问题解决
  • 文具用品厂推荐哪家,汕头新而亮口碑好值得推荐 - 工业设备
  • LeetCode1022:从根到叶的二进制数之和
  • Flutter三方库适配OpenHarmony【apple_product_name】插件注册与生命周期管理