GeminiAPIの概要

URL

Gemini API の URL はバージョン、モデル、メソッドによって異なります。

セクション 内容 備考
https://generativelanguage.googleapis.com Google Generative Language API のベースURL GoogleのAPIサーバー
/v1beta APIのバージョン v1beta = ベータ版
/models/gemini-2.0-flash 使用するモデルの指定 この例では gemini-2.0-flash
:generateContent 呼び出すメソッド コンテンツ生成
?key=YOUR_API_KEY 認証用のAPIキー クエリパラメータ

HTTPヘッダー

HTTPヘッダーは以下のオプションを指定します。

オプション名 説明 使用例
method string HTTP リクエストのメソッドを指定。デフォルトは GET 'method' : 'POST'
header string リクエスト時に送信する追加のヘッダーを指定 'header' : "Content-Type: application/json
ignore_errors boolean HTTPステータエラーで、レスポンスを取得するか 'ignore_errors' : true

リクエストボディ

リクエストボディは、contents, parts, text などのデータ構造で指定します。

階層 キー 説明
root contents array 会話内容のリスト(複数発言にも対応)
contents[] parts array 発言の構成要素(テキストや画像など)
parts[] text string ユーザーが入力するテキスト内容

JSONの構造

Gemini API のリクエストボディサンプル(JSON)は以下の通りです。

{
  "contents": [
    {
      "parts": [
        {
          "text": "Explain how AI works in a few words"
        }
      ]
    }
  ]
}

REST

PythonJavaScript以外のプログラムで Gemini API を利用するときは、REST通信で処理します。ライブラリを利用しないため処理が若干複雑になります。

cURL

cURL(カール) は、サーバー同士やアプリとAPIがHTTP通信をするためのツール・機能です。公式ドキュメント では以下の cURLサンプルが記載されています。

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -X POST \
  -d '{
    "contents": [
      {
        "parts": [
          {
            "text": "Explain how AI works in a few words"
          }
        ]
      }
    ]
  }'

チャットボット

ファイル構成

php_samples/
├── chat.php
├── env.php
└── service
    └── Gemini.php

Geminiクラス

APIキー設定

env.php に APIキーを設定します。

env.php
<?php
const API_KEY = '自分のAPIキー';
  • このキーは公開しないように管理してください

HTTPヘッダー

Geminiクラスを作成し、env.php を読み込みます。ベースURLやHTTPヘッダーオプションも指定しておきます。

service/Gemini.php
<?php
require_once 'env.php';

class Gemini
{
    public $baseURL = 'https://generativelanguage.googleapis.com/v1beta/models/';
    public $options = [
        'http' => [
            'method'  => 'POST',
            'header'  => "Content-Type: application/json",
            'ignore_errors' => true
        ]
    ];
}

チャット処理

プロンプトのコンテキスト

chat() を定義し、プロンプトのコンテキストを作成します。

service/Gemini.php
    function chat(string $prompt, string $model = 'gemini-2.0-flash')
    {
        $url = "{$this->baseURL}{$model}:generateContent?key=" . API_KEY;

        // リクエストデータを作成
        $data = [
            'contents' => [
                [
                    'parts' => [['text' => $prompt]]
                ]
            ]
        ];

        // リクエストヘッダーを設定
        $this->options['http']['content'] = json_encode($data);

        // ストリームコンテキストを作成
        $context = stream_context_create($this->options);
    }

リクエスト&レスポンス

file_get_contents() で Gemini API にリクエスト&レスポンスします。 レスポンスデータを JSONデコードし、テキストデータを返します。

service/Gemini.php
    function chat(string $prompt, string $model = 'gemini-2.0-flash')
    {
        ...

        // GeminiAPIにリクエストを送信し、レスポンスを取得
        $response = file_get_contents($url, false, $context);

        if ($response === false) {
            return null;
        }

        // レスポンスをデコード
        $json = json_decode($response, true);
        // テキストデータを返す
        return $json['candidates'][0]['content']['parts'][0]['text'] ?? null;
    }

メインプログラム

プロンプト処理実行

chat.php で、Geminiクラスを読み込んでプロンプトを実行します。

chat.php
<?php
require_once 'Gemini.php';

$result = '';
// POSTリクエストが送信された場合
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // POSTリクエストからプロンプトを取得
    $prompt = $_POST['prompt'];
    // Geminiクラスのインスタンスを作成
    $gemini = new Gemini();
    // GeminiAPIにリクエストを送信
    $result = $gemini->chat($prompt);
}
?>

フォーム

ブラウザからプロンプト送信するHTMLフォームを作成します。

chat.php
<?php
require_once 'Gemini.php';

$result = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['prompt'])) {
    $prompt = $_POST['prompt'];
    $gemini = new Gemini();
    $result = $gemini->chat($prompt);
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Gemini Chat</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 p-6">
    <div class="max-w-2xl mx-auto bg-white p-6 rounded-xl shadow">
        <h1 class="text-2xl font-bold mb-4">Gemini API Chat</h1>
        <form method="POST" class="space-y-4">
            <textarea name="prompt" rows="4" class="w-full p-2 border rounded" placeholder="質問を入力してください..."><?= htmlspecialchars($_POST['prompt'] ?? '') ?></textarea>
            <button type="submit" class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600">送信</button>
        </form>

        <?php if ($result): ?>
            <div class="mt-6 bg-gray-50 p-4 rounded border">
                <h2 class="text-lg font-semibold">Geminiの回答</h2>
                <p class="mt-2 whitespace-pre-wrap"><?= nl2br(htmlspecialchars($result)) ?></p>
            </div>
        <?php endif; ?>
    </div>
</body>
</html>

動作確認