AI チャット
TsgcAIChat は、7 つの大規模言語モデルプロバイダーに対応した単一のチャットクライアントです。Provider を設定し、API キーとモデルを指定して Chat を呼び出すだけです。ベンダーの変更は代入 1 行で済み、それ以外のコードはそのまま使えます。
TsgcAIChat は、7 つの大規模言語モデルプロバイダーに対応した単一のチャットクライアントです。Provider を設定し、API キーとモデルを指定して Chat を呼び出すだけです。ベンダーの変更は代入 1 行で済み、それ以外のコードはそのまま使えます。
プロバイダーに依存しないチャットコンポーネントです。会話履歴を保持し、プロバイダー固有の JSON ボディを構築し、対応する HTTP API クライアントを駆動して、アシスタントのテキストを 1 回の呼び出しで、あるいはトークン単位で返します。
sgcAI は単体で完結しています。このコンポーネントは、土台となる sgcWebSockets Core ランタイムとともに sgcAI に同梱されています。
プロバイダーを選び、キーとモデルを設定して Chat を呼び出します。ストリーミング版と非同期版も同じ設定を使います。
uses
sgcAI, sgcAI_Chat;
var
oChat: TsgcAIChat;
vAnswer: string;
begin
oChat := TsgcAIChat.Create(nil);
oChat.Provider := aicpAnthropic;
oChat.ChatOptions.ApiKey := 'sk-ant-...';
oChat.ChatOptions.Model := 'claude-sonnet-4-5';
oChat.ChatOptions.MaxTokens := 4096;
oChat.SystemMessage := 'You are a Delphi expert.';
oChat.MaxHistoryMessages := 20;
// Blocking call, returns the assistant text.
vAnswer := oChat.Chat('How do I keep a WebSocket connection alive?');
// Token by token, delivered on OnChatStream.
oChat.OnChatStream := OnChatStreamHandler;
oChat.ChatStream('Now explain it to a beginner.');
end;
procedure TForm1.OnChatStreamHandler(Sender: TObject;
const aChunk: string; var Cancel: Boolean);
begin
Memo1.Text := Memo1.Text + aChunk;
Cancel := StopRequested; // abort a long generation
end;
// includes: sgcAI.hpp, sgcAI_Chat.hpp
TsgcAIChat *oChat = new TsgcAIChat(NULL);
oChat->Provider = aicpOpenAI;
oChat->ChatOptions->ApiKey = "sk-...";
oChat->ChatOptions->Model = "gpt-6-astra";
oChat->SystemMessage = "You are a Delphi expert.";
String vAnswer = oChat->Chat("How do I keep a WebSocket connection alive?");
// Local models: same code, no data leaves the machine.
oChat->Provider = aicpOllama;
oChat->ChatOptions->BaseUrl = "http://127.0.0.1:11434";
oChat->ChatOptions->Model = "llama3";
vAnswer = oChat->Chat("Same question, local model.");
最もよく使うメンバーです。
Provider でベンダーを選択します。aicpOpenAI、aicpAnthropic、aicpGemini、aicpDeepSeek、aicpOllama、aicpGrok、aicpMistral が指定できます。変更すると、以前のプロバイダー用にキャッシュされていたクライアントは解放されます。
ApiKey、Model、MaxTokens、Temperature、TopP、BaseUrl を設定します。Temperature と TopP を既定値のままにするとリクエストから省略されるため、プロバイダー側の既定値が適用されます。
SystemMessage は毎ターンのペルソナを設定します。MaxHistoryMessages は再送する過去メッセージの数を制限し、トークンコストを抑えます。ClearHistory と GetHistory で履歴のリセットと読み出しを行います。
Chat はブロッキングで応答を返します。ChatStream は SSE 経由でストリーミングします。ChatWithSystem は 1 ターンだけシステムプロンプトを上書きします。ChatAsync は Delphi 2010 以降で future を返します。
OnChatMessage は完了した各メッセージをそのロールとともに通知します。OnChatStream はすべてのチャンクを配信し、Cancel フラグを備えています。OnChatError はプロバイダーおよびトランスポートのエラーを通知します。
ChatWithDocument と ChatWithDocumentBase64 はメッセージとともに PDF や画像を 1 つ送信し、ChatWithAttachments と ChatJSONWithAttachments は TsgcAIChatAttachments リストに保持した複数のファイルを送信します。OpenAI、Anthropic、Gemini は PDF をそのまま読み取り、他のプロバイダーは画像を受け取ります。チャットを TsgcAIDocumentExtractor に接続すれば、請求書、領収書、身分証明書をスキーマで検証済みの JSON に変換でき、フィールドごとに信頼度が得られます。
Provider を aicpOllama に設定すると、ChatOptions.BaseUrl でコンポーネントを自前の Ollama ホストに向けられるため、プロンプトと応答がマシンの外に出ることはありません。
ChatWithTools は、ツール定義(名前、説明、JSON Schema)をメッセージとともに送信し、モデルが要求するツール呼び出しを返します。ツールを実行し、AddToolResult で各結果を返してから、もう一度呼び出します。7 つのプロバイダーすべてで、それぞれの形式で動作します。TsgcAIAgent がこのループを代わりに実行します。
ChatOptions.Model には fast や smart などのエイリアスを指定できます。エイリアスは ModelAliases でモデルまたは provider:model に対応付け、LoadModelAliasesFromFile、LoadModelAliasesFromJSON、LoadModelAliasesFromURL で読み込みます。Fallbacks は、接続エラー、HTTP 5xx、HTTP 429、未知のモデルのときに次に試すプロバイダーとモデルを列挙し、OnFallback が切り替えのたびに通知します。
LastUsage と OnChatUsage は、すべてのリクエストのプロバイダー、モデル、入力、出力、キャッシュされたトークンを、UserId と SessionId とともに通知し、LastFinishReason は直前の回答が終了した理由(stop や length など)を示します。UsageMeter に TsgcAIUsageMeter を割り当てるとコストと予算を管理でき、Guardrails に TsgcAIGuardrails を割り当てると PII のマスキング、ツールルール、スキーマ検証を利用できます。
モデルを役割で呼び分け、プロバイダーが失敗しても応答を続け、すべてのリクエストのトークン数を確認できます。2026.11.0 の新機能です。
uses
sgcAI, sgcAI_Chat;
procedure TForm1.ChatWithFallback;
var
oFallback: TsgcAIChatFallback;
begin
sgcAIChat1.Provider := aicpOpenAI;
sgcAIChat1.ChatOptions.ApiKey := 'sk-...';
// aliases: alias=model or alias=provider:model
sgcAIChat1.ModelAliases.Add('fast=gpt-6-luna');
sgcAIChat1.ModelAliases.Add('smart=anthropic:claude-opus-5-5');
sgcAIChat1.ProviderApiKeys.Add('anthropic=sk-ant-...');
sgcAIChat1.ChatOptions.Model := 'fast';
// tried in order on a connection error, HTTP 5xx, HTTP 429 or an unknown model
oFallback := sgcAIChat1.Fallbacks.Add;
oFallback.Provider := aicpGemini;
oFallback.Model := 'gemini-3-flash';
oFallback.ApiKey := 'AIza...';
sgcAIChat1.OnFallback := DoFallback;
Memo1.Lines.Add(sgcAIChat1.Chat('Write a haiku about Delphi.'));
Memo1.Lines.Add(Format('Answered by %s %s: %d input, %d output tokens',
[sgcAIChat1.LastUsage.Provider, sgcAIChat1.LastUsage.Model,
sgcAIChat1.LastUsage.InputTokens, sgcAIChat1.LastUsage.OutputTokens]));
end;
procedure TForm1.DoFallback(Sender: TObject; const aFromProvider, aFromModel,
aToProvider, aToModel, aError: string);
begin
Memo1.Lines.Add('Fallback from ' + aFromProvider + ' to ' + aToProvider +
': ' + aError);
end;
このコンポーネントが利用するサービスとプロトコルの一次情報です。