Saltar a contenido

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:

  1. El resumen automático de historial NO funciona - Se desperdician tokens
  2. La caja de texto de memorias es muy pequeña - Mala UX
  3. 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:

  1. Inyectar IHistoryManagerService en el constructor
  2. Reemplazar la construcción directa del historial con GetOptimizedHistoryAsync()
  3. 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:

  1. Agregar Lines="4" para altura inicial
  2. Agregar AutoGrow="true" para expansión automática
  3. 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

  1. Corregir la documentación para reflejar la arquitectura real
  2. Resolver el problema 1 para activar la optimización existente
  3. 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 build compila sin errores
  • [ ] dotnet test pasa 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

  1. NO crear nuevas clases - La lógica ya existe en HistoryManagerService
  2. Mantener backwards compatibility - Los cambios no deben romper funcionalidad existente
  3. Agregar logging extensivo - Para poder monitorear la optimización en producción
  4. Probar en desarrollo primero - Con sesiones que tengan muchos mensajes