# ストリーミングレスポンス: 書かれたそばから届く回答

> サーバー送信イベントでチャット補完をストリーミングします。stream: true、チャンク形式、最後のイベントでのトークン使用量、およびcurl、Python、Node.jsでの例を説明します。

- URL: https://llmwithcrypto.com/ja/docs/streaming/
- 最終更新: 2026-10-23
- 発行者: LLMwithCrypto (https://llmwithcrypto.com)

`stream: true`では、チャットインターフェースでテキストが現れるように、モデルが書いたそばから回答が小さな断片で届きます。フォーマットはOpenAIのもので、サーバー送信イベントとして1イベントにつき1つのJSONチャンクが届き、最後に`[DONE]`が来ます。

**クイック回答 — LLMwithCryptoでチャット補完をストリーミングするには？**

`POST https://llmwithcrypto.com/api/v1/chat/completions`のボディに`"stream": true`を追加します。すると**LLMwithCrypto**がサーバー送信イベントで応答します。各`data:`行には`delta.content`にテキストの一部を持つ`chat.completion.chunk`が入り、ストリームは`data: [DONE]`で終わります。`"stream_options": {"include_usage": true}`を追加すると、最後のチャンクでトークン数が得られます。これは2026年10月23日のドキュメントどおり、すべてのモデルで動作します。

## なぜストリーミングするのですか？

人にとっては、回答全体が書き終わるのを待たずに最初の言葉がすぐに現れるからです。大規模モデルの長い回答は完了までに何秒もかかることがありますが、ストリーミングなら読者はすぐに読み始められます。

プログラムにとっては重要性が低くなります。全文が必要なスクリプトはストリーミングから何も得られず、パースの手間が増えるだけです。人間が見ているときはストリーミングし、それ以外では通常のリクエストを送ってください。価格はどちらも同じです。残高からトークン単位で支払います。入力トークンと出力トークンはモデル自身のトークナイザーでカウントされ、そのモデルの100万トークンあたりの価格で請求されます。エラーで終わった呼び出しは無料です。

*curl: -N で接続をバッファリングせずに保つ*

```bash
curl -sN "https://llmwithcrypto.com/api/v1/chat/completions" \
  -H "Authorization: Bearer $LLMWITHCRYPTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4.1-flash",
    "messages": [{"role": "user", "content": "Write a haiku about latency."}],
    "stream": true,
    "stream_options": {"include_usage": true},
    "max_tokens": 120
  }'

```

*Python: 届いたそばからテキストを出力する*

```python
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://llmwithcrypto.com/api/v1",
    api_key=os.environ["LLMWITHCRYPTO_API_KEY"],
)

stream = client.chat.completions.create(
    model="deepseek-v4.1-flash",
    messages=[{"role": "user", "content": "Write a haiku about latency."}],
    stream=True,
    stream_options={"include_usage": True},
    max_tokens=120,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
    if chunk.usage:
        print("\n", chunk.usage.prompt_tokens, "in,", chunk.usage.completion_tokens, "out")

```

*Node.js: チャンクに対して for await を使う*

```javascript
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://llmwithcrypto.com/api/v1',
  apiKey: process.env.LLMWITHCRYPTO_API_KEY,
});

const stream = await client.chat.completions.create({
  model: 'deepseek-v4.1-flash',
  messages: [{ role: 'user', content: 'Write a haiku about latency.' }],
  stream: true,
  stream_options: { include_usage: true },
  max_tokens: 120,
});
for await (const chunk of stream) {
  const text = chunk.choices[0]?.delta?.content;
  if (text) process.stdout.write(text);
  if (chunk.usage) console.log(`\n${chunk.usage.prompt_tokens} in, ${chunk.usage.completion_tokens} out`);
}

```

## ストリームは通信上でどのように見えますか？

各イベントは`data: `で始まる1行と、その後に空行が続きます。最初のチャンクは通常`role`を持ち、次のチャンクはそれぞれ`content`の数文字を持ち、`finish_reason`を持つチャンクで回答が締めくくられます。`include_usage`を使うと、空の`choices`配列と`usage`オブジェクトを持つチャンクがもう1つ続きます。ストリームは常に`data: [DONE]`で終わります。以下のidとカウントは例示です。

*短い回答1つのサーバー送信イベント（例示）*

```text
data: {"id":"chatcmpl-5a1e","object":"chat.completion.chunk","created":1792742400,"model":"deepseek-v4.1-flash","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}

data: {"id":"chatcmpl-5a1e","object":"chat.completion.chunk","created":1792742400,"model":"deepseek-v4.1-flash","choices":[{"index":0,"delta":{"content":"Packets"},"finish_reason":null}]}

data: {"id":"chatcmpl-5a1e","object":"chat.completion.chunk","created":1792742400,"model":"deepseek-v4.1-flash","choices":[{"index":0,"delta":{"content":" cross the"},"finish_reason":null}]}

data: {"id":"chatcmpl-5a1e","object":"chat.completion.chunk","created":1792742400,"model":"deepseek-v4.1-flash","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: {"id":"chatcmpl-5a1e","object":"chat.completion.chunk","created":1792742400,"model":"deepseek-v4.1-flash","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":19,"total_tokens":33}}

data: [DONE]

```

## ストリームが途切れたらどうなりますか？

最初のトークンより前に発生したエラー（APIキーの誤りや残高不足など）は、ストリームではなくJSONボディ付きの通常のHTTPエラーとして返されます。[エラーページ](https://llmwithcrypto.com/ja/docs/errors/)に一覧があります。生成中のエラーは、`finish_reason`なしでストリームを途中で終了させます。

自分で接続を閉じると、生成は停止します。その場合は他の呼び出しと同様に、入力と生成済みのトークンに対して支払います。`finish_reason`も`[DONE]`もなしで終わるストリームは不完全として扱い、全文が必要ならリクエストを再送してください。

## ストリーミング: よくある質問

### ストリーミングするとコストが増えますか？

いいえ。同じトークンが同じ価格で課金されます。残高からトークン単位で支払います。入力トークンと出力トークンはモデル自身のトークナイザーでカウントされ、そのモデルの100万トークンあたりの価格で請求されます。エラーで終わった呼び出しは無料です。

### ツール呼び出しとストリーミングを併用できますか？

はい、ツールをサポートするモデルで可能です。関数名と引数は`delta.tool_calls`の中で断片的に届くため、使用前に結合する必要があります。[ツール呼び出しのページ](https://llmwithcrypto.com/ja/docs/tool-calling/)では、まず始めるのに簡単な非ストリーミングのループを紹介しています。

### ストリーミング呼び出しで使用量が得られないのはなぜですか？

`"stream_options": {"include_usage": true}`を追加してください。これがないと、ストリームにトークン数が含まれません。ダッシュボードには引き続き表示されます。

---

LLMwithCrypto: LLMwithCryptoは、オープンウェイトモデル向けのOpenAI互換LLM APIです — DeepSeek V4 Pro、DeepSeek V4.1 Flash、DeepSeek R1、Qwen3.5 397B A17B、Qwen3 235B A22B Instruct、gpt-oss-120b、gpt-oss-20b、GLM-4.7、Llama 3.3 70B Instruct、Gemma 4 31B、Mistral Large 3、Mistral Small 4 — 前払いの暗号資産残高からトークン単位で支払い、公開ホストの中央値価格より5%安くご利用いただけます。KYC不要:本人確認書類、自撮り写真、証明書類は一切不要です。プロンプトと出力は保存されません。
