あらゆる主要クラウド AI サービスに対するローカルの OpenAI 互換プロキシを実行します。API キーを一度保存すれば、デスクトップ、モバイル、Web を問わずクライアントアプリは各ツールでキーを登録する代わりに http://localhost と通信できます。
はじめに
1. アプリの起動
AIProxyServer を開きます。初回起動時にプロキシは自動で開始し、ローカルマシンのポート 8421 で待ち受けます。メインウィンドウには 3 つのセクションがあります。
- Proxy Server — 現在の状態、ベース URL、リスナーを開始/停止するボタン
- Bearer Token — 認証のオン/オフ切替とトークン表示
- Providers — サポートされるすべてのクラウド AI プロバイダー。各行に Set API Key ボタン
2. 最初の API キーを追加する
- Providers リストから任意のプロバイダーを選択(例: OpenAI (ChatGPT))
- Get API key をクリックしてブラウザでプロバイダーのコンソールを開き、キーを作成またはコピーします
- 同じ行の Set API Key をクリックし、ダイアログに値を貼り付けます
- Save をクリック。ステータスラベルが緑の Configured に変わります
3. クライアントアプリの接続
任意の OpenAI 互換クライアントをプロキシに向けます。ベース URL は http://localhost:8421/<provider>/v1 です。provider 部分がどのクラウドにリクエストを送るかを決定します。
# 例: プロキシに向けた OpenAI Python SDK
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8421/openai/v1",
api_key="not-used-but-required-by-sdk",
)
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hello"}],
)
print(resp.choices[0].message.content)
クライアントが実際のキーを目にすることはありません。AIProxyServer がリクエストを転送する際に上流の認証情報を付加します。
インターフェース概要
Proxy Server パネル
| 項目 | 説明 |
|---|---|
| Status | リスナーが動作中のときは Running、停止中は Stopped。 |
| Base URL | クライアントアプリが使うべきアドレス。ホスト名とポートを含みます。Copy をクリックするとクリップボードにコピーします。 |
| Start / Stop ボタン | アプリを終了せずに HTTP リスナーを切り替えます。 |
Bearer Token パネル
- Require Bearer Token authentication — 認証のオン/オフを切り替えるチェックボックス。ローカル利用を手軽にするためデフォルトはオフ。
- Token field — 現在のトークンを読み取り専用で表示。ドットで表示されるので Copy で取得します。
- Regenerate — 新しいランダムトークンを発行します。既存のクライアントは新しい値で更新する必要があります。
Providers パネル
サポートされる各クラウドプロバイダーごとに 1 行表示されます。各行には次が表示されます。
- 表示名(例: Claude (Anthropic))
- 設定状態 — API キーが保存されていれば緑の Configured、なければグレーの Not configured
- クライアントが使う URL パス(例:
/anthropic/v1/chat/completions) - Set API Key — 認証情報入力ダイアログを開きます
- Get API key — ブラウザでプロバイダーのコンソールを開きます
サポート対象プロバイダー
11 種類のクラウド AI サービスをバンドルしています。多くは OpenAI Chat Completions 形式をネイティブに使用しており、そのまま中継されます。3 つ(Anthropic、Gemini、ERNIE)は独自プロトコルを使用しますが、AIProxyServer がリクエストとレスポンスを即座に変換するため、クライアントから見えるのは常に OpenAI 形式です。
| プロバイダー | ルートプレフィックス | 必要なもの |
|---|---|---|
| OpenAI (ChatGPT) | /openai/v1 | platform.openai.com の API キー |
| Claude (Anthropic) | /anthropic/v1 | Anthropic Console の API キー |
| Gemini (Google) | /gemini/v1 | Google AI Studio の API キー |
| Grok (xAI) | /grok/v1 | xAI Console の API キー |
| Azure OpenAI (Copilot) | /copilot/v1 | API キーとデプロイメントのエンドポイント URL |
| Perplexity | /perplexity/v1 | Perplexity 設定の API キー |
| Groq | /groq/v1 | Groq Cloud の API キー |
| DeepSeek | /deepseek/v1 | DeepSeek Platform の API キー |
| Kimi (Moonshot) | /kimi/v1 | Moonshot Console の API キー |
| Qwen (DashScope) | /qwen/v1 | Alibaba DashScope の API キー |
| ERNIE (Baidu) | /ernie/v1 | Baidu Qianfan の API Key と Secret Key の両方 |
プロバイダー固有のメモ
- Azure OpenAI — Endpoint Base URL フィールドにデプロイメントの完全なエンドポイントを貼り付けます。例:
https://my-resource.openai.azure.com/openai/deployments/gpt-4o。プロキシが/chat/completions?api-version=2024-02-01を自動的に付加します。 - ERNIE — Baidu Qianfan は OAuth を使用するため、API Key と Secret Key の両方が必要です。AIProxyServer がアクセストークンの取得とキャッシュをバックグラウンドで行います。
- Gemini — 認証は URL クエリパラメータで行われ、プロキシが自動で付加します。無料枠の毎分クォータは引き続き適用されます。
API リファレンス
エンドポイント
| メソッド | パス | 説明 |
|---|---|---|
| GET | /health | 稼働確認。サービス状態とプロバイダー一覧を返します。認証不要。 |
| GET | /v1/providers | 設定済みプロバイダーとメタデータ。 |
| GET | /<provider>/v1/models | 指定プロバイダーのモデル一覧を OpenAI 形式で返します。 |
| POST | /<provider>/v1/chat/completions | OpenAI Chat Completions リクエスト。SSE は stream:true を指定。 |
ストリーミング
クライアントが "stream": true を送ると、プロキシは OpenAI 形式の Server-Sent Events で応答します。
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"delta":{"role":"assistant"},...}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"delta":{"content":"Hello"},...}]}
data: [DONE]
Anthropic と Gemini のネイティブストリームもこの形式に変換されるため、すべてのクライアントは単一のパーサーで処理できます。
認証ヘッダー
Require Bearer Token authentication がオンの場合、すべてのリクエストにメインウィンドウのトークンを付けて送信します。
Authorization: Bearer <token-shown-in-app>
設定
下部ツールバーの歯車アイコンから Settings ウィンドウを開きます。
| 設定項目 | デフォルト | 説明 |
|---|---|---|
| Proxy Port | 8421 | リスナーがバインドする TCP ポート。変更にはプロキシの再起動が必要。 |
| Auto Start Server | On | アプリ起動時にプロキシを開始します。 |
| Allow LAN Access | Off | オフの場合、プロキシは 127.0.0.1 にのみバインドします。オンにすると Wi-Fi 上の他デバイスからプロキシにアクセスできます。 |
| Require Bearer Token | Off | オンの場合、すべてのリクエストにメインウィンドウに表示されたトークンを含める必要があります。Allow LAN Access がオンのときは強く推奨。 |
クライアント例
cURL
# OpenAI(パススルー)
curl http://localhost:8421/openai/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Hello"}]
}'
# 同じ OpenAI 形式で Claude を呼ぶ
curl http://localhost:8421/anthropic/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [{"role": "user", "content": "Hello"}],
"max_tokens": 1024
}'
OpenAI Python SDK
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8421/gemini/v1",
api_key="placeholder", # Bearer Token がオフの場合は無視される
)
stream = client.chat.completions.create(
model="gemini-2.0-flash",
messages=[{"role": "user", "content": "Tell me a joke"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)
Flutter / Dart
// 任意の OpenAI 互換 Dart クライアントを使用
final client = OpenAIClient(
baseUrl: 'http://localhost:8421/anthropic/v1',
apiKey: '', // Bearer Token がオフの場合は未使用
);
localhost を Mac の LAN IP に置き換えてください(Allow LAN Access がオンのとき Base URL フィールドに表示されます)。ヒント
- ローカルで開発している間は Bearer Token をオフにしておき、LAN アクセスを有効化した瞬間にオンにしましょう。
- クライアントコードでプロバイダーごとに異なる Base URL を使えば、1 つの定数を変えるだけでプロバイダーを切り替えられます。
- プロキシは自動起動しますが、ポートが衝突した場合はメインウィンドウから一時的に停止できます。
- プロバイダーの無料枠でレート制限に達した場合、上流のエラーメッセージはそのまま転送されます。クライアントから隠されたリトライロジックはありません。
/v1/providersエンドポイントは、実行時にどのプロバイダーが設定されているかを発見するのに便利です。
トラブルシューティング
プロキシが起動しない
- 別のプロセスがポート 8421 を使用している可能性があります。Settings でポートを変更してプロキシを再起動してください。
- 起動時に表示されるエラーメッセージをシステムログで確認してください。
リクエストが 401 Unauthorized を返す
- Bearer Token 要求がオンになっているが、クライアントが一致する
Authorization: Bearer ...ヘッダーを送信していません。 - プロバイダー側の API キーが無効である可能性があります — 上流のエラーがそのまま転送されるのでメッセージ本文を確認してください。
リクエストが "API key is not configured" を返す
- Providers リストを開き、該当プロバイダーの Set API Key をクリックします。
- ERNIE は API Key と Secret Key の両方を、Azure OpenAI は Endpoint Base URL も入力する必要があります。
モバイルデバイスからプロキシに到達できない
- Settings で Allow LAN Access をオンにします。
localhostではなく Base URL フィールドに表示される LAN IP を使用します。- 両デバイスが同じ Wi-Fi 上にあり、ファイアウォールがプロキシポートへの着信を許可していることを確認します。
ストリーミングレスポンスが一度に届く
- クライアントが JSON 本文に
"stream": trueを送っていることを確認します。 - 一部の HTTP ライブラリはデフォルトで SSE をバッファリングします — クライアント側でレスポンスのバッファリングを無効化してください。
プライバシー
- API キーは
~/Library/Application Support/AIProxyServer/credentials.encに Fernet で暗号化されて保存されます。master.keyの暗号化キーは 0600 権限です。 - Bearer Token も有効時には暗号化された金庫にのみ保存され、通常の設定ファイルには書き込まれません。
- プロキシは明示的に設定したプロバイダーにしかリクエストを転送しません。他の発信通信は一切ありません。
- テレメトリ、アナリティクス、クラッシュレポートはありません。
- デフォルトのネットワークバインドは
127.0.0.1のみです。LAN への公開はオプトインです。 - 会話内容は保存されません。AIProxyServer はバイトを転送した直後に破棄します。