sgcWebSockets 2026.10 è disponibile. Tre fili conduttori attraversano questa versione: sgcHTML è cresciuto con le parti di cui ha bisogno un'applicazione web aziendale e che non dovrai più scrivere a mano, la crittografia è diventata post-quantistica senza aggiungere una sola libreria esterna, e un nuovo gruppo di componenti di autenticazione Enterprise si occupa della schermata di login.
Applicazioni web: la parte noiosa, fatta
Sessioni, login e CSRF. Il nuovo componente TsgcHTMLAuth e i suoi archivi di sessione gestiscono il cookie, rispondono alle richieste di login e logout, chiudono le sessioni inattive e limitano i tentativi di accesso falliti. Il token CSRF viaggia in un meta tag, htmx lo aggiunge da solo a ogni richiesta, e il server rifiuta un post che non lo porta con sé.
FAuth := TsgcHTMLAuth.Create(Self);
FAuth.SessionStore := TsgcHTMLSessionStore_Memory.Create(Self);
FAuth.CookieName := 'app_session';
FEngine.Auth := FAuth;
Rotte che si leggono come rotte. Parametri di percorso, un filtro sui metodi, e accesso agli header, ai cookie e al corpo:
with FRouter.Routes.Add do
begin
Path := '/customers/{id}/edit';
Methods := [hrmGet, hrmPost];
RequireLogin := True;
RequireRoles := 'admin,sales';
end;
Pagine che puoi testare. DispatchDirect risponde a una richiesta senza che ci sia un socket dietro, e una nuova unità legge l'HTML generato, trova gli elementi per id, classe, tag o attributo e confronta una pagina con una copia salvata, così un cambiamento non voluto nel markup viene notato da un test e non da un cliente.
Una navigazione che sembra un'applicazione. Le pagine cambiano senza un ricaricamento completo e mantengono la posizione di scorrimento e ciò che l'utente stava digitando, con una barra di caricamento, una finestra di dialogo quando la connessione cade e un messaggio quando una richiesta fallisce. Tutto disattivato di default.
Le quattro funzionalità principali
Ognuna di queste ha un proprio articolo, collegato alla fine, quindi qui trovi solo che cos'è:
- MCP Apps. Uno strumento MCP che risponde con una pagina invece che con un paragrafo, renderizzata dentro ChatGPT, Claude o VS Code, costruita con gli stessi componenti di qualsiasi altra pagina sgcHTML.
- Il generatore di pagine con IA. Descrivi una pagina, o consegna al designer uno screenshot, e la costruisce a partire dai tuoi componenti registrati come un candidato che accetti o scarti.
- Il componente CRUD. Elenco, ricerca, paginazione, form, eliminazione e il percorso di scrittura di un dataset, su un TDataSet o sul tuo SQL, con una procedura guidata nell'IDE e un generatore da riga di comando.
- L'AI Data Pack. Fai una domanda in linguaggio semplice a un grid, a una data table o a una tabella pivot, con un parser basato su regole che risponde anche quando non c'è alcuna chiave API.
Push, in due modi
I server sent events possono ora trasportare gli aggiornamenti al posto di un WebSocket, con la ripetizione di ciò che è stato perso durante la disconnessione, e funzionano anche con il semplice server HTTP. Web Push raggiunge un browser che è chiuso. Con loro arrivano una casella di notifiche e una tabella delle preferenze, e il componente di notifica decide quale canale riceve un determinato utente.
Un client EventSource per Delphi
Il nuovo TsgcSSEClient consuma qualsiasi stream di Server-Sent Events ed è incluso in ogni edizione. Si riconnette da solo e invia Last-Event-ID, così il server riprende da dove lo stream si era interrotto. Il campo retry: inviato dal server viene rispettato, OnEvent fornisce il tipo di evento, i dati e l'id, e ReconnectOptions aggiunge backoff e jitter. TLS, proxy e autenticazione si impostano in OnBeforeConnect, che fornisce il client HTTP usato dal componente.
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;
Il parser che sta dietro, TsgcSSEParser, è pubblico. Passagli i byte di qualsiasi text/event-stream in blocchi di qualsiasi dimensione, esattamente ciò che è una risposta in streaming di un LLM o una risposta MCP Streamable HTTP.
FParser := TsgcSSEParser.Create;
FParser.OnEvent := DoSSEEvent;
FParser.Feed('event: delta' + #10 + 'data: {"text":"Hel"}' + #10#10);
Una nuova demo, Demos\20.HTTP_Protocol\17.SSE_Client_Component, la mostra end to end.
IA: risposte su cui puoi agire
TsgcAIChat può richiedere un JSON che segua uno schema fornito da te, su OpenAI, Anthropic, Gemini, DeepSeek, Ollama, Grok e Mistral, tramite il nuovo metodo ChatJSON, che analizza la risposta e chiede di nuovo, allegando l'errore di analisi, quando non riesce a leggerla. Il componente di chat ora invia e riceve anche immagini, e BaseUrl è rispettato da ogni provider e non solo da Ollama, così ognuno di essi può essere puntato verso un proxy o un gateway locale.
Estrazione di documenti: dal PDF al JSON validato
Il nuovo TsgcAIDocumentExtractor prende un PDF o un'immagine e uno schema JSON, e restituisce JSON che è stato verificato rispetto a quello schema. OpenAI, Anthropic e Gemini leggono il PDF direttamente, gli altri modelli con visione leggono immagini. I preset inclusi coprono fatture, ricevute e documenti d'identità (dpInvoice, dpReceipt, dpIDCard), e ogni campo arriva con una confidenza, così OnLowConfidence ti dice quali valori sotto MinConfidence meritano un secondo sguardo. Quando la risposta non valida, il componente chiede di nuovo allegando gli errori (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');
Collega un TsgcAIOCRTesseract, oppure un TsgcAIOCRWindows che usa l'OCR integrato in Windows 10 e versioni successive senza nulla da installare, e imposta OCRMode su domFallback o domAlways, e il testo viene riconosciuto prima in locale, così anche un modello solo testuale in esecuzione su Ollama può eseguire l'estrazione. Per i tuoi prompt, TsgcAIChat guadagna ChatWithDocument, ChatWithDocumentBase64, ChatWithAttachments e ChatJSONWithAttachments, che inviano uno o più file, contenuti in una lista TsgcAIChatAttachments, insieme al messaggio.
Un agente vocale che ascolta, risponde e chiama strumenti
Il nuovo TsgcAIVoiceAgent è un unico componente che ascolta, rileva quando l'utente ha terminato il proprio turno, risponde con la propria voce e chiama i tuoi strumenti, su OpenAI Realtime o Gemini Live. Parla WebSocket, o WebRTC con OpenAI, e funziona su Windows, Android e iOS. I turni vengono rilevati tramite VAD lato server, VAD semantico, un VAD lato client o manualmente (vtdServerVAD, vtdSemanticVAD, vtdClientVAD, vtdManual). Con BargeIn l'utente può interrompere, e l'agente smette di parlare e tronca la risposta nel punto in cui è stata interrotta. OnTranscript fornisce trascrizioni in tempo reale sia dell'utente sia dell'agente.
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;
Gli strumenti arrivano da OnToolCall, e quando un TsgcWSAPI_Client_MCP viene assegnato a MCPClient, gli strumenti di quel server MCP vengono offerti automaticamente al modello. Per la telefonia, Audio.Format passa a G.711 mu-law o A-law a 8 kHz (vafG711ULaw, vafG711ALaw). L'agente vocale è disponibile da Delphi 7 a Delphi 13 e per .NET, e una nuova demo lo trasforma in un assistente vocale per un negozio su un TDataSet.
Crittografia: post-quantistica, in Object Pascal
ML-KEM (FIPS 203), ML-DSA (FIPS 204) e SLH-DSA (FIPS 205), incapsulamento ibrido delle chiavi X-Wing, certificati X.509 post-quantistici e autorità di certificazione, e JWT firmati con ML-DSA. Tutto scritto in Object Pascal nel pacchetto sgcCrypto, senza alcuna libreria esterna, validato rispetto ai vettori di risposta noti del NIST.
Sopra a tutto questo si trova un motore TLS 1.3 e TLS 1.2 nativo, anch'esso in Pascal puro: un client o un server parla TLS senza OpenSSL e senza SChannel, negoziando i gruppi ibridi post-quantistici della RFC 10024, con ALPN, S N I, certificati client e uso opzionale dell'archivio di attendibilità del sistema operativo. TLS 1.2 è disponibile per i peer che non sanno ancora fare TLS 1.3, con suite AES-GCM e ChaCha20-Poly1305 con forward secrecy per impostazione predefinita, master secret esteso e protezione dal downgrade, e TLSOptions.Version imposta la versione minima consentita. I gruppi ibridi restano su TLS 1.3.
Il lato classico è stato irrobustito nello stesso passaggio: RSA a tempo costante e con blinding, moltiplicazione scalare su curva ellittica a tempo costante ed Ed25519, AES e GHASH senza tabelle, chiavi private importate verificate rispetto alla loro metà pubblica, e firme DER non minime rifiutate.
Autenticazione: il login che chiedono tutti
Un nuovo gruppo di componenti di autenticazione risponde alle domande che ogni cliente fa sulla schermata di login. Sono inclusi nelle edizioni Enterprise e All-Access e nel pacchetto sgcAuth, e gli stessi componenti fanno parte di sgcWebSockets .NET.
- Passkey. Il server WebAuthn riconosce l'utente senza che digiti alcun nome, propone le passkey nell'elenco di completamento automatico del browser, conserva più passkey per utente, distingue una passkey sincronizzata da una legata a un solo dispositivo e solleva un evento perché le credenziali restino nel tuo database.
- Single sign-on SAML.
TsgcSAMLServiceProviderrende la tua applicazione un service provider SAML 2.0 per Entra ID, Okta, AD FS, Google Workspace, Keycloak o qualsiasi altro provider di identità. - Active Directory e LDAP.
TsgcLDAPClientautentica gli utenti con la password della directory su LDAPS o StartTLS e legge i gruppi di appartenenza, gruppi annidati compresi. - Codici da un'app di autenticazione.
TsgcTOTPAuthenticatorgenera e verifica i codici di Google Authenticator, Microsoft Authenticator e simili, con il link di registrazione per il QR code, la protezione contro il riutilizzo e i codici di recupero. - OpenID Connect.
TsgcHTTP_OIDC_Clientautentica gli utenti con qualsiasi provider OpenID tramite il documento di discovery e verifica gli ID token e i bearer token che arrivano alla tua API. - Posta senza password memorizzata.
TsgcMailOAuth2ottiene e rinnova i token OAuth2 di Microsoft 365 e Gmail che oggi SMTP, IMAP e POP3 richiedono.
Correzioni degne di nota
- La firma e la validazione dei JWT con chiavi RSA ed ECDSA, e una corruzione di memoria nelle applicazioni a 32 bit, quando OpenSSL è collegato staticamente.
- Il gestore SChannel che lasciava una copia della chiave privata nell'archivio chiavi di Windows per ogni connessione che usava un file PFX, e che non inviava il certificato client sulle versioni recenti di Windows.
- Le connessioni SChannel concorrenti che usavano un certificato dall'archivio di Windows che fallivano l'handshake.
- Il server OAuth2 che rifiutava le prove DPoP firmate con chiavi RSA.
- Gli URL firmati di CloudFront la cui firma non era codificata in modo sicuro per URL.
.NET
La libreria .NET tiene il passo: autenticazione e sessioni con un ponte ClaimsPrincipal per ASP.NET Core, il router, gli strumenti di test, la navigazione SPA, il trasporto SSE con un endpoint nativo, l'output strutturato, l'estrazione di documenti con entrambi i motori OCR, l'agente vocale in tempo reale, l'AI Data Pack, Web Push, MCP Apps, il componente CRUD con i suoi adattatori e il nuovo TsgcSSEClient, tutto con gli stessi nomi di API di Delphi.
Tag Helper Razor per ASP.NET Core. sgcHTML ora si integra in un'applicazione MVC o Razor Pages come fanno Telerik UI e DevExpress. Tag Helper come <sgc-grid>, <sgc-form>, <sgc-autocomplete>, <sgc-dialog> e <sgc-chart>, e i loro equivalenti fluent sotto Html.Sgc(), generano Bootstrap 5 sul server e dialogano con i tuoi controller tramite htmx, senza alcun framework JavaScript. La griglia pagina, ordina, filtra, cerca ed esporta in XLSX e PDF su un IQueryable, così EF Core esegue tutto come 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());
I campi si collegano con asp-for e mostrano gli errori di ModelState, e this.SgcCloseDialog("edit-order", refresh: "orders") chiude una finestra di modifica e ricarica la griglia. Ciò che gli altri non hanno è il push dal server: un grafico con live="true" si ridisegna in ogni browser aperto quando un servizio in background chiama hub.BroadcastChartAsync(...), tramite il WebSocket di sgcHTML e senza codice SignalR. È distribuito nel pacchetto NuGet esegece.sgcHTML.AspNetCore, edizione Community inclusa, e la demo 22.RazorMvc è il noto esempio degli ordini ricostruito con esso.
Aggiornamento
Tutto ciò che è nuovo è additivo ed è disattivato di default. Aggiungi le nuove unit, ricompila i tuoi pacchetti, e un'applicazione esistente si comporterà esattamente come prima.
Le versioni complete
- Esegui la tua applicazione Delphi dentro ChatGPT e Claude
- Trasforma uno screenshot in una pagina web Delphi
- Delphi TLS 1.3 senza DLL OpenSSL
- Una pagina web CRUD in Delphi in cinque minuti
- Fai una domanda alla tua grid Delphi in inglese semplice
- Raggiungi un browser chiuso, da Delphi
- Login Delphi con Passkey, SAML SSO, LDAP e TOTP 2FA
- Single Sign-On SAML in Delphi con Entra ID, Okta e AD FS
Guardalo in video
C'è un breve video su questo sul canale eSeGeCe.
Domande, feedback o aiuto per la migrazione? Mettiti in contatto — riceverai una risposta dalle persone che hanno scritto il codice.
