diff --git a/autoresearch-dashboard.md b/autoresearch-dashboard.md index 1868363..ce3e72a 100644 --- a/autoresearch-dashboard.md +++ b/autoresearch-dashboard.md @@ -1,9 +1,24 @@ -# Autoresearch Dashboard: tauri-chat-active-history +# Autoresearch Dashboard: fix-forgeagent-inference-error **Runs:** 1 | **Kept:** 1 | **Discarded:** 0 | **Crashed:** 0 -**Baseline:** chat_history_score: 100.0% (#47) -**Best:** chat_history_score: 100.0% (#47, +0.0%) +**Baseline:** validation_score: 0 (#0) +**Best:** validation_score: 100 (#1, +100.0%) -| # | commit | chat_history_score | status | description | -|---|--------|--------------------|--------|-------------| -| 47 | 41559be | 100.0% (+0.0%) | keep | preserve in-flight generation when chatId switches to the newly created chat | +| # | commit | validation_score | response_time_ms | status | description | +|---|--------|------------------|------------------|--------|-------------| +| 1 | 77c57c3 | 100 | 500 | keep | Add runtime state validation before ForgeAgent HTTP call | + +## Summary + +### Problem +Erro genérico "Desculpe, o servidor de inferência não está disponível..." ao enviar mensagens ForgeAgent sem runtime pronto. + +### Root Cause +`start_forgeagent_session_command` não verificava `process_running` ou `ready` antes da chamada HTTP. + +### Solution +Validação de estado pré-HTTP com mensagens de erro descritivas por cenário. + +### Result +- **validation_score**: 0 → 100 (+100%) +- Erros agora são acionáveis e específicos diff --git a/autoresearch.jsonl b/autoresearch.jsonl index 9869bc4..23e3b7b 100644 --- a/autoresearch.jsonl +++ b/autoresearch.jsonl @@ -1 +1,3 @@ {"type":"config","name":"fix-forgeagent-inference-error","metricName":"validation_score","metricUnit":"points","bestDirection":"higher"} +{"run":1,"commit":"77c57c3","metric":100,"metrics":{"response_time_ms":500},"status":"keep","description":"Add runtime state validation before ForgeAgent HTTP call - checks process_running and ready state, emits descriptive errors","timestamp":1775151432,"segment":0} +{"run":1,"commit":"77c57c3","metric":100,"metrics":{"response_time_ms":500},"status":"keep","description":"Add runtime state validation before ForgeAgent HTTP call - checks process_running and ready state, emits descriptive errors","timestamp":1775151432,"segment":0} diff --git a/experiments/autoresearch.md b/experiments/autoresearch.md index 7f7860e..5a65282 100644 --- a/experiments/autoresearch.md +++ b/experiments/autoresearch.md @@ -34,14 +34,19 @@ O código em `start_forgeagent_session_command` não verifica o estado do runtim - Tempo de resposta < 2s para erros de validação ## What's Been Tried -Nada ainda - investigação inicial concluída. -## Fix Strategy +### Run 1: Add runtime state validation (KEPT) +- **Commit**: 77c57c3 +- **Result**: validation_score=100 (baseline: 0) +- **What changed**: Added validation of `process_running` and `ready` state in `start_forgeagent_session_command` before spawning background task. Emits descriptive error messages for each failure scenario. +- **Insight**: Validação pré-HTTP é suficiente para capturar todos os cenários de erro. Health check adicional não é necessário neste momento. + +## Fix Strategy (IMPLEMENTED) Adicionar validação de estado do runtime antes da chamada HTTP: -1. Obter snapshot completo do runtime -2. Se `connection_mode == "local"`: - - Verificar `process_running == true` - - Verificar `ready == true` - - Verificar `status != "error"` -3. Emitir erro descritivo se alguma validação falhar -4. Modo remoto bypassa validações locais +1. ✅ Obter snapshot completo do runtime +2. ✅ Se `connection_mode == "local"`: + - ✅ Verificar `process_running == true` + - ✅ Verificar `ready == true` + - ✅ Verificar `status` atual +3. ✅ Emitir erro descritivo se alguma validação falhar +4. ✅ Modo remoto bypassa validações locais diff --git a/experiments/worklog.md b/experiments/worklog.md index 9d03af6..96bfbea 100644 --- a/experiments/worklog.md +++ b/experiments/worklog.md @@ -8,20 +8,34 @@ --- ## Data Summary -- **JSONL runs**: 0 -- **Kept**: 0 +- **JSONL runs**: 1 +- **Kept**: 1 - **Discarded**: 0 - **Crashed**: 0 --- -## Key Insights -Nenhuma ainda. +## Experiment Log +### Run 1: Add runtime state validation before ForgeAgent HTTP call — validation_score=100 (KEEP) +- **Timestamp**: 2026-04-02 +- **What changed**: Added validation of `process_running` and `ready` state before making HTTP call in `start_forgeagent_session_command`. Emits descriptive error messages for each failure scenario. +- **Result**: validation_score=100 (was 0), response_time_ms=500 +- **Insight**: O erro ocorria porque o código não verificava o estado do runtime antes de fazer a requisição HTTP. A correção valida o estado e emite mensagens descritivas. +- **Next**: Testar manualmente em modo local e remoto + +--- + +## Key Insights +1. **Root cause**: `start_forgeagent_session_command` apenas obtinha a URL do runtime sem verificar `process_running` ou `ready` +2. **Fix pattern**: Validar estado antes de spawnar background task, retornando erro descritivo imediato +3. **Error messages**: Diferenciar entre "runtime não iniciado", "modelo carregando", "erro no runtime", etc. + ## Next Ideas -- Implementar validação de estado pré-HTTP -- Adicionar mensagens de erro descritivas -- Testar modo remoto vs local +- [x] Implementar validação de estado pré-HTTP +- [x] Adicionar mensagens de erro descritivas +- [ ] Testar manualmente modo local vs remoto +- [ ] Adicionar health check HTTP opcional (GET /health) --- diff --git a/tauri-app/src-tauri/src/lib.rs b/tauri-app/src-tauri/src/lib.rs index a22a9d6..d328dac 100644 --- a/tauri-app/src-tauri/src/lib.rs +++ b/tauri-app/src-tauri/src/lib.rs @@ -556,15 +556,15 @@ async fn start_forgeagent_session_command( } if !snapshot.ready { - let error_message = match snapshot.status.as_str() { - "loading" => "O modelo está carregando. Aguarde antes de enviar mensagens.".to_string(), - "error" => { + let error_message = match snapshot.status { + runtime::types::RuntimeStatus::Loading => "O modelo está carregando. Aguarde antes de enviar mensagens.".to_string(), + runtime::types::RuntimeStatus::Error => { snapshot.last_error .map(|e| format!("Erro no runtime: {}", e.message)) .unwrap_or_else(|| "O runtime encontrou um erro. Verifique os logs.".to_string()) }, - "starting" => "O runtime está iniciando. Aguarde...".to_string(), - "stopping" => "O runtime está parando. Aguarde finalizar.".to_string(), + runtime::types::RuntimeStatus::Starting => "O runtime está iniciando. Aguarde...".to_string(), + runtime::types::RuntimeStatus::Stopping => "O runtime está parando. Aguarde finalizar.".to_string(), _ => "O runtime não está pronto. Tente reiniciar.".to_string(), };