암호화, 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/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) 느린 연결에서의 스트리밍과 keep-alive
스트리밍은 두 네트워크 모두에서 작동합니다. 스트림이 열려 있고 모델이 아직 보낼 내용이 없는 동안 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
해당 웹사이트의 세 네트워크 주소는 여기에 나열되어 있습니다. 암호화된 접속