Felo API PlatformFelo API Platform

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.

Dauer20 MinutenLevelFortgeschrittenAktualisiert2026-10-29
Für wenPlattform-TeamsAPI-ProduktverantwortlicheEngineering-Leads

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.

Beispiel-Routingplan (Auszug)
AufgabeAktuellVorschlagRisiko
Ticket klassifizierenstarkes Modellschnelles Modellniedrig
Antwort entwerfenstarkes Modellstarkes Modellkeins
Changelog zusammenfassenstarkes Modellschnelles Modellmittel

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

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

Die Referenzseiten hinter diesem Rezept und die nächsten Schritte.