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 件のコメント:
コメントを投稿