[アップデート] Amazon BedrockでOpenAI社のオープンウェイトモデル「gpt-oss」が利用可能になりました
みなさん、こんにちは!
福岡オフィスの青柳です。
本日、OpenAI社からオープンウェイトモデルとして 「gpt-oss」シリーズが公開されました。
早速、弊社でもMac Miniで動かしたりして盛り上がっています。
そして、公開されたばかりの「gpt-oss」シリーズが、なんとAmazon Bedrockの基盤モデル (FM) として既に利用できるようになっています。
もちろん、Bedrockでも「gpt-oss」を動かしてみましたよ!
「gpt-oss」の概要
「gpt-oss」シリーズがどのようなものなのか、OpenAI社のリリース情報で確認してみましょう。
「gpt-oss」シリーズは、OpenAI社の「o1」「o3」「o4」と同様の「推論モデル」(Reasoning Model) であることが特徴です。
今回リリースされた2つのモデルと「gpt-oss-120b」と「gpt-oss-20b」は、OpenAI社の説明によると以下のような性能を持っているとされています。
- gpt-oss-120b: コア推論ベンチマークでo4-miniとほぼ同等の結果を達成
- gpt-oss-20b: 一般的なベンチマークでo3‑miniと同様の結果
ただし、言語モデルは学習に用いられたデータセットの量や傾向などによって、性能や精度が変わってくると言われています。
あらゆる場面で完全に統一された基準で上記のように比較できる訳ではないことに、留意してください。
Bedrockでの「gpt-oss」のサポート状況など
利用可能なリージョン (8/6現在)
現在のところ、利用可能なリージョンは「オレゴン」(us-west-2) のみです。
1つのリージョンでしか利用できませんので、クロスリージョン推論にも対応しておらず、指定したリージョンで固定された利用となります。
料金
オレゴンリージョンにおける利用料金単価は、以下のようになっています。
| モデル | 1,000入力トークンあたり単価 | 1000出力トークンあたり単価 | 1,000入力トークンあたり単価 (バッチ実行) | 1000出力トークンあたり単価 (バッチ実行) | 
|---|---|---|---|---|
| gpt-oss-20b | 0.00007 USD | 0.0003 USD | 0.000035 USD | 0.00015 USD | 
| gpt-oss-120b | 0.00015 USD | 0.0006 USD | 0.000075 USD | 0.0003 USD | 
Bedrockで提供されている基盤モデルの中でも安価と言われている「Amazon Nova」シリーズと同じくらいの価格帯だと思いました。
もちろん、モデルによって性能や機能が異なりますので、「gpt-oss」シリーズの実際のコストパフォーマンスについては、今後評価されていくと思います。
※ 最新の料金の情報は、AWS公式サイトで確認してください。
Amazon Bedrock pricing (現在のところ英語ページのみ記載あり)
使ってみた
新しいモデルがリリースされた際の「お決まり」の準備として、Bedrockマネジメントコンソールの「モデルアクセス」画面から、対象モデルを有効化しておきます。

(上記画面は既に有効化した状態です)
今回は、Pythonのプログラムコードから「gpt-oss」の各モデルを呼び出す3パターンの方法を試してみました。
AWS SDK for Python (boto3) を使ったモデル呼び出し - Converse APIの場合
AWS SDK for Python (boto3) を使う場合、2通りの方法があります。
まず、モデルを呼び出す2種類のAPIのうち、新しい方のAPIである「Converse API」を使ってみます。
AWS公式ドキュメントに「gpt-oss」シリーズのモデルを呼び出す際のコード記述方法・パラメーター等について書かれています。
ただ、他のモデルほどは情報が充実していないように見受けられました。
今回はとりあえず、ドキュメントの記載内容から読み取れる範囲で、やってみましょう。
ドキュメントによると、Converse APIでは以下のパラメーターを指定する必要があるようです。
- system: システムプロンプト等を指定する
- message: ユーザーおよびアシスタント (AI) のプロンプトを指定する
- inferenceConfig: モデルの推論パラメーターを指定する (maxTokens、temperature、topP)- ドキュメントには推論パラメーターとして「stopSequence」が指定できると書かれていますが、gpt-ossではサポートされていないようです
 
- additionalModelRequestFields: 上記のパラメータに含まれない、モデル特有の設定はここに記述する- ドキュメントには詳細が書かれていないため、どのような指定ができるのか現時点では不明です
 
ドキュメントを参考に記述したサンプルコードは以下のようになりました:
import boto3
client = boto3.client('bedrock-runtime', region_name='us-west-2')
def main():
    model_id = 'openai.gpt-oss-20b-1:0'
    system = [
        {
            'text': '質問に対して日本語で回答してください。'
        }
    ]
    messages = [
        {
            'role': 'user',
            'content': [
                {
                    'text': 'とんこつラーメンやもつ鍋で有名な日本の都市はどこですか?'
                }
            ]
        }
    ]
    inference_config = {
        'maxTokens': 1024,
        'temperature': 0.7,
        'topP': 0.9
    }
    response = client.converse(
        modelId=model_id,
        system=system,
        messages=messages,
        inferenceConfig=inference_config
    )
    for content_block in response['output']['message']['content']:
        if 'text' in content_block:
            print(content_block['text'])
if __name__ == '__main__':
    main()
コードを実行すると、以下のように応答が出力されました。
とんこつラーメンともつ鍋の両方で有名なのは、**福岡市(特に博多地区)**です。
- **とんこつラーメン**は、博多のラーメン屋が提供する濃厚な豚骨スープが特徴で、全国的に知られています。
- **もつ鍋**も福岡発祥の料理で、特に博多で数多くの専門店が軒を連ねています。
したがって、質問に対する答えは「福岡市(博多)」です。
「gpt-oss」は推論モデルのため、応答内容に「推論の過程を含む結果」と「最終的な出力テキスト」が含まれます。
今回は「最終的な出力テキスト」のみを取り出すようにコードを記述してみました。
AWS SDK for Python (boto3) を使ったモデル呼び出し - InvokeModel APIの場合
モデルを呼び出すもう一方のAPIは、Bedrock登場当初から用意されている「InvokeModel API」です。
InvokeModel APIでは、呼び出すモデル自身がネイティブで持つREST APIの仕様に準じて「リクエストbody」をセットします。
Converse APIとの大きな違いは、パラメーター messages に「システムプロンプト」(role: developer) と「ユーザープロンプト」(role: user) の両方を記述するという点です。
InvokeModel APIを使用したサンプルコードは以下のようになりました:
import boto3
import json
import re
client = boto3.client('bedrock-runtime', region_name='us-west-2')
def main():
    model_id = 'openai.gpt-oss-20b-1:0'
    messages = [
        {
            'role': 'developer',
            'content': '質問に対して日本語で回答してください。'
        },
        {
            'role': 'user',
            'content': 'とんこつラーメンやもつ鍋で有名な日本の都市はどこですか?'
        }
    ]
    native_request = {
        'messages': messages,
        'max_completion_tokens': 1024,
        'temperature': 0.7,
        'top_p': 0.9
    }
    response = client.invoke_model(
        modelId=model_id,
        body=json.dumps(native_request).encode('utf-8')
    )
    response_body = json.loads(response['body'].read().decode('utf-8'))
    content = response_body['choices'][0]['message']['content']
    text = re.sub(r'<reasoning>.*</reasoning>', '', content)
    print(text)
if __name__ == '__main__':
    main()
InvokeModel APIを使った場合も、推論モデルの応答には「推論の過程を含む結果」と「最終的な出力テキスト」が含まれます。
ただしConverse APIと違う点は、それらが別々のフィールドに分かれているのではなく、フィールド content に推論過程と最終出力が合わせて出力されるという点です。
(推論過程はタグ <reasoning> で囲まれた部分となります)
OpenAI謹製のPythonライブラリを使ったモデル呼び出し
「gpt-oss」では、AWS SDK for Python (boto3) を使うパターン以外に、OpenAI謹製のPythonライブラリを使うことができます。
つまり、ライブラリを指定する箇所が
import boto3
ではなく
from openai import OpenAI
になるという訳です。
OpenAIライブラリを使う場合、認証にIAMを使うことができず、先月のBedrockアップデートで利用可能になった「Amazon Bedrock APIキー」を使う必要があります。
Amazon Bedrock APIキーの利用方法は、下記のブログ記事を参照してください。
OpenAI謹製のライブラリを使う場合、最近は「Responses API」を使うことが多いかと思います。
しかし、Bedrock上で「gpt-oss」使う場合、どうやら「Responses API」がサポートされておらず「Chat Completion API」を使う必要があるようです。
(十分に検証できていないため、もしかするとResponses APIを使う方法があるのかもしれません。現時点では情報が不足しておりResponses APIが本当にサポートされていないのかどうか不明です)
OpenAIライブラリを使用したサンプルコードは以下のようになりました:
from openai import OpenAI
import os
import re
client = OpenAI(
    base_url='https://bedrock-runtime.us-west-2.amazonaws.com/openai/v1',
    api_key=os.getenv('AWS_BEARER_TOKEN_BEDROCK')
)
def main():
    model_id = 'openai.gpt-oss-20b-1:0'
    messages = [
        {
            'role': 'developer',
            'content': '質問に対して日本語で回答してください。'
        },
        {
            'role': 'user',
            'content': 'とんこつラーメンやもつ鍋で有名な日本の都市はどこですか?'
        }
    ]
    response = client.chat.completions.create(
        model=model_id,
        messages=messages,
        max_completion_tokens=1024,
        temperature=0.7,
        top_p=0.9
    )
    content = response.choices[0].message.content
    text = re.sub(r'<reasoning>.*</reasoning>', '', content)
    print(text)
if __name__ == '__main__':
    main()
コードを実行する前に、「Amazon Bedrock APIキー」を取得して、以下のように環境変数にセットしておく必要があります。
export AWS_BEARER_TOKEN_BEDROCK=<取得したAPIキー>
どのように3つのパターンを使い分ける?
Bedrock上で「gpt-oss」をPythonコードから利用する3パターンの方法を試してみました。
これらをどのように使い分けるべきか?ですが、以下のように使い分けると良いのではないかと思います。
- 既にBedrockで他のモデルを使ったプログラムを作成しており、コードをあまり書き換えずに「gpt-oss」を使いたい
- → AWS SDK for Python (boto3) の「Converse API」を使う
 
- 他のプラットフォーム等でOpenAI社のモデルを利用したノウハウがあり、できるだけ活かしたい。
- → アプリをAWS上で実行する場合は、IAMによる認証が可能なAWS SDK for Python (boto3) の「InvokeModel API」を使う
- → アプリをオンプレミス・開発PC等で実行する場合は、AWSアクセスキーよりも安全に取り回しができるAmazon Bedrock APIキーを使って「OpenAI謹製のPythonライブラリ」を使う
 
必ずしも上記の通りとは限りませんので、状況に応じて使い分けることを検討してみてください。
おわりに
今回は、Amazon Bedrockで利用可能になったOpenAI社のオープンウェイトモデル「gpt-oss」を実際に試してみました。
「gpt-oss」の絶対的な性能やコストパフォーマンスについては、現時点では不明な点も多いですが、いずれ各所から評価が出てくるかと思います。
ともかくも、Bedrockで利用できる基盤モデルに選択肢が増えたことは歓迎したいですね。
今回試せなかった内容 (添付ファイルやイメージの扱い、推論モデルの使いこなし、など) については、機会があればまた試してみたいと思います。













