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-Locationtraz o endereço onion eX-I2P-Locationo endereço I2P. O endereço onion começa comshannon.
Quais rotas funcionam
Toda rota /v1 responde nos quatro endereços:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /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.
# 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á.
# 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) # pip install openai
import httpx
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1",
http_client=httpx.Client(proxy="http://127.0.0.1:4444", timeout=600),
)
stream = client.chat.completions.create(
model="shannon-3",
messages=[{"role": "user", "content": "Hello over I2P"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True) # pip install anthropic "httpx[socks]"
import anthropic
import httpx
client = anthropic.Anthropic(
api_key="YOUR_API_KEY",
base_url="http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion",
http_client=httpx.Client(proxy="socks5h://127.0.0.1:9050", timeout=600),
)
with client.messages.stream(
model="shannon-1.6-lite",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello over Tor"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True) Streaming e keep-alive em conexões lentas
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