رفتن به محتوا
endpointهای رمزگذاری‌شده، Tor و I2P

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/completions
  • POST /v1/responses
  • POST /v1/messages
  • POST /v1/messages/count_tokens
  • POST /v1/tokenize
  • GET /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 را به آن پراکسی می‌دهد.

cURL · Tor
# 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 را همان‌طور که هست می‌پذیرد.

cURL · 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)

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

آدرس‌های آن وب‌سایت در هر سه شبکه اینجا فهرست شده‌اند: دسترسی رمزگذاری‌شده