2025/01/06

作ってみよう:#19)スマート名刺管理 - GTP4o API リクエストの作成 ③

リクエスト時の送信する JSON の最後のパートは、response_format ノードを作成する部分です。

このシリーズの最初に説明した通り、GPT4o の Structured Outputs を利用します。この機能については、以下のリンクで紹介していますので、必要に応じてご確認ください。


response_format の指定

まず作成するノードの確認です。

図で省略している部分を含め、指定するスキーマ設定をまとめると次の通りです。

スキーマ名 readnamecard

◇ 指示する JSON ノードの定義

ノード 説明
companyname_full string 会社名
companyname 会社名(法人格なし)
companyname_kn カナ会社名(法人格なし)。記載がない場合は会社名から類推。
name 氏名(姓名の間は半角スペース)
name_kn カナ氏名(姓名の間は半角スペース)。記載がない場合は氏名から類推。
name_en 英字氏名(半角英字で姓名の間は半角スペース)。記載がない場合は氏名から類推。
dept 所属
role 役職・肩書
zip 郵便番号(半角数字、ハイフンなし)
address 住所
tel 電話番号
mobile 携帯電話番号
fax Fax番号
email eメールアドレス
url URL


response_format ノードの作成

response_format ノードを作成する関数は次の通りです。工夫が足りずだらだら長くなっていますがご容赦ください。

Private Function xMakeRequest_ResponseFormat(vjnav As NotesJSONNavigator) As Boolean
   Dim jo As NotesJSONObject

   '1) response_format
   Dim joResponseFormat As NotesJSONObject
   Set joResponseFormat = vjnav.AppendObject("response_format")

   Call joResponseFormat.AppendElement("json_schema", "type")

   '2) json_schema
   Dim joJsonSchema As NotesJSONObject
   Set joJsonSchema = joResponseFormat.AppendObject("json_schema")

   Call joJsonSchema.AppendElement("readnamecard", "name")
   Call joJsonSchema.AppendElement(True, "strict")

   '3) schema
   Dim joSchema As NotesJSONObject
   Set joSchema = joJsonSchema.AppendObject("schema")
   Call joSchema.AppendElement("object", "type")

   '4) properties
   Dim joProp As NotesJSONObject
   Set joProp = joSchema.AppendObject("properties")

   '5) companyname_full
   Set jo = joProp.AppendObject("companyname_full")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("会社名", "description")

   '5) companyname
   Set jo = joProp.AppendObject("companyname")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("会社名(法人格なし)", "description")

   '5) companyname_kn
   Set jo = joProp.AppendObject("companyname_kn")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("カナ会社名(法人格なし)。記載がない場合は会社名から類推。", "description")

   '5) name
   Set jo = joProp.AppendObject("name")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("氏名(姓名の間は半角スペース)", "description")

   '5) name_kn
   Set jo = joProp.AppendObject("name_kn")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("カナ氏名(姓名の間は半角スペース)。記載がない場合は氏名から類推。", "description")

   '5) name_en
   Set jo = joProp.AppendObject("name_en")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("英字氏名(半角英字で姓名の間は半角スペース)。記載がない場合は氏名から類推。", "description")

   '5) dept
   Set jo = joProp.AppendObject("dept")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("所属", "description")

   '5) role
   Set jo = joProp.AppendObject("role")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("役職・肩書", "description")

   '5) zip
   Set jo = joProp.AppendObject("zip")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("郵便番号(半角数字、ハイフンなし)", "description")

   '5) address
   Set jo = joProp.AppendObject("address")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("住所", "description")

   '5) tel
   Set jo = joProp.AppendObject("tel")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("電話番号", "description")

   '5) mobile
   Set jo = joProp.AppendObject("mobile")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("携帯電話番号", "description")

   '5) fax

   Set jo = joProp.AppendObject("fax")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("Fax番号", "description")

   '5) email
   Set jo = joProp.AppendObject("email")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("eメールアドレス", "description")

   '5) url
   Set jo = joProp.AppendObject("url")
   Call jo.AppendElement("string", "type")
   Call jo.AppendElement("URL", "description")

   '4) required
   Dim jaRequired As NotesJSONArray
   Set jaRequired = joSchema.AppendArray("required")

   Call jaRequired.AppendElement("companyname_full")
   Call jaRequired.AppendElement("companyname")
   Call jaRequired.AppendElement("companyname_kn")
   Call jaRequired.AppendElement("name")
   Call jaRequired.AppendElement("name_kn")
   Call jaRequired.AppendElement("name_en")
   Call jaRequired.AppendElement("dept")
   Call jaRequired.AppendElement("role")
   Call jaRequired.AppendElement("zip")
   Call jaRequired.AppendElement("address")
   Call jaRequired.AppendElement("tel")
   Call jaRequired.AppendElement("mobile")
   Call jaRequired.AppendElement("fax")
   Call jaRequired.AppendElement("email")
   Call jaRequired.AppendElement("url")

   '4) additionalProperties
   Call joSchema.AppendElement(False, "additionalProperties")
End Function

こういった階層構造が複雑な JSON を操作するプログラムの場合、得てして現在位置(=操作しているノードとレベル)を見失いがちです。開発している時点では理解できていても、しばらくたってコードを見るとつかみにくいです。その対応として、コメントのノード名の前にレベルをつけるようにしてチェックしやすくしています。


次回の予定

これで、リクエスト時の送信する JSON は完成です。次回はテスト実行して、JSON が正しくできるか確認します。


前回 作ってみよう 次回


0 件のコメント:

コメントを投稿