Felo API PlatformFelo API Platform

Chi phí

Giữ chi phí model dự đoán được khi lượng dùng tăng

Đưa mọi tác vụ qua một endpoint tương thích OpenAI, định tuyến tới model rẻ nhất làm được và ghi lại lượng token mỗi phản hồi trả về.

Thời gian20 phútMứcTrung cấpCập nhật2026-10-29
Dành cho aiNhóm nền tảngChủ sản phẩm APILãnh đạo kỹ thuật

Sao chép prompt

Thay các trường trong ngoặc vuông rồi dán vào Claude Code, Codex hoặc AI có quyền truy cập terminal. Nó cài skill Felo, hỏi trước khi dùng credit và chạy quy trình.

Xem xét chi tiêu mô hình của chúng ta và đề xuất kế hoạch định tuyến cho các tác vụ này: [danh sách tác vụ hoặc tính năng].

Ràng buộc: ngân sách tháng [số tiền], mục tiêu độ trễ [mục tiêu], mức chất lượng [mức].
Đọc danh mục mô hình trực tiếp trước khi đề xuất bất cứ điều gì.

Tạo:
1. Bảng tác vụ -> mô hình đề xuất.
2. Tác vụ nào có thể hạ một bậc và rủi ro chất lượng.
3. Kế hoạch ghi log sử dụng theo tác vụ và tính năng.
4. Những gì cần đo trước khi thay đổi production.

Quy tắc:
- Đọc ID và giá mô hình hiện tại từ danh mục trực tiếp; không bao giờ trích giá từ trí nhớ.
- Không thay đổi cấu hình production và không gửi lưu lượng thật.
- Hỏi trước khi tiêu tín dụng cho các lệnh gọi thử.
- Giữ kế hoạch rollback và giới hạn chi tiêu theo tính năng.
- Ghi kế hoạch vào ./routing-plan.md và tóm tắt trong chat.

Bản sao cũng gồm các bước cài đặt và quy tắc an toàn.

Bạn nhận được gì

Kết quả mẫu của một lần chạy. Không phải tạo trực tiếp.

Ví dụ kế hoạch định tuyến (trích)
Tác vụHiện tạiĐề xuấtRủi ro
Phân loại ticketmô hình mạnhmô hình nhanhthấp
Soạn trả lờimô hình mạnhmô hình mạnhkhông
Tóm tắt changelogmô hình mạnhmô hình nhanhtrung bình

Trước khi thay đổi: ghi log sử dụng theo tác vụ trong một tuần và so sánh chất lượng trên 50 đầu ra mẫu.

Các lệnh gọi chính xác

Dành cho lập trình viên: cùng quy trình dưới dạng mã, theo thứ tự chạy.

Hiện lệnh gọi API thật
  1. Mọi tác vụ qua một endpoint

    Dùng một endpoint tương thích OpenAI và một key, không SDK riêng cho từng nhà cung cấp.

    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);

    Kết quả mẫu

    {
      "choices": [{ "message": { "content": "• …" } }],
      "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 }
    }
  2. Định tuyến model theo tác vụ

    Chọn model nhanh hay mạnh theo độ phức tạp và ghi baseline trước.

    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,
      };
    }

    Kết quả mẫu

    {
      "model": "claude-haiku-5-5",
      "text": "• …",
      "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 }
    }
  3. Đọc và ghi log sử dụng

    Đọc usage mỗi phản hồi và ghi token, độ trễ theo tính năng.

    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());

    Kết quả mẫu

    {"model":"claude-haiku-5-5","kind":"summarize","promptTokens":812,"completionTokens":96,"totalTokens":908}
    { "claude-haiku-5-5": 18234, "claude-sonnet-5-5": 4201 }
  4. Một key cho mọi nhà cung cấp

    Gọi model trong catalog bằng cùng key Felo và giảm quản lý nhà cung cấp.

    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. Giá từ catalog trực tiếp

    Không cố định giá; đọc giá hiện tại từ catalog và trang giá.

    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.

    Kết quả mẫu

    ["claude-haiku-5-5", "claude-sonnet-5-5"]

Bao gồm

  • Endpoint và key thống nhất
  • Chọn model nhanh hoặc mạnh theo tác vụ
  • Log token mỗi phản hồi
  • Giá đọc từ catalog trực tiếp, không cố định trong mã

Không làm gì

  • Không bảo đảm hóa đơn thấp hơn
  • Không tự chuyển traffic production
  • ID và giá thay đổi; luôn đọc catalog trực tiếp
  • Không đánh giá chất lượng thay bạn; cần mẫu của bạn
  • Không thay thế billing hay observability

Câu hỏi

Hóa đơn có giảm không?

Nó chỉ ra tác vụ nào có thể xuống hạng, nhưng tiết kiệm chỉ thực sau khi so mẫu và ghi log sử dụng.

Có tự gọi model không?

Chỉ khi bạn duyệt lệnh gọi thử. Mặc định nó đọc catalog và viết đề xuất mà không chạm traffic production.

Biết model nào rẻ hơn thế nào?

Đọc catalog model trực tiếp và trang giá; quy trình không cố định giá vì chúng thay đổi.

Có ghim nhà cung cấp không?

Có, khi độ trễ quan trọng hơn giá. Ghim là lựa chọn, không phải chiến lược retry; thêm fallback của bạn.

Nên ghi gì?

Mỗi lệnh: tác vụ, tính năng, model, prompt token, completion token, tổng và độ trễ. Tổng hợp theo tính năng trước khi đặt ngân sách.

Một lần review tốn bao nhiêu?

Đọc catalog không tạo lệnh gọi model. Lệnh gọi thử tính theo mức dùng; prompt hỏi duyệt trước.

Quy trình liên quan

Tùy biến

Cùng công thức, điều chỉnh theo cách bạn thực sự triển khai.

Chỉ ghi log trước

Trước production, ghi một tuần sử dụng rồi quyết định hạ hạng.

Ngân sách theo tính năng

Đặt giới hạn tháng mỗi tính năng và cảnh báo hoặc hạ cấp khi vượt.

Ghim nhà cung cấp vì độ trễ

Khi độ trễ quan trọng hơn giá, ghim nhà cung cấp và thêm fallback.

Các trang tham chiếu đằng sau công thức và nơi đi tiếp.