sgcWebSockets 2026.10

· Versions
sgcWebSockets 2026.10

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 :

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.

Des corrections qui méritent d'être citées

.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

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.