动手之前
这章的代码在仓库的 chapter_02/ 目录里。你需要 Python 3.11 以上、一个 OpenAI API key,
以及一件很容易忽略的事:从仓库根目录运行。
书里用的是 python -m venv + pip,这儿换成 uv——同一个 Astral 团队做的
Rust 版包管理器,装这套依赖比 pip 快一个数量级,而且能顺手帮你把 Python 3.11 装好,
不用自己操心系统里那个 Python 是什么版本。
# 1. 装 uv(三选一)
curl -LsSf https://astral.sh/uv/install.sh | sh # macOS / Linux
brew install uv # macOS 用 Homebrew 也行
# Windows(PowerShell): irm https://astral.sh/uv/install.ps1 | iex
# 2. 到仓库根目录,建虚拟环境
# 没装 3.11 的话 uv 会自己下一个,不碰你系统里的 Python
cd AI-Agent-Workflows-main
uv venv --python 3.11
# 3. 激活
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 4. 装依赖(这步是 uv 最爽的地方,几秒钟的事)
uv pip install -r requirements.txt
然后在仓库根目录建一个 .env 文件。书里只让你写一行 API key,
但我们用的是兼容 OpenAI 格式的第三方模型服务,所以要写三行:
# 你的服务商地址,注意一般要带 /v1 结尾
OPENAI_BASE_URL=https://你的服务商地址/v1
# 你的服务商给的 key(不是 OpenAI 官方的)
OPENAI_API_KEY=sk-你的key
# 你的服务商支持的模型名,比如 qwen-max、deepseek-chat、glm-4 之类
OPENAI_DEFAULT_MODEL=你的模型名
这三个变量名不是随便起的,是 OpenAI Agents SDK 认的名字,写对了它会自动读走:
-
OPENAI_BASE_URL——SDK 建 HTTP 客户端时会自己去读这个环境变量
(源码里就一句 base_url=... or os.getenv("OPENAI_BASE_URL")),
所以你不用写任何代码去传它。
-
OPENAI_API_KEY——同理,会变成请求头里的 Bearer。
-
OPENAI_DEFAULT_MODEL——这个最容易漏。不指定模型时 SDK 有个默认值
(当前版本是 gpt-5.4-mini),你的服务商多半没有这个模型,请求直接失败。
写上这行,所有没显式指定模型的例子就都能跑了。
就可以跑了:
python chapter_02/01_first_agent.py
# 或者不激活环境,用 uv run 直接跑:
uv run python chapter_02/01_first_agent.py
两个关于 uv 的小提醒
目录名不一样。uv venv 建的是 .venv(带点),
书里 python -m venv venv 建的是 venv(不带点)。
激活命令跟着变,别照抄书里的。好消息是 .venv 已经在仓库的 .gitignore 里了。
别急着用 uv add。这个仓库只有 requirements.txt,没有
pyproject.toml,不是 uv 意义上的「项目」。所以用 uv pip install -r
这种兼容模式,而不是 uv add——后者会给你凭空建一个 pyproject.toml,
反而把事情搞复杂。顺带一提,requirements.txt 里本身就列着 uv,
作者原本就打算让你用它。
光有 .env 还不够,每个例子都得加两行
用第三方模型服务时,只配 .env 会在两个地方翻车,所以下面 8 段代码里都多了这两行:
一、set_default_openai_api("chat_completions")——不加必崩。
SDK 默认走的是 OpenAI 的 Responses API,会去请求 /v1/responses;
而绝大多数第三方兼容服务只实现了老的 /v1/chat/completions。
我拿一个假服务实测过:不加这行,SDK 打的是 /v1/responses;加上之后才变成
/v1/chat/completions。这不是可有可无的优化,是必需的。
二、set_tracing_disabled(True)——不加会刷一屏报错。
SDK 的追踪数据只能发往 OpenAI 官方,端点在源码里是写死的
(https://api.openai.com/v1/traces/ingest)。你手里是第三方的 key,
传上去只会得到 401。这件事直接影响第 06 和 08 步——那两步整节都在讲追踪,
到时候我再细说怎么办。
关于这里的代码
下面 8 段代码的结构和仓库里的文件逐行对应,但我把提示词、注释和 docstring 都译成了中文,
方便你边读边懂。有几处翻译是有实际后果的,先说清楚:
一、智能体会改说中文。提示词换成中文之后,输出的任务列表也会是中文。这是好事,
但你对照书里的英文截图时会发现对不上——不是你错了。
二、「5 words or less」翻不了。原文限制的是英文单词数,中文里没有对应概念,
所以我改成了「每条不超过 10 个字」。提示词里的长度限制天生不能直译,
换语言就得重新定标准,这一点在你自己写中文提示词时同样成立。
三、Wikipedia / Google / YouTube 没翻。它们是专有名词,
而且在第 08 步里是字典的键——翻成中文的话,模型传回来的名字就对不上键了,直接 KeyError。
四、name="研究规划师" 在这章没问题,第 4 章要留神。
从第 4 章的移交(handoff)开始,SDK 会拿智能体的名字自动拼出工具名(形如
transfer_to_xxx)。到那时候用中文名可能拼出不合法的工具名,
所以后面几章建议把 name 留成英文。
为什么必须在根目录跑
代码里的 load_dotenv() 是从「当前工作目录」往上找 .env 的。
你要是 cd chapter_02 再跑,它找不到根目录那个 .env,就会报没有 API key。
顺带一提:整个仓库里只有第 2、6、7 章和 demo_project 调了 load_dotenv(),
第 3、4、5、9 章压根不读 .env,得自己 export 环境变量。这一点书里没讲清楚。