Esegui un proxy locale compatibile con OpenAI per ogni grande servizio AI in cloud. Memorizza le chiavi API una sola volta e consenti a qualsiasi app client — desktop, mobile o web — di comunicare con http://localhost invece di registrare le chiavi in ogni strumento.
Per iniziare
1. Avvia l'app
Apri AIProxyServer. Al primo avvio il proxy si attiva automaticamente e resta in ascolto sulla porta 8421 della tua macchina locale. La finestra principale mostra tre sezioni:
- Proxy Server — stato corrente, URL di base e un pulsante per avviare o fermare il listener
- Bearer Token — interruttore di autenticazione opzionale e visualizzazione del token
- Providers — ogni provider AI in cloud supportato, con un pulsante Set API Key per ciascuna riga
2. Aggiungi la tua prima chiave API
- Scegli un provider qualsiasi dalla lista Providers (ad esempio OpenAI (ChatGPT))
- Fai clic su Get API key per aprire la console del provider nel browser, poi crea o copia una chiave
- Fai clic su Set API Key sulla stessa riga e incolla il valore nella finestra di dialogo
- Fai clic su Save. L'etichetta di stato diventa Configured in verde
3. Connetti un'app client
Punta qualsiasi client compatibile con OpenAI al proxy. L'URL di base è http://localhost:8421/<provider>/v1. Il segmento provider sceglie quale cloud riceverà la richiesta.
# Esempio: OpenAI Python SDK puntato al proxy
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)
Il client non vede mai la chiave reale. AIProxyServer aggiunge le credenziali upstream quando inoltra la richiesta.
Panoramica dell'interfaccia
Pannello Proxy Server
| Campo | Descrizione |
|---|---|
| Status | Running quando il listener è attivo, Stopped altrimenti. |
| Base URL | L'indirizzo che le app client devono utilizzare, inclusi hostname e porta. Fai clic su Copy per copiarlo negli appunti. |
| Pulsante Start / Stop | Attiva o disattiva il listener HTTP senza chiudere l'app. |
Pannello Bearer Token
- Require Bearer Token authentication — casella di controllo che attiva o disattiva l'autenticazione. Disattivata di default per un uso locale senza complicazioni.
- Token field — visualizzazione in sola lettura del token corrente. Mostrato come punti; usa Copy per ottenerlo.
- Regenerate — emette un nuovo token casuale. I client esistenti devono essere aggiornati con il nuovo valore.
Pannello Providers
Una riga per ciascun provider cloud supportato. Ogni riga mostra:
- Il nome visualizzato (ad esempio Claude (Anthropic))
- Stato di configurazione — verde Configured quando una chiave API è salvata, grigio Not configured altrimenti
- Il percorso URL che i tuoi client utilizzano, es.
/anthropic/v1/chat/completions - Set API Key — apre una finestra di dialogo per inserire le credenziali
- Get API key — apre la console del provider nel tuo browser
Provider supportati
Sono inclusi undici servizi AI in cloud. La maggior parte utilizza nativamente il formato OpenAI Chat Completions ed è proxata così com'è. Tre (Anthropic, Gemini, ERNIE) parlano i propri protocolli; AIProxyServer traduce richieste e risposte al volo in modo che il tuo client veda sempre solo formati OpenAI.
| Provider | Prefisso di route | Cosa serve |
|---|---|---|
| OpenAI (ChatGPT) | /openai/v1 | Chiave API da platform.openai.com |
| Claude (Anthropic) | /anthropic/v1 | Chiave API dalla Anthropic Console |
| Gemini (Google) | /gemini/v1 | Chiave API da Google AI Studio |
| Grok (xAI) | /grok/v1 | Chiave API dalla xAI Console |
| Azure OpenAI (Copilot) | /copilot/v1 | Chiave API più l'URL dell'endpoint di deployment |
| Perplexity | /perplexity/v1 | Chiave API dalle impostazioni di Perplexity |
| Groq | /groq/v1 | Chiave API da Groq Cloud |
| DeepSeek | /deepseek/v1 | Chiave API dalla DeepSeek Platform |
| Kimi (Moonshot) | /kimi/v1 | Chiave API dalla Moonshot Console |
| Qwen (DashScope) | /qwen/v1 | Chiave API da Alibaba DashScope |
| ERNIE (Baidu) | /ernie/v1 | Sia API Key che Secret Key da Baidu Qianfan |
Note specifiche per provider
- Azure OpenAI — incolla l'endpoint completo del deployment nel campo Endpoint Base URL, ad esempio
https://my-resource.openai.azure.com/openai/deployments/gpt-4o. Il proxy aggiunge/chat/completions?api-version=2024-02-01automaticamente. - ERNIE — Baidu Qianfan utilizza OAuth, quindi sono richiesti sia API Key che Secret Key. AIProxyServer richiede e memorizza nella cache i token di accesso dietro le quinte.
- Gemini — l'autenticazione avviene tramite parametro di query nell'URL; il proxy lo aggiunge per te. Le quote per minuto del piano gratuito restano applicabili.
Riferimento API
Endpoint
| Metodo | Percorso | Descrizione |
|---|---|---|
| GET | /health | Controllo di vitalità. Restituisce lo stato del servizio e l'elenco dei provider. Nessuna autenticazione richiesta. |
| GET | /v1/providers | Provider configurati e metadati. |
| GET | /<provider>/v1/models | Elenco dei modelli per il provider indicato, in formato OpenAI. |
| POST | /<provider>/v1/chat/completions | Richiesta OpenAI Chat Completions. Passa stream:true per SSE. |
Streaming
Quando il client invia "stream": true, il proxy risponde con Server-Sent Events nel formato OpenAI:
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"delta":{"role":"assistant"},...}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"delta":{"content":"Hello"},...}]}
data: [DONE]
Gli stream nativi di Anthropic e Gemini vengono tradotti in questo formato in modo che tutti i client possano usare un singolo parser.
Intestazione di autenticazione
Quando Require Bearer Token authentication è attivo, invia il token mostrato nella finestra principale con ogni richiesta:
Authorization: Bearer <token-shown-in-app>
Impostazioni
Apri la finestra delle impostazioni dall'icona dell'ingranaggio nella barra degli strumenti inferiore.
| Impostazione | Default | Descrizione |
|---|---|---|
| Proxy Port | 8421 | Porta TCP a cui si collega il listener. Il cambio richiede il riavvio del proxy. |
| Auto Start Server | On | Avvia il proxy quando l'app si avvia. |
| Allow LAN Access | Off | Quando disattivato, il proxy si lega solo a 127.0.0.1. Quando attivato, altri dispositivi sulla tua Wi-Fi possono raggiungere il proxy. |
| Require Bearer Token | Off | Quando attivato, ogni richiesta deve includere il token mostrato nella finestra principale. Fortemente consigliato ogni volta che Allow LAN Access è attivo. |
Esempi di client
cURL
# OpenAI (passthrough)
curl http://localhost:8421/openai/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Hello"}]
}'
# Claude tramite lo stesso formato OpenAI
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", # ignorato quando Bearer Token è disattivato
)
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
// Usando un qualsiasi client Dart compatibile con OpenAI
final client = OpenAIClient(
baseUrl: 'http://localhost:8421/anthropic/v1',
apiKey: '', // non utilizzato quando Bearer Token è disattivato
);
localhost con l'IP LAN del tuo Mac (mostrato nel campo Base URL quando Allow LAN Access è attivo).Consigli
- Lascia il Bearer Token disattivato mentre stai sviluppando in locale; attivalo nel momento in cui abiliti l'accesso LAN.
- Usa Base URL distinti per provider nel codice client in modo da poter cambiare provider modificando una sola costante.
- Il proxy si avvia automaticamente ma puoi fermarlo temporaneamente dalla finestra principale se si verifica un conflitto di porte.
- Se il piano gratuito di un provider ti limita la frequenza, il messaggio di errore upstream viene inoltrato testualmente. Nessuna logica di retry è nascosta al client.
- L'endpoint
/v1/providersè utile per scoprire quali provider sono configurati a runtime.
Risoluzione dei problemi
Il proxy non si avvia
- Un altro processo potrebbe già utilizzare la porta 8421. Cambia la porta nelle impostazioni e riavvia il proxy.
- Controlla il log di sistema per il messaggio di errore mostrato all'avvio.
Una richiesta restituisce 401 Unauthorized
- Il requisito Bearer Token è attivo ma il client non ha inviato un'intestazione
Authorization: Bearer ...corrispondente. - La chiave API del provider potrebbe essere non valida — l'errore upstream viene inoltrato, quindi controlla il corpo del messaggio.
Una richiesta restituisce "API key is not configured"
- Apri l'elenco Providers e fai clic su Set API Key per il provider in questione.
- Per ERNIE, devono essere compilati sia API Key che Secret Key. Per Azure OpenAI, è richiesto anche l'Endpoint Base URL.
Il dispositivo mobile non riesce a raggiungere il proxy
- Attiva Allow LAN Access nelle impostazioni.
- Usa l'IP LAN mostrato nel campo Base URL, non
localhost. - Assicurati che entrambi i dispositivi siano sulla stessa rete Wi-Fi e che il tuo firewall consenta connessioni in entrata sulla porta del proxy.
Le risposte in streaming arrivano tutte insieme
- Assicurati che il tuo client invii
"stream": truenel corpo JSON. - Alcune librerie HTTP bufferizzano SSE di default — disabilita il buffering della risposta sul lato client.
Privacy
- Le chiavi API sono memorizzate cifrate con Fernet in
~/Library/Application Support/AIProxyServer/credentials.enc. La chiave di cifratura inmaster.keyha permessi 0600. - Il Bearer Token, quando abilitato, viene memorizzato anch'esso solo nella cassaforte cifrata e mai scritto nel file di impostazioni regolare.
- Il proxy inoltra le richieste solo ai provider che hai esplicitamente configurato. Non effettua altre chiamate in uscita.
- Nessuna telemetria, nessuna analitica, nessun crash reporting.
- Il binding di rete predefinito è solo
127.0.0.1. L'esposizione LAN è opt-in. - I contenuti delle conversazioni non vengono memorizzati. AIProxyServer inoltra i byte e li dimentica immediatamente.