主要なクラウド 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 を同じ行でクリックし、値をダイアログに貼り付けます
- クリック 保存。ステータスラベルが Configured (緑)に変わります
3. クライアントアプリを接続する
OpenAI 互換のクライアントをプロキシに向けます。ベース URL は http://localhost:8421/<provider>/v1です。プロバイダーのセグメントによって、どのクラウドにリクエストが送られるかが決まります。
# 例: プロキシに向けた 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 パネル
| 項目 | 説明 |
|---|---|
| ステータス | Running はリスナーが動作中であることを示し、そうでない場合は Stopped になります。 |
| ベース URL | クライアントアプリが使用するアドレス(ホスト名とポートを含む)。 コピー をクリックするとクリップボードにコピーされます。 |
| 開始 / 停止ボタン | アプリを終了せずに HTTP リスナーを切り替えます。 |
Bearer Token パネル
- Bearer Token 認証を必須にする — 認証のオン・オフを切り替えるチェックボックスです。ローカルで手軽に使えるよう、既定ではオフです。
- トークン欄 — 現在のトークンを読み取り専用で表示します。ドットで表示されるため、取得するには コピー を使用してください。
- 再生成 — 新しいランダムなトークンを発行します。既存のクライアントは新しい値に更新する必要があります。
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 | API キーの取得元: platform.openai.com |
| 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 のネイティブストリームもこの形式に変換されるため、すべてのクライアントが単一のパーサーで処理できます。
認証ヘッダー
次の設定がオンのとき、 Bearer Token 認証を必須にする メインウィンドウに表示されるトークンをすべてのリクエストに付けて送信します:
Authorization: Bearer <token-shown-in-app>
設定
下部ツールバーの歯車アイコンから設定ウィンドウを開きます。
| 設定 | 既定値 | 説明 |
|---|---|---|
| プロキシポート | 8421 | リスナーがバインドする TCP ポートです。変更後はプロキシの再起動が必要です。 |
| サーバーを自動起動 | オン | アプリの起動時にプロキシを開始します。 |
| Allow LAN Access | オフ | オフの場合、プロキシは次のアドレスにのみバインドされます: 127.0.0.1。オンにすると、同じ Wi-Fi 上の他のデバイスからプロキシに接続できます。 |
| Bearer Token を必須にする | オフ | オンにすると、すべてのリクエストにメインウィンドウ表示のトークンを含める必要があります。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 に置き換えます(次の設定がオンのとき、ベース URL 欄に表示されます: Allow LAN Access )。ヒント
- ローカルで開発している間は Bearer Token をオフのままにし、LAN アクセスを有効にした時点でオンにしてください。
- クライアントのコードではプロバイダーごとに別々のベース URL を用意しておくと、定数を 1 つ変えるだけでプロバイダーを切り替えられます。
- プロキシは自動起動しますが、ポートの競合が起きた場合はメインウィンドウから一時的に停止できます。
- プロバイダーの無料プランでレート制限に達した場合、上流のエラーメッセージがそのまま転送されます。クライアントから見えないリトライ処理は行いません。
- 次の
/v1/providersエンドポイントを使うと、実行時にどのプロバイダーが設定済みかを確認できて便利です。
トラブルシューティング
プロキシが起動しない
- すでに別のプロセスがポート 8421 を使用している可能性があります。設定でポートを変更し、プロキシを再起動してください。
- 起動時に表示されたエラーメッセージをシステムログで確認してください。
リクエストが 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 も必要です。
モバイル端末からプロキシに接続できない
- オンにする Allow LAN Access を設定で有効にしてください。
- 次ではなく、ベース URL 欄に表示される LAN IP を使用してください:
localhost. - 両方の端末が同じ Wi-Fi ネットワークに接続されていること、およびファイアウォールがプロキシポートへの受信接続を許可していることを確認してください。
ストリーミング応答がまとめて届く
- クライアントが JSON ボディに次を含めて送信しているか確認してください:
"stream": trueを JSON ボディに含めているか確認してください。 - HTTP ライブラリによっては既定で SSE をバッファリングします。クライアント側でレスポンスのバッファリングを無効にしてください。
プライバシー
- API キーは Fernet で暗号化され、次の場所に保存されます:
~/Library/Application Support/AIProxyServer/credentials.enc。暗号鍵はmaster.keyにあり、パーミッションは 0600 です。 - Bearer Token も、有効にした場合は暗号化された保管領域にのみ保存され、通常の設定ファイルには書き込まれません。
- プロキシは、明示的に設定したプロバイダーにのみリクエストを転送します。それ以外の外部通信は一切行いません。
- テレメトリ、アナリティクス、クラッシュレポートはいずれもありません。
- 既定のネットワークバインドは次のみです:
127.0.0.1のみです。LAN への公開はオプトインです。 - 会話の内容は保存されません。AIProxyServer はデータを転送したら即座に破棄します。