본문으로 건너뛰기
암호화, 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 클라이언트를 통해 접속합니다: 기본값이 127.0.0.1:9050인 SOCKS5 프록시.
I2P (eepsite) http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 I2P 라우터를 통해 접속합니다: 기본값이 127.0.0.1:4444인 HTTP 프록시.
  • 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가 keep-alive를 보내므로, 프록시나 클라이언트에 연결이 끊어진 것처럼 보이지 않습니다.

엔드포인트 열린 스트림의 keep-alive 전송 대상
/v1/chat/completions 15초마다 주석 줄(:로 시작)이 옵니다. 모든 모델
/v1/messages 15초마다 event: ping 또는 주석 줄이 옵니다. 모든 모델
/v1/responses 15초마다 주석 줄이 옵니다. 호스팅 오픈 웨이트 모델
  • "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에서 제공합니다.
.onion 이름에 대해 Could not resolve host 클라이언트가 이름을 직접 해석하려 했습니다. cURL에서는 --socks5-hostname을, 프록시 URL에서는 socks5h://를 사용하여 Tor 클라이언트가 해석하게 하세요.
I2P 프록시가 자체 오류 페이지로 응답함 라우터가 아직 주소를 찾지 못했습니다. 라우터는 시작 후 몇 분이 필요합니다. 다시 시도하세요.
Missing authentication과 함께 401 요청이 키 없이 도착했습니다. 일반 웹에서와 같은 헤더를 보내세요.

그 밖의 모든 오류는 일반 웹과 같습니다. 오류 처리

JavaScript 없이 키 받기

Shannon에는 JavaScript가 필요 없는 웹사이트도 있으며, 일반 웹, onion 서비스, eepsite로 접속할 수 있습니다. 이 사이트의 /keys 페이지에서 API 키를 확인하고 교체할 수 있으므로 Tor나 I2P를 벗어나지 않고 키를 받을 수 있습니다. encrypted.shannon-ai.com/keys

해당 웹사이트의 세 네트워크 주소는 여기에 나열되어 있습니다. 암호화된 접속