Kosten
Modellkosten bei wachsendem Volumen planbar halten
Schicke jede Aufgabe durch einen einzigen OpenAI-kompatiblen Endpoint, route sie zum günstigsten Modell, das die Aufgabe schafft, und protokolliere die Token-Nutzung jeder Antwort.
Prompt kopieren
Ersetze die Felder in eckigen Klammern und füge den Prompt in Claude Code, Codex oder eine KI mit Terminalzugriff ein. Sie installiert den Felo-Skill, fragt vor Credits und führt den Workflow aus.
Prüfe unsere Modellausgaben und schlage einen Routing-Plan für diese Aufgaben vor: [Aufgaben- oder Funktionsliste]. Vorgaben: Monatsbudget [Betrag], Latenzziel [Ziel], Qualitätslatte [Latte]. Lies den Live-Modellkatalog, bevor du etwas empfiehlst. Erstelle: 1. Eine Tabelle Aufgabe -> Modell. 2. Welche Aufgaben eine Stufe tiefer können und welches Qualitätsrisiko besteht. 3. Einen Plan zur Nutzungsprotokollierung pro Aufgabe und Funktion. 4. Was vor einer Produktionsänderung gemessen werden muss. Regeln: - Lies aktuelle Modell-IDs und Preise aus dem Live-Katalog; zitiere niemals einen Tarif aus dem Gedächtnis. - Ändere keine Produktionskonfiguration und sende keinen echten Traffic. - Frage vorher, bevor du Credits für Testaufrufe ausgibst. - Halte einen Rollback-Plan und ein Ausgabenlimit pro Funktion bereit. - Schreibe den Plan nach ./routing-plan.md und fasse ihn im Chat zusammen.
Die Kopie enthält auch die Installationsschritte und Sicherheitsregeln.
Das bekommst du
Beispielausgabe eines Laufs. Keine Live-Generierung.
| Aufgabe | Aktuell | Vorschlag | Risiko |
|---|---|---|---|
| Ticket klassifizieren | starkes Modell | schnelles Modell | niedrig |
| Antwort entwerfen | starkes Modell | starkes Modell | keins |
| Changelog zusammenfassen | starkes Modell | schnelles Modell | mittel |
Vor jeder Änderung: eine Woche Nutzung pro Aufgabe loggen und die Qualität an 50 Stichproben vergleichen.
Die konkreten Aufrufe
Für Entwickler: derselbe Workflow als kopierbarer Code in Ausführungsreihenfolge.
Konkrete API-Aufrufe zeigen
Alle Aufgaben über einen Endpoint
Nutze einen einheitlichen OpenAI-kompatiblen Endpoint und Key, statt pro Anbieter ein SDK zu pflegen.
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);Beispielausgabe
{ "choices": [{ "message": { "content": "• …" } }], "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 } }Modell je Aufgabe routen
Wähle nach Komplexität ein schnelles oder starkes Modell und halte zuerst die Baseline fest.
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, }; }Beispielausgabe
{ "model": "claude-haiku-5-5", "text": "• …", "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 } }Nutzung lesen und protokollieren
Lies usage aus jeder Antwort und protokolliere Token und Latenz je Feature.
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());Beispielausgabe
{"model":"claude-haiku-5-5","kind":"summarize","promptTokens":812,"completionTokens":96,"totalTokens":908} { "claude-haiku-5-5": 18234, "claude-sonnet-5-5": 4201 }Ein Key für alle Anbieter
Rufe Modelle aus dem Katalog mit demselben Felo-Key auf und reduziere die Anbieterverwaltung.
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); }Preise aus dem Live-Katalog
Fixiere keine Tarife; lies aktuelle Preise aus Modellkatalog und Preisseite.
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.Beispielausgabe
["claude-haiku-5-5", "claude-sonnet-5-5"]
Enthalten
- Einheitlicher Endpoint und Key
- Auswahl von schnellem oder starkem Modell je Aufgabe
- Token-Log jeder Antwort
- Preise aus dem Live-Katalog statt fest im Code
Was es nicht macht
- Garantiert keine niedrigere Rechnung
- Schaltet Produktionsverkehr nicht automatisch um
- Modell-IDs und Preise ändern sich; immer den Live-Katalog lesen
- Bewertet Qualität nicht für dich; eigene Stichproben nötig
- Ersetzt kein Billing- oder Observability-System
Fragen
Sinkt die Rechnung?
Es zeigt, welche Aufgaben eine günstigere Stufe vertragen; die Ersparnis ist erst real, wenn du Stichproben vergleichst und Nutzung protokollierst.
Ruft es Modelle automatisch auf?
Nur wenn du Testaufrufe freigibst. Standardmäßig liest es den Katalog und schreibt Empfehlungen, ohne Produktionsverkehr anzufassen.
Woher weiß ich, welches Modell günstiger ist?
Lies den Live-Modellkatalog und die Preisseite; der Workflow fixiert keine Tarife, weil sie sich ändern.
Kann ich einen Anbieter festlegen?
Ja, wenn Latenz wichtiger als Preis ist. Feste Auswahl ist eine Entscheidung, keine Retry-Strategie; Fallback ergänzt du selbst.
Was soll ich protokollieren?
Pro Aufruf: Aufgabe, Feature, Modell, Prompt-Token, Completion-Token, Gesamttoken und Latenz. Aggregiere nach Feature, bevor du Budgets setzt.
Was kostet ein Review?
Kataloglesen erzeugt keine Modellaufrufe. Testaufrufe werden nutzungsbasiert abgerechnet; der Prompt fragt vor Aufrufen nach Freigabe.
Verwandte Workflows
Support-Fragen aus deiner eigenen Dokumentation beantworten
Erstelle ein LiveDoc, lade Helpcenter und internes Runbook, rufe die Passagen ab, die den Ticket beantworten, und lass das Modell nur aus diesen Belegen antworten.
Workflow öffnenResearchEine Frage in ein belegtes Research-Briefing verwandeln
Frage das Web, speichere die Seiten hinter der Antwort als Markdown, ergänze, was Praktiker auf X sagen, und halte die Belege in einem LiveDoc fest, das du später erneut durchsuchen kannst.
Workflow öffnenOfficeEine Rechercheseite in eine Präsentation verwandeln
Extrahiere die Seite, speichere sie als LiveDoc-Kontext, lass die PPT Task API das Deck bauen und frage ab, bis der fertige Link vorliegt.
Workflow öffnenMach es zu deinem
Dasselbe Rezept, angepasst an deinen tatsächlichen Ablauf.
Erst nur protokollieren
Vor der Produktion eine Woche Nutzung aufzeichnen und dann über Downgrades entscheiden.
Budget je Feature
Setze ein Monatslimit pro Feature und warne oder degradiere bei Überschreitung.
Anbieter wegen Latenz fixieren
Wenn Latenz wichtiger als Preis ist, Anbieter fixieren und eigenen Fallback ergänzen.
Weiter
Die Referenzseiten hinter diesem Rezept und die nächsten Schritte.