endpointهای رمزگذاریشده، Tor و I2P
API بهصورت سرویس onion در Tor و eepsite در I2P هم منتشر شده است. همان مسیرها، همان کلید؛ فقط base URL و پراکسی عوض میشوند.
Base URLها
چهار آدرس به همان API میرسند. آن را که با شبکه شما میخواند استفاده کنید، با همان کلید API و همان درخواستها.
| شبکه | Base URL | چگونه به آن میرسید |
|---|---|---|
| وب عادی | https://api.shannon-ai.com/v1 | مستقیم، از طریق HTTPS. |
| Mirror رمزگذاریشده | https://api-encrypted.shannon-ai.com/v1 | مستقیم، از طریق HTTPS. نام میزبان دوم برای همان API. |
| Tor (سرویس onion) | http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 | از طریق یک کلاینت Tor: یک پراکسی SOCKS5، بهطور پیشفرض در 127.0.0.1:9050. |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | از طریق یک router I2P: یک پراکسی HTTP، بهطور پیشفرض در 127.0.0.1:4444. |
- SDKهای OpenAI، base URL را همانطور که نشان داده شده، با
/v1، میگیرند. SDKهای Anthropic آن را بدون/v1میگیرند. - برای بررسی یک آدرس، هدرهای پاسخ
https://api.shannon-ai.comرا بخوانید:Onion-Locationآدرس onion وX-I2P-Locationآدرس I2P را دارد. آدرس onion باshannonشروع میشود.
کدام مسیرها کار میکنند
هر مسیر /v1 روی هر چهار آدرس پاسخ میدهد:
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /v1/models
GET /v1/models به کلید نیاز ندارد، پس آزمایش سریعی است برای اینکه ببینید پراکسی شما به API میرسد.
چه چیزی یکسان است و چه چیزی فرق دارد
| مورد | یکسان؟ | جزئیات |
|---|---|---|
| مسیرها، فیلدهای درخواست، پاسخها، خطاها | یکسان | در همه آدرسها یکسان است. هیچ مسیری بر اساس نام میزبان رفتار متفاوتی ندارد. |
| کلید API | یکسان | یک کلید روی همه آدرسها کار میکند، بهصورت Authorization: Bearer یا x-api-key. کوکیها در /v1 هرگز خوانده نمیشوند. |
| موجودی و محدودیتها | یکسان | همان موجودی و همان حد 120 درخواست در دقیقه. هر دو برای هر حساب شمرده میشوند، نه برای هر آدرس. |
| اندازه درخواست | یکسان | تا 32 MiB برای هر بدنه درخواست. |
| پروتکل | متفاوت | https:// در وب عادی و در mirror. http:// در آدرسهای .onion و .b32.i2p، که خود شبکه اتصال را بهصورت سرتاسری رمزگذاری میکند. |
| پراکسی | متفاوت | در وب عادی ندارد. برای Tor یک پراکسی SOCKS5، برای I2P یک پراکسی HTTP. نام باید توسط پراکسی resolve شود، نه توسط دستگاه شما. |
| سرعت | متفاوت | هر دو شبکه به هر بایت تأخیر اضافه میکنند. I2P از این دو کندتر است. |
موجودی و محدودیتها در صفحه خودشان توضیح داده شدهاند. محدودیتها و موجودی
cURL از طریق Tor
یک کلاینت Tor روی دستگاه خود اجرا کنید. این کلاینت یک پراکسی SOCKS5 روی 127.0.0.1:9050 ارائه میدهد. --socks5-hostname نام .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 از طریق I2P
یک router I2P روی دستگاه خود اجرا کنید. این router یک پراکسی HTTP روی 127.0.0.1:4444 ارائه میدهد که نام .b32.i2p را همانطور که هست میپذیرد.
# 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 به دو تغییر نیاز دارد: base URL شبکه، و یک کلاینت HTTP که از پراکسی عبور کند. در Python هر دو SDK رسمی یک کلاینت httpx میگیرند. برای پراکسی SOCKS بسته 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 و keep-alive روی اتصالهای کند
Streaming روی هر دو شبکه کار میکند. تا وقتی stream باز است و مدل هنوز چیزی برای ارسال ندارد، API یک keep-alive میفرستد تا اتصال برای پراکسی یا کلاینت شما مرده به نظر نرسد.
| Endpoint | نگهداشتن اتصال (keep-alive) روی یک stream باز | ارسال برای |
|---|---|---|
/v1/chat/completions | هر 15 ثانیه یک خط کامنت (با : شروع میشود). | همه مدلها |
/v1/messages | هر 15 ثانیه یک event: ping، یا یک خط کامنت. | همه مدلها |
/v1/responses | هر 15 ثانیه یک خط کامنت. | مدلهای open-weight میزبانیشده |
"stream": trueرا بفرستید. پاسخ streamشده بهمحض نوشتن مدل شروع به رسیدن میکند، و keep-alive نشان میدهد که درخواست هنوز در حال پردازش است. پاسخ بدون stream تا آماده شدن کل پاسخ چیزی نمیفرستد.- به کلاینت read timeout بلندی بدهید. نمونهها 600 ثانیه استفاده میکنند. timeout کوتاهتر از 15 ثانیه میتواند stream را بین دو keep-alive قطع کند.
- اجازه دهید خواننده SSE شما از خطهای کامنت و رویدادهای
pingرد شود. SDKها این کار را از قبل انجام میدهند. - بهمحض قطع شدن اتصال، درخواست را دوباره نفرستید. درخواستی که به API رسیده باشد تا پایان اجرا میشود و شمرده میشود، حتی اگر اتصال قطع شده باشد.
- مسیر را ابتدا با
GET /v1/modelsآزمایش کنید. به کلید نیاز ندارد و یک فهرست کوتاه JSON برمیگرداند.
مشکلات اتصال
| نشانه | علت و راهحل |
|---|---|
اتصال به 127.0.0.1:9050 یا 127.0.0.1:4444 رد میشود | هیچ کلاینت Tor یا router I2P روی دستگاه شما اجرا نمیشود، یا روی پورت دیگری گوش میدهد. Tor Browser پراکسی SOCKS خود را روی پورت 9150 ارائه میدهد. |
Could not resolve host برای نام .onion | کلاینت سعی کرد نام را خودش resolve کند. در cURL از --socks5-hostname و در URL پراکسی از socks5h:// استفاده کنید تا کلاینت Tor آن را resolve کند. |
| پراکسی I2P با صفحه خطای خودش پاسخ میدهد | router هنوز آدرس را پیدا نکرده است. router پس از شروع به چند دقیقه زمان نیاز دارد. دوباره امتحان کنید. |
401 با Missing authentication | درخواست بدون کلید رسید. همان هدری را بفرستید که در وب عادی میفرستید. |
هر خطای دیگر همان است که در وب عادی هست. مدیریت خطا
کلید شما بدون JavaScript
Shannon یک وبسایت بدون JavaScript هم دارد که در وب عادی، بهصورت سرویس onion و بهصورت eepsite در دسترس است. صفحه /keys آن کلید API شما را نشان میدهد و اجازه میدهد آن را تعویض کنید، پس میتوانید بدون خارج شدن از Tor یا I2P کلید بگیرید. encrypted.shannon-ai.com/keys
آدرسهای آن وبسایت در هر سه شبکه اینجا فهرست شدهاند: دسترسی رمزگذاریشده