Salta al contingut
Endpoints xifrats, Tor i I2P

Endpoints xifrats, Tor i I2P

L'API també es publica com a servei onion de Tor i com a eepsite d'I2P. Les mateixes rutes, la mateixa clau; només canvien la URL base i el proxy.

URL base

Quatre adreces porten a la mateixa API. Fes servir la que s'adapti a la teva xarxa, amb la mateixa clau API i les mateixes sol·licituds.

Xarxa URL base Com hi arribes
Web oberta https://api.shannon-ai.com/v1 Directament, per HTTPS.
Mirall xifrat https://api-encrypted.shannon-ai.com/v1 Directament, per HTTPS. Un segon nom de host per a la mateixa API.
Tor (servei onion) http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 Mitjançant un client Tor: un proxy SOCKS5, per defecte a 127.0.0.1:9050.
I2P (eepsite) http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 Mitjançant un router I2P: un proxy HTTP, per defecte a 127.0.0.1:4444.
  • Un SDK d'OpenAI pren la URL base tal com es mostra, amb /v1. Un SDK d'Anthropic la pren sense /v1.
  • Per comprovar una adreça, llegeix les capçaleres de resposta de https://api.shannon-ai.com: Onion-Location porta l'adreça onion i X-I2P-Location l'adreça I2P. L'adreça onion comença per shannon.

Quines rutes funcionen

Totes les rutes /v1 responen a les quatre adreces:

  • 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 necessita clau, per la qual cosa és una prova ràpida que el teu proxy arriba a l'API.

Què és igual i què difereix

Element Igual? Detall
Rutes, camps de sol·licitud, respostes, errors Igual Iguals a totes les adreces. Cap ruta es comporta de manera diferent segons el nom de host.
Clau API Igual Una clau serveix a totes les adreces, com a Authorization: Bearer o x-api-key. Les cookies no es llegeixen mai a /v1.
Saldo i límits Igual El mateix saldo i el mateix límit de 120 sol·licituds per minut. Tots dos es compten per compte, no per adreça.
Mida de la sol·licitud Igual Fins a 32 MiB per cos de sol·licitud.
Esquema Difereix https:// a la web oberta i al mirall. http:// a les adreces .onion i .b32.i2p, on la mateixa xarxa xifra la connexió d'extrem a extrem.
Proxy Difereix Cap a la web oberta. Un proxy SOCKS5 per a Tor, un proxy HTTP per a I2P. El nom l'ha de resoldre el proxy, no la teva màquina.
Velocitat Difereix Les dues xarxes afegeixen retard a cada byte. I2P és la més lenta de les dues.

El saldo i els límits es descriuen a la seva pròpia pàgina. Límits i saldo

cURL mitjançant Tor

Executa un client Tor a la teva màquina. Ofereix un proxy SOCKS5 a 127.0.0.1:9050. --socks5-hostname passa el nom .onion a aquest 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 mitjançant I2P

Executa un router I2P a la teva màquina. Ofereix un proxy HTTP a 127.0.0.1:4444, que accepta el nom .b32.i2p tal com és.

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 de l'SDK

Un SDK necessita dos canvis: la URL base de la xarxa i un client HTTP que passi pel proxy. A Python, els dos SDK oficials accepten un client httpx. Per a un proxy SOCKS instal·la 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 a les dues xarxes. Mentre un stream és obert i el model encara no té res per enviar, l'API envia un keep-alive, de manera que la connexió no sembla morta a un proxy ni al teu client.

Endpoint Keep-alive en un stream obert S'envia per a
/v1/chat/completions Una línia de comentari (comença per :) cada 15 segons. Tots els models
/v1/messages Un event: ping, o una línia de comentari, cada 15 segons. Tots els models
/v1/responses Una línia de comentari cada 15 segons. Models open-weight hostejats
  • Envia "stream": true. Una resposta amb streaming comença a arribar tan bon punt el model escriu, i el keep-alive mostra que la sol·licitud encara s'està processant. Una resposta sense streaming no envia res fins que tota la resposta és a punt.
  • Dona al client un timeout de lectura llarg. Els exemples fan servir 600 segons. Un timeout de menys de 15 segons pot tallar un stream entre dos keep-alives.
  • Fes que el teu lector SSE ignori les línies de comentari i els esdeveniments ping. Els SDK ja ho fan.
  • No tornis a enviar una sol·licitud en el moment que es perd una connexió. Una sol·licitud que ha arribat a l'API s'executa fins al final i es compta, també quan la connexió ja no hi és.
  • Prova primer el camí amb GET /v1/models. No necessita clau i retorna una llista JSON curta.

Problemes de connexió

Símptoma Causa i solució
La connexió a 127.0.0.1:9050 o 127.0.0.1:4444 és refusada No hi ha cap client Tor ni router I2P en execució a la teva màquina, o escolta en un altre port. Tor Browser ofereix el seu proxy SOCKS al port 9150.
Could not resolve host per al nom .onion El client ha intentat resoldre el nom per si mateix. Fes servir --socks5-hostname a cURL i socks5h:// en una URL de proxy, perquè el client Tor el resolgui.
El proxy I2P respon amb la seva pròpia pàgina d'error El router encara no ha trobat l'adreça. Un router necessita uns minuts després d'arrencar. Torna-ho a provar.
401 amb Missing authentication La sol·licitud ha arribat sense clau. Envia la mateixa capçalera que a la web oberta.

Tots els altres errors són els mateixos que a la web oberta. Gestió d’errors

La teva clau sense JavaScript

Shannon també té un lloc web sense JavaScript, accessible a la web oberta, com a servei onion i com a eepsite. La seva pàgina /keys mostra la teva clau API i et deixa rotar-la, de manera que pots obtenir una clau sense sortir de Tor ni d'I2P. encrypted.shannon-ai.com/keys

Les adreces d'aquest lloc web a les tres xarxes es llisten aquí: Accés xifrat