トップへ(mam-mam.net/)

DelphiでGemini APIを使用してAIと会話を行う(TNetHTTPClient)

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から応答があります。