Passer au contenu principal
Un seul model=auto, et c’est la passerelle qui décide « quel modèle utiliser ».
Le routage automatique (Auto Router) sélectionne en temps réel, selon le contenu de la requête, le modèle le plus adapté parmi les centaines de modèles de la plateforme. Il vous suffit de renseigner auto comme model — pas besoin de choisir un modèle, ni de comparer les prix, ni de suivre les évolutions des modèles.
La facturation se fait selon le modèle réellement utilisé, sans surcoût, et sans aucune modification du code client. Le modèle effectivement appelé est inscrit dans les en-têtes et le corps de la réponse (voir Comment confirmer le modèle réellement utilisé) : c’est entièrement traçable.

Cas d’usage

  • Applications généralistes : lorsque vous ne savez pas quel type de requête vos utilisateurs vont envoyer, laissez auto répartir selon le contenu.
  • Optimisation des coûts : laissez les tâches simples basculer automatiquement vers des modèles moins chers et plus rapides (auto privilégie le coût par défaut).
  • Optimisation de la qualité : assurez-vous que les requêtes complexes sont routées vers des modèles plus puissants (auto:quality_first).
  • Scénarios à faible latence : pour la voix en temps réel ou les boucles multi-tours d’un agent, privilégiez le modèle le plus rapide à répondre (auto:latency_critical).
  • Point d’entrée unique, sans choix de modèle : les différents types de requêtes sont automatiquement répartis vers leur modèle optimal — plus besoin de maintenir une table de correspondance « tâche → modèle », ni de suivre en continu les évolutions des modèles ou de comparer manuellement les prix et de changer de nom.

Démarrage rapide

Réglez model sur auto ; le reste du corps de la requête est identique à un appel normal. L’URL de base est https://aihubmix.com/v1.
curl https://aihubmix.com/v1/chat/completions \
  -H "Authorization: Bearer <AIHUBMIX_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "auto",
    "messages": [
      { "role": "user", "content": "What is the meaning of life?" }
    ]
  }'
Le routage automatique effectue son analyse avant que la requête n’atteigne l’upstream et traite de la même manière les requêtes en streaming (stream: true) et non-streaming, sans paramètre supplémentaire ; l’ensemble de la décision n’ajoute qu’environ 1 ms de surcoût, quasiment imperceptible sur la latence de bout en bout.

Comment confirmer le modèle réellement utilisé

C’est l’ancre de confiance du routage automatique : vous savez toujours quel modèle a finalement servi cette requête.
  • Le champ model du corps de la réponse est renseigné avec le vrai modèle utilisé (par exemple mimo-v2.5-pro), et non auto.
  • Les en-têtes de la réponse fournissent l’information complète sur la décision :
En-tête de réponseSignificationExemple de valeur
X-Aihubmix-Router-Resolved-ModelLe modèle réellement utilisé, sur lequel se base la facturationxiaomi-mimo-v2.5-pro
X-Aihubmix-Router-PolicyLa stratégie utilisée pour cette requêtecost_optimized
X-Aihubmix-Router-DimensionLa dimension de tâche identifiéetext.overall
X-Aihubmix-Router-Decision-IdL’identifiant unique de cette décision, utile pour le diagnostic05dbad09-33c5-42de-…
X-Aihubmix-Router-ReasonBrève explication de la décision (stratégie / dimension / meilleur score / nombre de candidats)policy=cost_optimized dim=text.overall top=0.182 survivors=20/33
X-Aihubmix-Router-FallbackApparaît uniquement lorsque la solution de repli « aucun candidat » est déclenchéetrue
Les en-têtes HTTP sont insensibles à la casse : le tableau ci-dessus utilise par convention une majuscule en début de mot, mais le retour réel en HTTP/2 est en minuscules x-aihubmix-router-* ; les deux sont équivalents.
Lire la décision de routage (curl pour voir les en-têtes ; avec un SDK, récupérez l’en-tête via l’objet de réponse brut) :
curl -i https://aihubmix.com/v1/chat/completions \
  -H "Authorization: Bearer <AIHUBMIX_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "auto",
    "messages": [
      { "role": "user", "content": "What is the meaning of life?" }
    ]
  }' | grep -i "^x-aihubmix-router"
Sortie réelle de curl (environnement de production ; le modèle utilisé varie selon le catalogue en ligne) :
x-aihubmix-router-decision-id: 05dbad09-33c5-42de-85b5-559fdb73eb4c
x-aihubmix-router-dimension: text.overall
x-aihubmix-router-policy: cost_optimized
x-aihubmix-router-reason: policy=cost_optimized dim=text.overall top=0.182 survivors=20/33
x-aihubmix-router-resolved-model: xiaomi-mimo-v2.5-pro
Comment lire reason : survivors=20/33 signifie que sur 33 candidats, 20 ont passé le filtrage strict et sont entrés dans la phase de scoring ; top=0.182 est le score global normalisé du modèle gagnant au sein du pool de candidats (capacité / coût / latence pondérés selon la stratégie).
Le Resolved-Model de l’exemple dépend des candidats et des prix actuels du catalogue en ligne et varie au gré des mises en ligne et retraits de modèles de la plateforme — c’est précisément là toute la valeur du routage automatique : vous n’avez pas à suivre ces changements. Pour que la décision soit auditable, fiez-vous au vrai nom de modèle dans les en-têtes / le corps de la réponse, et ne supposez pas qu’il reste fixe.

Stratégies de routage

Sans suffixe, auto utilise la stratégie par défaut cost_optimized. Vous pouvez utiliser auto:<stratégie> pour spécifier explicitement la priorité :
Écriture de la stratégiePrioritéCas d’usage
auto (= auto:cost_optimized)Coût prioritaire : à capacité suffisante, choisit le moins cherTâches en lot, sensibilité au coût
auto:balancedÉquilibré : capacité / coût / latence pris en compteUsage général, choix sûr en cas d’incertitude
auto:quality_firstQualité prioritaire : privilégie le modèle le plus puissantRaisonnement complexe, sorties critiques
auto:latency_criticalFaible latence prioritaire : privilégie le plus rapide à répondreVoix en temps réel, boucles d’agent
Pour spécifier une stratégie, il suffit d’ajouter le suffixe au model :
# qualité prioritaire + tâche de code
curl -i https://aihubmix.com/v1/chat/completions \
  -H "Authorization: Bearer <AIHUBMIX_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "auto:quality_first",
    "messages": [
      { "role": "user", "content": "Write a Python function to reverse a linked list." }
    ]
  }' | grep -i "^x-aihubmix-router"
Même requête, stratégies différentes → résultats différents (mesures réelles en production, pour la même phrase What is the meaning of life?, toutes tombant dans la dimension text.overall) :
StratégieModèle utiliséScore top
auto (= cost_optimized)xiaomi-mimo-v2.5-pro0.182
auto:balancedclaude-opus-4-6-think0.488
auto:latency_criticalclaude-opus-4-60.646
auto:quality_firstclaude-opus-4-6-think0.758
latency_critical a choisi la version non -think — la variante « thinking » a une latence de raisonnement plus élevée, et la stratégie faible latence l’évite activement. On voit que les pondérations de stratégie agissent réellement sur l’arbitrage « capacité / coût / latence », et pas seulement sur la capacité.
Le contenu modifie aussi le résultat : si l’on applique le même auto:quality_first à une tâche de code (la requête de l’exemple ci-dessus), la dimension passe de text.overall à text.coding et, en mesure réelle, c’est claude-opus-4-6-think qui est utilisé — la stratégie et le contenu de la requête déterminent ensemble le modèle final.
Un suffixe de stratégie inconnu (comme auto:fast) revient à la stratégie par défaut cost_optimized sans déclencher d’erreur.

Fonctionnement

À la réception de model=auto, la passerelle transforme « l’intention » en « modèle concret » en trois étapes :
1

Extraire les caractéristiques de la requête

Analyse les modalités d’entrée / sortie de cette requête (texte, image, fichier), l’intention du contenu (code, mathématiques, OCR, graphiques, langue, recherche en ligne ou non, etc.) et l’ampleur de la requête (estimation des tokens en entrée / sortie), puis normalise le tout en une dimension de tâche. Par exemple : une question contenant du code → text.coding ; une image accompagnée d’une demande d’OCR → vision.ocr ; un texte ordinaire → text.overall.
2

Filtrer les candidats (filtre strict)

Exclut directement les modèles qui ne respectent pas les contraintes strictes : ne prennent pas en charge les modalités d’entrée / sortie requises, fenêtre de contexte insuffisante, retirés par le coupe-circuit (voir Fiabilité et tolérance aux pannes), ou hors de la plage de modèles autorisés par votre clé.
3

Scorer avec pondération selon la stratégie

Pour les candidats ayant passé le filtre, on combine le score de capacité du modèle issu de benchmarks de référence reconnus dans l’industrie, les prix en temps réel et les données de performance, puis on applique un scoring tridimensionnel pondéré « capacité / coût / latence » selon la stratégie choisie, et on retient le score le plus élevé. Le nom du modèle final est réécrit dans la requête et les en-têtes de réponse.
Exemple de scoring réel (sous la stratégie quality_first, top 3 d’un même pool de candidats, données issues des journaux de décision de production) :
Modèle candidatScore de capacitéCoût relatifLatenceScore global
claude-opus-4-6-think15042201963ms0.758
claude-opus-4-61498220822ms0.721
claude-fable-5151048411130ms0.600
Remarquez que claude-fable-5 a le score de capacité le plus élevé (1510), mais qu’il est relégué à la troisième place sur le score global en raison d’un coût plus élevé et d’une latence plus grande. C’est tout l’intérêt du scoring pondéré : non pas un « tout-capacité », mais un arbitrage entre capacité / coût / latence selon la stratégie.
L’identification de la dimension est automatique — le routage automatique intègre plus de 30 dimensions de tâche fines (code / mathématiques / OCR / graphiques / texte long / chinois / recherche en ligne…), bien plus précises qu’une « répartition grossière par famille de modèles ». Avec le même auto, des contenus différents sont routés vers des dimensions différentes :
Votre requêteDimension identifiée
Question en texte ordinairetext.overall
Contient du code, demande d’écrire / déboguer un programmetext.coding
Preuve / résolution mathématiquetext.math
Question très longue (environ 500+ tokens)text.longer_query
Question en chinoistext.language.chinese
Entrée image + « What is in this image? »vision.overall
Entrée image + « OCR… » / « reconnaître le texte »vision.ocr
Entrée image + graphique / organigrammevision.diagram
Recherche en ligne activéesearch.overall
L’identification de la dimension utilise une correspondance conservatrice (haute précision, faible taux de faux positifs) : les requêtes de longue traîne ou ambiguës tombent dans des dimensions plus générales (comme text.overall / vision.overall) plutôt que d’être classées de force, ce qui évite les erreurs de routage.
Les entrées image passent aussi par le routage automatique : lorsqu’une image est jointe dans /v1/chat/completions, la requête est routée vers un modèle aux fortes capacités visuelles selon la tâche image. En mesure réelle de production — « OCR this image » → vision.ocr, modèle utilisé qwen3.5-397b-a17b ; analyse d’image générale « What is in this image? » → vision.overall, modèle utilisé gpt-5.4-mini. (Il s’agit ici de la compréhension d’image ; la génération d’image /v1/images/* ne prend pas encore en charge auto, voir FAQ.)

Fiabilité et tolérance aux pannes

Le routage automatique intègre une tolérance aux pannes multicouche pour garantir que le chemin auto n’échoue jamais sans raison :
La passerelle maintient pour chaque modèle une statistique de taux d’échec sur une fenêtre glissante. Lorsqu’un modèle accumule suffisamment d’échecs dans la fenêtre et dépasse le seuil de taux d’échec, il est temporairement retiré du pool de candidats puis rétabli automatiquement après une période de refroidissement — afin d’éviter de continuer à envoyer les requêtes suivantes à un modèle qui dysfonctionne. Le signal d’échec provient des erreurs renvoyées par l’upstream pour cette requête ; le « aucun canal disponible » propre à la passerelle n’est pas comptabilisé (ce n’est pas un problème du modèle lui-même).
Si jamais le filtre strict exclut tous les candidats (par exemple si une certaine combinaison de modalités n’a temporairement aucun modèle disponible), la passerelle ne renvoie pas d’erreur, mais attribue un modèle de repli selon le type de sortie afin de garantir une réponse, et ajoute l’en-tête X-Aihubmix-Router-Fallback: true pour vous en informer.
Si votre clé limite la plage de modèles disponibles, le modèle choisi par le routage automatique (repli inclus) reste toujours dans cette plage. Si aucun modèle de la plage ne peut réellement servir cette requête, un 403 explicite est renvoyé, plutôt que d’utiliser silencieusement un modèle hors plage (potentiellement plus cher).

Facturation

Facturation au prix réel du modèle effectivement utilisé ; le routage automatique lui-même ne facture aucun surcoût. Quel que soit le modèle qui répond finalement, le calcul se fait selon le prix, les capacités et les limites de contexte de ce modèle — ce modèle étant la valeur figurant dans l’en-tête X-Aihubmix-Router-Resolved-Model et dans le champ model du corps de la réponse. Autrement dit, le routage automatique n’utilise pas « en douce un modèle cher » : chaque utilisation est inscrite dans la réponse et peut être rapprochée ligne par ligne.

Limitations

  • Le routage automatique vise actuellement l’interface de complétion de conversation /v1/chat/completions (voir FAQ : quelles interfaces sont prises en charge).
  • ?router=off ou l’en-tête X-Router-Off font renvoyer un 400 directement à model=auto — c’est un refus explicite de l’usage ambigu « vouloir auto tout en désactivant le routage », plutôt qu’une ignorance silencieuse :
    curl -i "https://aihubmix.com/v1/chat/completions?router=off" \
      -H "Authorization: Bearer <AIHUBMIX_API_KEY>" \
      -H "Content-Type: application/json" \
      -d '{"model":"auto","messages":[{"role":"user","content":"hi"}]}'
    # → HTTP/1.1 400 Bad Request
    # {"error":{"message":"auto requires router enabled; remove ?router=off / X-Router-Off", ...}}
    
  • L’ensemble des candidats varie dynamiquement avec le catalogue de la plateforme : un même auto peut utiliser des modèles différents à différents moments (c’est voulu par conception, auditable via les en-têtes de réponse).

Différences avec OpenRouter / LiteLLM

La « sélection automatique de modèle » n’est pas propre à AIHubMix ; OpenRouter et LiteLLM offrent des capacités similaires. Les différences portent surtout sur le coût d’intégration et le mode d’hébergement :
Point de différenceOpenRouterLiteLLMAIHubMix
Sélection automatique selon le contenu de la requête
Zéro configuration, prêt à l’emploi (pas de règles de routage / utterances à écrire)
Hébergé par la plateforme, pas de proxy à auto-héberger / déployer
Multi-stratégies coût / qualité / latence, basculées par un seul paramètre
Décision d’utilisation traçable (en-têtes avec dimension / policy / reason)
Facturation selon le modèle finalement utilisé

FAQ

Q : Quelles interfaces le routage automatique prend-il en charge ? R : Actuellement, model=auto prend en charge l’interface de complétion de conversation compatible OpenAI /v1/chat/completions. Les interfaces de génération / édition d’images (/v1/images/*), l’audio, /v1/embeddings, /v1/rerank, etc. ne prennent pas encore en charge auto ; veuillez spécifier directement un modèle concret. Q : Le routage automatique prend-il en charge les entrées image ? R : Oui. Joindre une image (image_url) dans /v1/chat/completions relève de la compréhension d’image et la requête est routée vers un modèle aux fortes capacités visuelles selon la tâche image (vision.ocr / vision.diagram / vision.overall, etc.). À ne pas confondre : la génération d’image passe par l’interface /v1/images/* et ne prend pas encore en charge auto. Q : Comment savoir quel modèle a réellement été utilisé pour cette requête ? R : Regardez l’en-tête X-Aihubmix-Router-Resolved-Model, ou le champ model du corps de la réponse — les deux sont renseignés avec le vrai nom du modèle. Voir Comment confirmer le modèle réellement utilisé. Q : Le routage automatique va-t-il utiliser en douce un modèle cher ? R : Non. La stratégie par défaut cost_optimized privilégie le coût ; et chaque modèle utilisé est inscrit dans la réponse et facturé à son prix d’origine, rapprochable ligne par ligne. Voir Facturation. Q : Comment contrôler / estimer les coûts ? R : Trois moyens cumulables — ① par défaut, auto (cost_optimized) privilégie déjà le coût ; ② utilisez la plage de modèles disponibles de la clé pour verrouiller les candidats dans une fourchette de prix acceptable, ce qui revient à fixer une borne supérieure de coût ; ③ chaque utilisation est facturée au prix d’origine du modèle figurant dans l’en-tête Resolved-Model, rapprochable ligne par ligne. Quand vous avez besoin de plus de puissance, utilisez explicitement auto:quality_first. Q : Quelle est la différence entre auto et le « mappage de modèles / fallback » ? R : Le mappage de modèles / fallback est un alias fixe au niveau de la clé + un repli ordonné en cas d’échec (toujours la même cible) ; le routage automatique sélectionne dynamiquement le modèle selon le contenu de chaque requête. Le premier résout « le client n’accepte qu’un certain nom / le modèle principal est tombé, on bascule sur le secours », le second résout « peu m’importe lequel, donnez-moi le plus adapté ». Q : Peut-on limiter le routage automatique à un choix parmi quelques modèles seulement ? R : Oui — via la contrainte de la plage de modèles disponibles de la clé : le routage automatique ne choisira que parmi les modèles autorisés par cette clé, et aucun modèle hors plage ne sera utilisé. Q : Les requêtes en streaming sont-elles prises en charge ? R : Oui. Le routage s’effectue avant que la requête n’atteigne l’upstream et traite de la même manière le streaming et le non-streaming. Q : Pourquoi deux appels avec la même phrase ont-ils utilisé des modèles différents ? R : L’ensemble des candidats et les prix varient dynamiquement avec le catalogue de la plateforme, c’est voulu par conception. Utilisez le Decision-Id et le Resolved-Model des en-têtes de réponse pour auditer chaque décision. Q : Comment faire pour qu’une requête utilise de façon stable le même modèle (par exemple pour réutiliser le cache de prompt) ? R : auto sélectionne le modèle dynamiquement selon le catalogue actuel et ne garantit pas le déterminisme. Si vous avez besoin d’utiliser de façon stable le même modèle (par exemple pour dépendre du cache de prompt de l’upstream, ou pour une reproduction stricte), spécifiez directement un nom de modèle concret, ou limitez la plage disponible de la clé à un modèle unique — dans ces deux cas, le modèle utilisé est déterministe.

Ressources connexes