SymGate · Visão geral
Proxy OpenAI-compatible com tool calling de volta
O SymGate fica entre a IDE e o gateway corporativo de modelos. Ele devolve o tool calling que o gateway descarta, barra credencial saindo em prompt e registra uma trilha de auditoria de cada request.
Por que existe
O gateway descarta o campo tools da request. Sem ele o modelo
nunca fica sabendo que existem ferramentas e responde que não tem acesso
ao sistema de arquivos — nenhum agente funciona.
O SymGate contorna isso descrevendo as ferramentas em texto
no system prompt, que o gateway não descarta, e remontando a resposta no
formato oficial. Para o cliente chega um tool_calls normal:
nada muda do lado da IDE.
Configurar o cliente
A base é https://symgate.aideliveryengine.com/v1 e a chave é
a sua, do gateway — o SymGate não guarda credencial de ninguém. Exemplo
para o OpenCode:
"model": "symgate/azure.gpt-5.4",
"provider": {
"symgate": {
"npm": "@ai-sdk/openai-compatible",
"name": "SymGate",
"options": {
"baseURL": "https://symgate.aideliveryengine.com/v1",
"apiKey": "{file:~/.config/opencode/symphony.key}"
},
"models": {
"azure.gpt-5.4": { "name": "GPT 5.4", "tool_call": true }
}
}
}
"tool_call": trueé obrigatório. Sem isso o cliente não oferece modo agente — que é justamente o motivo de o SymGate existir. E defina o"model"no topo: o padrão do OpenCode aponta para outro provider, sem tool calling.
O passo a passo de cada cliente (OpenCode, Cline, Continue) está na documentação.
Segurança
A sua chave não fica aqui
O SymGate não guarda credencial de ninguém. A chave que você configura vai
no cabeçalho Authorization, é repassada ao gateway e não é
gravada em disco nem na auditoria. Cada pessoa usa a própria — não existe
chave compartilhada do time.
O que não sai daqui
Agente lê arquivo. Mais cedo ou mais tarde ele lê um .env, e o
conteúdo volta no turno seguinte como resultado de ferramenta — a caminho
de um provedor externo. Antes de mandar qualquer coisa para o gateway, o
SymGate examina o conteúdo novo do turno, resultado de
ferramenta incluído, procurando segredo e dado pessoal.
| Ação | O que dispara |
|---|---|
| Bloqueia | Chave privada · chave e secret da AWS · chaves da OpenAI, Anthropic, OpenRouter e Google · tokens do GitHub, GitLab e Slack · JWT · senha embutida em URL |
| Avisa |
Segredo atribuído em código (api_key = "…") · CPF.
Passa, mas fica registrado — são padrões que dão falso positivo
demais para barrar a pessoa
|
Quando bloqueia, a request não chega ao gateway: nada é
enviado. A pessoa lê na própria IDE o que foi encontrado, com o valor
mascarado — sk-ant…4f2a, o suficiente para reconhecer qual
segredo era, nunca o bastante para usá-lo.
Superfície
- O serviço escuta só em loopback; quem fala com a internet é o servidor web, com TLS.
- A documentação pede usuário e senha, conferidos no servidor — antes de servir o primeiro byte da página.
- Zero dependência externa: só a biblioteca padrão do Python 3.11. Não há cadeia de pacotes de terceiros para auditar ou para ser comprometida.
Auditoria
Cada request vira uma linha JSON: quando aconteceu, qual modelo, quem chamou, quantas ferramentas foram declaradas e o que os guardrails encontraram. Serve para responder depois — saiu segredo daqui?, quem usou o quê? — sem depender da memória de ninguém.
Achado nenhum entra inteiro na trilha: o valor vai sempre mascarado. Um registro de auditoria que guardasse o segredo por extenso seria mais um lugar de onde vazar.
Endpoints
| Rota | Método | O quê |
|---|---|---|
/v1/chat/completions |
POST | A conversa. É aqui que o tool calling é traduzido nos dois sentidos. |
/v1/models |
GET | Os modelos liberados nesta instância. |
/v1/health |
GET | Se o serviço está de pé. |
/docs/ |
GET | A documentação. Pede usuário e senha. |
O prefixo é indiferente: a rota é reconhecida pelo final do
caminho, então /api/chat/completions responde igual a
/v1/chat/completions. Prefira /v1 — é a
convenção que os clientes OpenAI-compatible esperam, e é o que a
documentação usa.
Endereços
| Endereço | O quê |
|---|---|
symgate.aideliveryengine.com |
Atual. Certificado do hostname, sem aviso no navegador. |
163.176.0.170 |
Legado. Mesmo serviço, ainda no ar — quem já configurou não precisa mexer. |