Felo API PlatformFelo API Platform

Costi

Mantieni prevedibili i costi dei modelli quando l’uso cresce

Manda ogni attività attraverso un unico endpoint OpenAI-compatibile, instradala al modello più economico che può svolgerla e registra l’uso di token restituito da ogni risposta.

Tempo20 minutiLivelloIntermedioAggiornato2026-10-29
Per chiTeam piattaformaResponsabili prodotto APILeader ingegneria

Copia il prompt

Sostituisci i campi tra parentesi quadre e incolla in Claude Code, Codex o qualsiasi IA con accesso al terminale. Installa lo skill Felo, chiede prima di spendere crediti ed esegue il workflow.

Esamina la nostra spesa sui modelli e proponi un piano di routing per queste attività: [elenco attività o funzionalità].

Vincoli: budget mensile [importo], obiettivo di latenza [obiettivo], livello di qualità [livello].
Leggi il catalogo modelli live prima di consigliare qualsiasi cosa.

Produci:
1. Una tabella attività -> modello consigliato.
2. Quali attività possono scendere di un livello e il rischio qualità.
3. Un piano di logging dell’uso per attività e funzionalità.
4. Cosa misurare prima di cambiare la produzione.

Regole:
- Leggi ID e prezzi attuali dal catalogo live; non citare mai una tariffa a memoria.
- Non modificare la configurazione di produzione né inviare traffico reale.
- Chiedi prima di consumare crediti per chiamate di test.
- Mantieni un piano di rollback e un tetto di spesa per funzionalità.
- Scrivi il piano in ./routing-plan.md e riassumilo in chat.

La copia include anche i passaggi di installazione e le regole di sicurezza.

Cosa ottieni

Output di esempio di un'esecuzione. Non è generazione dal vivo.

Esempio di piano di routing (estratto)
AttivitàAttualePropostoRischio
Classificare ticketmodello fortemodello velocebasso
Redigere rispostamodello fortemodello fortenessuno
Riassumere changelogmodello fortemodello velocemedio

Prima di cambiare qualcosa: registra l’uso per attività per una settimana e confronta la qualità su 50 output campionati.

Le chiamate esatte

Per gli sviluppatori: lo stesso workflow come codice, nell'ordine di esecuzione.

Mostra le chiamate API reali
  1. Tutte le attività su un endpoint

    Usa un unico endpoint OpenAI-compatibile e una chiave, senza un SDK per fornitore.

    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);

    Output di esempio

    {
      "choices": [{ "message": { "content": "• …" } }],
      "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 }
    }
  2. Instrada il modello per attività

    Scegli modello veloce o forte in base alla complessità e registra prima 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,
      };
    }

    Output di esempio

    {
      "model": "claude-haiku-5-5",
      "text": "• …",
      "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 }
    }
  3. Leggi e registra l’uso

    Leggi usage da ogni risposta e registra token e latenza per funzione.

    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());

    Output di esempio

    {"model":"claude-haiku-5-5","kind":"summarize","promptTokens":812,"completionTokens":96,"totalTokens":908}
    { "claude-haiku-5-5": 18234, "claude-sonnet-5-5": 4201 }
  4. Una chiave per tutti i fornitori

    Chiama i modelli del catalogo con la stessa chiave Felo e riduci la gestione fornitori.

    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. Prezzi dal catalogo live

    Non fissare tariffe; leggi i prezzi attuali da catalogo e pagina prezzi.

    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.

    Output di esempio

    ["claude-haiku-5-5", "claude-sonnet-5-5"]

Cosa include

  • Endpoint e chiave unificati
  • Scelta del modello veloce o forte per attività
  • Log dei token di ogni risposta
  • Prezzi letti dal catalogo live, non fissati nel codice

Cosa non fa

  • Non garantisce una fattura più bassa
  • Non cambia automaticamente il traffico di produzione
  • ID e prezzi cambiano; leggi sempre il catalogo live
  • Non valuta la qualità per te; servono i tuoi campioni
  • Non sostituisce fatturazione o osservabilità

Domande

La fattura scenderà?

Indica quali attività possono scendere di livello, ma il risparmio è reale solo dopo aver confrontato campioni e registrato l’uso.

Chiama i modelli automaticamente?

Solo se approvi chiamate di test. Per impostazione predefinita legge il catalogo e scrive raccomandazioni senza toccare la produzione.

Come so quale modello costa meno?

Leggi il catalogo modelli live e la pagina prezzi; il workflow non fissa tariffe perché cambiano.

Posso fissare un fornitore?

Sì, quando la latenza conta più del prezzo. Fissare è una scelta, non una strategia di retry; aggiungi il tuo fallback.

Cosa registrare?

Per chiamata: attività, funzione, modello, prompt token, completion token, totale e latenza. Aggrega per funzione prima di fissare budget.

Quanto costa una review?

Leggere il catalogo non genera chiamate. Le chiamate di test sono a consumo; il prompt chiede approvazione prima.

Workflow correlati

Adattala a te

La stessa ricetta, adattata a come lavori davvero.

Prima solo registrare

Prima della produzione registra una settimana di uso e poi decidi il downgrade.

Budget per funzione

Imposta un limite mensile per funzione e avvisa o degrada al superamento.

Fissa il fornitore per latenza

Quando la latenza conta più del prezzo, fissa il fornitore e aggiungi il tuo fallback.

Le pagine di riferimento dietro questa ricetta e i prossimi passi.