Um negócio de serviço que monta orçamento entre Word e Excel, toda vez que um cliente pergunta o preço, conhece o problema: é repetitivo, e basta copiar um número errado de uma célula pra um orçamento incorreto sair pelo e-mail. A tentação, com uma IA já escrevendo o texto do orçamento, é pedir pra ela calcular o preço final também, já que está ali mesmo.

Não vale o risco. O cálculo — subtotal, desconto, total — fica em código Python determinístico; a IA entra só na parte que precisa de linguagem, o texto comercial ao redor do número. Um modelo de linguagem arredondando errado um preço não é um bug raro: é o tipo de erro que aparece justo na hora em que ninguém confere de novo. O Quote UI, sistema do próprio catálogo do autor, segue exatamente esse princípio — gera orçamento de tradução com PDF pronto, construído em FastAPI, Jinja2 e WeasyPrint, e a conta nunca passa pelo modelo. Nem todo projeto de IA ganha por colocar IA em cada etapa; parte do trabalho é reconhecer quando um pedaço do sistema já funciona melhor sendo só código.

O que você precisa

  • Conhecimento básico de Python — o suficiente pra ler e ajustar um script; a IA ajuda a escrever o resto
  • Conta gratuita no Supabase (banco de dados Postgres hospedado)
  • Chave de API da Anthropic
  • Biblioteca de geração de PDF: fpdf2, o caminho rápido usado neste tutorial (o Passo 5 mostra a alternativa que o Quote UI usa de verdade)

Passo 1: Estruturar a tabela de preços no Supabase

Crie uma tabela chamada produtos, com as colunas id (uuid, chave primária), nome (texto), descricao (texto), preco_unitario (numérico), unidade (texto — "hora", "unidade" ou "projeto") e categoria (texto). Essa tabela é a fonte única do preço: tudo que o sistema calcula depois vem daqui, nunca de um número que o modelo de linguagem inventa na hora.

Se já existe uma planilha de preços, um prompt resolve a conversão:

"Converta esta planilha de preços para comandos INSERT INTO no Supabase. Tabela: produtos. Colunas: nome, descricao, preco_unitario, unidade, categoria."

Passo 2: Coletar os itens do orçamento

Instale a biblioteca cliente:

pip install supabase

O script coleta o nome do cliente, os itens solicitados com quantidade, e condições especiais — desconto, prazo, alguma observação. A conexão com a tabela de preços é o ponto de partida:

import os
from supabase import create_client

supabase = create_client(os.environ["SUPABASE_URL"], os.environ["SUPABASE_KEY"])
produtos = supabase.table("produtos").select("*").execute()

A regra que já vale a partir daqui: subtotal, desconto e total são somados em Python, com os números vindos direto da tabela produtos. Nunca são pedidos pra IA calcular.

Passo 3: Gerar o texto do orçamento com Claude

O SDK oficial da Anthropic lê a chave ANTHROPIC_API_KEY do ambiente sozinho, via anthropic.Anthropic(). Pra essa tarefa — redigir um texto comercial — o claude-sonnet-5 já resolve; não precisa do modelo mais caro da linha. A diferença que importa é o que entra no prompt: os números já calculados, prontos, sem espaço pro modelo decidir nada sobre eles.

import anthropic

client = anthropic.Anthropic()

prompt = f"""Gere um orçamento profissional com estas informações:
Cliente: {cliente}
Itens: {itens_formatados}
Subtotal: R$ {subtotal}
Desconto: {desconto}%
Total: R$ {total}

Formato: cabeçalho, tabela de itens, condições de pagamento, validade de 15 dias.
Tom: profissional e cordial."""

resposta = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": prompt}],
)
texto_orcamento = resposta.content[0].text

Repare no que o prompt carrega: subtotal, desconto e total chegam prontos, calculados antes. O Claude nunca vê a planilha bruta, nunca decide a conta — só formata e escreve o texto ao redor de números que já existiam antes de ele entrar em cena.

Passo 4: Guardar o orçamento no banco

Uma segunda tabela, orcamentos, guarda cada orçamento gerado: id, cliente_nome, itens (jsonb), subtotal, desconto, total, texto_gerado, status (rascunho, enviado, aprovado ou recusado) e created_at. Guardar isso serve pra três coisas concretas: consultar um orçamento antigo quando o cliente pergunta de novo, medir taxa de aprovação ao longo do tempo, e reaproveitar um orçamento parecido como ponto de partida pro próximo cliente do mesmo tipo.

Passo 5: Gerar o PDF

Pra começar hoje, fpdf2 é o caminho rápido: uma função Python que recebe o texto gerado e monta um PDF com logo, cabeçalho, tabela de itens e rodapé de contato. Um prompt de apoio cobre a maior parte do trabalho:

"Crie uma função Python que recebe o texto de um orçamento e gera um PDF formatado com logo, cabeçalho da empresa, tabela de itens, e rodapé com dados de contato. Use fpdf2."

LEIA TAMBÉM · Caso realO gargalo nunca foi a IA gerar código, foi decidir o que pedir a elaAntes de escrever código, eu escrevo um documento dizendo o que o sistema faz e como saber se deu certo. Depois viro isso num plano de passos. A IA acelera muito a construção, mas só quando essa definição existe.

A produção usa outro caminho. O Quote UI, sistema real por trás dessa âncora, monta um template HTML com Jinja2 e converte pra PDF com WeasyPrint. Dá mais código pra escrever no início, mas mantém o design estável conforme o volume de orçamento cresce — foi por isso que esse foi o caminho escolhido lá, não o fpdf2 deste tutorial.

O que pode dar errado

  • Deixar a IA calcular subtotal, desconto ou total: é o risco central deste tutorial. Um modelo de linguagem pode arredondar errado ou inventar um número; a conta é sempre código Python.
  • Chave do Supabase ou da Anthropic exposta no código-fonte versionado: use variável de ambiente e .gitignore, sem exceção.
  • fpdf2 com acentuação quebrada: o suporte a Unicode é limitado por padrão; uma fonte Unicode como DejaVu resolve, ou migre pro caminho WeasyPrint do Passo 5.
  • Texto genérico da IA quando o prompt não fixa o tom: reforce o tom no prompt, como no Passo 3.

Próximos passos

Uma interface web simples, em Streamlit, tira o processo do terminal. Envio automático do PDF por e-mail, com qualquer provedor transacional — Resend ou SendGrid servem de exemplo — fecha o ciclo sem intervenção manual. Containerizar o sistema com Docker, do jeito que o Quote UI faz, é o passo natural quando chega a hora de colocar isso em produção de verdade.

Automação boa não é a IA fazendo tudo. É código confiável fazendo a parte que precisa ser exata, e IA fazendo a parte que precisa ser bem escrita.