7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gemma 4のマルチモーダル機能をBedrock Mantleエンドポイントで呼び出す方法(Chat Completions/Responses)

7
Posted at

BedrockでGemma 4が使えるようになりました🎉

本日時点で北米とEUリージョンでの提供で、東京リージョンはまだありません。

例によって、Bedrockのドキュメントが伸びしろだらけなので、マルチモーダルの検証を行いました。

Gemma 4概要

特徴 E2B 26B-A4B 31B
コンテキスト長 128K 256K 256K
画像 ✅️ ✅️ ✅️
動画 ✅️ ✅️ ✅️
音声 ✅️ ❌️ ❌️

音声:30秒まで
動画:60秒まで(1fpsで処理する模様)

Bedrock版の特徴

  • Bedockでの呼び出しはMantleエンドポイントのみ(Chat CompletionsとResponsesは両対応)
  • Bedrock Runtimeエンドポイント非対応のため、InvokeModel、Converse非対応
  • ファイルの指定は「Base64」か「S3 URI」で指定可能。ただしChat Completions APIの音声は「Base64」のみ

呼び出す

uv init app --python 3.13
cd app
uv add openai aws-bedrock-token-generator botocore[crt]

※botocore[crt]はaws loginの認証情報を使用する場合のみ

Responses API

画像

対応フォーマット:JPEG、PNG、GIF、WebP。(出典:私)
input_image型のimage_urlフィールドに指定します。

  • Base64

    responses_image_base64.py
    from aws_bedrock_token_generator import provide_token
    from openai import OpenAI
    
    region = "us-east-1"
    
    client = OpenAI(
        base_url=f"https://bedrock-mantle.{region}.api.aws/openai/v1",
        api_key=provide_token(region=region),
    )
    
    with open("image.jpg", "rb") as f:
        image_data = base64.b64encode(f.read()).decode()
    
    response = client.responses.create(
        model="google.gemma-4-e2b",
        instructions="日本語で回答して",
        input=[
            {
                "role": "user",
                "content": [
                    {"type": "input_text", "text": "この画像の内容を説明して"},
                    {
                        "type": "input_image",
                        "image_url": f"data:image/jpeg;base64,{image_data}",
                    },
                ],
            }
        ],
        max_output_tokens=512,
    )
    print(response.output_text)
    

以降のコードサンプルはclient生成以降を記載します。

  • S3 URI

    responses_image_uri.py
    bucket_name = "..."
    file_name = "image.jpg"
    
    response = client.responses.create(
        model="google.gemma-4-e2b",
        instructions="日本語で回答して",
        input=[
            {
                "role": "user",
                "content": [
                    {"type": "input_text", "text": "この画像の内容を説明して"},
                    {
                        "type": "input_image",
                        "image_url": f"s3://{bucket_name}/{file_name}",
                    },
                ],
            }
        ],
        max_output_tokens=512,
    )
    print(response.output_text)
    

動画

対応フォーマット:MP4。(出典:私)
動画専用の入力型はなく、input_image型のimage_urlフィールドを流用する形で動作します。

  • Base64

    responses_video_base64.py
    file_name = "video.mp4"
    
    with open(file_name, "rb") as f:
        video_data = base64.b64encode(f.read()).decode()
    
    response = client.responses.create(
        model="google.gemma-4-e2b",
        instructions="日本語で回答して",
        input=[
            {
                "role": "user",
                "content": [
                    {"type": "input_text", "text": "この動画の内容を説明して"},
                    {
                        "type": "input_image",
                        "image_url": f"data:video/mp4;base64,{video_data}",
                    },
                ],
            }
        ],
        max_output_tokens=512,
    )
    print(response.output_text)
    
  • S3 URI

    responses_video_uri.py
    bucket_name = "..."
    file_name = "video.mp4"
    
    response = client.responses.create(
        model="google.gemma-4-e2b",
        instructions="日本語で回答して",
        input=[
            {
                "role": "user",
                "content": [
                    {"type": "input_text", "text": "この動画の内容を説明して"},
                    {
                        "type": "input_image",
                        "image_url": f"s3://{bucket_name}/{file_name}",
                    },
                ],
            }
        ],
        max_output_tokens=512,
    )
    print(response.output_text)
    

音声

対応フォーマット:WAV、MP3。(出典:私)
音声専用の入力型はなく、input_image型のimage_urlフィールドを流用する形で動作します。

  • Base64

    responses_audio_base64.py
    file_name = "audio.wav"
    
    with open(file_name, "rb") as f:
        audio_data = base64.b64encode(f.read()).decode()
    
    response = client.responses.create(
        model="google.gemma-4-e2b",
        instructions="日本語で回答して",
        input=[
            {
                "role": "user",
                "content": [
                    {"type": "input_text", "text": "この音声の内容を説明して"},
                    {
                        "type": "input_image",
                        "image_url": f"data:audio/wav;base64,{audio_data}",
                    },
                ],
            }
        ],
        max_output_tokens=512,
    )
    print(response.output_text)
    
  • S3 URI

    responses_audio_uri.py
    bucket_name = "..."
    file_name = "audio.wav"
    
    response = client.responses.create(
        model="google.gemma-4-e2b",
        instructions="日本語で回答して",
        input=[
            {
                "role": "user",
                "content": [
                    {"type": "input_text", "text": "この音声の内容を説明して"},
                    {
                        "type": "input_image",
                        "image_url": f"s3://{bucket_name}/{file_name}",
                    },
                ],
            }
        ],
        max_output_tokens=512,
    )
    print(response.output_text)
    

Chat Completions API

画像

対応フォーマット:JPEG、PNG、GIF、WebP。(出典:私)
image_url型のimage_url.urlフィールドに指定します。

  • Base64

    chat_image_base64.py
    file_name = "image.jpg"
    
    with open(file_name, "rb") as f:
        image_data = base64.b64encode(f.read()).decode()
    
    response = client.chat.completions.create(
        model="google.gemma-4-e2b",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "この画像の内容を説明して"},
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:image/jpeg;base64,{image_data}",
                        },
                    },
                ],
            }
        ],
        max_tokens=512,
    )
    print(response.choices[0].message.content)
    
  • S3 URI

    chat_image_uri.py
    bucket_name = "..."
    file_name = "image.jpg"
    
    response = client.chat.completions.create(
        model="google.gemma-4-e2b",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "この画像の内容を説明して"},
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"s3://{bucket_name}/{file_name}",
                        },
                    },
                ],
            }
        ],
        max_tokens=512,
    )
    print(response.choices[0].message.content)
    

動画

対応フォーマット:MP4。(出典:私)
video_url型のvideo_url.urlフィールドに指定します。

  • Base64

    chat_video_base64.py
    file_name = "video.mp4"
    
    with open(file_name, "rb") as f:
        video_data = base64.b64encode(f.read()).decode()
    
    response = client.chat.completions.create(
        model="google.gemma-4-e2b",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "この動画の内容を説明して"},
                    {
                        "type": "video_url",
                        "video_url": {
                            "url": f"data:video/mp4;base64,{video_data}",
                        },
                    },
                ],
            }
        ],
        max_tokens=512,
    )
    print(response.choices[0].message.content)
    
  • S3 URI

    chat_video_uri.py
    bucket_name = "..."
    file_name = "video.mp4"
    
    response = client.chat.completions.create(
        model="google.gemma-4-e2b",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "この動画の内容を説明して"},
                    {
                        "type": "video_url",
                        "video_url": {
                            "url": f"s3://{bucket_name}/{file_name}",
                        },
                    },
                ],
            }
        ],
        max_tokens=512,
    )
    print(response.choices[0].message.content)
    

音声

対応フォーマット:WAV、MP3。(出典:私)
input_audio型のinput_audio.data(Base64)とinput_audio.formatで指定します。

  • Base64

    chat_audio_base64.py
    file_name = "audio.wav"
    
    with open(file_name, "rb") as f:
        audio_data = base64.b64encode(f.read()).decode()
    
    response = client.chat.completions.create(
        model="google.gemma-4-e2b",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "この音声の内容を説明して"},
                    {
                        "type": "input_audio",
                        "input_audio": {
                            "data": audio_data,
                            "format": "wav",
                        },
                    },
                ],
            }
        ],
        max_tokens=512,
    )
    print(response.choices[0].message.content)
    
  • S3 URI

    音声はS3 URI方式に未対応です。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?