Vai al contenuto
Endpoint cifrati, Tor e I2P

Endpoint cifrati, Tor e I2P

L'API è pubblicata anche come servizio onion Tor e come eepsite I2P. Stessi percorsi, stessa chiave; cambiano solo il base URL e il proxy.

Base URL

Quattro indirizzi portano alla stessa API. Usa quello adatto alla tua rete, con la stessa chiave API e le stesse richieste.

Rete Base URL Come lo raggiungi
Clearnet https://api.shannon-ai.com/v1 Diretto, tramite HTTPS.
Mirror cifrato https://api-encrypted.shannon-ai.com/v1 Diretto, tramite HTTPS. Un secondo nome host per la stessa API.
Tor (servizio onion) http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 Tramite un client Tor: un proxy SOCKS5, per impostazione predefinita su 127.0.0.1:9050.
I2P (eepsite) http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 Tramite un router I2P: un proxy HTTP, per impostazione predefinita su 127.0.0.1:4444.
  • Un SDK OpenAI accetta il base URL come mostrato, con /v1. Un SDK Anthropic lo accetta senza /v1.
  • Per verificare un indirizzo, leggi gli header della risposta di https://api.shannon-ai.com: Onion-Location porta l'indirizzo onion e X-I2P-Location l'indirizzo I2P. L'indirizzo onion inizia con shannon.

Quali percorsi funzionano

Ogni percorso /v1 risponde su tutti e quattro gli indirizzi:

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

GET /v1/models non richiede una chiave, il che lo rende un test rapido per verificare che il tuo proxy raggiunga l'API.

Cosa è uguale e cosa differisce

Voce Uguale? Dettaglio
Percorsi, campi della richiesta, risposte, errori Uguale Uguali su ogni indirizzo. Nessun percorso si comporta in modo diverso in base al nome host.
Chiave API Uguale Una chiave funziona su ogni indirizzo, come Authorization: Bearer o x-api-key. I cookie non vengono mai letti su /v1.
Saldo e limiti Uguale Lo stesso saldo e lo stesso limite di 120 richieste al minuto. Entrambi sono conteggiati per account, non per indirizzo.
Dimensione della richiesta Uguale Fino a 32 MiB per corpo della richiesta.
Schema Differisce https:// sul clearnet e sul mirror. http:// sugli indirizzi .onion e .b32.i2p, dove è la rete stessa a cifrare la connessione da un capo all'altro.
Proxy Differisce Nessuno sul clearnet. Un proxy SOCKS5 per Tor, un proxy HTTP per I2P. Il nome deve essere risolto dal proxy, non dalla tua macchina.
Velocità Differisce Entrambe le reti aggiungono ritardo a ogni byte. I2P è la più lenta delle due.

Saldo e limiti sono descritti nella loro pagina. Limiti e saldo

cURL tramite Tor

Esegui un client Tor sulla tua macchina. Offre un proxy SOCKS5 su 127.0.0.1:9050. --socks5-hostname passa il nome .onion a quel 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 tramite I2P

Esegui un router I2P sulla tua macchina. Offre un proxy HTTP su 127.0.0.1:4444, che accetta il nome .b32.i2p così com'è.

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"}]
  }'

Base URL dell'SDK

Un SDK richiede due modifiche: il base URL della rete e un client HTTP che passi attraverso il proxy. In Python entrambi gli SDK ufficiali accettano un client httpx. Per un proxy SOCKS installa 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)

Lo streaming funziona su entrambe le reti. Mentre uno stream è aperto e il modello non ha ancora nulla da inviare, l'API invia un keep-alive, così la connessione non sembra morta a un proxy o al tuo client.

Endpoint Keep-alive su uno stream aperto Inviato per
/v1/chat/completions Una riga di commento (inizia con :) ogni 15 secondi. Tutti i modelli
/v1/messages Un event: ping, o una riga di commento, ogni 15 secondi. Tutti i modelli
/v1/responses Una riga di commento ogni 15 secondi. Modelli open-weight ospitati
  • Invia "stream": true. Una risposta in streaming inizia ad arrivare non appena il modello scrive, e il keep-alive mostra che la richiesta è ancora in lavorazione. Una risposta senza streaming non invia nulla finché l'intera risposta non è pronta.
  • Dai al client un timeout di lettura lungo. Gli esempi usano 600 secondi. Un timeout inferiore a 15 secondi può interrompere uno stream tra due keep-alive.
  • Fai in modo che il tuo lettore SSE salti le righe di commento e gli eventi ping. Gli SDK lo fanno già.
  • Non reinviare una richiesta nel momento in cui una connessione cade. Una richiesta arrivata all'API viene eseguita fino in fondo e conteggiata, anche quando la connessione non c'è più.
  • Prova prima il percorso con GET /v1/models. Non richiede una chiave e restituisce un breve elenco JSON.

Problemi di connessione

Sintomo Causa e rimedio
La connessione a 127.0.0.1:9050 o 127.0.0.1:4444 viene rifiutata Sulla tua macchina non è in esecuzione alcun client Tor o router I2P, oppure è in ascolto su un'altra porta. Tor Browser offre il proprio proxy SOCKS sulla porta 9150.
Could not resolve host per il nome .onion Il client ha provato a risolvere il nome da sé. Usa --socks5-hostname in cURL e socks5h:// in un URL proxy, così è il client Tor a risolverlo.
Il proxy I2P risponde con una propria pagina di errore Il router non ha ancora trovato l'indirizzo. Un router ha bisogno di qualche minuto dopo l'avvio. Riprova.
401 con Missing authentication La richiesta è arrivata senza una chiave. Invia lo stesso header usato sul clearnet.

Ogni altro errore è uguale a quello sul clearnet. Gestione errori

La tua chiave senza JavaScript

Shannon ha anche un sito web senza JavaScript, raggiungibile sul clearnet, come servizio onion e come eepsite. La sua pagina /keys mostra la tua chiave API e ti permette di ruotarla, così puoi ottenere una chiave senza uscire da Tor o I2P. encrypted.shannon-ai.com/keys

Gli indirizzi di quel sito web su tutte e tre le reti sono elencati qui: Accesso cifrato