sgcWebSockets 2026.10

· Lançamentos
sgcWebSockets 2026.10

O sgcWebSockets 2026.10 já está disponível. Três fios condutores atravessam esta versão: o sgcHTML cresceu com as partes de que uma aplicação web de negócio precisa e que você não vai mais precisar escrever à mão, a criptografia se tornou pós-quântica sem adicionar uma única biblioteca externa, e um novo conjunto de componentes de autenticação Enterprise assumiu a tela de login.

Aplicações web: a parte chata, resolvida

Sessões, login e CSRF. O novo componente TsgcHTMLAuth e seus armazenamentos de sessão mantêm o cookie, respondem às requisições de login e logout, encerram sessões inativas e limitam tentativas de login malsucedidas. O token CSRF viaja em uma meta tag, o htmx o adiciona sozinho a cada requisição, e o servidor rejeita um post que não o carregue.

FAuth := TsgcHTMLAuth.Create(Self);
FAuth.SessionStore := TsgcHTMLSessionStore_Memory.Create(Self);
FAuth.CookieName := 'app_session';
FEngine.Auth := FAuth;

Rotas que se leem como rotas. Parâmetros de caminho, um filtro de métodos, e acesso aos cabeçalhos, aos cookies e ao corpo da requisição:

with FRouter.Routes.Add do
begin
  Path := '/customers/{id}/edit';
  Methods := [hrmGet, hrmPost];
  RequireLogin := True;
  RequireRoles := 'admin,sales';
end;

Páginas que você pode testar. O DispatchDirect responde a uma requisição sem que haja um socket por trás, e uma nova unit lê o HTML gerado, encontra elementos por id, classe, tag ou atributo e compara uma página com uma cópia salva, de modo que uma mudança não intencional na marcação seja notada por um teste, e não por um cliente.

Navegação que parece uma aplicação. As páginas mudam sem uma recarga completa e mantêm a posição de rolagem e o que o usuário estava digitando, com uma barra de carregamento, uma caixa de diálogo quando a conexão cai e uma mensagem quando uma requisição falha. Tudo isso desativado por padrão.

As quatro funcionalidades principais

Cada uma delas tem seu próprio artigo, linkado no final, então aqui vai apenas o que é:

Push, de duas formas

Os server sent events agora podem transportar as atualizações em vez de um WebSocket, com repetição do que foi perdido durante a desconexão, e funcionam com o servidor HTTP comum. O Web Push alcança um navegador que está fechado. Uma caixa de entrada de notificações e uma tabela de preferências vêm junto, e o componente de notificação decide qual canal cada usuário recebe.

Um Cliente EventSource para Delphi

O novo TsgcSSEClient consome qualquer stream de Server-Sent Events e está disponível em todas as edições. Ele se reconecta sozinho e envia Last-Event-ID, para que o servidor retome de onde o stream parou. O campo retry: enviado pelo servidor é respeitado, o OnEvent entrega o tipo do evento, os dados e o id, e o ReconnectOptions adiciona backoff e jitter. TLS, proxy e autenticação são configurados em OnBeforeConnect, que entrega o cliente HTTP usado pelo 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;

O parser por trás dele, TsgcSSEParser, é público. Alimente-o com os bytes de qualquer text/event-stream em blocos de qualquer tamanho, que é exatamente o que uma resposta em streaming de um LLM ou uma resposta MCP Streamable HTTP são.

FParser := TsgcSSEParser.Create;
FParser.OnEvent := DoSSEEvent;
FParser.Feed('event: delta' + #10 + 'data: {"text":"Hel"}' + #10#10);

Uma nova demo, Demos\20.HTTP_Protocol\17.SSE_Client_Component, mostra tudo isso de ponta a ponta.

IA: respostas sobre as quais você pode agir

O TsgcAIChat pode pedir um JSON que siga um schema fornecido por você, na OpenAI, Anthropic, Gemini, DeepSeek, Ollama, Grok e Mistral, por meio do novo método ChatJSON, que analisa a resposta e pergunta mais uma vez, anexando o erro de análise, quando ela não pode ser lida. O componente de chat agora também envia e recebe imagens, e o BaseUrl agora é respeitado por todos os provedores, e não apenas pelo Ollama, de modo que qualquer um deles pode ser apontado para um proxy ou um gateway local.

Extração de documentos: do PDF ao JSON validado

O novo TsgcAIDocumentExtractor recebe um PDF ou uma imagem e um schema JSON, e devolve um JSON que foi verificado contra esse schema. A OpenAI, a Anthropic e a Gemini leem o PDF diretamente, os demais modelos de visão leem imagens. Predefinições incorporadas cobrem faturas, recibos e documentos de identidade (dpInvoice, dpReceipt, dpIDCard), e cada campo vem com um nível de confiança, então OnLowConfidence avisa quais valores abaixo de MinConfidence merecem uma segunda olhada. Quando a resposta não passa na validação, o componente pergunta mais uma vez anexando os erros (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');

Conecte um TsgcAIOCRTesseract, ou um TsgcAIOCRWindows que usa o OCR embutido no Windows 10 e versões posteriores sem nada para instalar, e defina OCRMode como domFallback ou domAlways, e o texto é reconhecido localmente primeiro, de modo que até um modelo somente de texto rodando no Ollama pode fazer a extração. Para seus próprios prompts, o TsgcAIChat ganha ChatWithDocument, ChatWithDocumentBase64, ChatWithAttachments e ChatJSONWithAttachments, que enviam um ou vários arquivos, mantidos em uma lista TsgcAIChatAttachments, junto com a mensagem.

Um agente de voz que escuta, responde e chama ferramentas

O novo TsgcAIVoiceAgent é um único componente que escuta, detecta quando o usuário terminou sua fala, responde com a própria voz e chama suas ferramentas, sobre a OpenAI Realtime ou a Gemini Live. Ele fala WebSocket, ou WebRTC com a OpenAI, e roda no Windows, Android e iOS. As falas são detectadas por VAD de servidor, VAD semântico, um VAD do lado do cliente ou manualmente (vtdServerVAD, vtdSemanticVAD, vtdClientVAD, vtdManual). Com BargeIn o usuário pode interromper, e o agente para de falar e trunca a resposta no ponto em que foi cortada. OnTranscript entrega transcrições ao vivo tanto do usuário quanto do 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;

As ferramentas vêm de OnToolCall, e quando um TsgcWSAPI_Client_MCP é atribuído a MCPClient, as ferramentas desse servidor MCP são oferecidas ao modelo automaticamente. Para telefonia, Audio.Format muda para G.711 mu-law ou A-law a 8 kHz (vafG711ULaw, vafG711ALaw). O agente de voz está disponível do Delphi 7 ao Delphi 13 e para o .NET, e uma nova demo o transforma em um assistente de voz de loja sobre um TDataSet.

Criptografia: pós-quântica, em Object Pascal

ML-KEM (FIPS 203), ML-DSA (FIPS 204) e SLH-DSA (FIPS 205), encapsulamento híbrido de chaves X-Wing, certificados X.509 pós-quânticos e autoridades certificadoras, e JWT assinados com ML-DSA. Tudo isso escrito em Object Pascal dentro do pacote sgcCrypto, sem nenhuma biblioteca externa, validado contra os vetores de resposta conhecidos do NIST.

Sobre isso se apoia um mecanismo TLS 1.3 e TLS 1.2 nativo, também em Pascal puro: um cliente ou um servidor fala TLS sem OpenSSL e sem SChannel, negociando os grupos híbridos pós-quânticos da RFC 10024, com ALPN, S N I, certificados de cliente e uso opcional do repositório de confiança do sistema operacional. O TLS 1.2 está disponível para os pares que ainda não suportam TLS 1.3, com suítes AES-GCM e ChaCha20-Poly1305 com sigilo de encaminhamento por padrão, segredo mestre estendido e proteção contra downgrade, e TLSOptions.Version define a versão mínima permitida. Os grupos híbridos permanecem exclusivos do TLS 1.3.

O lado clássico foi reforçado na mesma passada: RSA em tempo constante e com blinding, multiplicação escalar de curva elíptica em tempo constante e Ed25519, AES e GHASH sem tabelas, chaves privadas importadas verificadas contra sua metade pública, e assinaturas DER não mínimas rejeitadas.

Autenticação: o login que todos pedem

Um novo conjunto de componentes de autenticação responde às perguntas que todo cliente faz sobre a tela de login. Eles vêm nas edições Enterprise e All-Access e no pacote sgcAuth, e os mesmos componentes fazem parte do sgcWebSockets .NET.

Correções que merecem menção

.NET

A biblioteca .NET mantém o ritmo: autenticação e sessões com uma ponte ClaimsPrincipal para o ASP.NET Core, o roteador, os auxiliares de teste, a navegação SPA, o transporte SSE com um endpoint nativo, a saída estruturada, a extração de documentos com os dois mecanismos de OCR, o agente de voz em tempo real, o AI Data Pack, o Web Push, o MCP Apps, o componente CRUD com seus adaptadores e o novo TsgcSSEClient, tudo com os mesmos nomes de API do Delphi.

Razor Tag Helpers para ASP.NET Core. O sgcHTML agora se encaixa em uma aplicação MVC ou Razor Pages do mesmo jeito que o Telerik UI e o DevExpress. Tag Helpers como <sgc-grid>, <sgc-form>, <sgc-autocomplete>, <sgc-dialog> e <sgc-chart>, e seus equivalentes fluentes em Html.Sgc(), renderizam Bootstrap 5 no servidor e conversam com seus controllers via htmx, sem framework JavaScript. O grid pagina, ordena, filtra, pesquisa e exporta para XLSX e PDF sobre um IQueryable, então o EF Core executa tudo como 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());

Os campos se vinculam com asp-for e mostram os erros de ModelState, e this.SgcCloseDialog("edit-order", refresh: "orders") fecha um diálogo de edição e recarrega o grid. O que os outros não têm é o push do servidor: um gráfico com live="true" é redesenhado em todo navegador aberto quando um serviço em segundo plano chama hub.BroadcastChartAsync(...), pelo WebSocket do sgcHTML e sem código SignalR. Ele é distribuído no pacote NuGet esegece.sgcHTML.AspNetCore, inclusive na edição Community, e a demo 22.RazorMvc é o conhecido exemplo de pedidos reconstruído com ele.

Atualização

Tudo o que é novo é aditivo e vem desativado por padrão. Adicione as novas units, reconstrua os seus pacotes, e uma aplicação existente vai se comportar exatamente como antes.

As versões completas

Assista ao vídeo

Há um vídeo curto sobre isso no canal da eSeGeCe.

Dúvidas, feedback ou ajuda com a migração? Entre em contato — você receberá uma resposta das pessoas que escreveram o código.