Зашифровані ендпоінти, Tor та I2P
API також опубліковано як сервіс onion у Tor та eepsite в I2P. Ті самі маршрути, той самий ключ; змінюються лише базовий URL і проксі.
Базові URL
Чотири адреси ведуть до того самого API. Використовуйте ту, що підходить вашій мережі, з тим самим API-ключем і тими самими запитами.
| Мережа | Базовий 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. |
- SDK OpenAI приймає базовий 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. Cookies на /v1 ніколи не читаються. |
| Баланс і ліміти | Те саме | Той самий баланс і той самий ліміт 120 запитів на хвилину. Обидва рахуються на обліковий запис, а не на адресу. |
| Розмір запиту | Те саме | До 32 MiB на тіло запиту. |
| Схема | Відрізняється | https:// у відкритому вебі та на дзеркалі. http:// на адресах .onion і .b32.i2p, де сама мережа шифрує з'єднання від краю до краю. |
| Проксі | Відрізняється | У відкритому вебі не потрібен. Проксі 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"}]
}' Базовий URL для SDK
SDK потребує двох змін: базового 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 секунд. | Хостовані open-weight моделі |
- Надсилайте
"stream": true. Відповідь зі стрімінгом починає надходити, щойно модель пише, а keep-alive показує, що запит ще обробляється. Відповідь без стрімінгу нічого не надсилає, доки вся відповідь не буде готова. - Задайте клієнту довгий тайм-аут читання. У прикладах використано 600 секунд. Тайм-аут коротший за 15 секунд може обірвати стрім між двома keep-alive.
- Дозвольте вашому читачу SSE пропускати рядки-коментарі та події
ping. SDK це вже роблять. - Не надсилайте запит повторно одразу, коли з'єднання розірвалося. Запит, що дійшов до 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:// в URL проксі, щоб ім'я розв'язував клієнт Tor. |
| Проксі I2P відповідає власною сторінкою помилки | Маршрутизатор ще не знайшов адресу. Маршрутизатору потрібно кілька хвилин після запуску. Спробуйте ще раз. |
401 з Missing authentication | Запит надійшов без ключа. Надішліть той самий заголовок, що й у відкритому вебі. |
Кожна інша помилка така сама, як у відкритому вебі. Обробка помилок
Ваш ключ без JavaScript
Shannon має також вебсайт без JavaScript, доступний у відкритому вебі, як сервіс onion і як eepsite. Його сторінка /keys показує ваш API-ключ і дає змогу його замінити, тож ключ можна отримати, не залишаючи Tor чи I2P. encrypted.shannon-ai.com/keys
Адреси цього вебсайту в усіх трьох мережах наведено тут: Зашифрований доступ