sgcWebSockets 2026.10 est disponible. Trois fils conducteurs traversent cette version : sgcHTML s'est enrichi des parties dont a besoin une application web métier et que vous n'aurez plus à écrire à la main, la cryptographie est devenue post-quantique sans ajouter la moindre bibliothèque externe, et un nouvel ensemble de composants d'authentification Enterprise prend en charge l'écran de connexion.
Applications web : la partie fastidieuse, réglée
Sessions, connexion et CSRF. Le nouveau composant TsgcHTMLAuth et ses magasins de sessions gèrent le cookie, répondent aux requêtes de connexion et de déconnexion, ferment les sessions inactives et limitent les tentatives de connexion échouées. Le jeton CSRF voyage dans une balise meta, htmx l'ajoute de lui-même à chaque requête, et le serveur rejette un post qui ne le porte pas.
FAuth := TsgcHTMLAuth.Create(Self);
FAuth.SessionStore := TsgcHTMLSessionStore_Memory.Create(Self);
FAuth.CookieName := 'app_session';
FEngine.Auth := FAuth;
Des routes qui se lisent comme des routes. Des paramètres de chemin, un filtre de méthodes, et l'accès aux en-têtes, aux cookies et au corps de la requête :
with FRouter.Routes.Add do
begin
Path := '/customers/{id}/edit';
Methods := [hrmGet, hrmPost];
RequireLogin := True;
RequireRoles := 'admin,sales';
end;
Des pages que vous pouvez tester. DispatchDirect répond à une requête sans qu'il y ait de socket derrière, et une nouvelle unité lit le HTML généré, trouve les éléments par id, classe, balise ou attribut, et compare une page à une copie sauvegardée, de sorte qu'un changement involontaire dans le balisage soit repéré par un test plutôt que par un client.
Une navigation qui donne l'impression d'une application. Les pages changent sans rechargement complet et conservent la position de défilement et ce que l'utilisateur était en train de saisir, avec une barre de chargement, une boîte de dialogue quand la connexion se coupe et un message quand une requête échoue. Tout cela désactivé par défaut.
Une page conçue sur un formulaire, sans code. Dépose un TsgcWebSocketHTTPServer, un TsgcHTMLDesignServer, un TsgcHTMLDesignSurface et quelques composants sgcHTML sur un formulaire VCL, et WSServer.Active := True est la seule ligne à écrire. Le design server construit la page à partir du formulaire et sert Bootstrap, htmx et Chart.js depuis l'exécutable. Les actions de la Surface exécutent du code Delphi quand l'utilisateur clique ou envoie un formulaire : renseigne Source et Target dans l'Inspecteur d'objets, double-clique sur OnExecute, et la cible est mise à jour sur place sans rechargement de la page. Six démos QuickStart dans Demos\60.HTML\00.QuickStart l'enseignent pas à pas, le guide Getting Started (PDF, en anglais) les explique, et le démarrage rapide sgcHTML montre le chemin de 5 minutes.
Les quatre fonctionnalités phares
Chacune d'elles a son propre article, lié à la fin, alors voici seulement ce qu'elle est :
- MCP Apps. Un outil MCP qui répond avec une page plutôt qu'un paragraphe, rendue dans ChatGPT, Claude ou VS Code, construite avec les mêmes composants que n'importe quelle autre page sgcHTML.
- Le générateur de pages par IA. Décrivez une page, ou remettez au designer une capture d'écran, et il la construit à partir de vos composants enregistrés comme un candidat que vous acceptez ou rejetez.
- Le composant CRUD. Liste, recherche, pagination, formulaire, suppression et le chemin d'écriture d'un dataset, sur un TDataSet ou sur votre propre SQL, avec un assistant dans l'IDE et un générateur en ligne de commande.
- L'AI Data Pack. Posez une question en langage naturel à un grid, une data table ou un tableau croisé, avec un analyseur basé sur des règles qui répond même en l'absence totale de clé d'API.
Le push, de deux façons
Les server sent events peuvent désormais transporter les mises à jour à la place d'un WebSocket, avec rejeu de ce qui a été manqué pendant la déconnexion, et cela fonctionne avec le serveur HTTP classique. Web Push atteint un navigateur qui est fermé. Une boîte de réception de notifications et une table de préférences les accompagnent, et le composant de notification décide quel canal reçoit un utilisateur donné.
Un client EventSource pour Delphi
Le nouveau TsgcSSEClient consomme n'importe quel flux Server-Sent Events et est inclus dans toutes les éditions. Il se reconnecte tout seul et envoie Last-Event-ID, si bien que le serveur reprend là où le flux s'est arrêté. Le champ retry: envoyé par le serveur est respecté, OnEvent vous fournit le type d'événement, les données et l'id, et ReconnectOptions ajoute du backoff et du jitter. Le TLS, le proxy et l'authentification se configurent dans OnBeforeConnect, qui vous fournit le client HTTP utilisé par le composant.
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;
Le parseur qui se cache derrière, TsgcSSEParser, est public. Alimentez-le avec les octets de n'importe quel text/event-stream par blocs de taille quelconque, ce qui est exactement ce qu'est une réponse en streaming d'un LLM ou une réponse MCP Streamable HTTP.
FParser := TsgcSSEParser.Create;
FParser.OnEvent := DoSSEEvent;
FParser.Feed('event: delta' + #10 + 'data: {"text":"Hel"}' + #10#10);
Une nouvelle démo, Demos\20.HTTP_Protocol\17.SSE_Client_Component, la montre de bout en bout.
IA : des réponses exploitables
TsgcAIChat peut demander un JSON qui suit un schéma que vous fournissez, chez OpenAI, Anthropic, Gemini, DeepSeek, Ollama, Grok et Mistral, via la nouvelle méthode ChatJSON, qui analyse la réponse et redemande une fois de plus, en joignant l'erreur d'analyse, lorsqu'elle ne peut pas être lue. Le composant de chat envoie et reçoit désormais aussi des images, et BaseUrl est maintenant respecté par chaque fournisseur et non plus seulement par Ollama, si bien que n'importe lequel d'entre eux peut être pointé vers un proxy ou une passerelle locale.
Extraction de documents : du PDF au JSON validé
Le nouveau TsgcAIDocumentExtractor prend un PDF ou une image et un schéma JSON, et renvoie un JSON qui a été vérifié par rapport à ce schéma. OpenAI, Anthropic et Gemini lisent le PDF directement, les autres modèles de vision lisent des images. Des préréglages intégrés couvrent les factures, les reçus et les documents d'identité (dpInvoice, dpReceipt, dpIDCard), et chaque champ vient avec un niveau de confiance, si bien qu'OnLowConfidence vous indique quelles valeurs en dessous de MinConfidence méritent un second regard. Lorsque la réponse n'est pas valide, le composant redemande une fois de plus en joignant les erreurs (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');
Associez un TsgcAIOCRTesseract, ou un TsgcAIOCRWindows qui utilise l'OCR intégré à Windows 10 et versions ultérieures sans rien à installer, et réglez OCRMode sur domFallback ou domAlways, et le texte est d'abord reconnu localement, si bien que même un modèle texte seul tournant sur Ollama peut faire l'extraction. Pour vos propres prompts, TsgcAIChat gagne ChatWithDocument, ChatWithDocumentBase64, ChatWithAttachments et ChatJSONWithAttachments, qui envoient un ou plusieurs fichiers, conservés dans une liste TsgcAIChatAttachments, avec le message.
Un agent vocal qui écoute, répond et appelle des outils
Le nouveau TsgcAIVoiceAgent est un composant unique qui écoute, détecte quand l'utilisateur a terminé son tour de parole, répond avec sa propre voix et appelle vos outils, via OpenAI Realtime ou Gemini Live. Il parle WebSocket, ou WebRTC avec OpenAI, et fonctionne sous Windows, Android et iOS. Les tours sont détectés par VAD serveur, VAD sémantique, un VAD côté client ou manuellement (vtdServerVAD, vtdSemanticVAD, vtdClientVAD, vtdManual). Avec BargeIn, l'utilisateur peut interrompre, et l'agent arrête de parler et tronque sa réponse à l'endroit où elle a été coupée. OnTranscript livre des transcriptions en direct de l'utilisateur comme de l'agent.
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;
Les outils viennent d'OnToolCall, et lorsqu'un TsgcWSAPI_Client_MCP est assigné à MCPClient, les outils de ce serveur MCP sont proposés au modèle automatiquement. Pour la téléphonie, Audio.Format passe en G.711 mu-law ou A-law à 8 kHz (vafG711ULaw, vafG711ALaw). L'agent vocal est disponible de Delphi 7 à Delphi 13 et pour .NET, et une nouvelle démo en fait un assistant vocal de boutique par-dessus un TDataSet.
MCP : la spécification 2026-07-28
Le serveur et le client MCP parlent désormais la révision 2026-07-28 du Model Context Protocol. Le même serveur répond aux nouveaux clients sans état et aux clients 2025-11-25 existants, comme VS Code et Claude, de sorte que rien ne change pour les clients que vous avez déjà. Côté client, MCPOptions.ProtocolEra réglé sur Auto essaie d'abord le nouveau protocole, se replie quand le serveur ne le prend pas en charge et mémorise la réponse pour chaque serveur.
- Découverte et en-têtes.
server/discover, la version du protocole et les informations du client envoyées avec chaque requête, les en-têtes de requêteMcp-MethodetMcp-Namevérifiés par le serveur, des indications de cache sur les résultats de liste et les nouveaux codes d'erreur. Les paramètres d'outil marqués avecx-mcp-headervoyagent comme en-têtes de requête. - Un seul flux pour tous les changements. Avec
subscriptions/listen, un client ouvre un seul flux de longue durée et reçoit les changements des listes d'outils, de prompts et de ressources ainsi que les mises à jour de ressources. Les méthodes d'envoi de notifications que vous appelez déjà atteignent aussi ces clients. - Requêtes à allers-retours multiples. Un outil, un prompt ou une ressource peut demander au client une saisie, un formulaire, une page web, une réponse d'IA ou les racines du client, et continuer quand le client rappelle avec les réponses. L'état conservé entre les appels est signé et expire (
MCPOptions.MRTR). Côté client,OnMCPInputRequiredy répond, et les gestionnaires existants de roots, sampling et elicitation répondent d'eux-mêmes. - Tâches. Un outil de longue durée renvoie une tâche que le client suit jusqu'à sa fin, à laquelle il répond quand elle a besoin d'une saisie, et qu'il peut annuler. Côté serveur, c'est
MCPOptions.TasksavecCreateTask, côté clientOnMCPTaskCreated,OnMCPTaskStatusetOnMCPTaskCompleted. - Autorisation du client. Avec
MCPOptions.Authorizationactivé, un 401 n'est plus une impasse : le client trouve seul le serveur d'autorisation, s'enregistre avec un document de métadonnées d'identifiant client ou par enregistrement dynamique, se connecte avec PKCE, vérifie l'émetteur et renouvelle le jeton à son expiration.
Cryptographie : post-quantique, en Object Pascal
ML-KEM (FIPS 203), ML-DSA (FIPS 204) et SLH-DSA (FIPS 205), encapsulation de clé hybride X-Wing, certificats X.509 post-quantiques et autorités de certification, et JWT signés avec ML-DSA. Le tout écrit en Object Pascal dans le pack sgcCrypto, sans aucune bibliothèque externe, validé face aux vecteurs de réponses connues du NIST.
Par-dessus repose un moteur TLS 1.3 et TLS 1.2 natif, lui aussi en Pascal pur : un client ou un serveur parle TLS sans OpenSSL et sans SChannel, en négociant les groupes hybrides post-quantiques de la RFC 10024, avec ALPN, S N I, les certificats client et l'utilisation optionnelle du magasin de confiance du système d'exploitation. TLS 1.2 est là pour les pairs qui ne savent pas encore faire du TLS 1.3, avec par défaut des suites AES-GCM et ChaCha20-Poly1305 à forward secrecy, l'extended master secret et la protection anti-rétrogradation, et TLSOptions.Version fixe la version minimale autorisée. Les groupes hybrides restent réservés à TLS 1.3.
Le côté classique a été renforcé dans la même passe : RSA en temps constant avec blinding, multiplication scalaire de courbe elliptique en temps constant et Ed25519, AES et GHASH sans tables, clés privées importées vérifiées face à leur moitié publique, et signatures DER non minimales rejetées.
TLS côté serveur, à votre façon
Clair et TLS sur le même port. SSLOptions.AllowPlainText permet à un serveur TLS d'accepter aussi les connexions HTTP et WebSocket en clair sur le même port, en les distinguant grâce au premier octet envoyé par le client. SSLOptions.PlainTextPolicy les sert, les redirige avec un 308 vers https, ou les rejette avec un 400, et Server.IsTLS(AContext) vous indique dans OnCommandGet sur quel transport une requête est arrivée. Cela fonctionne avec les IOHandlers par défaut, IOCP et EPOLL.
HSTS pour un A+. SecurityOptions.HSTS_Options ajoute l'en-tête Strict-Transport-Security à chaque réponse envoyée via TLS, ce dont SSL Labs a besoin pour attribuer la note A+. Il n'est jamais envoyé en HTTP simple, et il n'est pas ajouté deux fois quand votre code le définit déjà.
Apportez votre propre bibliothèque TLS. Les serveurs IOCP et EPOLL ne sont plus liés à OpenSSL. Écrivez un fournisseur TLS pour votre bibliothèque, SecureBlackbox par exemple, et le moteur événementiel le pilote exactement comme celui qui est intégré.
Authentification : la connexion que tout le monde réclame
Un nouvel ensemble de composants d'authentification répond aux questions que chaque client pose sur l'écran de connexion. Ils sont livrés dans les éditions Enterprise et All-Access et dans le pack sgcAuth, et les mêmes composants font partie de sgcWebSockets .NET.
- Passkeys. Le serveur WebAuthn identifie l'utilisateur sans qu'il saisisse le moindre nom, propose les passkeys dans la liste de saisie automatique du navigateur, conserve plusieurs passkeys par utilisateur, distingue une passkey synchronisée d'une passkey liée à un seul appareil et déclenche un événement pour que les identifiants restent dans votre propre base de données.
- Authentification unique SAML.
TsgcSAMLServiceProviderfait de votre application un fournisseur de service SAML 2.0 pour Entra ID, Okta, AD FS, Google Workspace, Keycloak ou tout autre fournisseur d'identité. - Active Directory et LDAP.
TsgcLDAPClientauthentifie les utilisateurs avec leur mot de passe d'annuaire via LDAPS ou StartTLS et lit leurs groupes, groupes imbriqués compris. - Codes d'une application d'authentification.
TsgcTOTPAuthenticatorproduit et vérifie les codes de Google Authenticator, de Microsoft Authenticator et de leurs équivalents, avec le lien d'enrôlement du QR code, la protection contre le rejeu et des codes de récupération. - OpenID Connect.
TsgcHTTP_OIDC_Clientconnecte les utilisateurs auprès de n'importe quel fournisseur OpenID grâce à son document de découverte et valide les jetons d'identité ainsi que les jetons bearer qui arrivent sur votre propre API. - Messagerie sans mot de passe stocké.
TsgcMailOAuth2obtient et renouvelle les jetons OAuth2 de Microsoft 365 et de Gmail qu'attendent désormais SMTP, IMAP et POP3.
Ces petits plus qui comptent
- Pages de droite à gauche. Les pages sgcHTML passent d'elles-mêmes en mise en page de droite à gauche pour l'arabe, l'hébreu, le persan, l'ourdou et les autres langues écrites de droite à gauche, chargent la feuille de style Bootstrap de droite à gauche désormais incluse dans la bibliothèque, et inversent les composants, de la barre latérale à la grille.
HtmlDiretDirimposent une direction quand vous en avez besoin. Nouvelle démo 22.RTL. - Géolocalisation.
TsgcHTMLComponent_Geolocationlit la position GPS du navigateur, une fois ou en continu, et envoie au serveur la latitude, la longitude, la précision, l'altitude, le cap et la vitesse. - Une grille qui trie et filtre sur le serveur.
SortMode := gsmServeretServerFilterenvoient le tri et un champ de filtre par colonne via htmx, avec un filtre texte ou plage par colonne (gfkText,gfkRange). La pagination et AutoComplete disposent du même chemin htmx en HTTP simple. - Scanner par caméra sur iPhone.
PolyfillURLcharge un décodeur de codes-barres sur les navigateurs qui n'en ont pas d'intégré, etRedirectURLouvre une page avec le code scanné. - Lazarus. Les démos d'exécution de sgcHTML sont désormais disponibles pour Lazarus et Free Pascal, et le paquet Lazarus inclut les unités CRUD et MCP Apps.
- Pourquoi ai-je été refusé ? Quand un serveur refuse une connexion WebSocket, par exemple avec un 401 parce que le jeton a expiré, le corps de sa réponse est disponible dans
OnExceptionviaTsgcWSConnectionClient(Connection).HandshakeResponseBody. - Vos propres données sur le thread de connexion.
QueueOptions.DrainedMode := qdmEveryPassdéclencheOnQueueDrainedà chaque passage de la boucle de connexion, sur le thread propre à la connexion, afin que l'application puisse y envoyer ses données en attente. - Keep-alive sur WinHTTP. Le client WebSocket WinHTTP gagne
OnBeforeHeartBeatpour envoyer votre propre message keep-alive à chaque intervalle HeartBeat. - AI Chat.
ImageOutputpermet à Gemini de répondre avec des images et de continuer à les modifier message après message, la requête d'édition d'image d'OpenAI accepte les options de gpt-image-1 et plusieurs images en entrée, etTLSOptionschoisit la version d'OpenSSL utilisée par les requêtes des fournisseurs. - Client OpenAPI.
TsgcOpenAPI_Client.UserAgentdéfinit l'en-tête User-Agent de chaque requête, ou l'omet s'il est vide.
Des corrections qui méritent d'être citées
- La signature et la validation JWT avec des clés RSA et ECDSA, et une corruption mémoire dans les applications 32 bits, lorsque OpenSSL est lié statiquement.
- Le gestionnaire SChannel qui laissait une copie de la clé privée dans le magasin de clés Windows à chaque connexion utilisant un fichier PFX, et qui n'envoyait pas le certificat client sur les versions récentes de Windows.
- Les connexions SChannel concurrentes utilisant un certificat du magasin Windows qui échouaient la négociation.
- Le serveur OAuth2 qui rejetait les preuves DPoP signées avec des clés RSA.
- Les URL signées CloudFront dont la signature n'était pas encodée de façon sûre pour une URL.
.NET
La bibliothèque .NET suit le rythme : authentification et sessions avec un pont ClaimsPrincipal pour ASP.NET Core, le routeur, les outils de test, la navigation SPA, le transport SSE avec un point de terminaison natif, la sortie structurée, l'extraction de documents avec ses deux moteurs OCR, l'agent vocal en temps réel, l'AI Data Pack, Web Push, MCP Apps, le composant CRUD avec ses adaptateurs et le nouveau TsgcSSEClient, le tout avec les mêmes noms d'API qu'en Delphi.
Tag Helpers Razor pour ASP.NET Core. sgcHTML s'intègre désormais à une application MVC ou Razor Pages comme le font Telerik UI et DevExpress. Des Tag Helpers comme <sgc-grid>, <sgc-form>, <sgc-autocomplete>, <sgc-dialog> et <sgc-chart>, et leurs équivalents fluides sous Html.Sgc(), génèrent du Bootstrap 5 côté serveur et dialoguent avec tes contrôleurs via htmx, sans framework JavaScript. La grille pagine, trie, filtre, recherche et exporte vers XLSX et PDF sur un IQueryable, de sorte qu'EF Core exécute tout en 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());
Les champs se lient avec asp-for et affichent les erreurs de ModelState, et this.SgcCloseDialog("edit-order", refresh: "orders") ferme une boîte de dialogue d'édition et recharge la grille. Ce que les autres n'ont pas, c'est le push serveur : un graphique avec live="true" se redessine dans chaque navigateur ouvert lorsqu'un service en arrière-plan appelle hub.BroadcastChartAsync(...), via le WebSocket de sgcHTML et sans code SignalR. Il est fourni dans le package NuGet esegece.sgcHTML.AspNetCore, édition Community comprise, et la démo 22.RazorMvc est l'exemple de commandes bien connu reconstruit avec lui.
Mise à niveau
Tout ce qui est nouveau est additif et désactivé par défaut. Ajoutez les nouvelles unités, recompilez vos packages, et une application existante se comportera exactement comme avant.
Les versions complètes
- Faites tourner votre application Delphi dans ChatGPT et Claude
- Transformez une capture d'écran en page web Delphi
- Delphi TLS 1.3 sans DLL OpenSSL
- Une page web CRUD Delphi en cinq minutes
- Posez une question à votre grille Delphi en anglais simple
- Atteindre un navigateur fermé, depuis Delphi
- Connexion Delphi avec Passkeys, SSO SAML, LDAP et TOTP 2FA
- Authentification unique SAML en Delphi avec Entra ID, Okta et AD FS
- Passkeys en Delphi : connexion sans mot de passe avec WebAuthn
Voir la vidéo
Il existe une courte vidéo à ce sujet sur la chaîne eSeGeCe.
Des questions, un retour ou besoin d'aide pour la migration ? Contactez-nous — vous recevrez une réponse des personnes qui ont écrit le code.
