Krypterade endpoints, Tor och I2P
API:et publiceras också som en Tor onion-tjänst och en I2P eepsite. Samma sökvägar, samma nyckel; bara bas-URL:en och proxyn ändras.
Bas-URL:er
Fyra adresser leder till samma API. Använd den som passar ditt nätverk, med samma API-nyckel och samma begäranden.
| Nätverk | Bas-URL | Så når du den |
|---|---|---|
| Öppna webben | https://api.shannon-ai.com/v1 | Direkt, över HTTPS. |
| Krypterad spegel | https://api-encrypted.shannon-ai.com/v1 | Direkt, över HTTPS. Ett andra värdnamn för samma API. |
| Tor (onion-tjänst) | http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 | Via en Tor-klient: en SOCKS5-proxy, som standard på 127.0.0.1:9050. |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | Via en I2P-router: en HTTP-proxy, som standard på 127.0.0.1:4444. |
- En OpenAI-SDK tar bas-URL:en som den visas, med
/v1. En Anthropic-SDK tar den utan/v1. - För att kontrollera en adress, läs svarsheadrarna från
https://api.shannon-ai.com:Onion-Locationbär onion-adressen ochX-I2P-LocationI2P-adressen. Onion-adressen börjar medshannon.
Vilka sökvägar som fungerar
Varje /v1-sökväg svarar på alla fyra adresserna:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /v1/models
GET /v1/models kräver ingen nyckel, vilket gör den till ett snabbt test av att din proxy når API:et.
Vad som är lika och vad som skiljer sig
| Punkt | Samma? | Detalj |
|---|---|---|
| Sökvägar, begäranfält, svar, fel | Lika | Samma på varje adress. Ingen sökväg beter sig annorlunda beroende på värdnamn. |
| API-nyckel | Lika | En nyckel fungerar på varje adress, som Authorization: Bearer eller x-api-key. Cookies läses aldrig på /v1. |
| Balans och gränser | Lika | Samma balans och samma gräns på 120 begäranden per minut. Båda räknas per konto, inte per adress. |
| Begärans storlek | Lika | Upp till 32 MiB per begäranbody. |
| Schema | Skiljer sig | https:// på den öppna webben och på spegeln. http:// på adresserna .onion och .b32.i2p, där nätverket självt krypterar anslutningen från ände till ände. |
| Proxy | Skiljer sig | Ingen på den öppna webben. En SOCKS5-proxy för Tor, en HTTP-proxy för I2P. Namnet måste slås upp av proxyn, inte av din dator. |
| Hastighet | Skiljer sig | Båda nätverken lägger till fördröjning för varje byte. I2P är det långsammaste av de två. |
Balans och gränser beskrivs på sin egen sida. Gränser och balans
cURL via Tor
Kör en Tor-klient på din dator. Den erbjuder en SOCKS5-proxy på 127.0.0.1:9050. --socks5-hostname lämnar .onion-namnet till den proxyn.
# 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 via I2P
Kör en I2P-router på din dator. Den erbjuder en HTTP-proxy på 127.0.0.1:4444, som tar .b32.i2p-namnet som det är.
# 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"}]
}' SDK:ns bas-URL
En SDK behöver två ändringar: nätverkets bas-URL och en HTTP-klient som går via proxyn. I Python tar båda de officiella SDK:erna en httpx-klient. För en SOCKS-proxy installerar du 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 och keep-alive på långsamma anslutningar
Streaming fungerar över båda nätverken. Medan en ström är öppen och modellen ännu inte har något att skicka skickar API:et en keep-alive, så att anslutningen inte ser död ut för en proxy eller för din klient.
| Endpoint | Keep-alive på en öppen ström | Skickas för |
|---|---|---|
/v1/chat/completions | En kommentarsrad (den börjar med :) var 15:e sekund. | Alla modeller |
/v1/messages | En event: ping, eller en kommentarsrad, var 15:e sekund. | Alla modeller |
/v1/responses | En kommentarsrad var 15:e sekund. | Hostade open-weight-modeller |
- Skicka
"stream": true. Ett streamat svar börjar komma så snart modellen skriver, och keep-alive visar att begäran fortfarande bearbetas. Ett svar som inte streamas skickar ingenting förrän hela svaret är klart. - Ge klienten en lång läs-timeout. Exemplen använder 600 sekunder. En timeout kortare än 15 sekunder kan avsluta en ström mellan två keep-alives.
- Låt din SSE-läsare hoppa över kommentarsrader och
ping-händelser. SDK:erna gör redan detta. - Skicka inte om en begäran i samma stund som en anslutning bryts. En begäran som nådde API:et körs till slut och räknas, även när anslutningen är borta.
- Testa vägen med
GET /v1/modelsförst. Den kräver ingen nyckel och returnerar en kort JSON-lista.
Anslutningsproblem
| Symptom | Orsak och åtgärd |
|---|---|
Anslutningen till 127.0.0.1:9050 eller 127.0.0.1:4444 nekas | Ingen Tor-klient eller I2P-router körs på din dator, eller så lyssnar den på en annan port. Tor Browser erbjuder sin SOCKS-proxy på port 9150. |
Could not resolve host för .onion-namnet | Klienten försökte slå upp namnet själv. Använd --socks5-hostname i cURL och socks5h:// i en proxy-URL, så att Tor-klienten slår upp det. |
| I2P-proxyn svarar med sin egen felsida | Routern har inte hittat adressen än. En router behöver några minuter efter start. Försök igen. |
401 med Missing authentication | Begäran kom utan nyckel. Skicka samma header som på den öppna webben. |
Varje annat fel är detsamma som på den öppna webben. Felhantering
Din nyckel utan JavaScript
Shannon har också en webbplats utan JavaScript, nåbar på den öppna webben, som onion-tjänst och som eepsite. Dess sida /keys visar din API-nyckel och låter dig byta den, så att du kan få en nyckel utan att lämna Tor eller I2P. encrypted.shannon-ai.com/keys
Adresserna till den webbplatsen på alla tre nätverken listas här: Krypterad åtkomst