> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hostlinku.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ストリームモード

> HostlinkuとOpenAI SDKでSSEストリーミングを使用する方法（Python requests、curl、Node.js）。

ストリームモードでは、SSE（`text/event-stream`）を介して回答をトークン単位で送信します。回答全体が完了するのを待たずに、最初のトークンがより早く表示されます。`"stream": true`で有効にします。

## 概要：curl

```bash theme={null}
curl -N https://api.hostlinku.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-your-api-key" \
  -d '{
    "model": "gpt-5-5",
    "messages": [{ "role": "user", "content": "Hitung 1 sampai 5." }],
    "stream": true
  }'
```

フラグ `-N` は重要です。これがないと、curl はバッファが満杯になるか、ストリームが終了するまで出力を保留します。

チャンクの形式：

```text theme={null}
data: {"id":"cmpl_…","model":"gpt-5-5","choices":[{"index":0,"delta":{"content":"1"}}]}

data: [DONE]
```

## Python - SDK OpenAI

```python theme={null}
from openai import OpenAI

client = OpenAI(
    base_url="https://api.hostlinku.com/v1",
    api_key="sk-your-api-key",
)

stream = client.chat.completions.create(
    model="gpt-5-5",
    messages=[{"role": "user", "content": "Tulis satu paragraf pendek."}],
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta.content if chunk.choices else None
    if delta:
        print(delta, end="", flush=True)
```

## Python - requests

リクエストには`stream=True`を使用し、`iter_lines()`を読み取ってください。`data: [DONE]`を受信したら停止してください。

```python theme={null}
import json
import requests

response = requests.post(
    "https://api.hostlinku.com/v1/chat/completions",
    headers={
        "Authorization": "Bearer sk-your-api-key",
        "Content-Type": "application/json",
    },
    json={
        "model": "gpt-5-5",
        "messages": [{"role": "user", "content": "Halo!"}],
        "stream": True,
    },
    stream=True,
)

for line in response.iter_lines():
    if not line:
        continue
    text = line.decode("utf-8")
    if not text.startswith("data: "):
        continue
    payload = text[6:]
    if payload == "[DONE]":
        break
    chunk = json.loads(payload)
    if "error" in chunk:
        raise RuntimeError(chunk["error"])
    delta = chunk["choices"][0].get("delta", {}).get("content")
    if delta:
        print(delta, end="", flush=True)
```

## Node.js - SDK OpenAI

```js theme={null}
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.hostlinku.com/v1",
  apiKey: process.env.HOSTLINKU_API_KEY,
});

const stream = await client.chat.completions.create({
  model: "gpt-5-5",
  messages: [{ role: "user", content: "Halo!" }],
  stream: true,
});

for await (const chunk of stream) {
  const delta = chunk.choices[0]?.delta?.content;
  if (delta) process.stdout.write(delta);
}
```

## メモ Hostlinku

* ヘッダー `x-request-id` は、ストリーミング応答でも引き続き送信されます。
* ストリームが途中で失敗した場合、ゲートウェイは`data: {"error": {...}}`イベントを送信し、偽の`[DONE]`は**送信しない**。
* 料金は、ストリーミング終了後の実際の使用量に基づいて計算されます。使用量が確認できない場合は、予約時の推定値に基づいて請求されます。
* リバースプロキシやCDNでレスポンスをバッファリングしないでください。`text/event-stream`をそのまま転送してください。

いつストリーミングするのが良いでしょうか？

レスポンスの速さが求められるチャットアプリやエージェントには、`stream: true`を使用してください。進行状況が表示されないバッチ処理やジョブの場合は、非ストリーミングの方がシンプルです。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.