2026/07/20

つないでみよう:#34) Responses API - サンプルアプリ作成 ③

Responses API では過去のリクエストを参照させて、会話を継続する機能があります。仕組みは単純で、リクエストで送信する JSON に参照する過去のリクエストの id を previous_response_id に指定するだけでした。

{
   "model": "gpt-5-nano",
   "previous_response_id": "resp_xxxxx",
   "input": "そこの面積は?"
}

今回は、作成中のサンプルアプリに会話を継続する機能を追加します。


フォームの作成

前回作成したフォームをコピペして継続用のフォームを作成します。後述のプログラムで使用するので別名は fGPT_Res02 とします。

追加するのは参照するリクエストの id を指定する継続元 ID(PrevID)フィールドだけです。


エージェントの作成

エージェントも前回作成したものをコピペで作成し、変更を加える形で進めます。このエージェントの使い方は次の通りです。

  1. 継続元の文書を開く
  2. 今回のエージェント実行
  3. 次の問い合わせのプロンプトを入力
  4. Responses API に問い合わせ(会話の継続)
  5. 結果を記録して、UI に表示


エージェントの修正箇所を順に説明します。

◇ Initialize

メインルーチンでは、プロンプトの入力(青字)と会話の継続用の文書を新規作成(赤字)する処理を追加します。 それ以外に変更はありません。

Sub Initialize
   Dim nuiw As New NotesUIWorkspace
   Dim nuid As NotesUIDocument
   Dim ndb As NotesDatabase
   Dim nd As NotesDocument

   Dim jnavRequest As NotesJSONNavigator
   Dim jnavResponse As NotesJSONNavigator

   '初期化
   Set xns = New NotesSession
   Set ndb = xns.CurrentDatabase

   '次のプロンプトを入力
   Dim s As String
   s = nuiw.Prompt(PROMPT_OKCANCELEDIT, "継続", "次のプロンプトを入力してください。")
   If s = "" Then Exit Sub
     '未入力で処理終了

   '現在の文書(= 継続元の文書)
   Dim ndPrev As NotesDocument
   Set nuid = nuiw.Currentdocument
   Set ndPrev = nuid.Document

   '新規文書作成
   Set nd = ndb.CreateDocument()
   nd.Form = "fGPT_Res02"
   nd.Model = ndPrev.Model
   nd.PrevID = ndPrev.Result_ID     '継続元のID
   nd.Prompt = s          'プロンプト

   '① Request Body(JSON) の作成
   Set jnavRequest = xGetRequest_JSON(nd)
   Call xSetJSON(nd, "Request", jnavRequest) 'Request Body の保存

   '② 問い合わせ実行
   Set jnavResponse = xAskResponses(jnavRequest)
   Call xSetJSON(nd, "Response", jnavResponse) 'Response の保存

   '返答を取得
   If xGetResponce(nd, jnavResponse) Then
      Call nd.Save(True, False)

      '文書を開きなおす
      Call nuid.Close()
      Call nuiw.EditDocument(False, nd)
   End If
End Sub


◇ xGetRequest_JSON

送信する JSON を作成する処理では、previous_response_id の指定を追加します。会話の継続で一番重要な点なのですが、修正作業としては単純ですね...

Function xGetRequest_JSON(vnd As NotesDocument) As NotesJSONNavigator
   Dim jnav As NotesJSONNavigator

   'RequestBody(JSON) の準備
   Set jnav = xns.CreateJSONNavigator("")

   '1.model
   Call jnav.AppendElement(vnd.Model(0),"model")
  
   '1.previous_response_id
   If vnd.PrevID(0) <> "" Then
      Call jnav.AppendElement(vnd.PrevID(0),"previous_response_id")
   End If


   '1.input
   Call jnav.AppendElement(vnd.Prompt(0),"input")

   Set xGetRequest_JSON = jnav
End Function


動作検証

完成したら実行します。

前回(#33)で作成した文書を開き、今回作成したエージェントを実行します。『そこの面積は?』と聞いただけなのに、前回の「大阪の県庁所在地」を参照して、大阪市の面積に関して答えてくれました。


前回 連載:つないでみよう 次回


0 件のコメント:

コメントを投稿