التكلفة
أبقِ تكاليف النماذج متوقعة مع نمو الاستخدام
مرر كل مهمة عبر endpoint واحد متوافق مع OpenAI ووجّهها إلى أرخص نموذج قادر وسجّل استخدام التوكنات الذي يعيده كل رد.
انسخ الموجّه
استبدل الحقول بين الأقواس المربعة وألصق في Claude Code أو Codex أو أي ذكاء اصطناعي يملك وصولًا إلى الطرفية. يثبّت مهارة Felo ويسأل قبل إنفاق الرصيد وينفّذ سير العمل.
راجع إنفاقنا على النماذج واقترح خطة توجيه لهذه المهام: [قائمة المهام أو الميزات]. القيود: الميزانية الشهرية [المبلغ]، هدف زمن الاستجابة [الهدف]، مستوى الجودة [المستوى]. اقرأ كتالوج النماذج المباشر قبل اقتراح أي شيء. أنتج: 1. جدول مهمة -> نموذج موصى به. 2. أي المهام يمكن أن تنزل درجة واحدة، ومخاطر الجودة. 3. خطة تسجيل الاستخدام لكل مهمة وميزة. 4. ما يجب قياسه قبل تغيير الإنتاج. القواعد: - اقرأ معرّفات النماذج والأسعار الحالية من الكتالوج المباشر؛ لا تقتبس سعرًا من الذاكرة. - لا تغيّر إعدادات الإنتاج ولا ترسل حركة مرور حقيقية. - اسأل قبل استهلاك الأرصدة في استدعاءات الاختبار. - احتفظ بخطة تراجع وسقف إنفاق لكل ميزة. - اكتب الخطة في ./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 ومفتاح موحدان
- اختيار نموذج سريع أو قوي حسب المهمة
- سجل توكنات كل رد
- الأسعار من الكتالوج الحقيقي لا مثبتة في الكود
ما لا يفعله
- لا يضمن فاتورة أقل
- لا يبدّل حركة الإنتاج تلقائيًا
- تتغير المعرّفات والأسعار؛ اقرأ الكتالوج الحقيقي دائمًا
- لا يقيّم الجودة عنك؛ تحتاج عيناتك
- لا يستبدل الفوترة أو المراقبة
أسئلة
هل تنخفض الفاتورة؟
يبيّن المهام التي يمكنها النزول درجة لكن التوفير حقيقي فقط بعد مقارنة العينات وتسجيل الاستخدام.
هل يستدعي النماذج تلقائيًا؟
فقط عند اعتماد استدعاءات اختبار. افتراضيًا يقرأ الكتالوج ويكتب توصيات دون لمس الإنتاج.
كيف أعرف النموذج الأرخص؟
اقرأ كتالوج النماذج الحقيقي وصفحة الأسعار؛ لا يثبّت سير العمل الأسعار لأنها تتغير.
هل يمكن تثبيت مزوّد؟
نعم حين يكون التأخير أهم من السعر. التثبيت اختيار لا استراتيجية إعادة محاولة؛ أضف fallback خاصًا بك.
ماذا أسجل؟
لكل استدعاء: المهمة والميزة والنموذج وprompt token وcompletion token والإجمالي والتأخير. جمّع حسب الميزة قبل الميزانيات.
كم تكلفة مراجعة واحدة؟
قراءة الكتالوج لا تنشئ استدعاءات نماذج. استدعاءات الاختبار تُحتسب حسب الاستخدام والموجّه يطلب الموافقة مسبقًا.
سير عمل مرتبط
أجب عن أسئلة الدعم من وثائقك
أنشئ LiveDoc وحمّل مركز المساعدة ودليل التشغيل الداخلي واسترجع المقاطع التي تجيب التذكرة ودع النموذج يجيب من تلك الأدلة فقط.
افتح سير العملالبحثحوّل سؤالًا واحدًا إلى موجز بحث بمصادر
اسأل الويب واحفظ الصفحات خلف الإجابة بصيغة Markdown وأضف ما يقوله الممارسون على X واحتفظ بالأدلة في LiveDoc يمكن البحث فيه لاحقًا.
افتح سير العملالمكتبحوّل صفحة بحث إلى عرض تقديمي
استخرج الصفحة واحفظها كسياق LiveDoc ودع PPT Task API يبني العرض واسأل حتى تجهز الرابط.
افتح سير العملاجعله مناسبًا لك
الوصفة نفسها، معدّلة بحسب طريقة تسليمك الفعلية.
التسجيل أولًا فقط
قبل الإنتاج سجّل أسبوع استخدام ثم قرر التخفيض.
ميزانية لكل ميزة
ضع حدًا شهريًا لكل ميزة ونبّه أو خفّض عند التجاوز.
ثبّت المزوّد للتأخير
حين يكون التأخير أهم من السعر ثبّت المزوّد وأضف fallback.
واصل
صفحات المراجع خلف هذه الوصفة والخطوات التالية.