2024/07/18

つないでみよう:#17)GPT4o で画像認識 - 送信する JSON と作成 ②

前回 GPT4o に送信する JSON のフォーマットについて全体像とそれを作成する関数を紹介しました。今回はその中に画像ファイルを含める方法についてまとめします。


画像の送信方法

前回紹介した JSON フォーマットで、画像の送信は次のように表していました。

               "image_url": {
                  "url": "data:image/jpeg;base64,{・・・(送信する画像)・・・}"
               }

この部分は仕様を詳しく調査できていないのですが、この指定でうまく返信を得ることができました。image_url には url というサブノードを指定する形式となっています。

そして、url の値は "data:image/jpeg;base64," という固定の文字列に Base64 でエンコードした画像データを { } で括って与えます。

ちなみに "image/jpeg" と記述されていますが、送信する画像は jpeg でなくても動作しました。例えば、PNG 画像を Base64 でエンコードして与えてみましたが、認識してくれました。現時点では柔軟に対応してくれる仕様だと都合よく解釈し、気にせず進めます。


添付ファイルを Base64 に変換

まずは、メインルーチンからコールされる関数 xAttachmentToBase64 です。処理する文書とファイルが添付されているフィールド名が引数です。

Function xAttachmentToBase64(vnd As NotesDocument, _
                                              ByVal vsFldName As String) As String
   'Base64に変換
   Dim sBase64 As String
   Dim sName As String
   Dim nst As NotesStream

   'ファイルをダウンロードしてファイル名を取得
   sName = xSaveAttachment(vnd, vsFldName)

   'ファイルをBase64に変換
   Set nst = xns.CreateStream()
   Call nst.Open(sName)
   xAttachmentToBase64 = StreamToBase64(nst)
End Function

この関数は、添付ファイルを Base64 に変換する処理のメインルーチンにあたり、ファイルをダウンロードする関数とファイルを変換する関数の2つのサブ関数をコールしています。


添付ファイルのダウンロード

サブ関数の1つ目、添付ファイルを指定したフィールドからダウンロードする関数です。文書とフィールド名が引数です。

この関数はフィールド内の最初の添付ファイルを Windows テンポラリフォルダに保存します。そのファイル名(フルパス)を戻り値で返します。

Function xSaveAttachment(vnd As NotesDocument, ByVal vsFldName As String) As String
   Dim ni As NotesItem
   Dim nrti As NotesRichTextItem
   Dim nemb As NotesEmbeddedObject
   Dim sFol As String
   Dim sName As String
   Dim vTmp As Variant
   Dim i As Integer
   Dim v As Variant

   'Windows テンポラリフォルダを取得
   sFol = GetWinTmpPath()

   'フィールドを取得
   Set ni = vnd.GetFirstItem(vsFldName)
   If ni.Type = RICHTEXT Then
      'リッチテキストなら添付ファイルをチェック
      Set nrti = ni
      vTmp = nrti.EmbeddedObjects
      If Not (IsEmpty(vTmp)) Then
         For i = 0 To UBound(vTmp)
            '埋め込みオブジェクトを順に取得
            Set nemb = vTmp(i)
            If nemb.Type = EMBED_ATTACHMENT Then
               '画像ファイルであることを前提
               sName = nemb.Source
               v = Split(sName, ".")
               'ファイル名を決定
               sName = sFol & "denaoshi" & Format(Now, "yyyymmddhhnnss") & v(UBound(v))
               '添付ファイルを保存
               Call nemb.ExtractFile(sName)
               Exit For
            End If
         Next
      End If
   End If

   xSaveAttachment = sName
End Function

添付ファイルのダウンロードについては、リッチテキストに関する連載の『#15)添付ファイルのダウンロード』でも紹介しています。必要に応じて参照ください。


ファイルを Base64 に変換

Base64 にエンコードする関数は、連載『DXL Step-by-Step』の『#10)イメージリソースの新規作成』で紹介しています。この StreamToBase64 関数をそのまま流用します。今回必要なのはこの関数だけですので、エージェントにコピペで貼り付けます(コードは上記リンク先から取得ください)。

StreamToBase64 関数は、引数が NotesStream で戻り値が Base64 でエンコードされた文字列です。そこで、呼び出し元の xAttachmentToBase64 関数内では、ダウンロードしたファイルをストリームとして開き、StreamToBase64 関数に渡しています。

   'ファイルをダウンロードしてファイル名を取得
   sName = xSaveAttachment(vnd, vsFldName)

   'ファイルをBase64に変換
   Set nst = xns.CreateStream()
   Call nst.Open(sName)

   xAttachmentToBase64 = StreamToBase64(nst)


次回の予告

これで JSON の作成は完了です。次回は API をコールする部分を作成します。


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


0 件のコメント:

コメントを投稿