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-Locationlleva la dirección onion yX-I2P-Locationla dirección I2P. La dirección onion empieza conshannon.
Qué rutas funcionan
Cada ruta /v1 responde en las cuatro direcciones:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /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.
# 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.
# 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) # 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 y keep-alive en conexiones lentas
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