Felo API PlatformFelo API Platform

Náklady

Udržte náklady na modely předvídatelné při rostoucím užití

Pošlete každý úkol jedním endpointem kompatibilním s OpenAI, routujte k nejlevnějšímu schopnému modelu a logujte užití tokenů vrácené každou odpovědí.

Čas20 minutÚroveňStředníAktualizováno2026-10-29
Pro kohoPlatformové týmyVlastníci API produktuInženýrští lídři

Zkopírovat prompt

Nahraďte pole v hranatých závorkách a vložte do Claude Code, Codex nebo AI s přístupem k terminálu. Nainstaluje skill Felo, zeptá se před utracením kreditů a spustí workflow.

Projdi naše výdaje na modely a navrhni plán routingu pro tyto úkoly: [seznam úkolů nebo funkcí].

Omezení: měsíční rozpočet [částka], cíl latence [cíl], laťka kvality [úroveň].
Přečti si živý katalog modelů, než cokoli doporučíš.

Vytvoř:
1. Tabulku úkol -> doporučený model.
2. Které úkoly mohou klesnout o úroveň a jaké je riziko kvality.
3. Plán logování využití podle úkolu a funkce.
4. Co měřit před změnou produkce.

Pravidla:
- Čti aktuální ID a ceny modelů z živého katalogu; nikdy necituj sazbu z paměti.
- Neměň konfiguraci produkce a neposílej skutečný provoz.
- Ptej se před utracením kreditů za testovací volání.
- Udržuj plán rollbacku a limit výdajů na funkci.
- Plán zapiš do ./routing-plan.md a shrň ho v chatu.

Kopie obsahuje i instalační kroky a bezpečnostní pravidla.

Co dostanete

Ukázkový výstup jednoho běhu. Ne živé generování.

Ukázkový plán routingu (výňatek)
ÚkolNyníNávrhRiziko
Klasifikace ticketusilný modelrychlý modelnízké
Koncept odpovědisilný modelsilný modelžádné
Shrnutí changelogusilný modelrychlý modelstřední

Před jakoukoli změnou: týden logujte využití na úkol a porovnejte kvalitu na 50 vzorcích výstupů.

Přesná volání

Pro vývojáře: stejný workflow jako kód, v pořadí provádění.

Zobrazit skutečná API volání
  1. Všechny úkoly jedním endpointem

    Použijte jeden endpoint kompatibilní s OpenAI a jeden klíč, bez SDK na poskytovatele.

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

    Ukázkový výstup

    {
      "choices": [{ "message": { "content": "• …" } }],
      "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 }
    }
  2. Routujte model podle úkolu

    Vyberte rychlý nebo silný model podle složitosti a nejdřív zapište baseline.

    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,
      };
    }

    Ukázkový výstup

    {
      "model": "claude-haiku-5-5",
      "text": "• …",
      "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 }
    }
  3. Čtěte a logujte užití

    Čtěte usage z každé odpovědi a logujte tokeny a latenci podle funkce.

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

    Ukázkový výstup

    {"model":"claude-haiku-5-5","kind":"summarize","promptTokens":812,"completionTokens":96,"totalTokens":908}
    { "claude-haiku-5-5": 18234, "claude-sonnet-5-5": 4201 }
  4. Jeden klíč pro všechny poskytovatele

    Volejte modely z katalogu stejným klíčem Felo a snižte správu poskytovatelů.

    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. Ceny ze živého katalogu

    Nefixujte sazby; čtěte aktuální ceny z katalogu a stránky cen.

    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.

    Ukázkový výstup

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

Co obsahuje

  • Jeden endpoint a klíč
  • Volba rychlého nebo silného modelu podle úkolu
  • Log tokenů každé odpovědi
  • Ceny ze živého katalogu, ne zadrátované v kódu

Co nedělá

  • Negarantuje nižší účet
  • Nepřepíná produkční provoz automaticky
  • ID a ceny se mění; vždy čtěte živý katalog
  • Nehodnotí kvalitu za vás; potřebujete své vzorky
  • Nenahrazuje billing ani observability

Otázky

Klesne účet?

Ukazuje úkoly, které mohou jít o úroveň níž, ale úspora je reálná až po porovnání vzorků a logování užití.

Volá modely automaticky?

Jen když schválíte testovací volání. Výchozí čte katalog a píše doporučení bez dotyku produkce.

Jak poznám, který model je levnější?

Čtěte živý katalog modelů a stránku cen; workflow sazby nefixuje, protože se mění.

Lze připnout poskytovatele?

Ano, když je latence důležitější než cena. Připnutí je volba, ne strategie retry; přidejte vlastní fallback.

Co logovat?

Na volání: úkol, funkci, model, prompt token, completion token, součet a latenci. Před rozpočtem agregujte podle funkce.

Kolik stojí revize?

Čtení katalogu nevytváří volání modelů. Testovací volání se účtují podle užití; prompt žádá schválení předem.

Související workflowy

Přizpůsobte

Stejný recept, upravený podle toho, jak skutečně dodáváte.

Nejdřív jen logujte

Před produkcí zalogujte týden užití a pak rozhodněte o downgrade.

Rozpočet na funkci

Nastavte měsíční limit na funkci a při překročení varujte nebo degradujte.

Připněte poskytovatele kvůli latenci

Když je latence důležitější než cena, připněte poskytovatele a přidejte fallback.

Referenční stránky za tímto receptem a další kroky.