Routage pondéré par le coût
Lorsque plusieurs modèles sont disponibles — Opus, Sonnet, Haiku, ou des modèles locaux derrière une passerelle odysseus auto-hébergée — PRECC achemine chaque tâche vers celui qui minimise le coût en dollars attendu, et non le nombre de jetons. Un jeton d’un modèle bon marché et un jeton d’un modèle coûteux n’ont pas le même coût ; le routeur optimise le dollar, sous réserve d’un seuil de réussite mesuré et d’un seuil de capacité par catégorie.
Un dollar, et non un jeton, est l’unité de coût
Pour une tâche de catégorie c, parmi les modèles candidats m éligibles en termes de capacité, le routeur minimise le coût attendu pondéré par le prix. E[$ | task, m] est le coût moyen mesuré en jetons du modèle pour cette catégorie multiplié par son prix par jeton. Une exécution Haiku qui utilise plus de jetons qu’Opus peut tout de même l’emporter, car Haiku est plusieurs fois moins cher par jeton. Chaque nombre de l’objectif est soit mesuré (moyennes de jetons de l’oracle, réussite enregistrée, prix de modèles publiés), soit un a priori explicitement étiqueté — jamais inventé.
choose argmin_m E[$ | task, m]
subject to P(success | task, m) >= min_success
capability(m) >= capability_floor(category)
Acheminer une tâche
precc route "<task>" catégorise la tâche, applique le seuil de capacité, classe les modèles éligibles selon les dollars attendus, et affiche la décision. Avec --execute, il envoie la tâche au modèle choisi via l’API de session odysseus. Chaque décision est également amorcée dans l’oracle de prédiction afin que son coût réel et son résultat puissent être enregistrés après l’exécution de la tâche.
$ precc route "fix the broken parser"
category : fix (capability floor 0)
→ model : anthropic/claude-haiku-4-5 [Measured, confidence 0.60]
est. cost : $0.0096 (12000 tok)
reason : measured cheapest-capable for `fix` (by cost): claude-haiku-4-5
prediction : #42 (seeded; learner will auto-close after the task runs)
Économies en dollars
precc savings ajoute une section en dollars dès que des tâches acheminées sont terminées. Pour chaque tâche acheminée, il valorise les jetons réellement dépensés au tarif du modèle choisi et les compare à une base de référence avec modèle par défaut systématique — jetons maintenus constants, seul le prix varie. C’est la vue « réduire le coût, et pas seulement les jetons » ; la section reste masquée jusqu’à ce que de réelles données d’acheminement existent, de sorte qu’elle n’affiche jamais de lignes inventées.
$ precc savings
Routing cost (USD) — baseline: always claude-opus-4-5
claude-haiku-4-5 : 1 task(s) $ 0.0096 chosen vs $ 0.0600 baseline
claude-sonnet-4-6 : 1 task(s) $ 0.1200 chosen vs $ 0.2000 baseline
total : 2 task(s) $ 0.1296 chosen vs $ 0.2600 baseline
→ saved $0.1304 (50.2% of baseline spend)
La boucle de rétroaction
Le routage s’améliore lui-même : route → execute → record → retrain. Chaque décision d’acheminement est amorcée dans l’oracle ; le démon precc-learner en arrière-plan récupère le message terminé, enregistre les jetons réels, le modèle et la réussite, puis clôt la ligne. À mesure que la table par (model, category) se remplit, le routeur passe des a priori du moins cher capable à des choix mesurés, et le prédicteur de jetons gagne une dimension par modèle.
Exploration
Pour éviter d’exploiter indéfiniment un seul modèle bon marché sur des données obsolètes, le routeur peut délibérément échantillonner une cellule (model, category) sous-explorée avant le choix glouton. L’exploration est facultative, déterministe (aucun hasard — le hook doit être reproductible) et bornée : elle ne franchit jamais les seuils de capacité ou de réussite mesurée, et un plafond de regret de prix l’empêche de dériver vers un modèle bien plus coûteux.
# ~/.config/precc/odysseus.toml
explore_n_min = 3 # sample each (model, category) cell ~3× before trusting it
explore_eps = 1.0 # allow up to 2× the cheapest price while exploring
Mesuré, jamais supposé
Un modèle n’est écarté pour non-respect du seuil de réussite que lorsqu’il existe une preuve mesurée qu’il le fait — un modèle non mesuré n’est jamais exclu sur la base d’un nombre deviné. En l’absence de données pour une cellule, le routeur se rabat sur un a priori conservateur du moins cher capable et étiquette la décision comme un démarrage à froid, de sorte que l’appelant sait toujours si le choix repose sur des preuves ou sur un a priori.