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:
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."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."
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.
