Aller au contenu
OmniRoute source

🌐 OmniRoute Proxy Guide (Français)


De nombreux fournisseurs d’IA limitent l’accĂšs selon la rĂ©gion gĂ©ographique. Les dĂ©veloppeurs en Russie, Chine, Iran, Cuba, Turquie et dans d’autres pays rencontrent des erreurs telles que :

unsupported_country_region_territory

MĂȘme en dehors des rĂ©gions bloquĂ©es, les proxys sont utiles pour :

Cas d’utilisation Description
Contournement géographique Accéder à OpenAI, Anthropic, Codex et Copilot depuis des pays bloqués
Rotation des adresses IP RĂ©partir les requĂȘtes entre plusieurs adresses IP afin d’éviter la limitation de dĂ©bit
Confidentialité Masquer votre véritable adresse IP aux fournisseurs en amont
Conformité Acheminer le trafic via des juridictions spécifiques
Tests Simuler des requĂȘtes provenant de diffĂ©rentes rĂ©gions

┌───────────────────────────────────────────────────────────────┐
│ Serveur OmniRoute │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ Registre │ │ RĂ©partiteur │ │ RĂ©cupĂ©ration │ │
│ │ des proxys │───▶│ de proxys │───▶│ (undici) │ │
│ │ (SQLite) │ │ (en cache) │ │ │ │
│ └─────────────┘ └──────────────┘ └────────┬─────────┘ │
│ â–Č │ │
│ │ â–Œ │
│ ┌──────┮──────┐ ┌──────────────────┐ │
│ │ Synchro. │ │ API du │ │
│ │ 1proxy │ │ fournisseur │ │
│ │ (pool grat.)│ │ en amont │ │
│ └─────────────┘ └──────────────────┘ │
└───────────────────────────────────────────────────────────────┘
Composant Fichier RĂŽle
Registre des proxys src/lib/db/proxies.ts Opérations CRUD sur les entrées de proxy et affectations de portée
Répartiteur de proxys open-sse/utils/proxyDispatcher.ts Crée des répartiteurs ProxyAgent/SOCKS undici avec mise en cache
RĂ©cupĂ©ration par proxy open-sse/utils/proxyFetch.ts Encapsule fetch() avec l’injection d’un rĂ©partiteur de proxys
Route des paramÚtres src/app/api/settings/proxy/route.ts API héritée de configuration des proxys (GET/PUT/DELETE)
Route de gestion src/app/api/v1/management/proxies/route.ts API CRUD du registre (GET/POST/PATCH/DELETE)
BD 1proxy src/lib/db/oneproxy.ts Persistance de la place de marché de proxys gratuits

OmniRoute prend en charge la configuration des proxys à quatre niveaux indépendants, résolus par ordre de priorité :

Ordre de résolution des priorités (de la plus élevée à la plus faible) :
1. đŸ”” Proxy de compte/connexion → par clĂ© API / connexion OAuth
2. 🟡 Proxy de fournisseur → par fournisseur (p. ex., tout le trafic OpenAI)
3. 🟠 Proxy de combinaison → par combinaison/configuration de routage
4. 🟱 Proxy global → tout le trafic, tous les fournisseurs

Lorsqu’OmniRoute envoie une requĂȘte Ă  un fournisseur en amont, il appelle resolveProxyForConnectionFromRegistry(), qui vĂ©rifie chaque niveau dans l’ordre :

  1. Niveau du compte — Un proxy est-il attribuĂ© Ă  cet identifiant de connexion spĂ©cifique ?
  2. Niveau du fournisseur — Un proxy est-il attribuĂ© Ă  ce fournisseur (p. ex., openai) ?
  3. Niveau global — Un proxy global est-il configurĂ© ?
  4. Aucun proxy — Connexion directe au fournisseur.

La premiÚre correspondance est retenue. Vous pouvez donc définir un proxy global comme solution de repli, puis le remplacer pour certains fournisseurs ou certaines connexions.

Type de trafic Via le proxy ? Remarques
ComplĂ©tions de chat ✅ Toutes les requĂȘtes /v1/chat/completions
Embeddings ✅ /v1/embeddings
GĂ©nĂ©ration d’images ✅ /v1/images/generations
Audio (TTS/STT) ✅ /v1/audio/*
Échange de jetons OAuth ✅ RĂ©sout unsupported_country_region_territory
Tests de connexion ✅ Le bouton « Tester la connexion » utilise le proxy
Actualisation des jetons ✅ Renouvellement OAuth en arriùre-plan
Synchronisation des modĂšles ✅ Liste et dĂ©couverte des modĂšles

Le registre des proxys est une table SQLite (proxy_registry) qui stocke tous vos proxys. Chaque proxy possĂšde les champs suivants :

Champ Type Description
id UUID Identifiant unique
name ChaĂźne LibellĂ© lisible par l’utilisateur
type ChaĂźne Protocole : http, https, socks5
host Chaüne Nom d’hîte ou adresse IP du proxy
port Entier Numéro de port
username ChaĂźne Nom d’utilisateur d’authentification (chiffrĂ© au repos)
password ChaĂźne Mot de passe d’authentification (chiffrĂ© au repos)
region Chaßne Libellé de la région géographique
notes ChaĂźne Notes en texte libre
status ChaĂźne active ou inactive
source ChaĂźne manual ou oneproxy

Via le tableau de bord :

  1. AccĂ©dez Ă  ParamĂštres → Proxy
  2. Cliquez sur Ajouter un proxy
  3. Renseignez le type, l’hîte, le port et, facultativement, les identifiants d’authentification
  4. Enregistrez

Via l’API :

FenĂȘtre de terminal
curl -X POST http://localhost:20128/api/v1/management/proxies \
-H "Content-Type: application/json" \
-d '{
"name": "US Proxy",
"type": "http",
"host": "proxy.example.com",
"port": 8080,
"username": "user",
"password": "pass",
"region": "US"
}'
FenĂȘtre de terminal
curl -X PATCH http://localhost:20128/api/v1/management/proxies \
-H "Content-Type: application/json" \
-d '{
"id": "proxy-uuid-here",
"host": "new-proxy.example.com",
"port": 9090
}'

Remarque : Les identifiants sont conservĂ©s, sauf si vous envoyez explicitement des valeurs de remplacement non vides. L’envoi de chaĂźnes vides pour username/password conservera les valeurs stockĂ©es.

FenĂȘtre de terminal
# Échoue si le proxy est attribuĂ© Ă  un niveau quelconque
curl -X DELETE "http://localhost:20128/api/v1/management/proxies?id=proxy-uuid"
# Force la suppression (supprime également les attributions)
curl -X DELETE "http://localhost:20128/api/v1/management/proxies?id=proxy-uuid&force=1"
FenĂȘtre de terminal
curl "http://localhost:20128/api/v1/management/proxies?limit=50&offset=0"
FenĂȘtre de terminal
# Attribuer au niveau global
curl -X PUT http://localhost:20128/api/settings/proxy \
-H "Content-Type: application/json" \
-d '{"level": "global", "proxy": {"type":"http","host":"proxy.example.com","port":8080}}'
# Attribuer à un fournisseur spécifique
curl -X PUT http://localhost:20128/api/settings/proxy \
-H "Content-Type: application/json" \
-d '{"level": "provider", "id": "openai", "proxy": {"type":"socks5","host":"socks.example.com","port":1080}}'
# Attribuer à une connexion/clé spécifique
curl -X PUT http://localhost:20128/api/settings/proxy \
-H "Content-Type: application/json" \
-d '{"level": "key", "id": "connection-uuid", "proxy": {"type":"http","host":"key-proxy.com","port":3128}}'

Vérifiez quel proxy serait utilisé pour une connexion donnée :

FenĂȘtre de terminal
curl "http://localhost:20128/api/settings/proxy?resolve=connection-uuid"

Renvoie le proxy résolu avec son niveau (account, provider ou global) et sa source.

Attribuez un proxy Ă  plusieurs fournisseurs ou connexions Ă  la fois :

FenĂȘtre de terminal
curl -X POST http://localhost:20128/api/v1/management/proxies/bulk-assign \
-H "Content-Type: application/json" \
-d '{
"scope": "provider",
"scopeIds": ["openai", "anthropic", "codex"],
"proxyId": "proxy-uuid"
}'

Les proxys sont inclus dans le systĂšme de sauvegarde/restauration. Lorsque vous exportez votre configuration OmniRoute :

  1. AccĂ©dez Ă  Tableau de bord → ParamĂštres → Sauvegarde
  2. Cliquez sur Exporter — le registre des proxys et les attributions sont inclus
  3. Pour effectuer une restauration, cliquez sur Importer et chargez le fichier de sauvegarde

Le registre des proxys prend Ă©galement en charge l’upsert par host+port — si vous importez un proxy qui existe dĂ©jĂ  (mĂȘmes hĂŽte et port), il est mis Ă  jour au lieu de crĂ©er un doublon.

Si vous avez configuré des proxys dans une ancienne version (antérieure au registre), OmniRoute les migre automatiquement :

Ancien stockage key_value → proxy_registry + proxy_assignments

Cette opĂ©ration s’effectue une seule fois, au premier dĂ©marrage aprĂšs la mise Ă  niveau. Utilisez migrateLegacyProxyConfigToRegistry({ force: true }) pour la relancer.


🆕 Contribution de @oyi77 — PR #1847 (Issue #1788)

OmniRoute s’intĂšgre Ă  la plateforme communautaire 1proxy pour fournir un accĂšs Ă  des centaines de proxies gratuits et validĂ©s provenant du monde entier. Cette solution est idĂ©ale pour les utilisateurs qui ne disposent pas de leur propre infrastructure de proxies.

┌─────────────┐ Synchronisation ┌─────────────────┐ Rotation ┌─────────────┐
│ API 1proxy │ ────────────────▶ │ proxy_registry │ ──────────────▶ │ Fournisseur │
│ (externe) │ jusqu’à 500 │ source=oneproxy │ par qualitĂ© │ API │
└─────────────┘ proxies └─────────────────┘ └─────────────┘
  1. Synchronisation — OmniRoute rĂ©cupĂšre les proxies validĂ©s depuis l’API 1proxy
  2. Stockage — Les proxies sont enregistrĂ©s dans la mĂȘme table proxy_registry avec source = 'oneproxy'
  3. Filtrage — Filtrez par protocole, pays et score de qualitĂ©
  4. Rotation — SĂ©lectionnez le meilleur proxy Ă  l’aide d’une stratĂ©gie basĂ©e sur la qualitĂ©, alĂ©atoire ou sĂ©quentielle
  5. DĂ©gradation automatique — Le score de qualitĂ© des proxies dĂ©faillants est rĂ©duit ; s’il passe sous le seuil, ils sont marquĂ©s comme inactifs

Via le tableau de bord :

  1. AccĂ©dez Ă  l’onglet Settings → 1proxy
  2. Cliquez sur « Sync Now »
  3. Consultez les statistiques : nombre total de proxies, nombre de proxies actifs, qualité moyenne et répartition par pays

Via l’API :

FenĂȘtre de terminal
# Déclencher la synchronisation
curl -X POST http://localhost:20128/api/settings/oneproxy \
-H "Content-Type: application/json" \
-d '{}'
# Réponse :
# { "success": true, "added": 127, "updated": 45, "failed": 2, "total": 172 }
FenĂȘtre de terminal
# Filtrer par protocole
curl "http://localhost:20128/api/settings/oneproxy?protocol=socks5"
# Filtrer par pays
curl "http://localhost:20128/api/settings/oneproxy?countryCode=US"
# Filtrer par score de qualité minimal
curl "http://localhost:20128/api/settings/oneproxy?minQuality=80"
# Combiner les filtres
curl "http://localhost:20128/api/settings/oneproxy?protocol=http&countryCode=DE&minQuality=70"

Chaque proxy 1proxy est accompagné de métadonnées :

Champ Description
qualityScore Note de 0 Ă  100 issue de la validation de 1proxy
latencyMs Latence réseau mesurée
anonymity transparent, anonymous ou elite
googleAccess Indique si le proxy peut accéder aux services de Google
countryCode Code pays ISO Ă  deux lettres
lastValidated Horodatage de la derniĂšre validation

Les scores de qualité sont ajustés dynamiquement :

  • Les requĂȘtes ayant Ă©chouĂ© rĂ©duisent le score de 10 points
  • Le score tombe Ă  ≀10 → le proxy est marquĂ© comme inactive
  • Les proxies inactifs sont exclus de la rotation
FenĂȘtre de terminal
# Rotation par qualitĂ© (meilleur proxy en premier) — stratĂ©gie par dĂ©faut
curl -X POST http://localhost:20128/api/settings/oneproxy/rotate \
-H "Content-Type: application/json" \
-d '{"strategy": "quality"}'
# Rotation aléatoire
curl -X POST http://localhost:20128/api/settings/oneproxy/rotate \
-d '{"strategy": "random"}'
# Rotation séquentielle (proxy validé le moins récemment en premier)
curl -X POST http://localhost:20128/api/settings/oneproxy/rotate \
-d '{"strategy": "sequential"}'

La synchronisation avec 1proxy dispose d’un coupe-circuit intĂ©grĂ© :

  • AprĂšs 5 Ă©checs de synchronisation consĂ©cutifs, les tentatives de synchronisation suivantes sont bloquĂ©es
  • RĂ©initialisez-le avec : resetOneproxyCircuitBreaker() ou redĂ©marrez le serveur
  • L’état de la synchronisation est disponible Ă  l’adresse GET /api/settings/oneproxy?action=status
FenĂȘtre de terminal
# Supprimer un seul proxy 1proxy
curl -X DELETE "http://localhost:20128/api/settings/oneproxy?id=proxy-uuid"
# Supprimer TOUS les proxies 1proxy (les proxies manuels ne sont pas affectés)
curl -X DELETE "http://localhost:20128/api/settings/oneproxy?clearAll=1"

OmniRoute ne se contente pas d’acheminer le trafic via un proxy — il lui donne une apparence lĂ©gitime :

Utilise wreq-js pour gĂ©nĂ©rer des empreintes TLS similaires Ă  celles des navigateurs, contournant ainsi les systĂšmes de dĂ©tection des bots qui signalent les nĂ©gociations TLS ne provenant pas d’un navigateur.

Le bouton d’activation de l’empreinte CLI (ParamĂštres → SĂ©curitĂ©) rĂ©organise les en-tĂȘtes HTTP et les champs du corps JSON pour correspondre exactement Ă  la signature des binaires CLI natifs (Claude Code, Codex, etc.). Cette fonctionnalitĂ© s’applique en complĂ©ment du proxy :

Votre IP (bloquĂ©e) → IP du proxy (États-Unis) → API du fournisseur
+ usurpation TLS
+ empreinte CLI

Vous bĂ©nĂ©ficiez simultanĂ©ment du masquage de l’adresse IP et de l’authenticitĂ© des requĂȘtes.

Des badges Ă  code couleur dans le tableau de bord indiquent le niveau de proxy actif :

Badge Niveau Signification
🟱 Global Tout le trafic transite par ce proxy
🟡 Fournisseur Seul le trafic de ce fournisseur transite par ce proxy
đŸ”” Connexion Cette clĂ© ou ce compte spĂ©cifique utilise ce proxy

Le badge affiche Ă©galement l’adresse IP rĂ©solue du proxy Ă  des fins de vĂ©rification.


Pour les fournisseurs qui utilisent le modĂšle CLIProxyAPI, OmniRoute prend en charge trois modes de proxy en amont :

Mode Description
native OmniRoute gÚre directement le routage par proxy (par défaut)
cliproxyapi DélÚgue le routage à une instance CLIProxyAPI externe
fallback Essaie d’abord le mode natif, puis se rabat sur CLIProxyAPI

Configuration par fournisseur :

FenĂȘtre de terminal
curl -X PUT "http://localhost:20128/api/upstream-proxy/openai" \
-H "Content-Type: application/json" \
-d '{"mode": "native", "enabled": true}'

  • Configuration du proxy global (dĂ©finie une seule fois pour tout le trafic)
  • Remplacements du proxy par fournisseur
  • Affectations de proxy par connexion
  • Test de connexion via le proxy configurĂ©
  • Badges Ă  code couleur indiquant le niveau de proxy actif
  • Bouton Synchroniser maintenant pour rĂ©cupĂ©rer des proxys gratuits
  • Cartes de statistiques : total, actifs, qualitĂ© moyenne, derniĂšre synchronisation
  • Filtres : protocole, code pays, qualitĂ© minimale
  • Tableau des proxys avec l’hĂŽte, le protocole, le pays, le score de qualitĂ©, la latence, l’anonymat et l’accĂšs Ă  Google
  • Panneau d’état de la synchronisation avec suivi des rĂ©ussites et des Ă©checs, ainsi que le nombre d’échecs consĂ©cutifs
  • Tout effacer pour supprimer toutes les entrĂ©es 1proxy

Méthode Point de terminaison Description
GET /api/settings/proxy Obtenir la configuration complĂšte
GET /api/settings/proxy?level=global Obtenir le proxy global
GET /api/settings/proxy?level=provider&id=openai Obtenir le proxy du fournisseur
GET /api/settings/proxy?resolve=connectionId Résoudre le proxy effectif
PUT /api/settings/proxy Mettre Ă  jour la configuration
DELETE /api/settings/proxy?level=provider&id=openai Supprimer le proxy Ă  ce niveau
Méthode Point de terminaison Description
GET /api/v1/management/proxies Répertorier tous les proxys
GET /api/v1/management/proxies?id=uuid Obtenir un proxy par ID
GET /api/v1/management/proxies?id=uuid&where_used=1 Obtenir les affectations du proxy
POST /api/v1/management/proxies Créer un proxy
PATCH /api/v1/management/proxies Mettre Ă  jour un proxy
DELETE /api/v1/management/proxies?id=uuid Supprimer un proxy
DELETE /api/v1/management/proxies?id=uuid&force=1 Forcer la suppression
POST /api/v1/management/proxies/bulk-assign Effectuer une affectation en masse
GET /api/v1/management/proxies/assignments Répertorier les affectations
GET /api/v1/management/proxies/health Obtenir les statistiques d’état

Pour exposer votre instance OmniRoute Ă  l’Internet public (Cloudflare/ngrok/Tailscale) au lieu d’acheminer le trafic sortant via un proxy, consultez TUNNELS_GUIDE.md. L’API REST des tunnels se trouve sous /api/tunnels/{cloudflared,ngrok,tailscale}/* et est indĂ©pendante de la chaĂźne de proxys sortants documentĂ©e ci-dessus.

Méthode Point de terminaison Description
GET /api/settings/oneproxy Répertorier les proxys 1proxy
GET /api/settings/oneproxy?action=stats Obtenir les statistiques et l’état de synchro.
GET /api/settings/oneproxy?action=status Obtenir uniquement l’état de synchronisation
POST /api/settings/oneproxy Déclencher la synchronisation
POST /api/settings/oneproxy/rotate Passer au proxy suivant
DELETE /api/settings/oneproxy?id=uuid En supprimer un
DELETE /api/settings/oneproxy?clearAll=1 Tout effacer
Méthode Point de terminaison Description
GET /api/upstream-proxy/:providerId Obtenir la configuration du proxy en amont
PUT /api/upstream-proxy/:providerId Définir le mode du proxy en amont
DELETE /api/upstream-proxy/:providerId Supprimer la configuration du proxy en amont

Variable Valeur par défaut Description
ENABLE_SOCKS5_PROXY true Active la prise en charge du proxy SOCKS5 (true par défaut dans .env.example)

Définissez ENABLE_SOCKS5_PROXY=true dans votre fichier .env, puis redémarrez.

Ce comportement est normal avec les proxys bon marché qui interrompent les connexions inactives. OmniRoute gÚre déjà ce problÚme en :

  • DĂ©sactivant le maintien des connexions pour les connexions au proxy (keepAliveTimeout: 1)
  • DĂ©sactivant le pipelining (pipelining: 0)
  • Mettant en cache les rĂ©partiteurs afin d’éviter les nĂ©gociations rĂ©pĂ©tĂ©es

Si le problÚme persiste, essayez un autre proxy ou utilisez la fonctionnalité de rotation de 1proxy.

Assurez-vous que le proxy est configurĂ© avant de dĂ©marrer le flux OAuth. OmniRoute achemine l’échange de jetons OAuth via le proxy configurĂ©. DĂ©finissez d’abord un proxy global ou propre au fournisseur, puis Ă©tablissez la connexion.

VĂ©rifiez l’ordre de rĂ©solution :

  1. Effectuez une vérification avec GET /api/settings/proxy?resolve=your-connection-id
  2. Vérifiez que le status du proxy est active (et non inactive)
  3. Assurez-vous que la portĂ©e d’affectation du proxy correspond Ă  votre connexion

VĂ©rifiez l’état de la synchronisation :

FenĂȘtre de terminal
curl "http://localhost:20128/api/settings/oneproxy?action=status"

Si consecutiveFailures >= 5, le disjoncteur s’est dĂ©clenchĂ©. RedĂ©marrez le serveur pour le rĂ©initialiser, ou attendez une rĂ©initialisation manuelle.


CREATE TABLE proxy_registry (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
type TEXT NOT NULL DEFAULT 'http',
host TEXT NOT NULL,
port INTEGER NOT NULL,
username TEXT DEFAULT '',
password TEXT DEFAULT '',
region TEXT,
notes TEXT,
status TEXT DEFAULT 'active',
source TEXT NOT NULL DEFAULT 'manual', -- 'manual' ou 'oneproxy'
quality_score INTEGER, -- 0-100 (1proxy uniquement)
latency_ms INTEGER, -- millisecondes (1proxy uniquement)
anonymity TEXT, -- transparent/anonymous/elite
google_access INTEGER DEFAULT 0, -- peut accéder à Google ? (1proxy)
last_validated TEXT, -- horodatage ISO (1proxy)
country_code TEXT, -- code ISO Ă  2 lettres (1proxy)
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE TABLE proxy_assignments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
proxy_id TEXT NOT NULL REFERENCES proxy_registry(id),
scope TEXT NOT NULL, -- 'global', 'provider', 'account', 'combo'
scope_id TEXT, -- ID du fournisseur, ID de connexion ou ID de combinaison
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
UNIQUE(scope, scope_id)
);

Le mĂ©canisme d’échec rapide des proxys d’OmniRoute (src/lib/proxyHealth.ts) dĂ©tecte les proxys indisponibles en moins de 2 s grĂące Ă  une vĂ©rification rapide de la connexion TCP, puis met le rĂ©sultat en cache afin d’éviter une surcharge Ă  chaque requĂȘte.

RequĂȘte ──▶ ProxyHealthCache.get(url)
│
├─ RĂ©sultat en cache et rĂ©cent ? ──▶ renvoyer l’état en cache
│
└─ RĂ©sultat absent ou obsolĂšte ? ──▶ connexion TCP Ă  host:port
(dĂ©lai d’expiration : FAST_FAIL_TIMEOUT_MS)
──▶ mise en cache pendant HEALTH_CACHE_TTL_MS
──▶ renvoyer le rĂ©sultat

Sans ce mĂ©canisme, un proxy indisponible bloquerait chaque requĂȘte pendant toute la durĂ©e de PROXY_TIMEOUT_MS (30 s par dĂ©faut) avant d’échouer.

Variable Valeur par défaut RÎle
PROXY_FAST_FAIL_TIMEOUT_MS 2000 DĂ©lai d’expiration de la connexion TCP par vĂ©rification d’état
PROXY_HEALTH_CACHE_TTL_MS 30000 DurĂ©e de mise en cache d’un rĂ©sultat de vĂ©rification d’état

Valeurs recommandées :

ScĂ©nario DĂ©lai d’échec rapide DurĂ©e de vie du cache Justification
Passerelle API Ă  haut dĂ©bit 1500ms 60000ms Échec rapide agressif et cache plus long pour rĂ©duire le nombre de vĂ©rifications
NƓuds gĂ©odistribuĂ©s 3000ms 15000ms Les rĂ©seaux plus lents nĂ©cessitent davantage de temps ; cache plus court pour un basculement rapide
Développement / tests 1000ms 10000ms Itérations rapides sur les proxys locaux
FurtivitĂ© / prĂ©vention de dĂ©tection 2500ms 45000ms Évite les sondages rapides susceptibles de dĂ©clencher des limites de dĂ©bit
import { getAllProxyHealthStatuses, invalidateProxyHealth } from "omniroute/proxyHealth";
const statuses = getAllProxyHealthStatuses();
for (const s of statuses) {
console.log(`${s.proxyUrl} → healthy=${s.healthy}, stale=${s.stale}`);
}
// Forcer une nouvelle vĂ©rification d’un proxy spĂ©cifique
invalidateProxyHealth("http://user:pass@203.0.113.7:8080");

L’indicateur stale vaut true lorsque l’entrĂ©e du cache a dĂ©passĂ© HEALTH_CACHE_TTL_MS et que la requĂȘte suivante dĂ©clenchera une nouvelle vĂ©rification.

La vĂ©rification d’état utilise des valeurs par dĂ©faut adaptĂ©es au schĂ©ma de l’URL :

Schéma Port par défaut
http:// 8080
https:// 443
socks5:// / socks5h:// 1080

Les ports personnalisĂ©s indiquĂ©s dans l’URL (http://host:9999) ont toujours prioritĂ© sur la valeur par dĂ©faut du schĂ©ma.


OmniRoute suit l’utilisation de chaque proxy afin d’aider les opĂ©rateurs Ă  diagnostiquer les schĂ©mas de routage, les pics de latence et les dĂ©faillances rĂ©currentes.

Pour chaque requĂȘte transitant par un proxy configurĂ©, OmniRoute enregistre :

Métrique Description
proxy_url URL complĂšte du proxy (identifiants d’authentification masquĂ©s)
provider ID du fournisseur en amont (openai, anthropic, etc.)
latency_ms DurĂ©e totale de l’aller-retour, nĂ©gociation avec le proxy comprise
connect_ms Durée de connexion TCP uniquement
status Code d’état HTTP provenant du service en amont
error Classe d’erreur en cas d’échec de la requĂȘte
timestamp UTC au format ISO 8601
FenĂȘtre de terminal
# ÉvĂ©nements rĂ©cents des proxys
curl -H "Authorization: Bearer $OMNIROUTE_KEY" \
"http://localhost:20128/api/usage/proxy-logs?limit=100"

Le point de terminaison réel est /api/usage/proxy-logs (voir src/app/api/usage/proxy-logs/route.ts). Ce point de terminaison prend en charge :

  • GET /api/usage/proxy-logs — rĂ©cupĂ©rer les journaux des proxys
  • DELETE /api/usage/proxy-logs — effacer tous les journaux des proxys

Si nĂ©cessaire, les statistiques agrĂ©gĂ©es peuvent ĂȘtre interrogĂ©es directement dans la table proxy_logs via SQL. L’interface du tableau de bord peut proposer des vues agrĂ©gĂ©es.

Détecter un proxy instable (alternant entre succÚs et échec) :

SELECT proxy_url,
COUNT(*) AS total,
SUM(CASE WHEN status >= 500 THEN 1 ELSE 0 END) AS errors,
ROUND(100.0 * SUM(CASE WHEN status >= 500 THEN 1 ELSE 0 END) / COUNT(*), 1) AS error_pct
FROM proxy_logs
WHERE timestamp > datetime('now', '-1 hour')
GROUP BY proxy_url
HAVING error_pct > 5
ORDER BY error_pct DESC;

Trouver les proxys lents (latence p95 > 2 s) :

WITH ranked AS (
SELECT proxy_url, latency_ms,
PERCENT_RANK() OVER (PARTITION BY proxy_url ORDER BY latency_ms) AS pct
FROM proxy_logs
WHERE timestamp > datetime('now', '-24 hour')
)
SELECT proxy_url, latency_ms
FROM ranked
WHERE pct >= 0.95
ORDER BY latency_ms DESC;

Lorsque plusieurs proxys sont affectĂ©s Ă  une portĂ©e, OmniRoute utilise une stratĂ©gie de rotation pour choisir celui Ă  utiliser pour chaque requĂȘte. La stratĂ©gie est configurĂ©e au niveau de la portĂ©e (globale, par fournisseur, par compte ou par combinaison).

StratĂ©gie Cas d’utilisation Compromis
quality (par défaut) Production avec des proxys de qualité variable Favorise les proxys les mieux notés ; peut priver de trafic ceux qui sont moins bien notés
random Répartition de la charge, confidentialité Répartition uniforme ; ignore les indicateurs de qualité
sequential DĂ©bogage, tests dĂ©terministes Parcourt les proxys dans l’ordre ; comportement facile Ă  comprendre
Disposez-vous de scores de qualité pour vos proxys ?
│
┌───────────┮───────────┐
│ │
OUI NON
│ │
Tous les proxys │
ont-ils une qualitĂ© │
Ă  peu prĂšs Ă©quivalente ? │
│ │
┌────┮────┐ │
│ │ │
OUI NON Utilisez
│ │ `random`
│ │ (la rĂ©partition
│ │ uniforme constitue
│ │ progressivement des
│ │ donnĂ©es de qualitĂ©)
│ │
│ Utilisez `quality`
│ (idĂ©al pour une
│ qualitĂ© variable)
│
Utilisez `random`
(répartissez la charge
uniformément)

Le pool de la marketplace 1proxy dĂ©grade dĂ©jĂ  automatiquement les proxys dĂ©faillants (voir Scores de qualitĂ© des proxys). Pour les proxys que vous avez ajoutĂ©s au registre, le planificateur de vĂ©rification d’intĂ©gritĂ© en arriĂšre-plan (src/lib/proxyHealth/scheduler.ts) fournit le mĂȘme comportement permettant « d’exclure automatiquement de la chaĂźne un membre hors service », sans rien supprimer :

FenĂȘtre de terminal
# .env — dĂ©sactiver temporairement un proxy aprĂšs 3 sondes consĂ©cutives en Ă©chec,
# puis le rĂ©activer automatiquement dĂšs qu’il recommence Ă  rĂ©pondre aux sondes.
PROXY_AUTO_DISABLE=true
PROXY_AUTO_REMOVE_AFTER=3

Fonctionnement au sein d’une chaüne de plusieurs proxys :

  1. Le planificateur sonde chaque proxy enregistré toutes les PROXY_HEALTH_INTERVAL_MS (10 min par défaut ; 1 min au minimum).
  2. AprĂšs PROXY_AUTO_REMOVE_AFTER Ă©checs concluants consĂ©cutifs (un vĂ©ritable Ă©chec de connexion — un dĂ©lai d’attente dĂ©passĂ© ou une erreur 5xx provenant de la cible de la sonde ne compte jamais, voir VĂ©rification de l’intĂ©gritĂ© des proxys), le status du proxy est dĂ©fini sur dead.
  3. dead fait partie des statuts exclus par le filtre des statuts actifs utilisĂ© lors de la rĂ©solution du pool/de la rotation. La rotation d’un pĂ©rimĂštre (round-robin / alĂ©atoire / persistante / latence — voir Arbre de dĂ©cision de la stratĂ©gie de rotation) cesse donc immĂ©diatement d’attribuer ce proxy aux nouvelles requĂȘtes. Aucun autre proxy du pool n’est affectĂ©, et l’ensemble du pool ne bascule jamais silencieusement vers une connexion directe — voir le mĂ©canisme de protection Ă  fermeture sĂ©curisĂ©e du SystĂšme de proxys Ă  4 niveaux.
  4. Le planificateur continue de sonder les proxys dead selon le mĂȘme intervalle. La prochaine sonde rĂ©ussie rĂ©tablit le status sur active, et le proxy rĂ©intĂšgre la rotation — aucun ajout manuel n’est nĂ©cessaire.

Ce comportement est dĂ©libĂ©rĂ©ment optionnel et non destructif : par dĂ©faut, le planificateur se contente de compter et de journaliser les Ă©checs (voir la politique C dans decision.ts), et PROXY_AUTO_DISABLE ne supprime jamais aucune ligne — c’est le rĂŽle de l’option distincte et plus agressive PROXY_AUTO_REMOVE. Si les deux sont dĂ©finies sur true, PROXY_AUTO_REMOVE est prioritaire (il est inutile de dĂ©sactiver temporairement un proxy sur le point d’ĂȘtre supprimĂ©). Consultez la rĂ©fĂ©rence Configuration de l’environnement pour obtenir la liste complĂšte des variables.


📖 Documentation associĂ©e :


Code source d’OmniRoute (a58000c7685f)

HagiCode

HagiCode est un espace de développement agentique qui associe workflows structurés, exécution multi-agent et vues Hero Dungeon.

Transformez vos idées en logiciels utiles grùce à un workflow agentique plus intelligent, rapide et agréable.

Interface principale de HagiCode en thĂšme clair
  • SmartDes workflows structurĂ©s transforment une intention en parcours exĂ©cutable, de l’idĂ©e Ă  la livraison.
  • EfficientLes workflows multi-agents font avancer recherche, rĂ©alisation et revue en parallĂšle.
  • FunHero Dungeon rend les longues sessions de code plus visuelles et collaboratives.
Visiter HagiCode