跳转至

从这里开始

先别急着看完整的模式列表。模式名一多,很容易变成“背概念”。

这个仓库建议你先做一件小事:跑一个只有加法工具的最小 Agent,然后看它每一步怎么动。

30 秒跑起来

这个例子用的是 MockLLM,不需要 API key,也不需要联网。

UV_CACHE_DIR=.uv_cache PYTHONPATH=src uv run --no-sync python examples/21_react_loop.py

预期输出:

4
[trace] .traces/21_react_loop.jsonl

完整代码

代码直接放在这里。这个例子就是整个仓库的“第一块积木”。

from __future__ import annotations

from pathlib import Path

from agent_patterns_lab.patterns.react import run_react
from agent_patterns_lab.runtime import MockLLM, RunLimits, Tool, ToolRegistry, Tracer


def main() -> None:
    tracer = Tracer()

    def add(args: dict) -> str:
        return str(int(args["a"]) + int(args["b"]))

    tools = ToolRegistry([Tool(name="add", description="Add two integers", handler=add)])

    model = MockLLM(
        [
            '{"type":"tool","tool":"add","args":{"a":2,"b":2}}',
            '{"type":"final","answer":"4"}',
        ]
    )

    out = run_react(
        model,
        task="Compute 2+2.",
        tools=tools,
        limits=RunLimits(max_steps=5),
        tracer=tracer,
    )

    print(out)
    trace_path = tracer.export_jsonl(Path(".traces") / "21_react_loop.jsonl")
    print(f"[trace] {trace_path}")


if __name__ == "__main__":
    main()

刚才发生了什么

任务是 Compute 2+2.,但我们故意不让模型直接回答。它必须走一遍 Agent 循环:

  1. MockLLM 返回一个 JSON 动作:调用 add 工具。
  2. ToolRegistry 找到 add,Python 执行这个普通函数。
  3. 工具返回 "4",运行时代码把它写回消息历史。
  4. MockLLM 再返回 final,循环停止。
  5. Tracer 把这段过程写进 .traces/21_react_loop.jsonl

最重要的一点:模型只是在提出动作请求;真正执行、记录、停止,都是 Python 代码在做。

先看懂这三件事

1. 模型可以先用假的

MockLLM 是脚本化的假模型。它让我们先理解控制流,而不是一上来就被 API key、网络、模型波动干扰。

2. 工具就是函数

add(args) 接收一个字典,返回一个字符串。等你把这个边界看懂,再把它换成搜索、数据库、文件操作,本质一样。

3. Agent 循环必须有硬刹车

RunLimits(max_steps=5) 不是装饰。只要让模型决定下一步,就必须限制最多跑几步、最多花多少钱、最多等多久。

下一步看什么

  • 心智模型:先分清“一次调用、固定流程、Agent 循环、多 Agent 协作”。
  • 选择模式:按你遇到的问题选模式。
  • ReAct:把这段 loop 讲完整。