Krypterede endpoints, Tor og I2P
API'et er også offentliggjort som en Tor onion-tjeneste og en I2P-eepsite. Samme ruter, samme nøgle; kun base-URL'en og proxyen ændres.
Base-URL'er
Fire adresser fører til det samme API. Brug den, der passer til dit netværk, med den samme API-nøgle og de samme anmodninger.
| Netværk | Base-URL | Sådan når du den |
|---|---|---|
| Åbent web | https://api.shannon-ai.com/v1 | Direkte, over HTTPS. |
| Krypteret spejl | https://api-encrypted.shannon-ai.com/v1 | Direkte, over HTTPS. Et andet værtsnavn til det samme API. |
| Tor (onion-tjeneste) | http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 | Gennem en Tor-klient: en SOCKS5-proxy, som standard på 127.0.0.1:9050. |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | Gennem en I2P-router: en HTTP-proxy, som standard på 127.0.0.1:4444. |
- Et OpenAI-SDK tager base-URL'en som vist, med
/v1. Et Anthropic-SDK tager den uden/v1. - For at kontrollere en adresse skal du læse svarheaderne fra
https://api.shannon-ai.com:Onion-Locationhar onion-adressen ogX-I2P-LocationI2P-adressen. Onion-adressen starter medshannon.
Hvilke ruter der virker
Hver /v1-rute svarer på alle fire adresser:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /v1/models
GET /v1/models kræver ingen nøgle, hvilket gør det til en hurtig test af, at din proxy når API'et.
Hvad der er det samme, og hvad der afviger
| Emne | Det samme? | Detalje |
|---|---|---|
| Ruter, anmodningsfelter, svar, fejl | Det samme | De samme på alle adresser. Ingen rute opfører sig anderledes efter værtsnavn. |
| API-nøgle | Det samme | Én nøgle virker på alle adresser, som Authorization: Bearer eller x-api-key. Cookies læses aldrig på /v1. |
| Saldo og grænser | Det samme | Den samme saldo og den samme grænse på 120 anmodninger per minut. Begge tælles per konto, ikke per adresse. |
| Anmodningens størrelse | Det samme | Op til 32 MiB per anmodnings body. |
| Skema | Afviger | https:// på det åbne web og på spejlet. http:// på adresserne .onion og .b32.i2p, hvor netværket selv krypterer forbindelsen fra ende til anden. |
| Proxy | Afviger | Ingen på det åbne web. En SOCKS5-proxy til Tor, en HTTP-proxy til I2P. Navnet skal opløses af proxyen, ikke af din maskine. |
| Hastighed | Afviger | Begge netværk tilføjer forsinkelse til hver byte. I2P er det langsomste af de to. |
Saldo og grænser er beskrevet på deres egen side. Grænser og saldo
cURL gennem Tor
Kør en Tor-klient på din maskine. Den tilbyder en SOCKS5-proxy på 127.0.0.1:9050. --socks5-hostname giver .onion-navnet videre til proxyen.
# 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 gennem I2P
Kør en I2P-router på din maskine. Den tilbyder en HTTP-proxy på 127.0.0.1:4444, som tager .b32.i2p-navnet, som det er.
# 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-base-URL
Et SDK kræver to ændringer: netværkets base-URL og en HTTP-klient, der går gennem proxyen. I Python tager begge officielle SDK'er en httpx-klient. Til en SOCKS-proxy skal du installere 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 og keep-alive på langsomme forbindelser
Streaming virker over begge netværk. Mens en stream er åben, og modellen endnu intet har at sende, sender API'et en keep-alive, så forbindelsen ikke ser død ud for en proxy eller for din klient.
| Endpoint | Keep-alive på en åben stream | Sendes for |
|---|---|---|
/v1/chat/completions | En kommentarlinje (den starter med :) hvert 15. sekund. | Alle modeller |
/v1/messages | En event: ping eller en kommentarlinje hvert 15. sekund. | Alle modeller |
/v1/responses | En kommentarlinje hvert 15. sekund. | Hostede open-weight-modeller |
- Send
"stream": true. Et streamet svar begynder at ankomme, så snart modellen skriver, og keep-alive viser, at anmodningen stadig behandles. Et svar uden streaming sender intet, før hele svaret er klart. - Giv klienten en lang læse-timeout. Eksemplerne bruger 600 sekunder. En timeout på under 15 sekunder kan afbryde en stream mellem to keep-alives.
- Lad din SSE-læser springe kommentarlinjer og
ping-hændelser over. SDK'erne gør det allerede. - Send ikke en anmodning igen i samme øjeblik, en forbindelse falder. En anmodning, der nåede API'et, kører til ende og tælles, også når forbindelsen er væk.
- Test stien med
GET /v1/modelsførst. Det kræver ingen nøgle og returnerer en kort JSON-liste.
Forbindelsesproblemer
| Symptom | Årsag og løsning |
|---|---|
Forbindelsen til 127.0.0.1:9050 eller 127.0.0.1:4444 afvises | Der kører ingen Tor-klient eller I2P-router på din maskine, eller den lytter på en anden port. Tor Browser tilbyder sin SOCKS-proxy på port 9150. |
Could not resolve host for .onion-navnet | Klienten forsøgte selv at opløse navnet. Brug --socks5-hostname i cURL og socks5h:// i en proxy-URL, så Tor-klienten opløser det. |
| I2P-proxyen svarer med sin egen fejlside | Routeren har endnu ikke fundet adressen. En router skal bruge nogle minutter efter start. Prøv igen. |
401 med Missing authentication | Anmodningen ankom uden en nøgle. Send den samme header som på det åbne web. |
Alle andre fejl er de samme som på det åbne web. Fejlhåndtering
Din nøgle uden JavaScript
Shannon har også et website uden JavaScript, som kan nås på det åbne web, som en onion-tjeneste og som en eepsite. Dets side /keys viser din API-nøgle og lader dig rotere den, så du kan få en nøgle uden at forlade Tor eller I2P. encrypted.shannon-ai.com/keys
Adresserne på det website på alle tre netværk står her: Krypteret adgang