エンドポイント
ストリーミング
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 を必ず確認してください。