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.
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.
| Attività | Attuale | Proposto | Rischio |
|---|---|---|---|
| Classificare ticket | modello forte | modello veloce | basso |
| Redigere risposta | modello forte | modello forte | nessuno |
| Riassumere changelog | modello forte | modello veloce | medio |
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
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 } }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 } }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 }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); }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
Rispondi alle domande di supporto dalla tua documentazione
Crea un LiveDoc, carica help center e runbook interno, recupera i passaggi che rispondono al ticket e lascia che il modello risponda solo da quelle prove.
Apri il workflowRicercaTrasforma una domanda in un brief di ricerca con fonti
Interroga il web, salva come Markdown le pagine dietro la risposta, aggiungi ciò che dicono i professionisti su X e conserva le prove in un LiveDoc che potrai interrogare di nuovo.
Apri il workflowUfficioTrasforma una pagina di ricerca in una presentazione
Estrai la pagina, salvala come contesto LiveDoc, lascia che la PPT Task API costruisca il deck e interroga finché il link è pronto.
Apri il workflowAdattala 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.
Continua
Le pagine di riferimento dietro questa ricetta e i prossimi passi.