Криптирани ендпоинти, 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. Бисквитките никога не се четат на /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 показва, че заявката още се обработва. Отговор без стрийминг не изпраща нищо, докато целият отговор не е готов. - Задайте на клиента дълъг timeout за четене. Примерите използват 600 секунди. Timeout, по-кратък от 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
Адресите на този уебсайт във всичките три мрежи са изброени тук: Криптиран достъп