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
npx lagune read agent --lang javascript --pattern 'query({ prompt })' # => uncapped
npx lagune read agent --lang javascript --pattern 'query({ prompt, options: { maxTurns: 5 } })' # => safe
npx lagune read agent --lang python --pattern 'AgentExecutor(agent=a, max_iterations=None)' # => uncapped
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 运行时调用。
