Learn Claude Code:CodeAgent 的最小架构——工具+权限+Hook扩展钩子

Pandas入门教程(二十二):股票数据分析实战——yfinance 获取数据、技术指标与收益率分析 把 Pandas 用在真实场景,才能体会它的价值。本文以茅台股票为例,用 yfinance 获取历史行情,完成缺失值处理与列筛选,绘制收盘价曲线,计算 SMA 移动平均线与 RSI 相对强弱指数,并通过日收益率、累计收益率和波动率完成完整的量化分析流程。 阅读详情

一个 Coding Agent 的最小内核:循环、工具、权限与 Hooks

一个 Coding Agent 的核心循环可能不到几十行,但一个可用系统绝不只是 while True。

这一篇从最底层开始,整理我对 Agent Loop、工具系统、权限系统和 Hooks 的理解。

一、Agent Loop:持续行动的最小闭环

普通大模型调用只有一次输入和一次输出:

用户问题 → 模型回答 → 结束

Agent Loop 则会识别模型是否请求调用工具:

用户问题
→ 模型请求 read_file
→ Harness 读取文件
→ 文件内容返回模型
→ 模型请求 edit_file
→ Harness 修改文件
→ 修改结果返回模型
→ 模型给出最终回答

伪代码如下:

def agent_loop(messages):
    while True:
        response = llm(messages=messages, tools=TOOLS)
        messages.append(to_assistant_message(response))

        tool_calls = extract_tool_calls(response)
        if not tool_calls:
            return extract_text(response)

        tool_results = []
        for call in tool_calls:
            output = execute_tool(call)
            tool_results.append(
                make_tool_result(call.id, output)
            )

        messages.append({
            "role": "user",
            "content": tool_results,
        })

这里最关键的不是循环语法,而是协议闭环:

tool_use_id  <——>  tool_result.tool_use_id

每个工具请求必须有对应结果,否则模型无法知道某次调用是否完成。

生产环境中,是否继续循环最好依据响应里是否真的出现 tool_use 块,而不是只相信某个停止原因字段,因为流式响应的状态可能尚未完全更新。

二、工具系统:工具本质上是带 Schema 的函数

工具通常包含两部分。

第一部分提供给模型:

{
    "name": "read_file",
    "description": "Read a UTF-8 text file from the workspace.",
    "input_schema": {
        "type": "object",
        "properties": {
            "path": {"type": "string"}
        },
        "required": ["path"]
    }
}

第二部分提供给 Harness:

def read_file(path: str) -> str:
    ...

二者通过分发表关联:

TOOL_HANDLERS = {
    "read_file": read_file,
    "write_file": write_file,
    "edit_file": edit_file,
    "bash": run_bash,
}

执行时不需要写大量 if-else:

handler = TOOL_HANDLERS[call.name]
output = handler(**call.input)

这种设计的关键价值是:新增工具不需要修改 Agent Loop。

新增一个工具只需:

  1. 添加工具 Schema;
  2. 注册处理函数。

循环、权限、日志和错误恢复逻辑都可以复用。

三、工具描述会直接影响 Agent 稳定性

工具不仅要能执行,还必须让模型容易理解。

不好的工具描述:

process_file:处理文件

模型不知道它是读取、修改、删除还是转换。

更好的描述:

edit_file:在指定 UTF-8 文本文件中,将唯一出现的 old_text
替换为 new_text;若 old_text 不存在或出现多次则返回错误。

一个工具应尽量具备:

  • 单一职责;
  • 清晰输入;
  • 明确副作用;
  • 可预测输出;
  • 可验证错误;
  • 尽可能少的隐式状态。

工具太粗,模型难以控制;工具太碎,调用次数和上下文成本又会迅速增加。工具粒度需要围绕任务场景权衡。

四、多工具调用不能简单地全部并发

模型可能在一次响应中请求多个工具:

read_file(a.py)
read_file(b.py)
write_file(result.md)

前两个读取可以并发,但写入必须等待读取结果和模型的下一步决策。更一般地说:

  • 只读工具通常可以并发;
  • 修改文件、数据库和外部状态的工具应谨慎串行;
  • 相互有依赖的工具必须保留顺序。

一种较合理的做法是:

按原始顺序扫描调用
→ 将连续的并发安全工具组成 batch
→ batch 内并发
→ batch 之间串行

而不是粗暴地把所有调用扔进线程池。

同时,每个工具在执行前还应经过验证管线:

Schema 验证
→ 工具自己的参数校验
→ PreToolUse Hooks
→ 权限检查
→ 真正执行

五、权限系统:安全不能靠模型自觉

文件工具可以限制在工作目录内,但 bash 天然拥有更大的破坏能力。模型可能因为误解任务而执行:

rm -rf ...
sudo ...
git reset --hard

安全设计应在工具执行前完成,而不是在执行后补救。

可以将权限判断理解为三层闸门:

硬拒绝
→ 规则判断
→ 用户审批

硬拒绝

无论上下文如何都不能执行的行为,例如明显的系统破坏命令。

规则判断

根据工具、路径和参数判断风险,例如:

  • 写入工作区外;
  • 删除文件;
  • 修改受保护配置;
  • 调用带破坏性的 MCP 工具。

用户审批

规则判断认为需要确认时,暂停当前工具调用,让用户明确允许或拒绝。

生产系统的权限结果通常不只有 allow/deny,还可能包含:

allow        直接允许
deny         直接拒绝
ask          请求人工确认
passthrough  当前规则不处理,交给下一层

这里的重要原则是:

用户扩展的 Hook 不应绕过系统级 deny 规则。

即使某个 Hook 总是返回允许,系统的硬拒绝和安全规则仍应继续生效。

六、Hooks:扩展行为,但不污染核心循环

如果每增加一个功能都直接修改循环:

log_tool_call()
check_permission()
notify_user()
auto_git_add()
collect_metrics()

循环很快会变得无法维护。

Hooks 的作用是提供稳定扩展点:

UserPromptSubmit
PreToolUse
PostToolUse
Stop

实现可以非常简单:

HOOKS = {
    "UserPromptSubmit": [],
    "PreToolUse": [],
    "PostToolUse": [],
    "Stop": [],
}

def register_hook(event, callback):
    HOOKS[event].append(callback)

def trigger_hooks(event, *args):
    for callback in HOOKS[event]:
        result = callback(*args)
        if result is not None:
            return result

常见用途如下:

Hook典型用途
UserPromptSubmit输入审计、补充上下文
PreToolUse权限检查、参数修正、日志
PostToolUse结果检查、指标统计
Stop清理资源、生成会话摘要

Hooks 的设计价值不在于“回调函数”本身,而在于让核心循环保持稳定。

七、必须防止 Hook 自己制造死循环

例如 Stop Hook 认为任务还没完成,向模型追加一条消息要求继续。如果下一轮仍触发相同 Stop Hook,就可能无限续跑。

因此需要显式状态:

stop_hook_active = true

当系统已经因为 Stop Hook 重入循环时,后续 Stop Hook 应识别该状态,避免再次触发同一种续跑逻辑。

任何可以“阻止停止”或“重新注入任务”的扩展点,都应配置:

  • 最大触发次数;
  • 重入标志;
  • 超时;
  • 可审计日志。

八、总结

一个最小 Coding Agent 可以由一个循环和一个 Bash 工具构成,但真正可用的内核至少需要:

Agent Loop
+ Tool Registry
+ Input Validation
+ Concurrency Policy
+ Permission Pipeline
+ Hook System

其中最重要的设计原则是:

  1. 循环保持简单稳定;
  2. 能力通过工具扩展;
  3. 安全通过确定性代码实现;
  4. 横切逻辑通过 Hooks 挂载;
  5. 任何自动续跑机制都必须有边界。

理解这一层后,后续的记忆、任务、多 Agent 和 MCP 都只是继续挂载在同一个循环周围。

如何处理动态语言(Python / JS)的“隐形”调用链? 本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。 阅读详情

相关推荐

Playwright: Pytest vs Library vs LibraryAsync:三者如何选?

Python中Playwright的3个Target:Pytest(推荐用于E2E自动化测试,支持报告、并行、重试)、Library(同步脚本,适合爬虫与简单任务,需手动管理浏览器)、LibraryAsync(异步脚本,适用于高并发批量操作)。选择依据:测试项目选Pytest,轻量脚本选Library,高并发场景选LibraryAsync。

SmallBull的博客 209

Learn Claude Code:CodeAgent 最小架构实战——工具、权限与 Hook 扩展钩子

用分发表注册 read_file/write_file/edit_file/bash 四个工具,配 .agent/permissions.json 三层权限闸门与 PreToolUse/Stop 等 Hook 扩展点,再以 TaoToken 统一 Key/API 通道串联调用链。含逐项验证与 401、local proxy failed 等报错排查,官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end

weixin_42602241的博客 9

【在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-硬件连接-开机自启动can-初步调试】

近期开始学习英伟达的工控板,作为新手还是有很多不同懂得地方,但是一部分它用的linux系统,有点像玩树莓派,通过自己一段时间学习can调试,终于可以简单通信了。开始的时候,自己也是什么都不是很懂,从新手一点点摸索过来,现在使用工控机,简单can通信也已经没有问题了,算是有些进步吧。每一步走的都很艰辛,需要反复验证,才能准去无误,开始以为发送没有问题就没事了,没想到发送可以却接受不行,每一步都要反复确认啊,这个问题会持续关注下吧。

qq_22146161的博客 6123

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 421

4.7W防削顶单声道D类音频功率放大器HT6872介绍

HT6872是一款低EMI,防削顶失真,单声道免滤波D类音频功率放大器。在6.5V电源,10%THD+N,4Ω负载条件下,输出4.71W功率,在各类音频终端应用中维持高效率并提供AB类放大器的性能。

weichen_78的博客 4700

FreeRTOS笔记(十五)FreeRTOS总结

文章目录01 - 裸机和FreeRTOS区别1.1 - 裸机1.2 - FreeRTOS1.3 - 区别02 - 对FreeRTOS的感受03 - 推荐 上一文链接:FreeRTOS笔记(十四)[简] 软件定时器、事件组、任务通知 01 - 裸机和FreeRTOS区别   学完FreeRTOS,应该要自己总结一下FreeRTOS和裸机的区别,宏观上说,FreeRTOS是一个运行在裸机上的微内核,...

单眼皮根号三的博客 4114

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 239

Jlink除了调试还能干啥?用JFlash SPI给W25Q64烧录固件的5个实用技巧

本文深入探讨了Jlink的隐藏功能,特别是通过JFlash SPI高效烧录W25Q64的5个进阶技巧。从硬件连接优化到批量处理脚本,再到数据安全验证,这些技巧能显著提升烧录速度和稳定性,适用于量产环境。文章还提供了详细的参数配置和脚本示例,帮助工程师充分发挥Jlink的潜力。

weixin_29164843的博客 409

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 427

AFE芯片做什么用的?AFE(Analog Front End) 模拟前端

AFE采样精度的影响因素非常多,需要综合考虑各种因素,并根据实际应用场景来选择合适的参数和方法。通过减少噪声、提高采样频率、调节放大器增益、降低电源噪声、优化传输线路、进行温度补偿、选择合适的ADC分辨率、根据信号类型选择合适的AFE参数、进行器件匹配和校准等方法,可以提高AFE的采样精度,从而更好地满足各种应用需求。版权声明:本文为优快云博主「czf.Forver」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

学海无涯的专栏 4万+

RK3588 Android12 添加HDMI和喇叭声音通道切换选项

rk3588 android12系统默认接hdmi out时,声音会切换到hdmi out输出,主板声卡喇叭输出会没有声音输出。现在添加一个选项设置hdmi out时,声音可以保持主板声卡喇叭输出。

Android系统开发笔记 4169

10分钟完成第一个Python小游戏

第一个项目不用找复杂的,‌直接选「猜数字小游戏」对应的教程‌就好——几乎所有入门教程都会讲这个项目,资料最多、遇到问题随便搜就能找到解决方法,不会卡壳,30分钟肯定能做完,非常容易建立信心。‌教程链接‌:直接搜标题👉 ‌《Python零基础入门项目:30分钟写完猜数字游戏》‌(优先选黑马程序员、鱼C-小甲鱼这两个UP主的版本,播放量都是百万级,口碑稳定)‌教程地址‌:打开菜鸟教程官网→找到「Python 实例」板块,直接在线写代码运行。全程不跳步,30分钟就能做完,做完能直接运行玩,成就感拉满。

mF44Job8l的博客 64

第4-4课:状态压缩与动态规划

什么是状态压缩 动态规划问题中重要的一环就是确定状态的定义,在大多数情况下,状态中所包含的信息并不多,比如线性规划问题的状态一般表示为 d[i,j](i 表示状态的位置,j 表示状态的阶段),算法实现时可用二维数组保存计算过程中的状态。但是也有一些问题,它的状态中包含的信息很多,比如它的状态可能是一个集合中各个元素的情况,或者是像铺瓷砖问题这样,是某一行的覆盖状态。如果沿用简单的状态表示方法,则可...

oRbIt 的专栏 700

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 269

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 163

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

我用 200 行代码写了个“代码屎山检测器“,扫完公司的老项目后我沉默了

这个工具不能帮你把屎山铲平,但至少能让你知道自己面对的是多大的山,也能在代码评审时用数据说话——“这个 PR 把圈复杂度从 12 推到了 18,能不能拆一下?毕竟,不能量化的东西,就没法改进。

xixiaoyunya的博客 251

魔塔社区微调训练Qwen2-1.5B-Instruct模型并烧录到‌RK3568开发板教程

本文基于Ubuntu 22.04 + CUDA 13.0.3环境,使用LLaMA-Factory框架对Qwen2-1.5B-Instruct模型进行LoRA微调,训练儿童故事生成专用模型。通过配置qwen模板、制作alpaca格式数据集、执行sft训练并合并LoRA权重,最终将模型转换为GGUF格式,并量化为Q4_K_M以适配RK3568嵌入式平台。全程支持国产镜像加速下载与显存优化,实现高效轻量化部署。

浅清秋慕夏的博客 188

【回眸】DeepSeek V4.1 Flash 快速上手与实战

本文介绍如何高效本地部署开源大模型,通过现代化工具链实现分钟级环境搭建。聚焦显存优化、一键安装、代码调用与多轮对话实现,解决“显存不足”“连接超时”等痛点,提供参数调优与结构化输出技巧,助力开发者在离线场景下快速构建稳定、高效的本地推理系统。

啤酒鸭的物联网开发记录博客 228

智叟云集-手机证据抓取系统的工程结构与应用入口

本文系统阐述手机证据抓取系统的工程结构与应用入口,涵盖四大层面:工程目录划分(Android、Python服务、Web页面、测试与构建工具);Android组件通过Manifest声明可启动页面,主界面由MainActivity管理;Python服务通过run.py解析参数并启动FastAPI应用,支持远程访问;浏览器页面采用HTML/CSS/JS分离架构,静态资源通过路径关联,实现动态交互。各模块分工明确,协同构建可运行的采集系统。

2301_77178996的博客 237

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 487

利用python中matplotlib.pyplot库绘制图

plt.plot(x,y) # x,y是每个点的坐标,plot()把每个点按顺序画折线。plt.subplots(2,2)表示绘制2*2的子图布局,axs[0,0]表示在第0行第0列绘制子图...coordinates_i[:,0]表示获取每一行(每一个spot)的第0列(x坐标)coordinates_i[:,1]表示获取每一行(每一个spot)的第0列(y坐标)plot.subplot(2,2,1) 表示子图布局是2*2的,开始绘制第一个。也可以导入数据绘制。可以设置color属性,设置颜色。

qq_46147236的博客 102

【随笔】KV缓存量化:省下的显存,要付出多少数值误差

用可运行量化器解释位宽、比例信息、分组和离群值的关系,核算KV缓存实际载荷,并给出Transformers配置与容量、延迟、质量验收方法。

code2cat的博客 467

【每天一个 Python 小案例29】Python 实现商品购物车

本篇实现一个购物车:商品目录、加入商品、修改数量、移除商品、查看小计、计算满减与 VIP 折扣、结算扣库存。核心设计是"目录与购物车分离"——目录存商品主数据,购物车只存 {商品编号: 数量};金额一律用 Decimal 并做 ROUND_HALF_UP 舍入。折扣部分讲清阶梯满减的匹配顺序(阈值从高到低、命中即停)与叠加顺序(先满减、后打折),并用一次完整结算演示 706 元如何变成 613.70 元。

xinjiyaya的博客 216

Spring Boot 自动配置原理

Spring Boot 自动配置由 @EnableAutoConfiguration 导入选择器,读取 jar 中 .imports 候选清单,经去重、排序、排除后逐类做条件判断,通过才注册 Bean。延迟导入让用户 Bean 优先,@ConditionalOnMissingBean 使默认配置让位。失效时查清单和 Negative matches。

2401_89855466的博客 393

Python的字典

Python字典是存储键值对的数据结构,通过键(key)快速查找对应的值(value)。可使用{}定义,支持增删改查操作:通过dict[key]查询或修改值,get()方法安全获取并设置默认值,del dict[key]删除键值对,keys()、values()和items()用于遍历。items()结合双变量循环可高效遍历所有键值对,提升代码可读性与灵活性。

qq_43010954的博客 198
上一篇: Virtual Thread 优化 Spring AI 阻塞式 LLM I/O:对照压测报告
下一篇: Learn Claude Code:CodeAgent 的灵魂——上下文管理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值