你的第一个生产环境 API 调用(成本感知)
一个玩具级的 API 调用 只需一行代码。而生产环境的调用则需要处理错误、流式输出、监控成本,并妥善保管密钥。让我们一步步把它构建出来。
第 1 步 — 从配置中读取密钥与模型
export ANTHROPIC_API_KEY="sk-ant-..." # never in source control
把模型 ID 放在配置里,而不是散落在各处的字面量中,这样迁移就变得轻而易举(原因)。要慎重选择 —— 选择模型。
第 2 步 — 一个具备容错能力的流式调用
- Python
- TypeScript
import os, time, random, anthropic
client = anthropic.Anthropic()
MODEL = os.environ.get("CLAUDE_MODEL", "claude-sonnet-4-6")
def ask_stream(prompt, system=None, max_tokens=1024):
for attempt in range(5):
try:
with client.messages.stream(
model=MODEL, max_tokens=max_tokens,
system=system or anthropic.NOT_GIVEN,
messages=[{"role": "user", "content": prompt}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final = stream.get_final_message()
print()
usage = final.usage
print(f"\n[tokens in/out: {usage.input_tokens}/{usage.output_tokens}]")
return final
except (anthropic.RateLimitError, anthropic.APIStatusError):
if attempt == 4: raise
time.sleep(min(2 ** attempt + random.random(), 30))
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const MODEL = process.env.CLAUDE_MODEL ?? "claude-sonnet-4-6";
export async function askStream(prompt: string, system?: string, maxTokens = 1024) {
for (let attempt = 0; attempt < 5; attempt++) {
try {
const stream = client.messages.stream({ model: MODEL, max_tokens: maxTokens, system,
messages: [{ role: "user", content: prompt }] });
for await (const e of stream)
if (e.type === "content_block_delta") process.stdout.write(e.delta.text ?? "");
const final = await stream.finalMessage();
console.error(`\n[tokens in/out: ${final.usage.input_tokens}/${final.usage.output_tokens}]`);
return final;
} catch (e: any) {
if (attempt === 4 || ![429, 500, 529].includes(e?.status)) throw e;
await new Promise(r => setTimeout(r, Math.min(2 ** attempt * 1000, 30000)));
}
}
}
第 3 步 — 留意成本
- 记录 token 用量(如上),这样你就能看清每次调用的开销。
- 合理设置
max_tokens和模型;用精炼的提示词控制输入。 - 对于反复出现的稳定前缀,启用 提示词缓存。
- 参见 Token 与定价 和 成本与延迟。
第 4 步 — 处理异常路径
- 对瞬时性错误(429/5xx)使用退避策略重试(如上);不要重试 400 错误。
- 优雅地处理 拒绝响应。
- 为任何具有自主性(agentic)的流程设置超时和成本/迭代预算。
验证
运行它:你应该能看到流式输出、一行 token 用量信息,并且在你故意触发错误时(例如使用一个错误的密钥 → 得到清晰的提示信息,而不是崩溃)表现得优雅得体。