Base URL and SDK Migration2026幎7月27日Flatkey Team

OpenAIクラむアント移行: RPM、TPM、再詊行動䜜を維持する

RPM、TPM、タむムアりト、ストリヌミング、バックオフ、カナリア、ロヌルバックを確認しながら、再詊行の連鎖を防ぎ぀぀OpenAI圢匏のクラむアントを統合ゲヌトりェむぞ移行したす。

OpenAIクラむアント移行: RPM、TPM、再詊行動䜜を維持する

OpenAIクラむアント移行は、2぀の蚭定倉曎だけで完了したように芋えるこずがありたす。APIキヌを眮き換え、SDKの向き先を新しいベヌスURLに倉えるだけです。最初のリク゚ストは成功し、レスポンスの圢も芋慣れたもので、プルリク゚ストはそのたたマヌゞできそうに芋えたす。

それはむンタヌフェヌス互換性があるこずを蚌明するだけです。本番動䜜が維持されるこずを蚌明するものではありたせん。

OpenAIクラむアント移行でより難しいのは、トラフィックが偏ったずきに䜕が起こるかを維持するこずです。リク゚ストがバヌストで到着する、プロンプトが倧きくなる、ストリヌムが想定より長く続く、プロバむダが429を返す、たたは凊理がすでに始たっおいる可胜性があるのにレスポンスがタむムアりトする――こうした状況です。SDK、アプリケヌション、ゞョブキュヌがそれぞれ独立に再詊行するず、1回の倱敗がほが同時の耇数回の詊行に倉わり埗たす。

このチュヌトリアルでは、既存のOpenAI颚のPythonたたはTypeScript統合を、レヌト制限ず再詊行動䜜を明瀺しながら統合ゲヌトりェむぞ移行する方法を瀺したす。䟋ではFlatkeyのOpenAI互換ベヌスURLを䜿甚したすが、レビュヌ手法はどのゲヌトりェむ移行にも適甚できたす。

クむックアンサヌ: 䜕を倉曎すべきか?

安党なOpenAIクラむアント移行のためには、ベヌスURLを倉曎のすべおずみなすのではなく、これらの蚭定をたずめお確認しおください。

移行察象 確認すべき内容 安党な開始時の刀断
API゚ンドポむント ベヌスURLず認蚌 コヌド䞭に散圚するリテラルではなく、環境倉数経由で倉曎する
モデル遞択 正確なモデル識別子ずサポヌトされるパラメヌタ カナリア甚に既知のモデルを1぀固定する
SDKの再詊行 自動再詊行回数ず再詊行察象のステヌタスコヌド 再詊行をSDKに持たせるか、アプリケヌションに持たせるかを決める
アプリケヌションの再詊行 バックオフ、ゞッタヌ、詊行回数䞊限、再詊行予算 再詊行の責任者を1぀にし、すべおの詊行をログに蚘録する
RPM制埡 リク゚スト到着率ずバヌストサむズ 切り替え前に同時実行数たたはキュヌの䞊限を远加する
TPM制埡 プロンプトず予想出力トヌクン数 1行のスモヌクテストだけでなく、珟実的な倧きなプロンプトをテストする
タむムアりト 接続、読み取り、合蚈リク゚スト時間 同期呌び出しずストリヌミング呌び出しに明瀺的な倀を蚭定する
可芳枬性 リク゚ストID、詊行回数、トヌクン、レむテンシ、最終結果 クラむアントのログずゲヌトりェむの䜿甚ログを比范する

たず略語レベルの説明が必芁なら、LLM rate limits explained: RPM, TPM, and retriesを読んでください。このガむドは、その解説の続き、぀たり移行差分ず本番テスト蚈画の段階から始めたす。

ベヌスURLの差し替えは必芁だが、それだけでは䞍十分な理由

Flatkeyのクむックスタヌトでは、最小限のクラむアント倉曎が蚘茉されおいたす。OpenAI SDKのリク゚ストパタヌンは維持し、ベヌスURLをhttps://router.flatkey.ai/v1に蚭定したす。たた、リク゚スト埌にUsage Logsを確認し、モデル、トヌクン数、レむテンシ、コストを怜蚌するこずも掚奚しおいたす。

それは正しいスモヌクテストです。本番のOpenAIクラむアント移行では、さらに4぀の質問が必芁です:

  1. SDK は 429、タむムアりト、たたはサヌバヌ゚ラヌを自動的に再詊行したすか?
  2. 別の局も同じ倱敗した操䜜を再詊行したすか?
  3. 同時実行数はリク゚ストレヌト、トヌクンレヌト、たたはその䞡方で制限されおいたすか?
  4. 1 ぀の論理操䜜ず、その個々の詊行を区別できたすか?

公匏の OpenAI Python および Node SDK のドキュメントでは、珟圚、429 応答、接続゚ラヌ、タむムアりト、いく぀かのサヌバヌ゚ラヌを含む特定の倱敗は、デフォルトで 2 回再詊行されるず蚘茉されおいたす。どちらの SDK も再詊行ずタむムアりトの蚭定を公開しおいたす。このデフォルトは盎接統合する堎合には䟿利ですが、自分のコヌドですでにバックオフを実装しおいるず、芋えない増幅になるこずがありたす。

移行の目的は「すべおの再詊行を無効化する」こずではありたせん。目的は「どの局が再詊行を担圓するのかを把握する」こずです。

Step 1: コヌドを倉曎する前に、すべおの再詊行レむダヌを棚卞しする

たず、実際の呌び出し経路を描き出したす。

user action or job
  -> application retry wrapper
  -> queue delivery retry
  -> OpenAI SDK retry
  -> gateway
  -> provider

各レむダヌごずに、次を蚘録したす。

  • どの゚ラヌで再詊行が発生するか。
  • 最倧詊行回数。
  • 遅延が固定スリヌプ、指数バックオフ、たたはゞッタヌのどれを䜿うか。
  • サヌバヌが提䟛する Retry-After 倀を尊重するか。
  • 同じ操䜜 ID が詊行間で保持されるか。
  • タむムアりトしたリク゚ストを、実際の凊理が始たる前に倱敗したず芋なすか。

最埌の前提は危険です。クラむアントのタむムアりトは、クラむアントが埅機をやめたこずを瀺すだけです。䞊流システムは、ただリク゚ストを受け付けおいたり、完了しおいたりする可胜性がありたす。生成コンテンツでは、そのため再詊行によっお別の結果ず別の課金察象リク゚ストが発生し、アプリケヌション䞊では 1 ぀の論理タスクしか芋えおいなくおもそうなりえたす。

最悪時の増幅を芋積もる

キュヌが 1 ぀のゞョブを 3 回配信でき、アプリケヌションのラッパヌが 3 回の詊行を蚱可し、SDK が初回呌び出しに加えお 2 回の再詊行を行うずしたす。最悪の堎合、1 ぀の論理ゞョブは次を匕き起こせたす。

3 queue deliveries × 3 application attempts × 3 SDK attempts = 27 HTTP attempts

実際にこの最倧倀に達しないこずはあっおも、この掛け算は、短い 429 が再詊行の嵐に倉わる理由を説明したす。その数を移行レビュヌに曞き蟌みたしょう。隠れたデフォルトが芋えるようになりたす。

Step 2: ゚ンドポむント蚭定を構成に移す

移行差分は元に戻せるようにしおおきたす。コヌドベヌス党䜓で゚ンドポむント文字列を眮き換えないでください。

Python の前埌

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["LLM_API_KEY"],
    base_url=os.environ.get("LLM_BASE_URL", "https://api.openai.com/v1"),
    max_retries=0,
    timeout=45.0,
)

Flatkey のカナリアでは、次のように蚭定したす。

export LLM_API_KEY="$FLATKEY_API_KEY"
export LLM_BASE_URL="https://router.flatkey.ai/v1"

TypeScript の前埌

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.LLM_API_KEY,
  baseURL: process.env.LLM_BASE_URL ?? "https://api.openai.com/v1",
  maxRetries: 0,
  timeout: 45_000,
});

これらの䟋では SDK の再詊行回数を 0 に蚭定しおいたす。これは、次のセクションでアプリケヌションに明瀺的な再詊行の責任を持たせるためです。アプリケヌション偎に再詊行レむダヌがない堎合は、代わりに SDK の再詊行を䞊限付きで維持できたす。誀っお䞡方を有効にしないでください。

より広い互換性チェックリストに぀いおは、OpenAI Compatible API Gateway: Migration Checklist for Minimal Code Changes を参照しおください。

Step 3: 1 ぀のレむダヌに明瀺的に再詊行の責任を持たせる

有甚な再詊行ポリシヌは次の 5 ぀の芁玠で構成されたす。

  1. 再詊行可胜な障害の短い䞀芧。
  2. 厳栌な詊行䞊限。
  3. 最倧総再詊行時間。
  4. ゞッタヌ付き指数バックオフ。
  5. すべおの詊行に察する構造化ログ。

以䞋は、同期チャット呌び出し甚の小さな Python ラッパヌです。

import random
import time
from openai import APITimeoutError, APIConnectionError, APIStatusError, RateLimitError

RETRYABLE_STATUS_CODES = {408, 409, 429, 500, 502, 503, 504}


def create_chat_with_retry(client, *, model, messages, max_attempts=4):
    started_at = time.monotonic()

    for attempt in range(1, max_attempts + 1):
        try:
            return client.chat.completions.create(
                model=model,
                messages=messages,
            )
        except (RateLimitError, APITimeoutError, APIConnectionError) as error:
            retryable = True
            caught_error = error
        except APIStatusError as error:
            retryable = error.status_code in RETRYABLE_STATUS_CODES
            caught_error = error

        if not retryable or attempt == max_attempts:
            raise caught_error

        exponential_delay = min(2 ** (attempt - 1), 16)
        jitter = random.uniform(0, 0.5 * exponential_delay)
        sleep_seconds = exponential_delay + jitter

        print({
            "event": "llm_retry",
            "attempt": attempt,
            "next_delay_seconds": round(sleep_seconds, 2),
            "elapsed_seconds": round(time.monotonic() - started_at, 2),
            "error_type": type(caught_error).__name__,
        })
        time.sleep(sleep_seconds)

    raise RuntimeError("unreachable")

これは、レビュヌ可胜な出発点ずしお扱っおください。普遍的なポリシヌではありたせん。本番環境では、ロヌカルで蚈算した遅延にフォヌルバックする前に、有効な Retry-After レスポンスヘッダヌを解析しお尊重しおください。再詊行が補品で蚱容できるレむテンシを超えないように、総経過時間の予算も远加しおください。

すべおの゚ラヌを再詊行しない

Failure Default action Why
400 invalid request 倉曎せずに再詊行しない ペむロヌドを倉曎する必芁があるため
401 authentication 倉曎せずに再詊行しない キヌたたはヘッダヌを倉曎する必芁があるため
404 model not found 倉曎せずに再詊行しない モデル識別子たたはアクセス暩を倉曎する必芁があるため
429 rate limit 遅延ずゞッタヌを付けお再詊行する 空き容量が利甚可胜になる可胜性があるため
500 or 503 小さな予算内で再詊行する 障害が䞀時的である可胜性があるため
Client timeout 慎重に再詊行する 䞊流のリク゚ストはすでに実行されおいる可胜性があるため

Flatkey のクむックスタヌトでは、429 に察しお同じ高レベルのガむダンスが瀺されおいたす。぀たり、指数バックオフずゞッタヌを䜿っお再詊行するずいうこずです。移行に特有の远加点は、そのポリシヌを実行するレむダヌを 1 ぀だけにするこずです。

ステップ 4: RPM ず TPM の䞡方の同時実行のサむズを蚭定する

OpenAI client migration では、リク゚スト構文を維持しながら容量の䞊限が倉わる堎合がありたす。RPM ず TPM は異なるワヌクロヌドを制玄したす。

  • 少量のリク゚ストを倚数送る堎合は、RPM がボトルネックになりたす。
  • プロンプト、出力、䞊列評䟡が倧きい堎合は、TPM がボトルネックになりたす。

単䞀の平均倀ではなく、芳枬されたトラフィックを䜿いたす。少なくずも次を収集しおください。

  • 䞭倮倀ずピヌク時の 1 分あたりリク゚スト数。
  • p50、p95、最倧倀の入力トヌクン数。
  • p50 ず p95 の出力トヌクン数。
  • リク゚スト所芁時間の䞭倮倀ず p95。
  • 同時ストリヌム数。

抂算の同時実行䞊限は、各制限から次のように芋積もれたす。

RPM ベヌスの同時実行数 ≈ (RPM / 60) × 平均リク゚スト秒数

TPM ベヌスの同時実行数 ≈ (TPM / リク゚ストあたりの平均トヌクン数 / 60)
                        × 平均リク゚スト秒数

初期䞊限ずしおは䜎い方の結果を䜿い、その埌、バヌストや再詊行のための䜙裕を残しおください。

䟋: あるルヌトが 600 RPM ず 300,000 TPM を蚱容し、平均リク゚ストが合蚈 1,500 トヌクンを䜿甚し、平均所芁時間が 3 秒だずしたす。

RPM 侊限: (600 / 60) × 3 = 30 同時リク゚スト
TPM 侊限: (300,000 / 1,500 / 60) × 3 = 10 同時リク゚スト

この䟋では、より厳しい制玄は TPM です。RPM が十分に倧きく芋えるからずいっお 30 同時リク゚ストから始めるず、回避可胜な 429 応答が発生したす。

この蚈算は方向性を瀺すものであり、プロバむダヌの保蚌ではありたせん。プロバむダヌは、ロヌリングりィンドり、トヌクンバケット、入力トヌクンず出力トヌクンの個別制限、モデル固有のプヌル、たたはアクセラレヌション制埡を䜿甚する堎合がありたす。テスト蚈画では、遞択したモデルずアカりントに察する実際の動䜜を怜蚌する必芁がありたす。

ステップ 5: ストリヌミングずタむムアりトの動䜜を個別にテストする

ストリヌミングではない呌び出しが成功したからずいっお、ストリヌミングも安党だず刀断しないでください。

ストリヌミング芁求では、次をテストしおください。

  • 最初のトヌクンたでの時間。
  • チャンク間の最倧無通信間隔。
  • クラむアントの読み取りタむムアりト。
  • コンシュヌマヌが切断されたずきの動䜜。
  • 再詊行ラッパヌが誀っお 2 本目のストリヌムを開始しないか。
  • 郚分的な出力が保持されるか、砎棄されるか、ナヌザヌに衚瀺されるか。

郚分的な出力の埌に倱敗したストリヌムは、䜕も出力される前に倱敗したリク゚ストずは同等ではありたせん。自動で再詊行するず、重耇したテキストが衚瀺されたり、異なる続きを生成したりする可胜性がありたす。補品ずしお再詊行するのか、ナヌザヌに確認するのか、それずも郚分結果を衚瀺するのかを決めおください。

たた、SDK のタむムアりトずむンフラのタむムアりトは異なる堎合があるこずも忘れないでください。リバヌスプロキシ、サヌバヌレスプラットフォヌム、ゞョブワヌカヌ、たたはブラりザヌ接続は、クラむアントラむブラリが自身のタむムアりトに達する前に終了するこずがありたす。OpenAI client migration の間は、完党なリク゚スト経路における最小のタむムアりトを蚘録しおください。

ステップ 6: 広範囲のトラフィックの前にカナリア マトリックスを実行する

1 ぀の固定モデルず少量のトラフィックを䜿甚しおください。最初のカナリアで答えるべきなのは、新しいルヌトが動䜜を維持するかどうかであり、すべおのモデルが動䜜するかどうかではありたせん。

テストケヌス 入力 期埅される蚌跡
認蚌 有効なキヌず無効なキヌ 成功に加え、再詊行されない 401
モデル怜蚌 有効なモデルIDずスペルミスのあるモデルID 成功に加え、再詊行されないモデル゚ラヌ
小芏暡リク゚ストバヌスト 倚数の短いプロンプト 再詊行スパむクのない制埡されたキュヌむング
倧芏暡プロンプトバヌスト より少数の高トヌクンプロンプト TPM ぞの圧力が可芖化され、か぀䞊限がある
匷制 429 カナリアの䞊限を䞀時的に超える 1぀の再詊行所有者、ゞッタヌ付き遅延、䞊限付き詊行回数
匷制タむムアりト 意図的に短いクラむアントタむムアりトを蚭定する 無制限の再実行を䌎わないタむムアりトの蚘録
ストリヌミング䞭断 ストリヌム䞭に切断する 明瀺的な郚分出力の挙動
サヌバヌ゚ラヌ 503 を泚入たたはシミュレヌトする 䞊限付き再詊行ず最終゚ラヌ報告
ロヌルバック 以前のベヌスURLを埩元する 蚭定のみのロヌルバックが成功する

各論理操䜜に぀いお、次をログに蚘録したす。

operation_id
attempt_number
base_url_name
model_requested
http_status
input_tokens
output_tokens
latency_ms
retry_delay_ms
final_outcome

次に、アプリケヌションログず Flatkey Usage Logs を比范したす。件数は敎合しおいるはずです。1぀のアプリケヌション操䜜が耇数のゲヌトりェむリク゚ストに察応する堎合は、再詊行の蚈枬がその理由を説明できる必芁がありたす。

ステップ 7: ロヌルアりトずロヌルバックのしきい倀を定矩する

OpenAI client migration には、最初のカナリア開始前に数倀ベヌスの停止条件を蚭定しおおく必芁がありたす。

しきい倀の䟋:

  • 最終゚ラヌ率が合意枈みの割合ポむントを超えお䞊昇した堎合はロヌルバックする。
  • 1操䜜あたりの詊行回数が想定再詊行予算を超えた堎合は䞀時停止する。
  • p95 レむテンシが補品のタむムアりト予算を超えた堎合は䞀時停止する。
  • 成功した操䜜あたりのトヌクン䜿甚量が予期せず倉化した堎合は䞀時停止する。
  • ストリヌミング経路ず非ストリヌミング経路の䞡方が合栌しおからトラフィックを拡倧する。

生の 429 件数だけを比范するのは避けおください。適切なキュヌにより、遅延リク゚ストが䞀時的に増えおも最終゚ラヌは枛る可胜性がありたす。詊行レベルず操䜜レベルの䞡方の結果を远跡しおください。

移行PRチェックリスト

このチェックリストを実装PRにコピヌしおください。

  • ベヌスURLずキヌは環境倉数から取埗する。
  • カナリアは正確に怜蚌枈みのモデル識別子を䜿甚する。
  • 再詊行を担圓する局は1぀だけにする。
  • SDK の再詊行デフォルトはPR内で文曞化する。
  • 429、タむムアりト、5xx の挙動には䞊限付き詊行回数を蚭定する。
  • バックオフにはゞッタヌを含め、存圚する堎合は Retry-After を尊重する。
  • RPM ず TPM の䞊限は芳枬枈みトラフィックから芋積もる。
  • ストリヌミングには別の障害テストを甚意する。
  • 各詊行は1぀の論理 operation_id を共有する。
  • Usage logs ずアプリケヌションログを比范する。
  • ロヌルアりトずロヌルバックのしきい倀を開始前に蚘茉する。
  • 远加のコヌド倉曎なしで以前の゚ンドポむントを埩元できる。

䞀般的な移行ミス

SDK の再詊行ずアプリケヌションの再詊行を合蚈倀を蚈算せずに䜵甚する

これは最も重芁なレビュヌ指摘です。デフォルトは、ロヌカル関数内で芋えなくおも、䟝然ずしお振る舞いそのものです。

小さなプロンプトだけをテストする

1行のリク゚ストでは、認蚌情報ずレスポンスの互換性は確認できたす。しかし、TPM の圧迫、出力䞊限、長いストリヌム、p95 レむテンシに぀いおはほずんど䜕も分かりたせん。

認蚌゚ラヌず怜蚌゚ラヌを再詊行する

バックオフでは、無効なキヌ、未察応のパラメヌタ、スペルミスのあるモデルは修埩できたせん。倉曎されおいないペむロヌドを再詊行するず、容量を無駄にし、実際の欠陥を隠しおしたいたす。

タむムアりトを、リク゚ストが実行されなかった蚌拠だずみなす

䞊流偎が呌び出しを受け付けた埌でも、クラむアントは埅機をやめるこずがありたす。この曖昧さを前提に、再詊行ず集蚈を蚭蚈しおください。

゚ンドポむント、モデル、プロンプト、再詊行ポリシヌを1回のリリヌスで倉曎する

そうするず、倱敗の原因を切り分けにくくなりたす。たずは既知の1぀のリク゚スト圢状を移行し、その埌、ルヌトの挙動が可芖化できおからモデル遞択を広げおください。

“OpenAI互換”のより安党な定矩

移行蚈画においお、“OpenAI互換”ずは、コヌド倉曎を枛らせる皋床にむンタラクションのパタヌンが十分に銎染み深いこずを意味すべきです。すべおのプロバむダヌが同䞀のクォヌタ、トヌクンカりント、゚ラヌ意味論、レむテンシ、ストリヌミング動䜜、たたはパラメヌタ察応を共有しおいるずいう玄束ずしお解釈すべきではありたせん。

この区別があるず、OpenAIクラむアント移行のレビュヌはしやすくなりたす。圹立぀堎所では安定したむンタヌフェヌスを維持し぀぀、プロバむダヌやルヌトによっお差が出る運甚䞊の契玄はテストしおください。

Flatkey は、1぀の OpenAI 互換ベヌスURLの背埌でアクセスず課金を à€•à¥‡à€‚à€Šé›†çŽ„ã—ã€ã‚¯ãƒ©ã‚€ã‚¢ãƒ³ãƒˆã®å·®åˆ†ã‚„åŸŒç¶šã®ãƒ¢ãƒ‡ãƒ«æ‹¡åŒµã‚’ç°¡å˜ã«ã§ããŸã™ã€‚ãã‚Œã§ã‚‚å¿…èŠãªã‚šãƒ³ã‚žãƒ‹ã‚¢ãƒªãƒ³ã‚°äœœæ¥­ã¯ã€æœ¬ç•ªãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚’ç§»ã™å‰ã«ã€å†è©Šè¡Œã€ã‚¹ãƒ«ãƒŒãƒ—ãƒƒãƒˆã€å¯èŠ³æž¬æ€§ã‚’æ˜Žç€ºã™ã‚‹ã“ãšã§ã™ã€‚

それが、本番のOpenAIクラむアント移行が満たすべき基準です。぀たり、明瀺的な運甚蚌拠に裏付けられた小さなむンタヌフェヌス倉曎です。

カナリア甚のモデルを遞ぶ際はFlatkey の料金ペヌゞを確認し、コヌドレビュヌでチェックリストが通過し、ルヌトの挙動がログで確認できおから移行を承認しおください。

よくある質問

移行䞭に OpenAI SDK の再詊行を無効化すべきですか

アプリケヌションやキュヌがすでに再詊行を担っおいるなら無効化しおください。ほかのレむダヌが再詊行しないなら、䞊限付きの SDK 再詊行は劥圓な堎合がありたす。重芁なのは、独立した再詊行の責任者を耇数持たないこずです。

移行時の RPM ず TPM の違いは䜕ですか

RPM はリク゚スト頻床を制限し、TPM はトヌクンスルヌプットを制限したす。小さく高頻床の呌び出しはたず RPM に達するこずがあり、少数の倧きなプロンプトや出力はたず TPM に達するこずがありたす。䞡方のワヌクロヌド圢状をテストしおください。

429 は垞に再詊行すべきですか

再詊行ずレむテンシの予算内に収たる堎合に限りたす。利甚可胜なら Retry-After を尊重し、そうでなければゞッタヌ付き指数バックオフを䜿っおください。操䜜がもはや補品のレむテンシ目暙を満たせないなら停止しおください。

タむムアりトした生成は安党に再詊行できたすか

確実にはできたせん。クラむアントがタむムアりトしおも、䞊流のリク゚ストは実行されおいた可胜性がありたす。再詊行は重耇リク゚ストの可胜性ずしお扱い、各詊行の関係をログに蚘録しおください。

最小限で安党なカナリアずは䜕ですか

1぀の固定モデル、1぀のリク゚スト圢状、明瀺的な再詊行の責任分担、同時実行数の䞊限、そしお 429、タむムアりト、ストリヌミング䞭断、ロヌルバックのテストを䜿甚したす。トラフィックを拡倧する前に、クラむアント偎の詊行回数をゲヌトりェむの䜿甚ログず比范しおください。

情報源

OpenAIクラむアント移行: RPM、TPM、再詊行動䜜を維持する | flatkey.ai