sgcWebSockets 2026.10がリリースされました。このバージョンには三つの軸があります。sgcHTMLはビジネス向けWebアプリケーションに必要な部分を備え、もう手で書く必要がなくなりました。暗号まわりは、外部ライブラリを一つも追加することなくポスト量子に対応しました。そして新しいEnterprise認証コンポーネント群がログイン画面を引き受けます。
Webアプリケーション:面倒な部分を片付ける
セッション、ログイン、CSRF。新しいTsgcHTMLAuthコンポーネントとそのセッションストアが、クッキーを管理し、ログインとログアウトの要求に応答し、アイドル状態のセッションを終了させ、失敗したログイン試行を制限します。CSRFトークンはmetaタグに載って運ばれ、htmxがすべてのリクエストに自動で追加し、サーバーはそれを持たないpostを拒否します。
FAuth := TsgcHTMLAuth.Create(Self);
FAuth.SessionStore := TsgcHTMLSessionStore_Memory.Create(Self);
FAuth.CookieName := 'app_session';
FEngine.Auth := FAuth;
ルートらしく読めるルート。パスパラメーター、メソッドフィルター、そしてヘッダー、クッキー、ボディへのアクセス:
with FRouter.Routes.Add do
begin
Path := '/customers/{id}/edit';
Methods := [hrmGet, hrmPost];
RequireLogin := True;
RequireRoles := 'admin,sales';
end;
テストできるページ。DispatchDirectはソケットなしでリクエストに応答し、新しいユニットが生成されたHTMLを読み取り、id、クラス、タグ、属性で要素を見つけ、ページを保存済みのコピーと比較します。これにより、マークアップの意図しない変更を、顧客ではなくテストが検知します。
アプリケーションのように感じられるナビゲーション。ページはフルリロードなしで切り替わり、スクロール位置とユーザーが入力していた内容を保持し、ローディングバー、接続が切れたときのダイアログ、リクエストが失敗したときのメッセージを備えます。これらはすべて既定でオフです。
四つの目玉機能
それぞれに個別の記事があり、末尾にリンクしているので、ここではそれが何かだけを紹介します:
- MCP Apps。段落の代わりにページで応答するMCPツールで、ChatGPT、Claude、VS Codeの中でレンダリングされ、他のsgcHTMLページと同じコンポーネントで構築されます。
- AIページジェネレーター。ページを説明するか、デザイナーにスクリーンショットを渡すと、登録済みのコンポーネントからページを組み立て、採用するか破棄するかを選べる候補として提示します。
- CRUDコンポーネント。TDataSet上でも独自のSQL上でも、一覧、検索、ページング、フォーム、削除、そして一つのデータセットの書き込み経路を、IDEウィザードとコマンドラインジェネレーターとともに提供します。
- AI Data Pack。grid、データテーブル、ピボットに平易な言葉で質問でき、APIキーが一切なくても答えるルールベースのパーサーを備えています。
プッシュ、二つの方法
Server sent eventsは、今やWebSocketの代わりに更新を運べるようになり、切断中に見逃した内容の再送にも対応し、通常のHTTPサーバーでも動作します。Web Pushは、閉じているブラウザにも届きます。これらには通知の受信箱と設定テーブルが付属し、通知コンポーネントが、あるユーザーがどのチャネルを受け取るかを判断します。
Delphi向けのEventSourceクライアント
新しい TsgcSSEClient は、あらゆる Server-Sent Events ストリームを受信し、すべてのエディションに同梱されます。自動的に再接続して Last-Event-ID を送信するため、サーバーはストリームが止まった箇所から再開できます。サーバーが送信する retry: フィールドが尊重され、OnEvent がイベントタイプとデータと id を渡し、ReconnectOptions がバックオフとジッターを追加します。TLS、プロキシ、認証は OnBeforeConnect で設定でき、そこでコンポーネントが使用する HTTP クライアントが渡されます。
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;
その背後にあるパーサー TsgcSSEParser は公開されています。任意の text/event-stream のバイト列を、任意のサイズのチャンクで渡すだけで済み、これはまさに LLM のストリーミング応答や MCP Streamable HTTP の応答そのものです。
FParser := TsgcSSEParser.Create;
FParser.OnEvent := DoSSEEvent;
FParser.Feed('event: delta' + #10 + 'data: {"text":"Hel"}' + #10#10);
新しいデモ Demos\20.HTTP_Protocol\17.SSE_Client_Component が、一連の流れを実演します。
AI:そのまま行動に移せる答え
TsgcAIChatは、新しいChatJSONメソッドを通じて、OpenAI、Anthropic、Gemini、DeepSeek、Ollama、Grok、Mistralに対して、指定したスキーマに従うJSONを要求できます。このメソッドは応答を解析し、読み取れない場合は解析エラーを添えてもう一度尋ねます。チャットコンポーネントは今や画像の送受信にも対応し、BaseUrlはOllamaだけでなくすべてのプロバイダーで尊重されるようになったので、どのプロバイダーもプロキシやローカルゲートウェイに向けられます。
ドキュメント抽出:PDFから検証済みJSONへ
新しいTsgcAIDocumentExtractorは、PDFまたは画像とJSONスキーマを受け取り、そのスキーマに照らして検証済みのJSONを返します。OpenAI、Anthropic、GeminiはPDFを直接読み取り、その他のビジョンモデルは画像を読み取ります。組み込みのプリセットは請求書、領収書、身分証明書(dpInvoice、dpReceipt、dpIDCard)をカバーし、すべてのフィールドに信頼度が付くため、OnLowConfidenceはMinConfidenceを下回る値のうちどれを再確認すべきか教えてくれます。応答が検証に通らない場合、コンポーネントはエラーを添えてもう一度尋ねます(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');
TsgcAIOCRTesseract、または、インストール不要でWindows 10以降に組み込まれたOCRを使用するTsgcAIOCRWindowsを接続し、OCRModeをdomFallbackまたはdomAlwaysに設定すると、テキストがまずローカルで認識されるため、Ollama上で動くテキスト専用モデルでも抽出できます。独自のプロンプトを使う場合は、TsgcAIChatに新しくChatWithDocument、ChatWithDocumentBase64、ChatWithAttachments、ChatJSONWithAttachmentsが加わり、TsgcAIChatAttachmentsリストに保持された1つまたは複数のファイルをメッセージとともに送信します。
聞いて、話し返し、ツールを呼び出す音声エージェント
新しいTsgcAIVoiceAgentは、聞き取り、ユーザーのターンが終わったことを検知し、自分の声で応答し、OpenAI RealtimeまたはGemini Liveを介してツールを呼び出す、単一のコンポーネントです。WebSocketで話すか、OpenAIとはWebRTCで話し、Windows、Android、iOSで動作します。ターンはサーバーVAD、セマンティックVAD、クライアント側のVAD、または手動で検出されます(vtdServerVAD、vtdSemanticVAD、vtdClientVAD、vtdManual)。BargeInにより、ユーザーは割り込むことができ、エージェントは話すのをやめ、中断された箇所で応答を打ち切ります。OnTranscriptは、ユーザーとエージェント両方のライブ文字起こしを提供します。
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;
ツールはOnToolCallから提供され、TsgcWSAPI_Client_MCPがMCPClientに割り当てられると、そのMCPサーバーのツールが自動的にモデルに提供されます。電話用途では、Audio.Formatが8kHzのG.711 mu-lawまたはA-lawに切り替わります(vafG711ULaw、vafG711ALaw)。この音声エージェントはDelphi 7からDelphi 13、および.NETで利用でき、新しいデモではそれをTDataSetを使った音声ショップアシスタントに変えます。
暗号:Object Pascalによるポスト量子
ML-KEM(FIPS 203)、ML-DSA(FIPS 204)、SLH-DSA(FIPS 205)、X-Wingハイブリッド鍵カプセル化、ポスト量子対応のX.509証明書と認証局、そしてML-DSAで署名されたJWT。これらはすべて外部ライブラリなしでsgcCryptoパック内にObject Pascalで書かれており、NISTの既知応答ベクトルに対して検証済みです。
その上には、同じく純粋なPascalによるネイティブTLS 1.3およびTLS 1.2エンジンがあります。クライアントもサーバーも、OpenSSLもSChannelも使わずにTLSで通信し、RFC 10024のハイブリッドポスト量子グループをネゴシエーションし、ALPN、S N I、クライアント証明書、そしてオペレーティングシステムの信頼ストアの任意利用に対応します。TLS 1.2は、まだTLS 1.3に対応できないピアのために用意されており、デフォルトで前方秘匿性のあるAES-GCMとChaCha20-Poly1305のスイート、拡張マスターシークレット、ダウングレード保護を備え、TLSOptions.Versionが許可する最低バージョンを設定します。ハイブリッドグループはTLS 1.3にとどまります。
従来側の暗号も同じ作業で強化されました。ブラインディングを施した定数時間RSA、定数時間の楕円曲線スカラー倍算とEd25519、テーブルを使わないAESとGHASH、インポートされた秘密鍵を公開鍵の半分と突き合わせて検証する仕組み、そして最小形式でないDER署名の拒否です。
認証:誰もが求めるログイン
新しい認証コンポーネント群が、ログイン画面について顧客が必ず尋ねる問いに答えます。Enterprise および All-Access エディションと sgcAuth パックに含まれ、同じコンポーネントは sgcWebSockets .NET にもあります。
- Passkey。 WebAuthn サーバーはユーザー名を入力せずにサインインさせ、ブラウザーのオートフィル一覧に Passkey を提示し、ユーザーごとに複数の Passkey を保持し、同期された Passkey と端末固定の Passkey を見分け、資格情報を自社のデータベースに保存するためのイベントを発生させます。
- SAML シングルサインオン。
TsgcSAMLServiceProviderはアプリケーションを Entra ID、Okta、AD FS、Google Workspace、Keycloak など任意の ID プロバイダー向けの SAML 2.0 サービスプロバイダーにします。 - Active Directory と LDAP。
TsgcLDAPClientは LDAPS または StartTLS でディレクトリのパスワードを検証し、入れ子のグループを含めて所属グループを読み取ります。 - 認証アプリのコード。
TsgcTOTPAuthenticatorは Google Authenticator や Microsoft Authenticator などのコードを発行して検証し、QR コード用の登録リンク、再利用の防止、リカバリーコードを備えます。 - OpenID Connect。
TsgcHTTP_OIDC_Clientはディスカバリー文書を使って任意の OpenID プロバイダーでサインインさせ、自社 API に届く ID トークンや Bearer トークンを検証します。 - パスワードを保存しないメール。
TsgcMailOAuth2は SMTP、IMAP、POP3 が現在求める Microsoft 365 と Gmail の OAuth2 トークンを取得し、更新します。
特筆すべき修正
- RSAおよびECDSA鍵によるJWTの署名と検証、そしてOpenSSLを静的リンクした場合の32ビットアプリケーションにおけるメモリ破損。
- PFXファイルを使う接続のたびにWindowsのキーストアに秘密鍵のコピーを残し、最近のWindowsバージョンではクライアント証明書を送信していなかったSChannelハンドラー。
- Windowsストアの証明書を使う並行SChannel接続でハンドシェイクが失敗していた問題。
- OAuth2サーバーがRSA鍵で署名されたDPoP証明を拒否していた問題。
- 署名がURLセーフにエンコードされていなかったCloudFront署名付きURL。
.NET
.NETライブラリも歩調を合わせます。ASP.NET Core向けのClaimsPrincipalブリッジを備えた認証とセッション、ルーター、テスト用ヘルパー、SPAナビゲーション、ネイティブエンドポイントを持つSSEトランスポート、構造化出力、両方のOCRエンジンを備えたドキュメント抽出、リアルタイム音声エージェント、AI Data Pack、Web Push、MCP Apps、アダプター付きのCRUDコンポーネント、そして新しいTsgcSSEClientまで、すべてDelphiと同じAPI名で提供します。
ASP.NET Core向けRazor Tag Helpers。sgcHTMLは、Telerik UIやDevExpressと同じように、MVCやRazor Pagesアプリケーションに組み込めるようになりました。<sgc-grid>、<sgc-form>、<sgc-autocomplete>、<sgc-dialog>、<sgc-chart> などのTag Helperと、Html.Sgc() 配下のそれに対応するfluent APIは、サーバー側でBootstrap 5を描画し、htmxでコントローラーと通信します。JavaScriptフレームワークは不要です。グリッドは IQueryable に対してページング、並べ替え、フィルター、検索、XLSXとPDFへのエクスポートを行うため、EF Coreがそのすべてを 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());
入力は asp-for でバインドされ ModelState のエラーを表示し、this.SgcCloseDialog("edit-order", refresh: "orders") は編集ダイアログを閉じてグリッドを再読み込みします。他製品にない部分がサーバープッシュです。live="true" のチャートは、バックグラウンドサービスが hub.BroadcastChartAsync(...) を呼び出すと、開いているすべてのブラウザーで再描画されます。sgcHTMLのWebSocket経由で行われ、SignalRのコードは不要です。esegece.sgcHTML.AspNetCore NuGetパッケージに含まれ、Communityエディションでも利用できます。22.RazorMvc デモは、おなじみの注文サンプルをこれで作り直したものです。
アップグレード
新しいものはすべて追加的で、既定ではオフになっています。新しいユニットを追加してパッケージを再ビルドすれば、既存のアプリケーションはこれまでとまったく同じように動作します。
ロングバージョン
- ChatGPTとClaudeの中でDelphiアプリを動かす
- スクリーンショットをDelphiのWebページに変える
- OpenSSLのDLLなしのDelphi TLS 1.3
- 5分で作るDelphi Web CRUDページ
- 平易な英語でDelphiのグリッドに質問する
- 閉じたブラウザにDelphiから届く
- Passkey・SAML SSO・LDAP・TOTP 2FA で実現する Delphi ログイン
- Entra ID・Okta・AD FS で実現する Delphi の SAML シングルサインオン
動画で見る
この内容についての短い動画がeSeGeCeチャンネルにあります。
質問、フィードバック、移行のお手伝いが必要ですか?お問い合わせください — コードを書いた本人たちから返信が届きます。
