Amplify AI Kitの使い方|対応モデル・料金・conversation/generationの違い
Amplify AI Kitは、AWS Amplify Gen 2のデータスキーマに数行を書き足すだけで、Amazon Bedrockのモデルを呼ぶチャットや構造化データ生成をアプリに組み込める生成AI向けの機能です。2024年11月に公開され、会話履歴の保存とストリーミング配信、認可の適用までをAmplify側が受け持ちます。一方で、認可戦略や返り値の型には明確な制約があり、要件によっては素直にBedrockのAPIを直接叩いたほうが早い場面もあります。この記事では公式ドキュメントの記述に沿って、実際の設定コード、対応モデル、料金の内訳、そして採用を見送るべき条件までを整理します。
まとめ
最初に押さえるべきは認可の制約です。a.conversation(ストリーミング型の多ターン対話)はオーナーベース認可のみ、a.generation(構造化データを1往復で返す)はオーナーベース以外の認可のみと、選べる戦略が排他になっています。この一点で、未ログインユーザー向けのチャットは設計段階から除外されます。
残りの要点は4つです。使えるルートはconversationとgenerationの2種類だけで、それ以外の用途は対象外です。Claude 4.6 Sonnet/Opusを含むAnthropicモデルは両ルートで使えますが、Amazon NovaやLlama、Mistralはconversation専用です。AI Kit自体に固有の料金はなく、実費はBedrockのトークン課金を軸に、conversationではAppSync・Lambda・DynamoDBが加わります。そしてAI KitはGen 2専用機能で、Gen 1(Amplify CLI・Amplify Studio)は2026年5月1日にメンテナンスモードへ入り2027年5月1日にサポートが終了します。以下、それぞれの根拠と設定手順を見ていきます。
Amplify AI Kitの2つのルートと使い分けの基準
Amplify AI Kitで定義できるのは、会話用のa.conversationと生成用のa.generationの2つです。どちらもデータスキーマ(amplify/data/resource.ts)に書き、リクエストの認可とルーティングはAppSyncが担います。ただし作られるインフラは同じではありません。公式のアーキテクチャ解説によれば、DynamoDBは「storing conversation history」、Lambdaは「execution for conversations」と用途が明記されており、この2つはconversationルートにのみ作られます。generationルートはBedrockを呼ぶAppSyncのQueryとして実装され、Lambdaも会話テーブルも介しません。
ストリーミング配信の多ターン対話を担うconversationルート
公式ドキュメントはconversationルートを「a streaming, multi-turn API」(アーキテクチャ解説では「an asynchronous, multi-turn API」)と説明しています。対話の往復を前提としたAPIで、スキーマに1つ定義するとConversationとMessageの2つのデータモデルが生成され、会話とメッセージはDynamoDBへ自動保存されます。ユーザーが画面を閉じても、次回ログイン時に過去の会話を続きから再開できるのはこの保存があるためです。応答はAppSyncのサブスクリプション(.onStreamEvent())経由でトークン単位に流れてくるので、生成完了を待たずに画面へ描画できます。後述の<AIConversation>コンポーネントを使う場合、このサブスクリプションはコンポーネント側が処理します。
会話は特定のアプリケーションユーザーに紐づく設計で、認可はallow.owner()のみが対応します。他人の会話履歴を読めない構造が言語仕様として強制されている、と理解しておくと設計判断がぶれません。
構造化データを一度で返すgenerationルート
generationルートは公式ドキュメントが「A single synchronous request-response API」と定義するとおり、1回のリクエストに1回の応答を返す同期APIです。返り値の型はスキーマ側で宣言します。レシピ生成、レビュー要約、フォーム入力の自動補完のように「決まった形のJSONが欲しい」用途向けです。
公式が「Limitations」として挙げる制約は2件です。返り値にa.ref('Post')のような既存モデル参照は使えず、a.customType()で型を書き下す必要があります。もう1件は必須フィールドの型制限で、AWSEmail、AWSDate、AWSTime、AWSDateTime、AWSTimestamp、AWSPhone、AWSURL、AWSIPAddressの8つのスカラー型は必須にできません。これとは別に、同期APIである以上ストリーミングは行われず、生成が終わるまで応答は返りません。長文をgenerationルートで作らせると、ユーザーは無反応の画面を数秒から数十秒待つことになります。inferenceConfigurationでmaxTokens、temperature、topPは調整できます。
Gen 2バックエンドからチャット画面までのセットアップ
手順はバックエンド定義、Bedrock側の準備、フロントエンド接続の3段階に分かれます。Gen 1のAmplify CLIやAmplify Studioを使う手順ではない点に注意してください。Amplifyプロジェクト自体の初期化やCI/CDの設定はAWS Amplify Gen 2の使い方:ampxで初期化からCI/CDまで【2026年版】で扱っています。
パッケージ導入とデータスキーマの定義
フロントエンドに必要なパッケージは3つです。
npm add aws-amplify @aws-amplify/ui-react @aws-amplify/ui-react-ai
バックエンドはデータスキーマへの追記だけで完結します。conversationとgenerationを1つずつ定義した例が次の形です。
// amplify/data/resource.ts
import { type ClientSchema, a, defineData } from '@aws-amplify/backend';
const schema = a.schema({
chat: a.conversation({
aiModel: a.ai.model('Claude 3.5 Haiku'),
systemPrompt: 'You are a helpful assistant',
})
.authorization((allow) => allow.owner()),
generateRecipe: a.generation({
aiModel: a.ai.model('Claude 3.5 Haiku'),
systemPrompt: 'You are a helpful assistant that generates recipes.',
})
.arguments({
description: a.string(),
})
.returns(
a.customType({
name: a.string(),
ingredients: a.string().array(),
instructions: a.string(),
})
)
.authorization((allow) => allow.authenticated()),
});
ローカル検証はnpx ampx sandboxで個人用のクラウド環境を立ち上げて行います。conversationルートはログイン済みユーザーを前提とするため、認証(Cognito)を先に有効化しておかないと動作確認まで進めません。
Bedrockのモデルアクセス申請とリージョン確認
スキーマを書いてもそれだけでは呼び出せません。公式ドキュメントは「Before you can invoke a foundation model on Bedrock you will need to request access to the models in the AWS console」と明記しており、Bedrockコンソールでのモデルアクセス申請が前提です。加えて、アプリをデプロイするリージョンで、そのモデルが提供されている必要があります。東京リージョンで未提供のモデルを指定して権限エラーになるときは、この2点のどちらかが原因です。Bedrock側の初期設定手順はAmazon Bedrockの使い方|料金・モデル・APIの始め方を4ステップで解説【2026年版】に分解してあります。
フロントエンド接続とAIConversationコンポーネント
UIはAmplify UIのReactコンポーネントを使うと、チャット画面の実装がフック1つ分に縮みます。createAIHooksにデータクライアントを渡してフックを生成し、ルート名を指定して呼び出す形です。
import { generateClient } from 'aws-amplify/data';
import { AIConversation, createAIHooks } from '@aws-amplify/ui-react-ai';
import type { Schema } from '../amplify/data/resource';
const client = generateClient<Schema>({ authMode: 'userPool' });
const { useAIConversation } = createAIHooks(client);
const [
{ data: { messages }, isLoading },
handleSendMessage,
] = useAIConversation('chat');
クライアント生成時のauthMode指定を省くと、既定の認可モードで呼び出されて権限エラーになります。conversationルートがオーナーベース認可しか受け付けない以上、userPoolの明示とログイン済み状態(<Authenticator>でのラップ)はセットです。
<AIConversation>にはmessages、isLoading、handleSendMessageを渡します。表示のカスタマイズ用にavatars(アイコンと表示名)、welcomeMessage(初回表示)、messageRenderer(Markdown描画などの差し替え)が用意され、allowAttachmentsを付けると画像添付が有効になります。送信できる画像形式はpng、gif、jpeg、webpの4種で、1つのメッセージ内でテキストと画像を混在させられます。
差別化しやすいのがresponseComponentsです。自作のReactコンポーネントと引数の型を登録しておくと、モデルが応答の一部としてそのコンポーネントを呼び出せます。天気カードや商品カードを、テキストではなくUI部品としてチャット内に描画する、いわゆる生成UIを標準機能の範囲で実装できます。
対応モデルの選定基準
指定方法は2通りあります。a.ai.model("Claude 3.5 Haiku")のようなフレンドリー名か、まだ名前が登録されていない新しいモデルを使う場合は{ resourcePath: 'meta.llama3-1-405b-instruct-v1:0' }のようにBedrockのモデルIDを直接書く形です。conversationとgenerationで使えるモデルは揃っていません。
| プロバイダー | モデル例 | conversation | generation |
|---|---|---|---|
| Anthropic | Claude 4.6 Sonnet / 4.6 Opus / 4.5 系 | 可 | 可 |
| Anthropic | Claude 3.5 Sonnet v2 / 3.5 Haiku / 3 Opus | 可 | 可 |
| Amazon | Nova Pro / Lite / Micro | 可 | 不可 |
| Meta | Llama 3.1 | 可 | 不可 |
| Mistral AI | Large / Large 2 | 可 | 不可 |
| Cohere | Command R / R+ | 可 | 不可 |
| AI21 Labs | Jurassic-2 Large / Mini | 可 | 不可 |
構造化生成を含むアプリなら選択肢はAnthropic系に絞られます。会話だけならNova Microのような低価格モデルでコストを抑える判断が成り立ちます。Claude 4.5系と4.6系はBedrockのグローバル推論プロファイルを使い、リージョンをまたいで自動的に振り分けられるため、単一リージョンのモデル提供状況に縛られません。裏を返せば、処理するリージョンを国内に固定したいデータレジデンシー要件がある案件では、この2世代は選べないということです。ツール連携を使う場合は、そのモデルがBedrock Converse APIのツール利用に対応している必要もあります。
Amplifyの対応表とBedrockのライフサイクルのずれ
上の表はAmplify側の対応状況で、Bedrock側でそのモデルが今も使えるかは別問題です。Bedrockのモデルライフサイクルでは、Legacyになったモデルは新規顧客が利用できず、既存顧客も15日間使わなければアクセスを失います。実際、Claude 3.5 Sonnet v2はap-northeast-1(東京)を含むリージョンで2026年1月30日にLegacy入りし、EOLは2026年7月30日です。Cohere Command RとCommand R+も2026年8月19日にEOLを迎えます。Amplifyのドキュメントに名前が残っていても、指定した瞬間にモデルアクセス申請ができないケースがあるということです。モデルを決める前に、Bedrockのモデルライフサイクル表で状態とEOL日を確認してください。
アプリのデータを参照させるツール連携の3種類
モデルに自社データを答えさせる手段がtoolsです。データモデルを直接参照するa.ai.dataTool()、スキーマに定義したカスタムクエリを指すクエリツール、会話ハンドラのLambda内で実行されるLambdaツールの3種類があります。
chat: a.conversation({
aiModel: a.ai.model('Claude 3.5 Haiku'),
systemPrompt: 'Hello, world!',
tools: [
a.ai.dataTool({
name: 'PostQuery',
description: 'Searches for Post records',
model: a.ref('Post'),
modelOperation: 'list',
}),
],
})
設計上の肝は権限境界です。公式ドキュメントは「Through tools, the LLM can only access data that the application user has access to」と述べており、ツールはリクエスト元ユーザーのIDで実行されます。オーナーベースのモデルなら、そのユーザーが所有するレコードしか返りません。RAGのために別途ベクトルDBと権限フィルタを組む前に、既存のデータモデルとauthルールをそのまま検索対象にできるかを検討する価値があります。モデルツールに設定できる認可はowner()、ownerDefinedIn()、ownersDefinedIn()、authenticated()、group()、groupsDefinedIn()の6種、カスタムクエリツールはallow.authenticated()が必須です。
料金の内訳と見積もりの考え方
Amplifyの料金ページにAI Kitという課金項目は存在しません。ドキュメントも「There is no Amplify markup, you are just using AWS resources in your own account」と明言しています。実際の請求は使うルートによって分かれます。
| 発生元 | 課金対象 | conversation | generation |
|---|---|---|---|
| Amazon Bedrock | 入出力トークン | あり | あり |
| AWS AppSync | クエリ・リアルタイム接続 | あり | クエリのみ |
| AWS Lambda | 実行時間 | あり | なし |
| Amazon DynamoDB | 読み書き・保存 | あり | なし |
generationルートはAppSyncのQueryとして動くため、Lambda実行時間も会話履歴の保存料金も発生しません。逆にconversationルートで読み違えやすいのがLambdaです。会話ハンドラはモデルの応答が返るまで動き続けるため、生成が遅いモデルほど実行時間が伸び、トークン課金と実行時間課金が同時に膨らみます。会話履歴を毎回丸ごと送る設計なら、往復のたびに入力トークンが積み上がる点も見積もりに入れてください。
Amplify自体の課金はフロントエンド側で、2026年7月時点の公開値は次のとおりです。ビルドはStandardインスタンスで0.01USD/分(Largeは0.025USD/分、XLargeは0.10USD/分)で1000分/月まで無料。CDNストレージは0.023USD/GB/月で5GB/月まで無料。アウトバウンド転送は0.15USD/GBで15GB/月まで無料。SSRはリクエストが100万件あたり0.30USDで50万件/月まで無料、実行時間が0.20USD/GB-時間で100GB-時間/月まで無料です。価格は改定されるため、最新は公式の料金ページで確認してください。
コスト対策として先に効くのは、システムプロンプトの再送分をキャッシュさせる方法です。仕組みと対応モデルはAmazon Bedrockのプロンプトキャッシュとは|仕組み・対応モデル・料金・実装方法【2026年最新】にまとめています。ホスティング側の費用感はAWS Amplify Hostingとは?料金・特徴とS3+CloudFront/App Runnerとの違いが詳しいです。
Amplify AI Kitを採用すべきでない場面
最初に切り分けるべきは、未ログインの訪問者に使わせる公開チャットボットです。conversationルートはオーナーベース認可しか受け付けないため、匿名ユーザーのチャットは構造的に作れません。generationルートはallow.guest()やallow.publicApiKey()を選べますが、こちらは1往復のみで会話履歴を持ちません。公開LP上の問い合わせボットを作りたいなら、AI Kitではなく自前のAPI経由でBedrockを呼ぶ構成が素直です。
次に、モデルの応答を細かく制御したいケースです。ガードレールの適用、独自のリトライ、複数モデルのフォールバック、トークン使用量のログ収集といった要件は、Amplifyが隠蔽している層をこじ開ける作業になります。この場合はBedrockのAPIを直接扱うほうが見通しが良く、実装例はAmazon Bedrock Converse APIの使い方|boto3実装・ConverseStream・Tool Use・IAM権限【2026年最新】で解説しています。
バックエンドがAmplify以外で完成しているプロジェクトも見送り候補です。AI KitはAmplify Gen 2のデータスタック(AppSync+DynamoDB+Cognito)とセットで動くため、既存のAPI基盤があるところに部分導入する旨味は小さくなります。逆に、Amplify Gen 2でフロントエンドとバックエンドを一体運用していて、ログイン済みユーザー向けの対話機能を足したい、という条件が揃うときにAI Kitは最短ルートになります。
Amplify Gen 1のEOLとAI Kitの関係
2024年以前に書かれたAmplifyの記事には、Amplify CLIでプロジェクトを初期化しAmplify StudioでAPIを設定する、という手順が数多く残っています。それらはGen 1の手順で、AI Kitでは使えません。AI KitはGen 2のTypeScriptベースのバックエンド定義を前提に設計されており、CLIコマンド体系もamplifyからampxへ変わっています。
移行の期限も決まりました。Gen 1は2026年5月1日にメンテナンスモードへ入り、以降は重大なバグ修正とセキュリティパッチのみの提供になります。サポート終了は2027年5月1日です。Gen 1で運用中のアプリに生成AI機能を足したい場合、AI Kitを使うには先にGen 2への移行が必要になるため、移行計画とAI機能の要件定義は同じタイミングで検討したほうが手戻りが減ります。
よくある質問
Q. Amplify AI Kitとは何ですか。
A. AWS Amplify Gen 2の機能で、データスキーマにルートを定義するだけでAmazon Bedrockのモデルを呼ぶ会話機能や構造化データ生成をアプリへ組み込めるものです。2024年11月に公開されました。会話履歴のDynamoDB保存、応答のストリーミング、認可の適用がセットで提供されます。
Q. conversationとgenerationはどちらを選ぶべきですか。
A. 対話の文脈を引き継ぐチャットならconversation、決まった形のJSONを1回返せば足りる要約や下書き生成ならgenerationです。認可要件でも決まります。ログイン必須ならconversation、未ログインでも使わせたいならgenerationしか選べません。
Q. Amplify AI Kitの利用に追加料金はかかりますか。
A. AI Kit固有の料金項目はありません。費用はBedrockのトークン課金に加え、conversationではAppSync、Lambda、DynamoDBに分かれて発生します。generationはAppSyncのQueryとして動くためLambdaとDynamoDBの費用は生じません。
Q. どのモデルが使えますか。
A. Anthropic(Claude 4.6 Sonnet/Opus、4.5系、3.5系など)、Amazon Nova、Meta Llama 3.1、Mistral Large、Cohere Command R、AI21 Jurassic-2が対応します。ただし構造化生成のgenerationルートで使えるのはAnthropic系のみです。利用前にBedrockコンソールでモデルアクセスの申請が必要で、Legacy状態のモデルは新規に使えない点にも注意してください。
Q. Amplify Gen 1(Amplify CLI・Amplify Studio)でもAI Kitを使えますか。
A. 使えません。AI KitはGen 2専用です。Gen 1は2026年5月1日にメンテナンスモードへ入り、2027年5月1日にサポートが終了するため、Gen 2への移行を前提に計画してください。
Q. ログインしていないユーザー向けのチャットは作れますか。
A. conversationルートではできません。オーナーベース認可のみに対応しているためです。1往復で完結してよいならgenerationルートをallow.guest()やallow.publicApiKey()で公開する方法がありますが、会話履歴は保持されません。