-- 0043 — o tamanho da conversa, o que ela custou, e como encolhe-la
--
-- O PROBLEMA MEDIDO
--
-- O historico da conversa vive no NAVEGADOR e e reenviado inteiro a cada
-- pergunta, cortado num teto fixo de 12 mensagens. Isso tem dois defeitos, e o
-- segundo e o que importa:
--
-- 1. CUSTO. Cada volta do laco reenvia o acumulado. Nas 132 perguntas
--    registradas ate 15/09/2026 o custo era superlinear: oito voltas custavam
--    9,5x o de duas. Uma conversa longa paga isso em toda pergunta.
--
-- 2. QUALIDADE, e este e pior. O corte em 12 mensagens nao resume: ele ESQUECE,
--    em silencio e pela ponta errada -- a mais antiga, que e justamente onde a
--    conversa estabeleceu o CRITERIO. Ja aconteceu: depois de acertar a
--    definicao de um termo no inicio, o assistente respondeu mais adiante que
--    "nao tinha isso registrado aqui". O criterio tinha saido da janela.
--
-- Compactar resolve os dois: o que sai da janela vira RESUMO em vez de sumir, e
-- o resumo e curto. Por isso a compactacao entra como criterio de qualidade, e
-- nao so como economia -- ela e a unica forma de a conversa longa continuar
-- sabendo o que a conversa curta sabia.
--
--
-- O QUE SE MEDE, E DE ONDE VEM
--
-- Nada e estimado. O provedor devolve, a cada resposta, quantos tokens entraram
-- e sairam, e quanto do prefixo foi lido do cache. Esses numeros ja circulavam
-- na resposta da API e morriam ali; agora ficam na mensagem.
--
-- O `input_tokens` da ULTIMA resposta e o tamanho real do que aquela pergunta
-- mandou: prompt de sistema, ferramentas, historico e fatos. E o numero honesto
-- para dizer "a conversa esta ocupando tanto" -- medido, nao calculado.
--
--
-- O QUE A PESSOA VE, E O QUE O ADMIN VE
--
-- Duas profundidades. Quem conversa ve o ESPACO ocupado e o botao de compactar;
-- token e custo nao dizem nada a quem quer saber do faturamento, e expor conta
-- de provedor ao usuario final e ruido com cara de cobranca.
--
-- A sessao administrativa ve os numeros.

ALTER TABLE embed_messages
  -- O que a resposta custou. NULL nas mensagens antigas e nas do usuario --
  -- so a resposta do assistente tem conta.
  ADD COLUMN input_tokens       INT UNSIGNED NULL AFTER tools_used,
  ADD COLUMN output_tokens      INT UNSIGNED NULL AFTER input_tokens,

  -- O cache do prefixo. Separado da entrada porque e MUITO mais barato, e
  -- somar os dois num numero so faria uma conversa bem cacheada parecer cara.
  ADD COLUMN cache_read_tokens  INT UNSIGNED NULL AFTER output_tokens,
  ADD COLUMN cache_write_tokens INT UNSIGNED NULL AFTER cache_read_tokens;

ALTER TABLE embed_conversations
  -- O RESUMO do que ficou para tras, escrito pelo modelo na compactacao.
  --
  -- Ele substitui as mensagens antigas no que vai ao modelo, e NAO as apaga: a
  -- pessoa continua lendo a conversa inteira na tela. Compactar muda o que o
  -- modelo recebe, nunca o que ficou registrado -- apagar a conversa de alguem
  -- para economizar token seria trocar o dado dele pelo nosso custo.
  ADD COLUMN summary MEDIUMTEXT NULL AFTER shared_at,

  -- Ate onde o resumo cobre. A mensagem seguinte a esta e a primeira que ainda
  -- vai crua.
  --
  -- E o id da MENSAGEM, e nao uma contagem: contagem se desalinha na primeira
  -- vez que alguem apagar uma mensagem, e o desalinho apareceria como uma
  -- resposta que ignora o que acabou de ser dito.
  ADD COLUMN summary_until_id BIGINT UNSIGNED NULL AFTER summary,

  ADD COLUMN compacted_at DATETIME NULL AFTER summary_until_id;
