Gemini APIを使ってみる (with Next.js)
Tatsuya Abe
2025/2/24
はじめに
GoogleのGemini APIを使ってみる.
料金体系はこちら.
今回はNext.jsでwebアプリを実装してみる.
Githubリポジトリ: https://github.com/tatsuya-16/gemini-api-test-nextjs
やってみる
Next.jsのプロジェクトを作成
npx create-next-app@latest
✔ What is your project named? … gemini-test
✔ Would you like to use TypeScript? … Yes
✔ Would you like to use ESLint? … Yes
✔ Would you like to use Tailwind CSS? … Yes
✔ Would you like your code inside a `src/` directory? … No
✔ Would you like to use App Router? (recommended) … Yes
✔ Would you like to use Turbopack for `next dev`? … No
✔ Would you like to customize the import alias (`@/*` by default)? … No
VScodeで作成したプロジェクトを開く
code gemini-test
Gemini APIライブラリをインストールする
npm install @google/generative-ai
APIキーを取得する
Google AI StudioでAPIキーを取得.
プロジェクトのルートディレクトリに.env.localファイルを作成し,APIキーを記述.
.env.local
GEMINI_API_KEY=[取得したAPIキー]
Gemini APIを使ってみる
APIエンドポイントを作成
app/api/gemini/route.tsファイルを作成.
app/api/gemini/route.ts
import { NextResponse } from "next/server";
import { GoogleGenerativeAI } from "@google/generative-ai";
const apiKey = process.env.GEMINI_API_KEY;
if (!apiKey) {
throw new Error("API key is not found");
}
const genAI = new GoogleGenerativeAI(apiKey);
export async function POST(request: Request) {
console.log('Request:', request);
try {
const { input } = await request.json();
const prompt = `"${input}"について詳しく解説してください.`;
// モデルを取得
const model = genAI.getGenerativeModel({
model: "gemini-1.5-flash",
});
// プロンプトを生成AIに送信
const result = await model.generateContent(prompt);
console.log('Result:', result);
// 結果をレスポンスとして返却
return NextResponse.json({
response: result.response.text(),
});
} catch (error) {
if (error instanceof Error) {
console.error("Error generating content:", error.message);
return NextResponse.json(
{
error: error.message || "An unexpected error occurred.",
},
{ status: 500 }
);
} else {
console.error("Unknown error:", error);
return NextResponse.json(
{
error: "An unexpected error occurred.",
},
{ status: 500 }
);
}
}
}
UIを作る
shadcnをインストール
npx shadcn@latest init
✔ Preflight checks.
✔ Verifying framework. Found Next.js.
✔ Validating Tailwind CSS.
✔ Validating import alias.
✔ Which style would you like to use? › New York (Recommended)
✔ Which color would you like to use as the base color? › Neutral
✔ Writing components.json.
✔ Checking registry.
✔ Updating tailwind.config.ts
✔ Updating app/globals.css
Installing dependencies.
It looks like you are using React 19.
Some packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19).
✔ How would you like to proceed? › Use --force
✔ Installing dependencies.
✔ Created 1 file:
- lib/utils.ts
Success! Project initialization completed.
You may now add components.
Input,Button,Scroll Areaをインストール.
npx shadcn@latest add button input scroll-area
app/page.tsxを編集する.
画面に入力欄とボタン,レスポンスの表示欄を設置し,APIリクエストを送信するコードを記述.
app/rpage.tsx
"use client"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { ScrollArea } from "@/components/ui/scroll-area"
import { useState } from "react"
export default function Home() {
const [prompt, setPrompt] = useState("")
const [result, setresult] = useState("")
const handleSubmit = async () => {
const response = await fetch("/api/gemini", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ input: prompt }),
});
const data = await response.json();
console.log('Response:', data);
if (response.ok) {
setresult(data.response)
} else {
console.error("Error:", data.error);
setresult("An unexpected error occurred.");
}
}
return (
<div className="flex flex-col justify-center items-center min-h-screen space-y-4">
<div className="flex w-full max-w-sm items-center space-x-2">
<Input
placeholder="Enter the words"
value={prompt}
onChange={(e) => setPrompt(e.target.value)}
/>
<Button type="button" onClick={handleSubmit}>Search</Button>
</div>
<ScrollArea className="h-[200px] w-full max-w-sm rounded-md border p-4">
<div>{result}</div>
</ScrollArea>
</div>
)
}
動作確認
開発サーバを起動
npm run dev
ローカルサーバ (通常,http://localhost:3000)にアクセス.
入力欄に適当な単語を入力し,Searchボタンを押してレスポンスを確認.