Coût
Gardez les coûts de modèles prévisibles quand l’usage grandit
Faites passer chaque tâche par un seul endpoint OpenAI-compatible, routez vers le modèle le moins cher capable de la faire et consignez l’usage de tokens renvoyé par chaque réponse.
Copier le prompt
Remplacez les champs entre crochets, puis collez dans Claude Code, Codex ou toute IA avec accès au terminal. Elle installe le skill Felo, demande avant de dépenser des crédits et exécute le workflow.
Analyse nos dépenses de modèles et propose un plan de routage pour ces tâches : [liste des tâches ou fonctionnalités]. Contraintes : budget mensuel [montant], objectif de latence [objectif], niveau de qualité [niveau]. Lis le catalogue de modèles en direct avant toute recommandation. Produis : 1. Un tableau tâche -> modèle recommandé. 2. Les tâches qui peuvent descendre d’un cran, et le risque qualité. 3. Un plan de journalisation de l’usage par tâche et fonctionnalité. 4. Ce qu’il faut mesurer avant de modifier la production. Règles : - Lis les ID et prix actuels dans le catalogue en direct ; ne cite jamais un tarif de mémoire. - Ne modifie pas la configuration de production et n’envoie pas de trafic réel. - Demande avant de consommer des crédits pour des appels de test. - Garde un plan de rollback et un plafond de dépense par fonctionnalité. - Écris le plan dans ./routing-plan.md et résume-le dans le chat.
La copie inclut aussi les étapes d'installation et les règles de sécurité.
Ce que vous obtenez
Exemple de sortie d'une exécution. Pas de génération en direct.
| Tâche | Actuel | Proposé | Risque |
|---|---|---|---|
| Classifier un ticket | modèle fort | modèle rapide | faible |
| Rédiger une réponse | modèle fort | modèle fort | aucun |
| Résumer un changelog | modèle fort | modèle rapide | moyen |
Avant de changer quoi que ce soit : journaliser l’usage par tâche pendant une semaine et comparer la qualité sur 50 sorties échantillonnées.
Les appels exacts
Pour les développeurs : le même workflow en code, dans l'ordre d'exécution.
Afficher les appels API
Toutes les tâches sur un endpoint
Utilisez un endpoint OpenAI-compatible et une clé uniques, sans un SDK par fournisseur.
routing.ts const BASE_URL = "https://openapi.felo.ai/api/v1"; const headers = { Authorization: `Bearer ${process.env.FELO_API_KEY}`, "Content-Type": "application/json", }; type Completion = { choices: { message: { content: string } }[]; usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number }; }; async function chat(model: string, prompt: string): Promise<Completion> { const res = await fetch(`${BASE_URL}/chat/completions`, { method: "POST", headers, body: JSON.stringify({ model, messages: [{ role: "user", content: prompt }] }), }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<Completion>; } const summary = await chat( "claude-haiku-5-5", "Summarize this changelog in three bullets: …", ); console.log(summary.choices[0].message.content);Exemple de sortie
{ "choices": [{ "message": { "content": "• …" } }], "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 } }Routez le modèle par tâche
Choisissez un modèle rapide ou fort selon la complexité et notez d’abord la base.
routing.ts type TaskKind = "classify" | "extract" | "summarize" | "draft" | "review"; const MODEL_ROUTES: Record<TaskKind, string> = { classify: "claude-haiku-5-5", extract: "claude-haiku-5-5", summarize: "claude-haiku-5-5", draft: "claude-sonnet-5-5", review: "claude-sonnet-5-5", }; export async function route(kind: TaskKind, prompt: string) { const model = MODEL_ROUTES[kind]; const result = await chat(model, prompt); return { model, text: result.choices[0].message.content, usage: result.usage, }; }Exemple de sortie
{ "model": "claude-haiku-5-5", "text": "• …", "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 } }Lisez et journalisez l’usage
Lisez le usage de chaque réponse et consignez tokens et latence par fonctionnalité.
routing.ts type UsageRecord = { model: string; kind: TaskKind; promptTokens: number; completionTokens: number; totalTokens: number; }; const usageLog: UsageRecord[] = []; function logUsage(kind: TaskKind, model: string, usage: Completion["usage"]) { const entry: UsageRecord = { model, kind, promptTokens: usage.prompt_tokens, completionTokens: usage.completion_tokens, totalTokens: usage.total_tokens, }; usageLog.push(entry); console.log(JSON.stringify(entry)); // ship this line to your metrics store return entry; } export function tokensByModel() { return usageLog.reduce<Record<string, number>>((totals, entry) => { totals[entry.model] = (totals[entry.model] ?? 0) + entry.totalTokens; return totals; }, {}); } const result = await route("summarize", "Summarize this changelog in three bullets: …"); logUsage("summarize", result.model, result.usage); console.log(tokensByModel());Exemple de sortie
{"model":"claude-haiku-5-5","kind":"summarize","promptTokens":812,"completionTokens":96,"totalTokens":908} { "claude-haiku-5-5": 18234, "claude-sonnet-5-5": 4201 }Une clé pour tous les fournisseurs
Appelez les modèles du catalogue avec la même clé Felo et réduisez la gestion des fournisseurs.
routing.ts async function chatOnChannel(model: string, prompt: string, channel?: string) { const res = await fetch(`${BASE_URL}/chat/completions`, { method: "POST", headers: { ...headers, ...(channel ? { "X-Felo-Channel": channel } : {}), }, body: JSON.stringify({ model, messages: [{ role: "user", content: prompt }] }), }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<Completion>; } // Leave `channel` undefined for the default supplier. export function routePinned(kind: TaskKind, prompt: string, channel?: string) { return chatOnChannel(MODEL_ROUTES[kind], prompt, channel); }Prix depuis le catalogue en direct
Ne figez pas les tarifs ; lisez les prix actuels dans le catalogue et la page des prix.
routing.ts type Catalog = { data: { id: string; owned_by: string; model_kind: string }[]; }; export async function chatModelIds() { const res = await fetch( `${BASE_URL}/models?exclude_video_and_decisions=true`, { headers }, ); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); const catalog = (await res.json()) as Catalog; return catalog.data .filter((model) => model.model_kind === "chat") .map((model) => model.id); } // Price `tokensByModel()` against https://openapi.felo.ai/pricing and // https://openapi.felo.ai/models. Keep the links, not the rates, in your code.Exemple de sortie
["claude-haiku-5-5", "claude-sonnet-5-5"]
Ce qui est inclus
- Endpoint et clé unifiés
- Choix du modèle rapide ou fort par tâche
- Journal des tokens de chaque réponse
- Prix lus dans le catalogue en direct, pas figés dans le code
Ce qu'elle ne fait pas
- Ne garantit pas une facture plus basse
- Ne bascule pas le trafic de production automatiquement
- Les ids et prix changent ; lisez toujours le catalogue en direct
- N’évalue pas la qualité à votre place ; vos échantillons sont nécessaires
- Ne remplace ni facturation ni observabilité
Questions
La facture va-t-elle baisser ?
Il indique quelles tâches peuvent descendre d’un cran, mais l’économie n’est réelle qu’après comparaison d’échantillons et journalisation de l’usage.
Appelle-t-il les modèles automatiquement ?
Seulement si vous approuvez des appels de test. Par défaut il lit le catalogue et écrit des recommandations sans toucher au trafic de production.
Comment savoir quel modèle est moins cher ?
Lisez le catalogue de modèles en direct et la page des prix ; le workflow ne fige pas les tarifs car ils changent.
Puis-je épingler un fournisseur ?
Oui, quand la latence compte plus que le prix. Épingler est un choix, pas une stratégie de retry ; ajoutez votre propre fallback.
Que journaliser ?
Par appel : tâche, fonctionnalité, modèle, prompt token, completion token, total et latence. Agrégez par fonctionnalité avant de fixer un budget.
Combien coûte une revue ?
Lire le catalogue ne génère aucun appel modèle. Les appels de test sont facturés à l’usage ; le prompt demande votre accord avant appel.
Workflows liés
Répondez aux questions support depuis votre propre documentation
Créez un LiveDoc, chargez le centre d’aide et le runbook interne, récupérez les passages qui répondent au ticket et laissez le modèle répondre uniquement à partir de ces preuves.
Ouvrir le workflowRechercheTransformez une question en brief de recherche sourcé
Interrogez le web, récupérez les pages derrière la réponse en Markdown, ajoutez ce que disent les praticiens sur X, puis conservez les preuves dans un LiveDoc que vous pourrez interroger plus tard.
Ouvrir le workflowBureauTransformez une page de recherche en présentation
Extrayez la page, enregistrez-la comme contexte LiveDoc, laissez l’API PPT Task construire le deck et interrogez jusqu’au lien final.
Ouvrir le workflowAdaptez-la
La même recette, adaptée à votre façon de livrer.
D’abord seulement journaliser
Avant la production, enregistrez une semaine d’usage puis décidez du downgrade.
Budget par fonctionnalité
Fixez une limite mensuelle par fonctionnalité et alertez ou dégradez au dépassement.
Épingler pour la latence
Quand la latence compte plus que le prix, épinglez le fournisseur et ajoutez votre fallback.
Aller plus loin
Les pages de référence derrière cette recette et la suite.