5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Servicenow上でGeminiを使えるようにする方法

Posted at

はじめに

 私はSerrvicenowを独学している大学生です。
 本記事ではServicenowでGeminiを使えるようにする方法について説明します。Servicenowの基本的な使い方が理解できていれば、簡単に実装することができるので、ぜひ初心者でも挑戦してみてください。(推奨終了コース:SNAF、ADF)
 Servicenow上の情報をGeminiに渡すことで更なる業務効率化が期待できます。最終的な完成形は以下の通りです。

image.png

カラム内に質問を入力し、UI Actionボタンを押すとGeminiが考えてくれるという構成になっています。

質問のフロー
image.png

本記事では
・Gemni APIを使う方法
・自分の情報をコード上でGeminiに伝える方法
・Servicenowのテーブルの情報をGeminiに渡す方法
について記します。

1. Gemini APIをServicenowに取り込む

ⅠGemini APIの取得

Gemini APIキーの取得方法がわかる方は飛ばして大丈夫です。

以下のリンクをクリックし、Google AI Studioにアクセスします。

「Get API key」をクリックし、右上の「API keyを作成」をクリックします。
「Select a Cloud Project」と書いてあるフィールドをクリックし、「Create Project」をクリックします。Projectを作成した後、作ったプロジェクトを選択し、キーを作成をクリックすれば完了です。

Ⅱ ServicenowのテーブルとAPIを連携する

Servicenow環境を開きます。

私はローカルアプリケーションスコープで実行するのが好きなので、本記事でもローカルアプリケーションスコープでの想定でコードを書きます。

studioでローカルアプリケーションを作成した後、作成したアプリケーション内で操作していきます。

Rest Messageの作成

1.All > Outbound > REST Message を開きます。

2.Newをクリックし、表示される項目で以下のように設定します。
・name : Gemini Integration
・Endpoint :
https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=YOUR_API_KEY 
※YOUR_API_KEYには自分のAPI keyを入れる

3.Submitします。

4.新しいHTTP Methodsを追加します。各項目を以下のように設定してください。
・name : Post
・HTTP method : POST
・Endpoint : 上記と同じ
・content :

JSON
{"contents":[{"parts":[{"text":"${text}"}]}]}

 ※HTTP methodタブの中にあります。このコードはJSONです。

5.Testします。Related Link内にあるTestをクリックし、以下の画像のようにHTTP statusが200になっていたら成功です。
image.png

Script Includeの作成

ここでは、テーブル内の質問フィールドから得られた情報をREST Messageに渡す関数を作ります。

1.All > System Definition > Script Include を開きます。
2.新しいものを作成し、以下のように設定します。
・name : gemini_pro
・Glide AJAX enabled : オン
・Sandbox enabled : オン

javascript
//Script Includeのコード

var gemini_pro = Class.create();
gemini_pro.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
    demoTest: function() {
        var output;
        try {
            var r = new sn_ws.RESTMessageV2('x_1644933_skill_up.Gemini Integration', 'POST');//各自設定した、REST Messageの名前に変えてください。
            r.setStringParameterNoEscape('text', this.getParameter('sysparm_text'));
            var response = r.execute();
            var responseBody = response.getBody();
            var httpStatus = response.getStatusCode();
            output = responseBody;
        } catch (ex) {
            var message = ex.message;
        }
        return output;
    },

    type: 'gemini_pro'
});

テーブルの作成

1.All > System Definition > Tablesを開きます。

2.新しいテーブルを作成し、各項目を以下のように設定します。
・Label : Ask Gemini
・Name : 自動入力

3.カラムを2つ作成します。
・Column Label : 質問
・Column Name : u_question
・Type : String

・Column Label : 回答
・Column Name : u_response
・Type : String (Full UTF-8)

UI Actionの作成

このUI Actionはボタンを押したときに、質問内容をScrtipt Includeに持っていく動作を示しています。
1.All > System Definition > UI Action を開きます。

2.新しいUI Actionを作成します。以下のように設定してください。
image.png
Script

javascript
//UI Actionのコード
function ask(){ // UI Actionの 'ask()' 関数
    var input = g_form.getValue("u_question"); // ユーザーからの質問テキストを取得
    if(input!=""){ // 質問テキストが空でないかチェック
        g_form.setValue("u_response", 'Please wait 😎😎😎😎😎😎 we are loading your answer,,,'); // 処理中の待機メッセージを設定
        
        var ga = new GlideAjax('x_1644933_skill_up.gemini_pro'); // Script Include 'gemini_pro' を呼び出し 各自変更してください。
        ga.addParam('sysparm_name', 'demoTest'); // Script Include内の関数 'demoTest' を指定
        ga.addParam("sysparm_text", g_form.getValue("u_question")); // ユーザーの質問を 'sysparm_text' として送信
        
        ga.getXMLAnswer(function(response){ // 非同期で応答を受け取る
            var answer = JSON.parse(response); // JSON文字列をオブジェクトに変換
            
            var value = answer.candidates[0].content.parts[0].text; // 応答オブジェクトからGeminiのテキスト回答を抽出
            g_form.setValue("u_response", value); // 抽出した回答をフォームのフィールド 'u_output' に設定
        });
    }
}

Ⅲ テスト

1.Ask Gemniテーブルを開きます。新規作成をし、質問フィールドにGeminiへの質問を入力します。

2.UI Action「Ask Gemini」をクリックします。しばらく待った後、回答が返ってきたら成功です。

2. 自分の情報をコード上でGeminiに伝える方法

1章ではGeminiとServicenowのテーブルを連携させることに成功しましたが、このままでは予めGeminiが習得しているネット上の知識のみしか活用できません。自分専用のAIを作成するためには自分の基本情報などをAIに伝えることが重要となってくると思います。

Geminiに自分の情報をJSON形式で伝える

Scrtipt IncludeのScriptを以下のように変更します。

javascript
var gemini_pro = Class.create();
gemini_pro.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
    
    demoTest: function() {
        var output;
        try {
            var userQuestion = this.getParameter('sysparm_text');
            
            var personalInfo = {
                "name": "太郎",
                "age": 20,
                "city": "横浜市",
				"favorite food":"オムライス",
				"嫌いな食べ物":"トマト",
				
            };
            
            // 結合プロンプトを生成
            var combinedPrompt = "ユーザーの質問: " + userQuestion +
                                 "\n\n以下の情報を使って質問に回答してください: " + 
                                 JSON.stringify(personalInfo);
            
            var r = new sn_ws.RESTMessageV2('x_1644933_skill_up.Gemini Integration', 'POST'); 
            

            r.setStringParameter('text', combinedPrompt);
            
            var response = r.execute();
            var responseBody = response.getBody();
            var httpStatus = response.getStatusCode();
            
            if (httpStatus == 200) {
                output = responseBody;
            } else {
                gs.error('Gemini API Error in Script Include: Status ' + httpStatus + ', Body: ' + responseBody);
                output = JSON.stringify({error: "API call failed with status " + httpStatus});
            }

        } catch (ex) {
            gs.error('Exception in Script Include (gemini_pro): ' + ex.message);
            output = JSON.stringify({error: "Server exception: " + ex.message});
        }
        return output;
    },

    type: 'gemini_pro'
});

・おおまかなコードの解説
personal infoという関数に個人情報を格納し、u_questionに入力された質問と併せて

var combinedPrompt = "ユーザーの質問: " + userQuestion +
                                 "\n\n以下の情報を使って質問に回答してください: " + 
                                 JSON.stringify(personalInfo);

という部分でJSON形式でGeminiに受け渡しています。

3.Geminiに過去のトーク内容を記憶させる

 Geminiをはじめとした、生成AIの強みとして、過去のトーク内容を基に回答をするというものがあると思います。しかし、2章まででは自分の情報を基に回答を生成するという機能までしか実装されていません。
 そこで、Ask Geminiテーブルに保存されたレコードの内容を基に回答を生成させるという方針で実装します。
 Scrtipt Includeを以下のScriptに変更します。

javascript
var gemini_pro = Class.create();
gemini_pro.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {

   demoTest: function() {
       var output;
       try {
           var userQuestion = this.getParameter('sysparm_text');

           // ① 個人情報(既存)
           var personalInfo = {
               "name": "太郎",
               "age": 20,
               "city": "横浜市",
   			"favorite food":"オムライス",
   			"嫌いな食べ物":"トマト",

           };

           // ② テーブルデータ
           var volunteers = [];
           var gr = new GlideRecord('x_1644933_skill_up_ask_gemini'); // ← テーブル名を必要に応じて変更

           gr.setLimit(10); // 取得件数制限(多すぎるとGeminiに送れない) 無料枠の限界ですね、、
           gr.query();
           while (gr.next()) {
               volunteers.push({
                   question: gr.getValue('u_question'),
                   age: gr.getValue('u_response'),
                   // 必要に応じて他のフィールドを追加
               });
           }

           // ③ プロンプト構築
           var combinedPrompt =
               "ユーザーの質問: " + userQuestion + "\n\n" +
               "【個人情報】:\n" + JSON.stringify(personalInfo, null, 2) + "\n\n" +
               "【トーク一覧(ServiceNowから取得)】:\n" + JSON.stringify(volunteers, null, 2) + "\n\n" +
               "上記の情報を参考にして、質問にわかりやすく答えてください。";

           // ④ Gemini API 呼び出し(POSTメソッドのIntegrationを使う)
           var r = new sn_ws.RESTMessageV2('x_1644933_skill_up.Gemini Integration', 'POST');
           r.setStringParameter('text', combinedPrompt); // text パラメータにプロンプトを渡す

           var response = r.execute();
           var responseBody = response.getBody();
           var httpStatus = response.getStatusCode();

           if (httpStatus == 200) {
               output = responseBody;
           } else {
               gs.error('Gemini API Error in Script Include: Status ' + httpStatus + ', Body: ' + responseBody);
               output = JSON.stringify({
                   error: "API call failed with status " + httpStatus
               });
           }

       } catch (ex) {
           gs.error('Exception in Script Include (gemini_pro): ' + ex.message);
           output = JSON.stringify({
               error: "Server exception: " + ex.message
           });
       }

       return output;
   },

   type: 'gemini_pro'
});

・大まかなコードの解説
2章でpersonal Infoに個人情報を追加しましたが、それに加えて、volunteersという関数にGlideRecordで取得した、x_1644933_skill_up_ask_geminiテーブルの情報を格納しているという構成になっています。
(金欠大学生なので、無料枠を使用しています。取得できるのは10個が限界でした、、、)

終わりに

いかがだったでしょうか。
2章でご紹介したような方法でGeminiに情報を伝えるとかなり強い洗脳を与えることができます。ぜひ、自分専用のAIを作ってみてください!

最後に実装するにあたって参考にした動画を添付します。この方はGlobalアプリケーションで実装されているため、とても役立つのではないかと思います。

Integration between ServiceNow & Google Gemini AI

<参考資料>
Servicenow Bytes "Integration between ServiceNow & Google Gemini AI" 2025年 https://www.youtube.com/watch?v=pCX3uh8B_tw

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?