Saltar al contenido
Endpoints cifrados, Tor e I2P

Endpoints cifrados, Tor e I2P

La API también se publica como servicio onion de Tor y como eepsite de I2P. Mismas rutas, misma clave; solo cambian la URL base y el proxy.

URL base

Cuatro direcciones llevan a la misma API. Usa la que se adapte a tu red, con la misma clave API y las mismas solicitudes.

Red URL base Cómo se llega
Web abierta https://api.shannon-ai.com/v1 Directo, por HTTPS.
Espejo cifrado https://api-encrypted.shannon-ai.com/v1 Directo, por HTTPS. Un segundo nombre de host para la misma API.
Tor (servicio onion) http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 A través de un cliente Tor: un proxy SOCKS5, por defecto en 127.0.0.1:9050.
I2P (eepsite) http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 A través de un router I2P: un proxy HTTP, por defecto en 127.0.0.1:4444.
  • Un SDK de OpenAI toma la URL base como se muestra, con /v1. Un SDK de Anthropic la toma sin /v1.
  • Para comprobar una dirección, lee los headers de respuesta de https://api.shannon-ai.com: Onion-Location lleva la dirección onion y X-I2P-Location la dirección I2P. La dirección onion empieza con shannon.

Qué rutas funcionan

Cada ruta /v1 responde en las cuatro direcciones:

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

GET /v1/models no necesita clave, lo que lo convierte en una prueba rápida de que tu proxy llega a la API.

Qué es igual y qué difiere

Elemento ¿Igual? Detalle
Rutas, campos de solicitud, respuestas, errores Igual Lo mismo en todas las direcciones. Ninguna ruta se comporta distinto según el nombre de host.
Clave API Igual Una clave funciona en todas las direcciones, como Authorization: Bearer o x-api-key. Las cookies nunca se leen en /v1.
Saldo y límites Igual El mismo saldo y el mismo límite de 120 solicitudes por minuto. Ambos se cuentan por cuenta, no por dirección.
Tamaño de la solicitud Igual Hasta 32 MiB por cuerpo de solicitud.
Esquema Difiere https:// en la web abierta y en el espejo. http:// en las direcciones .onion y .b32.i2p, donde la propia red cifra la conexión de extremo a extremo.
Proxy Difiere Ninguno en la web abierta. Un proxy SOCKS5 para Tor, un proxy HTTP para I2P. El nombre debe resolverlo el proxy, no tu máquina.
Velocidad Difiere Ambas redes añaden retardo a cada byte. I2P es la más lenta de las dos.

El saldo y los límites se describen en su propia página. Límites y saldo

cURL a través de Tor

Ejecuta un cliente Tor en tu máquina. Ofrece un proxy SOCKS5 en 127.0.0.1:9050. --socks5-hostname entrega el nombre .onion a ese 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 a través de I2P

Ejecuta un router I2P en tu máquina. Ofrece un proxy HTTP en 127.0.0.1:4444, que acepta el nombre .b32.i2p tal cual.

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 del SDK

Un SDK necesita dos cambios: la URL base de la red y un cliente HTTP que pase por el proxy. En Python ambos SDK oficiales aceptan un cliente httpx. Para un proxy SOCKS instala 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)

El streaming funciona en ambas redes. Mientras un stream está abierto y el modelo aún no tiene nada que enviar, la API envía un keep-alive, para que la conexión no parezca muerta a un proxy ni a tu cliente.

Endpoint Keep-alive en un stream abierto Se envía para
/v1/chat/completions Una línea de comentario (empieza con :) cada 15 segundos. Todos los modelos
/v1/messages Un event: ping, o una línea de comentario, cada 15 segundos. Todos los modelos
/v1/responses Una línea de comentario cada 15 segundos. Modelos de pesos abiertos alojados
  • Envía "stream": true. Una respuesta con stream empieza a llegar en cuanto el modelo escribe, y el keep-alive muestra que la solicitud sigue en proceso. Una respuesta sin stream no envía nada hasta que toda la respuesta está lista.
  • Dale al cliente un timeout de lectura largo. Los ejemplos usan 600 segundos. Un timeout menor de 15 segundos puede cortar un stream entre dos keep-alives.
  • Haz que tu lector SSE omita las líneas de comentario y los eventos ping. Los SDK ya lo hacen.
  • No vuelvas a enviar una solicitud en cuanto se corte una conexión. Una solicitud que llegó a la API se ejecuta hasta el final y se cuenta, también cuando la conexión ya no existe.
  • Prueba primero la ruta con GET /v1/models. No necesita clave y devuelve una lista JSON corta.

Problemas de conexión

Síntoma Causa y solución
Se rechaza la conexión a 127.0.0.1:9050 o 127.0.0.1:4444 No hay ningún cliente Tor ni router I2P en ejecución en tu máquina, o escucha en otro puerto. Tor Browser ofrece su proxy SOCKS en el puerto 9150.
Could not resolve host para el nombre .onion El cliente intentó resolver el nombre por sí mismo. Usa --socks5-hostname en cURL y socks5h:// en una URL de proxy, para que el cliente Tor lo resuelva.
El proxy I2P responde con su propia página de error El router aún no ha encontrado la dirección. Un router necesita unos minutos después de arrancar. Inténtalo de nuevo.
401 con Missing authentication La solicitud llegó sin clave. Envía el mismo header que en la web abierta.

Cualquier otro error es igual que en la web abierta. Manejo de errores

Tu clave sin JavaScript

Shannon también tiene un sitio web sin JavaScript, accesible en la web abierta, como servicio onion y como eepsite. Su página /keys muestra tu clave API y te deja rotarla, así que puedes obtener una clave sin salir de Tor ni de I2P. encrypted.shannon-ai.com/keys

Las direcciones de ese sitio web en las tres redes se enumeran aquí: Acceso cifrado