Szyfrowane endpointy, Tor i I2P
API jest też opublikowane jako usługa onion Tor i eepsite I2P. Te same trasy, ten sam klucz; zmieniają się tylko base URL i proxy.
Base URL
Cztery adresy prowadzą do tego samego API. Użyj tego, który pasuje do Twojej sieci, z tym samym kluczem API i tymi samymi zapytaniami.
| Sieć | Base URL | Jak się z nim połączyć |
|---|---|---|
| Zwykła sieć | https://api.shannon-ai.com/v1 | Bezpośrednio, przez HTTPS. |
| Szyfrowany mirror | https://api-encrypted.shannon-ai.com/v1 | Bezpośrednio, przez HTTPS. Druga nazwa hosta tego samego API. |
| Tor (usługa onion) | http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 | Przez klienta Tor: proxy SOCKS5, domyślnie pod 127.0.0.1:9050. |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | Przez router I2P: proxy HTTP, domyślnie pod 127.0.0.1:4444. |
- SDK OpenAI przyjmuje base URL tak, jak pokazano, z
/v1. SDK Anthropic przyjmuje go bez/v1. - Aby sprawdzić adres, przeczytaj nagłówki odpowiedzi z
https://api.shannon-ai.com:Onion-Locationniesie adres onion, aX-I2P-Locationadres I2P. Adres onion zaczyna się odshannon.
Które trasy działają
Każda trasa /v1 odpowiada pod wszystkimi czterema adresami:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /v1/models
GET /v1/models nie wymaga klucza, więc jest szybkim testem, czy Twoje proxy dociera do API.
Co jest takie samo, a co się różni
| Element | Tak samo? | Szczegóły |
|---|---|---|
| Trasy, pola zapytań, odpowiedzi, błędy | Tak samo | Takie same pod każdym adresem. Żadna trasa nie zachowuje się inaczej w zależności od nazwy hosta. |
| Klucz API | Tak samo | Jeden klucz działa pod każdym adresem, jako Authorization: Bearer lub x-api-key. Ciasteczka nigdy nie są czytane w /v1. |
| Saldo i limity | Tak samo | To samo saldo i ten sam limit 120 zapytań na minutę. Oba są liczone na konto, nie na adres. |
| Rozmiar zapytania | Tak samo | Do 32 MiB na treść zapytania. |
| Schemat | Inaczej | https:// w zwykłej sieci i w mirrorze. http:// pod adresami .onion i .b32.i2p, gdzie sama sieć szyfruje połączenie od końca do końca. |
| Proxy | Inaczej | Brak w zwykłej sieci. Proxy SOCKS5 dla Tor, proxy HTTP dla I2P. Nazwę musi rozwiązać proxy, a nie Twój komputer. |
| Szybkość | Inaczej | Obie sieci dodają opóźnienie do każdego bajtu. I2P jest wolniejsza z tych dwóch. |
Saldo i limity opisuje ich własna strona. Limity i saldo
cURL przez Tor
Uruchom klienta Tor na swoim komputerze. Udostępnia proxy SOCKS5 pod 127.0.0.1:9050. --socks5-hostname przekazuje tej proxy nazwę .onion.
# 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 przez I2P
Uruchom router I2P na swoim komputerze. Udostępnia proxy HTTP pod 127.0.0.1:4444, które przyjmuje nazwę .b32.i2p bez zmian.
# 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 dla SDK
SDK potrzebuje dwóch zmian: base URL sieci oraz klienta HTTP, który idzie przez proxy. W Pythonie oba oficjalne SDK przyjmują klienta httpx. Dla proxy SOCKS zainstaluj 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 na wolnych łączach
Streaming działa w obu sieciach. Gdy stream jest otwarty, a model nie ma jeszcze nic do wysłania, API wysyła keep-alive, aby połączenie nie wyglądało na martwe dla proxy ani dla Twojego klienta.
| Endpoint | Keep-alive w otwartym streamie | Wysyłane dla |
|---|---|---|
/v1/chat/completions | Wiersz komentarza (zaczyna się od :) co 15 sekund. | Wszystkie modele |
/v1/messages | event: ping albo wiersz komentarza co 15 sekund. | Wszystkie modele |
/v1/responses | Wiersz komentarza co 15 sekund. | Hostowane modele open-weight |
- Wyślij
"stream": true. Odpowiedź ze streamingiem zaczyna napływać, gdy tylko model pisze, a keep-alive pokazuje, że zapytanie nadal jest przetwarzane. Odpowiedź bez streamingu nie wysyła nic, dopóki cała odpowiedź nie jest gotowa. - Ustaw w kliencie długi timeout odczytu. Przykłady używają 600 sekund. Timeout krótszy niż 15 sekund może przerwać stream między dwoma keep-alive.
- Pozwól, aby Twój czytnik SSE pomijał wiersze komentarza i zdarzenia
ping. SDK już to robią. - Nie wysyłaj ponownie zapytania w chwili zerwania połączenia. Zapytanie, które dotarło do API, jest wykonywane do końca i liczone, także gdy połączenia już nie ma.
- Najpierw przetestuj trasę przez
GET /v1/models. Nie wymaga klucza i zwraca krótką listę JSON.
Problemy z połączeniem
| Objaw | Przyczyna i rozwiązanie |
|---|---|
Połączenie z 127.0.0.1:9050 lub 127.0.0.1:4444 jest odrzucane | Na Twoim komputerze nie działa klient Tor ani router I2P albo nasłuchuje na innym porcie. Tor Browser udostępnia proxy SOCKS na porcie 9150. |
Could not resolve host dla nazwy .onion | Klient próbował sam rozwiązać nazwę. Użyj --socks5-hostname w cURL i socks5h:// w URL proxy, aby klient Tor ją rozwiązał. |
| Proxy I2P odpowiada własną stroną błędu | Router nie znalazł jeszcze adresu. Router potrzebuje kilku minut po uruchomieniu. Spróbuj ponownie. |
401 z Missing authentication | Zapytanie dotarło bez klucza. Wyślij ten sam nagłówek co w zwykłej sieci. |
Każdy inny błąd jest taki sam jak w zwykłej sieci. Obsługa błędów
Twój klucz bez JavaScript
Shannon ma też stronę bez JavaScript, dostępną w zwykłej sieci, jako usługa onion i jako eepsite. Jej strona /keys pokazuje Twój klucz API i pozwala go zrotować, więc możesz zdobyć klucz bez opuszczania Tor lub I2P. encrypted.shannon-ai.com/keys
Adresy tej strony we wszystkich trzech sieciach są wymienione tutaj: Dostęp szyfrowany