Endpoint terenkripsi, Tor & I2P
API ini juga dipublikasikan sebagai layanan onion Tor dan eepsite I2P. Route sama, kunci sama; hanya base URL dan proxy yang berubah.
Base URL
Empat alamat mengarah ke API yang sama. Gunakan yang cocok dengan jaringan Anda, dengan kunci API yang sama dan permintaan yang sama.
| Jaringan | Base URL | Cara menjangkaunya |
|---|---|---|
| Web biasa | https://api.shannon-ai.com/v1 | Langsung, melalui HTTPS. |
| Mirror terenkripsi | https://api-encrypted.shannon-ai.com/v1 | Langsung, melalui HTTPS. Nama host kedua untuk API yang sama. |
| Tor (layanan onion) | http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 | Melalui klien Tor: proxy SOCKS5, secara bawaan di 127.0.0.1:9050. |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | Melalui router I2P: proxy HTTP, secara bawaan di 127.0.0.1:4444. |
- SDK OpenAI memakai base URL seperti yang ditampilkan, dengan
/v1. SDK Anthropic memakainya tanpa/v1. - Untuk memeriksa sebuah alamat, baca header balasan
https://api.shannon-ai.com:Onion-Locationmembawa alamat onion danX-I2P-Locationalamat I2P. Alamat onion diawalishannon.
Route mana yang berfungsi
Setiap route /v1 menjawab di keempat alamat:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /v1/models
GET /v1/models tidak memerlukan kunci, sehingga menjadi uji cepat bahwa proxy Anda menjangkau API.
Apa yang sama dan apa yang berbeda
| Item | Sama? | Detail |
|---|---|---|
| Route, field permintaan, balasan, error | Sama | Sama di setiap alamat. Tidak ada route yang berperilaku berbeda menurut nama host. |
| Kunci API | Sama | Satu kunci berfungsi di setiap alamat, sebagai Authorization: Bearer atau x-api-key. Cookie tidak pernah dibaca pada /v1. |
| Saldo dan batas | Sama | Saldo yang sama dan batas 120 permintaan per menit yang sama. Keduanya dihitung per akun, bukan per alamat. |
| Ukuran permintaan | Sama | Hingga 32 MiB per body permintaan. |
| Skema | Berbeda | https:// pada web biasa dan pada mirror. http:// pada alamat .onion dan .b32.i2p, tempat jaringan itu sendiri mengenkripsi koneksi dari ujung ke ujung. |
| Proxy | Berbeda | Tidak ada pada web biasa. Proxy SOCKS5 untuk Tor, proxy HTTP untuk I2P. Nama harus di-resolve oleh proxy, bukan oleh mesin Anda. |
| Kecepatan | Berbeda | Kedua jaringan menambah penundaan pada setiap byte. I2P lebih lambat dari keduanya. |
Saldo dan batas dijelaskan di halamannya sendiri. Batas dan saldo
cURL melalui Tor
Jalankan klien Tor di mesin Anda. Klien menyediakan proxy SOCKS5 di 127.0.0.1:9050. --socks5-hostname menyerahkan nama .onion ke proxy itu.
# 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 melalui I2P
Jalankan router I2P di mesin Anda. Router menyediakan proxy HTTP di 127.0.0.1:4444, yang menerima nama .b32.i2p apa adanya.
# 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 SDK
SDK memerlukan dua perubahan: base URL jaringan tersebut, dan klien HTTP yang melewati proxy. Di Python, kedua SDK resmi menerima klien httpx. Untuk proxy SOCKS, instal 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 dan keep-alive pada koneksi lambat
Streaming berfungsi di kedua jaringan. Selama stream terbuka dan model belum punya apa pun untuk dikirim, API mengirim keep-alive, agar koneksi tidak tampak mati bagi proxy atau klien Anda.
| Endpoint | Keep-alive pada stream yang terbuka | Dikirim untuk |
|---|---|---|
/v1/chat/completions | Baris komentar (diawali :) setiap 15 detik. | Semua model |
/v1/messages | Sebuah event: ping, atau baris komentar, setiap 15 detik. | Semua model |
/v1/responses | Baris komentar setiap 15 detik. | Model open-weight hosted |
- Kirim
"stream": true. Balasan stream mulai datang begitu model menulis, dan keep-alive menunjukkan bahwa permintaan masih dikerjakan. Balasan tanpa stream tidak mengirim apa pun sampai seluruh jawaban siap. - Beri klien read timeout yang panjang. Contoh memakai 600 detik. Timeout yang lebih pendek dari 15 detik dapat memutus stream di antara dua keep-alive.
- Biarkan pembaca SSE Anda melewati baris komentar dan event
ping. SDK sudah melakukannya. - Jangan kirim ulang permintaan begitu koneksi terputus. Permintaan yang sudah sampai ke API berjalan sampai selesai dan dihitung, juga ketika koneksinya sudah hilang.
- Uji jalurnya lebih dulu dengan
GET /v1/models. Tidak memerlukan kunci dan mengembalikan daftar JSON yang pendek.
Masalah koneksi
| Gejala | Penyebab dan solusi |
|---|---|
Koneksi ke 127.0.0.1:9050 atau 127.0.0.1:4444 ditolak | Tidak ada klien Tor atau router I2P yang berjalan di mesin Anda, atau ia mendengarkan di port lain. Tor Browser menyediakan proxy SOCKS-nya di port 9150. |
Could not resolve host untuk nama .onion | Klien mencoba me-resolve nama itu sendiri. Gunakan --socks5-hostname di cURL dan socks5h:// di URL proxy, agar klien Tor yang me-resolve-nya. |
| Proxy I2P menjawab dengan halaman error miliknya sendiri | Router belum menemukan alamatnya. Router membutuhkan beberapa menit setelah dinyalakan. Coba lagi. |
401 dengan Missing authentication | Permintaan tiba tanpa kunci. Kirim header yang sama seperti di web biasa. |
Setiap error lainnya sama seperti di web biasa. Penanganan kesalahan
Kunci Anda tanpa JavaScript
Shannon juga memiliki situs web tanpa JavaScript, dapat dijangkau di web biasa, sebagai layanan onion, dan sebagai eepsite. Halaman /keys-nya menampilkan kunci API Anda dan memungkinkan Anda merotasinya, sehingga Anda bisa mendapatkan kunci tanpa meninggalkan Tor atau I2P. encrypted.shannon-ai.com/keys
Alamat situs web itu di ketiga jaringan tercantum di sini: Akses terenkripsi