Points de terminaison chiffrés, Tor et I2P
L'API est aussi publiée comme service onion Tor et comme eepsite I2P. Mêmes routes, même clé ; seuls l'URL de base et le proxy changent.
URL de base
Quatre adresses mènent à la même API. Utilisez celle qui convient à votre réseau, avec la même clé API et les mêmes requêtes.
| Réseau | URL de base | Comment l'atteindre |
|---|---|---|
| Web ordinaire | https://api.shannon-ai.com/v1 | Directement, en HTTPS. |
| Miroir chiffré | https://api-encrypted.shannon-ai.com/v1 | Directement, en HTTPS. Un second nom d'hôte pour la même API. |
| Tor (service onion) | http://shannonmd773o5vxz75byha5rkea7nzr3srotw46uwythq3pjl6y4cad.onion/v1 | Via un client Tor : un proxy SOCKS5, par défaut sur 127.0.0.1:9050. |
| I2P (eepsite) | http://acvnvkdea4xaczzjap7chysqqi4kkvp2eorfwkasindzmjpa47da.b32.i2p/v1 | Via un routeur I2P : un proxy HTTP, par défaut sur 127.0.0.1:4444. |
- Un SDK OpenAI prend l'URL de base telle qu'elle est indiquée, avec
/v1. Un SDK Anthropic la prend sans/v1. - Pour vérifier une adresse, lisez les en-têtes de réponse de
https://api.shannon-ai.com:Onion-Locationporte l'adresse onion etX-I2P-Locationl'adresse I2P. L'adresse onion commence parshannon.
Quelles routes fonctionnent
Chaque route /v1 répond sur les quatre adresses :
POST /v1/chat/completionsPOST /v1/responsesPOST /v1/messagesPOST /v1/messages/count_tokensPOST /v1/tokenizeGET /v1/models
GET /v1/models ne demande aucune clé, ce qui en fait un test rapide pour vérifier que votre proxy atteint l'API.
Ce qui est identique et ce qui diffère
| Élément | Identique ? | Détail |
|---|---|---|
| Routes, champs de requête, réponses, erreurs | Identique | Identiques sur chaque adresse. Aucune route ne se comporte différemment selon le nom d'hôte. |
| Clé API | Identique | Une seule clé fonctionne sur chaque adresse, comme Authorization: Bearer ou x-api-key. Les cookies ne sont jamais lus sur /v1. |
| Solde et limites | Identique | Le même solde et la même limite de 120 requêtes par minute. Les deux sont comptés par compte, pas par adresse. |
| Taille de la requête | Identique | Jusqu'à 32 MiB par corps de requête. |
| Schéma | Diffère | https:// sur le web ordinaire et sur le miroir. http:// sur les adresses .onion et .b32.i2p, où le réseau lui-même chiffre la connexion de bout en bout. |
| Proxy | Diffère | Aucun sur le web ordinaire. Un proxy SOCKS5 pour Tor, un proxy HTTP pour I2P. Le nom doit être résolu par le proxy, pas par votre machine. |
| Vitesse | Diffère | Les deux réseaux ajoutent un délai à chaque octet. I2P est le plus lent des deux. |
Le solde et les limites sont décrits sur leur propre page. Limites et solde
cURL via Tor
Lancez un client Tor sur votre machine. Il propose un proxy SOCKS5 sur 127.0.0.1:9050. --socks5-hostname transmet le nom .onion à ce 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 via I2P
Lancez un routeur I2P sur votre machine. Il propose un proxy HTTP sur 127.0.0.1:4444, qui accepte le nom .b32.i2p tel quel.
# 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"}]
}' URL de base du SDK
Un SDK demande deux changements : l'URL de base du réseau, et un client HTTP qui passe par le proxy. En Python, les deux SDK officiels acceptent un client httpx. Pour un proxy SOCKS, installez 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) Streaming et keep-alive sur les liaisons lentes
Le streaming fonctionne sur les deux réseaux. Tant qu'un flux est ouvert et que le modèle n'a encore rien à envoyer, l'API envoie un keep-alive, pour que la connexion ne paraisse pas morte à un proxy ou à votre client.
| Point de terminaison | Keep-alive sur un flux ouvert | Envoyé pour |
|---|---|---|
/v1/chat/completions | Une ligne de commentaire (elle commence par :) toutes les 15 secondes. | Tous les modèles |
/v1/messages | Un event: ping, ou une ligne de commentaire, toutes les 15 secondes. | Tous les modèles |
/v1/responses | Une ligne de commentaire toutes les 15 secondes. | Modèles open-weight hébergés |
- Envoyez
"stream": true. Une réponse en flux commence à arriver dès que le modèle écrit, et le keep-alive montre que la requête est toujours en cours de traitement. Une réponse sans streaming n'envoie rien tant que toute la réponse n'est pas prête. - Donnez au client un long délai de lecture. Les exemples utilisent 600 secondes. Un délai de moins de 15 secondes peut interrompre un flux entre deux keep-alive.
- Faites en sorte que votre lecteur SSE ignore les lignes de commentaire et les événements
ping. Les SDK le font déjà. - Ne renvoyez pas une requête dès qu'une connexion tombe. Une requête qui a atteint l'API va jusqu'au bout et est comptée, même quand la connexion a disparu.
- Testez d'abord le chemin avec
GET /v1/models. Il ne demande aucune clé et renvoie une courte liste JSON.
Problèmes de connexion
| Symptôme | Cause et solution |
|---|---|
La connexion à 127.0.0.1:9050 ou 127.0.0.1:4444 est refusée | Aucun client Tor ni routeur I2P ne tourne sur votre machine, ou il écoute sur un autre port. Tor Browser propose son proxy SOCKS sur le port 9150. |
Could not resolve host pour le nom .onion | Le client a essayé de résoudre le nom lui-même. Utilisez --socks5-hostname dans cURL et socks5h:// dans une URL de proxy, pour que le client Tor le résolve. |
| Le proxy I2P répond par sa propre page d'erreur | Le routeur n'a pas encore trouvé l'adresse. Un routeur a besoin de quelques minutes après son démarrage. Réessayez. |
401 avec Missing authentication | La requête est arrivée sans clé. Envoyez le même en-tête que sur le web ordinaire. |
Toutes les autres erreurs sont les mêmes que sur le web ordinaire. Gestion des erreurs
Votre clé sans JavaScript
Shannon a aussi un site web sans JavaScript, accessible sur le web ordinaire, comme service onion et comme eepsite. Sa page /keys affiche votre clé API et vous permet de la renouveler, ce qui vous permet d'obtenir une clé sans quitter Tor ou I2P. encrypted.shannon-ai.com/keys
Les adresses de ce site web sur les trois réseaux sont listées ici : Accès chiffré