Plan de Corrección: Optimización de Workspace y Tokens¶
Resumen Ejecutivo¶
Este documento contiene un plan detallado para corregir tres problemas críticos identificados en el Workspace de Calmia Nexus:
- El resumen automático de historial NO funciona - Se desperdician tokens
- La caja de texto de memorias es muy pequeña - Mala UX
- El ContextOptimizer documentado NO existe - Documentación desactualizada
Problema 1: Resumen de Historial NO Funciona¶
Diagnóstico¶
Causa raíz identificada:
- DevSessionService.cs:392-395 construye el historial directamente desde session.Messages
- NUNCA llama a IHistoryManagerService.GetOptimizedHistoryAsync()
- El HistoryManagerService existe y tiene toda la lógica implementada, pero no se usa
Código problemático actual:
// DevSessionService.cs líneas 392-395
var historyMessages = session.Messages
.OrderBy(m => m.SentAt)
.Select(m => new { role = m.Role, content = m.Content })
.ToList();
Solución¶
Archivo a modificar: Shared/Shared.Admin/Services/DevSessionService.cs
Cambios requeridos:
- Inyectar
IHistoryManagerServiceen el constructor - Reemplazar la construcción directa del historial con
GetOptimizedHistoryAsync() - Agregar logging para monitorear la optimización
Problema 2: Caja de Texto de Memorias Muy Pequeña¶
Diagnóstico¶
Causa raíz identificada:
- MemoriesPanel.razor:51-59 usa MudTextField sin configurar Lines ni AutoGrow
- El componente renderiza como input de una sola línea
Código problemático actual:
<MudTextField @bind-Value="_newMemoryContent"
Label="Nueva memoria"
Variant="Variant.Outlined"
FullWidth="true"
Class="mb-2" />
Solución¶
Archivo a modificar: Orchestrator/src/Orchestrator.Admin/Components/Pages/Workspace/MemoriesPanel.razor
Cambios requeridos:
- Agregar
Lines="4"para altura inicial - Agregar
AutoGrow="true"para expansión automática - Agregar
MaxLines="10"para limitar crecimiento excesivo
Problema 3: ContextOptimizer NO Existe¶
Diagnóstico¶
Causa raíz identificada:
- La documentación WORKSPACE_COMPLETE_ROADMAP.md:454 menciona un "ContextOptimizer"
- Esta clase nunca fue implementada
- La optimización real debe venir del HistoryManagerService (problema 1)
Solución¶
- Corregir la documentación para reflejar la arquitectura real
- Resolver el problema 1 para activar la optimización existente
- Actualizar el roadmap con el estado correcto de features
Plan de Implementación Detallado¶
Fase 1: Corregir DevSessionService (Prioridad CRÍTICA)¶
Duración estimada: 30-45 minutos
Paso 1.1: Inyectar IHistoryManagerService¶
// En el constructor de DevSessionService
private readonly IHistoryManagerService _historyManager;
public DevSessionService(
NexusDbContext db,
ILogger<DevSessionService> logger,
ICopilotService copilotService,
IHistoryManagerService historyManager, // AGREGAR
// ... otros parámetros
)
{
_historyManager = historyManager;
// ...
}
Paso 1.2: Registrar servicio en DI (si no está)¶
// En Program.cs de Orchestrator.Api y/o Orchestrator.Admin
services.AddScoped<IHistoryManagerService, HistoryManagerService>();
Paso 1.3: Usar historial optimizado¶
Reemplazar el código actual (líneas ~392-395) con:
// ANTES (líneas 392-395):
var historyMessages = session.Messages
.OrderBy(m => m.SentAt)
.Select(m => new { role = m.Role, content = m.Content })
.ToList();
// DESPUÉS:
var optimizedHistory = await _historyManager.GetOptimizedHistoryAsync(
session.Id,
maxTokens: 50000, // Configurar según necesidad
preserveRecentCount: 10
);
var historyMessages = optimizedHistory
.Select(m => new { role = m.Role, content = m.Content })
.ToList();
_logger.LogInformation(
"Historial optimizado: {Original} -> {Optimizado} mensajes para sesión {SessionId}",
session.Messages.Count,
historyMessages.Count,
session.Id
);
Paso 1.4: Agregar configuración¶
En appsettings.json:
{
"HistoryOptimization": {
"MaxTokensPerRequest": 50000,
"PreserveRecentMessages": 10,
"SummarizeThreshold": 15,
"EnableAutoSummarize": true
}
}
Fase 2: Corregir MemoriesPanel (Prioridad MEDIA)¶
Duración estimada: 10-15 minutos
Paso 2.1: Modificar el MudTextField¶
<!-- ANTES -->
<MudTextField @bind-Value="_newMemoryContent"
Label="Nueva memoria"
Variant="Variant.Outlined"
FullWidth="true"
Class="mb-2" />
<!-- DESPUÉS -->
<MudTextField @bind-Value="_newMemoryContent"
Label="Nueva memoria"
Variant="Variant.Outlined"
FullWidth="true"
Lines="4"
AutoGrow="true"
MaxLines="10"
Placeholder="Escribe una memoria para el copiloto..."
HelperText="Las memorias ayudan al copiloto a recordar contexto importante"
Class="mb-2" />
Fase 3: Actualizar Documentación (Prioridad BAJA)¶
Duración estimada: 15-20 minutos
Paso 3.1: Actualizar WORKSPACE_COMPLETE_ROADMAP.md¶
Cambiar la sección de "ContextOptimizer" para reflejar que:
- La optimización se realiza mediante HistoryManagerService
- El resumen automático usa AutoSummarizeHistory del enum
- No existe una clase separada "ContextOptimizer"
Paso 3.2: Actualizar AUDITORIA-IMPLEMENTACION-WORKSPACE.md¶
Marcar como completadas las correcciones realizadas.
Tests a Implementar¶
Test 1: Verificar optimización de historial¶
[Fact]
public async Task GetOptimizedHistory_ShouldReduceMessageCount_WhenOverThreshold()
{
// Arrange
var sessionId = Guid.NewGuid();
var messages = Enumerable.Range(1, 20)
.Select(i => new DevSessionMessage
{
Role = i % 2 == 0 ? "user" : "assistant",
Content = $"Mensaje de prueba {i} con contenido extenso...",
SentAt = DateTime.UtcNow.AddMinutes(-20 + i)
})
.ToList();
// Act
var optimized = await _historyManager.GetOptimizedHistoryAsync(
sessionId,
maxTokens: 5000,
preserveRecentCount: 5
);
// Assert
Assert.True(optimized.Count <= 15); // Debería haber resumido
Assert.Equal(5, optimized.TakeLast(5).Count()); // Últimos 5 intactos
}
Test 2: Verificar que DevSessionService usa historial optimizado¶
[Fact]
public async Task ProcessMessage_ShouldUseOptimizedHistory()
{
// Arrange
var mockHistoryManager = new Mock<IHistoryManagerService>();
mockHistoryManager
.Setup(x => x.GetOptimizedHistoryAsync(It.IsAny<Guid>(), It.IsAny<int>(), It.IsAny<int>()))
.ReturnsAsync(new List<DevSessionMessage>());
// Act
await _service.ProcessMessageAsync(sessionId, "test message");
// Assert
mockHistoryManager.Verify(
x => x.GetOptimizedHistoryAsync(sessionId, It.IsAny<int>(), It.IsAny<int>()),
Times.Once
);
}
Verificación Post-Implementación¶
Checklist de Verificación¶
- [ ]
dotnet buildcompila sin errores - [ ]
dotnet testpasa todas las pruebas - [ ] El historial se optimiza (verificar logs)
- [ ] La caja de memorias es multi-línea
- [ ] El copiloto consume menos tokens por sesión
- [ ] Documentación actualizada
Métricas a Monitorear¶
| Métrica | Antes | Después (Esperado) |
|---|---|---|
| Tokens por solicitud | ~100K+ | ~50K |
| Mensajes en historial | Todos | 10-15 optimizados |
| Altura caja memorias | 1 línea | 4+ líneas |
Archivos Modificados (Resumen)¶
| Archivo | Cambio |
|---|---|
Shared/Shared.Admin/Services/DevSessionService.cs |
Inyectar y usar IHistoryManagerService |
Orchestrator/src/Orchestrator.Api/Program.cs |
Registrar IHistoryManagerService (si falta) |
Orchestrator/src/Orchestrator.Admin/Components/Pages/Workspace/MemoriesPanel.razor |
Agregar Lines, AutoGrow, MaxLines |
docs/features/WORKSPACE_COMPLETE_ROADMAP.md |
Actualizar estado de features |
docs/features/AUDITORIA-IMPLEMENTACION-WORKSPACE.md |
Marcar correcciones |
appsettings.json (múltiples) |
Agregar configuración HistoryOptimization |
Notas Importantes¶
- NO crear nuevas clases - La lógica ya existe en
HistoryManagerService - Mantener backwards compatibility - Los cambios no deben romper funcionalidad existente
- Agregar logging extensivo - Para poder monitorear la optimización en producción
- Probar en desarrollo primero - Con sesiones que tengan muchos mensajes