DelphiでGemini APIを使用してAIと会話を行う(TNetHTTPClient)
DelphiでGemini APIを使用してAIと会話する方法をサンプルソースコードで解説します。
会話履歴を与えて会話のキャッチボールが出来ます。
Gemini APIキーの取得
Googleのアカウントを取得しログインします。 次に Google AI Studio にアクセスします。
https://aistudio.google.com/
左下の「Get API key」をクリックし、右上の「API キーを作成」をクリックするとAPIキーを作成することができます。
取得したGemini APIキーは Gemini Free Tier(無料版)ですので1日の回数や1分間の回数制限などがあります。
また無料版は会話の内容を学習に使われる可能性がありますので注意が必要です。
お支払方法を設定すると有料版に切り替わるようです。
フォームデザイン
IDEから[ファイル]⇒[新規作成]⇒[VLC フォーム アプリケーション - Delphi]を選択して新規プロジェクトを作成します。
TMemo × 2個、TButton × 1個、TNetHTTPClient × 1個をドラッグ&ドロップします。
ソースコード
以下ソースコードを貼り付けた後、デザインビューの左ペインのオブジェクトインスペクタのイベントから
Button1.OnClick に Button1Click を設定します。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Net.URLClient,
System.Net.HttpClient, System.Net.HttpClientComponent, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Memo2: TMemo;
NetHTTPClient1: TNetHTTPClient;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
//会話の履歴を保存する変数
ConvArr:Array of String;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
const
//API Key を設定する
ApiKey:String='ここに上記で取得したAPIキーを貼り付けます';
implementation
{$R *.dfm}
uses System.JSON, System.JSON.Readers, System.JSON.Builders;
procedure TForm1.Button1Click(Sender: TObject);
var
Body, ContentObj, PartsObj: TJSONObject;
ContentsArr, PartsArr: TJSONArray;
i:Integer;
ASource:TStringStream;
res:IHTTPResponse;
JsonStr: String;
sr:TStringReader;
JsonTr:TJsonTextReader;
JsonIt:TJSONIterator;
st:String;
begin
if Trim(Memo1.Text)='' then Exit;
Body := TJSONObject.Create;
try
ContentsArr := TJSONArray.Create;
//過去の会話履歴を与える
for i := Low(ConvArr) to High(ConvArr) do
begin
ContentObj := TJSONObject.Create;
if (i mod 2)=0 then
ContentObj.AddPair('role', 'user')
else
ContentObj.AddPair('role', 'model');
PartsObj := TJSONObject.Create;
PartsObj.AddPair('text', ConvArr[i]);
PartsArr := TJSONArray.Create;
PartsArr.AddElement(PartsObj);
ContentObj.AddPair('parts', PartsArr);
ContentsArr.AddElement(ContentObj);
end;
//今回の会話を与える
ContentObj := TJSONObject.Create;
ContentObj.AddPair('role', 'user');
PartsObj := TJSONObject.Create;
PartsObj.AddPair('text', Memo1.Text);
PartsArr := TJSONArray.Create;
PartsArr.AddElement(PartsObj);
ContentObj.AddPair('parts', PartsArr);
ContentsArr.AddElement(ContentObj);
Body.AddPair('contents', ContentsArr);
Body.AddPair('system_instruction',
TJSONObject.Create.AddPair('parts',
TJSONArray.Create(
TJSONObject.Create.AddPair(
'text',
'マークアップを使わずプレーンテキストで返答してください。')
)
)
);
JsonStr:=Trim(Body.ToJSON());
finally
Body.Free; //親オブジェクトが子オブジェクトを破棄するので親だけ破棄
end;
ASource:=TStringStream.Create;
try
NetHTTPClient1.ContentType:='application/json';
ASource := TStringStream.Create(JsonStr, TEncoding.UTF8);
res:=NetHTTPClient1.Post(
'https://generativelanguage.googleapis.com/v1beta/models/'+
'gemini-3.1-flash-lite:generateContent?key='+ApiKey,
ASource, nil, nil
);
finally
ASource.Free;
end;
sr:=TStringReader.Create(res.ContentAsString(TEncoding.UTF8));
JsonTr:=TJsonTextReader.Create(sr);
JsonIt:=TJsonIterator.Create(JsonTr);
try
JsonIt.Next('candidates');
JsonIt.Recurse;//配列の中に入る
JsonIt.Next;
JsonIt.Recurse;//連想配列の中に入る
JsonIt.Next('content');
JsonIt.Recurse;//連想配列の中に入る
JsonIt.Next('parts');
JsonIt.Recurse;//配列の中に入る
while JsonIt.Next do
begin
JsonIt.Recurse;//連想配列の中に入る
JsonIt.Next('text');
st:=AdjustLineBreaks(JsonIt.AsString);
JsonIt.Return;
end;
JsonIt.Return;
JsonIt.Return;
JsonIt.Return;
JsonIt.Return;
finally
JsonIt.Free;
JsonTr.Free;
sr.Free;
end;
SetLength(ConvArr,length(ConvArr)+1);
ConvArr[High(ConvArr)]:=Memo1.Text;
Memo2.Lines.Add(StringOfChar('■', 50));
Memo2.Lines.Add(ConvArr[High(ConvArr)]);
Memo2.Lines.Add(StringOfChar('■', 50));
Memo1.Clear;
SetLength(ConvArr,length(ConvArr)+1);
ConvArr[High(ConvArr)]:=st;
Memo2.Lines.Add(st);
end;
end.
実行
IDEから[実行]⇒[実行]を選択するとコンパイルされて実行されます。
Memo1にAIへの会話や質問を入力しButton1をクリックするとMemo2にGemini AIから応答があります。
