2025/07/18

つないでみよう:#26)画像生成 AI DALL-E3 - API のコール

OpenAI 社の DALL-E3 を API で利用して画像を生成するシリーズの2回目です。前回は API の仕様を紹介しましたので、今回は具体的なコーディングを行います。

基本的な流れは、これまでこの連載で紹介してきた OpenAI 社の API 利用と同じです。ただ、しばらく期間があいているので、LotusScript のコードはすべてを掲載いたします。


フォームの作成

まずは、どのような画像を作成するのか指示を入力するためのフォームを作成します。

API コールで使用するのは「リクエスト内容」の部分だけです。実行結果は、送受信される JSON を記録する確認用のリッチテキストフィールドとなります。


エージェントの作成

新規で LotusScript のエージェントを作成ます。ビューで選択した文書に対して実行するので、対象に[すべての選択文書]を設定します。

まず、エージェントのメインルーチンは次の通りです。

Option Declare

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

Sub Initialize
   Dim ndb As NotesDatabase
   Dim ndc As NotesDocumentCollection
   Dim nd As NotesDocument

   Dim sBase64 As String

   Dim sJSON_Post As String
   Dim sJSON_Responce As String
   Dim jnavResponce As NotesJSONNavigator

   Set xns = New NotesSession

   'ビューの選択文書の1つ目を取得
   Set ndb = xns.CurrentDatabase
   Set ndc = ndb.UnprocessedDocuments
   If ndc.Count = 0 Then
      MsgBox "文書を選択してください。", 16, ndb.Title
      Exit Sub
   End If
   Set nd = ndc.GetFirstDocument()

   '送信(POST)する JSON を作成
   sJSON_Post = xGetJSON(nd)
   Call xSetRT(nd, "JSON_Send", sJSON_Post)

   'API をコール
   Set jnavResponce = xAskGPT(sJSON_Post)
   Call xSetRT(nd, "JSON_Responce", jnavResponce.Stringify())   '必要なときのみ有効化

   Call nd.save(True, False)
End Sub

まず、このエージェントでは、ビューの選択文書の1つ目を取得して処理するようになっています。送信する JSON の作成と API をコールする2段階に分かれていて、それぞれ関数化しています。


送信する JSON の作成

送信する JSON は次のような構成でした。今回は単純化するために、prompt に文書に入力した「生成する画像の説明」をセットする以外は、固定の値とします。

{
   "model": "dall-e-3",
   "size": "1024x1024",
   "quality": "standard",
   "response_format": "b64_json",
   "prompt": "(ここに生成する画像の説明をセット)"
}

この JSON を作成する関数は次の通りです。引数 vnd が処理する文書で、戻り値は作成した JSON です。

Function xGetJSON(vnd As NotesDocument) As String
   Dim jnav As NotesJSONNavigator
   Dim s As String

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

   '1.model
   Call jnav.AppendElement("dall-e-3","model")
   '1.size
   Call jnav.AppendElement("1024x1024","size")
   '1.quality
   Call jnav.AppendElement("standard","quality")
   '1.response_format
   Call jnav.AppendElement("b64_json","response_format")
   '1.prompt
   Call jnav.AppendElement(vnd.Prompt(0),"prompt")

   xGetJSON = jnav.Stringify
End Function


API をコール

続いて、API をコールする関数です。コメントに記載している通り、HTTP リクエストの準備して、それにヘッダの設定を行い、エンドポイントに対して POST しています。

ヘッダの Authorization には API キーを 設定しています(キーの取得については #1 を参照)。また、Post メソッドの2つ目の引数に先ほどの xGetJSON 関数で作成した JSON をセットしています。

Function xAskGPT(ByVal vsJSON_Post As String) As NotesJSONNavigator
   Dim sURL As String
   Dim http As NotesHTTPRequest
   Dim jnav As NotesJSONNavigator
   Dim ja As NotesJSONArray
   Dim jobj As NotesJSONObject

   '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/images/generations"     'エンドポイント
   Set jnav = http.Post(sURL, vsJSON_Post)

   'Responceをセット
   Set xAskGPT = jnav
End Function

関数の戻り値は、API の返答の JSON で、NotesJSONNavigator のオブジェクトとして返します。


JSON の記録

メインルーチンで作成したJSON や API のレスポンスの JSON をリッチテキストフィールドに保存するのが xSetRT 関数です。

Function xSetRT(vnd As NotesDocument, ByVal vsFld As String, ByVal vsVal As String)
   Dim nrti As NotesRichTextItem

   Call vnd.RemoveItem(vsFld)
   Set nrti = vnd.CreateRichTextItem(vsFld)
   Call nrti.AppendText(vsVal)
End Function

上記メインルーチンでは有効化していますが、JSON を確認したい場合に実行し、それ以外はコメントアウトしてください。

今回は、画像生成ですので、レスポンスの JSON が大きくなります。文書内に JSON を記録すると文書を開くのが非常に遅くなります(私の環境では 5 分程度)。ご注意ください。


テスト実行は次回

ここまでで API をコールして、結果を JSONで取得するとことまでができました。次回はこれを実行して結果を確認します。


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


0 件のコメント:

コメントを投稿