🎯 Objetivo / Motivação
Implementar o script principal (enrichment.js) que processa os dados brutos coletados (excerpts ou textos completos) utilizando a API do Google Gemini. O objetivo é extrair informações estruturadas (valores monetários totais e categorizados) sobre investimentos oncológicos e salvar esses dados enriquecidos de volta no banco de dados.
Esta tarefa é crucial pois transforma os trechos de texto não estruturados em dados quantificáveis e categorizados, que são essenciais para a visualização e análise no frontend do OncoMap. Resolve o problema de termos apenas “evidências brutas” e permite a geração de insights.
📋 Escopo da Tarefa e Entregáveis
- Modificar Tabela
mentions: Garantir que as colunasgemini_analysis(JSONB) eextracted_value(NUMERIC) existam. - Criar Script
enrichment.js: Desenvolver o script principal na pastascripts/. - Lógica de Seleção de Fonte: Implementar a lógica que prioriza o download do conteúdo do
txt_url(se disponível) e usa oexcerptcomo fallback. - Desenvolver Prompt Refinado: Implementar a função
getGeminiPromptcom instruções detalhadas para extrair o JSON estruturado (total_gasto_oncologico,medicamentos,equipamentos,estadia_paciente,obras_infraestrutura,servicos_saude,outros_relacionados). - Integração com Gemini API: Implementar a chamada à API do Gemini (
gemini-flash-latest) usando o SDK@google/generative-ai. - Lógica de Limpeza e Cálculo: Implementar a função
extractJsonFromStringpara extrair o JSON da resposta e recalcular ototal_gasto_oncologicolocalmente para garantir precisão. - Tratamento de Erros e Rate Limit: Implementar a lógica de
try...catchcom retentativas (exponential backoff) para erros429 Too Many Requestse tratamento para outros erros da API ou de parsing. - Controle de Velocidade: Implementar um
delayconfigurável entre as chamadas ao Gemini para respeitar os limites e a boa vizinhança da API. - Atualização do Banco de Dados: Implementar a query
UPDATE mentionspara salvar ogemini_analysis(JSON) e oextracted_value(NUMERIC calculado) na linha correspondente. - Adicionar Comando
npm: Adicionar o scriptdb:enrichaopackage.json.
✅ Critérios de Aceitação
- O script
enrichment.jsexiste na pastascripts/e executa sem erros fatais. - O script identifica corretamente as menções na tabela
mentionsque ainda não foram processadas (gemini_analysis IS NULL). - O script tenta baixar o conteúdo do
txt_urlquando disponível e usa oexcerptcomo fallback. - As chamadas para a API do Gemini são feitas usando o prompt refinado.
- Erros
429da API do Gemini acionam a lógica de espera e retentativa configurada. - A resposta do Gemini é limpa, e o JSON é extraído ou um erro é registrado se a extração falhar.
- O valor total (
extracted_value) é calculado corretamente a partir das categorias no script. - Os dados (
gemini_analysiseextracted_value) são salvos corretamente na tabelamentionsapós o processamento bem-sucedido. - O script processa todas as menções pendentes e termina.
- O comando
npm run db:enrichexecuta o script corretamente.
🔗 Dependências (Opcional)
- Depende da existência da tabela
mentionscom as colunasexcerptesource_urlpopuladas (resultado da Issue da coleta inicial). - Depende da existência das colunas
txt_url,gemini_analysis, eextracted_valuena tabelamentions. - Para melhores resultados, depende da conclusão da Issue de preenchimento dos
txt_urls faltantes, mas possui fallback paraexcerpt.
💡 Sugestão de Implementação (Opcional)
- Utilizar o SDK
@google/generative-aipara interagir com o Gemini. - Utilizar
axiospara baixar o conteúdo dostxt_urls. - Implementar a lógica de seleção de fonte (
txtvsexcerpt) e o tratamento de erro de download. - Implementar a função
extractJsonFromStringusandoindexOf('{')elastIndexOf('}')ou Regex mais robusto. - Implementar o loop de retentativa (
while (attempt < maxRetries)) dentro de uma funçãoprocessMentionseparada para modularidade. - Usar
JSON.stringifypara salvar o objetoanalysisDatana colunaJSONB. - Executar o script usando
screendevido à longa duração estimada (horas).
Checklist do Autor
- Verifiquei se não há uma tarefa duplicada já aberta.
- O título da tarefa é claro e conciso.
- Descrevi o objetivo e a motivação por trás da tarefa.
- Os entregáveis e os critérios de aceitação estão bem definidos.
- Associei a tarefa a um projeto (Project) ou marco (Milestone), se aplicável.