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.
Una pagina progettata su un form, senza codice. Trascina un TsgcWebSocketHTTPServer, un TsgcHTMLDesignServer, un TsgcHTMLDesignSurface e alcuni componenti sgcHTML su un form VCL, e WSServer.Active := True è l'unica riga da scrivere. Il design server costruisce la pagina a partire dal form e serve Bootstrap, htmx e Chart.js dall'eseguibile. Le azioni della Surface eseguono codice Delphi quando l'utente fa clic o invia un modulo: imposta Source e Target nell'Object Inspector, fai doppio clic su OnExecute, e la destinazione viene aggiornata sul posto senza ricaricare la pagina. Sei demo QuickStart in Demos\60.HTML\00.QuickStart lo insegnano un passo alla volta, la guida Getting Started (PDF, in inglese) le spiega, e l'avvio rapido di sgcHTML mostra il percorso di 5 minuti.
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.
MCP: la specifica 2026-07-28
Il server e il client MCP ora parlano la revisione 2026-07-28 del Model Context Protocol. Lo stesso server risponde sia ai nuovi client stateless sia ai client 2025-11-25 esistenti, come VS Code e Claude, quindi per i client che hai già non cambia nulla. Sul client, MCPOptions.ProtocolEra impostato su Auto prova prima il nuovo protocollo, ripiega sul precedente quando il server non lo supporta e ricorda la risposta per ogni server.
- Discovery e header.
server/discover, la versione del protocollo e i dettagli del client inviati con ogni richiesta, gli header di richiestaMcp-MethodeMcp-Nameverificati dal server, i suggerimenti di cache sui risultati degli elenchi e i nuovi codici di errore. I parametri degli strumenti contrassegnati conx-mcp-headerviaggiano come header della richiesta. - Un solo stream per ogni cambiamento. Con
subscriptions/listenun client apre un unico stream di lunga durata e riceve le modifiche agli elenchi di strumenti, prompt e risorse e gli aggiornamenti delle risorse. I metodi di invio delle notifiche che già chiami raggiungono anche questi client. - Richieste a più passaggi. Uno strumento, un prompt o una risorsa può chiedere input al client, un modulo, una pagina web, una risposta dell'IA o le root del client, e proseguire quando il client chiama di nuovo con le risposte. Lo stato conservato tra le chiamate è firmato e scade (
MCPOptions.MRTR). Sul client,OnMCPInputRequiredle gestisce, e i gestori già esistenti di roots, sampling ed elicitation rispondono da soli. - Task. Uno strumento di lunga durata restituisce un task che il client segue fino alla fine, a cui risponde quando richiede input e che può annullare. Sul server si usa
MCPOptions.TasksconCreateTask, sul clientOnMCPTaskCreated,OnMCPTaskStatuseOnMCPTaskCompleted. - Autorizzazione del client. Con
MCPOptions.Authorizationattivo, un 401 non è più un vicolo cieco: il client trova da solo il server di autorizzazione, si registra con un client id metadata document o con la registrazione dinamica, accede con PKCE, controlla l'issuer e rinnova il token quando scade.
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.
TLS sul server, a modo tuo
In chiaro e TLS sulla stessa porta. SSLOptions.AllowPlainText permette a un server TLS di accettare anche connessioni HTTP e WebSocket in chiaro sulla stessa porta, distinguendole dal primo byte inviato dal client. SSLOptions.PlainTextPolicy le serve, le reindirizza con un 308 verso https oppure le rifiuta con un 400, e Server.IsTLS(AContext) ti dice in OnCommandGet su quale trasporto è arrivata una richiesta. Funziona con gli IOHandler predefinito, IOCP ed EPOLL.
HSTS per ottenere una A+. SecurityOptions.HSTS_Options aggiunge l'header Strict-Transport-Security a ogni risposta inviata su TLS, che è ciò che SSL Labs richiede per assegnare il voto A+. Non viene mai inviato su HTTP in chiaro e non viene aggiunto due volte quando il tuo codice lo imposta già.
Porta la tua libreria TLS. I server IOCP ed EPOLL non sono più legati a OpenSSL. Scrivi un provider TLS per la tua libreria, SecureBlackbox ad esempio, e il motore guidato dagli eventi lo pilota esattamente come quello integrato.
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.
Piccole cose che si sommano
- Pagine da destra a sinistra. Le pagine sgcHTML passano da sole a un layout da destra a sinistra per arabo, ebraico, persiano, urdu e le altre lingue da destra a sinistra, caricano il foglio di stile Bootstrap da destra a sinistra ora incluso nella libreria e rispecchiano i componenti dalla barra laterale alla griglia.
HtmlDireDirforzano una direzione quando serve. Nuova demo 22.RTL. - Geolocalizzazione.
TsgcHTMLComponent_Geolocationlegge la posizione GPS del browser una sola volta o in modo continuo e invia al server latitudine, longitudine, precisione, altitudine, direzione e velocità. - Una griglia che ordina e filtra sul server.
SortMode := gsmServereServerFilterinviano l'ordinamento e un campo di filtro per colonna tramite htmx, con un filtro di testo o di intervallo per colonna (gfkText,gfkRange). Paginazione e AutoComplete hanno ottenuto lo stesso percorso htmx su HTTP semplice. - Scanner con la fotocamera su iPhone.
PolyfillURLcarica un decodificatore di codici a barre sui browser che non ne hanno uno integrato, eRedirectURLapre una pagina con il codice scansionato. - Lazarus. Le demo a run time di sgcHTML sono ora disponibili per Lazarus e Free Pascal, e il pacchetto Lazarus include le unit CRUD e MCP Apps.
- Perché sono stato rifiutato? Quando un server rifiuta una connessione WebSocket, ad esempio con un 401 perché il token è scaduto, il corpo della sua risposta è disponibile in
OnExceptiontramiteTsgcWSConnectionClient(Connection).HandshakeResponseBody. - I tuoi dati sul thread della connessione.
QueueOptions.DrainedMode := qdmEveryPassgeneraOnQueueDraineda ogni passaggio del ciclo della connessione, sul thread della connessione stessa, così l'applicazione può inviare da lì i dati in sospeso. - Keep-alive su WinHTTP. Il client WebSocket WinHTTP ottiene
OnBeforeHeartBeatper inviare il tuo messaggio di keep-alive a ogni intervallo di HeartBeat. - AI Chat.
ImageOutputpermette a Gemini di rispondere con immagini e di continuare a modificarle messaggio dopo messaggio, la richiesta di modifica immagine di OpenAI accetta le opzioni di gpt-image-1 e più immagini in ingresso, eTLSOptionssceglie la versione di OpenSSL usata dalle richieste al provider. - Client OpenAPI.
TsgcOpenAPI_Client.UserAgentimposta l'header User-Agent di ogni richiesta, oppure lo omette quando è vuoto.
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
- Passkey in Delphi: accesso senza password con WebAuthn
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.
