GEMINI LABEN
ROBOTICS — 8月31日に停止した ER 1.6 preview には後継があります。Gemini Robotics ER 2 が公開プレビュー中で、通常版とストリーミング版の2種類が提供されていますVIDEO — ER 2 の成功・失敗判定は静止画ではなく生の映像フィード上で動きます。こぼれ・滑り・位置ずれのような、実行の途中で起きる失敗を捉えられる設計ですDEADLINE — 次の期限は9月30日、gemini-omni-flash-preview の廃止です。移行先は8月27日に GA になった gemini-omni-1.1-flash で、残り4週間を切りましたAPIKEY — 残りの標準 API キーは、制限付きのものも含めて9月中に全面停止します。移行先は Google Cloud サービスアカウントに紐付く auth キー形式ですPRICE — Gemini 3.7 Flash の導入価格 $0.75/$3.75 per 1M は12月31日までです。2027年1月1日から $1.50/$7.50 になるため、年を跨ぐ見積もりは2本立てが要りますAUDIO — Gemini 3.5 Transcribe は85言語以上の言語検出、話者ダイアライゼーション、単語単位タイムスタンプ、最大1,000語のカスタム語彙バイアスに対応していますROBOTICS — 8月31日に停止した ER 1.6 preview には後継があります。Gemini Robotics ER 2 が公開プレビュー中で、通常版とストリーミング版の2種類が提供されていますVIDEO — ER 2 の成功・失敗判定は静止画ではなく生の映像フィード上で動きます。こぼれ・滑り・位置ずれのような、実行の途中で起きる失敗を捉えられる設計ですDEADLINE — 次の期限は9月30日、gemini-omni-flash-preview の廃止です。移行先は8月27日に GA になった gemini-omni-1.1-flash で、残り4週間を切りましたAPIKEY — 残りの標準 API キーは、制限付きのものも含めて9月中に全面停止します。移行先は Google Cloud サービスアカウントに紐付く auth キー形式ですPRICE — Gemini 3.7 Flash の導入価格 $0.75/$3.75 per 1M は12月31日までです。2027年1月1日から $1.50/$7.50 になるため、年を跨ぐ見積もりは2本立てが要りますAUDIO — Gemini 3.5 Transcribe は85言語以上の言語検出、話者ダイアライゼーション、単語単位タイムスタンプ、最大1,000語のカスタム語彙バイアスに対応しています
記事一覧/API / SDK
API / SDK/2026-05-03上級

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

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

gemini110gemini-api285drizzle-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/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

API / SDK2026-06-20
Gemini API × tRPC v11 × Prisma でつくる型安全 AI バックエンド — リアルタイムストリーミングからミドルウェア認証・本番運用まで
tRPC v11 の subscription で Gemini API ストリーミングをリアルタイム配信し、Prisma で型安全に会話を永続化する本番設計を解説します。ミドルウェア認証・レート制限・落とし穴対策まで実コード付きでまとめました。
API / SDK2026-08-23
アプリに載せる AI 機能を、実行時呼び出しから配布前の一括処理に寄せました
アプリに Gemini を組み込むとき、実行時に呼ぶか配布前に呼び終えるかで呼び出し回数の増え方が変わります。素材数に比例させる設計へ切り替えた判断基準と、冪等な一括処理の実装をまとめました。
API / SDK2026-08-22
メディエーショングループが20を超えたとき、設定の抜けをどう見つけるか
広告メディエーションのグループが増えると、設定の抜けや型のずれが静かに溜まります。設定を1枚の表に正規化して機械でずれを確定させ、判断が必要なセルだけを Gemini に渡す分担にした手順をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →