sgcAI を 5 分で
コンポーネント 1 つ、プロバイダーのプロパティ 1 つ、呼び出し 1 回です。このページでは、Delphi アプリケーションを大規模言語モデルと通信させ、回答を待たずにストリーミングする方法を示し、つまずきやすい唯一のプラットフォーム制限についても明確に説明します。
コンポーネント 1 つ、プロバイダーのプロパティ 1 つ、呼び出し 1 回です。このページでは、Delphi アプリケーションを大規模言語モデルと通信させ、回答を待たずにストリーミングする方法を示し、つまずきやすい唯一のプラットフォーム制限についても明確に説明します。
コンポーネント、キー、モデル名、そしてプロンプトです。JSON を組み立てる必要も、HTTP クライアントを設定する必要もありません。
TsgcAIChat は SGC AI パレットページにあります。TsgcAI_Chat を薄くラップした公開コンポーネントで、同梱のデモはコードで TsgcAI_Chat を作成しています。
クラスには sgcAI_Chat.pas、パレットコンポーネントにはバレルユニット sgcAI.pas を使用します。デモは uses sgcAI_Chat; と記述しています。
Provider は TsgcAIChatProvider 型です。7 つのメンバーは aicpOpenAI、aicpAnthropic、aicpGemini、aicpDeepSeek、aicpOllama、aicpGrok、aicpMistral です。コード内のそれ以外は何も変わりません。
TsgcAIChat はすべてのプラットフォーム(Win32、Win64、macOS、Linux64、iOS、Android)でコンパイルでき、IDE もそれらすべてのフォームで提供します。HTTPS 呼び出しには、各プラットフォームで通常必要な TLS の設定が必要です。たとえば Linux では OpenSSL ライブラリです。下の表をご覧ください。
エディションの列は、コードを制御する define と、それが Source/sgcVer.inc の何行目にあるかを示しています。
| 項目 | 内容 |
|---|---|
| IDE | Delphi 7 から RAD Studio 13、および対応する C++Builder バージョン。ChatAsync は {$IFDEF D2010} で囲まれているため、対応範囲がより狭い唯一のメンバーです。 |
| uses 句 | TsgcAI_Chat、TsgcAIChatProvider、イベント型には sgcAI_Chat を使用します。 |
| エディション(sgcWebSockets 内) | SGC_AI は 796 行目、759 行目から 842 行目までの {$IFDEF SGC_EDT_ENT} ブロック内で定義されています。つまり Enterprise 以上であり、Standard と Professional は対象外です。 |
| エディション(単独パッケージ) | sgcAI 製品は 857 行目で SGC_PACK_AI を定義し、946 行目から 959 行目の独自ブロックで 947 行目に SGC_AI を定義します。ライブラリの残りの部分を含まない、同じコンポーネントです。 |
| プラットフォーム | SGC_AI の 2 つの定義(796 行目と 947 行目)のどちらにもプラットフォームガードがないため、sgcAI_Chat.pas はすべてのターゲットでコンパイルされ、コンポーネントには ComponentPlatforms(0) が指定されています。Windows のオーディオ API と音声 API を呼び出す TsgcAudioRecorderMCI、TsgcAudioRecorderWave、TsgcAudioPlayerMCI、TsgcTextToSpeechSystem だけが、Windows でのみコンパイルされます。 |
| クロスプラットフォームのもの | 797 行目と 955 行目の SGC_AI_MCP にはプラットフォームガードがありません。そのため MCP クライアントとサーバーは Linux、macOS、iOS、Android でも動作します。786 行目から 792 行目のプロバイダーの define(SGC_OPENAI、SGC_ANTHROPIC、SGC_GEMINI、SGC_DEEPSEEK、SGC_OLLAMA、SGC_GROK、SGC_MISTRAL)も、プラットフォームで制限されていません。 |
Linux サービスやモバイルアプリを構築する場合も、TsgcAIChat はコンパイルできます。代わりに、たとえば TsgcHTTP_API_OpenAI や TsgcHTTP_API_Anthropic のようなベンダーの REST クライアントを直接呼び出すこともできます。Delphi から LLM を呼び出すガイドで、両方の方法を並べて紹介しています。
sgcAI は sgcWebSockets のインストーラーに含まれており、単独のパッケージとしても提供されています。どちらでもインストールの手順は同じです。
ダウンロードしたファイルをフォルダーに展開します。以下ではこのフォルダーを {$DIR} と呼びます。
ツール、オプション、ライブラリの順に開きます。{$DIR}\source と、お使いの IDE 用の lib フォルダー(たとえば {$DIR}\libD13\$(Platform))を追加します。
{$DIR}\Packages\ の下で、お使いの IDE バージョン用のパッケージグループを開きます。最初に実行時の .dpk をコンパイルし、次にデザイン時の dcl をインストールします。
SGC AI というページが表示され、15 個のコンポーネントが含まれています。TsgcAIChat が先頭です。Windows 以外のターゲットでページが表示されない場合は想定どおりです。IDE のパレットがこれらのコンポーネントを Win32 と Win64 でのみ提供するためです。ユニット自体はすべてのプラットフォームでコンパイルできます。
ホスト型のプロバイダーを使う場合は、そのベンダーから自分のキーを取得し、ChatOptions.ApiKey に代入します。Ollama はモデルが自分のマシンで動作するため、キーはまったく不要です。
コンポーネントを作成し、プロバイダー、キー、モデルを設定してから Chat を呼び出し、返された文字列を読み取ります。
uses
Classes, SysUtils,
// sgc
sgcAI_Chat;
procedure TfrmUnifiedChat.btnChatClick(Sender: TObject);
var
oChat: TsgcAI_Chat;
begin
oChat := TsgcAI_Chat.Create(nil);
try
oChat.Provider := aicpOpenAI;
oChat.ChatOptions.ApiKey := GetApiKey;
oChat.ChatOptions.Model := 'gpt-4o-mini';
oChat.ChatOptions.MaxTokens := 1024;
oChat.SystemMessage := 'You are a concise assistant inside a Delphi ERP.';
memoResponse.Lines.Text := oChat.Chat(memoPrompt.Text);
finally
oChat.Free;
end;
end;
ベンダーの変更は 1 行です。Provider は aicpOpenAI、aicpAnthropic、aicpGemini、aicpDeepSeek、aicpOllama、aicpGrok、aicpMistral を受け付けます。それ以外はそのままです。
procedure TfrmUnifiedChat.OnChatStream(Sender: TObject; const aChunk: string;
var Cancel: Boolean);
begin
memoResponse.Text := memoResponse.Text + aChunk;
// set Cancel to stop the generation early
end;
procedure TfrmUnifiedChat.OnChatError(Sender: TObject; const aError: string);
begin
memoResponse.Text := 'error: ' + aError;
end;
procedure TfrmUnifiedChat.btnChatStreamClick(Sender: TObject);
begin
GetChat.Provider := aicpAnthropic;
GetChat.ChatOptions.ApiKey := GetApiKey;
GetChat.ChatOptions.Model := 'claude-sonnet-4-20250514';
GetChat.SystemMessage := memoSystem.Text;
memoResponse.Lines.Clear;
GetChat.ChatStream(memoPrompt.Text);
end;
デモはコンポーネントを GetChat で一度だけ構築し、そこで OnChatStream と OnChatError を割り当てています。ChatStream は完全な回答も返すため、戻り値を無視してイベントだけを使うことも、両方を使うこともできます。
uses
Classes, SysUtils,
// sgc
sgcAI_Chat;
var
oChat: TsgcAI_Chat;
begin
oChat := TsgcAI_Chat.Create(nil);
try
// no API key at all: the model runs on this machine
oChat.Provider := aicpOllama;
oChat.ChatOptions.Model := 'llama3';
// BaseUrl is read only for the Ollama provider, and only when
// the server is not on the default address. Internally it is
// forwarded to the Ollama client's Host property.
oChat.ChatOptions.BaseUrl := 'http://localhost:11434';
Writeln(oChat.Chat('Summarise this invoice in one line.'));
finally
oChat.Free;
end;
end;
OllamaOptions.BaseUrl はありません。生の API レベルでは、このプロパティは TsgcHTTP_API_Ollama の OllamaOptions.Host で、この層からそれに値を渡すのが ChatOptions.BaseUrl です。
最初の 2 つのタブは、同梱のデモ Demos\15.AI\02.Applications\06.UnifiedChat\fUnifiedChat.pas から、フォームコントロールをリテラルに置き換えたものです。3 つ目のタブは、同じコンポーネントをローカルの Ollama サーバーに向けたものです。同じフォルダーにある 2 つ目のデモ 07.ConversationHistory では、履歴 API を紹介しています。
Chat は呼び出しに失敗しても例外を発生させません。これは意外に思われがちです。代わりに空の文字列を返し、イベントを発生させます。
Chat はアシスタントのテキストを string として返します。失敗しても例外は発生しないため、空の文字列は呼び出しが失敗したことを意味します。
OnChatErrorprocedure(Sender: TObject; const aError: string)。Chat と ChatStream の両方が例外を捕捉し、ここに渡します。他の何よりも先に接続すべき最初のイベントです。
OnChatStreamprocedure(Sender: TObject; const aChunk: string; var Cancel: Boolean)。モデルがまだ書き込んでいる間にメモにテキストが表示されれば、ストリーミングがバッファリングではなく機能している証拠です。
GetHistory は、次の呼び出しでコンポーネントが再送する内容を返します。MaxHistoryMessages で上限を設定し、ClearHistory で最初からやり直します。
最初の呼び出しが失敗する原因のほとんどは、6 つの問題のいずれかです。
sgcAI_Chat.pas はすべてのプラットフォームでコンパイルできます。TsgcAudioRecorderMCI、TsgcAudioRecorderWave、TsgcAudioPlayerMCI、TsgcTextToSpeechSystem は Windows のオーディオ API と音声 API を呼び出し、Windows でのみコンパイルされるため、クロスプラットフォームのフォームには置かないでください。HTTPS 呼び出しには、各プラットフォームで通常必要な TLS の設定が必要です。たとえば Linux では OpenSSL ライブラリです。
Chat と ChatStream は例外を握りつぶして OnChatError に渡します。そのシグネチャは procedure(Sender: TObject; const aError: string) です。他のデバッグより先に、このイベントを接続してください。
Ollama のベースアドレスは、ベンダーのオプションオブジェクトではなく ChatOptions.BaseUrl に設定します。内部で OllamaOptions.Host に渡され、BaseUrl が読み取られるプロバイダーはこれだけです。
Chat と ChatStream は同期呼び出しです。Delphi 2010 以降では、IsgcFuture<string> を返す ChatAsync を使用してください。それより古いコンパイラーでは、独自のスレッドで呼び出しを実行してください。
モデル名はコンポーネントではなくベンダーのものであり、変更されます。ChatOptions.Model はそのまま渡されるため、ベンダーのコンソールで通用する名前はここでも通用します。
コンポーネントは呼び出しのたびに履歴を再送します。これにより追加の質問が成り立ちます。MaxHistoryMessages で上限を設定し、ClearHistory で最初からやり直してください。
プロンプトボックスは始まりにすぎません。次の 4 つはいずれもすでにパッケージに含まれています。
TsgcAIOpenAIEmbeddings でコンテンツをベクトルに変換し、TsgcAIDatabaseVectorFile または TsgcAIDatabaseVectorPinecone に保存して、最も近い文章を取得してプロンプトに入れます。
TsgcAIOpenAIChatBot は、録音、文字起こし、チャット呼び出し、テキスト読み上げを 1 つのコンポーネントにまとめます。TsgcAIOpenAITranslator はライブ翻訳で同じことを行います。
MCP サーバーコンポーネントは、アプリケーションをアシスタントが呼び出せるツールに変え、MCP クライアントは他のサーバーを利用します。どちらも Windows に限定されていないため、Delphi で書いた MCP サーバーは Linux でも動作します。
ビジョン、ドキュメント、拡張思考、バッチ、画像生成、文字起こし、モデレーションは、中立的なチャット層ではなく、ベンダーごとの REST クライアントにあります。
リファレンスページには、すべてのオプションとイベントが記載されています。デモプロジェクトはダウンロードに含まれており、Demos\15.AI の下にあります。
| ガイド、Delphi から LLM を呼び出す ストリーミング、ツール呼び出し、ホスト型とローカルの比較を含む、詳しい解説です。 | 開く | |
リファレンス、OpenAI クライアント
TsgcHTTP_API_OpenAI のすべてのメソッド、オプション、イベント。
|
開く | |
リファレンス、Anthropic クライアント
TsgcHTTP_API_Anthropic のメッセージ、ツール、ビジョン、バッチ、トークンカウント。
|
開く | |
| リファレンス、MCP サーバー アシスタントがアプリケーションを呼び出せるようにするコンポーネントです。 | 開く | |
| TsgcAIChat コンポーネントのページ チャットコンポーネントのすべてのプロパティとイベントがあり、他の 14 個へのリンクもあります。 | 開く | |
| オンラインヘルプ 自動生成されたリファレンスで、常に最新リリースに対応しています。 | 開く |
関連資料:AI を活用した Delphi アプリの構築、Delphi からのプロバイダー比較、MCP サーバーの作成。各製品にはそれぞれクイックスタートがあり、はじめにのページに一覧があります。
TsgcAIChat を配置します。これは sgcAI.pas で、sgcAI_Chat.pas で宣言されている TsgcAI_Chat の公開ラッパーとして宣言されています。同梱のデモのように実行時にオブジェクトを作成するコードでは、TsgcAI_Chat と uses sgcAI_Chat; を使用します。どちらも同じプロパティを提供します。
sgcVer.inc の 796 行目で定義されている SGC_AI で、759 行目から 842 行目までの SGC_EDT_ENT ブロック内にあります。これは Enterprise エディション以上です。674 行目から 723 行目の Standard と、726 行目から 757 行目の Professional では定義されません。ライブラリの残りの部分が不要な場合、単独の sgcAI パッケージは 857 行目で SGC_PACK_AI を定義し、946 行目から 959 行目のその独自ブロックが同じコンポーネントを有効にします。
SGC_AI はプラットフォームガードなしで、Enterprise ブロックの 796 行目と単独パックブロックの 947 行目で定義されているため、sgcAI_Chat.pas と sgcAI.pas は Windows、macOS、Linux、iOS、Android でコンパイルでき、TsgcAIChat には ComponentPlatforms(0) が指定されています。例外は TsgcAudioRecorderMCI、TsgcAudioRecorderWave、TsgcAudioPlayerMCI、TsgcTextToSpeechSystem で、Windows のオーディオ API と音声 API を呼び出し、Windows でのみコンパイルされます。HTTPS 呼び出しには、各プラットフォームで通常必要な TLS の設定が必要です。たとえば Linux では OpenSSL ライブラリです。
Provider を変更します。aicpOpenAI、aicpAnthropic、aicpGemini、aicpDeepSeek、aicpOllama、aicpGrok、aicpMistral を指定できます。その後、そのベンダー用のキーとモデルを設定します。aicpOllama にキーはなく、サーバーが既定のアドレスにない場合は ChatOptions.BaseUrl を設定します。コンポーネントはそれを内部で Ollama クライアントに渡します。
Chat ではなく ChatStream を呼び出し、OnChatStream を処理します。そのシグネチャは procedure(Sender: TObject; const aChunk: string; var Cancel: Boolean) です。aChunk が届くたびにメモへ追加し、生成を途中で止めるには Cancel を True に設定します。
Chat と ChatStream は例外を発生させません。例外を捕捉し、メッセージとともに OnChatError を発生させて、空の文字列を返します。そのため、OnChatError を処理していないと、モデルが何も答えなかった場合と見分けがつきません。最初に接続してください。
ChatAsync を呼び出します。{$IFDEF D2010} で囲まれており、IsgcFuture<string> を返します。Delphi 7 から 2009 ではこのメソッドは存在しないため、自分で作成したスレッドで Chat を実行してください。
MaxHistoryMessages は再送する量の上限を設定し、ClearHistory は新しい会話を開始し、GetHistory は保存されたメッセージを返します。