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-Locationporta l'indirizzo onion eX-I2P-Locationl'indirizzo I2P. L'indirizzo onion inizia conshannon.
Quali percorsi funzionano
Ogni percorso /v1 risponde su tutti e quattro gli indirizzi:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /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.
# 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'è.
# 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) # 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 su collegamenti lenti
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