Kos
Kekalkan kos model boleh diramal apabila penggunaan meningkat
Hantar setiap tugas melalui satu endpoint serasi OpenAI, halakan ke model termurah yang mampu dan log penggunaan token yang dipulangkan setiap respons.
Salin prompt
Ganti medan dalam kurungan siku lalu tampal ke Claude Code, Codex atau AI dengan akses terminal. Ia memasang skill Felo, bertanya sebelum kredit digunakan dan menjalankan aliran kerja.
Semak perbelanjaan model kami dan cadangkan pelan penghalaan untuk tugasan ini: [senarai tugasan atau ciri]. Kekangan: bajet bulanan [jumlah], sasaran kependaman [sasaran], tahap kualiti [tahap]. Baca katalog model langsung sebelum mengesyorkan apa-apa. Hasilkan: 1. Jadual tugasan -> model disyorkan. 2. Tugasan yang boleh turun satu tahap dan risiko kualiti. 3. Pelan log penggunaan setiap tugasan dan ciri. 4. Apa yang perlu diukur sebelum mengubah produksi. Peraturan: - Baca ID dan harga model semasa daripada katalog langsung; jangan petik kadar daripada ingatan. - Jangan ubah konfigurasi produksi atau hantar trafik sebenar. - Tanya sebelum menggunakan kredit untuk panggilan ujian. - Kekalkan pelan rollback dan had perbelanjaan setiap ciri. - Tulis pelan ke ./routing-plan.md dan ringkaskan dalam chat.
Salinan turut menyertakan langkah pemasangan dan peraturan keselamatan.
Apa yang anda dapat
Contoh output daripada satu larian. Bukan penjanaan langsung.
| Tugasan | Sekarang | Cadangan | Risiko |
|---|---|---|---|
| Klasifikasi tiket | model kuat | model pantas | rendah |
| Draf balasan | model kuat | model kuat | tiada |
| Ringkaskan changelog | model kuat | model pantas | sederhana |
Sebelum mengubah apa-apa: log penggunaan setiap tugasan selama seminggu dan bandingkan kualiti pada 50 output sampel.
Panggilan sebenar
Untuk pembangun: aliran kerja sama sebagai kod, mengikut urutan pelaksanaan.
Tunjukkan panggilan API sebenar
Semua tugas melalui satu endpoint
Guna satu endpoint serasi OpenAI dan satu kunci, tanpa SDK setiap penyedia.
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);Contoh output
{ "choices": [{ "message": { "content": "• …" } }], "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 } }Halakan model setiap tugas
Pilih model pantas atau kuat mengikut kerumitan dan catat garis asas dahulu.
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, }; }Contoh output
{ "model": "claude-haiku-5-5", "text": "• …", "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 } }Baca dan catat penggunaan
Baca usage setiap respons dan catat token serta kependaman mengikut ciri.
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());Contoh output
{"model":"claude-haiku-5-5","kind":"summarize","promptTokens":812,"completionTokens":96,"totalTokens":908} { "claude-haiku-5-5": 18234, "claude-sonnet-5-5": 4201 }Satu kunci untuk semua penyedia
Panggil model katalog dengan kunci Felo sama dan kurangkan pengurusan penyedia.
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); }Harga dari katalog langsung
Jangan paku kadar; baca harga semasa dari katalog dan halaman harga.
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.Contoh output
["claude-haiku-5-5", "claude-sonnet-5-5"]
Termasuk
- Endpoint dan kunci disatukan
- Pilihan model pantas atau kuat setiap tugas
- Log token setiap respons
- Harga dari katalog langsung, bukan dipaku dalam kod
Apa yang tidak dilakukan
- Tidak menjamin bil lebih rendah
- Tidak menukar trafik produksi automatik
- ID dan harga berubah; sentiasa baca katalog langsung
- Tidak menilai kualiti untuk anda; perlu sampel anda
- Tidak menggantikan bil atau observability
Soalan
Adakah bil akan turun?
Ia menunjukkan tugas mana boleh turun tahap, tetapi penjimatan sebenar hanya selepas membandingkan sampel dan mencatat penggunaan.
Adakah ia memanggil model automatik?
Hanya jika anda meluluskan panggilan ujian. Lalai membaca katalog dan menulis cadangan tanpa menyentuh produksi.
Bagaimana tahu model mana lebih murah?
Baca katalog model langsung dan halaman harga; aliran tidak memaku kadar kerana berubah.
Boleh paku penyedia?
Boleh apabila kependaman lebih penting daripada harga. Memaku ialah pilihan, bukan strategi retry; tambah fallback anda.
Apa perlu dicatat?
Setiap panggilan: tugas, ciri, model, prompt token, completion token, jumlah dan kependaman. Agregat mengikut ciri sebelum menetapkan bajet.
Berapa kos satu semakan?
Membaca katalog tidak menghasilkan panggilan model. Panggilan ujian dibilkan mengikut penggunaan; prompt meminta kelulusan dahulu.
Aliran kerja berkaitan
Jawab soalan sokongan dari dokumentasi anda sendiri
Cipta LiveDoc, muat pusat bantuan dan runbook dalaman, ambil bahagian yang menjawab tiket dan biar model menjawab hanya dari bukti itu.
Buka aliran kerjaPenyelidikanTukar satu soalan kepada brief penyelidikan bersumber
Tanya web, simpan halaman di sebalik jawapan sebagai Markdown, tambah apa yang pengamal katakan di X dan simpan bukti dalam LiveDoc yang boleh dicari semula.
Buka aliran kerjaPejabatTukar halaman penyelidikan kepada pembentangan
Ekstrak halaman, simpan sebagai konteks LiveDoc, biar PPT Task API membina deck dan tanya sehingga pautan siap.
Buka aliran kerjaSesuaikan
Resipi sama, disesuaikan dengan cara anda benar-benar menyampaikan.
Catat dahulu sahaja
Sebelum produksi, catat penggunaan seminggu kemudian putuskan turun tahap.
Bajet setiap ciri
Tetapkan had bulanan setiap ciri dan beri amaran atau turunkan apabila melebihi.
Paku penyedia kerana kependaman
Apabila kependaman lebih penting daripada harga, paku penyedia dan tambah fallback.
Teruskan
Halaman rujukan di sebalik resipi ini dan langkah seterusnya.