Hooks

agent hook:检测没有上限的智能体循环

在命令行中扫描代码库里没有步数或时间上限的智能体或 LLM 调用,或评估单个调用。

agent hook 会标记不设轮次、预算或时间上限就循环运行的智能体运行时,这种失控的自主性漏洞会让一条精心构造的输入造成无上限的成本,或让提示词注入不断升级。它能识别语言,覆盖两大智能体框架生态:JavaScript(Claude 智能体 SDK 的 query 运行时)和 Python(LangChain、LangGraph、CrewAI、OpenAI Agents)。它是 llm 专项 背后的确定性引擎,你也可以自己以 scan 或 check 模式运行它。

如何运行​

npx lagune read agent # scans the whole project
npx lagune read agent --dir src/ai # scans a directory
npx lagune read agent --file chat.ts # scans a single file

Uncapped agent loops found 下的每一行都出现在导入了智能体 SDK 的文件中,要么是调用 Claude 智能体 SDK 的 query 运行时却没有设置轮次、预算或时间上限(JavaScript,默认无上限),要么是显式移除了框架的默认上限,例如 max_iterations=None / max_turns=None(Python,默认有上限)。两种情况都会以非零退出码退出。Vercel AI SDK 的 generateText/streamText 默认只执行一步(stopWhen: stepCountIs(1)),因此直接调用它们不会形成循环,也不会被标记,普通的 db.query(...) 也绝不会被误认为智能体调用。扫描结果干净时会输出 no uncapped agent loops found。

如何解读判定结果​

判定结果含义
uncapped没有设置上限的 query 运行时调用(JS),或显式移除了上限(=None,Py)。
safe设置了上限的 query 调用、单步生成,或默认有上限的框架调用。
invalid代码片段中没有可识别、可判定的智能体调用。

CLI 选项​

选项值说明
--pattern一个代码片段检查一个调用。可重复使用以检查多个,每行一个判定结果。
--lang一种语言使用 --pattern 时必填:javascript 或 python。
--dir一个目录将扫描范围限定在某个目录。可重复使用,也可与 --file 组合。
--file一个文件将扫描范围限定在单个文件。可重复使用,也可与 --dir 组合。

不带任何选项时,它会扫描整个项目。--pattern 需要配合 --lang,且不能与 --dir 或 --file 组合使用。

尽力而为,并非详尽无遗

无论用哪种语言,手写的智能体循环都超出了静态扫描的能力范围。请把它当作可靠的底线,而不是完整的清单。

提示

hook 只判断上限:能力范围的划定、信任级别的混用和授权,则由 llm 专项 来判断。

常见问题

没有上限的智能体可能被诱导陷入无限递归、无上限的成本或不断升级的提示词注入。设置 maxTurns/maxBudgetUsd/stopWhen/signal 可以约束它,而 agent hook 会标记一个都没有设置的 query 运行时调用。