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.
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.
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.
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.
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
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.
