Endpoints cifrados, Tor e I2P
A API tamén se publica como servizo onion de Tor e como eepsite de I2P. As mesmas rutas, a mesma clave; só cambian a URL base e o proxy.
URL base
Catro enderezos levan á mesma API. Usa o que se axuste á túa rede, coa mesma clave API e as mesmas solicitudes.
| Rede | URL base | Como acceder |
|---|---|---|
| Web aberta | https://api.shannon-ai.com/v1 | Directo, por HTTPS. |
| Espello cifrado | https://api-encrypted.shannon-ai.com/v1 | Directo, por HTTPS. Un segundo nome de host para a mesma API. |
| Tor (servizo onion) | http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 | Mediante un cliente Tor: un proxy SOCKS5, por defecto en 127.0.0.1:9050. |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | Mediante un router I2P: un proxy HTTP, por defecto en 127.0.0.1:4444. |
- Un SDK de OpenAI recibe a URL base tal como se mostra, con
/v1. Un SDK de Anthropic recíbea sen/v1. - Para comprobar un enderezo, le as cabeceiras de resposta de
https://api.shannon-ai.com:Onion-Locationleva o enderezo onion eX-I2P-Locationo enderezo I2P. O enderezo onion comeza porshannon.
Que rutas funcionan
Todas as rutas /v1 responden nos catro enderezos:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /v1/models
GET /v1/models non necesita clave, o que o converte nunha proba rápida de que o teu proxy chega á API.
O que é igual e o que difire
| Elemento | Igual? | Detalle |
|---|---|---|
| Rutas, campos de solicitude, respostas, erros | Igual | O mesmo en todos os enderezos. Ningunha ruta se comporta de maneira distinta segundo o nome de host. |
| Clave API | Igual | Unha clave funciona en todos os enderezos, como Authorization: Bearer ou x-api-key. As cookies nunca se len en /v1. |
| Saldo e límites | Igual | O mesmo saldo e o mesmo límite de 120 solicitudes por minuto. Ambos contan por conta, non por enderezo. |
| Tamaño da solicitude | Igual | Ata 32 MiB por corpo de solicitude. |
| Esquema | Difire | https:// na web aberta e no espello. http:// nos enderezos .onion e .b32.i2p, onde a propia rede cifra a conexión de extremo a extremo. |
| Proxy | Difire | Ningún na web aberta. Un proxy SOCKS5 para Tor, un proxy HTTP para I2P. O nome debe resolverllo o proxy, non a túa máquina. |
| Velocidade | Difire | Ambas as redes engaden atraso a cada byte. I2P é a máis lenta das dúas. |
O saldo e os límites descríbense na súa propia páxina. Límites e saldo
cURL por Tor
Executa un cliente Tor na túa máquina. Ofrece un proxy SOCKS5 en 127.0.0.1:9050. --socks5-hostname entrega o nome .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 por I2P
Executa un router I2P na túa máquina. Ofrece un proxy HTTP en 127.0.0.1:4444, que acepta o nome .b32.i2p tal cal.
# 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
Un SDK necesita dous cambios: a URL base da rede e un cliente HTTP que pase polo proxy. En Python, os dous SDK oficiais 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 e keep-alive en ligazóns lentas
O streaming funciona nas dúas redes. Mentres un stream está aberto e o modelo aínda non ten nada que enviar, a API envía un keep-alive, para que a conexión non pareza morta a un proxy ou ao teu cliente.
| Endpoint | Keep-alive nun stream aberto | Enviado para |
|---|---|---|
/v1/chat/completions | Unha liña de comentario (comeza por :) cada 15 segundos. | Todos os modelos |
/v1/messages | Un event: ping, ou unha liña de comentario, cada 15 segundos. | Todos os modelos |
/v1/responses | Unha liña de comentario cada 15 segundos. | Modelos open-weight alojados |
- Envía
"stream": true. Unha resposta con stream comeza a chegar en canto o modelo escribe, e o keep-alive mostra que a solicitude segue en curso. Unha resposta sen stream non envía nada ata que toda a resposta está lista. - Dálle ao cliente un tempo límite de lectura longo. Os exemplos usan 600 segundos. Un tempo límite inferior a 15 segundos pode cortar un stream entre dous keep-alives.
- Fai que o teu lector SSE salte as liñas de comentario e os eventos
ping. Os SDK xa o fan. - Non reenvíes unha solicitude no momento en que se cae a conexión. Unha solicitude que chegou á API execútase ata o final e cóntase, tamén cando a conexión xa non existe.
- Proba primeiro a ruta con
GET /v1/models. Non necesita clave e devolve unha lista JSON curta.
Problemas de conexión
| Síntoma | Causa e solución |
|---|---|
Rexéitase a conexión a 127.0.0.1:9050 ou 127.0.0.1:4444 | Non hai ningún cliente Tor nin router I2P en execución na túa máquina, ou escoita noutro porto. Tor Browser ofrece o seu proxy SOCKS no porto 9150. |
Could not resolve host para o nome .onion | O cliente tentou resolver o nome por si mesmo. Usa --socks5-hostname en cURL e socks5h:// nunha URL de proxy, para que o cliente Tor o resolva. |
| O proxy I2P responde coa súa propia páxina de erro | O router aínda non atopou o enderezo. Un router necesita uns minutos despois de iniciarse. Téntao de novo. |
401 con Missing authentication | A solicitude chegou sen clave. Envía a mesma cabeceira que na web aberta. |
Todos os demais erros son os mesmos que na web aberta. Xestión de erros
A túa clave sen JavaScript
Shannon tamén ten un sitio web sen JavaScript, accesible na web aberta, como servizo onion e como eepsite. A súa páxina /keys mostra a túa clave API e permíteche rotala, así que podes obter unha clave sen saír de Tor nin de I2P. encrypted.shannon-ai.com/keys
Os enderezos dese sitio web nas tres redes están listados aquí: Acceso cifrado