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-Locationporta l'adreça onion iX-I2P-Locationl'adreça I2P. L'adreça onion comença pershannon.
Quines rutes funcionen
Totes les rutes /v1 responen a les quatre adreces:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /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.
# 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.
# 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) # 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 en connexions lentes
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