Ir para o conteúdo
Endpoints criptografados, Tor e I2P

Endpoints criptografados, Tor e I2P

A API também é publicada como um serviço onion do Tor e um eepsite do I2P. As mesmas rotas, a mesma chave; mudam apenas a URL base e o proxy.

URLs base

Quatro endereços levam à mesma API. Use o que se adapta à sua rede, com a mesma chave de API e as mesmas requisições.

Rede URL base Como acessar
Web aberta https://api.shannon-ai.com/v1 Direto, por HTTPS.
Espelho criptografado https://api-encrypted.shannon-ai.com/v1 Direto, por HTTPS. Um segundo nome de host para a mesma API.
Tor (serviço onion) http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 Por um cliente Tor: um proxy SOCKS5, por padrão em 127.0.0.1:9050.
I2P (eepsite) http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 Por um roteador I2P: um proxy HTTP, por padrão em 127.0.0.1:4444.
  • Um SDK da OpenAI recebe a URL base como mostrada, com /v1. Um SDK da Anthropic a recebe sem /v1.
  • Para conferir um endereço, leia os cabeçalhos de resposta de https://api.shannon-ai.com: Onion-Location traz o endereço onion e X-I2P-Location o endereço I2P. O endereço onion começa com shannon.

Quais rotas funcionam

Toda rota /v1 responde nos quatro endereços:

  • POST /v1/chat/completions
  • POST /v1/responses
  • POST /v1/messages
  • POST /v1/messages/count_tokens
  • POST /v1/tokenize
  • GET /v1/models

GET /v1/models não precisa de chave, o que o torna um teste rápido de que o seu proxy alcança a API.

O que é igual e o que difere

Item Igual? Detalhe
Rotas, campos de requisição, respostas, erros Igual Iguais em todos os endereços. Nenhuma rota se comporta de forma diferente conforme o nome de host.
Chave de API Igual Uma chave funciona em todos os endereços, como Authorization: Bearer ou x-api-key. Cookies nunca são lidos em /v1.
Saldo e limites Igual O mesmo saldo e o mesmo limite de 120 requisições por minuto. Ambos são contados por conta, não por endereço.
Tamanho da requisição Igual Até 32 MiB por corpo de requisição.
Esquema Difere https:// na web aberta e no espelho. http:// nos endereços .onion e .b32.i2p, onde a própria rede criptografa a conexão de ponta a ponta.
Proxy Difere Nenhum na web aberta. Um proxy SOCKS5 para o Tor, um proxy HTTP para o I2P. O nome deve ser resolvido pelo proxy, não pela sua máquina.
Velocidade Difere Ambas as redes acrescentam atraso a cada byte. O I2P é a mais lenta das duas.

Saldo e limites são descritos na sua própria página. Limites e saldo

cURL pelo Tor

Execute um cliente Tor na sua máquina. Ele oferece um proxy SOCKS5 em 127.0.0.1:9050. --socks5-hostname entrega o nome .onion a esse proxy.

cURL · Tor
# 1. Is the onion service reachable? No key needed.
curl --socks5-hostname 127.0.0.1:9050 http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1/models

# 2. A streamed chat call. -N prints the stream as it arrives.
curl -N --socks5-hostname 127.0.0.1:9050 http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "shannon-3",
    "stream": true,
    "messages": [{"role": "user", "content": "Hello over Tor"}]
  }'

cURL pelo I2P

Execute um roteador I2P na sua máquina. Ele oferece um proxy HTTP em 127.0.0.1:4444, que aceita o nome .b32.i2p como está.

cURL · I2P
# 1. Is the eepsite reachable? No key needed.
curl --proxy http://127.0.0.1:4444 http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1/models

# 2. A streamed chat call.
curl -N --proxy http://127.0.0.1:4444 http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "shannon-3",
    "stream": true,
    "messages": [{"role": "user", "content": "Hello over I2P"}]
  }'

URL base do SDK

Um SDK precisa de duas alterações: a URL base da rede e um cliente HTTP que passe pelo proxy. Em Python, os dois SDKs oficiais aceitam um cliente httpx. Para um proxy SOCKS, instale httpx[socks].

# pip install openai "httpx[socks]"
import httpx
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1",
    http_client=httpx.Client(proxy="socks5h://127.0.0.1:9050", timeout=600),
)

stream = client.chat.completions.create(
    model="shannon-3",
    messages=[{"role": "user", "content": "Hello over Tor"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

O streaming funciona nas duas redes. Enquanto um stream está aberto e o modelo ainda não tem nada a enviar, a API envia um keep-alive, para que a conexão não pareça morta para um proxy ou para o seu cliente.

Endpoint Keep-alive em um stream aberto Enviado para
/v1/chat/completions Uma linha de comentário (começa com :) a cada 15 segundos. Todos os modelos
/v1/messages Um event: ping, ou uma linha de comentário, a cada 15 segundos. Todos os modelos
/v1/responses Uma linha de comentário a cada 15 segundos. Modelos open-weight hospedados
  • Envie "stream": true. Uma resposta com stream começa a chegar assim que o modelo escreve, e o keep-alive mostra que a requisição ainda está sendo processada. Uma resposta sem stream não envia nada até que a resposta inteira esteja pronta.
  • Dê ao cliente um timeout de leitura longo. Os exemplos usam 600 segundos. Um timeout menor que 15 segundos pode encerrar um stream entre dois keep-alives.
  • Faça o seu leitor SSE ignorar linhas de comentário e eventos ping. Os SDKs já fazem isso.
  • Não reenvie uma requisição no instante em que uma conexão cai. Uma requisição que chegou à API é executada até o fim e é contada, mesmo quando a conexão se foi.
  • Teste primeiro o caminho com GET /v1/models. Ele não precisa de chave e retorna uma lista JSON curta.

Problemas de conexão

Sintoma Causa e solução
A conexão com 127.0.0.1:9050 ou 127.0.0.1:4444 é recusada Nenhum cliente Tor ou roteador I2P está em execução na sua máquina, ou ele escuta em outra porta. O Tor Browser oferece o seu proxy SOCKS na porta 9150.
Could not resolve host para o nome .onion O cliente tentou resolver o nome por conta própria. Use --socks5-hostname no cURL e socks5h:// em uma URL de proxy, para que o cliente Tor o resolva.
O proxy I2P responde com a sua própria página de erro O roteador ainda não encontrou o endereço. Um roteador precisa de alguns minutos depois de iniciar. Tente de novo.
401 com Missing authentication A requisição chegou sem chave. Envie o mesmo cabeçalho que na web aberta.

Todos os outros erros são iguais aos da web aberta. Tratamento de erros

Sua chave sem JavaScript

A Shannon também tem um site sem JavaScript, acessível na web aberta, como serviço onion e como eepsite. A sua página /keys mostra a sua chave de API e permite rotacioná-la, de modo que você pode obter uma chave sem sair do Tor ou do I2P. encrypted.shannon-ai.com/keys

Os endereços desse site nas três redes estão listados aqui: Acesso criptografado