Next.jsのApp RouterでGemini APIを実装していたところ、パフォーマンス向上のためにEdge Runtime(Vercel Edge Functions等)を選択したタイミングでビルドエラーにハマったので備忘録として残します。
この記事でわかること
- Edge Runtimeでgoogle-generative-ai SDKがエラーになる理由
- Node.jsランタイムへの切り替え方法
- fetch APIを使用してEdge環境でGeminiを動かす実装例
[現象] ビルド時に「stream」モジュールが見つからずエラーになる
Next.jsで export const runtime = ‘edge’; を指定したRoute HandlerやServer Actionで Gemini API の SDK を使用すると、以下のようなエラーがコンソールに表示されます。
Error: The Edge Runtime does not support native Node.js modules: "stream".
If you have a use case for this, please file an issue.
[環境]
- Framework: Next.js (App Router)
- Library: @google/generative-ai
- Runtime: Edge Runtime
[原因] SDKがNode.js固有のモジュールに依存している
エラーの根本原因は、Googleの公式SDKである @google/generative-ai が内部でNode.js標準の stream モジュールやそのポリフィルに依存しているためです。
Vercel Edge RuntimeやCloudflare WorkersなどはWeb標準APIのみをサポートする軽量な環境であるため、Node.jsの標準ライブラリを必要とするSDKはそのままでは動作しないという制約があります。
[解決策] 2つのアプローチ
| 方法 | ランタイム | メリット |
|---|---|---|
| Node.jsランタイムを使用 | Node.js | 公式SDKをそのまま使える |
| Native fetch APIで実装 | Edge | Edge環境のパフォーマンスを維持 |
1. 該当箇所のランタイムをNode.js(デフォルト)に戻す
SDKの機能をフルに活用したい場合は、Edge Runtimeの使用を諦めてNode.js環境で動作させます。
// route.ts / action.ts から以下の行を削除またはコメントアウトします
// export const runtime = 'edge';
2. SDKを使わずfetch APIでREST APIを直接叩く
Edge Runtimeを維持したい場合は、SDKを介さずネイティブのfetch APIを使ってREST APIにPOSTリクエストを送ります。
// [Before]: SDKを使用(Edge不可)
// import { GoogleGenerativeAI } from '@google/generative-ai';
// [After]: Native fetchを使用(Edge可)
const response = await fetch(
`https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${process.env.GEMINI_API_KEY}`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
contents: [
{
parts: [{ text: prompt }]
}
]
})
}
);[まとめ]
Next.jsのEdge Runtime環境でGemini API(google-generative-ai)を使用すると、Node.js依存のモジュールが原因でエラーが発生します。SDKの利便性を取るならNode.jsランタイムを、環境のパフォーマンスを優先するならfetch APIによる直接実装を選択しましょう。

