Custo
Mantenha o gasto com modelos previsível conforme o uso cresce
Envie toda tarefa por um único endpoint OpenAI-compatible, roteie para o modelo mais barato que dá conta e registre o uso de tokens informado em cada resposta.
Copiar o prompt
Substitua os campos entre colchetes e cole no Claude Code, Codex ou qualquer IA com acesso ao terminal. Ela instala a skill da Felo, pergunta antes de gastar créditos e executa o fluxo.
Revise nosso gasto com modelos e proponha um plano de roteamento para estas tarefas: [lista de tarefas ou recursos]. Restrições: orçamento mensal [valor], meta de latência [meta], nível de qualidade [nível]. Leia o catálogo de modelos ao vivo antes de recomendar qualquer coisa. Produza: 1. Uma tabela tarefa -> modelo recomendado. 2. Quais tarefas podem descer um nível e o risco de qualidade. 3. Um plano de registro de uso por tarefa e recurso. 4. O que medir antes de mudar a produção. Regras: - Leia IDs e preços atuais do catálogo ao vivo; nunca cite uma tarifa de memória. - Não altere a configuração de produção nem envie tráfego real. - Pergunte antes de gastar créditos em chamadas de teste. - Mantenha um plano de rollback e um teto de gasto por recurso. - Grave o plano em ./routing-plan.md e resuma no chat.
A cópia também inclui os passos de instalação e as regras de segurança.
O que você recebe
Saída de exemplo de uma execução. Não é geração ao vivo.
| Tarefa | Atual | Proposto | Risco |
|---|---|---|---|
| Classificar ticket | modelo forte | modelo rápido | baixo |
| Redigir resposta | modelo forte | modelo forte | nenhum |
| Resumir changelog | modelo forte | modelo rápido | médio |
Antes de mudar qualquer coisa: registre o uso por tarefa durante uma semana e compare a qualidade em 50 saídas amostradas.
As chamadas exatas
Para desenvolvedores: o mesmo fluxo em código, na ordem de execução.
Mostrar as chamadas reais da API
Todas as tarefas no mesmo endpoint
Use um único endpoint OpenAI-compatible e uma chave, sem um SDK por fornecedor.
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);Saída de exemplo
{ "choices": [{ "message": { "content": "• …" } }], "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 } }Roteie o modelo por tarefa
Escolha modelo rápido ou forte pela complexidade e registre primeiro a linha de base.
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, }; }Saída de exemplo
{ "model": "claude-haiku-5-5", "text": "• …", "usage": { "prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908 } }Leia e registre o uso
Leia o usage de cada resposta e registre tokens e latência por recurso.
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());Saída de exemplo
{"model":"claude-haiku-5-5","kind":"summarize","promptTokens":812,"completionTokens":96,"totalTokens":908} { "claude-haiku-5-5": 18234, "claude-sonnet-5-5": 4201 }Uma chave para todos os fornecedores
Chame os modelos do catálogo com a mesma chave Felo e reduza a gestão de fornecedores.
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); }Preços do catálogo ao vivo
Não fixe tarifas; leia os preços atuais no catálogo de modelos e na página de preços.
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.Saída de exemplo
["claude-haiku-5-5", "claude-sonnet-5-5"]
O que está incluído
- Endpoint e chave unificados
- Escolha de modelo rápido ou forte por tarefa
- Log de tokens de cada resposta
- Preços lidos do catálogo ao vivo, não fixados no código
O que não faz
- Não garante redução da fatura
- Não alterna tráfego de produção automaticamente
- IDs e preços mudam; leia sempre o catálogo ao vivo
- Não avalia qualidade por você; precisa das suas amostras
- Não substitui cobrança ou observabilidade
Perguntas
A fatura vai cair?
Ele indica quais tarefas podem descer de faixa, mas a economia só é real depois de comparar amostras e registrar o uso.
Ele chama modelos automaticamente?
Só se você aprovar chamadas de teste. Por padrão ele lê o catálogo e escreve recomendações sem tocar no tráfego de produção.
Como sei qual modelo é mais barato?
Leia o catálogo ao vivo e a página de preços; o fluxo não fixa tarifas porque elas mudam.
Posso fixar um fornecedor?
Sim, quando latência importa mais que preço. Fixar é uma escolha, não uma política de retry; adicione seu próprio fallback.
O que registrar?
Por chamada: tarefa, recurso, modelo, prompt token, completion token, total e latência. Agregue por recurso antes de definir orçamento.
Quanto custa uma revisão?
Ler o catálogo não gera chamada de modelo. Chamadas de teste são cobradas por uso; o prompt pede aprovação antes de chamar.
Fluxos relacionados
Responda perguntas de suporte com a sua própria documentação
Crie um LiveDoc, carregue a central de ajuda e o runbook interno, recupere os trechos que respondem ao ticket e deixe o modelo responder apenas com essas evidências.
Abrir o fluxo de trabalhoPesquisaTransforme uma pergunta em um briefing de pesquisa com fontes
Pergunte à web, salve as páginas por trás da resposta como Markdown, adicione o que os praticantes dizem no X e mantenha as evidências em um LiveDoc que você pode consultar depois.
Abrir o fluxo de trabalhoEscritórioTransforme uma página de pesquisa em apresentação
Extraia a página, salve como contexto do LiveDoc, deixe o PPT Task API montar o deck e consulte até a tarefa retornar o link pronto.
Abrir o fluxo de trabalhoFaça do seu jeito
A mesma receita, adaptada ao seu processo real.
Primeiro só registrar
Antes da produção, registre uma semana de uso e só depois decida o downgrade.
Orçamento por recurso
Defina um limite mensal por recurso e alerte ou degrade ao ultrapassar.
Fixar fornecedor por latência
Quando latência importa mais que preço, fixe o fornecedor e adicione seu fallback.
Continue
As páginas de referência por trás desta receita e para onde ir depois.