AIProxyServer - 指南

為各大雲端 AI 服務執行一個本地的 OpenAI 相容代理。API 金鑰只需儲存一次,任何用戶端應用程式(桌面、行動或網頁)都可以直接連線 http://localhost 而無需在每個工具中重複註冊金鑰。


開始使用

1. 啟動應用程式

開啟 AIProxyServer。首次啟動時代理會自動執行,並監聽本機的連接埠 8421 。主視窗分為三個區域:

  • 代理伺服器 — 目前狀態、基礎 URL,以及啟動或停止監聽器的按鈕
  • Bearer Token — 可選的驗證開關與權杖顯示
  • 服務商 — 所有支援的雲端 AI 服務商,每列都帶有一個 設定 API 金鑰 按鈕

2. 新增第一個 API 金鑰

  1. 從服務商清單中任選一個(例如 OpenAI (ChatGPT))
  2. 點擊 取得 API 金鑰 在瀏覽器中開啟該服務商的主控台,然後建立或複製一個金鑰
  3. 點擊 設定 API 金鑰 ,在同一列中將該值貼到對話方塊內
  4. 點擊 儲存。狀態標籤會變為 已設定 並顯示為綠色

3. 連接用戶端應用程式

將任何 OpenAI 相容用戶端指向該代理。基礎 URL 為 http://localhost:8421/<provider>/v1。URL 中的服務商區段決定請求要轉發到哪個雲端服務。

# 範例:將 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 會在轉發請求時附加上游憑證。


介面總覽

代理伺服器面板

欄位說明
狀態執行中 表示監聽器處於作用中狀態,否則顯示 已停止
基礎 URL用戶端應用程式應使用的位址,包含主機名稱與連接埠。點擊 複製 即可複製到剪貼簿。
啟動 / 停止按鈕無需結束應用程式即可切換 HTTP 監聽器。

Bearer Token 面板

  • 要求 Bearer Token 驗證 — 用於開啟或關閉驗證的核取方塊。預設為關閉,讓本機使用更加省事。
  • 權杖欄位 — 以唯讀方式顯示目前的權杖,並以圓點呈現;使用 複製 即可取得。
  • 重新產生 — 產生一個全新的隨機權杖。現有用戶端必須更新為新的值。
請注意: 如果您在設定中啟用了 允許區域網路存取 卻沒有開啟權杖,同一 Wi-Fi 網路中的任何人都能使用您的代理與 API 金鑰。處於該狀態時,權杖面板下方的提示文字會向您發出警告。

服務商面板

每個支援的雲端服務商各佔一列。每列會顯示:

  • 顯示名稱(例如 Claude (Anthropic))
  • 設定狀態 — 已儲存 API 金鑰時顯示綠色 已設定 ,否則顯示灰色 未設定
  • 用戶端使用的 URL 路徑,例如 /anthropic/v1/chat/completions
  • 設定 API 金鑰 — 開啟輸入憑證的對話方塊
  • 取得 API 金鑰 — 在瀏覽器中開啟該服務商的主控台

支援的服務商

內建十一種雲端 AI 服務。多數原生使用 OpenAI Chat Completions 格式,可直接直通代理。其中三種(Anthropic、Gemini、ERNIE)使用各自的協定;AIProxyServer 會即時轉換請求與回應,因此您的用戶端始終只會接觸到 OpenAI 格式。

服務商路由前綴所需內容
OpenAI (ChatGPT)/openai/v1API 金鑰來自 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/v1API 金鑰以及您的部署端點 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來自阿里雲 DashScope 的 API 金鑰
ERNIE (Baidu)/ernie/v1來自百度千帆的 API Key 與 Secret Key

各服務商注意事項

  • Azure OpenAI — 請將完整的部署端點貼到 端點基礎 URL 欄位中,例如 https://my-resource.openai.azure.com/openai/deployments/gpt-4o。代理會自動附加 API 端點:/chat/completions?api-version=2024-02-01
  • ERNIE — 百度千帆使用 OAuth,因此 API KeySecret Key 兩者都必須填寫。AIProxyServer 會在背景請求並快取存取權杖。
  • Gemini — 驗證是透過 URL 查詢參數完成,代理會為您自動加上。免費方案的每分鐘配額限制仍然適用。

API 參考

端點

方法路徑說明
GET/health存活檢查。回傳服務狀態與服務商清單。無需驗證。
GET/v1/providers已設定的服務商及中繼資料。
GET/<provider>/v1/models指定服務商的模型清單,採用 OpenAI 格式。
POST/<provider>/v1/chat/completionsOpenAI Chat Completions 請求。傳入 stream:true 即可使用 SSE。

串流

當用戶端傳送 stream: true時,代理會以 OpenAI 格式回傳 Server-Sent Events:

SSE 回應範例: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 連接埠。修改後需要重新啟動代理。
自動啟動伺服器開啟應用程式啟動時一併啟動代理。
允許區域網路存取關閉關閉時,代理僅繫結到 127.0.0.1。開啟時,同一 Wi-Fi 下的其他裝置也能連到該代理。
要求 Bearer Token關閉開啟後,每個請求都必須包含主視窗顯示的權杖。啟用「允許區域網路存取」時強烈建議開啟此項。

用戶端範例

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 關閉時不會使用
);
Wi-Fi 上的行動裝置: 請將 localhost 替換為您 Mac 的區域網路 IP(開啟 允許區域網路存取 後會顯示在基礎 URL 欄位中)。

使用技巧

  • 在本機開發時可以讓 Bearer Token 保持關閉;一旦啟用區域網路存取,請立即開啟它。
  • 在用戶端程式碼中為每個服務商使用不同的基礎 URL,這樣只需修改一個常數即可切換服務商。
  • 代理會自動啟動,但如果發生連接埠衝突,您可以在主視窗中暫時停止它。
  • 如果某個服務商的免費方案對您限制速率,上游的錯誤訊息會原樣轉發。不會對用戶端隱藏任何重試邏輯。
  • 使用 /v1/providers 端點可以在執行時查看哪些服務商已完成設定。

疑難排解

代理無法啟動

  • 可能已有其他處理程序佔用了 8421 連接埠。請在設定中修改連接埠並重新啟動代理。
  • 請查看系統記錄檔中啟動時顯示的錯誤訊息。

請求回傳 401 Unauthorized

  • 已開啟 Bearer Token 要求,但用戶端未傳送相符的 Authorization: Bearer ... 標頭。
  • 服務商本身的 API 金鑰可能無效 — 上游錯誤會被轉發,請檢查訊息內容。

請求回傳「API key is not configured」

  • 開啟服務商清單,並為相應服務商點擊 設定 API 金鑰
  • 對於 ERNIE,API Key 與 Secret Key 都必須填寫。對於 Azure OpenAI,還需要填寫端點基礎 URL。

行動裝置無法連到代理

  • 請開啟 允許區域網路存取 (位於設定中)。
  • 請使用基礎 URL 欄位中顯示的區域網路 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 。區域網路曝露需要您主動開啟。
  • 不會保存對話內容。AIProxyServer 只轉發位元組,轉發後立即遺忘。