Vertex API経由で、Nano BananaをPHPから実行する
By Yosuke | 2025年10月6日
株式会社tolvの宍戸陽介です。
AIの話題が速すぎて、最近ついていくのが大変ですが、今回はNano BananaをVertex API経由でPHPから実行してみたいと思います。
今はSora2が話題になり、Nano Bananaの話題が少なくなって、画像や動画生成のAI事情も変わっていきそうですが、今回はNano Bananaを使っていきます。
Nano Bananaですが、Google AI StudioからAPIキーを取得して利用することも可能ですが、広告利用や商用利用を行う場合はGoogle Workspace with Gemini
もしくはVertex AI
を利用する必要があります。
こちらに関しては、下記noteの記事にて記載されています。
Gemini の Nano Banana で、画像生成をもっと楽しく、自由自在に!|Gemini - Google の AI
こんにちは、Google の AI「Gemini(ジェミニ)」の公式 note 編集部です。 最近、SNS などで「Nano Banana」という言葉を目にしたことはありますか? Google の AI「Gemini」で作った もふもふ(仮)をフィギュアにしてみた💫 Nano Banana 🍌で画像の編集も自由自在! 作り方はリプライに🏃⬇️ pic.twitter.com/S3ZvCMDsAG — Google Japan (@googlejapan) September 16, 2025 世界中のクリエイターや AI ファンの間で大きな話題を呼んでいる
note.com

今回は、商用利用も想定してVertex APIを使ってNano Bananaを利用します。
前提
前提としてですが、今回はapplication_default_credentials.json
を利用した認証を行い、簡単にPHPより実行する方法を記載します。
あくまで、開発環境としてお試しで動かす前提のためセキュリティ面等は考慮しておらず、本番環境で行う場合は認証方法や実装方法などを、別途考慮する必要があります。
準備
Google Cloud Vertex APIの準備
Vertex APIは、Google Cloudから利用することが可能なので、Google Cloudで新規プロジェクトを作成しますが、プロジェクトの作成については、ここでは割愛します。
Google Cloudの左メニューよりVertex API > ダッシュボード
の順でダッシュボードを表示して、ダッシュボードにあるすべての推奨APIを有効にする
をクリックします。
しばらくすると、Vertex APIを利用するために必要なAPIが有効化されます。

Vertex APIが有効化されたかどうかは、左メニューからAPIとサービス > 有効なAPIとサービス
のページで、一覧にVertex AI API
が表示されていれば大丈夫です。
Google Cloud SDKのインストール
Googleの認証を行い、認証ファイルを取得するためにGoogle Cloud SDK
をインストールします。
今回は私の環境がMacのため、Homebrewで簡単にインストールします。
brew install --cask google-cloud-sdk
下記コマンドを実行すると、ブラウザが立ち上がりGoogleの認証画面になるので、ブラウザ上で認証を行ってください。
gcloud auth login
ログインに成功すると、~/.config/gcloud/application_default_credentials.json
のファイルが作成され、application_default_credentials.json
のファイルをAPI呼び出し時の認証情報として利用します。
実装
フォルダ構成
今回は、PHP単一ファイルで実行します。フォルダの構成は下記になります。
.
|-- composer.json
|-- composer.lock
|-- credentials
| `-- application_default_credentials.json
|-- out
|-- sample.php
|-- .env
application_default_credentials.jsonの準備
credentialsフォルダに、~/.config/gcloud/application_default_credentials.json
のファイルをコピーします。
このファイルには、Google Cloud SDKのログイン時に発行されるトークン情報が保存されており、Vertex API呼び出し時にユーザー認証として利用されます。
.envファイルの作成
.envファイルを作成し、下記設定を記載します。
GOOGLE_APPLICATION_CREDENTIALS=/path/to/application_default_credentials.json
GCP_PROJECT_ID={YOUR_PROJECT_ID}
GCP_LOCATION=global
GEMINI_IMAGE_MODEL=gemini-2.5-flash-image-preview
- GOOGLE_APPLICATION_CREDENTIALSは
application_default_credentials.json
ファイルのフルパスを指定します。 - GCP_PROJECT_IDは準備で作成したプロジェクトのIDを指定します。
- GCP_LOCATIONはglobalを指定。2025年10月現在ではglobalリージョンのみ対応しています。
- GEMINI_IMAGE_MODELはLLMのModelを指定します。2025年10月現在、Nano Bananaは
gemini-2.5-flash-image-preview
となります。
ライブラリのインストール
composerを使って、下記ライブラリをインストールします。
composer require guzzlehttp/guzzle google/auth vlucas/phpdotenv
実装
下記コードで実装します。
実装自体はそんなに難しくなく、Googleからアクセストークンを取得し、API実行時にアクセストークンを付与してAPIをコールしています。
Payloadは最低限ですが、roleは、ユーザーからのメッセージかモデルによって生成されたメッセージかを指定します。
プロンプトは、partsのtextに記載します。
<?php
require __DIR__ . '/vendor/autoload.php';
use Google\Auth\ApplicationDefaultCredentials;
use GuzzleHttp\Client;
use Dotenv\Dotenv;
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
$projectId = $_ENV['GCP_PROJECT_ID'];
$location = $_ENV['GCP_LOCATION'] ?? 'global';
$modelId = $_ENV['GEMINI_IMAGE_MODEL'] ?? 'gemini-2.5-flash-image-preview';
$prompt = 'a studio photo of a tiny banana-shaped robot';
// アクセストークンの取得
$scopes = ['https://www.googleapis.com/auth/cloud-platform'];
$creds = ApplicationDefaultCredentials::getCredentials($scopes);
$token = $creds->fetchAuthToken();
$accessToken = $token['access_token'];
$url = sprintf(
'https://aiplatform.googleapis.com/v1/projects/%s/locations/%s/publishers/google/models/%s:generateContent',
$projectId, $location, $modelId
);
$payload = [
'contents' => [[
'role' => 'user',
'parts' => [['text' => $prompt]],
]],
];
// APIコール
$client = new Client();
$res = $client->post($url, [
'headers' => [
'Authorization' => "Bearer {$accessToken}",
'Content-Type' => 'application/json',
],
'json' => $payload,
'http_errors' => false,
]);
$body = json_decode((string)$res->getBody(), true);
$imageBase64 = null;
if (!empty($body['candidates'])) {
foreach ($body['candidates'] as $candidate) {
$parts = $candidate['content']['parts'] ?? [];
foreach ($parts as $part) {
$inlineData = $part['inlineData'] ?? null;
if (!empty($inlineData['data'])) {
$imageBase64 = $inlineData['data'];
break 2;
}
}
}
}
if ($imageBase64 !== null && $imageBase64 !== '') {
$timestamp = date('Ymd_His', strtotime('now'));
$filename = sprintf('out_%s.png', $timestamp);
file_put_contents(__DIR__ . '/out/' . $filename, base64_decode($imageBase64));
echo "Saved: {$filename}\n";
} else {
echo "No image found\n";
}
返却されるJSONにはcandidates > content > parts > inlineData > data
の階層構造でBase64画像が含まれます。
partsのどの要素に入るかは確定していないため、すべてのpartsを走査してinlineDataを探索しています。
ほかにメタ情報(使用トークン数やモデル名など)も同時に返却されます。
詳細なリクエスト/レスポンス構造は公式ドキュメントを参照してください。
Vertex AI で Gemini API を使用してコンテンツを生成する | Generative AI on Vertex AI | Google Cloud
Vertex AI の Model API for Gemini を使用して、カスタム アプリケーションを作成します。Gemini モデルのリクエスト本文、モデル パラメータ、レスポンス本文、リクエストとレスポンスのサンプルを確認します。
cloud.google.com

実際に利用する場合は、mimeの判定やエラー処理など全体的に調整が必要になるかと思います。
今回のソースは、Dockerfileも含めてGitHubにアップしていますので、ご興味のある方はどうぞ。
tolv-jp/vertex-ai-image-sample: Vertex AI Image Sample
Vertex AI Image Sample. Contribute to tolv-jp/vertex-ai-image-sample development by creating an account on GitHub.
github.com
生成結果の確認
実行すると、outフォルダに下記のようなロボットバナナの画像が生成されるかと思います。
あとは、プロンプトを変えながら遊んでみてください。

料金について
料金ですが、2025年10月現在の料金だと、Google公式試算では$0.039(約6円)との記載があります。
自分がサンプルで作った他のアプリケーションの利用から見ても、だいたい6円くらいで収まってる感じがします。
Gemini Developer API の料金 | Gemini API | Google AI for Developers
Gemini Developer API の料金
ai.google.dev

まとめ
今回は、Nano BananaをVertex API経由でPHPから実行する最小構成を紹介しました。
実際に触ってみると、画像生成のレスポンス速度は運用によっては遅いかもしれませんが、精度は高く業務アプリへの組み込みも十分現実的だと感じます。
AIモデルの進化は速く、明日には新しい世代が登場しているかもしれません。
だからこそ、疎結合な設計で新モデルに柔軟対応できるアーキテクチャを意識しておくのが大切だと思いました。
弊社サービス「Charis」にも生成AI機能を検討中です。
今後もAIと開発の融合を探りながら、より使いやすいサービスを目指していきます。