本节摘要:所有 AI API 都遵循同一个套路——发请求、拿响应;变的只是细节,不变的是模式。从第 11 章起你会频繁调用 LLM API(Anthropic、OpenAI、Google),第 13~16 章更要在循环里把它们编排成 Agent。本节先把这件基础事做扎实:如何用环境变量与
.env文件安全存放 API 密钥(绝不写进代码),如何用官方 SDK 与裸 HTTP 两种方式各发一次 LLM 调用并对比响应格式,以及如何识别与处理鉴权失败、限流这类常见错误。读完本节,你能在十分钟内打通任意一家厂商的第一个 API 调用,并能从裸 HTTP 层面读懂报错根因。
对应原课程:Phase 00 · Lesson 04 ·
apis-and-keys(原英文phases/00-setup-and-tooling/04-apis-and-keys/docs/en.md)。前置:第 01 节「开发环境」。
阅读完本节,你应当能够:
.env 文件安全存放 API 密钥,并确保 .env 被 .gitignore 排除。从第 11 章开始,你会调用 LLM API(Anthropic、OpenAI、Google);第 13~16 章,你要构建在循环里反复调用这些 API 的 Agent。在此之前,你必须搞懂三件事:API 密钥怎么工作、怎么安全存放、怎么发出你的第一次调用。
每一次 API 调用都是一次请求-响应:
任何一次 API 调用都有四个要素:
💡 记住这个「四要素」心智模型。后面无论 Anthropic、OpenAI 还是 Google,无论 SDK 还是裸 HTTP,无非都是这四样东西在不同细节上的展开。
永远不要把 API 密钥写进代码。用环境变量:
export ANTHROPIC_API_KEY="sk-ant-..." export OPENAI_API_KEY="sk-..."
或者用一个 .env 文件(务必把它加进 .gitignore,见第 02 节):
ANTHROPIC_API_KEY=sk-ant-... OPENAI_API_KEY=sk-...
代码里用 python-dotenv 自动加载 .env,这样密钥只活在本地文件,不进版本库,不进日志。
⚠️ 设计警示:把密钥误提交到 GitHub 是工业界最高频的安全事故之一。哪怕几秒钟也不行——爬虫会立刻抓走并在几分钟内消耗你的额度。一旦误提交,立刻去厂商后台吊销并重置那把密钥,再清 git 历史。
import os, anthropic client = anthropic.Anthropic() # 自动从环境变量读密钥 MODEL = os.environ.get("LLM_MODEL", "claude-sonnet-5") response = client.messages.create( model=MODEL, max_tokens=256, messages=[{"role": "user", "content": "用一句话解释神经网络是什么?"}] ) print(response.content[0].text)
LLM_MODEL 用来选 Anthropic 的模型 id,默认是 claude-sonnet-5 这个无日期别名。其他厂商(OpenAI、Google 等)遵循同样的「密钥 + 模型 id」模式,但各有各的 SDK、端点和请求/响应 schema。
import Anthropic from "@anthropic-ai/sdk"; const client = new Anthropic(); // 同样自动读环境变量 const MODEL = process.env.LLM_MODEL ?? "claude-sonnet-5"; const response = await client.messages.create({ model: MODEL, max_tokens: 256, messages: [{ role: "user", content: "用一句话解释神经网络是什么?" }], }); console.log(response.content[0].text);
import os, urllib.request, json url = "https://api.anthropic.com/v1/messages" headers = { "Content-Type": "application/json", "x-api-key": os.environ["ANTHROPIC_API_KEY"], # 注意是 x-api-key "anthropic-version": "2023-06-01", # Anthropic 要求带版本号 } body = json.dumps({ "model": os.environ.get("LLM_MODEL", "claude-sonnet-5"), "max_tokens": 256, "messages": [{"role": "user", "content": "用一句话解释神经网络是什么?"}], }).encode() req = urllib.request.Request(url, data=body, headers=headers, method="POST") with urllib.request.urlopen(req) as resp: print(json.loads(resp.read())["content"][0]["text"])
这段就是 SDK 在底层做的事。理解裸 HTTP 调用,在排查问题时极其有用——SDK 把细节藏起来,但报错信息往往只在 HTTP 层才看得清。
设计要点:不同厂商鉴权头不同。Anthropic 用
x-api-key,OpenAI 用Authorization: Bearer <key>。这种差异,SDK 会替你抹平;但用裸 HTTP 时必须自己处理。
这门课你会用到下面这几家,不必现在全配齐,用到哪节配哪家即可:
| API | 何时需要 | 免费额度 |
|---|---|---|
| Anthropic(Claude) | 第 11~16 章(Agent、工具) | 注册送 5 美元 |
| OpenAI | 第 11 章(对比) | 注册送 5 美元 |
| Hugging Face | 第 4~10 章(模型、数据集) | 免费 |
💡 共同模式:每家都是「一把密钥 + 一个模型 id + 一段请求体」。学会一家,迁移到另一家通常只需换个 SDK 和改几行字段名。第 12 章会专门讲跨厂商提示设计的工程心法。
echo $ANTHROPIC_API_KEY 确认。本节产出(原课程 outputs/):
prompt-api-troubleshooter.md:一个提示词,把你遇到的 API 报错(状态码、响应体、你用的 SDK 与代码片段)贴进去,让 AI 助手帮你诊断根因并给出修复命令。覆盖鉴权、限流、模型不存在、参数缺失这几类高频问题。.env,用 Python SDK 发出你的第一次 LLM 调用,打印返回的文本。.env,并把 .env 加进 .gitignore;误提交立即吊销重置。claude-sonnet-5 这类无日期别名。x-api-key,OpenAI 用 Authorization: Bearer)。下一节,我们将进入「Jupyter Notebook」——把这套 API 调用与实验代码装进交互式笔记本,让探索式 AI 开发更顺手。