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
コメント