Execute um proxy local compatível com OpenAI para todos os principais serviços de IA na nuvem. Armazene as chaves de API uma única vez e permita que qualquer app cliente — desktop, mobile ou web — converse com http://localhost em vez de registrar chaves em cada ferramenta.
Primeiros passos
1. Abra o aplicativo
Abra o AIProxyServer. Na primeira execução, o proxy inicia automaticamente e escuta na porta 8421 da sua máquina local. A janela principal mostra três seções:
- Proxy Server — status atual, URL base e um botão para iniciar ou parar o listener
- Bearer Token — chave de autenticação opcional e exibição do token
- Providers — todos os provedores de IA na nuvem suportados, com um botão Set API Key por linha
2. Adicione sua primeira chave de API
- Escolha qualquer provedor da lista de Providers (por exemplo, OpenAI (ChatGPT))
- Clique em Get API key para abrir o console do provedor no navegador, depois crie ou copie uma chave
- Clique em Set API Key na mesma linha e cole o valor na caixa de diálogo
- Clique em Save. O rótulo de status muda para Configured em verde
3. Conecte um app cliente
Aponte qualquer cliente compatível com OpenAI para o proxy. A Base URL é http://localhost:8421/<provider>/v1. O segmento provider escolhe qual nuvem receberá a requisição.
# Exemplo: OpenAI Python SDK apontado para o 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)
O cliente nunca vê a chave real. O AIProxyServer anexa as credenciais upstream ao encaminhar a requisição.
Visão geral da interface
Painel Proxy Server
| Campo | Descrição |
|---|---|
| Status | Running quando o listener está ativo, caso contrário Stopped. |
| Base URL | O endereço que os apps clientes devem usar, incluindo nome do host e porta. Clique em Copy para copiar para a área de transferência. |
| Botão Start / Stop | Alterna o listener HTTP sem encerrar o aplicativo. |
Painel Bearer Token
- Require Bearer Token authentication — caixa de seleção que ativa ou desativa a autenticação. Desativada por padrão para uso local sem complicações.
- Token field — exibição somente leitura do token atual. Mostrado como pontos; use Copy para obtê-lo.
- Regenerate — emite um novo token aleatório. Os clientes existentes devem ser atualizados com o novo valor.
Painel Providers
Uma linha por provedor de nuvem suportado. Cada linha mostra:
- O nome de exibição (por exemplo, Claude (Anthropic))
- Status de configuração — verde Configured quando uma chave de API está salva, cinza Not configured caso contrário
- O caminho de URL que seus clientes usam, ex.:
/anthropic/v1/chat/completions - Set API Key — abre uma caixa de diálogo para inserir as credenciais
- Get API key — abre o console do provedor no navegador
Provedores suportados
Onze serviços de IA na nuvem vêm incluídos. A maioria usa nativamente o formato OpenAI Chat Completions e é proxiada sem alterações. Três (Anthropic, Gemini, ERNIE) falam seus próprios protocolos; o AIProxyServer traduz requisições e respostas em tempo real para que seu cliente sempre veja apenas formatos OpenAI.
| Provedor | Prefixo de rota | O que você precisa |
|---|---|---|
| OpenAI (ChatGPT) | /openai/v1 | Chave de API de platform.openai.com |
| Claude (Anthropic) | /anthropic/v1 | Chave de API do Anthropic Console |
| Gemini (Google) | /gemini/v1 | Chave de API do Google AI Studio |
| Grok (xAI) | /grok/v1 | Chave de API do xAI Console |
| Azure OpenAI (Copilot) | /copilot/v1 | Chave de API mais a URL do endpoint de implantação |
| Perplexity | /perplexity/v1 | Chave de API nas configurações do Perplexity |
| Groq | /groq/v1 | Chave de API do Groq Cloud |
| DeepSeek | /deepseek/v1 | Chave de API do DeepSeek Platform |
| Kimi (Moonshot) | /kimi/v1 | Chave de API do Moonshot Console |
| Qwen (DashScope) | /qwen/v1 | Chave de API do Alibaba DashScope |
| ERNIE (Baidu) | /ernie/v1 | Tanto API Key quanto Secret Key do Baidu Qianfan |
Notas específicas por provedor
- Azure OpenAI — cole o endpoint completo da implantação no campo Endpoint Base URL, por exemplo
https://my-resource.openai.azure.com/openai/deployments/gpt-4o. O proxy acrescenta/chat/completions?api-version=2024-02-01automaticamente. - ERNIE — o Baidu Qianfan usa OAuth, então tanto API Key quanto Secret Key são necessárias. O AIProxyServer solicita e armazena em cache os tokens de acesso nos bastidores.
- Gemini — a autenticação é feita por parâmetro de consulta de URL; o proxy o adiciona para você. As cotas por minuto da camada gratuita ainda se aplicam.
Referência da API
Endpoints
| Método | Caminho | Descrição |
|---|---|---|
| GET | /health | Verificação de disponibilidade. Retorna o status do serviço e a lista de provedores. Nenhuma autenticação necessária. |
| GET | /v1/providers | Provedores configurados e metadados. |
| GET | /<provider>/v1/models | Lista de modelos para o provedor indicado, em formato OpenAI. |
| POST | /<provider>/v1/chat/completions | Requisição OpenAI Chat Completions. Passe stream:true para SSE. |
Streaming
Quando o cliente envia "stream": true, o proxy responde com Server-Sent Events no 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]
Os streams nativos da Anthropic e do Gemini são traduzidos para esse formato, de modo que todos os clientes possam usar um único parser.
Cabeçalho de autenticação
Quando Require Bearer Token authentication está ativado, envie o token mostrado na janela principal em cada requisição:
Authorization: Bearer <token-shown-in-app>
Configurações
Abra a janela de Configurações pelo ícone de engrenagem na barra de ferramentas inferior.
| Configuração | Padrão | Descrição |
|---|---|---|
| Proxy Port | 8421 | Porta TCP à qual o listener se conecta. A alteração requer reiniciar o proxy. |
| Auto Start Server | On | Inicia o proxy quando o aplicativo é aberto. |
| Allow LAN Access | Off | Quando desativado, o proxy se vincula apenas a 127.0.0.1. Quando ativado, outros dispositivos na sua Wi-Fi podem alcançar o proxy. |
| Require Bearer Token | Off | Quando ativado, toda requisição deve incluir o token exibido na janela principal. Fortemente recomendado sempre que Allow LAN Access estiver ativado. |
Exemplos de cliente
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 no mesmo 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", # ignorado quando o Bearer Token está desativado
)
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 qualquer cliente Dart compatível com OpenAI
final client = OpenAIClient(
baseUrl: 'http://localhost:8421/anthropic/v1',
apiKey: '', // não utilizado quando o Bearer Token está desativado
);
localhost pelo IP de LAN do seu Mac (exibido no campo Base URL quando Allow LAN Access está ativado).Dicas
- Deixe o Bearer Token desativado enquanto estiver desenvolvendo localmente; ative-o no momento em que habilitar o acesso LAN.
- Use Base URLs distintas por provedor no código do cliente para poder trocar de provedor alterando apenas uma constante.
- O proxy inicia automaticamente, mas você pode pará-lo temporariamente pela janela principal se ocorrer um conflito de porta.
- Se a camada gratuita de um provedor limitar sua taxa, a mensagem de erro upstream é encaminhada literalmente. Nenhuma lógica de retry é ocultada do cliente.
- O endpoint
/v1/providersé útil para descobrir quais provedores estão configurados em tempo de execução.
Solução de problemas
O proxy não inicia
- Outro processo pode já estar usando a porta 8421. Mude a porta nas configurações e reinicie o proxy.
- Verifique o log do sistema para a mensagem de erro exibida no momento da inicialização.
Uma requisição retorna 401 Unauthorized
- A exigência de Bearer Token está ativada, mas o cliente não enviou um cabeçalho
Authorization: Bearer ...correspondente. - A chave de API do próprio provedor pode estar inválida — o erro upstream é encaminhado, então verifique o corpo da mensagem.
Uma requisição retorna "API key is not configured"
- Abra a lista de Providers e clique em Set API Key para o provedor em questão.
- Para ERNIE, tanto API Key quanto Secret Key devem ser preenchidos. Para Azure OpenAI, o Endpoint Base URL também é obrigatório.
O dispositivo móvel não consegue alcançar o proxy
- Ative Allow LAN Access nas configurações.
- Use o IP de LAN exibido no campo Base URL, e não
localhost. - Certifique-se de que ambos os dispositivos estejam na mesma rede Wi-Fi e de que seu firewall permita conexões de entrada na porta do proxy.
As respostas em streaming chegam todas de uma vez
- Garanta que seu cliente envia
"stream": trueno corpo JSON. - Algumas bibliotecas HTTP fazem buffer de SSE por padrão — desative o buffering de resposta no lado do cliente.
Privacidade
- As chaves de API são armazenadas criptografadas com Fernet em
~/Library/Application Support/AIProxyServer/credentials.enc. A chave de criptografia emmaster.keytem permissões 0600. - O Bearer Token, quando ativado, também é armazenado apenas no cofre criptografado e nunca gravado no arquivo de configurações regular.
- O proxy só encaminha requisições para provedores que você configurou explicitamente. Não faz nenhuma outra chamada de saída.
- Sem telemetria, sem analytics, sem relatórios de falha.
- A vinculação de rede padrão é apenas
127.0.0.1. A exposição LAN é opt-in. - O conteúdo das conversas não é armazenado. O AIProxyServer encaminha os bytes e os esquece imediatamente.