Amazon Bedrock で一般提供になった Moonshot AI の Kimi K3 を試してみた
こんにちは、けーまです。
2026年9月18日、Moonshot AI の Kimi K3 が Amazon Bedrock で一般提供になりました。
私も Kimi K3 は日本語能力が優れていると感じていて、GitHub Copilot を使う際によく利用しています。
コーディング能力も高いため、Opus で実装させたあとに Kimi K3 でレビューさせる、といった使い方も普段からしています。
そんな Kimi K3 が今回 Bedrock にもサポートされたので、使い勝手を紹介したいと思います。
2.8兆パラメーターのオープンウェイトモデルで、画像入力と100万トークンのコンテキストウィンドウに対応しています。
Bedrock のオープンウェイトモデルとしては初めて、明示的なプロンプトキャッシュにも対応しました。
What's New: Kimi K3 by Moonshot AI is now generally available on Amazon Bedrock | AWS
そこで今回は、Kimi K3 を bedrock-runtime の Converse/InvokeModel/OpenAI 互換 API から呼び出し、明示的なプロンプトキャッシュや bedrock-mantle からの呼び出しも試してみました。
1. 検証環境
| 項目 | 内容 |
|---|---|
| 検証日 | 2026年9月21日 |
| OS | macOS(Darwin 25.6.0) |
| AWS CLI | 2.34.25 |
| Python | 3.12(uv で実行) |
| ライブラリ | openai、botocore、httpx |
| 認証 | IAM ロールの一時認証情報(SigV4) |
2. 検証内容
2.1 モデル一覧
まずは Moonshot AI プロバイダーに絞って基盤モデル一覧を取得してみました。
aws bedrock list-foundation-models \
--by-provider "Moonshot AI" \
--region us-east-1 \
--query "modelSummaries[?modelId=='moonshotai.kimi-k3']"
# 出力例
[
{
"modelArn": "arn:aws:bedrock:us-east-1::foundation-model/moonshotai.kimi-k3",
"modelId": "moonshotai.kimi-k3",
"modelName": "Kimi K3",
"providerName": "Moonshot AI",
"inputModalities": [
"TEXT",
"IMAGE"
],
"outputModalities": [
"TEXT"
],
"responseStreamingSupported": true,
"customizationsSupported": [],
"inferenceTypesSupported": [
"INFERENCE_PROFILE"
],
"modelLifecycle": {
"status": "ACTIVE",
"startOfLifeTime": "2026-08-27T16:00:00+00:00"
}
}
]
モデルID は moonshotai.kimi-k3 で、入力はテキストと画像、出力はテキストです。
inferenceTypesSupported は INFERENCE_PROFILE だけなので、呼び出す際は推論プロファイルの ID を指定する必要があります。
推論プロファイルは、グローバルの global.moonshotai.kimi-k3 と US 地域の us.moonshotai.kimi-k3 の2種類が用意されています。
list-inference-profiles で確認したところ、us-east-1 では両方、ap-northeast-1 では global. だけが返ってきました。
us. のルーティング先は us-east-1、us-east-2、us-west-2 です。
aws bedrock list-inference-profiles \
--region us-east-1 \
--query "inferenceProfileSummaries[?contains(inferenceProfileId,'kimi-k3')].[inferenceProfileId,description]"
# 出力例
[
[
"global.moonshotai.kimi-k3",
"Routes requests to Kimi K3 globally across all supported AWS Regions."
],
[
"us.moonshotai.kimi-k3",
"Routes requests to Kimi K3 in us-east-1, us-east-2, us-west-2."
]
]
2.2 Converse
まずは us-east-1 へ us.moonshotai.kimi-k3 を指定して Converse を実行してみました。
aws bedrock-runtime converse \
--region us-east-1 \
--model-id us.moonshotai.kimi-k3 \
--messages '[{"role":"user","content":[{"text":"Say ok"}]}]' \
--inference-config '{"maxTokens":512}'
# 出力例
{
"output": {
"message": {
"role": "assistant",
"content": [
{
"reasoningContent": {
"reasoningText": {
"text": "The user just said \"Say ok\". This is a very simple request. They want me to say \"ok\". There's nothing harmful about this, nothing complex. It's just a simple instruction.\n\nThe format should be minimal - just \"ok\" or \"OK\" would be appropriate. No need for lengthy explanation or anything else. The user asked me to say something specific, and I should just do it."
}
}
},
{
"text": "Ok"
}
]
}
},
"stopReason": "end_turn",
"usage": {
"inputTokens": 87,
"outputTokens": 97,
"totalTokens": 184,
"cacheReadInputTokens": 0,
"cacheWriteInputTokens": 0
},
"metrics": {
"latencyMs": 873
}
}
特にパラメータを指定しなくても推論(reasoning)が有効になっており、応答の content には reasoningContent と text の2つのブロックが入っていました。
出力された97トークンの大半は推論部分のトークンです。
試しに maxTokens を 64 に絞って実行してみたところ、推論だけで上限に達してしまい、stopReason が max_tokens になりました。
短い応答を期待する場合でも、maxTokens は推論の消費分を見越して大きめに設定しておくのが確実です。
ちなみに、プロファイル接頭辞を付けずに moonshotai.kimi-k3 をそのまま指定すると、次のように ValidationException が発生しました。
# 出力例
An error occurred (ValidationException) when calling the Converse operation: Invocation of model ID moonshotai.kimi-k3 with on-demand throughput isn’t supported. Retry your request with the ID or ARN of an inference profile that contains this model.
また、ap-northeast-1 に対して us.moonshotai.kimi-k3 を指定した場合も、The provided model identifier is invalid. という ValidationException になりました。
東京リージョンから呼び出す際に指定できるのは global. のみとなっています。
同じモデルID を指定して InvokeModel も試してみましたが、こちらも問題なく応答が得られました。
入力ボディに {"messages":[{"role":"user","content":"Say ok"}],"max_tokens":512} を渡した際の結果です。
# 出力例(reasoning_content は途中を省略)
{"choices":[{"finish_reason":"stop","index":0,"message":{"annotations":[],"content":"Ok","role":"assistant","refusal":null,"reasoning_content":"The user has just said \"Say ok\". ..."}}],"created":1789950731,"id":"chatcmpl-omohbqkp5p4qpfcw3rt4vcf6kr3pekhyyapb6weddehtodajjnaa","model":"us.moonshotai.kimi-k3","object":"chat.completion","service_tier":"default","usage":{"completion_tokens":141,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":125,"rejected_prediction_tokens":0},"prompt_tokens":87,"prompt_tokens_details":{"audio_tokens":0,"cache_write_tokens":0,"cached_tokens":0},"total_tokens":228},"system_fingerprint":null}
InvokeModel のレスポンスは Chat Completions 形式になっており、推論の内容は reasoning_content に含まれています。
なお、モデルカードには、Converse で過去ターンの推論内容を含めたままマルチターンのリクエストを送ると InternalServerException になるという既知の制限が記載されています。
LangChain や Strands Agents のデフォルト設定などが影響を受けるとされており、Converse よりも OpenAI 互換の Responses/Chat Completions API の利用が推奨されています。
Converse has known limitations with this model, including a failure (
InternalServerException) when reasoning content from earlier turns is included in a multi-turn request, which affects frameworks such as LangChain and Strands Agents in their default configurations, and rejection of attached document inputs such as PDF and HTML. To use Converse for multi-turn requests, remove reasoning blocks from prior turns.
引用元: モデルカード: Kimi K3 | Amazon Bedrock ユーザーガイド
ただ、私の環境で試した限りでは、1ターン目の reasoningContent を含めたまま2ターン目を送った場合も、取り除いて送った場合も、どちらもエラーにならず応答が返ってきました。
今回は「Say ok」に続けて「Say ok again」を送る2ターンのシンプルな会話しか試していません。
エージェントフレームワーク等から Converse 経由で呼び出す際は、この制限に引っかかるリスクを避けるためにも、OpenAI 互換 API を使うか、過去ターンの推論ブロックを除去してから送信する実装にしておくのが無難です。
検証に使ったスクリプト(クリックすると展開します)
~/kimi-k3-bedrock/converse_multiturn.py:
import boto3
from botocore.exceptions import ClientError
MODEL_ID = "us.moonshotai.kimi-k3"
client = boto3.client("bedrock-runtime", region_name="us-east-1")
messages = [{"role": "user", "content": [{"text": "Say ok"}]}]
first = client.converse(modelId=MODEL_ID, messages=messages, inferenceConfig={"maxTokens": 512})
assistant = first["output"]["message"]
print("1st turn block types:", [list(b.keys())[0] for b in assistant["content"]])
def second_turn(label, assistant_message):
try:
resp = client.converse(
modelId=MODEL_ID,
messages=messages + [assistant_message, {"role": "user", "content": [{"text": "Say ok again"}]}],
inferenceConfig={"maxTokens": 512},
)
text = [b["text"] for b in resp["output"]["message"]["content"] if "text" in b]
print(f"{label}: OK {text}")
except ClientError as e:
print(f"{label}: {e.response['Error']['Code']} - {e.response['Error']['Message']}")
# reasoningContent を含めたまま 2 ターン目を送る
second_turn("with reasoning", assistant)
# reasoningContent を取り除いて 2 ターン目を送る
stripped = {"role": "assistant", "content": [b for b in assistant["content"] if "reasoningContent" not in b]}
second_turn("without reasoning", stripped)
uv run --python 3.12 --with boto3 python ~/kimi-k3-bedrock/converse_multiturn.py
# 出力例
1st turn block types: ['reasoningContent', 'text']
with reasoning: OK ['Ok']
without reasoning: OK ['Ok']
2.3 OpenAI 互換パス
続いて、bedrock-runtime の OpenAI 互換エンドポイントへ Responses API 形式のボディを投げてみました。
~/kimi-k3-bedrock/responses-body.json:
{"model":"us.moonshotai.kimi-k3","input":"Say ok","store":false}
認証には AWS CLI と同じ一時認証情報を環境変数から渡し、curl の SigV4 署名オプションを付けて実行しています。
curl --silent --show-error \
--aws-sigv4 'aws:amz:us-east-1:bedrock' \
--user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \
-H "x-amz-security-token: $AWS_SESSION_TOKEN" \
-H 'Content-Type: application/json' \
--data-binary @$HOME/kimi-k3-bedrock/responses-body.json \
https://bedrock-runtime.us-east-1.amazonaws.com/openai/v1/responses
HTTP ステータス 200 で正常に応答が返ってきました。
レスポンスの model は us.moonshotai.kimi-k3、status は completed となり、output には reasoning と message の2つが入って出力テキストは Ok でした。
usage の抜粋は次のとおりです。
# 出力例(usage の抜粋)
{
"input_tokens": 87,
"input_tokens_details": {
"cache_write_tokens": 0,
"cached_tokens": 0
},
"output_tokens": 120,
"output_tokens_details": {
"reasoning_tokens": 104
},
"total_tokens": 207
}
レスポンス内の reasoning は {"summary": null, "effort": "max", "context": "all_turns"} となっていました。
リクエスト側で推論の強度を指定しない場合、デフォルトでは max で動作するようです。
Moonshot AI の API ドキュメントでも、reasoning_effort に指定できるのは "low" / "high" / "max" で、デフォルトは "max" とされています。
引用元: Quickstart | Kimi API Platform
また、/openai/v1/chat/completions に対して同じモデルID でリクエストを送った場合も、ステータス 200 で成功しました。
リクエストボディは {"model":"us.moonshotai.kimi-k3","messages":[{"role":"user","content":"Say ok"}],"max_completion_tokens":512} です。
finish_reason は stop、応答テキストは Ok、usage は prompt_tokens 87 / completion_tokens 69(うち reasoning_tokens 53)/ total_tokens 156 という結果でした。
なお、モデルカード上でも Kimi K3 には Chat Completions API の利用が推奨されています。
Whenever possible, we recommend using the
bedrock-runtimeendpoint for new applications. For Kimi K3, we recommend using the Chat Completions API. See Endpoints supported by Amazon Bedrock for details.
引用元: モデルカード: Kimi K3 | Amazon Bedrock ユーザーガイド
2.4 IAM ロールの環境変数で OpenAI SDK から呼ぶ
公式のサンプルコードでは、OpenAI SDK に Bedrock API キーや aws-bedrock-token-generator で生成した一時トークンを渡す手順が紹介されています。
今回は、IAM ロールから取得した一時認証情報を環境変数に置いた状態で、OpenAI SDK が送信する HTTP リクエストに SigV4 署名を付与する形を試してみました。
エンドポイントの仕様によれば、bedrock-runtime と bedrock-mantle のどちらも SigV4 認証に対応しています。
bedrock-runtime の OpenAI 互換 API を実行する IAM プリンシパルには、推論プロファイルに対する bedrock:InvokeModel 権限が必要です。
Responses API ではデフォルトプロジェクトへのアクセス、ストリーミングを行う場合は bedrock:InvokeModelWithResponseStream の権限もあわせて必要になります。
~/kimi-k3-bedrock/sigv4_openai.py:
import os
import httpx
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
from botocore.credentials import Credentials
from openai import OpenAI
REGION = "us-east-1"
SIGNING_SERVICE = "bedrock"
credentials = Credentials(
os.environ["AWS_ACCESS_KEY_ID"],
os.environ["AWS_SECRET_ACCESS_KEY"],
os.environ.get("AWS_SESSION_TOKEN"),
)
class SigV4Signer(httpx.Auth):
"""OpenAI SDK が送る HTTP リクエストに SigV4 署名を付ける"""
requires_request_body = True
def auth_flow(self, request):
aws_request = AWSRequest(
method=request.method,
url=str(request.url),
data=request.content,
headers={"content-type": request.headers.get("content-type", "application/json")},
)
SigV4Auth(credentials, SIGNING_SERVICE, REGION).add_auth(aws_request)
for key, value in aws_request.headers.items():
request.headers[key] = value
yield request
client = OpenAI(
api_key="unused-sigv4",
base_url=f"https://bedrock-runtime.{REGION}.amazonaws.com/openai/v1",
http_client=httpx.Client(auth=SigV4Signer(), timeout=300.0),
)
~/kimi-k3-bedrock/chat_completions.py:
import json
from sigv4_openai import client
MODEL_ID = "us.moonshotai.kimi-k3"
response = client.chat.completions.create(
model=MODEL_ID,
messages=[{"role": "user", "content": "Can you explain the features of Amazon Bedrock?"}],
)
print("=== content ===")
print(response.choices[0].message.content)
print("=== usage ===")
print(json.dumps(response.usage.model_dump(), indent=2))
uv を使って依存ライブラリを解決しながらスクリプトを実行しました。
cd ~/kimi-k3-bedrock
uv run --python 3.12 --with openai --with botocore --with httpx python chat_completions.py
実行すると、Bedrock の機能を10項目に整理して解説するテキストが返ってきました。
usage の内訳は、入力 95、出力 2,240(うち reasoning 1,577)、合計 2,335 トークンです。
出力トークンの約7割を推論が占めており、この推論部分も出力単価で課金される点には留意が必要です。
# 出力例(抜粋)
=== content ===
# Amazon Bedrock Overview
Amazon Bedrock is a fully managed AWS service for building generative AI applications. It provides access to foundation models (FMs) from multiple providers through a single, unified API—without requiring you to manage any infrastructure.
## Key Features
### 1. Broad Model Selection
...
=== usage ===
{
"completion_tokens": 2240,
"prompt_tokens": 95,
"total_tokens": 2335,
"completion_tokens_details": {
"accepted_prediction_tokens": 0,
"audio_tokens": 0,
"reasoning_tokens": 1577,
"rejected_prediction_tokens": 0,
"text_tokens": null
},
...
}
2.5 明示的なプロンプトキャッシュ
Kimi K3 では暗黙的なプロンプトキャッシュがデフォルトで動作しますが、キャッシュさせる範囲を明示的に指定する機能も備わっています。
モデルカードの記述によると、この明示的キャッシュに対応しているのは Responses と Chat Completions API のみで、チェックポイントあたりの最小トークン数は 1,024、保持期間は最低30分とされています。
ローンチブログの例にならい、prompt_cache_options で明示モードを設定し、システムプロンプトの末尾に prompt_cache_breakpoint を配置してみました。
先ほど作成した sigv4_openai.py を経由し、同一のシステムプロンプトに対して質問だけを変えて2回リクエストを投げてみます。
~/kimi-k3-bedrock/prompt_caching.py:
import json
import time
from sigv4_openai import client
MODEL_ID = "us.moonshotai.kimi-k3"
# キャッシュ対象にする 1,024 トークン以上の固定プロンプト
SYSTEM_PROMPT = "You are a support agent for the fictional service 'Kumo Notes'.\n" + "\n".join(
f"Rule {i}: When a customer asks about topic {i}, answer politely in one sentence and cite rule {i}."
for i in range(1, 121)
)
def ask(question):
start = time.time()
resp = client.responses.create(
model=MODEL_ID,
store=False,
extra_body={"prompt_cache_options": {"mode": "explicit"}},
input=[
{
"type": "message",
"role": "system",
"content": [
{
"type": "input_text",
"text": SYSTEM_PROMPT,
"prompt_cache_breakpoint": {"mode": "explicit"},
}
],
},
{
"type": "message",
"role": "user",
"content": [{"type": "input_text", "text": question}],
},
],
)
print(f"--- {question} ({time.time() - start:.2f}s)")
print(resp.output_text)
print(json.dumps(resp.usage.model_dump(), indent=2))
ask("Tell me about topic 7.")
ask("Tell me about topic 42.")
cd ~/kimi-k3-bedrock
uv run --python 3.12 --with openai --with botocore --with httpx python prompt_caching.py
# 出力例
--- Tell me about topic 7. (2.53s)
Thank you for asking about topic 7 — Kumo Notes is happy to help, and we're glad to assist you with any related questions, as per Rule 7.
{
"input_tokens": 2997,
"input_tokens_details": {
"cache_write_tokens": 2972,
"cached_tokens": 0
},
"output_tokens": 212,
"output_tokens_details": {
"reasoning_tokens": 163
},
"total_tokens": 3209
}
--- Tell me about topic 42. (3.70s)
Thank you for asking about topic 42 — I'm happy to help with any specific questions you have about it, as provided under rule 42.
{
"input_tokens": 2997,
"input_tokens_details": {
"cache_write_tokens": 0,
"cached_tokens": 2972
},
"output_tokens": 507,
"output_tokens_details": {
"reasoning_tokens": 463
},
"total_tokens": 3504
}
1回目のリクエストでは入力 2,997 トークンのうち 2,972 トークンがキャッシュに書き込まれ(cache_write_tokens)、2回目は同じ 2,972 トークンがキャッシュから読み取られている(cached_tokens)ことが確認できます。
キャッシュ読み取り時の単価は通常の入力単価の10分の1なので、長文のシステムプロンプトや大量のツール定義を繰り返し送信するエージェント構成では、入力コストを大幅に抑えられそうです。
なお、レスポンスタイム自体は2回目のほうが長くなっていますが、これは2回目の推論トークン数が 463 と1回目(163 トークン)の約3倍出ているためで、今回の簡易計測だけではキャッシュによる応答速度への恩恵までは判断できませんでした。
2.6 Mantle
続いて bedrock-mantle からの呼び出しも試してみましたが、こちらは利用できませんでした。
us-west-2 と us-east-1 の OpenAI 互換 Responses API に対して moonshotai.kimi-k3 を指定したところ、どちらも HTTP 404 が返ってきました。
curl --silent --show-error \
--aws-sigv4 'aws:amz:us-east-1:bedrock-mantle' \
--user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \
-H "x-amz-security-token: $AWS_SESSION_TOKEN" \
-H 'Content-Type: application/json' \
--data-binary '{"model":"moonshotai.kimi-k3","input":"Say ok","store":false}' \
https://bedrock-mantle.us-east-1.api.aws/v1/responses
# 出力例
{"error":{"code":"not_found_error","message":"The model 'moonshotai.kimi-k3' does not exist","param":null,"type":"invalid_request_error"}}
モデル指定を us.moonshotai.kimi-k3 に変えてみても同様に 404 となりました。
/v1/models で利用可能なモデル一覧を確認してみると、Moonshot AI 提供のモデルは moonshotai.kimi-k2.5 と moonshotai.kimi-k2-thinking の2つのみで、Kimi K3 はラインナップに入っていません。
モデルカードの Programmatic Access 一覧を見ても、記載があるのは bedrock-runtime のみとなっています。
Kimi K2.5 や Kimi K2 Thinking は Mantle 経由でも叩けますが、Kimi K3 を使う場合は bedrock-runtime を向ける必要があります。
3. 料金
Bedrock 側の価格はモデルカード、プロバイダー直販の価格は Kimi API の料金ページで確認できます。
Standard ティアにおける 1M トークンあたりの料金をまとめました。
円は1ドル=150円で換算しています。
| 呼び出し方 | 入力 | 出力 | キャッシュ読み取り | キャッシュ書き込み |
|---|---|---|---|---|
| Bedrock(Global) | $3.00(約450円) | $15.00(約2,250円) | $0.30(約45円) | $3.75(約563円、30分) |
| Bedrock(US) | $3.30(約495円) | $16.50(約2,475円) | $0.33(約50円) | $4.125(約619円、30分) |
| Moonshot AI 直販 | $3.00(約450円) | $15.00(約2,250円) | $0.30(約45円) | $3.00(約450円、5分)/ $6.00(約900円、1時間) |
Bedrock のグローバル推論プロファイル(クロスリージョン推論)を利用する場合、入力・出力・キャッシュ読み取りの単価は Moonshot AI 直販と同一に設定されています。
US 地域プロファイル(us.)を選ぶと、グローバルと比べて約10%割高になります。
また、Bedrock では Standard ティアに加えて Priority と Flex という2つのサービスティアも選択可能です。
Priority は Standard の1.75倍、Flex は0.5倍の料金設定となっています。
ただし、サービスティアを指定できるのは Responses API と Chat Completions API だけで、Converse や InvokeModel から呼ぶ場合は Standard 固定となる点には注意してください。
4. まとめ
Moonshot AI の Kimi K3 が Amazon Bedrock で使えるようになりました。
Kimi K2.5 などは bedrock-mantle からも利用できましたが、Kimi K3 については bedrock-runtime のみでの提供となっており、Converse/InvokeModel/Chat Completions/Responses の4つの API から呼び出しが可能です。
既存の OpenAI SDK を使ったコードからも、base_url、モデルID、認証方式の3点を Bedrock 向けに差し替えるだけでそのまま動かせます。
実際に動かしてみた感触として、実装時の使い分けは次の手順を意識すると良さそうです。
-
新規でコードを書くなら Chat Completions API を選ぶ(公式推奨であり、明示的プロンプトキャッシュやサービスティアの恩恵も受けられる)
-
既存の Converse コードから流用する場合は、マルチターン時に過去ターンの推論ブロック(
reasoningContent)を除去してリクエストを組む
デフォルトで推論がフル稼働(effort: max)するため、短い指示文であっても出力トークンが膨らみやすい傾向があります。
今後、推論プロファイルが日本にも拡大されることを楽しみに待ちたいと思います。





