sgcWebSockets 2026.10

· Versionen
sgcWebSockets 2026.10

sgcWebSockets 2026.10 ist da. Drei rote Fäden ziehen sich durch diese Version: sgcHTML hat die Teile bekommen, die eine geschäftliche Webanwendung braucht und die Sie nicht mehr von Hand schreiben müssen, die Kryptografie ist postquantensicher geworden, ohne eine einzige externe Bibliothek hinzuzufügen, und eine neue Reihe von Enterprise-Authentifizierungskomponenten übernimmt den Anmeldebildschirm.

Webanwendungen: die lästigen Teile, erledigt

Sessions, Login und CSRF. Die neue Komponente TsgcHTMLAuth und ihre Session-Stores verwalten das Cookie, beantworten die Login- und Logout-Anfragen, schließen inaktive Sessions und drosseln fehlgeschlagene Anmeldungen. Das CSRF-Token reist in einem Meta-Tag mit, htmx fügt es von selbst zu jeder Anfrage hinzu, und der Server weist einen Post zurück, der es nicht mitführt.

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

Routen, die wie Routen aussehen. Pfadparameter, ein Methodenfilter und Zugriff auf die Header, die Cookies und den Body:

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

Seiten, die Sie testen können. DispatchDirect beantwortet eine Anfrage, ohne dass ein Socket dahintersteckt, und eine neue Unit liest das erzeugte HTML, findet Elemente über id, Klasse, Tag oder Attribut und vergleicht eine Seite mit einer gespeicherten Kopie, sodass eine ungewollte Änderung im Markup von einem Test bemerkt wird und nicht von einem Kunden.

Navigation, die sich wie eine Anwendung anfühlt. Seiten wechseln ohne vollständigen Neuladevorgang und behalten die Scrollposition und das, was der Benutzer gerade eingegeben hat, mit einem Ladebalken, einem Dialog, wenn die Verbindung abbricht, und einer Meldung, wenn eine Anfrage fehlschlägt. All das standardmäßig deaktiviert.

Die vier zentralen Funktionen

Jede davon hat einen eigenen Artikel, der am Ende verlinkt ist, deshalb hier nur, was sie ist:

Push, auf zwei Wegen

Server sent events können jetzt die Aktualisierungen übertragen statt eines WebSocket, mit erneuter Zustellung dessen, was während der Trennung verpasst wurde, und das funktioniert mit dem einfachen HTTP-Server. Web Push erreicht einen Browser, der geschlossen ist. Ein Benachrichtigungs-Posteingang und eine Einstellungstabelle kommen dazu, und die Benachrichtigungskomponente entscheidet, welchen Kanal ein bestimmter Benutzer bekommt.

Ein EventSource-Client für Delphi

Der neue TsgcSSEClient konsumiert jeden Server-Sent-Events-Stream und ist in jeder Edition enthalten. Er verbindet sich von selbst neu und sendet Last-Event-ID, sodass der Server dort fortsetzt, wo der Stream gestoppt hat. Das vom Server gesendete retry:-Feld wird berücksichtigt, OnEvent liefert Ihnen den Event-Typ, die Daten und die ID, und ReconnectOptions fügt Backoff und Jitter hinzu. TLS, Proxy und Authentifizierung werden in OnBeforeConnect festgelegt, das Ihnen den von der Komponente verwendeten HTTP-Client übergibt.

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;

Der Parser dahinter, TsgcSSEParser, ist öffentlich zugänglich. Füttern Sie ihn mit den Bytes eines beliebigen text/event-stream in Chunks beliebiger Größe, genau das, was eine LLM-Streaming-Antwort oder eine MCP-Streamable-HTTP-Antwort ist.

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

Eine neue Demo, Demos\20.HTTP_Protocol\17.SSE_Client_Component, zeigt ihn von Anfang bis Ende.

KI: Antworten, auf die man handeln kann

TsgcAIChat kann jetzt über die neue Methode ChatJSON nach JSON fragen, das einem von Ihnen vorgegebenen Schema folgt, bei OpenAI, Anthropic, Gemini, DeepSeek, Ollama, Grok und Mistral; die Methode wertet die Antwort aus und fragt bei einem Parsing-Fehler noch einmal nach, diesmal mit dem Fehler im Anhang. Die Chat-Komponente sendet und empfängt jetzt auch Bilder, und BaseUrl wird jetzt von jedem Anbieter berücksichtigt und nicht mehr nur von Ollama, sodass sich jeder von ihnen auf einen Proxy oder ein lokales Gateway richten lässt.

Dokumentenextraktion: Von PDF zu validiertem JSON

Der neue TsgcAIDocumentExtractor nimmt ein PDF oder ein Bild sowie ein JSON-Schema entgegen und liefert JSON zurück, das gegen dieses Schema geprüft wurde. OpenAI, Anthropic und Gemini lesen das PDF direkt, die anderen Vision-Modelle lesen Bilder. Die integrierten Voreinstellungen decken Rechnungen, Quittungen und Ausweisdokumente ab (dpInvoice, dpReceipt, dpIDCard), und jedes Feld erhält eine Konfidenz, sodass OnLowConfidence Ihnen mitteilt, welche Werte unterhalb von MinConfidence eine zweite Prüfung verdienen. Validiert die Antwort nicht, fragt die Komponente noch einmal nach, diesmal mit den Fehlern im Anhang (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');

Verbinden Sie eine TsgcAIOCRTesseract, oder eine TsgcAIOCRWindows, die die in Windows 10 und höher eingebaute OCR ohne Installation nutzt, und setzen Sie OCRMode auf domFallback oder domAlways, dann wird der Text zuerst lokal erkannt, sodass sogar ein reines Textmodell unter Ollama die Extraktion durchführen kann. Für eigene Prompts erhält TsgcAIChat die neuen Methoden ChatWithDocument, ChatWithDocumentBase64, ChatWithAttachments und ChatJSONWithAttachments, die eine oder mehrere Dateien, gehalten in einer TsgcAIChatAttachments-Liste, mit der Nachricht senden.

Ein Sprachagent, der zuhört, antwortet und Tools aufruft

Der neue TsgcAIVoiceAgent ist eine einzige Komponente, die zuhört, erkennt, wann der Nutzer seinen Redebeitrag beendet hat, mit ihrer eigenen Stimme antwortet und Ihre Tools aufruft, über OpenAI Realtime oder Gemini Live. Sie spricht WebSocket oder WebRTC mit OpenAI und läuft unter Windows, Android und iOS. Redebeiträge werden per Server-VAD, semantischem VAD, einem clientseitigen VAD oder von Hand erkannt (vtdServerVAD, vtdSemanticVAD, vtdClientVAD, vtdManual). Mit BargeIn kann der Nutzer unterbrechen, und der Agent hört auf zu sprechen und kürzt seine Antwort an der Stelle, an der sie abgeschnitten wurde. OnTranscript liefert Live-Transkripte sowohl des Nutzers als auch des Agenten.

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;

Tools stammen aus OnToolCall, und wenn ein TsgcWSAPI_Client_MCP an MCPClient zugewiesen wird, werden die Tools dieses MCP-Servers dem Modell automatisch angeboten. Für Telefonie wechselt Audio.Format zu G.711 mu-law oder A-law bei 8 kHz (vafG711ULaw, vafG711ALaw). Der Sprachagent ist für Delphi 7 bis Delphi 13 und für .NET verfügbar, und eine neue Demo macht daraus einen sprachgesteuerten Shop-Assistenten über ein TDataSet.

Kryptografie: postquantensicher, in Object Pascal

ML-KEM (FIPS 203), ML-DSA (FIPS 204) und SLH-DSA (FIPS 205), hybride Schlüsseleinkapselung mit X-Wing, postquantensichere X.509-Zertifikate und Zertifizierungsstellen sowie mit ML-DSA signierte JWTs. All das in Object Pascal geschrieben, im sgcCrypto-Paket, ohne externe Bibliothek, geprüft gegen die bekannten NIST-Testvektoren.

Darauf setzt eine native TLS-1.3- und TLS-1.2-Engine auf, ebenfalls in reinem Pascal: ein Client oder ein Server spricht TLS ohne OpenSSL und ohne SChannel, handelt dabei die hybriden postquantensicheren Gruppen aus RFC 10024 aus, mit ALPN, S N I, Client-Zertifikaten und optionaler Nutzung des Vertrauensspeichers des Betriebssystems. TLS 1.2 ist für Peers da, die noch kein TLS 1.3 können, standardmäßig mit Forward-Secrecy-Suiten aus AES-GCM und ChaCha20-Poly1305, Extended Master Secret und Downgrade-Schutz, und TLSOptions.Version legt die niedrigste zulässige Version fest. Die Hybridgruppen bleiben TLS 1.3 vorbehalten.

Die klassische Seite wurde im selben Zug gehärtet: geblindetes RSA in konstanter Zeit, Skalarmultiplikation auf elliptischen Kurven in konstanter Zeit und Ed25519, tabellenfreies AES und GHASH, importierte private Schlüssel, die gegen ihre öffentliche Hälfte geprüft werden, und nicht minimale DER-Signaturen, die zurückgewiesen werden.

Authentifizierung: die Anmeldung, nach der alle fragen

Eine neue Reihe von Authentifizierungskomponenten beantwortet die Fragen, die jeder Kunde zum Anmeldebildschirm stellt. Sie sind in den Editionen Enterprise und All-Access und im sgcAuth-Paket enthalten, und dieselben Komponenten gehören zu sgcWebSockets .NET.

Korrekturen, die eine Erwähnung wert sind

.NET

Die .NET-Bibliothek hält Schritt: Auth und Sessions mit einer ClaimsPrincipal-Brücke für ASP.NET Core, der Router, die Test-Hilfsmittel, die SPA-Navigation, der SSE-Transport mit einem nativen Endpunkt, strukturierte Ausgabe, die Dokumentenextraktion mit beiden OCR-Engines, der Echtzeit-Sprachagent, das AI Data Pack, Web Push, MCP Apps, die CRUD-Komponente mit ihren Adaptern und der neue TsgcSSEClient, alles mit denselben API-Namen wie in Delphi.

Razor Tag Helpers für ASP.NET Core. sgcHTML passt jetzt so in eine MVC- oder Razor-Pages-Anwendung wie Telerik UI und DevExpress. Tag Helper wie <sgc-grid>, <sgc-form>, <sgc-autocomplete>, <sgc-dialog> und <sgc-chart> sowie ihre fluenten Gegenstücke unter Html.Sgc() rendern Bootstrap 5 auf dem Server und sprechen über htmx mit deinen Controllern, ohne JavaScript-Framework. Das Grid paginiert, sortiert, filtert, durchsucht und exportiert nach XLSX und PDF über ein IQueryable, sodass EF Core alles als SQL ausführt:

<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());

Eingaben werden mit asp-for gebunden und zeigen die ModelState-Fehler an, und this.SgcCloseDialog("edit-order", refresh: "orders") schließt einen Bearbeitungsdialog und lädt das Grid neu. Was die anderen nicht haben, ist Server-Push: Ein Diagramm mit live="true" wird in jedem geöffneten Browser neu gezeichnet, wenn ein Hintergrunddienst hub.BroadcastChartAsync(...) aufruft, über den sgcHTML-WebSocket und ohne SignalR-Code. Es steckt im NuGet-Paket esegece.sgcHTML.AspNetCore, inklusive Community-Edition, und die Demo 22.RazorMvc ist das bekannte Bestellungsbeispiel, damit neu aufgebaut.

Aktualisierung

Alles Neue ist additiv und standardmäßig deaktiviert. Legen Sie die neuen Units hinzu, bauen Sie Ihre Pakete neu, und eine bestehende Anwendung verhält sich exakt wie zuvor.

Die ausführlichen Versionen

Video ansehen

Dazu gibt es ein kurzes Video auf dem eSeGeCe-Kanal.

Fragen, Feedback oder Hilfe bei der Migration? Kontaktieren Sie uns — Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.