twitter facebook

GeminiAPI マルチモーダルを bash+curl で実行

JPEGファイルの中身にたいして、質問をする。ようは「この写真はどこ?」「この図面の画像ファイルから情報を抜き出して」 をする スクリプト(curl + bash ) の見本です。

事前準備

事前準備①
シェル内で json を扱うには yum や apt で jq をインストールしておきます。
事前準備②
step1.sh と step2.sh を作りますので +x でパーミッションを付与しておいてください。
事前準備③
APIキーを取得して、キーの権限などを適切に設定しておきます。(ここでは gemini1.5flashを使用)

STEP1 プロンプトをJSON形式で出力

わかりやすく2段階で実行します。以下は STEP1 クエリ(プロンプト) をjsonファイルに出力。

test.jpg のバイナリを取得しつつ、JSONのプロンプトを作って、それをいったん test.json に出力します。
step1.sh
#!/bin/bash

echo '{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "inline_data": {
            "mime_type":"image/jpeg",
            "data": "'$(base64 -w0 test.jpg)'"
          }
        },
        { "text": "この画像から金額、住所、建物情報、元付け(名前や電話番号など)などの情報を抽出してください。また、JSON での出力もなにとぞ" }
      ]
    },
  ],

}' > test.json
実行します。
bash step1.sh

STEP2 Gemini に問合せ(画像+文字)

STEP1 でつくった 画像のバイナリと プロンプトがまじった test.json を gemini になげます。
step2.sh
#!/bin/bash

API_KEY="XXXあなたのAPIキーXXX"

curl https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${API_KEY} \
        -H 'Content-Type: application/json' \
        -d @test.json
実行します。
bash step2.sh
レスポンスです。「この画像から金額、住所、建物情報、元付け(名前や電話番号など)などの情報を抽出してください。」というプロンプトを投げましたが、他にも「この物件を主婦目線からみてどうですか?」といったプロンプトも試してみる価値はあります。

だめだった例

google ai studio の get code をコピーしていろいろいじってたのですが、 "code": 400,"message": "Request contains an invalid argument.", のエラーでした。
Google AI Studio の getcode のソースでは、画像をアップロードしてURL取得してプロンプトをなげるという処理でしたが、それだとだめで、画像をこちら側でバイナリにしてプロンプトにいれて投げる ならうまくいきました(謎)
"fileData": {
"fileUri": "'${uri}'",
 "mimeType": "image/jpeg"
}
だめだったスクリプト
#!/bin/bash

API_KEY="***ここにGEMINIのAPIキーを設定***"
echo $API_KEY

FILES=("test.jpg")
MIME_TYPES=("image/jpeg")


echo "STEP1"

json=""

for i in "${!FILES[@]}"; do
  NUM_BYTES=$(wc -c < "${FILES[$i]}")
  json_data=$( curl -s "https://generativelanguage.googleapis.com/upload/v1beta/files?key=${API_KEY}" \
    -H "X-Goog-Upload-Command: start, upload, finalize" \
    -H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
    -H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPES[$i]}" \
    -H "Content-Type: application/json" \
    -d "{'file': {'display_name': '${FILES[$i]}'}}" \
    --data-binary "@${FILES[$i]}" | jq -r '.' )
  
 
done


echo "$json_data"

#JSON から URL部分を抜き出す
uri=$(echo "${json_data}" | jq -r '.file.uri')



echo "STEP2"


json2='{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "fileData": {
            "fileUri": "'${uri}'",
            "mimeType": "image/jpeg"
          }
        },
         {
          "text": "この画像から金額、住所、建物情報、元付け(名前や電話番号など)などの情報を抽出してください。また、JSON での出力もなにとぞ"
        }
      ]
    },
  ],

}'


echo $json2

curl \
  -X POST https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${API_KEY} \
  -H 'Content-Type: application/json' \
  -d "$json2"
AUTHOR
@えのえの
最終更新日 2025/02/05
FAVORITE good stock
LINK TAG
記法を見る
1742576841