从这里开始
先别急着看完整的模式列表。模式名一多,很容易变成“背概念”。
这个仓库建议你先做一件小事:跑一个只有加法工具的最小 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 循环:
MockLLM返回一个 JSON 动作:调用add工具。ToolRegistry找到add,Python 执行这个普通函数。- 工具返回
"4",运行时代码把它写回消息历史。 MockLLM再返回final,循环停止。Tracer把这段过程写进.traces/21_react_loop.jsonl。
最重要的一点:模型只是在提出动作请求;真正执行、记录、停止,都是 Python 代码在做。
先看懂这三件事
1. 模型可以先用假的
MockLLM 是脚本化的假模型。它让我们先理解控制流,而不是一上来就被 API key、网络、模型波动干扰。
2. 工具就是函数
add(args) 接收一个字典,返回一个字符串。等你把这个边界看懂,再把它换成搜索、数据库、文件操作,本质一样。
3. Agent 循环必须有硬刹车
RunLimits(max_steps=5) 不是装饰。只要让模型决定下一步,就必须限制最多跑几步、最多花多少钱、最多等多久。