📘 第 2 课:Your first API call(你的第一次 API 调用)
所属课程:the AI Platform 101(课程 003) 官方课时定位:Section 1「What is the the AI Platform?」— Lesson 2 / 共 12 课时 ID:
486251| 官方地址:https://anthropic.skilljar.com/claude-platform-101/486251形式:Video(视频课 + 文稿) 针对认证:CCAR-P(架构师 Professional) 整理日期:2026-10-14 ⚠️ 语料来源:官方 Skilljar 课程正文(用户提供,需登录)。CC BY-NC-SA 4.0,仅供个人学习。 ⭐ 本课权重提示:全课最小可运行单元课。本课给出了messages.create的必填三要素与响应结构(block 数组)—— 这两个知识点是领域 2(13%)与领域 3(19%)最密集的交界,且几乎每年必考「密钥该放哪」与「响应怎么取」两道题。
🎯 本课学习目标
⚠️ 本课官方未提供
What you'll learn区块。以下按文稿结构反推:
- 能完成开工准备:取 API key、安全地存放、安装 SDK。
- 能说出一次请求必填的三个要素。
- 能读懂并写出一个约 20 行的最小可用调用。
- 理解
system提示词塑造人格的作用。 - ⭐ 理解响应
content是 block 数组(不是字符串),并知道要循环 + 判类型。 - 能把同一个调用从脚本包装成产品接口。
📖 一、视频导读
官方原句: Saying hi to the AI might warm your heart, but it's not really useful.* In this lesson we'll send the AI something real and get structured insight back — in just under 20 lines of code*.
精译:跟 AI 打个招呼也许能暖你的心,但它其实没什么用。 这一课我们要给 AI 送点真实的东西,并拿回结构化的洞见 —— 而且用不到 20 行代码。
⭐ 官方一上来就否定了
Hello, the AI式的调用 —— 呼应第 1 课「不是聊天,是构建」的立场。structured insight(结构化的洞见)与第 1 课的structured request / structured response是同一族词。
🔧 二、开工准备(Get set up)
1. 取 API key
First, grab an API key from platform.claude.com. You'll need to purchase some credits beforehand.
精译:首先,从 platform.claude.com 取一个 API key。你需要事先购买一些额度。
2. ⭐⭐ 把 key 放进 .env.local(本课第一个必考点)
官方原句: Take the API key and store it in a
.env.localfile so it stays out of your version control. Hardcoding keys in source files is how they end up leaked on GitHub — keep them in environment files instead.
精译:把 API key 存进 .env.local 文件,让它不进你的版本控制。把密钥硬编码进源文件,正是它们最终泄露到 GitHub 上的方式 —— 请改放在环境变量文件里。
| ❌ 错误做法 | ✅ 官方口径 |
|---|---|
把 key 写进 .ts / .py 源文件(hardcoding) |
放 .env.local 等环境文件 |
提交进仓库(进 version control) |
让它留在版本控制之外(配合 .gitignore) |
| 事后靠"小心一点" | 机制上隔离(环境变量注入) |
⭐⭐ CCAR-P 考点(领域 5 治理安全,14%): 题干给「开发把 API key 提交到了公开仓库」→ 正解一定是改用环境变量/密钥管理服务 + 轮换已泄露的密钥; 陷阱选项:「把仓库设为私有」「删掉提交历史」「加日志监控」—— 这些都是补救,不是根因修复。根因是密钥进了版本控制。 记忆锚:硬编码 = 泄露的路径。环境文件 = 隔离的机制。
3. 安装 SDK
Next, install the SDK:
npm install @anthropic-ai/sdk
官方在 About 里已说明:示例用 TypeScript SDK(
@anthropic-ai/sdk)配 Node 与 npm;平台另有 Python SDK,但本课程示例是 TypeScript。 第 1 课的示例是 Python 风格,本课起改为 TypeScript/Node —— 两处都要认识,考题不保证语言一致。
🧬 三、⭐ 请求的解剖(The anatomy of a request)
官方原句:Every API call goes through the
messages.createfunction. You specify three things:
| # | 必填项 | 官方原句 | 中文 |
|---|---|---|---|
| 1 | A model | which the AI model handles the request | 由哪个模型处理这次请求 |
| 2 | A max tokens limit | a cap on how long the response can be | 封顶响应能有多长 |
| 3 | A list of messages | objects with either user or assistant roles, structured similarly to how you'd have a conversation with the AI elsewhere |
带 user 或 assistant 角色的对象,结构类似你在别处与 AI 对话的方式 |
⭐⭐ 「三个必填」是枚举题的高频考点 —— 必须和第 1 课的「四个控制权」区分开:
| 第 1 课:四个控制权 | 第 2 课:三个必填项 | |
|---|---|---|
| 内容 | model / 花多少 token / 能用哪些工具 / 遵循什么系统指令 | model / max_tokens / messages |
| 性质 | 平台给你的控制维度 | 一次调用必须给的东西 |
| 是否必填 | 否(是"你可以控制什么") | ✅ 是 |
⚠️ 关键辨析:
system不在必填三要素里 —— 它是第 4 个、可选的参数(本课后面才加入)。 题干问「一次messages.create最少需要什么」→ 选 model + max_tokens + messages; 题干问「平台让你控制什么」→ 选第 1 课那四项。 记忆锚:三个必填是「调用」,四个控制是「平台」。
最小形式(官方代码,保持原样)
import the AI provider from "@anthropic-ai/sdk";
const client = new the AI provider();
const msg = await client.messages.create({
model: "current-model",
max_tokens: 1024,
messages: [{
role: "user",
content: "Hello, the AI",
}],
});
⚠️ 抓取件说明:
the AI provider与model: "current-model"为去品牌化/环境替换残留(第 1 课为"current-model-lite")。实际写法是 SDK 的默认导出类与具体模型名(如 Haiku / Sonnet 档)。不要背这些字符串。 💡 官方自己吐槽了这个调用:"Saying hi to the AI ... is not really useful" —— 这段只是结构演示,不是推荐用法。
🐛 四、真实案例:审查有 bug 的代码(Reviewing buggy code)
官方原句:Let's give the AI something a little more interesting than "hello." We'll point it at some buggy code and ask for a review. Here's the whole thing — one file, about 20 lines of code:
精译:我们给 AI 一点比「hello」更有意思的东西。我们把它指向一段有 bug 的代码,并要求一次审查。这就是全部 —— 一个文件,大约 20 行代码。
官方代码(保持原样)
import the AI provider from "@anthropic-ai/sdk";
const client = new the AI provider();
const buggyCode = `
function add(a, b) {
return a - b;
}
`;
const response = await client.messages.create({
model: "current-model",
max_tokens: 1024,
system: "You are a terse senior code reviewer. Give feedback in one paragraph.",
messages: [
{ role: "user", content: `Review this code:\n${buggyCode}` },
],
});
for (const block of response.content) {
if (block.type === "text") {
console.log(block.text);
}
}
⭐ 官方点名的「两个注意点」(Two things to notice)
1. system 提示词塑造人格(persona)
The
systemprompt is where you shape the persona. I want a terse senior reviewer, not a chatty one — so I just say that.
精译:system 提示词就是你塑造人格的地方。 我要的是一个惜字如金的高级审查者,而不是一个话痨 —— 所以我就直接这么说。
| 指令 | 作用 |
|---|---|
You are a terse senior code reviewer. |
定角色(senior)+ 定语气(terse 简洁) |
Give feedback in one paragraph. |
定输出形态与长度约束 |
⭐ 这是
system提示词最教科书的用法:角色 + 语气 + 输出约束,一句话三层。 呼应第 1 课:system是「你定义 AI 扮演的角色」的地方;第 1 课把tone and guidelines(语气与准则)放进去,本课把人格与格式也放进去。 ⭐⭐just say that(直接说就好) —— 官方在强调:不需要复杂技巧,把要求直说出来就行。这与考纲领域 2 的「系统提示词、模板与护栏」一致:清晰优于机巧。
2. ⭐⭐ 响应 content 是 block 数组,不是字符串
官方原句: The
message.contentin the response is an array of blocks, not a string. For a basic text reply there's usually just one block of typetext, but the AI can return multiple blocks — text, tool calls, thinking — so we always loop and check the type.
精译:响应里的 message.content 是一个 block 数组,不是字符串。对于一次基础文本回复,通常只有一个 text 类型的 block,但 AI 可能返回多个 block —— 文本、工具调用、思考 —— 所以我们要始终循环并检查类型。
| 关键点 | 说明 |
|---|---|
| 结构 | response.content = 数组(for (const block of response.content)) |
| 判类型 | block.type —— 本课只处理 "text" |
| ⭐ 三种 block | text(文本)/ tool calls(工具调用)/ thinking(思考) |
| 官方要求 | ⭐ always loop and check the type(永远循环 + 判类型) |
⭐⭐ 这是本课技术含量最高的一句,极可能出代码/结构题: * 为什么必须判类型:因为一次响应可能同时含文本、工具调用、思考 —— 直接当字符串用会漏内容或报错。 * 前向呼应:
tool calls→ 第 5 课What is tool use?;thinking→ 第 6 课What is thinking?。本课先把三种 block 的名字给你,后面两课再展开。 * ⚠️ 与第 1 课的对照:第 1 课写的是draft = response.content(直接整体赋值,教学简化);本课纠正为「必须循环 + 判类型」。以本课为准。 * 记忆锚:响应不是一句话,是一串积木;不看类型就取,等于蒙着眼拿。
运行结果
Run it, and the AI spots that
addis subtracting and tells you in one paragraph. That's it. That's the whole API call.
精译:跑起来,AI 会发现 add 其实在做减法,并用一段话告诉你。就这样。这就是整个 API 调用。
(官方终端输出:AI 指出函数名为 add 却使用了减法,并建议把 return a - b 改为 return a + b。)
🚀 五、⭐ 从脚本到产品(From script to product)
官方原句: In a real product, this same
messages.createshape is the engine behind something like a summarize endpoint. Pull a meeting transcript out of the database, hand it to the AI with a system prompt that says "extract insights and risks," save the result back on the row, and return it to the UI. It's the same call — just wrapped in a route handler.**
精译:在真实产品里,同样的这个 messages.create 形态,就是类似"摘要接口"背后的引擎。做法是:从数据库取出一份会议转录,把它交给 AI,配上一句「提取洞见与风险」的系统提示词,把结果存回那一行,再返回给界面。还是同一次调用 —— 只是被包在了一个路由处理函数里。
⭐ 端到端链路(正好对应考纲领域 1 的「输入 → 处理 → 输出 → 反馈回路」)
| 步 | 官方动作 | 中文 |
|---|---|---|
| ① 输入 | Pull a meeting transcript out of the database** | 从数据库取会议转录 |
| ② 处理 | hand it to the AI with system: "extract insights and risks" |
交给 AI + 系统提示词定任务 |
| ③ 输出 | save the result back on the row | 把结果存回那一行(持久化) |
| ④ 交付 | return it to the UI** | 返回给界面 |
| 包装 | wrapped in a route handler** | 包在路由处理函数里 |
⭐⭐ 本课最重要的架构论断: It's the same call — just wrapped in a route handler. (还是同一次调用 —— 只是被包在了一个路由处理函数里。)
这句话把「演示脚本」和「生产功能」之间的差距,压缩成了一层包装。它直接回答了第 1 课留下的那个转向 —— 从「问 AI 一个问题」到「AI 成为产品的一部分」,在工程上只需要:数据库取数 → 同一次调用 → 存回 → 返回 UI。
⭐ 注意
save the result back on the row(把结果存回那一行) —— 这是有状态的产品做法,不是无状态的问答。对应领域 1 的反馈回路与领域 6 的生命周期管理。记忆锚:产品化 = 同一次调用 + 数据进出 + 一层路由。
与第 1 课的案例对照
| 第 1 课:起草客服回复 | 第 2 课:会议摘要接口 | |
|---|---|---|
| 输入来源 | 取出工单内容 | 从数据库取转录 |
system |
团队的语气与准则 | "extract insights and risks" |
| 输出去向 | 回给按钮渲染 | 存回那一行 + 返回 UI |
| 形态 | 一次调用 | 同一次调用 + 路由包装 |
💡 两次都是同一个
messages.create形态 —— 这就是官方反复强调的「从这里开始,一切都建立在这个模式之上」。
🔑 六、核心要点(Recap)· 官方五条
- Your first API call is a
messages.createfunction with a model, a token limit, and messages. 你的第一次 API 调用就是一个messages.create—— 带一个模型、一个 token 上限和一组消息。 - Store your API key in a
.env.localfile to keep it out of version control. 把 API key 存进.env.local,让它不进版本控制。 - Add a system prompt to shape the AI's behavior. 加一个系统提示词来塑造 AI 的行为。
- The response
contentis an array of blocks — loop and check each block'stype. 响应的content是一个 block 数组 —— 循环并检查每个 block 的type。 - From here, everything builds on this pattern. 从这里开始,一切都建立在这个模式之上。
⭐ 第 5 条是全课的承上启下句:后面 10 节课(tool use / thinking / 内置工具 / Skills / MCP / 上下文管理 / 托管智能体)全部是往这个模式上加东西,不是换模式。
🧠 本课 → CCAR-P 考点映射
| 本课知识点 | 命中考纲条目 | 领域 |
|---|---|---|
⭐⭐ 密钥进 .env.local、硬编码导致泄露 |
治理与安全:凭据管理、识别安全缺口 | 领域 5(14%) |
⭐⭐ messages.create 必填三要素 |
模型选型与调用配置 | 领域 2(13%) |
⭐⭐ 响应 content 为 block 数组,须判 type |
集成实现;解析模型输出(text / tool_use / thinking) | 领域 3(19%) |
system 塑造人格与输出约束 |
设计系统提示词、模板与护栏 | 领域 2(13%) |
max_tokens 控制响应长度与成本 |
优化上下文窗口与管理 token 消耗 | 领域 2 |
| ⭐ 从脚本到产品:DB → AI → 存回行 → 返回 UI | 端到端架构(输入 → 处理 → 输出 → 反馈回路) | 领域 1(17%) |
| 事先购买额度、成本可控 | 权衡准确率与延迟并论证配置决策 | 领域 4(16%) |
| SDK 安装与本地跑通(Node/npm) | 开发者生产力与运维赋能 | 领域 7(7%) |
🔤 本课新生词(已回灌 30-单词表/03,2026-10-14)
| 词汇 | 音标 | 释义 | 备注 |
|---|---|---|---|
warm your heart |
— | 让人心里一暖 | 官方吐槽式开场 |
structured insight |
— | 结构化的洞见 | 呼应第 1 课 structured request |
in just under 20 lines |
— | 用不到 20 行 | |
⭐ get set up |
— | 完成开工准备 | 小节标题 |
grab |
/ɡræb/ |
取、拿(口语) | grab an API key |
credits |
/ˈkredɪts/ |
额度、点数 | 不是「学分」 |
beforehand |
/bɪˈfɔːrhænd/ |
事先 | |
⭐⭐ .env.local |
— | 本地环境变量文件 | 本课必考 |
⭐⭐ version control |
— | 版本控制 | |
⭐⭐ hardcode(v.) |
/ˈhɑːrdkoʊrd/ |
硬编码 | ⭐ 安全考点核心词 |
leak(v.) |
/liːk/ |
泄露 | end up leaked on GitHub |
end up |
— | 最终落到(某种结局) | 常接不好的结果 |
⭐ anatomy |
/əˈnætəmi/ |
解剖、结构拆解 | ⭐ 本课小节标题;比 structure 更强调"逐层拆开" |
go through |
— | 经由、通过 | every API call goes through ... |
specify |
/ˈspesɪfaɪ/ |
指定 | |
cap(n./v.) |
/kæp/ |
上限 / 封顶 | 第 1 课为动词,本课名词 |
token limit |
— | token 上限 | = max_tokens |
roles |
— | 角色 | user / assistant |
buggy |
/ˈbʌɡi/ |
有 bug 的 | |
point it at |
— | 把它指向 | point it at some buggy code |
review(n./v.) |
/rɪˈvjuː/ |
审查 / 评审 | 双词性 |
⭐ terse |
/tɜːrs/ |
简洁、惜字如金 | ⭐ 与 concise 近义,但 terse 更"冷" |
chatty |
/ˈtʃæti/ |
话痨的、啰嗦的 | ⭐ terse 的反义,官方成对使用 |
⭐ persona |
/pərˈsoʊnə/ |
人格、人设 | shape the persona |
shape(v.) |
/ʃeɪp/ |
塑造 | 动词,不是名词「形状」 |
just say that |
— | 直接那么说就好 | 官方的方法论暗示 |
⭐⭐ block |
/blɑːk/ |
内容块 | ⭐ 响应结构核心词 |
loop(v.) |
/luːp/ |
循环 | 动词 |
check the type |
— | 检查类型 | block.type |
tool calls |
— | 工具调用(block 类型) | → 第 5 课 |
thinking |
— | 思考(block 类型) | → 第 6 课 |
spot(v.) |
/spɑːt/ |
发现、看出 | 不是名词「地点」 |
That's it. |
— | 就这样。 | |
⭐ endpoint |
/ˈendpɔɪnt/ |
接口、端点 | a summarize endpoint |
transcript |
/ˈtrænskrɪpt/ |
转录文本 | 不是「成绩单」 |
extract |
/ɪkˈstrækt/ |
提取 | extract insights and risks |
insights and risks |
— | 洞见与风险 | |
row |
/roʊ/ |
(数据库)一行 | 不是「划船」 |
⭐ route handler |
— | 路由处理函数 | 产品化包装层 |
wrapped in |
— | 被包装在……里 | |
dashboard |
/ˈdæʃbɔːrd/ |
仪表盘 | 第 1 课 Controls 成员,此处为产品 UI |
preview |
/ˈpriːvjuː/ |
预览 | |
Generate summary |
— | 生成摘要(按钮) | |
builds on this pattern |
— | 建立在这个模式之上 | Recap 第 5 条 |
✅ 本课进度
- [x] 全文精译与架构师级拆解(2026-10-14)
- [x] ⭐⭐ 记录必填三要素 vs 第 1 课四个控制权(辨析表)
- [x] ⭐⭐ 记录响应 block 数组与「循环 + 判类型」要求,并标注对第 1 课的修正
- [x] ⭐ 记录「从脚本到产品」端到端链路与
same call, route handler论断 - [x] ⭐⭐ 记录密钥管理安全考点(
.env.local/ hardcoding / version control) - [x] 英文原文已存:
17-English-02-Your-first-API-call.md - [x] 生词回灌
30-单词表/03-考试核心生词与术语表.md(2026-10-14 建表,301 条入速查区,⭐⭐ 28 条精讲) - [ ] 官方未提供
What you'll learn区块 —— 若后续页面补全,需回填
🔗 关联
- 本课英文原文:
17-English-02-Your-first-API-call.md✅ 已存 - 上一课:
03-第1课-What-is-the-AI-Platform.md(平台定义与三层架构) - 前向呼应:
tool calls→ 第 5 课What is tool use?;thinking→ 第 6 课What is thinking? - 课程大纲:01-课程导读与大纲全景
- 考纲:00-CCAR-P备考蓝图
⚠️ 语料说明:英文原文中的
the AI provider与model: "current-model"为抓取/去品牌化残留,已在代码段下方说明;其余英文引句均为官方原句,未作改动。