こんにちはジョージです。最近 Gemini が面白いので カスタム App でも試してみたよ。今回は Gemini 3 を使って、写真から色や形状の特徴を日本語で生成してみました!
デモで使えるデータセットの準備
まずは大量に写真を準備します。(大量でなくてもいいですが、、、) kaggle というサイトで公開されている 5,000 件強の洋服の写真を素材として使います。データは 7 GB ほどでダウンロードした写真は全てカスタム App にレコードとして登録します。
https://www.kaggle.com/datasets/agrigorev/clothing-dataset-full
Gemini API の使い方をチェック
Gemini API の使い方を以下のウェブサイトでチェックします。curl で使えるのであれば「URL から挿入」スクリプトステップに置き換えられますね。
https://ai.google.dev/gemini-api/docs/image-understanding?hl=ja#rest
IMG_PATH="/path/to/your/image1.jpg"
if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
B64FLAGS="--input"
else
B64FLAGS="-w0"
fi
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{
"inline_data": {
"mime_type":"image/jpeg",
"data": "'"$(base64 $B64FLAGS $IMG_PATH)"'"
}
},
{"text": "Caption this image."},
]
}]
}' 2> /dev/nullカスタム App スクリプトに置き換える
Gemini に FileMaker カスタム App で使えるようにポイントを教えてもらいます。最終的には、前項のサンプルコードを自分の頭の中で置き換えるのですが、要は $url に $payload と $model あたりがうまく渡せればいいので地道にトライしていきます。
SECRET は Google AI Studio (https://aistudio.google.com)にアクセスして画面左下にある Get API Key で発行した Key の値になります。私の場合、無料クレジットの反映がうまくいかず小一時間ほど「プロジェクトの割り当てティアを利用できません。」とエラーでましたが、しばらくしたら無事に反映されました。
#
変数を設定 [ $url ; 値: "https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={secret}" ]
変数を設定 [ $model ; 値: "gemini-3-flash-preview" ]
変数を設定 [ $url ; 値: Substitute ( $url; [ "{model}"; $model ]; [ "{secret}"; SECRET ] ) ]
#
# {
"contents": [{
"parts": [
{"text": "添付した画像について日本語で説明してください"},
{
"inline_data": {
"mime_type": "image/jpeg",
"data": "@image_base64"
}
}
]
}]
}
変数を設定 [ $prompt ; 値: "添付した画像について日本語で説明してください" ]
変数を設定 [ $image_base64 ; 値: Base64EncodeRFC ( 4648; images::container ) ]
変数を設定 [ $payload ; 値: JSONSetElement ( "{}" ; [ "contents[0].parts[0].text" ; $prompt ; JSONString ] ; [ "contents[0].parts[1].inline_data.mime_type" ; "image/jpeg" ; JSONString ] ; [ "contents[0].parts[1].inline_data.data" ; $image_base64 ; JSONString… ]
変数を設定 [ $payload ; 値: "--request POST " & " --header " & Quote ( "Content-Type: application/json" ) & " --data " & Quote ( $payload ) ]
#
URL から挿入 [ ダイアログあり: オフ ; ターゲット: images::response ; $url ; cURL オプション: $payload ]
#
フィールド設定 [ images::description ; JSONGetElement ( images::response; "candidates[]content.parts[]text" ) ]
#
レコード/検索条件確定 [ ダイアログあり: オフ ]
#
試してみる
API リクエストがうまく通ると次の JSON を取得できます。本文を candidates[0].content.parts[0].text にはいってるので、JSONGetElement で取得してフィールドに挿入します。プロンプト次第ではもう少し体系的な説明にできそうですね。
root
├─ candidates: Array<Candidate>
│ └─ [0]
│ ├─ content: Content
│ │ ├─ parts: Array<Part>
│ │ │ └─ [0]
│ │ │ ├─ text: string <<-- これ
│ │ │ └─ thoughtSignature: string
│ │ └─ role: string ("model")
│ ├─ finishReason: string ("STOP")
│ └─ index: number
│
├─ usageMetadata: UsageMetadata
│ ├─ promptTokenCount: number
│ ├─ candidatesTokenCount: number
│ ├─ totalTokenCount: number
│ ├─ promptTokensDetails: Array<PromptTokenDetail>
│ │ ├─ [0]
│ │ │ ├─ modality: string ("IMAGE")
│ │ │ └─ tokenCount: number
│ │ └─ [1]
│ │ ├─ modality: string ("TEXT")
│ │ └─ tokenCount: number
│ └─ thoughtsTokenCount: number
│
├─ modelVersion: string
└─ responseId: string

まとめ
いかがでしたでしょうか。話題の Gemini 3 で画像の説明文章を作成してみました。ここまで準備できれば埋め込みを作成して、FileMaker 標準機能の「セマンティック検索」や「自然言語で検索実行」を使って、簡易的な画像データベースが完成です。皆様も是非試してみてください。

