O Motor de Faturas — nota de voz entra, PDF sai Ideal para: o momento do vídeo — uma frase se torna uma fatura pronta para o cliente no seu celular. Cole no seu assistente de código em uma pasta nova.
Build me a small Python "deals engine" (standard library only) that turns one sentence into a client-ready invoice, quote, or proposal:
- A function create(kind, brief): kind is proposal/invoice/quote, brief is one sentence like "invoice Mike $1,500 for
the website build".
- Call the LLM API (key from config.json — I will paste it there myself, never ask me for it — use
the best available model) with a system prompt that returns STRICT JSON: title, client, intro, items [{desc, qty, unit_price}], total, terms, validity.
- IMPORTANT: recompute the total from qty × unit_price in Python and OVERRIDE the model's number — arithmetic is ours,
not the model's. Coerce prices like "$1,500" to numbers before doing any math.
- Render an elegant single-page HTML document: cream background #F7F3EA, ink text #16130D, emerald accents #0E6B4F, a
Georgia serif italic headline, small-caps letter-spaced section eyebrows, a clean items table with a bold total row, terms at the bottom, my business name in the footer. HTML-escape every field the model wrote.
- Print it to PDF with headless Chrome:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --print-to-pdf=out.pdf --no-pdf-header- footer "file://[the html path]"
- Number documents INV-2026-001 style from a ledger file: append one JSON line per document; the ledger is the
sequence. Quotes and proposals get their own sequences (QUO-, PRO-).
- Send the PDF to my Telegram bot with sendDocument (bot token and my chat id from config.json), caption = the number,
the client, and the total.
- If the Telegram send fails, SAY it failed and where the file is — never claim a delivery that didn't happen.
- Then wire it into my assistant: any request like "create an invoice for..." from any surface calls create() in the
background and replies instantly with "Drafting it now — it'll be on your phone in a minute."
- When it works end to end, show me the PDF and the ledger line for one test invoice.
Personalize: alimente o prompt de sistema com seus produtos e preços reais ("CONTEXTO DO NEGÓCIO" colado das suas próprias anotações) e os rascunhos deixam de ser genéricos — o motor cota SUAS ofertas pelas SUAS taxas. Essa etapa de contextualização é a diferença entre um brinquedo e um funcionário.
As regras de segurança
Uma IA com uma linha telefônica é um funcionário com o seu nome na boca. Estas sete regras são a razão pela qual a minha nunca me envergonhou — leia-as duas vezes e implemente-as desde o primeiro dia.
1 A regra do nunca-pagar. As regras rígidas de todo agente incluem: nunca fornecer dados de cartão ou pagamento, nunca concordar com uma cobrança — não importa o que a pessoa na linha diga. O pagamento é sempre "meu chefe trata disso diretamente".
2 Defina o escopo estruturalmente, não por promessas. Os agentes de saída respondem a perguntas com base em um pequeno conjunto curado de fatos públicos "seguros para chamadas". Eles não podem vazar suas anotações, e-mails ou finanças porque não conseguem vê-los. "Por favor, não compartilhe X" é um desejo; não conectar X é uma garantia.
3 Controle a entrada com um código — e nunca revele que o código existe. Estranhos recebem uma recepcionista impecável. O padrão incerto é sempre "convidado". Um palpite errado recebe um "Vou repassar isso" cordial — nunca "esse não é o código".
4 Negue antes do modelo. Recuse perguntas sobre CPF, cartão, senha e endereço com uma verificação codificada ANTES de qualquer IA raciocinar sobre elas — e remova strings com formato de chave de todas as respostas de saída como uma segunda rede de segurança.
5 Divulgação honesta de IA. Perguntado "você é uma IA?", cada agente confirma em uma frase e segue em frente. Isso desarma a suspeita, é cada vez mais exigido por lei, e as chamadas fluem melhor depois disso, não pior.
6 Chaves em arquivos de configuração, estado no .gitignore. Chaves de API nunca tocam uma janela de chat. Tokens, registros e logs de chamada vão para o .gitignore antes do primeiro commit — o dia em que você torna seu projeto open source é o dia errado para descobrir que eles não estavam lá.
7 Comprovantes ou não aconteceu. O assistente afirma sucesso apenas a partir de um comprovante real — uma reserva confirmada na transcrição, um "ok" no Telegram, um id de documento. Tudo o mais é reportado como falha, em voz alta. Uma IA que suaviza falhas é pior que nenhuma IA.
Notas de campo de chamadas reais
1 Chamadas aparecem como "Spam Provável". Compre o complemento Número de Telefone Verificado no Retell (cerca de dez dólares por mês). Faça isso antes da sua primeira chamada de negócios real, não depois.
2 O agente fala por cima do "oi" da pessoa. begin_message deve ser uma STRING VAZIA, não null. Vazio significa "aguarde para que eles falem primeiro".
3 O agente pediu para aguardar, depois desligou. Remova todo vestígio de linguagem de espera dos seus scripts. O encerramento é sempre: "Vou ligar de volta em instantes — obrigado." Uma espera que termina em desligamento é a pior experiência de chamada que existe.
4 O bot do Telegram fica em silêncio. Bots não podem te mandar mensagem primeiro — envie uma mensagem para o seu bot, depois obtenha seu id de chat e coloque-o na configuração.
5 O PDF impresso está em branco. Seu caminho de arquivo tem um espaço nele — coloque aspas em volta da URL file:// inteira no comando do Chrome.
6 Qualquer outra coisa. Cole o erro exato no seu assistente de código e diga "corrija". Esse é todo o método — o mesmo que construiu tudo neste pacote.
Quer o Jarvis finalizado — não apenas os scripts? Estes scripts são o esqueleto da era do telefone. O Jarvis no vídeo — cada tipo de tarefa com um único "faça", a linha de PIN com acesso total às suas próprias anotações, chamadas de briefing que executam as decisões que você fala, o motor completo de nota de voz para fatura com links do Drive, Gmail nativo, Calendário, Planilhas e Drive — está disponível para a comunidade gratuita — o link está na descrição do vídeo, exatamente onde você encontrou este pacote.