暗号化・Tor・I2P エンドポイント
API は、Tor の onion サービスと I2P の eepsite としても公開されています。ルートもキーも同じで、変わるのはベース 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 です。 |
- OpenAI SDK には、表示されているとおり
/v1付きのベース URL を指定します。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 で使えます。クッキーは /v1 では読み取られません。 |
| 残高と上限 | 同じ | 残高も、一分間に 120 リクエストの上限も同じです。どちらもアドレス単位ではなくアカウント単位で数えられます。 |
| リクエストのサイズ | 同じ | リクエストボディは最大 32 MiB まで。 |
| スキーム | 異なる | クリアウェブとミラーでは https://。.onion と .b32.i2p のアドレスでは http:// で、ネットワーク自体が接続をエンドツーエンドで暗号化します。 |
| プロキシ | 異なる | クリアウェブではなし。Tor は SOCKS5 プロキシ、I2P は HTTP プロキシ。名前の解決は、お使いのマシンではなくプロキシが行う必要があります。 |
| 速度 | 異なる | どちらのネットワークも、すべてのバイトに遅延を加えます。I2P のほうが遅くなります。 |
残高と上限については、専用のページで説明しています。 上限と残高
Tor 経由の cURL
お使いのマシンで Tor クライアントを実行します。127.0.0.1:9050 で SOCKS5 プロキシが提供されます。--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"}]
}' I2P 経由の cURL
お使いのマシンで I2P ルーターを実行します。127.0.0.1:4444 で HTTP プロキシが提供され、.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 のベース URL
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) 低速な回線でのストリーミングとキープアライブ
ストリーミングは、どちらのネットワークでも動作します。ストリームが開いていてモデルがまだ送るものがない間、API はキープアライブを送信するため、プロキシやクライアントから接続が切れたように見えることはありません。
| エンドポイント | 開いているストリームでのキープアライブ | 送信対象 |
|---|---|---|
/v1/chat/completions | コメント行(: で始まる)を 15 秒ごと。 | すべてのモデル |
/v1/messages | event: ping またはコメント行を 15 秒ごと。 | すべてのモデル |
/v1/responses | コメント行を 15 秒ごと。 | ホスト型オープンウェイトモデル |
"stream": trueを送信してください。ストリーム応答は、モデルが書き始めるとすぐに届き始め、キープアライブによってリクエストが処理中であることが分かります。ストリームでない応答は、回答全体が完成するまで何も送信しません。- クライアントには長い読み取りタイムアウトを設定してください。サンプルでは 600 秒を使っています。15 秒より短いタイムアウトでは、二回のキープアライブの間でストリームが切れることがあります。
- SSE リーダーが、コメント行と
pingイベントをスキップするようにしてください。SDK はすでにそうしています。 - 接続が切れた瞬間にリクエストを再送信しないでください。API に届いたリクエストは最後まで実行されて計上され、接続がなくなっていても同じです。
- まず
GET /v1/modelsで経路をテストしてください。キーは不要で、短い JSON のリストが返ります。
接続の問題
| 症状 | 原因と対処 |
|---|---|
127.0.0.1:9050 または 127.0.0.1:4444 への接続が拒否される | お使いのマシンで Tor クライアントまたは I2P ルーターが動作していないか、別のポートで待ち受けています。Tor Browser は SOCKS プロキシをポート 9150 で提供します。 |
.onion の名前に対して Could not resolve host | クライアントが自分で名前を解決しようとしました。Tor クライアントに解決させるため、cURL では --socks5-hostname、プロキシ URL では socks5h:// を使ってください。 |
| I2P プロキシが独自のエラーページで応答する | ルーターがまだアドレスを見つけていません。ルーターは起動後、数分かかります。もう一度お試しください。 |
401 と Missing authentication | キーなしでリクエストが届きました。クリアウェブと同じヘッダーを送信してください。 |
それ以外のエラーは、すべてクリアウェブと同じです。 エラー処理
JavaScript なしでキーを確認する
Shannon には JavaScript なしのウェブサイトもあり、クリアウェブ、onion サービス、eepsite で到達できます。その /keys ページには API キーが表示され、ローテーションもできるため、Tor や I2P を離れずにキーを取得できます。 encrypted.shannon-ai.com/keys
そのウェブサイトの、三つのネットワークすべてでのアドレスは、こちらに一覧があります。 暗号化アクセス