GASでGemini APIを実行する方法!会話履歴をリクエストして文脈に応じた応答も【サンプルコード付き】

2023年12月25日

2023年12月6日にGoogleの次世代AIモデルであるGeminiが発表された1週間後、Gemini APIが発表されました。

Google AI StudioでGemini ProモデルをAPI経由で利用可能になりました。

そこでGoogle Apps Script(GAS)でGemini APIをリクエストする方法を解説します。

Gemini Proへの単体のプロンプトに加え、過去のやり取りもリクエストに含めた文脈に応じた応答を出力するサンプルコード付きです。

Gemini ProのAPIが12/13提供開始

Googleは12月13日に次世代AIモデルであるGeminiのAPI提供を開始しました。

GoogleがGeminiを発表した当初は、対話AIであるBardでしかGeminiを利用できませんでした。

しかし、Google AI StudioでGemini APIを公開し、Geminiの3つのモデルのうち、中級モデルのGemini ProがAPI経由で利用可能です。

OpenAIのChatGPTやGPT-4に匹敵する生成AIであるGeminiをAPI実行できるようになりました。

Gemini APIが公開されたことでGeminiを使ったアプリやチャットボットなどのサービスを開発したり、自分のアプリにGeminiを組み込むことが可能です。

Gemini APIのリファレンスにGASの解説なし…

Google AI StudioのGemini APIのページにアクセスすると、Gemini APIのスタートガイドのリンクが用意され、Gemini APIの使い方のドキュメントがあります。

Gemini APIのスタートガイドにはGoogle Apps Script(GAS)での利用方法について解説がない

ただ、Gemini APIのスタートガイドには、PythonやGo、Node.jsなどのプログラミング言語での利用方法のみです。

Google Apps Script(GAS)のGemini APIのリクエスト方法は解説がありません。

REST APIの解説ページを読んで解釈すれば、GASの実行方法は分かるものの、Googleが提供するサービスとして解説してほしいところです。

そこで、GASでGemini APIをリクエストする方法について、AutoWorkerで解説していきます。

まずGemini APIのAPIキーを用意

Google Apps Script(GAS)でGemini APIを利用するためには、まずAPIキーを用意する必要があります。

※AutoWorkerの記事でAPIキーの発行・取得方法を紹介しています。

Google AI StudioのGemini APIのページにある「Get API Key」からAPIキーを発行します。

Gemini APIのGet API KeyのページでAPIキーを作成すると、APIキーが表示されてCopyボタンでAPIキーを取得

Gemini APIのキーを発行したらCopyボタンを押して、クリップボードにコピーしてAPIキーを取得しておきます。

GASでGemini APIを実行するサンプルコード

Gemini APIのAPIキーを用意できたら、Google Apps Script(GAS)でGemini APIをリクエストできます。

そこでGASでGemini APIを実行する方法をサンプルコードを交えて解説します。

Gemini APIのキーをスクリプトプロパティに事前設定

まず事前準備として、用意したGemini APIのキーをGASのスクリプトプロパティに設定します。

※コードに直書きすることもできますが、APIキーはスクリプトプロパティに格納するのが安全です。

1.新しいGASプロジェクトを開いたら、左メニューにある「プロジェクトの設定」を選択します。

Gemini APIのAPIキーをスクリプトプロパティにセットするため、Google Apps Script(GAS)のスクリプトエディタでプロジェクトの設定ページにアクセス

2.スクロールすると表示される「スクリプトプロパティの追加」を押下し、プロパティ:APIKEY、値:用意したAPIキーをセットして、保存します。

Gemini APIをリクエストできるようスクリプトプロパティの追加でAPIキーを値にセットして保存

Gemini APIにリクエストするGASコード

APIキーをスクリプトプロパティにセットしたら、下記のGemini APIをリクエストするサンプルコードをコピーしてGASのスクリプトエディタに貼り付けます。

function getGeminiApi(prompt = 'あなたができることは何ですか?') {
  //スクリプトプロパティからAPIキーを取得
  const apiKey = PropertiesService.getScriptProperties().getProperty('APIKEY');
  //GeminiのAPIのエンドポイントURLを設定
  const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=${apiKey}`;
  //プロンプトに加え、Gemini APIリクエストに必要なペイロードを設定
  const payload = {
    "contents": [
      {"role": "user","parts": { "text": prompt }}
    ],
  };
  //payloadやHTTP通信種別、認証情報をoptionで設定
  const options = {
    'payload': JSON.stringify(payload),
    'method' : 'POST',
    'muteHttpExceptions': true,
    'contentType':'application/json'
  };
  //Gemini APIにAPIリクエストを送り、結果を変数に格納
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText()); 
  console.log(response.candidates[0].content.parts[0].text); 
}
Google Apps Script(GAS)でGemini APIをリクエストしてGemini Proにプロンプトを送って応答をログ出力するサンプルコード

1行目にGemini ProにAPI経由で送信するプロンプトをセットしています。

さきほど事前設定したAPIキーをスクリプトプロパティから呼び出し、Gemini APIのエンドポイントにフェッチし、応答結果を実行ログに出力します。

なお、Gemini APIからのレスポンスには入力トークン数や出力トークン数など色々な情報がJSON形式で返ってきます。

その中からGemini Proの応答文が含まれているのが21行目で指定した要素となっています。

Gemini APIをリクエストするサンプルコードで「getGeminiAPI」を実行すると、実行ログに応答結果が表示されます。

Google Apps Script(GAS)でGemini APIをリクエストしてGemini Proにプロンプトを送って応答をログ出力するサンプルコードの実行結果

※初回実行時には認証が求められるので、初回認証の許可を行ってください(初回認証の許可方法解説記事)。

このようにGASスクリプトからGemini APIをリクエストして応答結果を得ることができました。

Gemini APIリクエスト用のGAS関数を作成

上記サンプルコードは実行ログに出力していましたが、getGeminiAPI関数のreturn文に応答結果をセットすることで、Gemini APIにリクエストするGAS関数を作成可能です。

function getGeminiApi(prompt = 'あなたができることは何ですか?') {
  //スクリプトプロパティからAPIキーを取得
  const apiKey = PropertiesService.getScriptProperties().getProperty('APIKEY');
  //GeminiのAPIのエンドポイントURLを設定
  const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=${apiKey}`;
  //プロンプトに加え、Gemini APIリクエストに必要なペイロードを設定
  const payload = {
    "contents": [
      {"role": "user","parts": { "text": prompt }}
    ],
  };
  //payloadやHTTP通信種別、認証情報をoptionで設定
  const options = {
    'payload': JSON.stringify(payload),
    'method' : 'POST',
    'muteHttpExceptions': true,
    'contentType':'application/json'
  };
  //Gemini APIにAPIリクエストを送り、結果を変数に格納
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText()); 
  return response.candidates[0].content.parts[0].text; 
}

function runGemini(){
  console.log(getGeminiApi("日本の首都は?"));
}

runGemini関数で、getGeminiApi関数にプロンプトの文字列を引数指定すると、Gemini APIにリクエストされます。

Gemini Proへのプロンプトを引数に設定してGemini APIをリクエストするGoogle Apps Script(GAS)の関数のサンプルコード

このようにすれば、他の処理の中でGemini APIをリクエスト処理を呼び出すことができます。

会話履歴の文脈に応じた応答文をGemini APIで得るには?

前述したGemini APIをリクエストするGoogle Apps Script(GAS)のサンプルコードは、単体のプロンプトに対するGemini Proの応答結果を出力するものでした。

しかし、Gemini APIは過去の会話履歴もAPIリクエストの中に含めることで、Gemini Proから文脈に応じた応答結果を得ることができます。

そこで、会話履歴もAPIリクエストに設定して文脈に応じたGemini Proの応答を取得する方法も解説します。

さきほGASサンプルコードをベースに作成したGemini Proへのプロンプトに加え、過去の会話履歴を配列に格納したconversation変数の2つの引数を持つgetGeminiAptChat関数です。

function getGeminiApiChat(prompt = 'あなたができることは何ですか?',conversation=[]) {
  //スクリプトプロパティからAPIキーを取得
  const apiKey = PropertiesService.getScriptProperties().getProperty('APIKEY');
  //GeminiのAPIのエンドポイントURLを設定
  const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=${apiKey}`;
  //過去の会話とプロンプトをmessage変数にセットし、ペイロードを設定
  let messages = [];  
  for(let i=0;i<conversation.length;i++){
    if(i%2==0){
      messages.push({'role': 'user', "parts": { "text": conversation[i]} });
    }
    else{
      messages.push({'role': 'model', "parts": { "text": conversation[i]} });
    }
  }
  messages.push({'role': 'user', "parts": { "text": prompt} });
  const payload = {
    "contents": messages
  };
  //payloadやHTTP通信種別、認証情報をoptionで設定
  const options = {
    'payload': JSON.stringify(payload),
    'method' : 'POST',
    'muteHttpExceptions': true,
    'contentType':'application/json'
  };
  //Gemini APIにAPIリクエストを送り、結果を変数に格納
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText()); 
  return response.candidates[0].content.parts[0].text; 
}

function runGeminiChat(){
  //事前のGeminiとの対話の履歴を配列で定義
  const conversation = ['日本で最も人口の多い都道府県は?','東京','2番目は?','神奈川'];
  console.log(getGeminiApiChat("一番少ないのは?",conversation));
}
Gemini Proから会話履歴の文脈に応じた応答結果を得ることができるGoogle Apps Scriptのサンプルコード

conversation変数に格納した会話履歴ををuser(利用者)とmodel(Gemini Pro)ごとのオブジェクトとして配列追加します。

※会話の起点はmodelではなくuserとなる前提です。

このgetGeminiAptChat関数にプロンプトと会話履歴の配列を引数指定した関数を実行すると文脈に応じた応答文をGemini APIから得ることができます。

Gemini APIを使い、会話履歴の文脈に応じた応答を返すGoogle Apps Script(GAS)のサンプルコードと実行結果のログ出力

事前の会話履歴では日本で最も人口の多い都道府県を質問したうえで、プロンプトで「一番少ないのは?」をセットします。

単体のプロンプトだけでは難しいですが、会話履歴もGemini APIにリクエストしていることで「鳥取県」と最も人口が少ない都道府県を回答してくれました。

このように会話履歴もGemini APIのAPIリクエストに含めることで、Gemini Proから文脈に応じた応答をAPI経由でも取得できます。

※なお、getGeminiAptChat関数は第二引数である会話履歴の配列をセットしない場合も、第一引数のプロンプトに対するGemini Proの応答が得られます。

まとめ・終わりに

今回、Google Apps Script(GAS)でGemini APIをリクエストする方法を紹介しました。

2023年12月13日にGemini APIが公開され、Googleの最新AIモデルのGemini ProをAPI経由で利用できます。

GASでのGemini APIの利用方法はGoogle AI Studioのドキュメントにもなかったため、サンプルコード付きで解説しています。

単体のプロンプトをAPIリクエストする方法に加えて、会話履歴も追加して文脈に応じた応答を得るGASサンプルコードも掲載しています。

GASは無料で手軽にGemini APIを試せるので、ぜひ今回紹介したサンプルコードを使ってGemini APIを試してみてください。