藏在《Agent Tool Builder》里的Skill

技能描述

使用 fail-closed 设计模式定义 Agent 工具:名称、Schema、安全属性与执行逻辑统一在一个类中,三层执行(验证→权限→调用)自动运行。适用于任何 Python Agent 框架。

Skill.md

Agent Tool Builder

帮助你使用 fail-closed 设计模式定义 Agent 工具: 统一的类将身份标识、Schema、安全属性与执行逻辑放在一起, fail-closed 默认值确保新工具默认安全。

为什么这个模式重要

临时工具定义缺少的三件事:

  1. Fail-closed 默认值is_read_onlyis_destructiveis_concurrency_safe 全部默认为 False。 忘记声明属性的工具会被保守地视为具有写入能力。
  2. 分层执行validate_semantics → check_permissions → _call 是独立方法, 验证逻辑不会混入权限逻辑或业务逻辑。
  3. 自包含定义 — Schema、描述、安全元数据和执行逻辑全部在同一个地方。无需额外的中间件连接。

工作流程

Step 1 — 确定目标框架

询问工具将在哪个 Agent 框架中注册(例如 hermes-agent、LangChain、纯 Python)。 这决定了导入路径和注册方式,但设计原则完全相同。

检查项目的 utils/tools 目录中是否存在 agent_tool_base.py。 如果不存在,从此 skill 目录的 references/agent_tool_base.py 复制过去。 告知用户文件放置位置。

Step 2 — 采访用户

收集以下问题的答案。显示了默认值——对于默认值明显合适的问题可跳过。

命名约定:使用 {service}_{action}_{resource} 格式,带服务前缀,确保同时加载多个工具集时不产生歧义(例如 stock_get_pricestock_list_symbolsstock_search_news)。以动词开头:getlistsearchcreatedelete

字段问题默认值
name工具名(格式:{service}_{action}_{resource},例如 stock_get_price— 必填
description给 LLM 看的一句话描述:精确匹配实际功能,不要模糊扩大,否则 agent 会在不该用的场景误调用— 必填
Schema 字段工具接受哪些参数?(字段名、类型、说明;在 Field description 里加 example)— 必填
is_read_only这个工具只读数据,不写入/不产生副作用吗?False
is_destructive这个工具会做不可逆操作(删除、覆盖)吗?False
is_concurrency_safe这个工具可以和其他工具同时运行吗?False
response_format返回数据是给 agent 程序化处理(JSON)还是给用户展示(Markdown)?视场景,默认 Markdown
是否列表工具如果返回多条记录,要支持分页吗?超过 50 条建议加
_validate_input_semantics有没有需要在执行前拦截的语义问题?(如:参数太短、格式不对)不需要
_check_permissions有没有需要检查的权限?(如:需要某个 env var、调用方身份限制)不需要
_call工具的核心执行逻辑是什么?— 必填

不必一次性提问所有问题——从上下文推断合理答案。 例如,"search" 或 "get" 工具几乎肯定是 is_read_only=True, is_concurrency_safe=True

Step 3 — 生成工具文件

为工具创建一个 .py 文件。遵循以下字段顺序:

1. imports
2. 输入 schema(Pydantic BaseModel)
3. 工具类:
   a. name, description, args_schema      — 身份标识
   b. is_read_only, is_destructive, is_concurrency_safe, max_result_chars  — 安全元数据
   c. _validate_input_semantics()         — 语义验证(不需要时省略)
   d. _check_permissions()               — 权限检查(不需要时省略)
   e. _call()                            — 实际逻辑

建议与项目工具目录结构一致的文件路径。

Step 4 — 展示安全属性摘要

生成后,打印工具安全态势的一行摘要:

StockGetPriceTool: read_only=True  destructive=False  concurrency_safe=True  max_result=10K

输出模板

"""<tool_name>.py — <一行描述>"""

from typing import Optional
from pydantic import BaseModel, Field
from base.utils.agent_tool_base import AgentTool


# ---------------------------------------------------------------------------
# 输入 schema
# ---------------------------------------------------------------------------

class <ToolName>Input(BaseModel):
    <field_name>: <type> = Field(description="<描述>. e.g. '<示例>'")
    # ... 更多字段


# ---------------------------------------------------------------------------
# 工具类
# ---------------------------------------------------------------------------

class <ToolName>Tool(AgentTool):
    # — 身份标识 —
    name: str = "<tool_name>"
    description: str = "<给 LLM 的一句话描述>"
    args_schema = <ToolName>Input

    # — 安全元数据(fail-closed:只有验证后才设为 True)—
    is_read_only: bool = <True/False>
    is_destructive: bool = <True/False>
    is_concurrency_safe: bool = <True/False>
    max_result_chars: int = 10_000

    # — 语义验证(不需要输入约束时省略)—
    def _validate_input_semantics(self, <params>, **kwargs) -> tuple[bool, Optional[str]]:
        if not <condition>:
            return False, "<为什么无效>. 尝试 <具体修复>"
        return True, None

    # — 权限检查(不需要访问控制时省略)—
    def _check_permissions(self, <params>, **kwargs) -> tuple[bool, Optional[str]]:
        if not <allowed>:
            return False, "<为什么拒绝>. <建议下一步>"
        return True, None

    # — 核心逻辑 —
    def _call(self, <params>, **kwargs) -> str:
        # ... 在此实现工具逻辑
        return result

常见安全属性模式

工具类型is_read_onlyis_destructiveis_concurrency_safe
搜索 / 查询TrueFalseTrue
文件读取TrueFalseTrue
文件写入 / 修改FalseFalseFalse
删除操作FalseTrueFalse
API 调用(GET)TrueFalseTrue
API 调用(POST/DELETE)False视情况False
数据库查询TrueFalseTrue
数据库写入FalseFalseFalse

输出设计原则

原子工具——一个工具,一个职责

保持每个工具专注于单一操作。让 agent 组合多个工具来完成复杂任务。功能过多的工具更难被 agent 复用和推理。

响应格式——JSON vs Markdown
格式使用场景
JSONAgent 需要以编程方式解析/过滤结果
Markdown结果将直接展示给用户

不确定时两种都支持——接受可选的 response_format: str = "markdown" 参数并在 _call 中分支。JSON 输出使用 json.dumps(data, ensure_ascii=False, indent=2)

列表工具分页

任何可能返回超过约 50 条记录的工具都应支持分页:

return json.dumps({
    "items": [...],
    "total": 150,
    "count": 20,
    "offset": 0,
    "has_more": True,
    "next_offset": 20,
}, ensure_ascii=False, indent=2)

在输入 schema 中添加 offset: int = Field(default=0, description="分页偏移量")limit: int = Field(default=20, description="最多返回条数")

可操作的错误消息

错误字符串必须引导 agent 找到修复方法——而不仅仅是描述失败:

# 不好:agent 卡住了
return False, "查询太短。"

# 好:agent 确切知道下一步该做什么
return False, "查询太短(得到 2 个字符,需要 >= 3)。请提供更具体的搜索词。"

参考文件

  • references/agent_tool_base.py — 完整的 AgentTool 基类(纯 Python,无框架依赖)

安装使用

安装指令

npx skills add simbajigege/book2skills/skills/agent-tool-builder
OR

直接下载

相关技能

LangChain Tool Builder AI Skill

用 Claude Code 的 fail-closed 设计模式定义 LangChain(Python)工具——name、schema、权限、执行逻辑统一写在一个类里,自动走 validate → permission → call 三层流程,新工具默认安全。

Tool Permission System AI Skill

为 agent 工具设计可配置的分层权限/安全系统:用一条权限流水线统一决定 allow / ask / deny,支持企业 / 用户 / 项目多作用域规则覆盖,并通过 hook 系统扩展。

Query Loop Implementation AI Skill

为 AI 应用实现可上线的 LLM query loop:工具调用、结构化 tool_result 回传、ReAct 循环、最大轮次退出、权限检查、超时、预算控制和 fatal error 终止路径。

Harness Step 1 — 创建 AGENTS.md 与知识库 AI Skill

扫描项目代码库,自动生成 AGENTS.md(agent 工作指南)和完整的 docs/ 知识库骨架,让 Claude Code 在任意新会话中 30 秒内定向,无需重复解释项目结构。

Harness Step 2 — 填充 docs/ 知识库内容 AI Skill

深度阅读项目代码,将隐藏在代码里的架构知识、命名约定、技术决策显式写入 docs/ 各文件,让 agent 在任何 session 都能快速理解项目全貌,而不是靠猜测。

Harness Step 3 — 建立跨 Session 状态管理 AI Skill

创建 init.sh(环境健康检查)、tasks.json(结构化任务队列)和 progress.md(会话日志),解决 Claude Code 每次新对话失忆的问题,让任意 session 在 30 秒内完全恢复工作状态。

折叠记忆实现指南 AI Skill

为长周期 Agent 构建分层折叠记忆的开发者指南——三层架构:近期对话保留原始细节,旧内容压缩为情节摘要,最早内容蒸馏为跨会话永久存活的语义事实。

Compact Memory 实现指南 AI Skill

用 Anthropic API 或 Claude Agent SDK 为 Agent 实现 compact memory 的开发者指南——涵盖触发时机、fork compactor 模式、compact JSON schema 设计。

Compact with Memory AI Skill

正确执行 /compact——生成高质量的对话摘要,完整保留推理过程、决策背景和当前状态,同时在压缩前通过记忆预处理持久化机构知识。

Claude Code 记忆架构实现指南 AI Skill

将混乱的 MEMORY.md 重构为 Claude Code autoDream 内部使用的 2 层记忆架构——保持常驻索引精简、主题文件按需加载,让 autoDream 提取代理正确去重和维护记忆。

Session Dream AI Skill

会话结束时的手动记忆提炼——从当前对话中提取关键决策、失败路径、新发现和当前阻塞,写入 MEMORY.md topic 文件。