Felo API PlatformFelo API Platform

هزینه

هزینه مدل را با رشد استفاده قابل پیش‌بینی نگه دارید

هر وظیفه را از یک endpoint سازگار با OpenAI بگذرانید، به ارزان‌ترین مدل توانا مسیریابی کنید و مصرف توکن هر پاسخ را ثبت کنید.

زمان۲۰ دقیقهسطحمتوسطبه‌روزرسانی2026-10-29
برای چه کسانیتیم‌های پلتفرممالکان محصول APIرهبران مهندسی

کپی پرامپت

فیلدهای داخل قلاب را جایگزین کنید و در Claude Code، Codex یا هوش مصنوعی با دسترسی ترمینال بچسبانید. مهارت Felo را نصب می‌کند، پیش از خرج اعتبار می‌پرسد و گردش‌کار را اجرا می‌کند.

هزینه مدل ما را بررسی کنید و برای این کارها یک برنامه مسیریابی پیشنهاد دهید: [فهرست کارها یا ویژگی‌ها].

محدودیت‌ها: بودجه ماهانه [مبلغ]، هدف تأخیر [هدف]، سطح کیفیت [سطح].
پیش از هر توصیه‌ای، کاتالوگ زنده مدل را بخوانید.

خروجی:
1. جدول کار -> مدل پیشنهادی.
2. کدام کارها می‌توانند یک پله پایین بیایند و ریسک کیفیت.
3. برنامه ثبت مصرف برای هر کار و ویژگی.
4. چه چیزی را پیش از تغییر تولید اندازه بگیریم.

قواعد:
- شناسه و قیمت فعلی مدل‌ها را از کاتالوگ زنده بخوانید؛ هرگز نرخ را از حافظه نقل نکنید.
- تنظیمات تولید را تغییر ندهید و ترافیک واقعی نفرستید.
- پیش از مصرف اعتبار برای فراخوانی آزمایشی بپرسید.
- برنامه بازگشت و سقف هزینه هر ویژگی را نگه دارید.
- برنامه را در ./routing-plan.md بنویسید و در چت خلاصه کنید.

نسخه شامل مراحل نصب و قواعد ایمنی نیز هست.

چه دریافت می‌کنید

خروجی نمونه یک اجرا. نه تولید زنده.

نمونه طرح مسیریابی (بخش)
کارفعلیپیشنهادریسک
طبقه‌بندی تیکتمدل قویمدل سریعکم
پیش‌نویس پاسخمدل قویمدل قویهیچ
خلاصه تغییراتمدل قویمدل سریعمتوسط

قبل از هر تغییری: یک هفته مصرف هر کار را ثبت کنید و کیفیت را روی ۵۰ خروجی نمونه مقایسه کنید.

فراخوانی‌های دقیق

برای توسعه‌دهندگان: همان گردش‌کار به‌صورت کد، به ترتیب اجرا.

نمایش فراخوانی‌های واقعی API
  1. همه وظایف از یک 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 }
    }
  2. مدل را بر اساس وظیفه مسیریابی کنید

    بر اساس پیچیدگی مدل سریع یا قوی انتخاب کنید و اول خط پایه را ثبت کنید.

    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 }
    }
  3. مصرف را بخوانید و ثبت کنید

    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 }
  4. یک کلید برای همه ارائه‌دهندگان

    مدل‌های کاتالوگ را با همان کلید 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);
    }
  5. قیمت از کاتالوگ زنده

    نرخ‌ها را ثابت نکنید؛ قیمت فعلی را از کاتالوگ و صفحه قیمت بخوانید.

    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، مجموع و تأخیر. پیش از بودجه بر اساس ویژگی تجمیع کنید.

هزینه یک بازبینی چقدر است؟

خواندن کاتالوگ فراخوانی مدل نمی‌سازد. فراخوانی تست بر اساس استفاده محاسبه می‌شود؛ پرامپت پیش از آن تأیید می‌خواهد.

گردش‌کارهای مرتبط

آن را از خود کنید

همان دستور، متناسب با روش واقعی تحویل شما.

اول فقط ثبت

پیش از تولید یک هفته مصرف را ثبت کنید سپس درباره کاهش تصمیم بگیرید.

بودجه برای هر ویژگی

برای هر ویژگی سقف ماهانه بگذارید و در عبور هشدار یا کاهش دهید.

ارائه‌دهنده را برای تأخیر پین کنید

وقتی تأخیر مهم‌تر از قیمت است ارائه‌دهنده را پین و fallback اضافه کنید.

صفحات مرجع پشت این دستور و گام‌های بعدی.