نقاط نهاية مشفّرة وعبر Tor وI2P
تُنشر API أيضاً كخدمة onion على Tor وكموقع eepsite على I2P. المسارات نفسها والمفتاح نفسه؛ ولا يتغير إلا base URL والوسيط.
عناوين Base URL
أربعة عناوين تؤدي إلى 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: وسيط SOCKS5، يكون افتراضياً على 127.0.0.1:9050. |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | عبر موجّه I2P: وسيط HTTP، يكون افتراضياً على 127.0.0.1:4444. |
- يقبل OpenAI SDK عنوان base URL كما هو معروض، مع
/v1. ويقبله Anthropic SDK بدون/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. ولا تُقرأ ملفات تعريف الارتباط (cookies) أبداً على /v1. |
| الرصيد والحدود | نفسه | الرصيد نفسه وحد الـ 120 طلباً في الدقيقة نفسه. وكلاهما يُحتسب لكل حساب، لا لكل عنوان. |
| حجم الطلب | نفسه | حتى 32 MiB لنص الطلب الواحد. |
| المخطط (Scheme) | يختلف | https:// على الويب العادي وعلى النسخة المرآة. وhttp:// على عنواني .onion و.b32.i2p، حيث تشفّر الشبكة نفسها الاتصال من طرف إلى طرف. |
| الوسيط (Proxy) | يختلف | لا وسيط على الويب العادي. وسيط SOCKS5 لـ Tor، ووسيط HTTP لـ I2P. ويجب أن يحلّ الوسيط الاسم، لا جهازك. |
| السرعة | يختلف | كلتا الشبكتين تضيفان تأخيراً لكل بايت. و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
شغّل موجّه I2P على جهازك. يوفّر وسيط 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) البث وkeep-alive على الروابط البطيئة
يعمل البث على الشبكتين كلتيهما. وبينما يكون البث مفتوحاً وليس لدى النموذج ما يرسله بعد، ترسل API رسالة keep-alive، حتى لا يبدو الاتصال ميتاً للوسيط أو لعميلك.
| نقطة النهاية | Keep-alive على بث مفتوح | يُرسل لـ |
|---|---|---|
/v1/chat/completions | سطر تعليق (يبدأ بـ :) كل 15 ثانية. | كل النماذج |
/v1/messages | حدث event: ping، أو سطر تعليق، كل 15 ثانية. | كل النماذج |
/v1/responses | سطر تعليق كل 15 ثانية. | النماذج المفتوحة الأوزان المستضافة |
- أرسل
"stream": true. يبدأ الرد المبثوث بالوصول فور كتابة النموذج، ويدل keep-alive على أن الطلب ما زال قيد المعالجة. أما الرد غير المبثوث فلا يرسل شيئاً حتى تكتمل الإجابة كلها. - أعطِ العميل مهلة قراءة طويلة. تستخدم الأمثلة 600 ثانية. والمهلة الأقصر من 15 ثانية قد تنهي البث بين رسالتي keep-alive.
- اجعل قارئ SSE لديك يتخطى أسطر التعليق وأحداث
ping. وSDKs تفعل ذلك أصلاً. - لا تعد إرسال الطلب لحظة انقطاع الاتصال. فالطلب الذي وصل إلى API يعمل حتى نهايته ويُحتسب، حتى لو زال الاتصال.
- اختبر المسار أولاً بـ
GET /v1/models. فهو لا يحتاج إلى مفتاح ويعيد قائمة JSON قصيرة.
مشكلات الاتصال
| العَرَض | السبب والحل |
|---|---|
رُفض الاتصال بـ 127.0.0.1:9050 أو 127.0.0.1:4444 | لا يعمل عميل Tor أو موجّه I2P على جهازك، أو أنه يستمع على منفذ آخر. يوفّر Tor Browser وسيط SOCKS الخاص به على المنفذ 9150. |
Could not resolve host للاسم .onion | حاول العميل حلّ الاسم بنفسه. استخدم --socks5-hostname في cURL وsocks5h:// في عنوان الوسيط، ليحلّه عميل Tor. |
| يجيب وسيط I2P بصفحة الخطأ الخاصة به | لم يعثر الموجّه على العنوان بعد. يحتاج الموجّه إلى بضع دقائق بعد بدء تشغيله. حاول مرة أخرى. |
401 مع Missing authentication | وصل الطلب بدون مفتاح. أرسل الترويسة نفسها المستخدمة على الويب العادي. |
كل خطأ آخر هو نفسه كما على الويب العادي. معالجة الأخطاء
مفتاحك بدون JavaScript
لدى Shannon أيضاً موقع بدون JavaScript، يمكن الوصول إليه على الويب العادي، وكخدمة onion، وكموقع eepsite. وتعرض صفحته /keys مفتاح API الخاص بك وتتيح لك تدويره، فيمكنك الحصول على مفتاح دون مغادرة Tor أو I2P. encrypted.shannon-ai.com/keys
عناوين ذلك الموقع على الشبكات الثلاث كلها مسرودة هنا: الوصول المشفّر