Felo API PlatformFelo API Platform

लागत

उपयोग बढ़ने पर मॉडल लागत अनुमानित रखें

हर कार्य एक OpenAI-संगत endpoint से भेजें, उसे सबसे सस्ते सक्षम मॉडल पर रूट करें और हर प्रतिक्रिया का टोकन उपयोग लॉग करें।

समय20 मिनटस्तरमध्यमअपडेट2026-10-29
किसके लिएप्लेटफ़ॉर्म टीमेंAPI उत्पाद मालिकइंजीनियरिंग लीड

प्रॉम्प्ट कॉपी करें

वर्ग कोष्ठक के फ़ील्ड बदलें और Claude Code, Codex या टर्मिनल एक्सेस वाले AI में चिपकाएँ। यह Felo स्किल इंस्टॉल करता है, क्रेडिट से पहले पूछता है और वर्कफ़्लो चलाता है।

हमारे मॉडल खर्च की समीक्षा करें और इन कार्यों के लिए रूटिंग योजना सुझाएं: [कार्य या सुविधा सूची]।

सीमाएँ: मासिक बजट [राशि], लेटेंसी लक्ष्य [लक्ष्य], गुणवत्ता स्तर [स्तर]।
कुछ भी सुझाने से पहले लाइव मॉडल कैटलॉग पढ़ें।

तैयार करें:
1. कार्य -> अनुशंसित मॉडल तालिका।
2. कौन से कार्य एक स्तर नीचे जा सकते हैं और गुणवत्ता जोखिम।
3. प्रति कार्य और सुविधा उपयोग लॉग योजना।
4. प्रोडक्शन बदलने से पहले क्या मापें।

नियम:
- वर्तमान मॉडल ID और कीमतें लाइव कैटलॉग से पढ़ें; स्मृति से दर कभी न बताएं।
- प्रोडक्शन कॉन्फ़िगरेशन न बदलें और वास्तविक ट्रैफ़िक न भेजें।
- परीक्षण कॉल पर क्रेडिट खर्च करने से पहले पूछें।
- रोलबैक योजना और प्रति सुविधा खर्च सीमा रखें।
- योजना ./routing-plan.md में लिखें और चैट में सारांश दें।

कॉपी में इंस्टॉल चरण और सुरक्षा नियम भी हैं।

आपको क्या मिलता है

एक रन का उदाहरण आउटपुट। लाइव जनरेशन नहीं।

नमूना रूटिंग योजना (अंश)
कार्यवर्तमानप्रस्तावजोखिम
टिकट वर्गीकरणमज़बूत मॉडलतेज़ मॉडलकम
उत्तर ड्राफ़्टमज़बूत मॉडलमज़बूत मॉडलकोई नहीं
चेंजलॉग सारांशमज़बूत मॉडलतेज़ मॉडलमध्यम

कुछ भी बदलने से पहले: एक सप्ताह तक प्रति कार्य उपयोग लॉग करें और 50 नमूना आउटपुट पर गुणवत्ता तुलना करें।

सटीक कॉल

डेवलपर्स के लिए: वही वर्कफ़्लो कोड के रूप में, चलाने के क्रम में।

असली API कॉल दिखाएँ
  1. सभी कार्य एक endpoint से

    एक OpenAI-संगत endpoint और एक कुंजी इस्तेमाल करें, प्रति प्रदाता 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 और कुंजी
  • कार्य के अनुसार तेज़ या मज़बूत मॉडल चयन
  • हर प्रतिक्रिया का टोकन लॉग
  • लाइव कैटलॉग से दाम, कोड में तय नहीं

यह क्या नहीं करता

  • कम बिल की गारंटी नहीं
  • प्रोडक्शन ट्रैफ़िक स्वतः नहीं बदलता
  • ID और दाम बदलते हैं; हमेशा लाइव कैटलॉग पढ़ें
  • गुणवत्ता आपके लिए नहीं आँकता; आपके नमूने चाहिए
  • बिलिंग या observability की जगह नहीं

प्रश्न

बिल घटेगा?

यह बताता है कौन से कार्य सस्ते स्तर पर जा सकते हैं, पर बचत नमूने तुलना और उपयोग लॉग के बाद ही असली है।

क्या मॉडल स्वतः बुलाता है?

केवल परीक्षण कॉल मंज़ूर करने पर। डिफ़ॉल्ट कैटलॉग पढ़कर सिफ़ारिश लिखता है, प्रोडक्शन नहीं छूता।

कौन सा मॉडल सस्ता है कैसे पता?

लाइव मॉडल कैटलॉग और मूल्य पेज पढ़ें; वर्कफ़्लो दरें तय नहीं करता क्योंकि बदलती हैं।

क्या प्रदाता पिन कर सकते हैं?

हाँ, जब लेटेंसी दाम से ज़्यादा मायने रखे। पिन करना विकल्प है, retry रणनीति नहीं; अपना fallback जोड़ें।

क्या लॉग करें?

प्रति कॉल: कार्य, फ़ीचर, मॉडल, prompt token, completion token, कुल और लेटेंसी। बजट से पहले फ़ीचर के अनुसार जोड़ें।

एक समीक्षा की लागत कितनी है?

कैटलॉग पढ़ने से मॉडल कॉल नहीं बनता। परीक्षण कॉल उपयोग के अनुसार बिल होते हैं; प्रॉम्प्ट पहले मंज़ूरी माँगता है।

संबंधित वर्कफ़्लो

इसे अपना बनाएँ

वही रेसिपी, आपके असली तरीके के हिसाब से।

पहले केवल लॉग

प्रोडक्शन से पहले एक हफ़्ते का उपयोग लॉग करें, फिर डाउनग्रेड तय करें।

प्रति फ़ीचर बजट

प्रति फ़ीचर मासिक सीमा रखें और पार होने पर चेतावनी या डाउनग्रेड करें।

लेटेंसी के लिए प्रदाता पिन

लेटेंसी दाम से ज़्यादा मायने रखे तो प्रदाता पिन करें और fallback जोड़ें।

इस रेसिपी के पीछे के संदर्भ पेज और अगले कदम।