Next.js Edge RuntimeでGemini APIが「stream」エラーで落ちる原因と解決策

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で実装EdgeEdge環境のパフォーマンスを維持

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による直接実装を選択しましょう。

タイトルとURLをコピーしました