本番環境での初めてのAPI呼び出し(コストを意識して)
おもちゃのようなAPI呼び出しは1行で済みます。しかし本番環境の呼び出しは、エラーを処理し、出力をストリーミングし、コストを監視し、シークレットを安全に保ちます。それを順を追って構築しましょう。
ステップ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 — コストに気を配る
- トークン使用量をログに記録する(上記)ことで、各呼び出しのコストが分かります。
max_tokensとモデルを適切なサイズにし、焦点を絞ったプロンプトで入力を抑えましょう。- 安定した接頭辞が繰り返される場合は、プロンプトキャッシュを追加してください。
- トークンと料金およびコストとレイテンシを参照してください。
ステップ4 — 望ましくない経路に対処する
- 一時的なエラー(429/5xx)はバックオフ付きで再試行します(上記)。400系は再試行しないでください。
- 拒否を適切に処理しましょう。
- エージェント的なものにはタイムアウトとコスト/反復の予算を設定してください。
検証
実行してみましょう。ストリーミングされた出力、トークン使用量の行、そして意図的にエラーを発生させた場合(例: 不正なキー → クラッシュではなくきれいなメッセージ)の適切な挙動が見られるはずです。