Endpoint แบบเข้ารหัส, Tor และ I2P
API ยังเผยแพร่เป็น Tor onion service และ I2P eepsite ด้วย เส้นทางเดียวกัน คีย์เดียวกัน เปลี่ยนเพียง base URL และ proxy
Base URL
มีสี่ที่อยู่ที่นำไปสู่ API เดียวกัน ใช้อันที่เหมาะกับเครือข่ายของคุณ ด้วย API key เดียวกันและคำขอเดียวกัน
| เครือข่าย | Base URL | วิธีเข้าถึง |
|---|---|---|
| Clear web | https://api.shannon-ai.com/v1 | เข้าโดยตรงผ่าน HTTPS |
| Mirror แบบเข้ารหัส | https://api-encrypted.shannon-ai.com/v1 | เข้าโดยตรงผ่าน HTTPS ชื่อโฮสต์ที่สองของ API เดียวกัน |
| Tor (onion service) | http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 | ผ่านไคลเอนต์ Tor: SOCKS5 proxy ที่ค่าเริ่มต้นคือ 127.0.0.1:9050 |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | ผ่าน I2P router: HTTP proxy ที่ค่าเริ่มต้นคือ 127.0.0.1:4444 |
- OpenAI SDK ใช้ base URL ตามที่แสดง พร้อม
/v1ส่วน 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 ไม่ต้องใช้คีย์ จึงเป็นการทดสอบอย่างรวดเร็วว่า proxy ของคุณเข้าถึง API ได้
อะไรเหมือนและอะไรต่าง
| รายการ | เหมือนกันหรือไม่ | รายละเอียด |
|---|---|---|
| เส้นทาง ฟิลด์คำขอ คำตอบ ข้อผิดพลาด | เหมือนกัน | เหมือนกันทุกที่อยู่ ไม่มีเส้นทางใดทำงานต่างกันตามชื่อโฮสต์ |
| API key | เหมือนกัน | คีย์เดียวใช้ได้กับทุกที่อยู่ ในรูป Authorization: Bearer หรือ x-api-key ระบบไม่อ่านคุกกี้บน /v1 เลย |
| ยอดคงเหลือและขีดจำกัด | เหมือนกัน | ยอดคงเหลือเดียวกันและขีดจำกัด 120 คำขอต่อนาทีเดียวกัน ทั้งสองนับตามบัญชี ไม่ใช่ตามที่อยู่ |
| ขนาดคำขอ | เหมือนกัน | ไม่เกิน 32 MiB ต่อ request body |
| Scheme | ต่างกัน | https:// บน clear web และบน mirror ส่วน http:// บนที่อยู่ .onion และ .b32.i2p ซึ่งตัวเครือข่ายเข้ารหัสการเชื่อมต่อแบบ end-to-end เอง |
| Proxy | ต่างกัน | ไม่มีบน clear web SOCKS5 proxy สำหรับ Tor, HTTP proxy สำหรับ I2P ชื่อต้องถูก resolve โดย proxy ไม่ใช่โดยเครื่องของคุณ |
| ความเร็ว | ต่างกัน | ทั้งสองเครือข่ายเพิ่มความหน่วงให้ทุกไบต์ I2P ช้ากว่า |
ยอดคงเหลือและขีดจำกัดอธิบายไว้ในหน้าของตัวเอง ขีดจำกัดและยอดคงเหลือ
cURL ผ่าน Tor
รันไคลเอนต์ Tor บนเครื่องของคุณ ซึ่งให้ SOCKS5 proxy ที่ 127.0.0.1:9050 --socks5-hostname ส่งชื่อ .onion ให้ proxy นั้น
# 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 router บนเครื่องของคุณ ซึ่งให้ HTTP proxy ที่ 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"}]
}' SDK base URL
SDK ต้องเปลี่ยนสองอย่าง: base URL ของเครือข่าย และ HTTP ไคลเอนต์ที่ส่งผ่าน proxy ใน Python SDK อย่างเป็นทางการทั้งสองรับไคลเอนต์ httpx สำหรับ SOCKS proxy ให้ติดตั้ง 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 เพื่อให้การเชื่อมต่อไม่ดูเหมือนตายสำหรับ proxy หรือไคลเอนต์ของคุณ
| เอนด์พอยต์ | Keep-alive บนสตรีมที่เปิดอยู่ | ส่งให้ |
|---|---|---|
/v1/chat/completions | บรรทัดคอมเมนต์ (ขึ้นต้นด้วย :) ทุก 15 วินาที | ทุกโมเดล |
/v1/messages | event: ping หรือบรรทัดคอมเมนต์ ทุก 15 วินาที | ทุกโมเดล |
/v1/responses | บรรทัดคอมเมนต์ทุก 15 วินาที | โมเดล open-weight ที่โฮสต์ |
- ส่ง
"stream": trueคำตอบแบบสตรีมเริ่มมาถึงทันทีที่โมเดลเขียน และ keep-alive แสดงว่าคำขอยังคงถูกประมวลผลอยู่ คำตอบที่ไม่สตรีมจะไม่ส่งอะไรจนกว่าคำตอบทั้งหมดจะพร้อม - ตั้ง read timeout ของไคลเอนต์ให้นาน ตัวอย่างใช้ 600 วินาที timeout ที่สั้นกว่า 15 วินาทีอาจทำให้สตรีมจบระหว่างสอง keep-alive
- ให้ตัวอ่าน SSE ของคุณข้ามบรรทัดคอมเมนต์และ event
pingSDK ทำเช่นนี้อยู่แล้ว - อย่าส่งคำขอซ้ำทันทีที่การเชื่อมต่อหลุด คำขอที่ไปถึง API แล้วจะทำงานจนจบและถูกนับ แม้การเชื่อมต่อจะหายไป
- ทดสอบเส้นทางด้วย
GET /v1/modelsก่อน ไม่ต้องใช้คีย์และส่งคืนรายการ JSON สั้นๆ
ปัญหาการเชื่อมต่อ
| อาการ | สาเหตุและวิธีแก้ |
|---|---|
การเชื่อมต่อไปยัง 127.0.0.1:9050 หรือ 127.0.0.1:4444 ถูกปฏิเสธ | ไม่มีไคลเอนต์ Tor หรือ I2P router ทำงานบนเครื่องของคุณ หรือฟังอยู่ที่พอร์ตอื่น Tor Browser ให้ SOCKS proxy ที่พอร์ต 9150 |
Could not resolve host สำหรับชื่อ .onion | ไคลเอนต์พยายาม resolve ชื่อเอง ให้ใช้ --socks5-hostname ใน cURL และ socks5h:// ใน URL ของ proxy เพื่อให้ไคลเอนต์ Tor เป็นผู้ resolve |
| I2P proxy ตอบด้วยหน้าข้อผิดพลาดของตัวเอง | router ยังไม่พบที่อยู่ router ต้องใช้เวลาไม่กี่นาทีหลังเริ่มทำงาน ให้ลองอีกครั้ง |
401 พร้อม Missing authentication | คำขอมาถึงโดยไม่มีคีย์ ให้ส่งเฮดเดอร์เดียวกับบน clear web |
ข้อผิดพลาดอื่นทุกอย่างเหมือนกับบน clear web การจัดการข้อผิดพลาด
คีย์ของคุณโดยไม่ใช้ JavaScript
Shannon ยังมีเว็บไซต์ที่ไม่ใช้ JavaScript เข้าถึงได้บน clear web เป็น onion service และเป็น eepsite หน้า /keys ของเว็บไซต์นั้นแสดง API key ของคุณและให้หมุนเวียนคีย์ (rotate) ได้ คุณจึงรับคีย์ได้โดยไม่ต้องออกจาก Tor หรือ I2P encrypted.shannon-ai.com/keys
ที่อยู่ของเว็บไซต์นั้นบนทั้งสามเครือข่ายแสดงไว้ที่นี่: การเข้าถึงแบบเข้ารหัส