Commit Graph

10 Commits

Author SHA1 Message Date
VPS 4 Deploy Agent 6d9850d8d3 feat(secretaria): monitor de cota dos providers + notificação ao admin
- brain: detecta 429/cota (quota/billing/insufficient/exceeded/limite da api/
  rate limit — inclui a msg PT do Gemini) e emite ext:provider.exhausted por
  provider da chain (throttle de 6h por provider), com fallback informado.
- routes: handler ext:provider.exhausted monta notificação profissional e envia
  por WhatsApp ao admin (admin_notify_phone da config secretaria), resolvendo o
  JID canônico via onWhatsApp (trata 9º dígito BR; pula se número não existe).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 07:49:00 +02:00
VPS 4 Deploy Agent b4d43fc3d6 feat(secretaria): modelo de canal (clinica_id) + auto-reply 1:1 com nome legível
- sec_numbers ganha clinica_id (mapa canal→clínica); migrate idempotente.
- clinica_id resolvido por CANAL no auto-reply (sec_numbers pela instância que
  recebeu) e por-REQUISIÇÃO no chat manual (header x-nw-clinica); brain.chat
  aceita opts.clinicaId e escopa a ponte de agenda (fallback: config global).
- /secretaria/numbers CRUD inclui clinica_id.
- auto-reply só cria conversa para 1:1 (@s.whatsapp.net) — exclui grupos/
  broadcast/newsletter/lid; contact_name legível (Contact → +telefone → jid).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 05:20:28 +02:00
VPS 4 Deploy Agent d09155613c feat(secretaria): tools de agenda operam na agenda real do satélite via ponte
listar_horarios/agendar_horario chamam a ponte do scoreodonto (/api/nw/agenda
slots|book) quando configurada — slot_id sintético (dentista|start|end), telefone
derivado do JID do contato — com fallback ao calendário interno preservado.
brain.ts injeta a config da agenda (agenda_url/secret/clinica_id) no toolCtx.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 00:51:47 +02:00
VPS 4 Deploy Agent 007c300cb0 fix(secretaria): fallback resiliente a erros de rede no callAI
isRecoverableError inclui fetch failed/timeout/econnreset/etimedout/und_err —
um blip de rede no primeiro provider agora cai para o próximo da chain (openai→
gemini→anthropic→ollama) em vez de virar "[Erro ao chamar IA: fetch failed]".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 20:55:22 +02:00
VPS 4 Deploy Agent 9ba3c78752 fix(secretaria): embeddings Gemini usam gemini-embedding-001 (768d)
text-embedding-004 foi descontinuado (404 'model not found'). Migra para
gemini-embedding-001 com outputDimensionality=768 (vetores leves p/ JSON+cosseno).
Validado: embed() retorna vetor 768d via Gemini.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 15:29:09 +02:00
VPS 4 Deploy Agent f51785bace fix(secretaria): embed() cai para Gemini se OpenAI falhar (não derruba RAG)
Antes, com openai_key presente, qualquer falha (ex.: 429 insufficient_quota)
retornava null sem tentar o Gemini. Agora tenta OpenAI e, em falha, usa Gemini.
Aviso documentado: OpenAI (1536d) e Gemini (768d) são incompatíveis — trocar de
provider exige reindexar (sync-knowledge + memória de contato).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 15:23:45 +02:00
VPS 4 Deploy Agent 42a04efe14 feat(secretaria): memória de longo prazo por contato (a partir das conversas)
A secretária passa a "lembrar" do cliente entre conversas:
- tabela sec_contact_memory (fato + embedding JSON), chave = ext_chat_id/contact_name.
- na sumarização (a cada ~10 trocas) extrai fatos duradouros do cliente via LLM
  e salva com embedding + dedup por similaridade (>0.92).
- buildSystemPrompt injeta "MEMÓRIA DO CLIENTE" com os fatos mais relevantes à
  pergunta (cosseno); sem chave de embedding usa os mais recentes; tudo com
  fallback silencioso (não regride).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 08:05:42 +02:00
VPS 4 Deploy Agent 31bf45faf5 feat(secretaria): RAG sem pgvector no conhecimento (embeddings + cosseno)
Adiciona busca semântica na Base de Conhecimento da secretária:
- embeddings.ts: chunking, embed (OpenAI text-embedding-3-small ou Gemini
  text-embedding-004) e similaridade cosseno — tudo na aplicação, sem pgvector.
- tabela sec_knowledge_chunks (vetor em JSON/text) com índices.
- brain.ts: no nó 'knowledge', injeta só os top-4 trechos relevantes à pergunta
  do usuário; indexação lazy por hash do conteúdo. Fallback para o conteúdo
  inteiro se não houver chave de embedding ou em qualquer falha (não regride).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 07:08:42 +02:00
VPS 4 Deploy Agent 2a15e8ea1e fix(secretaria): migra colunas de telemetria em sec_messages (42703)
O createTable de sec_messages não tinha usage_tokens/provider_used/model_used,
mas brain.ts insere esses campos — quebrando com "column does not exist" em
qualquer banco criado antes dessas colunas (ex.: clones). Adiciona as colunas
ao createTable e um bloco idempotente hasColumn/alterTable (padrão já usado no
arquivo) que garante as colunas em tabelas pré-existentes no boot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 23:43:37 +02:00
VPS 4 Deploy Agent 2f8c04a0a7 chore(ops): restore all source files in newwhats.clube67.com
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)
2026-05-18 03:28:29 +02:00