Aller au contenu
Points de terminaison chiffrés, Tor et I2P

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-Location porte l'adresse onion et X-I2P-Location l'adresse I2P. L'adresse onion commence par shannon.

Quelles routes fonctionnent

Chaque route /v1 répond sur les quatre adresses :

  • POST /v1/chat/completions
  • POST /v1/responses
  • POST /v1/messages
  • POST /v1/messages/count_tokens
  • POST /v1/tokenize
  • GET /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.

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"}]
  }'

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.

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"}]
  }'

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)

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é