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ề.
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.
| Tác vụ | Hiện tại | Đề xuất | Rủi ro |
|---|---|---|---|
| Phân loại ticket | mô hình mạnh | mô hình nhanh | thấp |
| Soạn trả lời | mô hình mạnh | mô hình mạnh | không |
| Tóm tắt changelog | mô hình mạnh | mô hình nhanh | trung 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
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 } }Đị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 } }Đọ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 }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); }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
Trả lời câu hỏi hỗ trợ từ tài liệu của chính bạn
Tạo LiveDoc, tải trung tâm trợ giúp và runbook nội bộ, lấy các đoạn trả lời ticket và để model chỉ trả lời từ bằng chứng đó.
Mở quy trìnhNghiên cứuBiến một câu hỏi thành báo cáo nghiên cứu có nguồn
Hỏi web, lưu các trang đằng sau câu trả lời thành Markdown, thêm điều người thực hành nói trên X và giữ bằng chứng trong LiveDoc có thể tìm lại sau.
Mở quy trìnhVăn phòngBiến trang nghiên cứu thành bài thuyết trình
Trích xuất trang, lưu làm bối cảnh LiveDoc, để PPT Task API dựng deck và hỏi cho đến khi có liên kết hoàn chỉnh.
Mở quy trìnhTù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.
Đi tiếp
Các trang tham chiếu đằng sau công thức và nơi đi tiếp.