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:
- MCP Apps. Una herramienta MCP que responde con una página en lugar de un párrafo, renderizada dentro de ChatGPT, Claude o VS Code, construida con los mismos componentes que cualquier otra página de sgcHTML.
- El generador de páginas con IA. Describe una página, o entrégale al diseñador una captura de pantalla, y la construye a partir de tus componentes registrados como un candidato que aceptas o descartas.
- El componente CRUD. Listado, búsqueda, paginación, formulario, borrado y el camino de escritura de un dataset, sobre un TDataSet o sobre tu propio SQL, con un asistente en el IDE y un generador por línea de comandos.
- El AI Data Pack. Hazle una pregunta en lenguaje sencillo a un grid, una tabla de datos o una tabla dinámica, con un analizador basado en reglas que responde incluso cuando no hay ninguna clave de API.
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.
- Passkeys. El servidor WebAuthn identifica al usuario sin que escriba ningún nombre, ofrece las passkeys en la propia lista de autocompletado del navegador, guarda varias passkeys por usuario, distingue una passkey sincronizada de otra ligada a un solo dispositivo y lanza un evento para que las credenciales vivan en tu propia base de datos.
- Inicio de sesión único SAML.
TsgcSAMLServiceProviderconvierte tu aplicación en un proveedor de servicio SAML 2.0 para Entra ID, Okta, AD FS, Google Workspace, Keycloak o cualquier otro proveedor de identidad. - Active Directory y LDAP.
TsgcLDAPClientvalida a los usuarios con la contraseña del directorio por LDAPS o StartTLS y lee los grupos a los que pertenecen, incluidos los grupos anidados. - Códigos de una app de autenticación.
TsgcTOTPAuthenticatorgenera y comprueba los códigos de Google Authenticator, Microsoft Authenticator y similares, con el enlace de alta para el código QR, protección contra reutilización y códigos de recuperación. - OpenID Connect.
TsgcHTTP_OIDC_Clientvalida a los usuarios con cualquier proveedor OpenID a partir de su documento de descubrimiento y comprueba los tokens de ID y los tokens bearer que llegan a tu propia API. - Correo sin contraseña guardada.
TsgcMailOAuth2obtiene y renueva los tokens OAuth2 de Microsoft 365 y Gmail que SMTP, IMAP y POP3 exigen ahora.
Correcciones que merece la pena mencionar
- La firma y validación de JWT con claves RSA y ECDSA, y una corrupción de memoria en aplicaciones de 32 bits, cuando OpenSSL se enlaza de forma estática.
- El gestor de SChannel dejaba una copia de la clave privada en el almacén de claves de Windows en cada conexión que usaba un archivo PFX, y no enviaba el certificado de cliente en versiones recientes de Windows.
- Las conexiones SChannel concurrentes que usaban un certificado del almacén de Windows fallaban el handshake.
- El servidor OAuth2 rechazaba las pruebas DPoP firmadas con claves RSA.
- Las URL firmadas de CloudFront cuya firma no estaba codificada de forma segura para URL.
.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
- Ejecuta tu aplicación Delphi dentro de ChatGPT y Claude
- Convierte una captura de pantalla en una página web Delphi
- Delphi TLS 1.3 sin DLLs de OpenSSL
- Una página CRUD web en Delphi en cinco minutos
- Pregúntale algo a tu grid de Delphi en lenguaje sencillo
- Llega a un navegador cerrado, desde Delphi
- Inicio de sesión en Delphi con Passkeys, SAML SSO, LDAP y TOTP 2FA
- Inicio de sesión único SAML en Delphi con Entra ID, Okta y AD FS
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.
