Learn-Claude-Code学习s02:TOOLs使用介绍

Linux下OpenFire+Spark即时通讯环境搭建全攻略(含证书错误解决方案) 本文提供了一份详尽的Linux环境下OpenFire服务器与Spark客户端即时通讯系统的搭建与配置全攻略。内容涵盖从环境规划、服务端部署、数据库配置到客户端连接的全流程,并重点解决了Spark连接时常见的证书验证错误问题,为企业构建私有化、高可用的XMPP通讯平台提供了实战指导。 阅读详情

Learn-Claude-Code学习s02:TOOLs使用介绍

在构建一个能真正“动手干活”的AI编程助手的路上,我们面临一个核心挑战:大模型本身只能输出文本,如何让它安全地执行命令、读写文件、修改代码?今天我们就来深入剖析一个实用的Tool Use(工具调用)框架,看看如何让大模型安全、可控地操作文件系统和执行Shell命令。

本文聚焦三块内容:

  1. 如何声明工具 —— 让模型知道它能用哪些“技能”。
  2. 如何调用工具 —— 模型发出调用请求,我们解析并执行。
  3. 安全设计 —— 路径越界拦截、危险命令过滤,为什么不能瞎信模型。
  4. Bash vs 专用读写工具 —— 明明一行cat或echo就能读写文件,为什么还要单独造轮子?

本文基于一个真实的agent_loop实现,支持bash、read_file、write_file、edit_file四个工具。代码见文末附录。


一、工具声明:让模型知道“我会什么”

要让大模型调用工具,必须按照OpenAI/百炼等平台要求的格式,描述每一个工具的名称、描述、参数结构。我们的工具列表定义如下:

TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "bash",
            "description": "执行一个 shell 命令。",
            "parameters": {
                "type": "object",
                "properties": {"command": {"type": "string"}},
                "required": ["command"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "read_file",
            "description": "读取文件内容",
            "parameters": {
                "type": "object",
                "properties": {"path": {"type": "string"}, "limit": {"type": "integer"}},
                "required": ["path"]
            }
        }
    },
    # ... write_file, edit_file 类似
]

关键点:

  • type: "function" 是必需的,表示这是一个函数调用类型的工具。
  • function.name 是模型选择工具时使用的标识符。
  • function.description 告诉模型这个工具的用途,好的描述能大幅提升调用准确率。
  • parameters 使用JSON Schema格式,模型会根据这个结构生成参数JSON。
  • required 数组标记必填参数。

这个声明就相当于一份“API文档”,模型在决定调用工具时,会按照这个格式填充参数。


二、工具调用:从模型输出到实际执行

2.1 调度的核心:agent_loop

主循环中,我们向模型发送对话历史(加上系统提示词),并附上tools=TOOLS。模型返回的response.choices[0].message有两种情况:

  • 直接文本回复(finish_reason != "tool_calls")
  • 要求调用工具(finish_reason == "tool_calls")

当需要调用工具时,response_content.tool_calls 包含一个或多个调用请求。每个请求的结构如下:

{
    "id": "call_xxx",
    "function": {
        "name": "bash",
        "arguments": '{"command":"ls -la"}'
    }
}

注意:arguments 是字符串形式的JSON,必须用json.loads解析。

2.2 处理器映射表

我们预先建立了一个字典,把工具名映射到实际的Python函数:

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"]),
}

在循环中解析出function_name和function_args后,直接调用handler(**function_args)即可。最后将执行结果以role: "tool"的消息追加到对话历史中,返回给模型,让模型看到工具输出后继续决策。

2.3 完整调用流程示意图

用户输入 → agent_loop → 模型思考 → 返回 tool_calls
           ↓
    解析每个tool_call
           ↓
    从TOOL_HANDLERS取函数
           ↓
    执行 (如 run_bash, run_read)
           ↓
    返回结果 → 追加为tool消息 → 循环(模型继续处理)

三、安全设计:不要让模型“乱跑”

赋予模型执行Shell命令和读写文件的能力,如同给一个孩子一把刀。我们必须加装多重安全护栏。

3.1 路径越界防护 —— safe_path

run_read、run_write、run_edit都调用了safe_path函数:

def safe_path(p: str) -> Path:
    path = (WORKDIR / p).resolve()
    if not path.is_relative_to(WORKDIR):
        raise ValueError("路径越界")
    return path

为什么需要它?

  • 用户可能输入../../../etc/passwd,或者模型被诱导读取系统敏感文件。
  • resolve()会解析所有..和符号链接,得到绝对路径。
  • is_relative_to(WORKDIR)检查最终路径是否仍在工作目录内。越界则直接抛出异常,拒绝操作。

这种做法叫沙箱路径,确保Agent只能访问当前项目目录,无法窥探或破坏系统文件。

3.2 危险命令过滤 —— run_bash

在run_bash中,我们对命令字符串做简单的黑名单检查:

dangerous = ["rm -rf /", "sudo", "shutdown", "reboot"]
if any(d in command for d in dangerous):
    return "警告:检测到危险操作,已拦截执行。"

这是一个基础的防御,更完善的做法还包括:

  • 禁止管道符|、重定向>、命令替换`等,防止注入。
  • 限制命令超时(已做120秒超时)。
  • 使用白名单机制,只允许ls、cat、grep等安全命令。

注意:这个黑名单很容易被绕过(比如rm -rf /* 或 sudu拼写错误),生产环境建议使用shlex.quote或容器隔离。

3.3 执行超时

r = subprocess.run(..., timeout=120)

避免模型发起一个死循环或长时间运行的命令阻塞整个Agent。


四、为什么有了Bash还要专门的文件读写工具?

你可能会问:“Bash命令可以cat file.txt读取文件,也可以echo 'content' > file.txt写入,为什么还要单独实现read_file、write_file?”

这是一个很好的设计问题。以下是几个核心理由:

考虑维度Bash方式专用工具方式
安全性命令注入风险高,模型可能构造cat /etc/passwd; rm -rf /参数是纯路径和内容,不解析Shell元字符,天然防注入
控制粒度无法限制读取行数,大文件会把整个内容塞进上下文limit参数可以只读前N行,避免撑爆token上限
输出稳定性依赖系统的cat、echo,不同环境行为可能有差异纯Python实现,跨平台一致
返回结构混有stdout/stderr,错误信息不规则统一返回字符串,错误可捕获为异常信息
编辑能力需要sed、awk等复杂命令,模型容易写错edit_file做文本替换,原子操作,清晰可靠
审计与日志难以精确知道模型读写了哪个文件可以在工具层精细记录每一次文件操作

一个典型场景:模型想修改一个配置文件里的某一行。用Bash可能需要组合sed -i 's/old/new/g',其中正则表达式稍有错误就可能破坏整个文件。而edit_file工具只需要提供old_text和new_text,我们在底层安全地完成替换(只替换第一次出现),模型完全不必关心正则细节。

兼顾两者 —— 保留Bash作为“瑞士军刀”

为什么不干脆废除Bash?因为总有些任务是专用工具覆盖不了的:

  • 批量删除特定文件(rm logs/*.tmp)
  • 复杂的管道过滤(ps aux | grep python | wc -l)
  • 调用系统工具(git status, docker ps)

所以最佳实践是:提供有限的、安全的Bash能力,同时给高频文件操作提供专用工具。


五、总结与扩展思考

通过今天的学习,我们掌握了:

  1. 工具声明:按照OpenAI的Function Calling规范定义工具的元数据。
  2. 工具调用:解析模型返回的tool_calls,映射到具体函数,返回结果再喂回模型。
  3. 安全保障:路径沙箱、危险命令过滤、超时控制,缺一不可。
  4. 职责拆分:专用读写工具弥补Bash的不足,实现更安全、更可控的文件操作。

*附:完整代码文件

import os
import subprocess
import json
from openai import OpenAI
from dotenv import load_dotenv
from pathlib import Path

load_dotenv(override=True)

client = OpenAI(
    api_key= os.getenv("DASHSCOPE_API_KEY"),
    base_url = os.getenv("BASE_URL")
)
MODEL = os.getenv("LLM_MODEL")
SYSTEM = f"你是一个高效的编程助手。你当前的工作目录是:{os.getcwd()}。请使用 bash 命令来完成用户交付的任务。请直接行动,不要做多余的解释。"

WORKDIR = Path.cwd()

def safe_path(p:str) -> Path:
    path = (WORKDIR / p).resolve()
    if not path.is_relative_to(WORKDIR):
        raise ValueError(f"路径越界")
    return path

# 定义执行函数
def run_bash(command: str) -> str:
    # 基础安全过滤:拦截危险命令
    dangerous = ["rm -rf /", "sudo", "shutdown", "reboot"]
    if any(d in command for d in dangerous):
        return "警告:检测到危险操作,已拦截执行。"

    try:
        # 执行命令,设置 120 秒超时防止卡死
        r = subprocess.run(command, shell=True, cwd=os.getcwd(),
                           capture_output=True, text=True, timeout=120)
        out = (r.stdout + r.stderr).strip()
        return out if out else "(执行成功,无回显输出)"
    except Exception as e:
        return f"运行时错误: {str(e)}"

def run_read(path:str, limit:int = None) ->str:
    try:
        text = safe_path(path).read_text()
        lines = text.splitlines()#按行切分为列表
        if limit and limit < len(lines):#限制模型的读取行数为limit,并告诉模型还有多少行没读
            lines = lines[:limit] + [f"...({len(lines) - limit}行未显示)"]
        return "\n".join(lines)
    except Exception as e:
        return f"Error: {e}"


def run_write(path:str, content: str)->str:
    try:
        fp = safe_path(path)
        fp.parent.mkdir(parents=True, exist_ok=True)
        fp.write_text(content)
        return f"在位置{path}写入了{len(content)}字节"
    except Exception as e:
        return f"Error: {e}"

def run_edit(path: str, old_text:str, new_text:str) -> str:
    try:
        fp = safe_path(path)
        content = fp.read_text()
        if old_text not in  content:
            return f"出错了,编辑文本不存在于{path}"
        fp.write_text(content.replace(old_text,new_text, 1))
        return f"Edited {path}"
    except Exception as e:
        return f"Error: {e}"

# 修复:必须增加 "type": "function" 层级
TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "bash",
            "description": "执行一个 shell 命令。",
            "parameters": {
                "type": "object",
                "properties": {"command": {"type": "string"}},
                "required": ["command"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "read_file",
            "description": "读取文件内容",
            "parameters": {
                "type": "object",
                "properties": {"path": {"type": "string"}, "limit": {"type": "integer"}},
                "required": ["path"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "write_file",
            "description": "向文件写入内容",
            "parameters": {
                "type": "object",
                "properties": {"path": {"type": "string"}, "content": {"type": "string"}},
                "required": ["path", "content"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "edit_file",
            "description": "替换文件中的特定文本",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {"type": "string"},
                    "old_text": {"type": "string"},
                    "new_text": {"type": "string"}
                },
                "required": ["path", "old_text", "new_text"]
            }
        }
    }
]

TOOL_HANDLERS = {
    "bash": lambda **kw: run_bash(kw["command"]),#从名为 kw 的字典中,取出键(Key)为 "command" 的值。
    "read_file": lambda **kw: run_read(kw["path"],kw["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"]),

}

def agent_loop(messages:list):
    while True:
        response = client.chat.completions.create(
            model=MODEL,
            messages=[{"role": "system", "content": SYSTEM}] + messages,
            tools=TOOLS,
            max_tokens=8000,
            extra_body={"enable_thinking": False}
        )
        response_content = response.choices[0].message
        messages.append(response_content)
        if response.choices[0].finish_reason != "tool_calls":
            # 如果模型不是为了调用工具,说明任务完成或直接回复了文字
            return response_content.content

            # 3. 处理工具调用
        tool_calls = response_content.tool_calls
        for tool_call in tool_calls:
            function_name = tool_call.function.name
            # 百炼返回的参数是字符串形式的 JSON,需要解析
            import json
            function_args = json.loads(tool_call.function.arguments)

            # 从调度映射表中查找并执行
            handler = TOOL_HANDLERS.get(function_name)
            output = handler(**function_args) if handler else f"未知的工具: {function_name}"

            print(f"\n> 执行工具 [{function_name}]:")
            print(f"  参数: {function_args}")
            print(f"  输出: {str(output)[:200]}...")

            # 4. 将工具执行结果添加到消息序列中
            messages.append({
                "role": "tool",
                "tool_call_id": tool_call.id,
                "name": function_name,
                "content": str(output),
            })

if __name__ == "__main__":
    history = []
    while True:
        try:
            query = input("\033[36ms02 >> \033[0m")
        except (EOFError, KeyboardInterrupt):
            break
        if query.strip().lower() in ("q", "exit", ""):
            break
        history.append({"role": "user", "content": query})
        agent_loop(history)

        print()
LeRobot X-VLA:首个适用于任意机器人、任意任务的软提示机器人基础模型 X-VLA是一种基于软提示的视觉-语言-动作模型,通过可学习嵌入向量编码不同机器人配置,实现跨平台统一控制。该框架采用两阶段训练:先在29万次多平台任务中学习通用策略,再通过微调少量参数(仅1%)适配新机器人。实验表明,0.9B参数的X-VLA在6个仿真和3个真实平台上表现优异,如LIBERO任务达93%成功率,布料折叠任务100%完成。其核心创新是将硬件差异视为"任务",用软提示引导Transformer处理异构数据,为机器人基础模型提供可扩展方案。 阅读详情

相关推荐

基于h5端的视频录制和回溯功能的实现

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

发果叁 3191

Claude Code 高级指南与故障排除

基本结构});// 注册工具},},// 执行查询});// 启动服务器提高效率:并行操作、智能代理、快速搜索提升质量:LSP 集成、代码审查、测试自动化扩展能力:MCP 服务器、自定义工具保证安全:最佳实践、权限管理、输入验证持续学习实践不同的工作流探索新的代理和工具分享经验和技巧关注 Claude Code 更新获取帮助运行查看官方文档参与社区讨论相关文档Claude Code 核心功能概览Claude Code 命令与操作详解。

u011265143的专栏 1305

Jetson Orin NX 单目标跟踪算法实战

本文对比了NanoTrack和MixFormerV2两种目标跟踪算法在Jetson Orin NX边缘设备上的实际表现。通过天空小目标跟踪场景测试发现,NanoTrack虽然表征能力较弱,但具有目标身份一致性强、失败模式可控、计算负担小等优势,更适合作为边缘端默认算法。MixFormerV2则适用于高速运动等特定场景。实验数据显示NanoTrack在Orin NX上可达200FPS,远高于MixFormerV2的38-120FPS。建议先采用NanoTrack构建稳定系统,后续再评估复杂算法的适用性。

karmueo46的博客 625

sim错误处理与调试:AI工作流故障排查完全指南

你是否曾遭遇AI工作流执行到关键节点突然崩溃?是否面对晦涩的错误日志无从下手?是否在调试循环逻辑时耗费数小时却找不到根本原因?本文将系统梳理sim框架的错误处理机制,提供从日志分析到断点调试的全流程解决方案,帮助开发者将故障排查时间缩短80%。 读完本文你将掌握: - 3大类12种常见错误的识别方法 - 日志系统的核心查询技巧 - 调试模式的高级使用策略 - 分布式追踪在工作流中的实战应用 - ...

gitblog_01149的博客 917

OpenStack 2018 年终盘点

目录 文章目录目录前言OpenStack 一年来的成长NovaCinderNeutronIronicCyborgOctaviaKollaMagnumZunKuryr从 OpenStack 到 OpenInfra 前言 这是最好的时代,也是最坏的时代 — — 查尔斯·约翰·赫芬姆·狄更斯《双城记》 年关将至,闲暇之余,回顾我与 OpenStack 的 2018。 NOTE:仅作为个人见解,与公...

烟云的计算 3596

SAP Group Reporting入门指南(1)--开篇及系统环境搭建

文章介绍了SAP GR的发展历程、与BPC的对比优势,数据收集的多种方式(实时同步、外部导入等)以及合并整体流程,并推出《SAP Group Reporting入门指南》专栏。

bflyfish的博客 282

Claude Code 源码分析(三):Tool 系统的抽象设计 —— 40+ 个工具背后的统一架构

本文分析了Claude Code 2.1.88版本中工具系统的设计实现。核心内容包括:1)Tool接口定义了工具的完整生命周期,包含身份识别、执行控制、安全权限、Schema定义、UI渲染和Prompt生成等6个功能域;2)buildTool工厂函数采用fail-closed原则设置默认值,确保新增工具时的安全性;3)通过类型系统保证工具实现的正确性。文章重点剖析了工具系统的统一抽象设计及其在可扩展性和安全性方面的考量。

宇擎智脑科技的博客 753

微信小程序推广策略,打开小程序领域流量大门

本文旨在为小程序开发者、运营者和企业主提供一套完整的微信小程序推广策略体系,帮助他们在竞争激烈的小程序生态中获得更多流量和用户。内容涵盖从0到1的冷启动策略,到成熟期的增长技巧。本文将首先介绍小程序的基础推广设置,然后深入探讨各种流量获取渠道,接着分析数据驱动的优化方法,最后展望未来发展趋势。小程序:无需下载安装即可使用的应用,运行在微信生态内:独立访客数:页面浏览量转化率:完成目标行为的用户比例留存率:用户在一定时间后仍活跃的比例自然流量获取:通过优化搜索、完善资料等方式获得基础流量社交裂变。

小程序开发 1031

linq.js常见问题解答:新手必知的15个易错点

linq.js作为一款强大的JavaScript LINQ库,让开发者能够像操作数据库一样处理数组和集合数据。但新手在使用过程中常因对API理解不深而踩坑。本文整理了15个最常见的易错点及解决方案,帮助你快速掌握linq.js的正确用法。 ## 1. 忘记链式调用的返回值处理 **错误示例**:直接修改集合却未接收返回值 ```javascript var list = [1, 2, 3]; l

gitblog_00835的博客 368

UCIE Specification详解(十一)

Electrical Layer (2D and 2.5D)以及UCIe-3D

Crazzy_M的博客 1194

关于YOLOv8的面试题(持续更新中...)

本章将计划更新关于YOLOv8中可能会成为面试题的关键技术点,计划持续更新,可能想到合适的问题我就会整理下更新到本博客中。

ice 4167

Claude Code(七)Tools 工具系统内核剖析

如果 Claude 没有工具,它只能做一件事:输出文本。它能思考、能分析、能给建议,但不能行动。用户: 帮我修复 src/api.js 中的 bugClaude:(思考)这应该是一个 JavaScript 文件...(继续思考)用户想让我修复 bug...(输出文本)"您好,请提供 src/api.js 的内容,我来帮您分析问题。工具让 Claude 从顾问变成了执行者。Claude Code 的工作循环——Agentic Loop 可以分为三个阶段,根据任务需要灵活切换。

w_t_y_y的博客 278

【异常】Coze/扣子 Workflow 调用报 4200 错误深度解析

Coze API 的。

奶爸的编程之路,也就一周冷个三天 301

Learn-Claude-Code学习s02:TOOLs使用介绍与TaoToken统一API配置实战

Learn-Claude-Code s02 聚焦 Claude TOOLs 工具调用实战:先声明 Function Calling 元数据,再用 agent_loop 调度 bash、read_file 等工具,并配 safe_path 路径沙箱与危险命令过滤。文中给出 settings.json 与 config.toml 可复制骨架,通过 TaoToken 统一 API 通道完成配置与连通性验证,官网 https://taotoken.net/?utm_source=taotoken_aicg_blog

weixin_42611177的博客 7

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Learn-Claude-Code | 笔记 | Tools & Execution | s01 The Agent Loop | s02 Tools

Learn-Claude-Code | 笔记 | Tools & Execution | s01 The Agent Loop | s02 Tools

周同学的博客 1210

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

learn-claude-code 全拆解:从 0 到 1 构建 Claude Code 的 Agent Harness

这篇文章解读开源项目 learn-claude-code。它把 Claude Code 拆成「模型 + Harness」结构,用 17 个章节逐步搭出一套完整的 Agent 运行框架。整个仓库是纯 Python 实现,每章一个可直接运行的 code.py。读完后你能亲手写出自己的 Agent 循环、工具分发与上下文压缩。 ## 它解决了什么问题 「Agent」这个词被用滥了。不少框架本质是把

gitblog_01176的博客 1113

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Learn Claude Code:从 0 到 1 构建 Nano 级 Claude Code 风格 Agent Harness 的完整工程指南

本文基于 `learn-claude-code` 仓库中文主文档([README-zh.md](https://link.gitcode.com/i/77b1d604e09e7b320e27521cdcc51a98))整理并扩展,系统讲解该项目"模型 + Harness"的核心理念、最小 agent loop 的完整实现,以及从 s01 到 s17 共 17 个递进式课程如何逐个叠加 harnes

gitblog_00045的博客 1607

learn-claude-code s02:工具分发(Tool Use)——多加一个工具,只加一行 Handler

本篇基于 learn-claude-code 教程的 s02 章节([s02_tool_use/README.zh.md](https://link.gitcode.com/i/4c1ac2fc8aded6028a03bea55ec6df35))展开。s02 解决的问题是:s01 的 Agent 只有 bash 一个工具,模型每读一个文件都得自己拼 `cat`、每改一处都得拼 `sed`,既浪费

gitblog_00212的博客 421

learn-claude-code s02 Tool Use 工具分发:用一行查表映射扩展模型能力

本文基于 learn-claude-code 课程的 s02 章节([docs/ja/s02-tool-use.md](https://link.gitcode.com/i/34e0c0c10ae6aadfc579477916daeae2))撰写。核心主题只有一个:在 s01 的 Agent 循环不改动一行代码的前提下,用「工具定义(TOOLS)+ 处理函数注册(TOOL_HANDLERS 查表分

gitblog_00596的博客 224

learn-claude-code s02 深度解析:Agent 从单一 Bash 扩展到 5 个工具的 TOOL_HANDLERS 分派机制全源码剖析

本篇基于 learn-claude-code 仓库的 s02 Tool Use 章节文档([s02_tool_use/README.ja.md](https://link.gitcode.com/i/a528895425125f4b28843edb1f18b7b8))及其配套实现([s02_tool_use/code.py](https://link.gitcode.com/i/1d3d07468

gitblog_01036的博客 364

learn claude code S02 工具使用详解笔记:从 dispatch map 到路径沙箱的配置骨架

learn claude code S02 用 dispatch map 字典路由 read_file、write_file、edit_file 与 bash 四个工具,配合 safe_path 路径沙箱把 agent 活动锁死在 workspace 内,agent loop 循环零改动。文中给出可复制的 settings.json 与 config.toml 骨架,并附验证沙箱边界的测试脚本。接入 TaoToken 官网 https://taotoken.net/?utm_source=taotoken_

WhiteTiger78的博客 133

learn claude code学习记录-S01

这篇文章介绍了基于Claude Code的Agent循环实现方法。关键点包括:1)工具调用结果需写入消息历史作为下一轮输入;2)实现了一个最小Agent循环框架,处理多工具调用(通过tool_use_id区分);3)工具结果以user角色返回。作者通过read/write工具验证流程,观察到模型能发起多个工具调用(Bash/Glob),但存在路径大小写、文件类型不匹配等问题。最终模型成功完成文件读写操作,系统还实现了权限管控功能。整个过程展示了从工具调用、错误处理到最终任务完成的完整Agent工作流程。

Orange_sparkle的博客 566

learn-claude-code:从零手写 Agent 外壳

上周同事问我:为什么我调了一周的"agent",模型一输出"建议执行 ls"就停了?我说,因为你的代码里没有那个 while 循环——工具结果必须喂回模型,它才会继续推理。想自己手写一套 Claude Code 式的 Agent 外壳,可以看 learn-claude-code,一个 0 到 1 教你用 Python 逐章写出来的教程。 ## 它跟别人到底差在哪 大多数流程编排框架一上来就在解

gitblog_00545的博客 770

【CC】Learn Claude Code s01-s04学习笔记

learn cc的s01-s04部分

638

learn-claude-code:s11 自主 Agent 实战——空闲轮询、任务自领取与身份再注入的实现拆解

本文基于 learn-claude-code 课程的 s11 章节([docs/ja/s11-autonomous-agents.md](https://link.gitcode.com/i/d18fced27cda6c17f54ac874a96b5a70)),讲解如何让多 Agent 团队中的成员从"等指令干活"升级为"自己找活干"。读完你可以掌握三件事:WORK/IDLE 双阶段队友循环的设计

gitblog_00592的博客 1075

learn-claude-code s05 详解:TodoWrite 工具与 Reminder 机制如何赋予 Coding Agent 规划能力

在 [learn-claude-code](https://link.gitcode.com/i/8ad1a140eddb7d8ece14905da787bf3a) 课程化构建 Claude Code 式 agent harness 的 17 章中,s05 专门解决一个普遍问题:长任务执行到一半时,Agent 会被中间结果吸走注意力而"跑偏"。本章通过一个带状态的 `todo_write` 工具、

gitblog_00581的博客 1006
上一篇: Learn-Claude-Code学习s01:深入浅出 ReAct 模式与 Python 实现
下一篇: langchain快速入门:基本组件介绍和快速搭建服务
BrianLBR
博客等级 码龄6年 33粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值