MÓDULO 2.3

🤖 O agente e o bot

Dê vida ao coach: configurar o agent.yaml, preencher o CLAUDE.md com o seu perfil, conhecer os slash commands, subir o bot e testar o snapshot e a memória.

7
Tópicos
~35
Minutos
Intermediário
Nível
Prático
Tipo
Seu progresso neste módulo 0% · 0 de 7
1

⚙️ agent.yaml — o token do bot e os comandos

O agent.yaml é o arquivo de configuração do coach: ele diz qual bot do Telegram usar e quais slash commands aparecem no menu. A pegadinha mais importante: o token não mora dentro dele. O arquivo guarda só o nome da variável de ambiente que aponta para o token — o segredo de verdade fica em ~/.env, fora do git.

🟢 Novo aqui? Três termos antes de seguir

  • agent.yaml — o "painel de controle" do coach em texto. Você copia o agent.yaml.example para agent.yaml e edita.
  • telegram_bot_token_env — em vez do token cru, ele guarda o NOME da variável (ex.: HEALTH_BOT_TOKEN) que o agente lê do seu ~/.env. Assim o segredo nunca cai no repositório.
  • Slash command — um atalho que começa com "/" no Telegram (ex.: /checkin). Cada um dispara uma rotina do coach.

📋 Copie e adapte · objetivo: registrar o bot e declarar os comandos do menu

# agent.yaml.example  →  copie para agent.yaml e edite
name: health-coach

# o bot NÃO guarda o token aqui — guarda o NOME da variável
# de ambiente que o agente lê do seu ~/.env (segredo fora do git)
telegram_bot_token_env: HEALTH_BOT_TOKEN

slash_commands:
  - command: checkin
    description: Revisão da manhã guiada pela recuperação
  - command: today
    description: O plano de hoje (treino, comida, café)
  - command: sofar
    description: O que você já registrou hoje
  - command: newday
    description: Fecha o dia e começa um novo
  - command: supplements
    description: Sua agenda de suplementos
  - command: advice
    description: Conselho com citações, reconciliado aos seus dados
Como verificar: depois de subir o bot, abra a conversa no Telegram e digite "/". Os seis comandos devem aparecer no menu de autocomplete.

Conceitos-chave

agent.yaml

O painel de controle do coach.

Token por env

Guarda o nome da variável, não o segredo.

Slash commands

Atalhos "/" declarados no arquivo.

~/.env

Onde o token de fato vive.

2

📝 CLAUDE.md — o cérebro do coach é o seu perfil

O CLAUDE.md é o documento que o coach lê para saber quem você é. É ali que o "conselho genérico" vira "conselho seu": meta, exames de sangue, variações genéticas, restrições, preferências de suplemento e — importante — o estilo com que você quer ser cobrado. O repositório traz um template; você o preenche com a sua realidade.

📋 Copie e preencha · objetivo: dar ao coach o seu perfil real para aterrar cada resposta

# CLAUDE.md — o cérebro do coach (preencha com o SEU perfil)

## Meta (goal)
<ex.: recomposição — perder ~4 kg de gordura mantendo massa até dez>

## Exames (bloods)
<só os SEUS valores: ApoB 95, HOMA-IR 1.4, Vitamina D 28, ...>

## Genética (SNPs)
<ex.: CYP1A2 metabolizador rápido de cafeína; APOE e3/e3>

## Restrições
<ex.: sem lactose; joelho direito sensível; tendência a dormir tarde>

## Suplementos (preferências)
<ex.: creatina 5g/dia; magnésio à noite; evita pré-treino com cafeína>

## Estilo do coach
Direto e cobrando — pode ser "savage on purpose":
me chama no flanco quando eu furo um check-in, sem rodeios.
Como verificar: mande uma pergunta ao bot tipo "posso tomar café agora?" — a resposta deve citar algo do seu perfil (sua genética de cafeína, sua meta), não uma média genérica.

⚠️ Nunca versione o CLAUDE.md preenchido

  • O template vem no repositório; o preenchido tem exames e genética reais — é informação de saúde sensível.
  • Mantenha-o fora do git (no .gitignore), junto com seus valores de seed, fotos e o ~/.env.
  • O repo público é o blueprint limpo — não os registros de ninguém.

💡 Por que o "estilo" importa

Um coach que você ignora não muda nada. Descrever o tom — gentil, técnico, ou "savage on purpose" cobrando check-ins — faz o LLM falar do jeito que te move. É parte do perfil tanto quanto o ApoB.

Conceitos-chave

Perfil = cérebro

O CLAUDE.md aterra cada resposta em você.

Estilo do coach

O tom também é configuração.

Template vs real

Copie o modelo, preencha o seu.

Fora do git

O preenchido nunca é versionado.

3

⌨️ Os slash commands, um a um

Cada slash command é um atalho que dispara uma rotina específica do coach. Você não precisa deles — pode só conversar normalmente — mas eles dão um botão rápido para as ações do dia. Os seis do menu vêm do agent.yaml; há ainda o /healthdb, que entrega um botão de link para o dashboard.

/ menu do bot /checkin /today /sofar /newday /supplements /advice /healthdb extra: botão de link p/ o dashboard

📊 Como ler: digitar "/" abre o menu (azul) que se ramifica nos seis comandos declarados (ciano). O /healthdb (âmbar, à direita) é um extra que manda um botão de deep-link para o dashboard.

ComandoO que faz
/checkinA revisão da manhã guiada pela recuperação: abre com o recovery de ontem à noite e amarra suas escolhas ao número.
/todayO plano de hoje — treino, comida e café — visivelmente condicionado ao recovery (verde = puxar, vermelho = pegar leve).
/sofarMostra o que você já registrou hoje (comida, treino, peso, café) — o acumulado do dia até agora.
/newdayFecha o dia e abre um novo — útil quando você vira a página antes da rotina automática rodar.
/supplementsSua agenda de suplementos: o que tomar, quando, conforme o que está no banco.
/adviceConselho com citações (RAG de fontes), reconciliado aos seus próprios dados antes de te entregar.
/healthdbExtra — manda um botão de deep-link para o dashboard, com o DASHBOARD_TOKEN guardado num cookie HttpOnly.

Conceitos-chave

/checkin

A âncora do dia: recovery → plano.

/today · /sofar

Plano de hoje e o que já entrou.

/advice

Conselho citado, batido com seus dados.

/healthdb

Atalho protegido para o dashboard.

4

💬 Subir o bot e dar o primeiro "oi"

Com o token no ~/.env e o agent.yaml pronto, você sobe o agente e manda uma mensagem comum — nem precisa de comando. O teste mínimo é exatamente este: o bot boota e responde a um "oi". Por trás desse "oi" acontece a sequência que você vê no diagrama: o agente lê o snapshot, raciocina no LLM e devolve a resposta ao Telegram.

💬 /checkinvocê, no Telegram 🤖 Agentecoach 📸 state.pysnapshot 🧠 LLMraciocina a resposta volta ao Telegram (linha tracejada)

📊 Como ler: da esquerda pra direita é o caminho da sua mensagem; a linha tracejada é a resposta voltando. O agente sempre passa pelo state.py (snapshot) antes de raciocinar — é o que veremos rodar no próximo tópico.

Conversa no Telegram (ilustrativa)

oi
Bom te ver. 👋 Bootei e já li seu snapshot. Quer a revisão da manhã (/checkin) ou prefere só registrar algo?

O teste que confirma esta etapa

Da checklist de validação: "o agente boota e responde a uma mensagem comum no Telegram" e "os slash commands aparecem no menu '/'". Se um "oi" recebe resposta e os comandos surgem ao digitar "/", o bot está no ar.

Conceitos-chave

Mensagem comum

Não precisa de comando para conversar.

Boot

Sobe lendo o token do ~/.env.

Snapshot primeiro

Toda resposta começa pelo state.py.

Resposta volta

O LLM responde no próprio Telegram.

5

📸 state.py — como o snapshot é montado

O snapshot é o retrato compacto do "agora" que o agente lê no começo de cada turno: tendência de peso, o que você comeu hoje, pressão, a recuperação de ontem à noite, o padrão de sono de 7 dias e suas metas. O script state.py monta esse retrato a partir do banco — e você pode rodá-lo no terminal para ver o que o coach vê.

🟢 Novo aqui?

Snapshot de sessão — não é mágica nem IA: é só uma consulta determinística ao banco que junta as últimas linhas de cada tabela num resumo. Rodar o state.py sozinho mostra exatamente o texto que entra no contexto do LLM antes de qualquer raciocínio.

📋 Rode no terminal · objetivo: imprimir o snapshot (peso, intake e metas) que o coach lê a cada turno

# na raiz do repositório, com o ~/.env preenchido
python3 agent/scripts/state.py
Como verificar: deve sair um bloco com a tendência de peso, o intake de hoje (calorias/proteína) e suas metas (goals). Saída de exemplo abaixo (números fictícios):
=== SNAPSHOT (2026-06-30) ===
weight:   82.4 kg  (7d: -0.6 kg ↓)
today:    1 240 kcal · 96 g proteína · café 1×
last night: recovery 71% · HRV 64 ms · sono 7h20
7d sleep: média 6h54  (meta 7h30)
goals:    recomposição — manter massa, -4 kg gordura

🔎 Por que rodar isso à parte

Se uma resposta do coach parece "fora do contexto", o state.py é o primeiro lugar para olhar: se o snapshot está vazio ou desatualizado, o problema é dado faltando no banco — não o LLM. É a sua janela de depuração.

Conceitos-chave

state.py

Monta o snapshot a partir do banco.

Determinístico

Só consulta — sem IA no meio.

Peso · intake · metas

O que precisa aparecer na saída.

Janela de debug

Veja o que o coach realmente vê.

6

🧲 mem.py recall — a memória semântica

O snapshot conta o "agora"; a memória semântica traz o passado relevante. Toda mensagem é guardada com um embedding (uma assinatura numérica do significado). Quando você pergunta algo, o mem.py recall busca as mensagens passadas mais parecidas com a pergunta — mesmo que não usem as mesmas palavras — e as devolve para o coach.

🟢 Novo aqui? Dois termos

  • Embedding — um vetor de números que representa o sentido de um texto. Frases parecidas viram vetores próximos, então a busca acha por significado, não por palavra exata.
  • Recall semântico — "lembrar por significado": dada a sua pergunta, o sistema mede a proximidade entre os embeddings e traz as memórias mais próximas (via pgvector, no Supabase).

📋 Rode no terminal · objetivo: trazer mensagens passadas relevantes a uma consulta

# busca por significado nas suas mensagens já guardadas
python3 agent/scripts/mem.py recall "<o que você quer lembrar>"

# ex.: como o álcool costuma afetar o meu sono
python3 agent/scripts/mem.py recall "vinho à noite e recuperação"
Como verificar: deve sair uma lista de mensagens passadas relevantes (com data e um score de similaridade), não a última mensagem qualquer. Saída de exemplo (fictícia):
recall "vinho à noite e recuperação"  →  3 hits
0.89  2026-06-12  "bebi 2 taças no jantar, dormi mal"
0.84  2026-05-28  "recovery caiu p/ 48% depois do churrasco c/ cerveja"
0.79  2026-05-09  "noites sem álcool: HRV mais alto na manhã"

🧠 Memória é o produto

É isto que separa o coach de um chatbot que esquece tudo: ele cruza a pergunta de hoje com o seu histórico e enxerga padrões ("toda vez que você janta tarde, o sono cai"). Da checklist: "recall semântico (mem.py recall) retorna mensagens passadas relevantes".

Conceitos-chave

Embedding

Assinatura numérica do significado.

recall

Busca por sentido, não por palavra.

pgvector

A busca por proximidade no Supabase.

Padrões

O passado relevante vira insight.

7

🌳 A árvore do agent/

Tudo o que você configurou vive na pasta agent/ — o agente sanitizado e auto-contido. Vale ter o mapa na cabeça: na raiz, o cérebro (CLAUDE.md) e a config (agent.yaml.example); aninhados, os scripts, as migrations do banco e o dashboard.

📁 agent/ 📄 CLAUDE.md — o cérebro 📄 agent.yaml.example — config + comandos 📄 AGENTS.md 📁 scripts/ state.py — snapshot mem.py — memória db.py — banco whoop-sync.py — wearable supplements.py — agenda advice.py — RAG com citações 📁 supabase/migrations/ o schema completo (14 tabelas) + seed de exemplo 📁 dashboard/ página + camada de dados + rotas do painel web

📊 Como ler: a borda externa é a pasta agent/. Na faixa de cima ficam os arquivos da raiz; abaixo, as três pastas aninhadas. Os scripts que você rodou neste módulo (state.py, mem.py) moram em scripts/.

scripts/db.py

A porta do banco: select, inserts e até criar o bucket de fotos (mkbucket). Stdlib-only.

scripts/whoop-sync.py

Puxa recovery + sono da wearable para a tabela vitals. Roda no cron da manhã (Trilha 2.4).

scripts/supplements.py

Constrói a agenda de suplementos que o /supplements entrega.

scripts/advice.py

O RAG por trás do /advice: conselho com citações, reconciliado aos seus dados. Único que precisa de requests.

✅ Auto-checagem (opcional): onde mora o token do bot do Telegram?

Conceitos-chave

Raiz

CLAUDE.md + agent.yaml.example + AGENTS.md.

scripts/

state, mem, db, whoop-sync, supplements, advice.

migrations/

O schema de 14 tabelas + seed.

dashboard/

O painel web que lê do Supabase.

📋 Resumo do módulo

agent.yaml — registra o bot por telegram_bot_token_env e declara os slash commands; o token fica no ~/.env.
CLAUDE.md — o seu perfil (meta, exames, genética, restrições, suplementos, estilo) é o cérebro do coach; nunca versione o preenchido.
Os comandos — /checkin, /today, /sofar, /newday, /supplements, /advice (+ /healthdb para o dashboard).
Bot no ar — sobe e responde a um "oi"; por trás, lê o snapshot do state.py antes de raciocinar.
Snapshot + memóriastate.py imprime o "agora"; mem.py recall traz o passado relevante.

Próximo módulo:

2.4 — Wearable e agendamento: conectar o WHOOP (OAuth), agendar o whoop-sync.py e disparar a revisão da manhã todo dia.