sgcWebSockets 2026.10

· Versiones
sgcWebSockets 2026.10

Ya está disponible sgcWebSockets 2026.10. Tres hilos recorren esta versión: sgcHTML ha crecido con las partes que necesita una aplicación web de negocio y que ya no tendrás que escribir a mano, la criptografía se ha vuelto poscuántica sin añadir ni una sola librería externa, y un nuevo conjunto de componentes de autenticación Enterprise se hace cargo de la pantalla de inicio de sesión.

Aplicaciones web: la parte aburrida, hecha

Sesiones, inicio de sesión y CSRF. El nuevo componente TsgcHTMLAuth y sus almacenes de sesión guardan la cookie, responden a las peticiones de inicio y cierre de sesión, cierran las sesiones inactivas y limitan los intentos de inicio de sesión fallidos. El token CSRF viaja en una etiqueta meta, htmx lo añade a cada petición por su cuenta, y el servidor rechaza cualquier envío que no lo incluya.

FAuth := TsgcHTMLAuth.Create(Self);
FAuth.SessionStore := TsgcHTMLSessionStore_Memory.Create(Self);
FAuth.CookieName := 'app_session';
FEngine.Auth := FAuth;

Rutas que se leen como rutas. Parámetros de ruta, un filtro de métodos, y acceso a las cabeceras, las cookies y el cuerpo:

with FRouter.Routes.Add do
begin
  Path := '/customers/{id}/edit';
  Methods := [hrmGet, hrmPost];
  RequireLogin := True;
  RequireRoles := 'admin,sales';
end;

Páginas que se pueden probar. DispatchDirect responde a una petición sin que haya un socket detrás, y una nueva unidad lee el HTML generado, encuentra elementos por id, clase, etiqueta o atributo y compara una página con una copia guardada, de modo que un cambio involuntario en el marcado lo detecta una prueba y no un cliente.

Navegación que se siente como una aplicación. Las páginas cambian sin una recarga completa y conservan la posición de desplazamiento y lo que el usuario estaba escribiendo, con una barra de carga, un diálogo cuando la conexión se pierde y un mensaje cuando una petición falla. Todo ello desactivado de forma predeterminada.

Las cuatro funciones destacadas

Cada una de ellas tiene su propio artículo, enlazado al final, así que aquí solo va lo que es:

Push, de dos maneras

Los server sent events ya pueden transportar las actualizaciones en lugar de un WebSocket, con repetición de lo que se perdió mientras se estaba desconectado, y funciona con el servidor HTTP normal. Web Push llega a un navegador que está cerrado. Junto con ellos llegan una bandeja de notificaciones y una tabla de preferencias, y el componente de notificaciones decide qué canal recibe cada usuario.

Un cliente EventSource para Delphi

El nuevo TsgcSSEClient consume cualquier flujo de Server-Sent Events y viene incluido en todas las ediciones. Se reconecta por sí solo y envía Last-Event-ID, de modo que el servidor retoma donde el stream se detuvo. El campo retry: enviado por el servidor se respeta, OnEvent te entrega el tipo de evento, los datos y el id, y ReconnectOptions añade backoff y jitter. El TLS, el proxy y la autenticación se configuran en OnBeforeConnect, que te entrega el cliente HTTP que usa el componente.

FSSE := TsgcSSEClient.Create(Self);
FSSE.URL := 'https://example.com/events';
FSSE.ReconnectOptions.Backoff := True;
FSSE.ReconnectOptions.MaxInterval := 30000;
FSSE.ReconnectOptions.Jitter := 0.2;
FSSE.OnEvent := DoSSEEvent;
FSSE.Open;

procedure TForm1.DoSSEEvent(Sender: TObject; const aEvent: TsgcSSEEvent);
begin
  Memo1.Lines.Add(aEvent.EventType + ': ' + aEvent.Data);
end;

El parser que hay detrás, TsgcSSEParser, es público. Aliméntalo con los bytes de cualquier text/event-stream en fragmentos de cualquier tamaño, que es exactamente lo que es una respuesta en streaming de un LLM o una respuesta MCP Streamable HTTP.

FParser := TsgcSSEParser.Create;
FParser.OnEvent := DoSSEEvent;
FParser.Feed('event: delta' + #10 + 'data: {"text":"Hel"}' + #10#10);

Una nueva demo, Demos\20.HTTP_Protocol\17.SSE_Client_Component, lo muestra de principio a fin.

IA: respuestas sobre las que se puede actuar

TsgcAIChat puede pedir un JSON que siga un esquema que tú le proporciones, en OpenAI, Anthropic, Gemini, DeepSeek, Ollama, Grok y Mistral, a través del nuevo método ChatJSON, que analiza la respuesta y vuelve a preguntar una vez más adjuntando el error de análisis cuando no se puede leer. El componente de chat también envía y recibe imágenes ahora, y BaseUrl ya lo respetan todos los proveedores y no solo Ollama, así que cualquiera de ellos se puede apuntar a un proxy o a una pasarela local.

Extracción de documentos: de PDF a JSON validado

El nuevo TsgcAIDocumentExtractor toma un PDF o una imagen y un esquema JSON, y devuelve JSON que ha sido comprobado contra ese esquema. OpenAI, Anthropic y Gemini leen el PDF directamente, los demás modelos con visión leen imágenes. Los preajustes incluidos cubren facturas, recibos y documentos de identidad (dpInvoice, dpReceipt, dpIDCard), y cada campo viene con una confianza, así que OnLowConfidence te dice qué valores por debajo de MinConfidence merecen una segunda mirada. Cuando la respuesta no valida, el componente vuelve a preguntar una vez más adjuntando los errores (ValidationRetries).

FExtractor := TsgcAIDocumentExtractor.Create(Self);
FExtractor.AIChat := AIChat1;
FExtractor.Preset := dpInvoice;
FExtractor.MinConfidence := 0.8;
FExtractor.OnLowConfidence := DoLowConfidence;

Memo1.Lines.Text := FExtractor.ExtractFile('invoice.pdf');
if FExtractor.LastResult.FieldConfidence('total') < 0.8 then
  ShowMessage('Check the total by hand');

Enlaza un TsgcAIOCRTesseract, o un TsgcAIOCRWindows que usa el OCR integrado en Windows 10 y versiones posteriores sin nada que instalar, y ajusta OCRMode a domFallback o domAlways, y el texto se reconoce primero de forma local, de modo que incluso un modelo solo de texto que se ejecute en Ollama puede hacer la extracción. Para tus propios prompts, TsgcAIChat incorpora ChatWithDocument, ChatWithDocumentBase64, ChatWithAttachments y ChatJSONWithAttachments, que envían uno o varios archivos, contenidos en una lista TsgcAIChatAttachments, junto con el mensaje.

Un agente de voz que escucha, responde y llama a herramientas

El nuevo TsgcAIVoiceAgent es un único componente que escucha, detecta cuándo el usuario ha terminado su turno, responde con su propia voz y llama a tus herramientas, sobre OpenAI Realtime o Gemini Live. Habla WebSocket, o WebRTC con OpenAI, y funciona en Windows, Android e iOS. Los turnos se detectan mediante VAD de servidor, VAD semántico, un VAD del lado del cliente o a mano (vtdServerVAD, vtdSemanticVAD, vtdClientVAD, vtdManual). Con BargeIn el usuario puede interrumpir, y el agente deja de hablar y trunca su respuesta en el punto donde fue cortada. OnTranscript entrega transcripciones en vivo tanto del usuario como del agente.

FAgent := TsgcAIVoiceAgent.Create(Self);
FAgent.Provider := vapOpenAI;
FAgent.OpenAIOptions.ApiKey := 'sk-...';
FAgent.Instructions := 'You are the shop assistant. Keep answers short.';
FAgent.TurnDetection.Mode := vtdSemanticVAD;
FAgent.BargeIn := True;

oTool := FAgent.Tools.Add;
oTool.Name := 'find_product';
oTool.Description := 'Looks up a product by name';
oTool.Parameters :=
  '{"type":"object","properties":{"name":{"type":"string"}}}';

FAgent.OnTranscript := DoTranscript;
FAgent.OnToolCall := DoToolCall;
FAgent.Start;

procedure TForm1.DoToolCall(Sender: TObject; const aCallId, aName,
  aArguments: string; var aResult: string; var aHandled: Boolean);
begin
  if aName = 'find_product' then
  begin
    aResult := FindProduct(aArguments);
    aHandled := True;
  end;
end;

Las herramientas provienen de OnToolCall, y cuando se asigna un TsgcWSAPI_Client_MCP a MCPClient, las herramientas de ese servidor MCP se ofrecen al modelo automáticamente. Para telefonía, Audio.Format cambia a G.711 mu-law o A-law a 8 kHz (vafG711ULaw, vafG711ALaw). El agente de voz está disponible de Delphi 7 a Delphi 13 y para .NET, y una nueva demo lo convierte en un asistente de voz de tienda sobre un TDataSet.

Criptografía: poscuántica, en Object Pascal

ML-KEM (FIPS 203), ML-DSA (FIPS 204) y SLH-DSA (FIPS 205), encapsulación de claves híbrida X-Wing, certificados X.509 poscuánticos y autoridades de certificación, y JWT firmados con ML-DSA. Todo ello escrito en Object Pascal dentro del paquete sgcCrypto, sin ninguna librería externa, validado contra los vectores de respuesta conocida del NIST.

Sobre eso se apoya un motor TLS 1.3 y TLS 1.2 nativo, también en Pascal puro: un cliente o un servidor habla TLS sin OpenSSL y sin SChannel, negociando los grupos híbridos poscuánticos de la RFC 10024, con ALPN, S N I, certificados de cliente y uso opcional del almacén de confianza del sistema operativo. TLS 1.2 está ahí para los interlocutores que todavía no admiten TLS 1.3, con conjuntos de cifrado AES-GCM y ChaCha20-Poly1305 con confidencialidad directa por defecto, el extended master secret y la protección contra downgrade, y TLSOptions.Version establece la versión mínima permitida. Los grupos híbridos se quedan en TLS 1.3.

El lado clásico se ha reforzado en la misma pasada: RSA en tiempo constante y cegado, multiplicación escalar de curva elíptica en tiempo constante y Ed25519, AES y GHASH sin tablas, claves privadas importadas verificadas contra su mitad pública, y firmas DER no mínimas rechazadas.

Autenticación: el inicio de sesión que todos piden

Un nuevo conjunto de componentes de autenticación responde a las preguntas que todo cliente hace sobre la pantalla de inicio de sesión. Vienen en las ediciones Enterprise y All-Access y en el pack sgcAuth, y los mismos componentes forman parte de sgcWebSockets .NET.

Correcciones que merece la pena mencionar

.NET

La librería .NET mantiene el ritmo: autenticación y sesiones con un puente ClaimsPrincipal para ASP.NET Core, el enrutador, las ayudas de pruebas, la navegación SPA, el transporte SSE con un endpoint nativo, la salida estructurada, la extracción de documentos con los dos motores OCR, el agente de voz en tiempo real, el AI Data Pack, Web Push, MCP Apps, el componente CRUD con sus adaptadores y el nuevo TsgcSSEClient, todo con los mismos nombres de API que en Delphi.

Tag Helpers de Razor para ASP.NET Core. sgcHTML ahora encaja en una aplicación MVC o Razor Pages como lo hacen Telerik UI y DevExpress. Tag Helpers como <sgc-grid>, <sgc-form>, <sgc-autocomplete>, <sgc-dialog> y <sgc-chart>, y sus equivalentes fluidos bajo Html.Sgc(), generan Bootstrap 5 en el servidor y hablan con tus controladores mediante htmx, sin ningún framework de JavaScript. La cuadrícula pagina, ordena, filtra, busca y exporta a XLSX y PDF sobre un IQueryable, de modo que EF Core lo ejecuta todo como SQL:

<sgc-grid name="orders" key="Id" items="Model"
          asp-action="Read" asp-export-action="Export" export="xlsx,pdf"
          page-size="15" sortable="true" filterable="true"
          searchable="true" push-url="true">
    <sgc-column field="Reference" searchable="true" />
    <sgc-column field="Customer" searchable="true" />
    <sgc-column field="OrderDate" title="Date" format="{0:yyyy-MM-dd}" filter="range" />
    <sgc-column field="Total" format="{0:N2}" align="right" filter="range" />
</sgc-grid>

// OrdersController
public IActionResult Read(SgcDataRequest request) => this.SgcGrid(request, Rows());

Los campos se enlazan con asp-for y muestran los errores de ModelState, y this.SgcCloseDialog("edit-order", refresh: "orders") cierra un diálogo de edición y recarga la cuadrícula. Lo que los demás no tienen es el push del servidor: un gráfico con live="true" se redibuja en todos los navegadores abiertos cuando un servicio en segundo plano llama a hub.BroadcastChartAsync(...), por el WebSocket de sgcHTML y sin código de SignalR. Se distribuye en el paquete NuGet esegece.sgcHTML.AspNetCore, edición Community incluida, y la demo 22.RazorMvc es el conocido ejemplo de pedidos reconstruido con él.

Actualización

Todo lo nuevo es aditivo y está desactivado de forma predeterminada. Añade las nuevas unidades, reconstruye tus paquetes, y una aplicación existente se comportará exactamente igual que antes.

Las versiones completas

Míralo en vídeo

Hay un vídeo breve de esto en el canal de eSeGeCe.

¿Preguntas, comentarios o ayuda con la migración? Ponte en contacto — recibirás respuesta de las mismas personas que escribieron el código.