Plan de Remediacion: Optimizacion del Workspace¶
Fecha: 2026-02-01 Estado: COMPLETADO Prioridad: Alta
Resumen Ejecutivo¶
Tras una revision exhaustiva de la documentacion y el codigo fuente, se identificaron tres problemas criticos que afectaban la optimizacion del workspace. TODOS HAN SIDO RESUELTOS:
| Problema | Causa Raiz | Estado |
|---|---|---|
| Resumen de historial no funciona | HistoryManagerService no se usa en DevSessionService |
RESUELTO |
| Caja de texto memorias muy pequena | Falta Lines o AutoGrow en MudTextField |
RESUELTO |
| ContextOptimizer no existe | Documentacion desactualizada - nunca se implemento | RESUELTO |
Cambios Realizados (2026-02-01)¶
- DevSessionService.cs: Ahora usa
IHistoryManagerService.GetOptimizedHistoryAsync() - MemoriesPanel.razor: TextField con
Lines="4" AutoGrow="true" MaxLines="10" - WORKSPACE_COMPLETE_ROADMAP.md: Documentacion actualizada
Problema 1: Resumen Automatico de Historial NO Funciona¶
Diagnostico¶
Archivo afectado: Shared/Shared.Admin/Services/DevSessionService.cs
Lineas: 392-395
// CODIGO ACTUAL - NO USA HistoryManagerService
var history = session.Messages
.Where(m => m.Role == "user" || m.Role == "assistant")
.Select(m => new ChatMessage(m.Role, m.Content))
.ToList();
El problema: El servicio IHistoryManagerService existe y esta completamente implementado en HistoryManagerService.cs, pero NUNCA se inyecta ni se usa en DevSessionService.
Evidencia:
- HistoryManagerService tiene el metodo GetOptimizedHistoryAsync() que:
1. Verifica si el historial excede MaxHistoryMessages (default: 20)
2. Genera un resumen automatico de mensajes antiguos usando Claude Haiku
3. Retorna resumen + mensajes recientes
- DevSessionService construye el historial directamente desde session.Messages sin limitar
Solucion Propuesta¶
Modificar DevSessionService.cs:
-
Inyectar
IHistoryManagerServiceen el constructor: -
Reemplazar lineas 392-395 por:
// 3. Obtener historial optimizado (con resumen si excede limite) var optimizedHistory = await _historyService.GetOptimizedHistoryAsync(sessionId); // Construir historial para el proveedor de IA var history = new List<ChatMessage>(); // Si hay resumen, agregarlo como contexto del sistema if (!string.IsNullOrEmpty(optimizedHistory.Summary)) { history.Add(new ChatMessage("user", $"[Resumen de conversacion anterior]\n{optimizedHistory.Summary}")); history.Add(new ChatMessage("assistant", "Entendido, tengo el contexto de la conversacion anterior.")); } // Agregar mensajes recientes history.AddRange(optimizedHistory.RecentMessages .Where(m => m.Role == "user" || m.Role == "assistant") .Select(m => new ChatMessage(m.Role, m.Content))); _logger.LogInformation( "Session {SessionId}: History optimized - Total={Total}, Summarized={Summarized}, Recent={Recent}, Tokens={Tokens}", sessionId, optimizedHistory.TotalMessageCount, optimizedHistory.SummarizedMessageCount, optimizedHistory.RecentMessages.Count, optimizedHistory.EstimatedTokens); -
Registrar el servicio en
Program.cs(si no esta):
Impacto Esperado¶
- Reduccion de tokens: ~50% en sesiones con >20 mensajes
- Mejor contexto: El resumen mantiene informacion clave sin enviar todo el historial
- Costos reducidos: Menos tokens = menor costo por request
Problema 2: Caja de Texto de Memorias Muy Pequena¶
Diagnostico¶
Archivo afectado: Orchestrator/src/Orchestrator.Admin/Components/Pages/Workspace/MemoriesPanel.razor
Lineas: 51-59
@* CODIGO ACTUAL - TextField de una sola linea *@
<MudTextField @bind-Value="_newMemoryContent"
Placeholder="Anadir una preferencia..."
Variant="Variant.Outlined"
Margin="Margin.Dense"
Adornment="Adornment.End"
AdornmentIcon="@Icons.Material.Filled.Add"
OnAdornmentClick="AddMemory"
Immediate="true"
OnKeyDown="OnKeyDown" />
El problema: El MudTextField no tiene configuracion para multiples lineas, resultando en una caja de texto muy pequena que no permite escribir memorias largas.
Solucion Propuesta¶
Modificar el componente para usar un textarea multilinea:
<MudTextField @bind-Value="_newMemoryContent"
Placeholder="Anadir una preferencia... (ej: Prefiero codigo sin comentarios)"
Variant="Variant.Outlined"
Margin="Margin.Dense"
Lines="3"
AutoGrow="true"
MaxLines="5"
Immediate="true"
OnKeyDown="OnKeyDown"
Class="memory-input" />
@* Boton separado para mejor UX *@
<MudIconButton Icon="@Icons.Material.Filled.Add"
Color="Color.Primary"
OnClick="AddMemory"
Disabled="@string.IsNullOrWhiteSpace(_newMemoryContent)" />
Y actualizar el CSS:
.add-memory-section {
display: flex;
gap: 8px;
align-items: flex-end; /* Cambiar de flex-start a flex-end */
}
.add-memory-section .memory-input {
flex: 1;
min-height: 80px;
}
.add-memory-section .mud-select {
width: 150px;
align-self: flex-start;
}
Impacto Esperado¶
- Mejor UX: Los usuarios pueden escribir memorias descriptivas
- Visibilidad: El texto es visible mientras se escribe
- Funcionalidad: Soporte para Enter (nueva linea) y Ctrl+Enter (enviar)
Problema 3: ContextOptimizer NO Existe - RESUELTO¶
Diagnostico¶
Archivo afectado: docs/features/WORKSPACE_COMPLETE_ROADMAP.md
Linea: 454
# ANTES (incorrecto):
| Tokens por request | -50% | Implementado con ContextOptimizer |
# DESPUES (corregido):
| Tokens por request | -50% | Implementado con IHistoryManagerService.GetOptimizedHistoryAsync() |
El problema original: La documentacion indicaba que existia un ContextOptimizer que reducia tokens en 50%, pero:
1. No existia ninguna clase ContextOptimizer en el codebase
2. No habia implementacion de optimizacion de contexto
3. La reduccion de tokens dependia del HistoryManagerService que no se usaba (Problema 1)
RESOLUCION (2026-02-01):
- Documentacion actualizada para reflejar IHistoryManagerService.GetOptimizedHistoryAsync()
- Problema 1 resuelto: DevSessionService ahora usa IHistoryManagerService
Solucion Propuesta¶
Opcion A (Recomendada): Corregir la documentacion y usar HistoryManagerService
-
Actualizar
WORKSPACE_COMPLETE_ROADMAP.md: -
La integracion del
HistoryManagerService(Problema 1) proporcionara la optimizacion de tokens esperada.
Opcion B (Futura): Crear un ContextOptimizer real
Si se desea una optimizacion mas avanzada:
public interface IContextOptimizer
{
Task<OptimizedContext> OptimizeAsync(
DevSession session,
string currentMessage,
int maxTokens = 100000);
}
public class ContextOptimizer : IContextOptimizer
{
// Estrategias:
// 1. Resumir historial (via HistoryManagerService)
// 2. Comprimir system prompt eliminando ejemplos redundantes
// 3. Filtrar memorias no relevantes al mensaje actual
// 4. Limitar context files a los mas relevantes
}
Impacto Esperado¶
- Documentacion precisa: Refleja el estado real del sistema
- Expectativas claras: Los usuarios saben que funcionalidades existen
Plan de Implementacion¶
Fase 1: Correccion Critica (Inmediata)¶
| Tarea | Archivo | Estimacion |
|---|---|---|
| Integrar HistoryManagerService en DevSessionService | DevSessionService.cs |
30 min |
| Registrar servicio en DI | Program.cs |
5 min |
| Verificar que AutoSummarizeHistory=true por defecto | DevSession.cs |
5 min |
Fase 2: Mejora de UX (Corto plazo)¶
| Tarea | Archivo | Estimacion |
|---|---|---|
| Ampliar caja de texto de memorias | MemoriesPanel.razor |
15 min |
| Ajustar CSS del panel | MemoriesPanel.razor |
10 min |
| Agregar Ctrl+Enter para enviar | MemoriesPanel.razor |
10 min |
Fase 3: Documentacion (Corto plazo)¶
| Tarea | Archivo | Estimacion |
|---|---|---|
| Actualizar WORKSPACE_COMPLETE_ROADMAP.md | docs/features/ |
15 min |
| Actualizar AUDITORIA-IMPLEMENTACION-WORKSPACE.md | docs/features/ |
15 min |
Verificacion¶
Tests para Problema 1 (Historial)¶
[Fact]
public async Task SendMessage_WithManyMessages_ShouldUseOptimizedHistory()
{
// Arrange: Sesion con 25 mensajes (excede MaxHistoryMessages=20)
var session = CreateSessionWithMessages(25);
// Act
await _service.SendMessageStreamAsync(session.Id, request, ct);
// Assert: Verificar que se llamo a GetOptimizedHistoryAsync
_historyServiceMock.Verify(h => h.GetOptimizedHistoryAsync(session.Id), Times.Once);
}
[Fact]
public async Task OptimizedHistory_ShouldIncludeSummary_WhenExceedsLimit()
{
// Arrange
var session = CreateSessionWithMessages(25);
session.MaxHistoryMessages = 10;
// Act
var result = await _historyService.GetOptimizedHistoryAsync(session.Id);
// Assert
Assert.True(result.WasTruncated);
Assert.NotNull(result.Summary);
Assert.Equal(10, result.RecentMessages.Count);
}
Tests Manuales para Problema 2 (Memorias)¶
- Abrir Workspace > Panel de Memorias
- La caja de texto debe mostrar 3 lineas minimo
- Debe permitir escribir texto largo sin truncar
- Enter debe crear nueva linea
- Ctrl+Enter debe enviar la memoria
Archivos a Modificar¶
| Archivo | Tipo de 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 |
Multiline TextField |
docs/features/WORKSPACE_COMPLETE_ROADMAP.md |
Corregir documentacion |
docs/features/AUDITORIA-IMPLEMENTACION-WORKSPACE.md |
Actualizar estado |
Conclusion¶
Los tres problemas identificados tienen soluciones claras y de bajo riesgo:
- Historial: El codigo ya existe, solo falta conectarlo
- Memorias: Cambio de UI simple con MudBlazor
- Documentacion: Alinear docs con realidad del codigo
La implementacion de estas correcciones deberia resolver el alto consumo de tokens reportado y mejorar significativamente la experiencia de usuario en el Workspace.