sgcWebSockets 2026.10 jest już dostępny. Przez tę wersję przewijają się trzy wątki: sgcHTML urosł o elementy, których potrzebuje biznesowa aplikacja webowa i których nie musisz już pisać ręcznie, kryptografia stała się postkwantowa bez dodania choćby jednej zewnętrznej biblioteki, a nowy zestaw komponentów uwierzytelniania Enterprise przejmuje ekran logowania.
Aplikacje webowe: nudna część, załatwiona
Sesje, logowanie i CSRF. Nowy komponent TsgcHTMLAuth i jego magazyny sesji utrzymują ciasteczko, odpowiadają na żądania logowania i wylogowania, zamykają nieaktywne sesje i ograniczają nieudane próby logowania. Token CSRF podróżuje w znaczniku meta, htmx dodaje go samodzielnie do każdego żądania, a serwer odrzuca post, który go nie niesie.
FAuth := TsgcHTMLAuth.Create(Self);
FAuth.SessionStore := TsgcHTMLSessionStore_Memory.Create(Self);
FAuth.CookieName := 'app_session';
FEngine.Auth := FAuth;
Trasy, które czyta się jak trasy. Parametry ścieżki, filtr metod oraz dostęp do nagłówków, ciasteczek i treści żądania:
with FRouter.Routes.Add do
begin
Path := '/customers/{id}/edit';
Methods := [hrmGet, hrmPost];
RequireLogin := True;
RequireRoles := 'admin,sales';
end;
Strony, które można testować. DispatchDirect odpowiada na żądanie bez żadnego gniazda za nim, a nowa jednostka odczytuje wygenerowany HTML, znajduje elementy po id, klasie, znaczniku lub atrybucie i porównuje stronę z zapisaną kopią, dzięki czemu niezamierzoną zmianę w znacznikach wychwytuje test, a nie klient.
Nawigacja, która przypomina aplikację. Strony zmieniają się bez pełnego przeładowania i zachowują pozycję przewijania oraz to, co użytkownik akurat wpisywał, z paskiem ładowania, oknem dialogowym, gdy połączenie się zrywa, i komunikatem, gdy żądanie się nie powiedzie. Wszystko to domyślnie wyłączone.
Cztery najważniejsze funkcje
Każda z nich ma osobny artykuł, podlinkowany na końcu, więc tutaj tylko czym jest:
- MCP Apps. Narzędzie MCP, które odpowiada stroną zamiast akapitem, renderowaną wewnątrz ChatGPT, Claude lub VS Code, zbudowaną z tych samych komponentów co każda inna strona sgcHTML.
- Generator stron oparty na AI. Opisz stronę albo daj projektantowi zrzut ekranu, a on zbuduje ją z twoich zarejestrowanych komponentów jako kandydata, którego akceptujesz albo odrzucasz.
- Komponent CRUD. Lista, wyszukiwanie, stronicowanie, formularz, usuwanie i ścieżka zapisu jednego zbioru danych, na TDataSet albo na twoim własnym SQL, z kreatorem w IDE i generatorem z linii poleceń.
- AI Data Pack. Zadaj pytanie w zwykłym języku siatce, tabeli danych albo tabeli przestawnej, z parserem opartym na regułach, który odpowiada nawet wtedy, gdy nie ma żadnego klucza API.
Push, na dwa sposoby
Server sent events mogą teraz przenosić aktualizacje zamiast WebSocketu, z odtworzeniem tego, co zostało pominięte podczas rozłączenia, i działa to ze zwykłym serwerem HTTP. Web Push dociera do przeglądarki, która jest zamknięta. Razem z nimi pojawiają się skrzynka powiadomień i tabela preferencji, a komponent powiadomień decyduje, który kanał otrzymuje dany użytkownik.
Klient EventSource dla Delphi
Nowy TsgcSSEClient konsumuje dowolny strumień Server-Sent Events i jest dostępny w każdej edycji. Łączy się ponownie samodzielnie i wysyła Last-Event-ID, dzięki czemu serwer wznawia strumień w miejscu, w którym się zatrzymał. Pole retry: wysyłane przez serwer jest respektowane, OnEvent przekazuje typ zdarzenia, dane i id, a ReconnectOptions dodaje backoff i jitter. TLS, proxy i uwierzytelnianie ustawia się w OnBeforeConnect, które przekazuje klienta HTTP używanego przez komponent.
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;
Parser, na którym to bazuje, TsgcSSEParser, jest publiczny. Podawaj mu bajty dowolnego text/event-stream w fragmentach o dowolnym rozmiarze, czyli dokładnie tym, czym jest odpowiedź strumieniowa LLM lub odpowiedź MCP Streamable HTTP.
FParser := TsgcSSEParser.Create;
FParser.OnEvent := DoSSEEvent;
FParser.Feed('event: delta' + #10 + 'data: {"text":"Hel"}' + #10#10);
Nowe demo, Demos\20.HTTP_Protocol\17.SSE_Client_Component, pokazuje to od początku do końca.
AI: odpowiedzi, na których można działać
TsgcAIChat może poprosić o JSON zgodny ze schematem, który podasz, w OpenAI, Anthropic, Gemini, DeepSeek, Ollama, Grok i Mistral, przez nową metodę ChatJSON, która analizuje odpowiedź i pyta ponownie, dołączając błąd analizy, gdy nie da się jej odczytać. Komponent czatu wysyła i odbiera teraz także obrazy, a BaseUrl jest teraz respektowany przez każdego dostawcę, a nie tylko przez Ollama, więc każdego z nich można skierować na proxy albo lokalną bramę.
Ekstrakcja dokumentów: od PDF do zwalidowanego JSON
Nowy TsgcAIDocumentExtractor przyjmuje PDF albo obraz oraz schemat JSON i zwraca JSON, który został sprawdzony wobec tego schematu. OpenAI, Anthropic i Gemini odczytują PDF bezpośrednio, pozostałe modele wizyjne odczytują obrazy. Wbudowane predefiniowane zestawy obejmują faktury, paragony i dokumenty tożsamości (dpInvoice, dpReceipt, dpIDCard), a każde pole otrzymuje poziom pewności, więc OnLowConfidence mówi, które wartości poniżej MinConfidence warto sprawdzić jeszcze raz. Gdy odpowiedź nie przejdzie walidacji, komponent pyta ponownie, dołączając błędy (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');
Podłącz TsgcAIOCRTesseract albo TsgcAIOCRWindows, który korzysta z OCR wbudowanego w Windows 10 i nowsze bez niczego do zainstalowania, i ustaw OCRMode na domFallback albo domAlways, a tekst zostanie najpierw rozpoznany lokalnie, więc nawet model działający wyłącznie na tekście na Ollama poradzi sobie z ekstrakcją. Do własnych promptów TsgcAIChat zyskuje ChatWithDocument, ChatWithDocumentBase64, ChatWithAttachments i ChatJSONWithAttachments, które wysyłają wraz z wiadomością jeden lub kilka plików przechowywanych na liście TsgcAIChatAttachments.
Agent głosowy, który słucha, odpowiada i wywołuje narzędzia
Nowy TsgcAIVoiceAgent to jeden komponent, który słucha, wykrywa, kiedy użytkownik skończył swoją turę, odpowiada własnym głosem i wywołuje Twoje narzędzia, przez OpenAI Realtime albo Gemini Live. Mówi WebSocket, albo WebRTC z OpenAI, i działa na Windows, Android i iOS. Tury są wykrywane przez VAD serwera, semantyczny VAD, VAD po stronie klienta albo ręcznie (vtdServerVAD, vtdSemanticVAD, vtdClientVAD, vtdManual). Dzięki BargeIn użytkownik może przerwać, a agent przestaje mówić i ucina swoją odpowiedź w miejscu, w którym została przerwana. OnTranscript dostarcza transkrypcje na żywo zarówno użytkownika, jak i agenta.
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;
Narzędzia pochodzą z OnToolCall, a kiedy TsgcWSAPI_Client_MCP zostanie przypisany do MCPClient, narzędzia tego serwera MCP są automatycznie oferowane modelowi. Do telefonii Audio.Format przełącza się na G.711 mu-law albo A-law przy 8 kHz (vafG711ULaw, vafG711ALaw). Agent głosowy jest dostępny od Delphi 7 do Delphi 13 oraz dla .NET, a nowa demonstracja zamienia go w głosowego asystenta sklepowego działającego na TDataSet.
Kryptografia: postkwantowa, w Object Pascalu
ML-KEM (FIPS 203), ML-DSA (FIPS 204) i SLH-DSA (FIPS 205), hybrydowa enkapsulacja kluczy X-Wing, postkwantowe certyfikaty X.509 i urzędy certyfikacji oraz JWT podpisywane ML-DSA. Wszystko napisane w Object Pascalu w pakiecie sgcCrypto, bez żadnej zewnętrznej biblioteki, zweryfikowane wobec znanych wektorów odpowiedzi NIST.
Na tym opiera się natywny silnik TLS 1.3 i TLS 1.2, także w czystym Pascalu: klient albo serwer mówi w TLS bez OpenSSL i bez SChannel, negocjując hybrydowe postkwantowe grupy z RFC 10024, z ALPN, S N I, certyfikatami klienta i opcjonalnym użyciem magazynu zaufania systemu operacyjnego. TLS 1.2 jest dostępny dla partnerów, którzy nie potrafią jeszcze obsłużyć TLS 1.3, domyślnie z zestawami AES-GCM i ChaCha20-Poly1305 zapewniającymi utajnianie z wyprzedzeniem, rozszerzonym sekretem głównym i ochroną przed obniżeniem wersji, a TLSOptions.Version ustawia najniższą dopuszczalną wersję. Grupy hybrydowe pozostają wyłącznie w TLS 1.3.
Klasyczna strona została wzmocniona przy tej samej okazji: zaślepione RSA w stałym czasie, mnożenie skalarne krzywej eliptycznej w stałym czasie i Ed25519, AES i GHASH bez tabel, importowane klucze prywatne sprawdzane wobec ich publicznej połowy oraz odrzucane niezminimalizowane podpisy DER.
Uwierzytelnianie: logowanie, o które pytają wszyscy
Nowy zestaw komponentów uwierzytelniania odpowiada na pytania, które o ekran logowania zadaje każdy klient. Są w edycjach Enterprise i All-Access oraz w pakiecie sgcAuth, a te same komponenty są częścią sgcWebSockets .NET.
- Passkeys. Serwer WebAuthn loguje użytkownika bez wpisywania nazwy, podpowiada klucze w liście autouzupełniania przeglądarki, przechowuje kilka kluczy na użytkownika, odróżnia klucz synchronizowany od związanego z jednym urządzeniem i zgłasza zdarzenie, dzięki któremu poświadczenia leżą w Twojej własnej bazie danych.
- Jednokrotne logowanie SAML.
TsgcSAMLServiceProviderzamienia Twoją aplikację w dostawcę usługi SAML 2.0 dla Entra ID, Okta, AD FS, Google Workspace, Keycloak i każdego innego dostawcy tożsamości. - Active Directory i LDAP.
TsgcLDAPClientloguje użytkowników hasłem z katalogu przez LDAPS lub StartTLS i odczytuje ich grupy, razem z grupami zagnieżdżonymi. - Kody z aplikacji uwierzytelniającej.
TsgcTOTPAuthenticatorgeneruje i sprawdza kody Google Authenticator, Microsoft Authenticator i podobnych aplikacji, wraz z linkiem rejestracyjnym do kodu QR, ochroną przed ponownym użyciem i kodami odzyskiwania. - OpenID Connect.
TsgcHTTP_OIDC_Clientloguje użytkowników u dowolnego dostawcy OpenID na podstawie dokumentu discovery i sprawdza tokeny ID oraz tokeny bearer docierające do Twojego własnego API. - Poczta bez zapisanego hasła.
TsgcMailOAuth2pobiera i odświeża tokeny OAuth2 Microsoft 365 i Gmaila, których oczekują dziś SMTP, IMAP i POP3.
Poprawki warte wymienienia
- Podpisywanie i walidacja JWT kluczami RSA i ECDSA oraz uszkodzenie pamięci w aplikacjach 32-bitowych, gdy OpenSSL jest linkowany statycznie.
- Obsługa SChannel zostawiała kopię klucza prywatnego w magazynie kluczy Windows przy każdym połączeniu korzystającym z pliku PFX i nie wysyłała certyfikatu klienta na nowszych wersjach Windows.
- Równoczesne połączenia SChannel korzystające z certyfikatu z magazynu Windows kończyły się niepowodzeniem uzgadniania.
- Serwer OAuth2 odrzucał dowody DPoP podpisane kluczami RSA.
- Podpisane adresy URL CloudFront, których podpis nie był zakodowany w sposób bezpieczny dla URL.
.NET
Biblioteka .NET nadąża: uwierzytelnianie i sesje z mostkiem ClaimsPrincipal dla ASP.NET Core, router, narzędzia testowe, nawigacja SPA, transport SSE z natywnym punktem końcowym, ustrukturyzowane wyjście, ekstrakcja dokumentów z obydwoma silnikami OCR, agent głosowy w czasie rzeczywistym, AI Data Pack, Web Push, MCP Apps, komponent CRUD wraz z adapterami oraz nowy TsgcSSEClient, wszystko pod tymi samymi nazwami API co w Delphi.
Razor Tag Helpery dla ASP.NET Core. sgcHTML pasuje teraz do aplikacji MVC lub Razor Pages tak samo jak Telerik UI i DevExpress. Tag Helpery takie jak <sgc-grid>, <sgc-form>, <sgc-autocomplete>, <sgc-dialog> i <sgc-chart> oraz ich płynne odpowiedniki w Html.Sgc() renderują Bootstrap 5 po stronie serwera i komunikują się z Twoimi kontrolerami przez htmx, bez frameworka JavaScript. Grid stronicuje, sortuje, filtruje, przeszukuje i eksportuje do XLSX i PDF dane z IQueryable, więc EF Core wykonuje to wszystko jako 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());
Pola wiążą się przez asp-for i pokazują błędy ModelState, a this.SgcCloseDialog("edit-order", refresh: "orders") zamyka okno edycji i odświeża grid. Tym, czego nie mają inni, jest wypychanie danych z serwera: wykres z live="true" rysuje się na nowo w każdej otwartej przeglądarce, gdy usługa w tle wywołuje hub.BroadcastChartAsync(...), przez WebSocket sgcHTML i bez kodu SignalR. Jest dostarczany w pakiecie NuGet esegece.sgcHTML.AspNetCore, łącznie z edycją Community, a demo 22.RazorMvc to dobrze znany przykład zamówień zbudowany od nowa z jego użyciem.
Aktualizacja
Wszystko, co nowe, jest addytywne i domyślnie wyłączone. Dodaj nowe jednostki, przebuduj swoje pakiety, a istniejąca aplikacja będzie zachowywać się dokładnie tak jak wcześniej.
Pełne wersje
- Uruchom swoją aplikację Delphi wewnątrz ChatGPT i Claude
- Zamień zrzut ekranu w stronę webową Delphi
- Delphi TLS 1.3 bez DLL-i OpenSSL
- Strona internetowa CRUD w Delphi w pięć minut
- Zadaj pytanie swojej siatce Delphi prostym językiem angielskim
- Dotrzyj do zamkniętej przeglądarki, z Delphi
- Logowanie w Delphi z Passkeys, SAML SSO, LDAP i TOTP 2FA
- Jednokrotne logowanie SAML w Delphi z Entra ID, Okta i AD FS
Zobacz wideo
Jest na ten temat krótkie wideo na kanale eSeGeCe.
Pytania, uwagi lub pomoc przy migracji? Skontaktuj się z nami — otrzymasz odpowiedź od osób, które napisały ten kod.
