דילוג לתוכן
Endpoints מוצפנים, Tor ו-I2P

Endpoints מוצפנים, Tor ו-I2P

ה-API מפורסם גם כשירות onion של Tor וכ-eepsite של I2P. אותם נתיבים, אותו מפתח; רק ה-base URL וה-proxy משתנים.

Base URLs

ארבע כתובות מובילות לאותו API. השתמשו באחת שמתאימה לרשת שלכם, עם אותו מפתח API ואותן בקשות.

רשת Base URL איך מגיעים אליו
הרשת הרגילה https://api.shannon-ai.com/v1 ישירות, ב-HTTPS.
מראה מוצפנת https://api-encrypted.shannon-ai.com/v1 ישירות, ב-HTTPS. שם מארח שני לאותו API.
Tor (שירות onion) http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 דרך לקוח Tor: proxy של SOCKS5, כברירת מחדל ב-127.0.0.1:9050.
I2P (eepsite) http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 דרך נתב I2P: proxy של 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 אינו צריך מפתח, ולכן הוא בדיקה מהירה שה-proxy שלכם מגיע ל-API.

מה זהה ומה שונה

פריט זהה? פירוט
נתיבים, שדות בקשה, תשובות, שגיאות זהה זהים בכל כתובת. אף נתיב אינו מתנהג אחרת לפי שם המארח.
מפתח API זהה מפתח אחד עובד בכל כתובת, כ-Authorization: Bearer או כ-x-api-key. עוגיות לעולם אינן נקראות ב-/v1.
יתרה ומגבלות זהה אותה יתרה ואותה מגבלה של 120 בקשות בדקה. שתיהן נספרות לפי חשבון, לא לפי כתובת.
גודל בקשה זהה עד 32 MiB לגוף בקשה.
סכמה שונה https:// ברשת הרגילה ובמראה. http:// בכתובות .onion ו-.b32.i2p, שבהן הרשת עצמה מצפינה את החיבור מקצה לקצה.
Proxy שונה אין ברשת הרגילה. proxy של SOCKS5 עבור Tor, proxy של HTTP עבור I2P. את השם חייב לפענח ה-proxy, לא המכונה שלכם.
מהירות שונה שתי הרשתות מוסיפות השהיה לכל בייט. I2P היא האיטית מהשתיים.

יתרה ומגבלות מתוארות בדף משלהן. מגבלות ויתרה

cURL דרך Tor

הריצו לקוח Tor במכונה שלכם. הוא מציע proxy של SOCKS5 ב-127.0.0.1:9050. --socks5-hostname מוסר את השם .onion ל-proxy הזה.

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

הריצו נתב I2P במכונה שלכם. הוא מציע proxy של 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"}]
  }'

SDK base URL

SDK צריך שני שינויים: ה-base URL של הרשת, ולקוח HTTP שעובר דרך ה-proxy. ב-Python שני ה-SDK הרשמיים מקבלים לקוח httpx. עבור proxy של 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, כך שהחיבור לא נראה מת ל-proxy או ללקוח שלכם.

Endpoint שורת keep-alive בזמן ש-stream פתוח נשלח עבור
/v1/chat/completions שורת הערה (היא מתחילה ב-:) כל 15 שניות. כל המודלים
/v1/messages event: ping, או שורת הערה, כל 15 שניות. כל המודלים
/v1/responses שורת הערה כל 15 שניות. מודלי open-weight מתארחים
  • שלחו "stream": true. תשובה ב-streaming מתחילה להגיע ברגע שהמודל כותב, וה-keep-alive מראה שהבקשה עדיין בעבודה. תשובה בלי streaming אינה שולחת דבר עד שכל התשובה מוכנה.
  • תנו ללקוח 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 או נתב I2P שרצים במכונה שלכם, או שהוא מאזין בפורט אחר. Tor Browser מציע את ה-proxy של SOCKS שלו בפורט 9150.
Could not resolve host עבור השם .onion הלקוח ניסה לפענח את השם בעצמו. השתמשו ב---socks5-hostname ב-cURL וב-socks5h:// בכתובת proxy, כדי שלקוח Tor יפענח אותו.
ה-proxy של I2P עונה בדף שגיאה משלו הנתב עדיין לא מצא את הכתובת. נתב צריך כמה דקות אחרי שהוא מתחיל. נסו שוב.
401 עם Missing authentication הבקשה הגיעה בלי מפתח. שלחו את אותה כותרת כמו ברשת הרגילה.

כל שגיאה אחרת זהה לזו שברשת הרגילה. טיפול בשגיאות

המפתח שלכם בלי JavaScript

ל-Shannon יש גם אתר בלי JavaScript, שאפשר להגיע אליו ברשת הרגילה, כשירות onion וכ-eepsite. דף ה-/keys שלו מראה את מפתח ה-API שלכם ומאפשר להחליף אותו, כך שאפשר לקבל מפתח בלי לעזוב את Tor או את I2P. encrypted.shannon-ai.com/keys

הכתובות של האתר הזה בשלוש הרשתות מפורטות כאן: גישה מוצפנת