Endpoint-uri criptate, Tor & I2P
API-ul este publicat și ca serviciu onion Tor și ca eepsite I2P. Aceleași rute, aceeași cheie; se schimbă doar base URL și proxy-ul.
Base URL-uri
Patru adrese duc la același API. Folosește-o pe cea care se potrivește rețelei tale, cu aceeași cheie API și aceleași cereri.
| Rețea | Base URL | Cum ajungi la el |
|---|---|---|
| Web obișnuit | https://api.shannon-ai.com/v1 | Direct, prin HTTPS. |
| Mirror criptat | https://api-encrypted.shannon-ai.com/v1 | Direct, prin HTTPS. Un al doilea nume de gazdă pentru același API. |
| Tor (serviciu onion) | http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 | Printr-un client Tor: un proxy SOCKS5, implicit la 127.0.0.1:9050. |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | Printr-un router I2P: un proxy HTTP, implicit la 127.0.0.1:4444. |
- Un SDK OpenAI primește base URL așa cum este arătat, cu
/v1. Un SDK Anthropic îl primește fără/v1. - Pentru a verifica o adresă, citește header-ele de răspuns de la
https://api.shannon-ai.com:Onion-Locationconține adresa onion, iarX-I2P-Locationadresa I2P. Adresa onion începe cushannon.
Ce rute funcționează
Fiecare rută /v1 răspunde pe toate cele patru adrese:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /v1/models
GET /v1/models nu cere cheie, deci este un test rapid că proxy-ul tău ajunge la API.
Ce este la fel și ce diferă
| Element | La fel? | Detaliu |
|---|---|---|
| Rute, câmpuri de cerere, răspunsuri, erori | La fel | La fel pe fiecare adresă. Nicio rută nu se comportă diferit în funcție de numele gazdei. |
| Cheie API | La fel | O singură cheie funcționează pe orice adresă, ca Authorization: Bearer sau x-api-key. Cookie-urile nu sunt citite niciodată pe /v1. |
| Sold și limite | La fel | Același sold și aceeași limită de 120 de cereri pe minut. Ambele sunt numărate per cont, nu per adresă. |
| Mărimea cererii | La fel | Până la 32 MiB per corp de cerere. |
| Schemă | Diferă | https:// pe web-ul obișnuit și pe mirror. http:// pe adresele .onion și .b32.i2p, unde rețeaua însăși criptează conexiunea de la un capăt la altul. |
| Proxy | Diferă | Niciunul pe web-ul obișnuit. Un proxy SOCKS5 pentru Tor, un proxy HTTP pentru I2P. Numele trebuie rezolvat de proxy, nu de mașina ta. |
| Viteză | Diferă | Ambele rețele adaugă întârziere fiecărui octet. I2P este mai lentă dintre cele două. |
Soldul și limitele sunt descrise pe pagina lor. Limite și sold
cURL prin Tor
Rulează un client Tor pe mașina ta. Acesta oferă un proxy SOCKS5 la 127.0.0.1:9050. --socks5-hostname dă numele .onion acelui 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 prin I2P
Rulează un router I2P pe mașina ta. Acesta oferă un proxy HTTP la 127.0.0.1:4444, care primește numele .b32.i2p așa cum este.
# 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 pentru SDK
Un SDK are nevoie de două schimbări: base URL al rețelei și un client HTTP care trece prin proxy. În Python, ambele SDK-uri oficiale primesc un client httpx. Pentru un proxy SOCKS instalează 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 și keep-alive pe conexiuni lente
Streaming-ul funcționează peste ambele rețele. Cât timp un stream este deschis și modelul nu are încă nimic de trimis, API-ul trimite un keep-alive, ca să nu pară moartă conexiunea pentru un proxy sau pentru clientul tău.
| Endpoint | Keep-alive pe un stream deschis | Trimis pentru |
|---|---|---|
/v1/chat/completions | O linie de comentariu (începe cu :) la fiecare 15 secunde. | Toate modelele |
/v1/messages | Un event: ping sau o linie de comentariu, la fiecare 15 secunde. | Toate modelele |
/v1/responses | O linie de comentariu la fiecare 15 secunde. | Modele open-weight găzduite |
- Trimite
"stream": true. Un răspuns cu streaming începe să sosească de îndată ce modelul scrie, iar keep-alive arată că cererea încă se lucrează. Un răspuns fără streaming nu trimite nimic până când tot răspunsul este gata. - Dă clientului un read timeout lung. Exemplele folosesc 600 de secunde. Un timeout mai scurt de 15 secunde poate încheia un stream între două keep-alive-uri.
- Lasă cititorul tău SSE să sară liniile de comentariu și evenimentele
ping. SDK-urile fac deja asta. - Nu retrimite o cerere în clipa în care se întrerupe o conexiune. O cerere care a ajuns la API rulează până la capăt și este numărată, chiar și când conexiunea a dispărut.
- Testează mai întâi calea cu
GET /v1/models. Nu cere cheie și returnează o listă JSON scurtă.
Probleme de conexiune
| Simptom | Cauză și remediu |
|---|---|
Conexiunea la 127.0.0.1:9050 sau 127.0.0.1:4444 este refuzată | Pe mașina ta nu rulează niciun client Tor sau router I2P ori acesta ascultă pe alt port. Tor Browser oferă proxy-ul său SOCKS pe portul 9150. |
Could not resolve host pentru numele .onion | Clientul a încercat să rezolve singur numele. Folosește --socks5-hostname în cURL și socks5h:// într-un URL de proxy, ca să îl rezolve clientul Tor. |
| Proxy-ul I2P răspunde cu propria pagină de eroare | Routerul nu a găsit încă adresa. Un router are nevoie de câteva minute după pornire. Încearcă din nou. |
401 cu Missing authentication | Cererea a ajuns fără cheie. Trimite același header ca pe web-ul obișnuit. |
Orice altă eroare este aceeași ca pe web-ul obișnuit. Gestionare erori
Cheia ta fără JavaScript
Shannon are și un site web fără JavaScript, accesibil pe web-ul obișnuit, ca serviciu onion și ca eepsite. Pagina lui /keys îți arată cheia API și te lasă să o schimbi, deci poți obține o cheie fără să părăsești Tor sau I2P. encrypted.shannon-ai.com/keys
Adresele acelui site web pe toate cele trei rețele sunt listate aici: Acces criptat