章 5 末尾那 40 行最小 harness——这一节真的把它跑起来。装环境、写代码、看一次完整 trace、做 4 个变体练习。~30 分钟搞定, 0 框架依赖, ~80 行 Python。
建议先读《本章索引》;如果你是跳读,至少先看本章索引与本页 TL;DR。
课程实操闭环,要求你把抽象真正写进代码与运行流程。
章 5 末尾那 40 行最小 harness——这一节 真的把它跑起来 。装环境、写代码、看一次完整 trace、做 4 个变体练习。 ~30 分钟搞定, 0 框架依赖, ~80 行 Python 。
先判断任务类型,再决定手搓 harness 还是借框架。
课程实操:可运行案例 + 官方 SDK / 仓库。
minimal_agent.py + 1 个 mock tool, 无需任何 agent 框架, 直接调 OpenAI / Anthropic SDK。L1 不依赖任何 agent 框架, 只需要一个原生 LLM SDK + 你的 API key。三选一即可。
$ mkdir my-agent && cd my-agent $ uv venv && source .venv/bin/activate # 三选一, 推荐 OpenRouter (一个 key 通三家): $ uv pip install openai $ export OPENROUTER_API_KEY=sk-or-... # 或 Anthropic 直连: $ uv pip install anthropic $ export ANTHROPIC_API_KEY=sk-ant-... # 或 OpenAI 直连: $ uv pip install openai $ export OPENAI_API_KEY=sk-...
章 5 给的是骨架伪代码——把 LLM 调用替换成真实 SDK 调用就是可跑代码。下面这版 ~80 行直接抄即可(含 import / typing / mock tool)。
"""L1 minimal ReAct agent · 0 framework, ~80 lines · 6 invariants present.""" import json, os from dataclasses import dataclass, asdict from typing import Callable from openai import OpenAI # [I3] 状态累积器 · 每个 turn 一个 Step @dataclass class Step: role: str content: str = "" tool_call: dict | None = None tool_call_id: str | None = None # [I4] 动作分发器 · tool 注册表 + JSON Schema def get_weather(city: str) -> str: # mock: 真接 API 太散, 学习用 mock 即可 fake = {"sf": "sunny 22°C", "nyc": "cloudy 15°C", "tokyo": "rain 18°C"} return fake.get(city.lower(), f"unknown city: {city}") TOOLS: dict[str, Callable] = {"get_weather": get_weather} TOOL_SCHEMAS = [{ "type": "function", "function": { "name": "get_weather", "description": "Look up current weather for a city.", "parameters": { "type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"], }, }, }] #