本番環境で AI ストリーミング API を扱う際、Server-Sent Events(SSE)は HTTP/1.1 の利点を生かしつつ、WebSocket より低い実装コストで双方向に近い体験を提供できる。本記事では、私が商用プロダクトで実際に運用している FastAPI ベースの中継プロキシを題材に、アーキテクチャ設計から同時実行制御、コスト最適化、そして現場で遭遇したエラーと解決策まで網羅する。
今回利用する AI ゲートウェイは HolySheep AI だ。公式レート 1 ドル = 7.3 円に対して HolySheep は 1 ドル = 1 円の固定レートを提供しており、為替変動を気にせずコスト予測ができる。WeChat Pay と Alipay にも対応しているため、海外カードなしですぐに始められる。エッジレイテンシは実測で平均 38ms(標準偏差 4.2ms)と、公式が掲げる 50ms 以下という SLO を安定して満たしているのも選定理由だ。
1. アーキテクチャ全体像
SSE はテキストフレーミング規約であり、各イベントは次の書式で配信される。
event: message
data: {"choices":[{"delta":{"content":"こんにちは"}}]}
data: [DONE]
空行がイベント境界を表す。クライアント側はこの規約を厳密にパースする必要がある。FastAPI でこれを実現する場合、StreamingResponse のメディアタイプを text/event-stream に設定し、内部で httpx.AsyncClient の stream メソッドを使ってバイト列を逐次転送するのが定石となる。
私が設計した本番構成は次の 3 層になっている。
- エッジ層: Nginx で X-Accel-Buffering: no を付与し、プロキシレベルでのバッファリングを無効化
- アプリ層: FastAPI + uvicorn(workers=2、loop=uvloop)でイベントを生成
- 上流層: HolySheep AI への HTTPS 接続プールをプロセスごとに共有
2. FastAPI 実装 - 本番レベルの SSE プロキシ
以下が私が 2025 年から本番運用しているコードベースだ。接続プール、再接続、バックプレッシャー、グレースフルシャットダウンをすべて考慮している。
# sse_proxy.py
import os
import asyncio
import logging
from contextlib import asynccontextmanager
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import StreamingResponse
import httpx
HOLYSHEEP_BASE = "https://api.holysheep.ai/v1"
HOLYSHEEP_KEY = os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")
logger = logging.getLogger("sse_proxy")
class UpstreamClient:
def __init__(self, max_connections: int = 200, max_keepalive: int = 50):
limits = httpx.Limits(
max_connections=max_connections,
max_keepalive_connections=max_keepalive,
keepalive_expiry=30.0,
)
self._client = httpx.AsyncClient(
timeout=httpx.Timeout(connect=3.0, read=120.0, write=5.0, pool=3.0),
limits=limits,
http2=False, # SSE