🧪

OpenAI SDK で Amazon Bedrock を使う — Mantle の実動作モデルを調べた

に公開

調査日: 2026-03-07

はじめに

2026年2月26日、AWS は Amazon Bedrock の Mantle 推論エンジン における OpenAI 互換 Projects API の一般提供をアナウンスしました。

Mantle は Amazon Bedrock の新しい分散推論ランタイムであり、Bedrock 上でホストされるモデルを OpenAI 互換の Chat Completions API・Responses API として提供するレイヤです。既存の Bedrock ネイティブ API(Converse API など)とは独立した Inference エンドポイントとして OpenAI SDK からそのまま利用できる点が特徴です。Projects API を使うと、アプリケーション・環境・チームごとに個別のプロジェクトを作成し、IAM ベースのアクセス制御やコスト可視化(タグ付け)を実現できます。Projects API の利用に追加料金はなく、消費したモデル推論分のみ課金されます。

Amazon Bedrock には2系統の推論エンドポイントが存在します。

エンドポイント ベースURL 用途
通常 Bedrock API bedrock.ap-northeast-1.amazonaws.com AWS CLI / SDK 経由の標準 API
Mantle (Projects API) bedrock-mantle.ap-northeast-1.api.aws OpenAI SDK と互換性のある分散推論エンジン

公式ドキュメントでは、ワークロード分離・タグ付けのために Projects API と Inference Profiles という2つの仕組みが用意されていることが説明されています。使い分けは以下のとおりです(参考: Projects documentation)。

Projects API Inference Profiles
対象 API OpenAI 互換 API(Responses, Chat Completions) Bedrock ネイティブ API(Invoke, Converse), Chat Completions
エンドポイント bedrock-mantle.{region}.api.aws bedrock-runtime.{region}.amazonaws.com
アクセス制御 IAM ポリシーでプロジェクトリソースを制御 IAM ポリシーで Inference Profile ARN を制御
コスト追跡 プロジェクトへの AWS タグ Inference Profile への AWS タグ

このアナウンスを受けて、ap-northeast-1 リージョンを対象に、それぞれのエンドポイントで利用できるモデルを列挙し、Mantle 経由で実際に推論が動くかどうかを確認しました。

認証方式

通常 Bedrock API Mantle (Projects API)
AWS CLI / SDK ✅ ネイティブ対応 AWS SigV4 署名で対応可能
OpenAI SDK OPENAI_API_KEY(Bedrock APIキー)+ OPENAI_BASE_URL を設定
curl AWS SigV4 (--aws-sigv4) AWS SigV4 または Bearer トークン

APIキーの種類

Mantle では 長期キー(Long-term key)短期キー(Short-term key) の2種類が使えます。本調査では SigV4 署名(短期の IAM セッション認証情報)を使用しましたが、公式ドキュメントでは Bearer トークン方式が推奨されています。

export OPENAI_API_KEY="<your-bedrock-key>"
export OPENAI_BASE_URL="https://bedrock-mantle.ap-northeast-1.api.aws/v1"

curl -X GET $OPENAI_BASE_URL/models \
  -H "Authorization: Bearer $OPENAI_API_KEY"

Note: 長期キーはデフォルトポリシーでプロジェクトの取得・一覧のみ許可。プロジェクトの作成・更新・アーカイブには追加の IAM ポリシーが必要です。セキュリティ要件が高い本番環境では短期キーを推奨します。

プロジェクトの紐づけ

各 AWS アカウントには default プロジェクトが自動的に存在し、プロジェクトを指定しない推論リクエストはすべてここに紐づけられます。特定のプロジェクトに推論を紐づけるには、リクエストに OpenAI-Project ヘッダーを付与します。

curl -X POST $OPENAI_BASE_URL/chat/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "OpenAI-Project: proj_5d5ykleja6cwpirysbb7" \
  -H "Content-Type: application/json" \
  -d '{"model": "openai.gpt-oss-120b", "messages": [{"role": "user", "content": "Hello"}]}'

モデル一覧の取得方法

通常 Bedrock API

AWS CLI の list-foundation-models を使用します。

aws bedrock list-foundation-models \
  --region ap-northeast-1 \
  --query "modelSummaries[].modelId" \
  --output text | tr '\t' '\n' | sort

Mantle (Projects API)

Mantle は OpenAI 互換のため、GET /v1/models を呼び出します。認証は AWS SigV4 署名を使用し、セッショントークンは x-amz-security-token ヘッダーで付与します。

# AWS クレデンシャルを環境変数に展開(セッショントークン含む)
eval $(aws configure export-credentials --format env-no-export)

# /v1/models を呼び出してモデルID一覧を取得
curl -s "https://bedrock-mantle.ap-northeast-1.api.aws/v1/models" \
  --aws-sigv4 "aws:amz:ap-northeast-1:bedrock" \
  --user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
  -H "x-amz-security-token: ${AWS_SESSION_TOKEN}" \
  | python3 -c "
import sys, json
data = json.load(sys.stdin)
models = data['data']
print(f'合計: {len(models)} モデル')
for m in sorted(models, key=lambda x: x['id']):
    print(m['id'])
"

取得結果の比較

  • 通常 Bedrock API: 63 モデル
  • Mantle (Projects API): 37 モデル
プロバイダー モデル 通常 Bedrock API Mantle (Projects API)
Amazon nova-micro / nova-lite / nova-pro / nova-canvas / nova-reel / nova-sonic
nova-2-lite / nova-2-sonic
titan-embed-text-v1/v2, rerank-v1
Anthropic claude-3-haiku / claude-3-sonnet / claude-3-5-sonnet
claude-3-7-sonnet / claude-sonnet-4 / claude-sonnet-4-5/4-6
claude-haiku-4-5 / claude-opus-4-5/4-6
Cohere embed-english-v3 / embed-multilingual-v3 / embed-v4 / rerank-v3-5
TwelveLabs pegasus-1-2
DeepSeek deepseek-v3-v1:0
deepseek.v3.1
deepseek.v3.2
Google gemma-3-4b-it / gemma-3-12b-it / gemma-3-27b-it
MiniMax minimax-m2 / minimax-m2.1
minimax-m2.5
Mistral ministral-3-3b/8b/14b-instruct
mistral-large-3-675b-instruct
voxtral-mini-3b-2507 / voxtral-small-24b-2507
devstral-2-123b / magistral-small-2509
Moonshot kimi-k2-thinking / kimi-k2.5
NVIDIA nemotron-nano-9b-v2 / nemotron-nano-12b-v2 / nemotron-nano-3-30b
OpenAI gpt-oss-20b / gpt-oss-120b / gpt-oss-safeguard-20b / gpt-oss-safeguard-120b
Qwen qwen3-32b / qwen3-235b-a22b-2507 / qwen3-vl-235b-a22b
qwen3-coder-30b / qwen3-coder-480b / qwen3-next-80b
qwen3-coder-next
Writer palmyra-vision-7b
ZAI glm-4.7 / glm-4.7-flash
glm-4.6 / glm-5

傾向まとめ

  • Bedrock のみ: Amazon Nova / Titan、Anthropic Claude、Cohere、TwelveLabs など AWS ネイティブ・主力モデル
  • Mantle のみ: deepseek.v3.1minimax-m2.5qwen3-coder-nextwriter.palmyra-vision-7b など Mantle に先行追加された最新モデル
  • 両方: Mistral、NVIDIA、OpenAI gpt-oss、Qwen、Google Gemma、Moonshot、ZAI(一部)などサードパーティ系の大部分。なお、モデル ID の末尾(:0-v1:0 など)が Bedrock 側と Mantle 側で異なる場合があります

Mantle での実動作確認

/v1/models の登録状態 ≠ 実際に使えるとは限らない

/v1/models はモデルの「登録状態」を返しますが、推論バックエンドのデプロイ状態とは一致しません。実際に使えるかどうかは Chat Completions API を叩いて確認する必要があります。

確認コード

全37モデルに "Who are you?"max_tokens: 2000)を送信し、choices[0].message.content の有無とその内容で判定しました。

import json, subprocess, os

ak = os.environ.get('AWS_ACCESS_KEY_ID', '')
sk = os.environ.get('AWS_SECRET_ACCESS_KEY', '')
st = os.environ.get('AWS_SESSION_TOKEN', '')

# モデル一覧取得
r = subprocess.run([
    'curl', '-s',
    'https://bedrock-mantle.ap-northeast-1.api.aws/v1/models',
    '--aws-sigv4', 'aws:amz:ap-northeast-1:bedrock',
    '--user', f'{ak}:{sk}',
    '-H', f'x-amz-security-token: {st}',
], capture_output=True, text=True, timeout=15)

models = [m['id'] for m in sorted(json.loads(r.stdout)['data'], key=lambda x: x['id'])]

for model_id in models:
    payload = json.dumps({
        'model': model_id,
        'messages': [{'role': 'user', 'content': 'Who are you?'}],
        'max_tokens': 2000
    })
    cmd = [
        'curl', '-s', '--max-time', '60',
        '-X', 'POST',
        'https://bedrock-mantle.ap-northeast-1.api.aws/v1/chat/completions',
        '--aws-sigv4', 'aws:amz:ap-northeast-1:bedrock',
        '--user', f'{ak}:{sk}',
        '-H', f'x-amz-security-token: {st}',
        '-H', 'Content-Type: application/json',
        '-d', payload
    ]
    try:
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=65)
        data = json.loads(result.stdout)
        content = data['choices'][0]['message']['content']
        mark = '✅' if content else '⚠️'
        print(f'{mark} {model_id}: {(content or "").replace(chr(10), " ")[:80]}')
    except Exception:
        print(f'❌ {model_id}: 接続失敗')

Note: eval $(aws configure export-credentials --format env-no-export) でクレデンシャルを環境変数に展開してから実行してください。

結果

37モデル中 34モデルが正常動作、3モデルが接続失敗(HTTP応答なし)

結果 モデルID "Who are you?" への応答(先頭100文字) 備考
deepseek.v3.1 I'm DeepSeek-V3, your AI assistant created by DeepSeek! 😊
deepseek.v3.2 你好!我是DeepSeek,由深度求索公司创造的AI助手!(中国語で回答)
google.gemma-3-4b-it I'm Gemma, a large language model created by the Gemma team at Google DeepMind
google.gemma-3-12b-it I'm Gemma, an open-weights AI assistant created by the Gemma team at Google
google.gemma-3-27b-it Hi there! 👋 I'm Gemma, an open-weights AI assistant trained by Google DeepMind
minimax.minimax-m2 I'm Claude, an AI created by Anthropic. ⚠️ 誤った自己紹介 / reasoning model
minimax.minimax-m2.1 I'm MiniMax-M2.1, an AI assistant built by MiniMax. reasoning model
minimax.minimax-m2.5 接続失敗
mistral.devstral-2-123b I'm a large language model created by Mistral AI.
mistral.magistral-small-2509 I'm a large language model created by Mistral AI.
mistral.ministral-3-3b-instruct I'm a large language model created by Mistral AI.
mistral.ministral-3-8b-instruct I'm a large language model created by Mistral AI.
mistral.ministral-3-14b-instruct I'm a large language model created by Mistral AI.
mistral.mistral-large-3-675b-instruct I'm a large language model created by Mistral AI.
mistral.voxtral-mini-3b-2507 I am a Large Language Model trained by the Mistral AI team.
mistral.voxtral-small-24b-2507 I am a machine learning model trained by the Mistral AI team.
moonshotai.kimi-k2-thinking I am Kimi, an AI assistant created by Moonshot AI. reasoning model
moonshotai.kimi-k2.5 I'm Kimi, an AI assistant created by Moonshot AI.
nvidia.nemotron-nano-9b-v2 Okay, the user asked "Who are you?" Let me think about how to respond... ⚠️ 思考過程を出力
nvidia.nemotron-nano-12b-v2 My name is Nemotron Nano. I am enhanced by NVIDIA Nemotron created by NVIDIA.
nvidia.nemotron-nano-3-30b I am Nemotron Nano, a language model trained by researchers from NVIDIA.
openai.gpt-oss-20b I'm ChatGPT, a large language model created by OpenAI. reasoning model
openai.gpt-oss-120b I'm ChatGPT, an AI language model created by OpenAI. reasoning model
openai.gpt-oss-safeguard-20b I'm ChatGPT, a large‑language model trained by OpenAI. reasoning model
openai.gpt-oss-safeguard-120b I'm ChatGPT, an AI language model created by OpenAI. reasoning model
qwen.qwen3-32b Hello! I am a helpful assistant designed for natural conversation
qwen.qwen3-235b-a22b-2507 Hello! I'm Qwen, a large-scale language model developed under Alibaba Group
qwen.qwen3-coder-30b-a3b-instruct I am Qwen, a large-scale language model developed under Alibaba Group
qwen.qwen3-coder-480b-a35b-instruct I am Qwen, a large-scale language model developed under Alibaba Group
qwen.qwen3-coder-next I am Qwen, a large-scale language model developed by Alibaba Cloud's Tongyi Lab
qwen.qwen3-next-80b-a3b-instruct I am Qwen, a large-scale language model developed under Alibaba Group
qwen.qwen3-vl-235b-a22b-instruct Hello! I'm Qwen, a large-scale language model developed by Alibaba Group
writer.palmyra-vision-7b I'm OpenAI, a sophisticated AI system developed by OpenAI. ⚠️ 誤った自己紹介
zai.glm-4.6 接続失敗
zai.glm-4.7 I am an AI language model, trained by Z.ai to assist with information and help solve problems.
zai.glm-4.7-flash I'm GLM, a large language model developed by Z.ai.
zai.glm-5 接続失敗

注意事項

① reasoning model は max_tokens を大きく設定すること

minimax.minimax-m2/m2.1moonshotai.kimi-k2-thinkingopenai.gpt-oss-* は reasoning モデルであり、Chain-of-Thought(CoT)的な思考ステップ(reasoning tokens / thinking tokens)を reasoning フィールドに出力してから、最終回答を content に返すアーキテクチャを持ちます。max_tokens が小さいと thinking の途中で打ち切られ contentnull になるため、2000以上を推奨します

② 自己紹介が誤っているモデルがある

モデル 自称 実際のプロバイダー
minimax.minimax-m2 "I'm Claude, an AI created by Anthropic." MiniMax
writer.palmyra-vision-7b "I'm OpenAI, a sophisticated AI system developed by OpenAI." Writer
nvidia.nemotron-nano-9b-v2 思考過程をそのまま出力 NVIDIA

③ 接続失敗の3モデルについて

minimax.minimax-m2.5zai.glm-4.6zai.glm-5 はいずれも通常 Bedrock API にも存在しません。HTTP 000 は curl が HTTP レスポンスを一切受け取れなかったことを意味します(TCP 接続の確立自体が失敗、またはバックエンドが応答を返さずに接続を閉じた状態)。認証エラー(401/403)や Not Found(404)はいずれも HTTP レスポンスである点で HTTP 000 とは明確に異なり、推論バックエンド自体が未起動またはデプロイ未完了であることを示します。/v1/models の登録状態と実際のデプロイ状態は一致しません。

まとめ

調査項目 結果
Mantle で利用可能なモデル数 37(通常 Bedrock API: 63)
実動作確認済みモデル 34 / 37
接続失敗(デプロイ未完了と推定) 3(minimax.minimax-m2.5zai.glm-4.6zai.glm-5
reasoning モデル(max_tokens 要注意) 7(minimax-m2/m2.1kimi-k2-thinkinggpt-oss-* 4モデル)
自己紹介が誤っているモデル 2(minimax-m2: Claude と自称、palmyra-vision-7b: OpenAI と自称)
Mantle に先行登録されたモデル 5(deepseek.v3.1minimax-m2.5qwen3-coder-nextwriter.palmyra-vision-7b、他)

主な知見を整理すると以下のとおりです。

  • /v1/models に登録されているからといって使えるとは限らない。 HTTP 000 レスポンスは推論バックエンド未起動を意味し、通常 Bedrock API にも存在しないモデルと重なっています。
  • Mantle は通常 Bedrock API とモデルラインナップが異なる。 Anthropic Claude ・ Amazon Nova などの主力モデルを OpenAI SDK から使いたい場合は、現時点では別の方法(Bedrock ネイティブ API + ラッパー等)を検討する必要があります。
  • reasoning モデルは max_tokens: 2000 以上の設定が必須。 小さい値だと contentnull になりエラーと区別がつきにくいです。
  • Mantle に先行登録される最新モデルがある。 deepseek.v3.1qwen3-coder-next など通常 Bedrock API にはないモデルを Mantle 経由で先行利用できるケースがありました。

Discussion