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/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /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 הזה.
# 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 כמות שהוא.
# 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) # 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, כך שהחיבור לא נראה מת ל-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
הכתובות של האתר הזה בשלוש הרשתות מפורטות כאן: גישה מוצפנת