Ĉifritaj endpoints, Tor & I2P
La API estas publikigita ankaŭ kiel servo onion de Tor kaj kiel eepsite de I2P. Samaj vojoj, sama ŝlosilo; ŝanĝiĝas nur la baza URL kaj la prokurilo.
Bazaj URL
Kvar adresoj kondukas al la sama API. Uzu tiun, kiu taŭgas por via reto, kun la sama API-ŝlosilo kaj la samaj petoj.
| Reto | Baza URL | Kiel vi atingas ĝin |
|---|---|---|
| Klara reto | https://api.shannon-ai.com/v1 | Rekte, per HTTPS. |
| Ĉifrita spegulo | https://api-encrypted.shannon-ai.com/v1 | Rekte, per HTTPS. Dua gastiganta nomo por la sama API. |
| Tor (servo onion) | http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 | Tra kliento de Tor: prokurilo SOCKS5, defaŭlte ĉe 127.0.0.1:9050. |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | Tra I2P-enkursigilo: HTTP-prokurilo, defaŭlte ĉe 127.0.0.1:4444. |
- SDK de OpenAI prenas la bazan URL kiel montrite, kun
/v1. SDK de Anthropic prenas ĝin sen/v1. - Por kontroli adreson, legu la kapojn de respondo de
https://api.shannon-ai.com:Onion-Locationportas la adreson onion kajX-I2P-Locationla adreson I2P. La adreso onion komenciĝas pershannon.
Kiuj vojoj funkcias
Ĉiu vojo /v1 respondas ĉe ĉiuj kvar adresoj:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /v1/models
GET /v1/models ne bezonas ŝlosilon, kio faras ĝin rapida testo, ke via prokurilo atingas la API.
Kio estas sama kaj kio malsamas
| Ero | Sama? | Detalo |
|---|---|---|
| Vojoj, kampoj de peto, respondoj, eraroj | Sama | Samaj ĉe ĉiu adreso. Neniu vojo kondutas alie laŭ la gastiganta nomo. |
| API-ŝlosilo | Sama | Unu ŝlosilo funkcias ĉe ĉiu adreso, kiel Authorization: Bearer aŭ x-api-key. Kuketoj neniam estas legataj ĉe /v1. |
| Saldo kaj limoj | Sama | La sama saldo kaj la sama limo de 120 petoj por minuto. Ambaŭ estas kalkulataj por konto, ne por adreso. |
| Grando de peto | Sama | Ĝis 32 MiB por korpo de peto. |
| Skemo | Malsamas | https:// ĉe la klara reto kaj ĉe la spegulo. http:// ĉe la adresoj .onion kaj .b32.i2p, kie la reto mem ĉifras la konekton de fino al fino. |
| Prokurilo | Malsamas | Neniu ĉe la klara reto. Prokurilo SOCKS5 por Tor, HTTP-prokurilo por I2P. La nomo devas esti solvata de la prokurilo, ne de via maŝino. |
| Rapideco | Malsamas | Ambaŭ retoj aldonas prokraston al ĉiu bajto. I2P estas la pli malrapida el la du. |
Saldo kaj limoj estas priskribitaj en sia propra paĝo. Limoj kaj saldo
cURL tra Tor
Funkciigu klienton de Tor sur via maŝino. Ĝi proponas prokurilon SOCKS5 ĉe 127.0.0.1:9050. --socks5-hostname transdonas la nomon .onion al tiu prokurilo.
# 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 tra I2P
Funkciigu I2P-enkursigilon sur via maŝino. Ĝi proponas HTTP-prokurilon ĉe 127.0.0.1:4444, kiu prenas la nomon .b32.i2p kiel ĝi estas.
# 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"}]
}' Baza URL de SDK
SDK bezonas du ŝanĝojn: la bazan URL de la reto, kaj HTTP-klienton, kiu pasas tra la prokurilo. En Python ambaŭ oficialaj SDK akceptas klienton httpx. Por prokurilo SOCKS instalu 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 kaj keep-alive ĉe malrapidaj ligoj
Streaming funkcias tra ambaŭ retoj. Dum fluo estas malfermita kaj la modelo ankoraŭ havas nenion por sendi, la API sendas keep-alive, por ke la konekto ne aspektu morta al prokurilo aŭ al via kliento.
| Endpoint | Keep-alive en malfermita fluo | Sendita por |
|---|---|---|
/v1/chat/completions | Komentlinio (ĝi komenciĝas per :) ĉiujn 15 sekundojn. | Ĉiuj modeloj |
/v1/messages | event: ping, aŭ komentlinio, ĉiujn 15 sekundojn. | Ĉiuj modeloj |
/v1/responses | Komentlinio ĉiujn 15 sekundojn. | Gastigitaj malfermpezaj modeloj |
- Sendu
"stream": true. Fluata respondo komencas alvenadi tuj kiam la modelo skribas, kaj la keep-alive montras, ke la peto ankoraŭ estas prilaborata. Ne fluata respondo sendas nenion ĝis la tuta respondo estas preta. - Donu al la kliento longan tempolimon de legado. La ekzemploj uzas 600 sekundojn. Tempolimo pli mallonga ol 15 sekundoj povas fini fluon inter du keep-alive.
- Lasu vian legilon de SSE preterpasi komentliniojn kaj eventojn
ping. La SDK jam faras tion. - Ne resendu peton en la momento, kiam konekto falas. Peto, kiu atingis la API, funkcias ĝis sia fino kaj estas kalkulata, ankaŭ kiam la konekto malaperis.
- Provu la vojon unue per
GET /v1/models. Ĝi ne bezonas ŝlosilon kaj redonas mallongan JSON-liston.
Problemoj de konekto
| Simptomo | Kaŭzo kaj riparo |
|---|---|
La konekto al 127.0.0.1:9050 aŭ 127.0.0.1:4444 estas rifuzita | Neniu kliento de Tor aŭ I2P-enkursigilo funkcias sur via maŝino, aŭ ĝi aŭskultas ĉe alia pordo. Tor Browser proponas sian prokurilon SOCKS ĉe pordo 9150. |
Could not resolve host por la nomo .onion | La kliento provis mem solvi la nomon. Uzu --socks5-hostname en cURL kaj socks5h:// en URL de prokurilo, por ke la kliento de Tor solvu ĝin. |
| La I2P-prokurilo respondas per sia propra erarpaĝo | La enkursigilo ankoraŭ ne trovis la adreson. Enkursigilo bezonas kelkajn minutojn post sia starto. Reprovu. |
401 kun Missing authentication | La peto alvenis sen ŝlosilo. Sendu la saman kapon kiel ĉe la klara reto. |
Ĉiu alia eraro estas sama kiel ĉe la klara reto. Erarotraktado
Via ŝlosilo sen JavaScript
Shannon havas ankaŭ retejon sen JavaScript, atingeblan ĉe la klara reto, kiel servo onion kaj kiel eepsite. Ĝia paĝo /keys montras vian API-ŝlosilon kaj lasas vin rotacii ĝin, do vi povas akiri ŝlosilon sen forlasi Tor aŭ I2P. encrypted.shannon-ai.com/keys
La adresoj de tiu retejo ĉe ĉiuj tri retoj estas listigitaj ĉi tie: Ĉifrita aliro