forked from jina-ai/node-DeepResearch
-
Notifications
You must be signed in to change notification settings - Fork 0
🚀 Sistema de Observabilidade Completo para DeepResearch AI #5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
willy3087
merged 15 commits into
Deepthink-rs
from
feat/pessoa-2-personas-busca-avaliacao
Dec 9, 2025
Merged
🚀 Sistema de Observabilidade Completo para DeepResearch AI #5
willy3087
merged 15 commits into
Deepthink-rs
from
feat/pessoa-2-personas-busca-avaliacao
Dec 9, 2025
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
…se 1.1) Adiciona sistema completo de coleta de metricas para personas cognitivas, permitindo rastreamento de performance, uso de tokens e memoria. Alteracoes: - Adiciona execution_id Uuid no QueryContext para rastreamento unico - Cria PersonaExecutionMetrics com metricas de tempo, tokens e memoria - Adiciona metodo expand_query_with_metrics no trait CognitivePersona - Cria PersonaEvidence e PersonaEvidenceReport para relatorios - Adiciona helpers QueryContext with_query e with_execution_id Novos arquivos: - src/personas/metrics.rs Beneficios: - Debugging: identificar qual persona e gargalo - Custo: estimar tokens consumidos por execucao - Performance: comparar Rust vs TypeScript com dados reais - Producao: rastrear execucoes com ID unico Testes: 31 testes passando no modulo personas
…ase 1.2) Adiciona sistema de registro centralizado para personas cognitivas, permitindo adicionar, remover e configurar personas em runtime. Novos componentes: - PersonaRegistry: registro central com HashMap de personas - PersonaSchema: configuracao serializavel em JSON - RegistryConfig: formato de arquivo de configuracao - RegistryError: erros tipados para operacoes do registry Metodos implementados: - register/unregister: adicionar/remover personas - enable/disable: habilitar/desabilitar sem remover - list_available/list_enabled: listar personas - get/get_schema: obter persona ou sua configuracao - load_config/save_config: persistencia em JSON - expand_query_all: expandir query com todas habilitadas - iter/iter_enabled: iteradores para processamento Arquivos: - src/personas/registry.rs (novo) - config/personas.json (exemplo de configuracao) Beneficios: - Adicionar personas sem recompilar - Habilitar/desabilitar personas por config - Persistir configuracao em JSON - API fluente para gerenciamento Testes: 16 novos testes, 47 total no modulo personas
…tos (Fase 1.3) Adiciona sistema de validação para garantir que personas seguem o contrato esperado antes de serem registradas. Novos componentes: - PersonaValidator: validador central com métodos de verificação - ValidatorConfig: configuração customizável do validador - ValidationResult: resultado com erros e warnings - ValidationError: enum com tipos de erro específicos - ConformanceReport: relatório de testes de conformidade - ConformanceTest: teste individual de conformidade Validações implementadas: - validate_name(): não vazio, único, caracteres válidos - validate_focus(): descrição mínima de 10 caracteres - validate_weight(): entre 0.0 e 2.0 - validate_output(): query não vazia, formato válido Testes de conformidade: - Thread safety (Send + Sync) - Determinismo (mesma entrada = mesma saída) - Robustez (não pânico com entrada vazia/longa/especial) - is_applicable seguro - prompt_description não vazio Testes: 18 novos testes, 65 total no módulo personas
## Visão Geral
Implementação completa de um sistema de interação bidirecional entre
o usuário e o DeepResearchAgent, compatível com OpenAI Responses API.
O sistema suporta dois modos:
- **Blocking**: Agente pausa para perguntas críticas (clarificação, confirmação)
- **Async**: Usuário pode enviar mensagens a qualquer momento
## Novos Arquivos
### src/agent/interaction.rs (618 linhas)
Hub central de interação usuário-agente:
- `QuestionType`: Enum com tipos de pergunta (Clarification, Confirmation, Preference, Suggestion)
- `PendingQuestion`: Estrutura para perguntas pendentes com UUID, tipo, texto, opções e flag blocking
- `UserResponse`: Resposta do usuário com question_id opcional, conteúdo e timestamp
- `InteractionHub`: Gerencia filas de perguntas pendentes e respostas via canais MPSC
- `create_interaction_channels()`: Helper para criar canais de comunicação
- Suporte a formato OpenAI Responses API (input_required state)
- 6 testes unitários incluídos
### src/agent/chatbot.rs (482 linhas)
Interface para integração com plataformas de chat (DigiSac, Suri, Parrachos):
- `ChatbotAdapter` trait async com métodos:
- `send_message()`: Envia mensagem para usuário
- `ask_user()`: Pergunta blocking e aguarda resposta
- `send_options()`: Envia opções para escolha
- `try_receive()`: Verifica mensagens sem bloquear
- `receive_message()`: Aguarda mensagem com timeout
- `RichMessage`: Mensagens formatadas com título, texto e botões
- `MessageButton`: Botões de resposta rápida ou URL
- `UserMetadata`: Metadados do usuário (id, platform, name, phone)
- `ChatbotError`: Enum de erros específicos
- `MockChatbotAdapter`: Implementação para testes
- 3 testes unitários incluídos
### src/agent/sandbox.rs (591 linhas)
Sandbox JavaScript seguro para execução de código:
- Baseado em boa_engine (ECMAScript interpreter)
- `JsSandbox`: Ambiente isolado com timeout e limite de memória
- `SandboxContext`: Contexto com variáveis do conhecimento do agente
- `SandboxResult`: Resultado tipado (String, Number, Boolean, Array, Object, Null)
- Suporte a JSON.parse/stringify nativos
- Tratamento de erros de sintaxe e runtime
- 10 testes unitários incluídos
## Arquivos Modificados
### src/agent/actions.rs (+126 linhas)
Nova action `AskUser`:
- `question_type`: QuestionType (Clarification, Confirmation, Preference, Suggestion)
- `question`: Texto da pergunta
- `options`: Opções de resposta (para Preference)
- `is_blocking`: Se deve pausar até resposta
- `think`: Raciocínio do agente
- Atualizado `action_name()` e `is_terminal()` para nova action
### src/agent/state.rs (+57 linhas)
Novo estado `InputRequired`:
- Compatível com OpenAI Responses API
- Campos: question_id (Uuid), question (String), question_type (QuestionType), options
- Novo método `is_waiting_for_user()` para verificar estado
- Atualizado `is_terminal()` para não considerar InputRequired como terminal
### src/agent/mod.rs (+412 linhas)
Integração completa do sistema de interação:
- Campo `interaction_hub: InteractionHub` no agente
- Campo `user_response_tx: Option<Sender<UserResponse>>` para canal externo
- `with_interaction_channels()`: Builder para configurar canais
- `execute_ask_user()`: Executa pergunta ao usuário
- Se blocking: Emite AgentQuestion, adiciona ao hub, muda estado para InputRequired
- Se async: Adiciona ao knowledge e continua
- `process_user_response()`: Processa resposta recebida
- Adiciona ao knowledge como UserProvided
- Marca pergunta como respondida no hub
- Retoma execução se estava em InputRequired
- `poll_user_messages()`: Verifica mensagens async no início de cada step
- Novos eventos AgentProgress:
- `AgentQuestion`: Pergunta para o usuário
- `UserResponseReceived`: Resposta recebida
- `ResumedAfterInput`: Execução retomada
### src/agent/permissions.rs (+27 linhas)
Nova permissão `AskUser`:
- Adicionado ao enum `AgentActionType`
- Métodos `with_ask_user()` e `without_ask_user()`
- Habilitado por padrão em todas as presets
### src/agent/agent_analyzer.rs (+32 linhas)
Suporte ao LLM para gerar AskUser:
- Documentação da action AskUser no system prompt
- Exemplos de uso para Clarification, Confirmation, Preference
### src/llm.rs (+219 linhas)
Melhorias gerais no cliente LLM:
- Suporte a novos modelos
- Melhor tratamento de erros
### src/main.rs (+118 linhas)
Conexão dos canais de interação na TUI:
- `user_response_tx: Option<Sender<UserResponse>>` no escopo do run_tui_mode
- Criação de canais ao iniciar pesquisa
- Bridge task que conecta TUI → InteractionHub do agente
- Tratamento de Enter e Esc na tela InputRequired
- Re-criação de canais ao iniciar nova pesquisa
### src/tui/app.rs (+69 linhas)
Suporte à interação na TUI:
- `AppScreen::InputRequired`: Nova tela com question_id, question, options
- `AppEvent::AgentQuestion`: Evento quando agente faz pergunta
- `AppEvent::UserResponse`: Evento quando usuário responde
- `handle_event()` atualizado para novos eventos
### src/tui/ui.rs (+121 linhas)
Renderização da tela de pergunta:
- `render_input_required_screen()`: Renderiza pergunta e input
- Mostra tipo da pergunta, texto, opções (se houver)
- Campo de input para resposta
- Instruções de uso (Enter para enviar, Esc para cancelar)
### src/tui/runner.rs (+46 linhas)
Loop de eventos para InputRequired:
- Captura input do usuário na tela de pergunta
- Suporte a edição de texto (backspace, delete, arrows)
- Envio de resposta via Enter
- Cancelamento via Esc
### src/tui/agent_adapter.rs (+1 linha)
Mapeamento de novos eventos AgentProgress para AppEvent
### Cargo.toml (+3 linhas)
Novas dependências:
- `boa_engine`: Interpretador JavaScript para sandbox
- `uuid`: Identificadores únicos para perguntas
## Fluxo de Execução
### Pergunta Blocking
1. LLM retorna AgentAction::AskUser { is_blocking: true }
2. Agente emite AgentProgress::AgentQuestion
3. Agente muda estado para InputRequired
4. TUI mostra tela de input com a pergunta
5. Usuário digita resposta e pressiona Enter
6. Resposta enviada via canal para InteractionHub
7. process_user_response() adiciona ao knowledge
8. Agente retoma execução automaticamente
### Input Async
1. Usuário envia mensagem durante pesquisa
2. Mensagem entra na fila via canal
3. poll_user_messages() processa no próximo step
4. Adicionado ao knowledge como UserProvided
5. LLM vê novo contexto e ajusta ações
## Testes
150 testes passando, incluindo:
- interaction::tests::test_interaction_hub_basic
- interaction::tests::test_pending_question_builders
- interaction::tests::test_user_response_affirmative
- interaction::tests::test_openai_format
- chatbot::tests::test_mock_adapter
- chatbot::tests::test_rich_message
- chatbot::tests::test_user_metadata
- sandbox::tests::test_simple_execution
- sandbox::tests::test_context_variables
- sandbox::tests::test_syntax_error
## Compatibilidade OpenAI Responses API
O estado InputRequired mapeia para:
```json
{
"status": "input_required",
"pending_input": {
"type": "clarification",
"question": "Qual é a cidade de origem?",
"options": null
}
}
```
## Preparação para Integração com Chatbots
A trait ChatbotAdapter permite implementações futuras para:
- DigiSac: Usar crate existente para enviar/receber mensagens
- Suri (tlw_irus): Integrar com API de mensagens
- Parrachos: Webhook/callback para UI web
## Novas Funcionalidades ### Sandbox Multilinguagem - Adiciona `SandboxLanguage` enum (JavaScript, Python, Auto) - Implementa `PythonSandbox` com execução via subprocess - Cria `UnifiedSandbox` que escolhe automaticamente a melhor linguagem - LLM pode decidir entre JS e Python baseado no problema - Heurísticas inteligentes para escolha de linguagem - Suporte a timeout configurável (10s para Python) ### Ação Coding Atualizada - Campo `language` opcional na ação CODING - Opções: "javascript", "python", "auto" (padrão) - DiaryEntry::Coding agora inclui linguagem usada - TUI mostra emoji da linguagem (🐍 Python, 📜 JavaScript) ### Correções de Bugs - **CRÍTICO**: Corrige travamento após responder pergunta na TUI - Mudança de `break` para `continue` no estado InputRequired - Agente agora aguarda resposta via canal corretamente - Adiciona `poll_user_messages()` no início de cada step - Timeout de 120s no cliente HTTP para evitar travamentos ### Melhorias na TUI - Painel de Sandbox mostra linguagem sendo usada - Emojis específicos para cada linguagem - Eventos de progresso incluem campo `language` ### Benchmarks Atualizados - Novos benchmarks para sistema de interação - Benchmarks para SandboxContext e SandboxLanguage - Benchmarks para estado InputRequired - Correção do AgentAction::Coding com campo language ### Documentação - README atualizado com seção de sandbox multilinguagem - Exemplos de uso com diferentes linguagens - Layout da TUI com painel de sandbox ativo ## Arquivos Modificados - src/agent/sandbox.rs: +471 linhas (PythonSandbox, UnifiedSandbox) - src/agent/mod.rs: +225 linhas (execute_coding, correções) - src/llm.rs: +299 linhas (generate_python_code, choose_coding_language) - src/tui/app.rs: +205 linhas (SandboxState com language) - src/tui/ui.rs: +335 linhas (render_sandbox com linguagem) - benches/agent_bench.rs: +253 linhas (novos benchmarks)
- Implementa navegação por tabs (Pesquisa/Configurações) - Adiciona tela de Config exibindo runtime, LLM e agent settings - Permite alternar Result ↔ Research com tecla 'r' - Adiciona campo de input para follow-up na tela de resultado - Salva histórico de execuções do sandbox na sessão - Atualiza README com documentação das novas funcionalidades Teclas: 1/2 para tabs, Tab para focar input, r para alternar telas
…sonas-busca-avaliacao
Merge da branch tools-rs com novas funcionalidades: Novos recursos adicionados: - sandbox.rs: Execução segura JS/Python multilinguagem - interaction.rs: Sistema de perguntas usuário↔agente - chatbot.rs: Integração DigiSac, Suri, Parrachos - history.rs: Histórico de conversas - config.rs: Configuração via .env (OpenAI/Anthropic/Local) - agent_analyzer.rs: Análise de agente - build_ref.rs: Construção de referências - segment.rs: Segmentação de texto Melhorias na UI: - Sistema de Tabs (Pesquisa / Configurações) - Tela InputRequired para perguntas blocking - Visual melhorado com logs em tempo real Nosso trabalho preservado: - Fase 1: metrics.rs, registry.rs, validator.rs (65 testes) - Fase 2.1: search_trace.rs (15 testes) Total: 80 testes passando
Adiciona sistema completo de observabilidade para operações de busca. Fase 2.1 - SearchTrace (15 testes): - QueryOrigin: rastrear origem (User, Persona, Reflection, etc) - SearchTrace: trace individual com timestamps e métricas - SearchTraceCollector: agregador de traces por execução - Relatórios por origem e métricas agregadas Fase 2.2 - SearchMetrics (17 testes): - Latências: p50, p95, p99, min, max, avg - Taxa de sucesso e resultados por query - Cache hit/miss rate - Bytes por segundo (throughput) - MetricsCollector: coletor global thread-safe - MetricsSnapshot: snapshots para comparação - LatencyTimer: timer de latência Fase 2.3 - SearchCache (21 testes): - Cache genérico thread-safe com RwLock - TTL configurável por entrada - Eviction LRU quando cache cheio - Auto-cleanup de entradas expiradas - Integração com SearchMetrics - Presets: short_lived, long_lived, for_tests Total: 53 testes passando
…aliação Adiciona sistema completo de observabilidade para operações de avaliação. Fase 3.1 - EvaluationTrace (17 testes): - EvaluationTrace: trace individual com métricas - EvaluationReport: relatório agregado por execução - EvaluationTraceCollector: coletor global de traces - CollectorStats: estatísticas agregadas - Hash de resposta por privacidade (não loga resposta inteira) Fase 3.2 - Determiner (25 testes): - determine_required_evaluations(): determinação automática sem LLM - analyze_question(): análise detalhada com reasoning - Regras baseadas em keywords para cada tipo: * Definitive: quase sempre (exceto paradoxos) * Freshness: termos temporais (current, latest, 2025) * Plurality: múltiplos itens (5 examples, list, top) * Completeness: elementos nomeados (Compare X and Y, both) - Portado de src/tools/evaluator.ts do TypeScript Total: 49 testes passando no módulo evaluation
🎯 FASE 1 - OBSERVABILIDADE DE PERSONAS - PersonaExecutionMetrics: mede tempo e recursos de cada persona - PersonaRegistry: permite ativar/desativar personas via JSON - PersonaValidator: garante que novas personas sigam as regras 🔍 FASE 2 - OBSERVABILIDADE DE BUSCA - SearchTrace: registra cada busca (API, tempo, resultados) - SearchMetrics: calcula latência p50/p95/p99, taxa de sucesso - SearchCache: guarda resultados recentes (economia de API) ✅ FASE 3 - OBSERVABILIDADE DE AVALIAÇÃO - EvaluationTrace: registra cada avaliação (passou/falhou, tokens) - EvaluationDeterminer: decide tipos sem chamar LLM - prompts.rs: 5 prompts organizados e testados 📊 SISTEMA DE EVIDÊNCIAS - SearchEvidenceReport: relatório completo de buscas - EvaluationEvidenceReport: relatório de avaliações 🧪 TESTES - 353 testes unitários - 6 testes de integração - Benchmarks de performance 📈 RESULTADOS - Rust é 1.785x a 312.000x mais rápido que TypeScript - Cache pode economizar até 40% de chamadas à API - 359 testes passando (100%)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🚀 Pull Request: Sistema de Observabilidade Completo para DeepResearch AI
📋 Resumo
Este PR implementa observabilidade completa para o DeepResearch AI em Rust, permitindo entender exatamente o que o sistema está fazendo em cada etapa: desde a expansão de perguntas pelas "personas", passando pelas buscas na web, até a avaliação final das respostas.
Em poucas palavras: Agora conseguimos "ver por dentro" como o agente de pesquisa funciona, medir performance, e ter dados para melhorar o sistema.
🎯 O Problema que Resolvemos
Antes deste PR, o sistema funcionava como uma "caixa preta":
Agora temos visibilidade total! ✅
🔧 O Que Foi Implementado
1️⃣ Observabilidade de Personas (Fase 1)
O que são personas? São 7 "personalidades" diferentes que analisam a mesma pergunta de ângulos distintos (cético, acadêmico, comparativo, etc).
O que fizemos:
PersonaExecutionMetricsPersonaRegistryPersonaValidatorExemplo prático: Agora sabemos que a persona "Skeptic" leva ~28µs para expandir uma query.
2️⃣ Observabilidade de Busca (Fase 2)
O que é a busca? É quando o sistema vai na internet procurar informações para responder a pergunta.
O que fizemos:
SearchTraceSearchMetricsSearchCacheBenefício real: O cache pode economizar até 40% das chamadas à API = menos custo 💰
3️⃣ Observabilidade de Avaliação (Fase 3)
O que é a avaliação? Depois de gerar uma resposta, o sistema verifica se ela é boa o suficiente.
O que fizemos:
EvaluationTraceEvaluationDeterminerprompts.rsBenefício real: O
EvaluationDeterminerevita chamadas desnecessárias ao LLM = economia de tokens 💰4️⃣ Sistema de Evidências
Para que serve? Gerar relatórios completos de cada execução.
O que fizemos:
SearchEvidenceReportEvaluationEvidenceReportExemplo de uso: Se uma pesquisa deu errado, o relatório mostra exatamente onde falhou.
📊 Resultados dos Testes
Todos os Testes Passando ✅
Performance Comparada (Rust vs TypeScript)
Conclusão: A implementação Rust é milhares de vezes mais rápida.
📁 Arquivos Criados/Modificados
Novos Arquivos (14)
Arquivos Modificados (5)
🧪 Testes de Integração
Criamos 6 testes que validam o fluxo completo:
test_persona_to_searchtest_search_to_evaltest_full_pipelinetest_early_failtest_persona_uniquenesstest_eval_type_selection📈 Benchmarks Disponíveis
Para rodar os benchmarks de performance:
🔄 Como Testar Este PR
📝 Commits Realizados
✅ Checklist de Revisão
🎉 Benefícios para o Projeto
🤝 Próximos Passos Sugeridos
Autor: Leonardo André
Branch:
feat/pessoa-2-personas-busca-avaliacaoBase:
mainNote
Implements full observability (traces/metrics/evidence), search caching, rich evaluation prompts, personas registry/metrics, enhanced LLM/runtime and a new TUI, plus utilities, reader comparison, and integration tests.
search_trace,search_metrics, andsearch_cachefor tracing, metrics, and caching of searches.evaluation/traceandevidence/{search,evaluation}_evidence.rsfor per-step traces and execution reports.prompts.rs(port from TS) with builder and constants; re-export inevaluation/mod.rs.metrics.rs,registry.rs,validator.rs; extendQueryContextwithexecution_id.OpenAiClient(config-based ctor, token accounting, codegen JS/Python, language choice).main.rs: config loading, launcher, and TUI mode.tui/{app,ui,runner,agent_adapter}.rsfor interactive UI (logs, tasks, stats, follow-ups, benchmarks).utils/{file_reader,segment,build_ref,timing}.rsfor file parsing, chunking, semantic refs, timing.reader_comparison.rs(Jina vs Rust+OpenAI) and related search client methods.lib.rsto expose new modules and configs.tests/integration_tests.rscovering personas→search, search→eval, full pipeline, early-fail, uniqueness, eval selection.Written by Cursor Bugbot for commit 0656410. This will update automatically on new commits. Configure here.