sgcWebSockets 2026.10 is uit. Drie lijnen lopen erdoorheen: sgcHTML heeft de onderdelen gekregen die een zakelijke webapplicatie nodig heeft en die je niet meer met de hand hoeft te schrijven, de cryptografie is post-quantum geworden zonder ook maar één externe library toe te voegen, en een nieuwe reeks Enterprise-authenticatiecomponenten neemt het inlogscherm over.
Webapplicaties: het saaie werk, klaar
Sessies, login en CSRF. De nieuwe component TsgcHTMLAuth en de bijbehorende session stores houden de cookie bij, beantwoorden de login- en logoutaanvragen, sluiten inactieve sessies af en beperken mislukte inlogpogingen. Het CSRF-token reist mee in een meta tag, htmx voegt het vanzelf toe aan elk verzoek, en de server wijst een post af die het niet meestuurt.
FAuth := TsgcHTMLAuth.Create(Self);
FAuth.SessionStore := TsgcHTMLSessionStore_Memory.Create(Self);
FAuth.CookieName := 'app_session';
FEngine.Auth := FAuth;
Routes die lezen als routes. Padparameters, een methodefilter, en toegang tot de headers, de cookies en de body:
with FRouter.Routes.Add do
begin
Path := '/customers/{id}/edit';
Methods := [hrmGet, hrmPost];
RequireLogin := True;
RequireRoles := 'admin,sales';
end;
Pagina's die je kunt testen. DispatchDirect beantwoordt een verzoek zonder dat er een socket achter zit, en een nieuwe unit leest de gegenereerde HTML, vindt elementen op id, klasse, tag of attribuut en vergelijkt een pagina met een opgeslagen kopie, zodat een onbedoelde wijziging in de markup wordt opgemerkt door een test in plaats van door een klant.
Navigatie die aanvoelt als een applicatie. Pagina's veranderen zonder volledige herlaadbeurt en behouden de scrollpositie en wat de gebruiker aan het typen was, met een laadbalk, een dialoogvenster wanneer de verbinding wegvalt en een melding wanneer een verzoek mislukt. Dit alles standaard uitgeschakeld.
Een pagina ontworpen op een formulier, zonder code. Plaats een TsgcWebSocketHTTPServer, een TsgcHTMLDesignServer, een TsgcHTMLDesignSurface en enkele sgcHTML-componenten op een VCL-formulier, en WSServer.Active := True is de enige regel die je schrijft. De design server bouwt de pagina op uit het formulier en levert Bootstrap, htmx en Chart.js vanuit het uitvoerbare bestand. Surface-acties voeren Delphi-code uit wanneer de gebruiker klikt of verzendt: stel Source en Target in de Object Inspector in, dubbelklik op OnExecute, en het doel wordt ter plekke bijgewerkt zonder de pagina te herladen. Zes QuickStart-demo's in Demos\60.HTML\00.QuickStart leren het stap voor stap, de Getting Started-gids (PDF, Engels) legt ze uit, en de sgcHTML-snelstart toont het pad van 5 minuten.
De vier hoofdfuncties
Elk van deze heeft een eigen artikel, aan het einde gelinkt, dus hier alleen wat het is:
- MCP Apps. Een MCP-tool die antwoordt met een pagina in plaats van een alinea, gerenderd binnen ChatGPT, Claude of VS Code, opgebouwd uit dezelfde componenten als elke andere sgcHTML-pagina.
- De AI-paginagenerator. Beschrijf een pagina, of geef de designer een screenshot, en hij bouwt hem op uit je geregistreerde componenten als een kandidaat die je accepteert of verwerpt.
- Het CRUD-component. Lijst, zoeken, paginering, formulier, verwijderen en het schrijfpad van één dataset, over een TDataSet of over je eigen SQL, met een IDE-wizard en een generator vanaf de command line.
- Het AI Data Pack. Stel een grid, een data table of een draaitabel een vraag in gewone taal, met een regelgebaseerde parser die antwoordt zelfs als er helemaal geen API-sleutel is.
Push, op twee manieren
Server sent events kunnen nu de updates dragen in plaats van een WebSocket, met herhaling van wat er gemist is terwijl de verbinding verbroken was, en het werkt met de gewone HTTP-server. Web Push bereikt een browser die gesloten is. Er komen een berichten-inbox en een voorkeurentabel bij, en het notificatiecomponent bepaalt welk kanaal een bepaalde gebruiker krijgt.
Een EventSource-client voor Delphi
De nieuwe TsgcSSEClient consumeert elke Server-Sent Events-stream en wordt in elke editie meegeleverd. Hij herverbindt zelfstandig en stuurt Last-Event-ID, zodat de server hervat waar de stream stopte. Het door de server verzonden retry:-veld wordt gerespecteerd, OnEvent geeft je het event-type, de data en het id, en ReconnectOptions voegt backoff en jitter toe. TLS, proxy en authenticatie worden ingesteld in OnBeforeConnect, dat je de door het component gebruikte HTTP-client geeft.
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;
De parser erachter, TsgcSSEParser, is publiek. Voer hem de bytes van elke text/event-stream in stukken van willekeurige grootte, precies wat een LLM-streamingresponse of een MCP Streamable HTTP-antwoord is.
FParser := TsgcSSEParser.Create;
FParser.OnEvent := DoSSEEvent;
FParser.Feed('event: delta' + #10 + 'data: {"text":"Hel"}' + #10#10);
Een nieuwe demo, Demos\20.HTTP_Protocol\17.SSE_Client_Component, laat het end-to-end zien.
AI: antwoorden waar je iets mee kunt
TsgcAIChat kan nu via de nieuwe methode ChatJSON vragen om JSON dat een door jou opgegeven schema volgt, bij OpenAI, Anthropic, Gemini, DeepSeek, Ollama, Grok en Mistral; de methode ontleedt het antwoord en vraagt nogmaals, met de parsefout erbij, wanneer het niet te lezen is. Het chatcomponent verstuurt en ontvangt nu ook afbeeldingen, en BaseUrl wordt nu door elke provider gerespecteerd en niet meer alleen door Ollama, zodat elk van hen naar een proxy of een lokale gateway kan worden gewezen.
Documentextractie: van PDF naar gevalideerde JSON
De nieuwe TsgcAIDocumentExtractor neemt een PDF of een afbeelding en een JSON-schema, en levert JSON terug die tegen dat schema is gecontroleerd. OpenAI, Anthropic en Gemini lezen de PDF rechtstreeks, de andere visionmodellen lezen afbeeldingen. De ingebouwde presets dekken facturen, bonnetjes en identiteitsdocumenten (dpInvoice, dpReceipt, dpIDCard), en elk veld krijgt een confidence mee, zodat OnLowConfidence je vertelt welke waarden onder MinConfidence een tweede blik verdienen. Wanneer het antwoord niet valideert, vraagt het component nogmaals, met de fouten erbij (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');
Koppel een TsgcAIOCRTesseract, of een TsgcAIOCRWindows die de in Windows 10 en hoger ingebouwde OCR gebruikt zonder dat er iets geïnstalleerd hoeft te worden, en zet OCRMode op domFallback of domAlways, en de tekst wordt eerst lokaal herkend, zodat zelfs een tekst-only model dat op Ollama draait de extractie kan uitvoeren. Voor je eigen prompts krijgt TsgcAIChat er ChatWithDocument, ChatWithDocumentBase64, ChatWithAttachments en ChatJSONWithAttachments bij, die een of meerdere bestanden, gehouden in een TsgcAIChatAttachments-lijst, samen met het bericht versturen.
Een spraakagent die luistert, terugpraat en tools aanroept
De nieuwe TsgcAIVoiceAgent is één component dat luistert, detecteert wanneer de gebruiker zijn beurt heeft afgerond, met zijn eigen stem antwoordt en je tools aanroept, via OpenAI Realtime of Gemini Live. Het spreekt WebSocket, of WebRTC met OpenAI, en draait op Windows, Android en iOS. Beurten worden gedetecteerd via server-VAD, semantische VAD, een VAD aan de clientzijde of handmatig (vtdServerVAD, vtdSemanticVAD, vtdClientVAD, vtdManual). Met BargeIn kan de gebruiker onderbreken, waarna de agent stopt met praten en zijn antwoord afbreekt op het punt waar het werd onderbroken. OnTranscript levert live transcripties van zowel de gebruiker als de 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;
Tools komen van OnToolCall, en wanneer een TsgcWSAPI_Client_MCP aan MCPClient wordt toegewezen, worden de tools van die MCP-server automatisch aan het model aangeboden. Voor telefonie schakelt Audio.Format over naar G.711 mu-law of A-law op 8 kHz (vafG711ULaw, vafG711ALaw). De spraakagent is beschikbaar van Delphi 7 tot Delphi 13 en voor .NET, en een nieuwe demo maakt er een spraakwinkelassistent van bovenop een TDataSet.
MCP: de specificatie van 2026-07-28
De MCP-server en -client spreken nu de revisie 2026-07-28 van het Model Context Protocol. Dezelfde server beantwoordt de nieuwe stateless clients en de bestaande 2025-11-25-clients zoals VS Code en Claude, dus er verandert niets voor de clients die je al hebt. Aan de clientkant probeert MCPOptions.ProtocolEra op Auto eerst het nieuwe protocol, valt terug wanneer de server het niet ondersteunt en onthoudt het antwoord per server.
- Discovery en headers.
server/discover, de protocolversie en clientgegevens die met elk verzoek meegaan, de request headersMcp-MethodenMcp-Namedie de server controleert, cachehints bij lijstresultaten en de nieuwe foutcodes. Toolparameters die metx-mcp-headerzijn gemarkeerd, reizen mee als request headers. - Eén stream voor elke wijziging. Met
subscriptions/listenopent een client één langlevende stream en ontvangt wijzigingen in de lijsten met tools, prompts en resources, plus resource-updates. De Send notification-methoden die je al aanroept, bereiken deze clients ook. - Verzoeken met meerdere ronden. Een tool, prompt of resource kan de client om invoer vragen, een formulier, een webpagina, een AI-antwoord of de client roots, en gaat verder wanneer de client opnieuw aanroept met de antwoorden. De status die tussen de aanroepen wordt bewaard is ondertekend en verloopt (
MCPOptions.MRTR). Aan de clientkant beantwoordtOnMCPInputRequiredze, en de bestaande handlers voor roots, sampling en elicitation antwoorden vanzelf. - Tasks. Een langlopende tool geeft een task terug die de client volgt tot hij klaar is, waarop hij antwoordt wanneer de task invoer nodig heeft en die hij kan annuleren. Op de server is dat
MCPOptions.TasksmetCreateTask, op de clientOnMCPTaskCreated,OnMCPTaskStatusenOnMCPTaskCompleted. - Clientautorisatie. Met
MCPOptions.Authorizationingeschakeld is een 401 niet langer het einde van de weg: de client vindt zelf de autorisatieserver, registreert zich met een client id metadata document of dynamische registratie, meldt zich aan met PKCE, controleert de issuer en vernieuwt het token wanneer het verloopt.
Cryptografie: post-quantum, in Object Pascal
ML-KEM (FIPS 203), ML-DSA (FIPS 204) en SLH-DSA (FIPS 205), hybride sleutelencapsulatie met X-Wing, post-quantum X.509-certificaten en certificaatautoriteiten, en JWT's ondertekend met ML-DSA. Dit alles geschreven in Object Pascal in het sgcCrypto-pakket, zonder externe library, gevalideerd tegen de bekende NIST-testvectoren.
Daarbovenop staat een native TLS 1.3- en TLS 1.2-engine, ook in puur Pascal: een client of een server spreekt TLS zonder OpenSSL en zonder SChannel, en onderhandelt daarbij over de hybride post-quantumgroepen van RFC 10024, met ALPN, S N I, clientcertificaten en optioneel gebruik van de vertrouwensopslag van het besturingssysteem. TLS 1.2 is er voor de peers die nog geen TLS 1.3 kunnen, met standaard forward-secret AES-GCM- en ChaCha20-Poly1305-suites, extended master secret en downgradebescherming, en TLSOptions.Version stelt de laagst toegestane versie in. De hybride groepen blijven voorbehouden aan TLS 1.3.
De klassieke kant is in dezelfde slag verstevigd: geblindeerde RSA in constante tijd, scalaire vermenigvuldiging op elliptische krommen in constante tijd en Ed25519, tabelvrije AES en GHASH, geïmporteerde privésleutels die tegen hun publieke helft worden gecontroleerd, en niet-minimale DER-handtekeningen die worden geweigerd.
TLS op de server, op jouw manier
Gewoon en TLS op dezelfde poort. Met SSLOptions.AllowPlainText accepteert een TLS-server ook gewone HTTP- en WebSocket-verbindingen op dezelfde poort, die hij onderscheidt aan de eerste byte die de client verstuurt. SSLOptions.PlainTextPolicy bedient ze, stuurt ze met een 308 door naar https, of weigert ze met een 400, en Server.IsTLS(AContext) vertelt je in OnCommandGet via welk transport een verzoek binnenkwam. Het werkt met de IOHandlers default, IOCP en EPOLL.
HSTS voor een A+. SecurityOptions.HSTS_Options voegt de header Strict-Transport-Security toe aan elk antwoord dat over TLS wordt verstuurd, en dat is wat SSL Labs nodig heeft voor een A+-score. Hij wordt nooit over gewoon HTTP verstuurd en niet dubbel toegevoegd wanneer je code hem al zelf instelt.
Neem je eigen TLS-bibliotheek mee. De IOCP- en EPOLL-servers zijn niet langer aan OpenSSL gebonden. Schrijf een TLS-provider voor je bibliotheek, bijvoorbeeld SecureBlackbox, en de event-driven engine stuurt die aan precies zoals de ingebouwde.
Authenticatie: de login waar iedereen om vraagt
Een nieuwe reeks authenticatiecomponenten beantwoordt de vragen die elke klant over het inlogscherm stelt. Ze zitten in de edities Enterprise en All-Access en in de sgcAuth-pack, en dezelfde componenten horen bij sgcWebSockets .NET.
- Passkeys. De WebAuthn-server meldt een gebruiker aan zonder dat er een gebruikersnaam wordt getypt, biedt de passkeys aan in de autofill-lijst van de browser zelf, bewaart meerdere passkeys per gebruiker, onderscheidt een gesynchroniseerde passkey van een die aan één apparaat vastzit, en geeft een event zodat de credentials in je eigen database staan.
- SAML Single Sign-On.
TsgcSAMLServiceProvidermaakt van je applicatie een SAML 2.0 service provider voor Entra ID, Okta, AD FS, Google Workspace, Keycloak of elke andere identity provider. - Active Directory en LDAP.
TsgcLDAPClientmeldt gebruikers aan met hun directorywachtwoord over LDAPS of StartTLS en leest hun groepslidmaatschap, geneste groepen inbegrepen. - Codes uit een authenticator-app.
TsgcTOTPAuthenticatormaakt en controleert de codes van Google Authenticator, Microsoft Authenticator en vergelijkbare apps, met de aanmeldlink voor de QR-code, bescherming tegen hergebruik en herstelcodes. - OpenID Connect.
TsgcHTTP_OIDC_Clientmeldt gebruikers aan bij elke OpenID-provider via het discovery-document en valideert de ID-tokens en de bearer-tokens die je eigen API bereiken. - Mail zonder opgeslagen wachtwoord.
TsgcMailOAuth2haalt en vernieuwt de OAuth2-tokens van Microsoft 365 en Gmail die SMTP, IMAP en POP3 nu verwachten.
Kleine dingen die zich opstapelen
- Rechts-naar-links-pagina's. sgcHTML-pagina's schakelen vanzelf over naar een rechts-naar-links-layout voor Arabisch, Hebreeuws, Perzisch, Urdu en de andere rechts-naar-links-talen, laden de rechts-naar-links-Bootstrap-stylesheet die nu in de bibliotheek zit en spiegelen de componenten van de zijbalk tot het grid.
HtmlDirenDirforceren een richting wanneer je er een nodig hebt. Nieuwe demo 22.RTL. - Geolocatie.
TsgcHTMLComponent_Geolocationleest de GPS-positie van de browser eenmalig of continu uit en stuurt breedtegraad, lengtegraad, nauwkeurigheid, hoogte, richting en snelheid naar de server. - Een grid dat op de server sorteert en filtert.
SortMode := gsmServerenServerFiltersturen de sortering en één filterveld per kolom via htmx, met een tekst- of bereikfilter per kolom (gfkText,gfkRange). Pagination en AutoComplete kregen hetzelfde htmx-pad over gewoon HTTP. - Camerascanner op iPhone.
PolyfillURLlaadt een barcodedecoder in browsers die er geen ingebouwd hebben, enRedirectURLopent een pagina met de gescande code. - Lazarus. De sgcHTML-runtimedemo's zijn nu beschikbaar voor Lazarus en Free Pascal, en het Lazarus-package bevat de CRUD- en MCP Apps-units.
- Waarom werd ik geweigerd? Wanneer een server een WebSocket-verbinding weigert, bijvoorbeeld met een 401 omdat het token is verlopen, is de body van het antwoord beschikbaar in
OnExceptionviaTsgcWSConnectionClient(Connection).HandshakeResponseBody. - Je eigen data op de verbindingsthread.
QueueOptions.DrainedMode := qdmEveryPassactiveertOnQueueDrainedbij elke ronde van de verbindingslus, op de eigen thread van de verbinding, zodat de applicatie vanaf daar haar openstaande data kan versturen. - Keep-alive op WinHTTP. De WinHTTP WebSocket-client krijgt
OnBeforeHeartBeatom bij elk HeartBeat-interval je eigen keep-alive-bericht te versturen. - AI Chat. Met
ImageOutputkan Gemini met afbeeldingen antwoorden en die bericht na bericht blijven bewerken, het OpenAI-verzoek voor afbeeldingen bewerken accepteert de opties van gpt-image-1 en meerdere invoerafbeeldingen, en metTLSOptionskies je de OpenSSL-versie die de providerverzoeken gebruiken. - OpenAPI-client.
TsgcOpenAPI_Client.UserAgentstelt de User-Agent-header van elk verzoek in, of laat hem weg wanneer hij leeg is.
Reparaties die het noemen waard zijn
- Het ondertekenen en valideren van JWT met RSA- en ECDSA-sleutels, en geheugencorruptie in 32-bit applicaties, wanneer OpenSSL statisch is gelinkt.
- De SChannel-handler die bij elke verbinding met een PFX-bestand een kopie van de privésleutel achterliet in de Windows-sleutelopslag, en die op recente Windows-versies het clientcertificaat niet verstuurde.
- Gelijktijdige SChannel-verbindingen met een certificaat uit de Windows-opslag die de handshake lieten mislukken.
- De OAuth2-server die DPoP-bewijzen afwees die met RSA-sleutels waren ondertekend.
- Ondertekende CloudFront-URL's waarvan de handtekening niet URL-veilig gecodeerd was.
.NET
De .NET-library houdt gelijke tred: auth en sessies met een ClaimsPrincipal-brug voor ASP.NET Core, de router, de testhulpmiddelen, SPA-navigatie, het SSE-transport met een native endpoint, gestructureerde output, documentextractie met beide OCR-engines, de realtime spraakagent, het AI Data Pack, Web Push, MCP Apps, het CRUD-component met zijn adapters en de nieuwe TsgcSSEClient, allemaal met dezelfde API-namen als in Delphi.
Razor Tag Helpers voor ASP.NET Core. sgcHTML past nu in een MVC- of Razor Pages-applicatie zoals Telerik UI en DevExpress dat doen. Tag Helpers zoals <sgc-grid>, <sgc-form>, <sgc-autocomplete>, <sgc-dialog> en <sgc-chart>, en hun fluent tegenhangers onder Html.Sgc(), renderen Bootstrap 5 aan de serverkant en praten via htmx met je controllers, zonder JavaScript-framework. Het grid pagineert, sorteert, filtert, doorzoekt en exporteert naar XLSX en PDF over een IQueryable, zodat EF Core alles als SQL uitvoert:
<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());
Invoer bindt met asp-for en toont de ModelState-fouten, en this.SgcCloseDialog("edit-order", refresh: "orders") sluit een bewerkdialoog en laadt het grid opnieuw. Wat de anderen niet hebben is server push: een grafiek met live="true" tekent opnieuw in elke geopende browser wanneer een achtergrondservice hub.BroadcastChartAsync(...) aanroept, via de sgcHTML WebSocket en zonder SignalR-code. Het wordt geleverd in het NuGet-pakket esegece.sgcHTML.AspNetCore, inclusief de Community-editie, en de demo 22.RazorMvc is het bekende ordervoorbeeld daarmee opnieuw opgebouwd.
Upgraden
Alles wat nieuw is, is additief en standaard uitgeschakeld. Zet de nieuwe units erbij, herbouw je packages, en een bestaande applicatie gedraagt zich precies zoals daarvoor.
De volledige versies
- Draai je Delphi-app binnen ChatGPT en Claude
- Zet een screenshot om in een Delphi-webpagina
- Delphi TLS 1.3 zonder OpenSSL-DLL's
- Een Delphi-CRUD-webpagina in vijf minuten
- Stel je Delphi-grid een vraag in gewoon Engels
- Een gesloten browser bereiken, vanuit Delphi
- Delphi-login met Passkeys, SAML SSO, LDAP en TOTP 2FA
- SAML Single Sign-On in Delphi met Entra ID, Okta en AD FS
- Passkeys in Delphi: wachtwoordloos aanmelden met WebAuthn
Bekijk het
Er is een korte video hierover op het eSeGeCe-kanaal.
Vragen, feedback of hulp bij migratie? Neem contact op — je krijgt antwoord van de mensen die de code hebben geschreven.
