هزینه
هزینه مدل را با رشد استفاده قابل پیشبینی نگه دارید
هر وظیفه را از یک endpoint سازگار با OpenAI بگذرانید، به ارزانترین مدل توانا مسیریابی کنید و مصرف توکن هر پاسخ را ثبت کنید.
کپی پرامپت
فیلدهای داخل قلاب را جایگزین کنید و در Claude Code، Codex یا هوش مصنوعی با دسترسی ترمینال بچسبانید. مهارت Felo را نصب میکند، پیش از خرج اعتبار میپرسد و گردشکار را اجرا میکند.
هزینه مدل ما را بررسی کنید و برای این کارها یک برنامه مسیریابی پیشنهاد دهید: [فهرست کارها یا ویژگیها]. محدودیتها: بودجه ماهانه [مبلغ]، هدف تأخیر [هدف]، سطح کیفیت [سطح]. پیش از هر توصیهای، کاتالوگ زنده مدل را بخوانید. خروجی: 1. جدول کار -> مدل پیشنهادی. 2. کدام کارها میتوانند یک پله پایین بیایند و ریسک کیفیت. 3. برنامه ثبت مصرف برای هر کار و ویژگی. 4. چه چیزی را پیش از تغییر تولید اندازه بگیریم. قواعد: - شناسه و قیمت فعلی مدلها را از کاتالوگ زنده بخوانید؛ هرگز نرخ را از حافظه نقل نکنید. - تنظیمات تولید را تغییر ندهید و ترافیک واقعی نفرستید. - پیش از مصرف اعتبار برای فراخوانی آزمایشی بپرسید. - برنامه بازگشت و سقف هزینه هر ویژگی را نگه دارید. - برنامه را در ./routing-plan.md بنویسید و در چت خلاصه کنید.
نسخه شامل مراحل نصب و قواعد ایمنی نیز هست.
چه دریافت میکنید
خروجی نمونه یک اجرا. نه تولید زنده.
| کار | فعلی | پیشنهاد | ریسک |
|---|---|---|---|
| طبقهبندی تیکت | مدل قوی | مدل سریع | کم |
| پیشنویس پاسخ | مدل قوی | مدل قوی | هیچ |
| خلاصه تغییرات | مدل قوی | مدل سریع | متوسط |
قبل از هر تغییری: یک هفته مصرف هر کار را ثبت کنید و کیفیت را روی ۵۰ خروجی نمونه مقایسه کنید.
فراخوانیهای دقیق
برای توسعهدهندگان: همان گردشکار بهصورت کد، به ترتیب اجرا.
نمایش فراخوانیهای واقعی API
همه وظایف از یک endpoint
یک endpoint سازگار با OpenAI و یک کلید به کار ببرید، بدون SDK برای هر ارائهدهنده.
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);خروجی نمونه
{ "choices": [{ "message": { "content": "• …" } }], "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 } }مدل را بر اساس وظیفه مسیریابی کنید
بر اساس پیچیدگی مدل سریع یا قوی انتخاب کنید و اول خط پایه را ثبت کنید.
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, }; }خروجی نمونه
{ "model": "claude-haiku-5-5", "text": "• …", "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 } }مصرف را بخوانید و ثبت کنید
usage هر پاسخ را بخوانید و توکن و تأخیر را بر اساس ویژگی ثبت کنید.
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());خروجی نمونه
{"model":"claude-haiku-5-5","kind":"summarize","promptTokens":812,"completionTokens":96,"totalTokens":908} { "claude-haiku-5-5": 18234, "claude-sonnet-5-5": 4201 }یک کلید برای همه ارائهدهندگان
مدلهای کاتالوگ را با همان کلید Felo صدا بزنید و مدیریت ارائهدهنده را کم کنید.
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); }قیمت از کاتالوگ زنده
نرخها را ثابت نکنید؛ قیمت فعلی را از کاتالوگ و صفحه قیمت بخوانید.
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.خروجی نمونه
["claude-haiku-5-5", "claude-sonnet-5-5"]
چه چیزی دارد
- یک endpoint و کلید
- انتخاب مدل سریع یا قوی بر اساس وظیفه
- ثبت توکن هر پاسخ
- قیمت از کاتالوگ زنده نه ثابت در کد
چه کاری نمیکند
- صورتحساب کمتر را تضمین نمیکند
- ترافیک تولید را خودکار عوض نمیکند
- شناسهها و قیمتها تغییر میکنند; همیشه کاتالوگ زنده را بخوانید
- کیفیت را برای شما ارزیابی نمیکند؛ نمونههای شما لازم است
- جایگزین صورتحساب یا observability نیست
پرسشها
آیا صورتحساب کمتر میشود؟
نشان میدهد کدام وظایف میتوانند یک پله پایین بیایند اما صرفهجویی فقط پس از مقایسه نمونه و ثبت مصرف واقعی است.
آیا خودکار مدل صدا میزند؟
فقط وقتی فراخوانی تست را تأیید کنید. پیشفرض کاتالوگ را میخواند و توصیه مینویسد بدون دست زدن به تولید.
از کجا بدانم کدام مدل ارزانتر است؟
کاتالوگ زنده مدل و صفحه قیمت را بخوانید؛ گردشکار نرخها را ثابت نمیکند چون تغییر میکنند.
میتوان ارائهدهنده را پین کرد؟
بله وقتی تأخیر مهمتر از قیمت است. پین کردن انتخاب است نه استراتژی retry؛ fallback خود را اضافه کنید.
چه چیزی ثبت شود؟
برای هر فراخوانی: وظیفه، ویژگی، مدل، prompt token، completion token، مجموع و تأخیر. پیش از بودجه بر اساس ویژگی تجمیع کنید.
هزینه یک بازبینی چقدر است؟
خواندن کاتالوگ فراخوانی مدل نمیسازد. فراخوانی تست بر اساس استفاده محاسبه میشود؛ پرامپت پیش از آن تأیید میخواهد.
گردشکارهای مرتبط
از مستندات خود به پرسشهای پشتیبانی پاسخ دهید
یک LiveDoc بسازید، مرکز راهنما و runbook داخلی را بارگذاری کنید، بخشهایی که به تیکت پاسخ میدهند را بازیابی کنید و بگذارید مدل فقط از همان شواهد پاسخ دهد.
باز کردن گردشکارپژوهشیک پرسش را به خلاصه پژوهشی با منابع تبدیل کنید
از وب بپرسید، صفحات پشت پاسخ را بهصورت Markdown ذخیره کنید، آنچه متخصصان در X میگویند اضافه کنید و شواهد را در LiveDoc نگه دارید تا بعداً دوباره جستوجو شود.
باز کردن گردشکارادارییک صفحه پژوهش را به ارائه تبدیل کنید
صفحه را استخراج کنید، بهعنوان زمینه LiveDoc ذخیره کنید، بگذارید PPT Task API ارائه را بسازد و بپرسید تا پیوند آماده شود.
باز کردن گردشکارآن را از خود کنید
همان دستور، متناسب با روش واقعی تحویل شما.
اول فقط ثبت
پیش از تولید یک هفته مصرف را ثبت کنید سپس درباره کاهش تصمیم بگیرید.
بودجه برای هر ویژگی
برای هر ویژگی سقف ماهانه بگذارید و در عبور هشدار یا کاهش دهید.
ارائهدهنده را برای تأخیر پین کنید
وقتی تأخیر مهمتر از قیمت است ارائهدهنده را پین و fallback اضافه کنید.
ادامه دهید
صفحات مرجع پشت این دستور و گامهای بعدی.