コンテンツへスキップ
暗号化・Tor・I2P エンドポイント

暗号化・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/completions
  • POST /v1/responses
  • POST /v1/messages
  • POST /v1/messages/count_tokens
  • POST /v1/tokenize
  • GET /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 の名前がそのプロキシに渡されます。

cURL · Tor
# 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 の名前をそのまま受け付けます。

cURL · 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)

ストリーミングは、どちらのネットワークでも動作します。ストリームが開いていてモデルがまだ送るものがない間、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

そのウェブサイトの、三つのネットワークすべてでのアドレスは、こちらに一覧があります。 暗号化アクセス