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í.
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í.
| Úkol | Nyní | Návrh | Riziko |
|---|---|---|---|
| Klasifikace ticketu | silný model | rychlý model | nízké |
| Koncept odpovědi | silný model | silný model | žádné |
| Shrnutí changelogu | silný model | rychlý model | stř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í
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 } }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 } }Č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 }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); }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
Odpovídejte na otázky podpory z vlastní dokumentace
Vytvořte LiveDoc, nahrajte help centrum a interní runbook, získejte pasáže odpovídající ticketu a nechte model odpovídat jen z těch důkazů.
Otevřít workflowVýzkumProměňte jednu otázku ve výzkumný brief se zdroji
Zeptejte se webu, uložte stránky za odpovědí jako Markdown, přidejte, co říkají praktici na X, a udržte důkazy v LiveDoc, který lze později prohledat.
Otevřít workflowKancelářProměňte výzkumnou stránku v prezentaci
Extrahujte stránku, uložte jako kontext LiveDoc, nechte PPT Task API postavit deck a ptejte se, dokud není hotový odkaz.
Otevřít workflowPř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.
Pokračujte
Referenční stránky za tímto receptem a další kroky.