sgcWebSockets 2026.10

· Versioni
sgcWebSockets 2026.10

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'è:

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.

Correzioni degne di nota

.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

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.