Verificando acesso...

MODULO 6.4

🤖 SessionEnd + Gemini Flash

Resumo automatico da sessao via Gemini. Atualiza context.md, arquiva em long-term. Zero trabalho manual.

6
Topicos
35
Minutos
Avancado
Nivel
Integracao
Tipo
1

🎯 Por que usar outro modelo

Claude no loop principal, Gemini Flash no background. Divisao de papeis inteligente.

🧠 Por que Gemini Flash

Caracteristicas ideais para resumo:

  • Rapido (3-5s por sumario tipico)
  • Barato ($0.075/1M tokens input, $0.30/1M output)
  • Janela 1M tokens — cabe sessoes inteiras
  • Instrucoes simples funcionam bem (structured output)
  • Alternativa: GPT-4o-mini, Claude Haiku, DeepSeek — todos funcionam
2

📜 Lendo o JSONL da sessao

Payload do SessionEnd inclui transcript_path. Claude Code ja salva, voce so le.

📐 Preparacao do transcript

def load_transcript(path, max_tokens=50_000):
    if not path.exists(): return ""
    lines = []
    total = 0
    for line in path.read_text().splitlines():
        msg = json.loads(line)
        role = msg.get('role')
        content = msg.get('content', '')
        if role not in ('user', 'assistant') or not content:
            continue
        text = content if isinstance(content, str) else str(content)[:2000]
        lines.append(f'[{role}] {text}')
        total += len(text) // 4
        if total > max_tokens:
            lines.append('[... truncado ...]')
            break
    return '\n\n'.join(lines)

💡 Filtre tool calls ruidosos

Ler arquivo grande gera payload gigante no transcript. Filtre tool_use results que nao agregam contexto: bash exit codes, file metadata.

3

✍️ Prompt para o Gemini

Prompt estruturado = saida previsivel. Markdown formatado para inserir direto em context.md.

📐 Prompt template

prompt = f"""Resuma essa sessao de coding em 150 palavras, no formato markdown:

## Projeto ativo
[nome]

## Decisoes tomadas
- [uma linha cada]

## Bloqueios atuais
- [se houver]

## Proximo passo
[acao concreta, uma frase]

## Hipoteses descartadas
- [para Claude nao sugerir de novo]

Regras:
- Portugues brasileiro
- Frases curtas
- Evite jargao
- Se informacao nao consta na sessao, omita o campo

Transcript:
{transcript}
"""

💡 Teste com 3-5 sessoes

Rode prompt em 5 sessoes diferentes e leia saidas. Se formato varia, ajuste prompt ate ficar reproducible.

4

💾 Atualizando context.md

Output do Gemini vai direto em context.md. Proxima sessao abre atualizada.

📐 Update simples

def update_context(summary):
    ctx = Path('~/.memory/context.md').expanduser()
    header = f'# Contexto critico — atualizado em {datetime.now():%Y-%m-%d %H:%M}\n\n'
    ctx.write_text(header + summary + '\n')

# Ou append com timestamp (preserva historia)
def append_to_context(summary):
    ctx = Path('~/.memory/context.md').expanduser()
    existing = ctx.read_text() if ctx.exists() else ''
    ctx.write_text(f'{existing}\n\n---\n## {datetime.now():%Y-%m-%d}\n{summary}\n')

💡 Overwrite vs append

Overwrite: contexto sempre fresco, sem historia. Append: historia preservada, mas cresce. Comeco: overwrite.

5

🗃️ Entry em long-term

Mesmo sumario tambem arquiva em long-term. Pesquisavel no futuro.

📐 Append em sessions archive

def append_session_archive(summary):
    today = datetime.now().strftime('%Y-%m-%d')
    archive = Path(f'~/.memory/long-term/sessions/{today}.md').expanduser()
    archive.parent.mkdir(parents=True, exist_ok=True)

    existing = archive.read_text() if archive.exists() else ''
    archive.write_text(f'{existing}\n\n---\n## Sessao {datetime.now():%H:%M}\n{summary}')

# Resultado:
# ~/.memory/long-term/sessions/2026-04-23.md
#   Multiplas sessoes do dia, separadas por ---.
#   Indexavel: 'o que decidi em abril sobre webhooks?'

💡 Time-travel facil

6 meses depois: grep -r 'webhook' ~/.memory/long-term/sessions/. Retorna contexto de dias especificos.

6

⚠️ Gotchas: JSONL grande, timeout, API key

Tres falhas comuns que anulam a automacao silenciosamente.

✓ Solucoes

  • JSONL grande: truncar em 50k tokens antes de enviar
  • Gemini lento: timeout 20s; se estourar, sem update
  • API key ausente: log em stderr, nao crash
  • Resposta vazia: fallback 'sessao sem decisoes claras'

✗ Armadilhas

  • Hook trava esperando API infinito
  • Erro de API derruba SessionEnd com exception
  • context.md sobrescrito com string vazia
  • Custo explodindo por transcript gigante nao-truncado

📝 Resumo do Modulo

Gemini Flash e barato — ~$0.001 por sessao.
Transcript path chega no payload — Claude Code ja salva JSONL.
Prompt estruturado — markdown sai previsivel.
Fallback silencioso — sem API key, sem ruido.

Proximo:

6.5 — Memoria por agente e projeto