GEMINI LABEN
NANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定ですNANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定です
記事一覧/API / SDK
API / SDK/2026-05-03上級

Gemini API × Drizzle ORM で型安全な AI チャットストアを構築する — マルチターン保存・スレッド分岐・ベクトル検索の本番設計

Gemini API のマルチターン会話を Drizzle ORM で型安全に保存・検索する本番設計を解説します。ストリーミング保存、スレッド分岐、Function Calling 履歴、pgvector 連携、マイグレーション戦略まで、実装で詰まりやすい論点を実コード付きでまとめました。

gemini102gemini-api279drizzle-ormpostgrestypescript15chat-store

プレミアム記事

「Gemini API でチャット機能をつくるのは簡単だけれど、その会話履歴を本番品質で保存しようとした瞬間に詰まる」— この感覚、覚えがある方は多いのではないでしょうか。私自身、個人開発の AI アプリで何度もこの壁にぶつかりました。最初は会話全体を JSON カラムに丸ごと突っ込むのですが、ユーザーが増えるとスキーマ変更で苦しくなり、メッセージの分岐管理を入れた途端に整合性が崩れ、最終的に書き直すことになるのです。一度経験すると分かるのですが、AI チャットのデータ層は普通の CRUD アプリのデータ層とは別物です。

ここでは、Gemini API のマルチターン会話を Drizzle ORM で型安全に保存・検索するための本番設計を、実装コードとともに整理していきます。チャット UI のフロントエンドではなく、その下にある「データ層」をどう設計するかが主題です。Gemini SDK の Content[] 型と Drizzle のスキーマ推論を結びつけ、ストリーミング応答の途中保存、スレッドの分岐管理、Function Calling 履歴の保存と再生、pgvector を使った会話の意味検索、運用コストの計測、そして本番で必ずぶつかる落とし穴の回避まで、自分のアプリに今日から組み込める粒度で扱います。

なぜ AI チャットのデータ層は通常の CRUD と違うのか

通常の CRUD アプリでは、レコードは「作成して、読んで、更新して、削除する」だけで済みます。ところが AI チャットの履歴には、いくつか特殊な性質があります。

まず メッセージは入れ子構造 です。Gemini API の Contentroleparts を持ち、parts には text だけでなく inlineData(画像)、functionCallfunctionResponse が混在します。これを「テキストカラムに連結する」設計にすると、画像や Function Calling が登場した瞬間に再設計が必要になります。

次に 会話は分岐します。ユーザーが「やっぱり前のメッセージから別の方向で生成し直したい」と言ったとき、過去のスレッドを書き換えるのではなく、その時点から新しい枝として保持したいケースが多いのです。Git のコミットツリーに近い構造が要ります。

そして ストリーミング応答は途中で切れます。本番ではネットワーク切断、レート制限、タイムアウトで応答が中断します。再接続できるように、生成途中の状態をどこまで保存しておくかを決めておく必要があります。

最後に 検索は意味で行いたい。「あのとき話した API の話、もう一度見たい」のような曖昧な要求に応えるには、テキスト一致ではなく埋め込みベクトルでの類似検索が必要になります。

これらを「あとで考える」と先送りにすると、必ず後で構造の作り直しが発生します。最初から設計に組み込んでおきたいところです。

これらの特殊性に共通しているのは、「会話というドメインの自然な構造を、リレーショナルなテーブルにどう落とし込むか」が設計の中心にあるという点です。私はかつて MongoDB で同じ問題を扱ったことがありますが、JSON 構造をそのまま持てる代わりにトランザクションや結合の柔軟性で苦労しました。Postgres + JSONB という組み合わせは、リレーショナルの強みと半構造化データの柔軟性をバランス良く取れるので、AI チャットのデータ層には特に向いていると感じています。Drizzle ORM はこの組み合わせを TypeScript の世界から無理なく扱える、現時点では数少ない選択肢の一つです。

なぜ Drizzle ORM か — Prisma ではなくこちらを選ぶ理由

私は個人開発のバックエンドで Prisma も Drizzle も両方使ってきました。Gemini API のような型構造が複雑な相手と組み合わせるなら、現時点では Drizzle のほうが扱いやすいというのが正直な感想です。

理由は3つあります。第一に、Drizzle はスキーマ定義から TypeScript の型を直接推論 します。InferSelectModel<typeof messages> のようにテーブルから型を取り出して、それをそのまま API ハンドラの戻り値に使えます。Gemini SDK も TypeScript で型がしっかり定義されているので、両者を結ぶのにキャスト地獄に陥らずに済みます。

第二に、Drizzle のクエリビルダは SQL に近い構文 で書けます。AI 関連のクエリは「ベクトル類似度で並べ替えつつ、ユーザー権限とスレッド可視性で絞り込み、最新 N 件だけ取得する」のような複雑なものが増えがちですが、Prisma の findMany で表現するより SQL 風に書いたほうが見通しが良いのです。

第三に、Drizzle は ランタイムが薄い。Cloudflare Workers や Vercel Edge Functions のような制約のある環境でも問題なく動きます。Gemini API は Edge から呼びたい場面が多いので、データ層も同じ環境で動かせるのは大きな利点です。

もちろん Prisma にも長所はあります。マイグレーションの自動生成、Studio によるデータ閲覧、Accelerate による接続プールなど、運用ツールが充実しています。チームで運用する規模なら Prisma を選ぶ判断も全く理にかなっています。今回は「個人〜小規模で AI 機能を素早く本番投入したい」というシナリオを前提に Drizzle で組み立てます。

実際の開発では、Drizzle のもう一つの利点として 「どのクエリが実行されるかが SQL レベルで予測しやすい」 ことが挙げられます。Prisma のようにクエリビルダの抽象度が高いと、本番でスローログを確認したときに「このコードがこの SQL になっていたのか」と驚くことがありました。Drizzle は select 句や join の対応関係がほぼそのまま SQL に落ちるので、パフォーマンスチューニングをするときに脳内モデルと実行計画がぴったり一致します。AI チャットのように「履歴 N 件を取りつつ、最新 M 件は別条件で集計する」のような複合クエリを書く場面では、この透明性が大きな安心感に繋がります。

私の場合、Drizzle に切り替えてから本番デプロイ前のクエリレビューが10分の1の時間で終わるようになりました。これは個人開発のように「自分以外にレビュアーがいない」状況では効果が大きく、見落としによる本番障害を減らせる地味だけれど効く改善です。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
Gemini API のマルチターン履歴をどう DB スキーマに落とすかで詰まっていた人が、parts 配列とロール構造をそのまま型安全に保存できる設計を入手できる
Drizzle ORM のスキーマ推論と Gemini SDK の型を結びつけ、API ハンドラから DB まで一切の any なしで AI チャットを実装できるようになる
本番でストリーミングが途中で切れた・スレッド分岐の整合性が崩れた・Function Calling 履歴の再生で型エラーが出た — こうした実運用の落とし穴を、再現できる手順で回避できる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API / SDK2026-06-20
Gemini API × tRPC v11 × Prisma でつくる型安全 AI バックエンド — リアルタイムストリーミングからミドルウェア認証・本番運用まで
tRPC v11 の subscription で Gemini API ストリーミングをリアルタイム配信し、Prisma で型安全に会話を永続化する本番設計を解説します。ミドルウェア認証・レート制限・落とし穴対策まで実コード付きでまとめました。
API / SDK2026-07-14
Gemini Code Execution の計算結果とモデルの文章がずれる — 実行結果だけを信頼する検証ゲートの実装
Gemini の Code Execution は実際に走らせた計算結果と、それを説明する自然文を別々に返します。文章側の数値を鵜呑みにすると幻覚を掴みます。実行結果だけを真実として抽出し照合する検証ゲートの実装を、動くコードで解説します。
API / SDK2026-07-13
responseSchema で $ref が使えず詰まったら — responseJsonSchema で再帰スキーマを本番で扱う
Gemini の responseSchema は OpenAPI サブセットで $ref/$defs が使えず、共有定義も再帰も表現できません。responseJsonSchema へ移行し、多言語フィールドの再利用とカテゴリ木の再帰を本番で扱う実装をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →