O CourseShelf tem seis features de IA em produção. Tags, dificuldade dos cursos, recomendação de cursos parecidos, resumo dos comentários de um curso, resumo de um canal e um robô que importa cursos novos toda semana.
No painel da OpenRouter, a chave de produção somava US$ 0,225 na consulta de 22 de outubro de 2026. Esse é o total daquela chave, separado do meu uso pessoal e de desenvolvimento.

O motivo principal é como eu desenhei as features: o custo cresce com os registros do catálogo. Não com cada pessoa abrindo uma página. Por isso a feature que todo mundo pensa primeiro, o chat, ainda não entrou.
Gravei um vídeo mostrando a arquitetura e as contas. Aqui vai a versão escrita, com os preços tratados como o cenário de outubro de 2026, não como garantia de preço futuro.
A IA já terminou quando você abre a página
Quando um curso entra no CourseShelf, cinco jobs vão pra fila: tags, dificuldade, embedding, resumo dos comentários e resumo do canal. Os resultados ficam em colunas do banco.
Depois, mil pessoas podem abrir a página sem disparar outra inferência pra mostrar esses resultados. O custo incremental de IA daquela leitura é zero. Hospedagem e banco continuam existindo, claro; estou falando da chamada ao modelo.
Essa regra está nas instruções do projeto: inferência em job do Oban, nunca durante a abertura da página. É uma decisão de arquitetura, não uma otimização pra fazer depois que a fatura assustar.
O sexto uso é o robô semanal. Ele procura candidatos, classifica os vídeos e importa até cinco cursos por rodada. Também tem um teto de trabalho, em vez de executar a cada visita.
Quanto custa um cadastro
Na conta usada no vídeo, o provider Together do DeepSeek V4.1 Flash na OpenRouter cobrava US$ 0,30 por milhão de tokens de entrada e US$ 1,20 de saída. Outros providers do mesmo modelo podiam cobrar menos. O catálogo do modelo permite conferir essa diferença.
Usando os limites do código e estimativas do tamanho dos prompts, o enriquecimento de um curso ficava assim:
| Trabalho | Entrada estimada | Limite de saída |
|---|---|---|
| Tags | 2.000 tokens | 512 tokens |
| Dificuldade | 600 tokens | 64 tokens |
| Resumo dos comentários | 3.000 tokens | 600 tokens |
| Resumo do canal | 3.000 tokens | 600 tokens |
| Embedding | 2.000 tokens | Vetor, com cobrança própria |
São aproximadamente 8.600 tokens de entrada e até 1.776 de saída nas chamadas de texto. Com aquelas tarifas, cerca de US$ 0,0047, mais o embedding: arredondando, meio centavo de dólar por curso.
Isso é uma estimativa com os limites e tarifas escolhidos, não um teto matemático pra qualquer descrição possível. O gasto real depende do tokenizer, do provider e do que cada job precisa processar.
O embedding usa text-embedding-3-small, a US$ 0,02 por milhão de tokens naquele cenário. O catálogo medido em junho tinha cerca de 35 mil tokens. Gerar todos aqueles vetores custava aproximadamente US$ 0,0007. É o que permite procurar cursos relacionados comparando os vetores, sem pedir uma recomendação nova à LLM toda vez.
Com as mesmas premissas, o robô semanal, julgando até 24 candidatos e importando até cinco, ficava abaixo de US$ 0,05 por rodada. A decisão que mantém isso barato é o tamanho do trabalho permitido.
Raciocínio também entra na fatura
A documentação da OpenRouter sobre reasoning tokens explica que esses tokens são cobrados como saída. E exclude só retira o raciocínio da resposta que você recebe; não interrompe sua geração.
Pra escolher algumas tags de uma lista, eu não quero pagar por uma longa cadeia de raciocínio. No cliente real do CourseShelf, a configuração fica assim, dentro do corpo da requisição:
# courseshelf-v2/lib/course_shelf/ai.ex (trecho do body)
response_format: %{
type: "json_schema",
json_schema: %{name: schema_name, strict: true, schema: schema}
},
# `effort: "none"` disables reasoning. It is valid only for models that
# allow turning reasoning off (the default does); a mandatory-reasoning
# model would reject it — revisit if `:model` is overridden.
reasoning: %{effort: "none"}
O schema define o formato. O esforço none desabilita o raciocínio nos modelos que aceitam essa configuração. Se eu trocar pra um modelo que exige raciocínio, preciso rever a chamada. Não é uma opção universal que funciona igual em todo provider.
Essa integração é um POST com JSON usando Req. Não precisei colocar um framework de agentes no produto pra fazer classificação e resumo.
O modelo também precisa ser fácil de trocar
O cliente começou no formato da Anthropic, passou pra DeepSeek via OpenRouter antes da primeira feature ir ao ar e depois mudou pra V4.1 Flash. A primeira mudança foi motivada por dependência de fornecedor, não pelo preço.
O padrão fica numa string:
# courseshelf-v2/lib/course_shelf/ai.ex
@default_model "deepseek/deepseek-v4.1-flash"
Mudar essa string não dispensa testar os cursos reais nem conferir schema, limites e suporte a reasoning. Mas mantém a troca pequena.
Em outubro de 2026, o preço de entrada do Claude Haiku 5.5 na OpenRouter era menor que o do provider DeepSeek usado na conta acima. Ficar defendendo o “modelo barato” como identidade não ajuda. Eu quero conseguir trocar quando fizer sentido.

Por que ainda não tem chat
Uma conversa de dez mensagens pode somar cerca de 30 mil tokens de entrada e três mil de saída, porque o histórico volta nas chamadas. Esse é o cenário estimado no planejamento do CourseShelf, não uma média medida em produção.
Com um modelo a US$ 2 por milhão de entrada e US$ 10 de saída, a conta é US$ 0,09 por conversa. Mil usuários fazendo dez conversas no mês dariam US$ 900 por mês. Esse era o cenário com o Claude Sonnet 5.5 usado no vídeo.
Dá pra escolher um modelo bem mais barato. Com as tarifas de US$ 0,10 e US$ 0,50 do Haiku 5.5, as mesmas quantidades dariam US$ 0,0045 por conversa. A diferença é enorme, mas a relação permanece: mais conversa, mais custo.
Na situação descrita no vídeo, o CourseShelf não cobra dos usuários. Então preferi melhorar busca e descoberta com tags e embeddings já calculados, em vez de criar uma conta que cresce junto com o tráfego. Chat também traz latência e trabalho pra lidar com abuso e prompt injection. Eu quero uma utilidade que justifique isso.
A pergunta que vem antes do preço
Esse custo cresce com o quê?
Se cresce com o número de registros, você pode executar em background, guardar o resultado e distribuir aquela informação pra muita gente. Se cresce com cada interação, faz a conta de uso antes, de preferência com uma receita que pague por ela.
E token barato não garante resultado bom. O robô do CourseShelf já confundiu Elixir com uma aula de literatura, como eu conto em “Automatizei meu SaaS com IA”. O tempo de conferir a decisão pode custar mais que a inferência. Essa parte também precisa caber no produto.
Vídeo no YouTube: Quanto custa colocar IA no seu SaaS
Conheça meu trabalho: https://bergholz.com.br/
Obrigado por ler até aqui.
