עלות
שמרו על עלויות מודלים צפויות כשהשימוש גדל
העבירו כל משימה דרך endpoint אחד תואם OpenAI, נתבו למודל הזול ביותר שמסוגל וכתבו ביומן את שימוש הטוקנים שכל תשובה מחזירה.
העתיקו את הפרומפט
החליפו את השדות בסוגריים מרובעים והדביקו ב-Claude Code, Codex או AI עם גישה לטרמינל. הוא מתקין את סקיל Felo, שואל לפני שריפת קרדיטים ומריץ את תהליך העבודה.
סקור את הוצאת המודלים שלנו והצע תוכנית ניתוב למשימות האלה: [רשימת משימות או תכונות]. אילוצים: תקציב חודשי [סכום], יעד השהיה [יעד], רף איכות [רף]. קרא את קטלוג המודלים החי לפני שאתה ממליץ על משהו. הפק: 1. טבלת משימה -> מודל מומלץ. 2. אילו משימות יכולות לרדת דרגה אחת וסיכון האיכות. 3. תוכנית תיעוד שימוש לכל משימה ותכונה. 4. מה למדוד לפני שינוי הייצור. כללים: - קרא מזהי מודלים ומחירים נוכחיים מהקטלוג החי; לעולם אל תצטט תעריף מהזיכרון. - אל תשנה תצורת ייצור ואל תשלח תעבורה אמיתית. - שאל לפני שימוש בקרדיטים בקריאות בדיקה. - שמור תוכנית rollback ותקרת הוצאה לכל תכונה. - כתוב את התוכנית ל-./routing-plan.md וסכם אותה בצ׳אט.
ההעתקה כוללת גם שלבי התקנה וכללי בטיחות.
מה מקבלים
פלט לדוגמה של ריצה אחת. לא יצירה חיה.
| משימה | כיום | מוצע | סיכון |
|---|---|---|---|
| סיווג פנייה | מודל חזק | מודל מהיר | נמוך |
| ניסוח תשובה | מודל חזק | מודל חזק | ללא |
| סיכום צ׳יינג׳לוג | מודל חזק | מודל מהיר | בינוני |
לפני שינוי כלשהו: לתעד שבוע שימוש לפי משימה ולהשוות איכות על 50 פלטים במדגם.
הקריאות המדויקות
למפתחים: אותו תהליך עבודה כקוד, לפי סדר ההרצה.
הצג קריאות 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.
המשיכו
עמודי העזר שמאחורי המתכון והשלבים הבאים.