
要約 — このレッスンの要点
- ストリーミングとは、Claude の応答を生成しながら逐次受信する方式。ユーザーはすべて生成されるまで待たずに読み始められる。
- SDK では
client.messages.stream()を使う。内部的には Server-Sent Events(SSE) を利用している。 - Python では
stream.text_streamでテキストチャンクを反復処理できる。TypeScript では.on("text", ...)イベントハンドラが使える。 - ストリーミング自体には追加コストは発生しない。消費トークン数は非ストリーミングと同一。
- コード例は出典を一次情報とする。
なぜストリーミングを使うか
通常の messages.create() は応答全文が生成されてからレスポンスを返します。
長い出力の場合、ユーザーは数秒〜数十秒待たされる可能性があります。
ストリーミングを使うと、生成された文字が即座に届くため、
チャット UI などで体感的な速度が大幅に改善されます。
ストリーミングは SSE(Server-Sent Events) 形式で実装されています 出典。
Python — ストリーミングコード例
以下は公式ドキュメントのコード例に準拠した構成です 出典。
import anthropic
client = anthropic.Anthropic()
with client.messages.stream(
max_tokens=1024,
messages=[{"role": "user", "content": "日本の歴史について教えてください"}],
model="claude-opus-4-7",
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
text_stream はテキストチャンク(文字列)を順に yield するジェネレータです。
flush=True を指定することで、バッファリングなしに即時出力されます。
TypeScript — ストリーミングコード例
TypeScript では .on("text", ...) イベントハンドラでチャンクを受け取ります
出典。
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
await client.messages
.stream({
messages: [{ role: "user", content: "日本の歴史について教えてください" }],
model: "claude-opus-4-7",
max_tokens: 1024
})
.on("text", (text) => {
process.stdout.write(text);
});
最終メッセージの取得
ストリーム完了後に完全な Message オブジェクト(usage を含む)が必要な場合は、
stream.get_final_message()(Python)または
stream.finalMessage()(TypeScript)で取得できます。
# Python — ストリーム完了後の完全メッセージ取得
with client.messages.stream(...) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final = stream.get_final_message()
print(final.usage) # 使用トークン数を確認
使いどころの整理
| 方式 | 向いているケース |
|---|---|
| 非ストリーミング | バッチ処理・後処理が多い・応答全文が必要な場合 |
| ストリーミング | チャット UI・ターミナル出力・長文生成のリアルタイム表示 |