Cookieを使用しています. Cookieとブラウザストレージは、ログイン状態の維持と設定の保存に使われます。許可いただいた場合は、サイトの利用状況も計測します。はいつでも変更できます。詳しくはCookieポリシーをご覧ください。

ストリーミング

エンドポイント

ストリーミング

stream: true でトークンを順次受け取る方法です。Chat Completions、Responses、Completions に対応し、data: 行のイベント形式、data: [DONE] での終了、ストリームの課金、途中で起きるエラーを説明します。

プレイグラウンドで試す

Chat Completions、Responses、Completions で stream: true を設定すると、生成されたトークンを順次受け取れます。レスポンスは Server-Sent Events(Content-Type: text/event-stream)を使います。api14 は上流のバイトを届いた順にそのまま渡し、バッファリングしません。

import OpenAI from "openai";

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

const stream = await client.chat.completions.create({
  "model": "openai/gpt-5-mini",
  "messages": [
    {
      "role": "user",
      "content": "Explain vector databases in two sentences."
    }
  ],
  "stream": true
});

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

イベント形式

各イベントは、JSON のチャンクを含む data: 行です。ストリームは data: [DONE] で終了します。

data: {"id":"gen-1760000000-abc","object":"chat.completion.chunk","model":"openai/gpt-5-mini","choices":[{"index":0,"delta":{"role":"assistant","content":"Hel"}}]}

data: {"id":"gen-1760000000-abc","object":"chat.completion.chunk","model":"openai/gpt-5-mini","choices":[{"index":0,"delta":{"content":"lo!"}}]}

data: {"id":"gen-1760000000-abc","object":"chat.completion.chunk","model":"openai/gpt-5-mini","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":10,"completion_tokens":3,"total_tokens":13,"cost":0.0000085}}

data: [DONE]
  • [DONE] の直前の最後のチャンクに、USD の cost を含む usage が入っています。stream_options.include_usage は不要です。利用量の報告は常に有効です。
  • id はすべてのチャンクで同じです。これは生成情報の取得に渡せる生成 ID です。
  • 一部のプロバイダーは、接続を維持するために SSE のコメント行(: で始まる行)を送ります。SSE クライアントと OpenAI SDK はこれを無視します。ストリームを自分で解析する場合は、: で始まる行をスキップしてください。

ストリームの課金

ゲートウェイは、ストリームを転送しながら最後の usage チャンクを読み取り、ストリームが閉じた時点で残高から差し引きます。

切断しても課金は取り消されません。 ストリームが終わる前に接続を閉じても、上流のプロバイダーは生成を続け、課金する場合があります。その場合、api14 は生成レコードから料金を取得します。コストを抑えるには max_tokens を設定してください。

ストリーム中のエラー

無効なキー、残高不足、不明なモデルなど、最初のバイトより前に発生するエラーは、4xx または 5xx のステータスの通常の JSON エラーとして返されます。エラーを参照してください。プロバイダーがストリームの途中で失敗した場合、ストリームは error オブジェクトと finish_reason: "error" を含むチャンクで終了することがあります。

{ "error": { "code": 502, "message": "Provider disconnected" }, "choices": [{ "delta": { "content": "" }, "finish_reason": "error" }] }

最後のチャンクの finish_reason を必ず確認してください。

ヒント

  • プロキシやサーバーレスプラットフォームは、レスポンスをバッファリングすることがあります。ストリームをブラウザーに中継する場合は、レスポンスのバッファリングを無効にしてください(nginx なら X-Accel-Buffering: no など)。
  • ツール呼び出しは、delta.tool_calls のフラグメントとしてストリーミングされます。解析する前に、index ごとに arguments の文字列を結合してください。ツール呼び出しを参照してください。
  • 推論モデルは、回答の前に delta.reasoning で推論をストリーミングします。推論を参照してください。