Felo API PlatformFelo API Platform

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.

Temps20 minutesNiveauIntermédiaireMis à jour2026-10-29
Pour quiÉquipes plateformeResponsables produit APIResponsables ingénierie

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.

Exemple de plan de routage (extrait)
TâcheActuelProposéRisque
Classifier un ticketmodèle fortmodèle rapidefaible
Rédiger une réponsemodèle fortmodèle fortaucun
Résumer un changelogmodèle fortmodèle rapidemoyen

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
  1. 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 }
    }
  2. 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 }
    }
  3. 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 }
  4. 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);
    }
  5. 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

Adaptez-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.

Les pages de référence derrière cette recette et la suite.