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.pyfrom 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.pybucket_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.pyfile_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.pybucket_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.pyfile_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.pybucket_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.pyfile_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.pybucket_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.pyfile_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.pybucket_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.pyfile_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方式に未対応です。