Skip to content

OpenAI

マッピングしたモデルを、OPENAI_API_KEY を使って OpenAI Responses API へルーティングする — 変換、エフォート、トークンカウント、ツール検索。

Updated View as Markdown

組み込みの openai プロバイダーは、マッピングされたモデルの推論を OpenAI プラットフォーム API (api.openai.com) へルーティングし、OPENAI_API_KEY に対してトークン単位で課金されます。これは kind = "responses" のプロバイダーです。shunt は Claude Code の Anthropic Messages リクエストを OpenAI の Responses API へ変換し、応答をストリーミングで返しながら再び変換します — ツール、画像、 ストリーミングを含みます。

クイックスタート

コーディングエージェントにセットアップを任せることもできます — shunt add は組み込みのセットアップ ブループリントを出力します(オフラインかつ読み取り専用で、設定を編集するのはエージェントです。この コマンド自体は編集しません)。

shunt add upstream openai --print | claude

または、以下の手順に沿って手動で設定してください。

upstream を設定する

openai プリセットは kind = "responses"、base_url = "https://api.openai.com/v1"(shunt が後ろに /responses を追加します)、および OPENAI_API_KEY からの API キー認証を提供します。

[[upstreams]]
name = "anthropic"
provider = "anthropic"   # ルーティングされないモデル(例 claude-*)のデフォルトとして Anthropic を残す

[[upstreams]]
name = "openai"
provider = "openai"
# effort = "high"          # オプション: デフォルトの推論エフォート
# count_tokens = "tiktoken" # デフォルト。"estimate" にするとローカルカウントを使わない

順序付きの [[upstreams]] は shunt の組み込みプロバイダーを置き換えるため、設定側でフォールバック先の anthropic デフォルトも宣言する必要があります(server.default_provider のデフォルトは anthropic)。

明示的に指定したフィールドはプリセットのデフォルトを上書きします。従来の [providers.openai] テーブル形式も 引き続きサポートされます — ただし [[upstreams]] と [providers.*] を 1 つのファイルで混在させないで ください。

認証情報

キーは shunt を起動する環境でエクスポートしてください — 設定ファイルには決して書き込まないこと。

export OPENAI_API_KEY='...'

shunt check は設定の構造を検証しますが、キーの値は読み取りません — OPENAI_API_KEY が未設定の場合、 openai へルーティングされた最初のリクエストが認証エラーを返します。

モデルとルーティング

id を厳密に、あるいはプレフィックスでルーティングするか、model discovery へ Claude 名のエイリアスを広告します。

# 推奨: 広告 + ルーティング + 変換を 1 つの宣言で
[[models]]
id = "claude-gpt-5-4-via-openai"
display_name = "GPT-5.4 (via OpenAI)"

[models.upstream_model]
openai = "gpt-5.4"

# または、クライアントが送るすべての gpt-* id を受け止める
[[route_prefixes]]
prefix = "gpt-"
provider = "openai"

スラッグを選ぶ前に、あなたの OpenAI アカウントで現在利用できるモデルを確認してください。ChatGPT アカウントの Codex バックエンドとは異なり、プラットフォーム API は通常の公開スラッグを受け入れます。

推論エフォート、コンテキスト、トークンカウント

Responses の変換は、プロバイダー単位またはルート単位の推論エフォートダイヤル(low … max)と、Claude Code の コンテキスト会計が機能し続けるようローカルの tiktoken ベースの count_tokens をサポートします。どちらも他の Responses プロバイダーと共通で、Effort & Context に記載されています。

ツール検索。 Claude Code の ENABLE_TOOL_SEARCH=true を設定すると、shunt は Responses パスの遅延ツール ディスカバリーを、GPT-5.4 以降のモデルにおけるネイティブなクライアント実行 tool_search プロトコルへ マッピングします。このプロバイダーは api.openai.com を対象としており、これは未設定(“auto”)のデフォルトが tool_search アイテムを実装していると既に信頼している 2 つのホストのうちの 1 つです — もう 1 つは ChatGPT / Codex バックエンドです — そのためネイティブが自動的に有効になります。カスタムの OpenAI 互換 エンドポイント(LiteLLM、vLLM、OpenRouter、自己ホスト)は同じようには自動有効化されないため、オプトインに tool_search = true が必要です。ここで tool_search = false を設定すると、代わりにテキストシムを強制します。 ツール検索を参照してください。

ストップシーケンス

Responses API には stop パラメーターがありません — Chat Completions にはありますが、Responses にはありません — そのため、クライアントの Anthropic stop_sequences をアップストリームへ渡すことは できません。代わりに shunt が Responses の変換内でゲートウェイ側からこれをエミュレートします。 すべての Responses プロバイダーと、すべてのトランスポート(HTTP と WebSocket、ストリーミングと 非ストリーミング)が対象です。

  • アシスタントのテキストは、いずれかのストップシーケンスが最初に現れた位置で打ち切られ、それ以降の テキストがクライアントへ届くことはありません。
  • ターンは stop_reason: "stop_sequence" と、一致した文字列を示す stop_sequence で終了します。 ネイティブの Anthropic アップストリームが報告するのとまったく同じ形です。
  • 一致した時点でアップストリームのリクエストを中断し、走らせたままにはしません — ストリーミング HTTP と 2 つの WebSocket パスが対象です。非ストリーミング HTTP は例外で、レスポンスボディを すべて読み終えてから変換するため、打ち切り自体は他のパスと同じですが、アップストリームは最後 まで実行されます。一致から中断までの間にアップストリームが生成したトークンは、引き続き アップストリーム側で課金されます。ストップシーケンスを使う典型的な短い応答では、無視できる量 です。

注意点がひとつあります。ストップによって、アップストリームの response.completed の使用量が反映 される前にターンが終わるため、shunt は自前のローカル入力推定値で代替し、output_tokens: 0 を報告 します — ストリーミングのターンでは message_delta.usage に、非ストリーミングのターンでは レスポンスの usage に入ります。この推定値にはプロバイダーの count_tokens = "tiktoken" の オプトインが必要で、有効にしていない場合、ストップしたターンは input_tokens: 0 を報告します。

検証

shunt check    # -> config ok
shunt run
curl -sS http://127.0.0.1:3001/v1/models
curl -sS http://127.0.0.1:3001/v1/messages \
  -H 'anthropic-version: 2023-06-01' \
  -H 'content-type: application/json' \
  -d '{"model":"claude-gpt-5-4-via-openai","max_tokens":16,"messages":[{"role":"user","content":"Reply with OK."}]}'

レスポンスの x-gateway-upstream ヘッダーが openai を示すことを確認したら、 Claude Code を shunt へ向けてください。

Navigation

Type to search…

↑↓ navigate↵ selectEsc close