Felo API PlatformFelo API Platform

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.

Tempo20 minutosNívelIntermediárioAtualizado2026-10-29
Para quemTimes de plataformaDonos de produto de APILíderes de engenharia

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.

Exemplo de plano de roteamento (trecho)
TarefaAtualPropostoRisco
Classificar ticketmodelo fortemodelo rápidobaixo
Redigir respostamodelo fortemodelo fortenenhum
Resumir changelogmodelo fortemodelo rápidomé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
  1. 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 }
    }
  2. 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 }
    }
  3. 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 }
  4. 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);
    }
  5. 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

Faç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.

As páginas de referência por trás desta receita e para onde ir depois.