2026/07/18

つないでみよう:#32) Responses API ー サンプルアプリ作成 ①

今回からは Responses API で会話を行うサンプルアプリを作成します。

前回紹介したように Responses API と Chat Completion API は、エンドポイントと送受信する JSON が違うだけで、サンプルアプリの構造に特別なことはありません。以前作成した Chat Completion API のサンプルを改造して進めることも可能なのですが、記事が独立するよう、今回は初めから順に作成したいと思います。


フォームの作成

Responses API に送信する情報と結果を記録するためのフォームを作成します。

各フィールドの説明は詳細にはしませんが、『リクエスト設定』が Responses API に送信する内容の入力欄、『リクエスト』が送信した情報、『レスポンス』が Responses API の応答を記録するエリアです。

JSON を保存するリッチテキストフィールドはセクション内に配置し、展開/省略を次のように設定します。

画像の生成や解析を行う場合など JSON が大きくなると、文書を開くのが遅くなります。ただ、閉じたセクション内にフィールドが存在する場合は、文書を開くタイミングではなく、セクションを開くタイミングで遅くなります。

上記のように最初は閉じるようにしておくと、見たいときだけ待たされる構造にできます。フィールドサイズを表示しているので、待たされるかどうかもわかりますね。


エージェントの作成

上記フォームで作成された文書を使って、Responses API に問い合わせを行うエージェントを作成します。

まずは、メインルーチンです。① API に送信する JSON を作成、② API をコール、最後に、結果を保存して UI に再表示しています。

Option Declare

Private xns As NotesSession
Private Const xcsBearer = "sk-xxxxx"   'API キーをここにセット

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
   Set nuid = nuiw.Currentdocument
   Set nd = nuid.Document

   '① 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 の保存

   '保存して開きなおす
   Call nd.Save(True, False)
   Call nuid.Close()
   Call nuiw.EditDocument(False, nd)
End Sub


作成する JSON は単純なものでした。

{
   "model": "gpt-5-nano",
   "input": "大阪府の県庁所在地は?"
}

なので、この JSON を作成する関数はいたってシンプルです。

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.input
   Call jnav.AppendElement(vnd.Prompt(0),"input")

   Set xGetRequest_JSON = jnav
End Function


続いて、Responses API に問い合わせを行う関数です。

Function xAskResponses(vjnavRequest As NotesJSONNavigator) As NotesJSONNavigator
   Dim sURL As String
   Dim http As NotesHTTPRequest
   Dim jnav As NotesJSONNavigator

   'HTTP リクエストの準備
   Set http = xns.CreateHTTPRequest()

   'HTTP ヘッダーの設定
   Call http.SetHeaderField("Content-Type", "application/json")
   Call http.SetHeaderField("Authorization", "Bearer " & xcsBearer)

   'API 実行
   http.PreferJSONNavigator = True
   sURL = "https://api.openai.com/v1/responses"      'エンドポイント
   Set jnav = http.Post(sURL, vjnavRequest.Stringify())

   'Response をセット
   Set xAskResponses = jnav
End Function

戻り値はレスポンスの JSON で、NotesJSONNavigator のオブジェクトを返します。


最後は送受信した JSON を文書に記録する関数です。引数の NotesJSONNavigator から JSON を抽出し、指定したフィールドにセットします。その際、JSON のサイズと時刻も記録しています。

Private Function xSetJSON(vnd As NotesDocument, ByVal vsFld As String, vjnav As NotesJSONNavigator)
   Dim nrti As NotesRichTextItem
   Dim sText As String

   On Error Resume Next

   'JSON(文字列)を取得 と サイズの記録
   If vjnav Is Nothing Then
      sText = "(Nothing)"
      Call vnd.ReplaceItemValue(vsFld & "_Size", "")
   Else
      sText = vjnav.Stringify()
      Call vnd.ReplaceItemValue(vsFld & "_Size", Len(sText))
   End If

   '日時の記録
   Call vnd.ReplaceItemValue(vsFld & "_DT", Now)

   'JSON の記録
   Call vnd.RemoveItem(vsFld & "_JSON")   'いったん削除してからセット
   Set nrti = vnd.CreateRichTextItem(vsFld & "_JSON")
   Call nrti.AppendText(sText)
End Function


動作検証

ここまで出来上がったらテスト実行します。

AI model に gpt-5-nano を指定し、プロンプトを記述します。文書を保存して、エージェントを実行します。

うまくいくと、次のように送受信の結果が記録されます。


まとめと今後の予定

今回は Responses API に問い合わせを行う基本的な部分を作成しました。ここまでは、以前の Chat Completion API のサンプルと大差がなく、あまり目新しさがありませんでしたが、今後はこれを拡張しながら、Responses API のさまざまな機能を確認していきます。

まず、次回は、レスポンスの JSON から必要な情報を抽出する部分を作成します。



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


0 件のコメント:

コメントを投稿