【すぐに使える!最新版】Gemini APIのサンプルコード

Gemini APIの使い方がドキュメントを見てもわかりづらいので、サンプルコードを作成しました。
Node.jsでWeb検索をストリーミング利用するサンプルです。
ぜひご活用ください!

事前準備

npm install @google/genai@latest

最新版のSDKをインストールします。

サンプルコード

/**
 * Google Gemini APIを使用した会話とWeb検索機能のサンプル
 */
import { GoogleGenAI } from "@google/genai";

/**
 * Gemini APIを使用してテキスト生成(オプションでWeb検索機能付き)を行う関数
 * ストリーミング形式で結果を処理する
 *
 * @param {string} apiKey - Gemini API Key
 * @param {string} message - ユーザーメッセージ
 * @param {string} modelName - モデル名(例: "gemini-2.5-pro-preview-05-06")
 * @param {string} instructions - システム指示(任意)
 * @param {boolean} enableWebSearch - Web検索を有効にするかどうか
 * @param {Function} onTextUpdate - テキスト更新時に呼び出されるコールバック関数
 * @param {Function} onComplete - 完了時に呼び出されるコールバック関数
 */
export async function sendMessageToGemini(
  apiKey,
  message,
  modelName,
  instructions = "",
  enableWebSearch = false,
  onTextUpdate,
  onComplete
) {
  // GoogleGenAIクライアントの初期化
  const ai = new GoogleGenAI({ apiKey });

  // リクエストのペイロードを作成(基本設定)
  const payload = {
    contents: [{ role: "user", parts: [{ text: message }] }],
    systemInstruction: instructions,
    config: {
      maxOutputTokens: 2048,
      temperature: 0.7,
      topP: 0.95,
    },
  };

  // Web検索が有効な場合、設定を追加
  if (enableWebSearch) {
    payload.config = {
      ...payload.config,
      tools: [{ googleSearch: {} }],
    };
  }

  try {
    // ストリームモードでコンテンツ生成を実行
    const stream = await ai.models.generateContentStream({
      model: modelName,
      ...payload,
    });

    // 結果格納用の変数
    let fullText = "";
    let groundingChunks = null;
    let webSearchQueries = null;

    // ストリームからの応答を処理
    for await (const chunk of stream) {
      // テキスト部分の処理
      if (chunk.text) {
        fullText += chunk.text;
        // ストリーミング出力(リアルタイムでテキストを表示)
        if (onTextUpdate) {
          onTextUpdate(fullText);
        }
      }

      // 引用情報を取得(該当する場合)
      if (chunk.candidates && chunk.candidates.length > 0) {
        const candidate = chunk.candidates[0];

        if (candidate.finishReason === "STOP") {
          const groundingMetadata = candidate.groundingMetadata;
          if (groundingMetadata) {
            groundingChunks = groundingMetadata.groundingChunks;
            webSearchQueries = groundingMetadata.webSearchQueries;
          }
        }
      }
    }

    // 引用情報をフォーマット
    if (
      (groundingChunks && groundingChunks.length > 0) ||
      (webSearchQueries && webSearchQueries.length > 0)
    ) {
      let citationsMarkdown = "\n\n";

      // 検索クエリ情報
      if (webSearchQueries && webSearchQueries.length > 0) {
        citationsMarkdown += "#### 検索ワード\n\n";
        webSearchQueries.forEach((query) => {
          citationsMarkdown += `- ${escapeMarkdown(query)}\n`;
        });
      }

      // 引用情報
      if (groundingChunks && groundingChunks.length > 0) {
        if (webSearchQueries && webSearchQueries.length > 0) {
          citationsMarkdown += "\n";
        }

        citationsMarkdown += "#### 参考情報\n\n";
        groundingChunks.forEach((chunk, index) => {
          if (chunk.web && chunk.web.uri && chunk.web.title) {
            // タイトルのみエスケープ (URIはエスケープしない)
            citationsMarkdown += `${index + 1}. [${escapeMarkdown(chunk.web.title)}](${chunk.web.uri})\n`;
          }
        });
      }

      // 引用情報を本文に追加
      fullText += citationsMarkdown;

      // 引用情報が追加された最終テキストを表示
      if (onTextUpdate) {
        onTextUpdate(fullText);
      }
    }

    // 完了時のコールバック
    if (onComplete) {
      onComplete({
        text: fullText,
        groundingChunks,
        webSearchQueries,
      });
    }
  } catch (error) {
    console.error("Gemini API エラー:", error);
    throw error;
  }
}

// マークダウンをエスケープする関数
function escapeMarkdown(text) {
  if (!text) return "";
  return text.replace(/([[\]()*_~`>#+=|.!-])/g, "\\\");
}

// ブラウザもしくはNode.js環境で実行できるようにする
async function run() {
  // APIキー(実際の使用時に置き換えてください)
  const API_KEY = "API_KEY_HERE";

  // Web検索なしでGeminiを呼び出す
  await sendMessageToGemini(
    API_KEY,
    "2025年のAI研究のトレンドについて教えてください",
    "gemini-2.5-pro-preview-05-06",
    "あなたは最新の研究動向に詳しいAIアシスタントです。箇条書きで簡潔に説明してください。",
    true, // Web検索を有効化
    (text) => {
      // ブラウザ環境かNode.js環境かに応じて出力方法を変える
      if (typeof window !== "undefined") {
        // ブラウザ環境の場合
        document.getElementById("output").textContent = text;
      } else {
        // Node.js環境の場合
        process.stdout.write("\r\x1b[K"); // 行をクリア
        process.stdout.write(text);
      }
    },
    (result) => {
      // 完了時の処理
      console.log("\n\n生成完了!");
      if (result.webSearchQueries) {
        console.log("\n検索クエリ:", result.webSearchQueries);
      }
      if (result.groundingChunks) {
        console.log("\n引用情報数:", result.groundingChunks.length);
      }
    }
  );
}

// サンプルを直接実行
run().catch((error) => console.error("エラーが発生しました:", error));

APIキーを取得して入力すればすぐに使えます!

👇GeminiのAPIキーはこちらから取得できます
Google AI Studio

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次