【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(2)Tool Use (工具使用)

简介: 本章详解如何为AI Agent添加专用工具(如read/write/edit_file),通过dispatch map机制实现“加工具只加handler”,无需改动主循环;引入safe_path路径沙箱提升安全性与鲁棒性,告别bash滥用。配套代码清晰易懂,新手友好。

第二章 Tool Use (工具使用)

s01 > [ s02 ] s03 > s04 > s05 > s06 | s07 > s08 > s09 > s10 > s11 > s12

“本专栏基于开源项目 learn-claude-code 的官方文档。原文档非常硬核,为了方便像我一样的新手小白理解,我对文档进行了逐行精读,并加入了很多中文注释、大白话解释和踩坑记录。希望这套‘咀嚼版’教程能帮你推开 AI Agent 开发的大门。”

项目地址:shareAI-lab/learn-claude-code: Bash is all you need - A nano Claude Code–like agent, built from 0 to 1

"加一个工具, 只加一个 handler" -- 循环不用动, 新工具注册进 dispatch map 就行。

一、问题-Robustness (鲁棒性)Security (安全性)

只有 bash 时, 所有操作都走 shell。如果你的 Agent 只有一个工具 bash,那么无论它想做什么(读取文件、写入文件、修改内容),它必须通过执行 shell 命令来完成。

  • 想读文件?它得执行 cat filename
  • 想写文件?它得执行 echo "content" > filename
  • 想改文件?它得执行 sed 命令。

cat 截断不可预测, sed 遇到特殊字符就崩, 每次 bash 调用都是不受约束的安全面。专用工具 (read_file, write_file) 可以在工具层面做路径沙箱。

关键洞察: 加工具不需要改循环。

二、解决方案

+--------+      +-------+      +------------------+
|  User  | ---> |  LLM  | ---> | Tool Dispatch    |
| prompt |      |       |      | {                |
+--------+      +---+---+      |   bash: run_bash |
                    ^           |   read: run_read |
                    |           |   write: run_wr  |
                    +-----------+   edit: run_edit |
                    tool_result | }                |
                                +------------------+

The dispatch map is a dict: {tool_name: handler_function}.
One lookup replaces any if/elif chain.

1.引入专用工具,替代滥用 Bash

s02 不再让模型什么都用 bash 解决,而是提供了 read_file, write_file, edit_file 这三个专用函数。

2.强制实施路径沙箱 (safe_path)

这是 s02 最重要的安全升级。所有涉及文件操作的专用工具(read, write, edit),在执行前都会先通过 safe_path 函数进行检查。

三、工作原理

  1. 每个工具有一个处理函数。路径沙箱防止逃逸工作区。
def safe_path(p: str) -> Path:
    #解析为绝对路径,并消除 .. 和 .
    path = (WORKDIR / p).resolve() 

    #检查路径是否在工作目录内,防止用户访问非法路径。
    if not path.is_relative_to(WORKDIR): 
        raise ValueError(f"Path escapes workspace: {p}")
    return path

def run_read(path: str, limit: int = None) -> str:
    text = safe_path(path).read_text()
    lines = text.splitlines()
    if limit and limit < len(lines):
        lines = lines[:limit]
    return "\n".join(lines)[:50000]
  1. dispatch map 将工具名映射到处理函数。
TOOL_HANDLERS = {
   
    "bash":       lambda **kw: run_bash(kw["command"]),
    "read_file":  lambda **kw: run_read(kw["path"], kw.get("limit")),
    "write_file": lambda **kw: run_write(kw["path"], kw["content"]),
    "edit_file":  lambda **kw: run_edit(kw["path"], kw["old_text"],
                                        kw["new_text"]),
}

`lambda kw`**:这是一个匿名函数,作为中间层,负责接收大模型发来的任意参数。

  1. 循环中按名称查找处理函数。循环体本身与 s01 完全一致。
for block in response.content:
    if block.type == "tool_use":
        handler = TOOL_HANDLERS.get(block.name)
        output = handler(**block.input) if handler \
            else f"Unknown tool: {block.name}"
        results.append({
   
            "type": "tool_result",
            "tool_use_id": block.id,
            "content": output,
        })

加工具 = 加 handler + 加 schema。循环永远不变。

四、相对 s01 的变更

组件 之前 (s01) 之后 (s02)
Tools 1 (仅 bash) 4 (bash, read, write, edit)
Dispatch 硬编码 bash 调用 TOOL_HANDLERS 字典
路径安全 safe_path() 沙箱
Agent loop 不变 不变

五、试一试

cd learn-claude-code
python agents/s02_tool_use.py

试试这些 prompt (英文 prompt 对 LLM 效果更好, 也可以用中文):

  1. Read the file requirements.txt
  2. Create a file called greet.py with a greet(name) function
  3. Edit greet.py to add a docstring to the function
  4. Read greet.py to verify the edit worked

六、其他

这里的tool其实就是函数调用,但不止于此

在 Claude 的 Messages API 中,tools 参数确实可以包含你定义的函数(客户端工具),也可以包含来自 MCP(Model Context Protocol)服务器的工具,还可以包含由 Anthropic 提供的服务器端工具。

目录
相关文章
|
3月前
|
人工智能 前端开发 Shell
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(1)The Agent Loop (智能体循环)
本专栏精讲AI智能体核心——Agent Loop循环机制,基于开源项目learn-claude-code,用不到50行Python代码实现ReAct范式(思考→行动→观察)。含逐行中文注释、踩坑记录与Bash工具实战,助新手快速入门AI Agent开发。(239字)
1571 2
|
3月前
|
存储 人工智能 Shell
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(3)TodoWrite (待办写入)
本章详解 s03 版本 TodoWrite 机制:通过 `todo` 工具+`TodoManager` 实现显式任务状态管理(pending/in_progress/completed),强制单任务聚焦;并引入“nag 提醒”——连续3轮未更新待办时自动注入提醒,解决大模型长链路任务健忘问题。代码精简可运行。
933 3
|
3月前
|
人工智能 JSON 安全
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(9)Agent Teams (智能体团队)
本章构建持久化智能体团队,解决一次性子智能体和哑后台任务的问题。每个队友拥有独立线程与 LLM 循环,通过 JSONL 文件邮箱实现跨轮通信;TeammateManager 维护团队名册与生命周期,MessageBus 提供线程安全的消息收发,支持并行协作、任务分派与状态同步,为大型项目多 Agent 协同奠定基础。
1331 4
|
3月前
|
存储 JSON 开发工具
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(12)Worktree + Task Isolation (Worktree 任务隔离)
本章引入 Git worktree 实现任务隔离:为每个任务分配独立目录与分支,通过任务 ID 双向绑定控制平面(`.tasks/`)与执行平面(`.worktrees/`),配合事件总线记录全生命周期,解决多任务并发修改冲突问题,提升可恢复性与可观测性。
733 0
|
4月前
|
存储 人工智能 开发工具
Claude Code自动记忆来了!配合老金三层记忆系统全开源!加强Plus!
昨天晚上,老金我照例打开 Claude Code 准备写代码。 随便聊了几句项目架构,Claude突然冒出一句: "Based on our previous discussions, this project uses pnpm and TypeScript strict mode." 老金我愣了一下。 上次提到pnpm是三天前的事了,这中间重启了好几次。 打开 ~/.claude/p
|
3月前
|
人工智能 Shell 开发工具
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(5)Skills (技能加载)
本文介绍AI Agent的技能加载机制,解决系统提示词臃肿问题。通过两层设计:系统提示只保留技能名称(低成本),需要时通过tool_result按需加载完整内容。SkillLoader扫描skills目录下的SKILL.md文件,解析YAML元数据,实现渐进式知识披露,大幅节省token消耗。
2119 1
|
人工智能 JavaScript Java
【SpringAIAlibaba新手村系列】(1)初识 Spring AI Alibaba 框架
本文介绍了SpringAIAlibaba框架的基本概念和使用方法。作为Spring官方AI框架的阿里云实现版本,它简化了Java开发者调用AI模型的过程。文章详细讲解了核心概念如ChatModel、ChatClient,以及阿里云百炼平台的功能。通过HelloWorld项目示例,展示了如何配置APIKey、编写控制层代码,实现普通调用和流式输出两种AI交互方式。重点阐述了SpringAI与SpringAIAlibaba的关系,以及自动配置机制的工作原理,帮助开发者快速上手这一框架。
6051 5
|
3月前
|
人工智能 JSON 监控
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(10)Team Protocols (团队协议)
本章详解AI团队协议设计:通过request-id、状态机(pending→approved/rejected)和内存追踪器,实现关机握手与计划审批两大结构化交互。告别s09的随意消息,构建可追溯、可审批、线程安全的协作范式。
317 7

热门文章

最新文章