AI Agents in Action · Second Edition
Manning《AI Agents in Action》第二版的逐章中文教程,
覆盖有代码的第 2–11 章。不是翻译——是把书和配套仓库对着核了一遍:
提示词和注释都译成中文、环境换成 uv、代码改成能跑在兼容 OpenAI 的第三方模型上,
并且每一条结论都实测过。
顺带挖出了不少书和仓库对不上的地方——包括一个让整章跑不起来的、根本不存在的 npm 包。
先做这个
这套配置每一章都要用,而且和书里写的不一样——书假设你用 OpenAI 官方,
我们用的是兼容 OpenAI 格式的第三方模型。下面每一条我都在
openai-agents 0.18.3 上实测过。
# SDK 会自动读走这三个,不用写代码去传
OPENAI_BASE_URL=https://你的服务商地址/v1
OPENAI_API_KEY=sk-你的key
OPENAI_DEFAULT_MODEL=你的模型名
from dotenv import load_dotenv
from agents import set_default_openai_api, set_tracing_disabled
load_dotenv()
set_default_openai_api("chat_completions") # 不加会去打 /v1/responses,第三方没这个端点
set_tracing_disabled(True) # 追踪端点硬编码 api.openai.com,第三方 key 只会 401
①OPENAI_DEFAULT_MODEL 不能不设。不写 model=
不代表没事——SDK 有个内置默认模型(当前是 gpt-5.4-mini),
它会拿这个名字去请求你的服务商,然后你收到一个莫名其妙的错误。
② set_default_openai_api("chat_completions") 不是可选的。
SDK 默认走 Responses API。我做了正反两次实验:不加这行请求打到
/v1/responses,加上才是 /v1/chat/completions。
③ 从第 7 章起要换一行。set_tracing_disabled(True) 会让
Phoenix 也收不到。接 Phoenix 时要改用
set_trace_processors([])——只清掉发往 OpenAI 的那个。
详见第 7 章。
uv venv --python 3.11 → source .venv/bin/activate →
uv pip install -r requirements.txt。
注意目录是 .venv(带点),书里是 venv(不带点),
激活命令别照抄书。完整说明见第 2 章。
十章
每张卡片下面那行红字,是我在那一章挖到的最值钱的一个发现。
name= 会让三个智能体撞成同一个工具名travel_forward 做的是减法——前进变后退,差 100 年== → LLM 当评委 → 还要查出处 → 让人看。
还上了第 2 章欠的追踪那笔账。
读完十章之后
逐章读的时候看不出来,十章摆在一起才浮出水面。这两条比任何单章的知识点都值钱。
四次,同一个病:用字符串操作去理解语言。
if 禁词 in input —— 换个说法就绕过去了if "promising" in output —— "not promising" 里含 "promising",判反了result == "antimatter" —— 拿整句话比一个词,说人话就判错而解药第 2 章就教了。下面这条线,就是它。
output_type 是这本书唯一的主角同一个东西,在十章里长成了四种身份:
result.tasks[2] 能直接取值goal_satisfied 直接决定循环转不转0.4 设这本书如果只留一个东西,是它。
没有教程的两章
全是概念:智能体的五个功能层(人设 / 工具 / 推理 / 记忆 / 评估)、
三种多智能体拓扑(装配线 / 中心辐射 / 团队)。
仓库里没有 chapter_01/,所以没做教程。
但它的五层结构是全书的骨架——第 11 章正是按这五层收口的。 想补这一课,直接看 第 11 章 那个五层堆叠图。
书的正文只到第 11 章(后面是附录 A/B)。但仓库里有个
chapter_12/,里面只有一个 16 行的
02_a2a_agent_consumer.py——连 01_ 都没有。
而且它跑不了。第 7 行是:
card = requests.get("http://localhost:8080/.well-known/ai-agent.json")
endpoint = card["url"] ← Response 对象不能下标,必然 TypeError
正确写法是 card.json()["url"]。而且它依赖一个
localhost:8080 上根本不存在于本仓库的 A2A 服务——没有任何文件提供它。
requirements.txt 倒是为它装了 google-adk[a2a] 和
litellm。
结论:这是个残留存根,不是遗漏的一章。没有教程可做。
关于这套笔记
代码是真跑的,不是看的。我起了一个假的「第三方模型服务」接住请求,
逐个文件跑、核对请求路径、model 字段和鉴权头。所有代码块都过了
ast.parse,翻译只动字符串、不动结构(用 AST 骨架比对确认过)。
几个关键结论是专门做实验证死的:npm 包 404(registry 直查 + scope 枚举 + 实际 npx 拉取,三重)、
Docker build 失败(真跑)、Phoenix 追踪落库(起了真容器,12 个 span)、
中文查询检索劣化(真向量库测距离)、中文 name 撞名(真调 SDK)。
第 3–11 章的页面渲染我一次都没亲眼看到。写第 2 章时用的浏览器预览面板 从第 3 章起就卡住了,导航报成功但页面不变。所以那九页我只做了静态验证 (语法、HTML 标签配平、复制逻辑与第 2 章实测版逐字比对)。
代码层面我是真跑过的,但排版可能有我看不见的问题。 建议先看第 5 章(四个 SVG 形状图)和 第 9 章(三道终止门)——这两页视觉结构最复杂、最可能翻车。 发现问题告诉我。
每一页的代码相比仓库原文都有刻意的改动,页脚都列明了:环境换 uv、
提示词/注释/docstring 译成中文、补上接第三方模型的配置,
以及修掉那些确实是 bug 的地方(第 5 章的减号、第 7 章缺的 f、
第 9 章不存在的包)。
但有几处坏代码我故意保留了原样——因为它坏本身就是要点: 第 5 章 ToT 的子串判断、第 11 章那两个 TypeError。这些地方都单独标注了。
有些东西不能翻,翻了会真的坏掉:智能体 name=(撞名)、
工具函数名(提示词按名字引用)、字典的键、枚举值、第 6 章的检索查询、
第 7 章那五条虚构知识(检索是英文子串匹配)。