Python で書いた AI アプリケーションを Vertex AI SDK から Gen AI SDK に移行する際に得たちょっとした気付きですが、Gen AI SDK では Pydantic ベースのレスポンスモデル (GenerateContentResponse) を採用しており、model_dump() や model_dump_json() によるシリアライズが可能です。
そもそも、Gemini API を使うための SDK が公式から複数出ている状況が知らない人には分かりづらいと思いますので簡単にですが背景から説明したいと思います。
現状、Gemini は大別して 2 つの API と 3 つの SDK が提供されています。
Gemini の API
1. Gemini API in Vertex AI
- Google Cloud の Vertex AI を通じて Gemini モデルにアクセスする API
- Google Cloud プロジェクトが必要
- IAM による認証とアクセス制御
- プロジェクトごとのクォータが適用され、使用状況に応じて制限される
参考:Migrate from the Gemini Developer API to the Vertex AI Gemini API
2. Gemini Developer API
- Google AI Studio からアクセスする Gemini API
- Google Cloud プロジェクトがなくても利用可能
- 無料枠が提供されており、学習やプロトタイピングに適している
- エンタープライズ向けの機能や高度な設定は制限されている
参考:Get a Gemini API key | Google AI for Developers
提供されている Python 向け SDK
Google が Python 向けに提供している SDK は 3 つあります。
1. Google Gen AI SDK (google-genai)
- Gemini Developer API と Vertex AI Gemini API の両方に対応した SDK
- 同一のコードベースで、Google AI Studio 経由の API キー認証と、Vertex AI 経由の IAM 認証の両方をサポート
- 他の SDK よりも後発で、最も更新頻度が高い
参考: googleapis.github.io/python-genai
2. Vertex AI SDK (google-cloud-aiplatform)
参考: googleapis/python-aiplatform
3. Google AI Python SDK (google-generativeai)
参考: google-gemini/deprecated-generative-ai-python
レスポンスモデルの違い
Vertex AI SDK と Gen AI SDK はいずれも Gemini API in Vertex AI を利用できますが、SDK の使い方は少々異なります。
それぞれの SDK を使った単純なサンプルコードは例えば以下のような感じになります
Vertex AI SDK のサンプルコード
from vertexai.generative_models import GenerativeModel
import vertexai
PROJECT_ID = "*****************"
REGION = "us-central1"
vertexai.init(project=PROJECT_ID, location=REGION)
model = GenerativeModel("gemini-2.0-flash")
prompt = "日本の首都は?"
response = model.generate_content(prompt)
print(response.text)
# <出力例>
# 日本の首都は東京都です。
Gen AI SDK のサンプルコード
from google import genai
from google.genai.types import HttpOptions
client = genai.Client(
vertexai=True,
project="*****************",
location="us-central1",
http_options=HttpOptions(api_version="v1"),
)
response = client.models.generate_content(
model="gemini-2.0-flash",
contents="日本の首都は?",
)
print(response.text)
# <出力例>
# 日本の首都は東京都です。
ここで、どちらも生成結果のテキストは response.text で取得できていますが、response オブジェクトの型は SDK ごとに異なります。
- Vertex AI SDK の場合:生成結果のレスポンスは GenerationResponse クラスのオブジェクト
- Gen AI SDK の場合:生成結果のレスポンスは GenerateContentResponse クラスのオブジェクト
レスポンスには生成結果と併せて生成時の様々なパラメータがメタデータとして格納されています。
AI アプリケーションを開発していると、例えば確認のための中間生成物として response 内のすべてのパラメータを JSON 形式で外部出力したい、といった場合があるかと思います。
このとき、Vertex AI SDK では GenerationResponse クラスのオブジェクトに to_dict() メソッドが利用できるため、サンプルコードは以下のようになります
import json
import vertexai
from vertexai.generative_models import GenerativeModel
PROJECT_ID = "*****************"
REGION = "us-central1"
vertexai.init(project=PROJECT_ID, location=REGION)
model = GenerativeModel("gemini-2.0-flash")
prompt = "日本の首都は?"
response = model.generate_content(prompt)
print(json.dumps(response.to_dict(), indent=2, ensure_ascii=False))
# response の型は vertexai.generative_models._generative_models.GenerationResponse
#
# <出力例>
# {
# "candidates": [
# {
# "content": {
# "role": "model",
# "parts": [
# {
# "text": "日本の首都は東京都です。\n"
# }
# ]
# },
# "finish_reason": "STOP",
# "avg_logprobs": -0.029211470058986118
# }
# ],
# "usage_metadata": {
# "prompt_token_count": 4,
# "candidates_token_count": 7,
# "total_token_count": 11,
# "prompt_tokens_details": [
# {
# "modality": "TEXT",
# "token_count": 4
# }
# ],
# "candidates_tokens_details": [
# {
# "modality": "TEXT",
# "token_count": 7
# }
# ]
# },
# "model_version": "gemini-2.0-flash",
# "create_time": "2025-05-20T16:07:26.747420Z",
# "response_id": "HhwsaJzPLdi5nvgPmN2T8AE"
# }
一方、Gen AI SDK の場合は response の型である GenerateContentResponse が pydantic の BaseModel に基づいているため、to_dict() ではなく response.model_dump() を使うことでシリアライズが可能です。
Vertex AI SDK と同じ要領で response に to_dict() メソッドが使おうとするとエラーになるので、Gen AI SDK に移行する際に気を付けたいポイントのひとつかと思います。
この点については、公式ドキュメントの Gen AI SDK への移行ガイドに記載があります
Gen AI SDK の Issue でも言及があります
Gen AI SDk を使って、レスポンスの生成結果とすべてのメタデータを JSON 形式で出力するサンプルコードは以下のようになります。
from google import genai
from google.genai.types import HttpOptions
import json
client = genai.Client(
vertexai=True,
project="*****************",
location="us-central1",
http_options=HttpOptions(api_version="v1"),
)
response = client.models.generate_content(
model="gemini-2.0-flash",
contents="日本の首都は?",
)
print(json.dumps(response.model_dump(mode='json'), indent=2, ensure_ascii=False))
# response の型は google.genai.types.GenerateContentResponse
#
# <出力例>
# {
# "candidates": [
# {
# "content": {
# "parts": [
# {
# "video_metadata": null,
# "thought": null,
# "inline_data": null,
# "code_execution_result": null,
# "executable_code": null,
# "file_data": null,
# "function_call": null,
# "function_response": null,
# "text": "日本の首都は東京都です。\n"
# }
# ],
# "role": "model"
# },
# "citation_metadata": null,
# "finish_message": null,
# "token_count": null,
# "finish_reason": "STOP",
# "url_context_metadata": null,
# "avg_logprobs": -0.029211470058986118,
# "grounding_metadata": null,
# "index": null,
# "logprobs_result": null,
# "safety_ratings": null
# }
# ],
# "create_time": "2025-05-20T16:35:21.988133Z",
# "response_id": "qSIsaOWnPMLxgLUP2ouHmQ8",
# "model_version": "gemini-2.0-flash",
# "prompt_feedback": null,
# "usage_metadata": {
# "cache_tokens_details": null,
# "cached_content_token_count": null,
# "candidates_token_count": 7,
# "candidates_tokens_details": [
# {
# "modality": "TEXT",
# "token_count": 7
# }
# ],
# "prompt_token_count": 4,
# "prompt_tokens_details": [
# {
# "modality": "TEXT",
# "token_count": 4
# }
# ],
# "thoughts_token_count": null,
# "tool_use_prompt_token_count": null,
# "tool_use_prompt_tokens_details": null,
# "total_token_count": 11,
# "traffic_type": "ON_DEMAND"
# },
# "automatic_function_calling_history": [],
# "parsed": null
# }
Gen AI SDK に移行したことで、生成に関わるより多くのメタデータが取得できるようになっていることがわかります。(シリアライズのためのメソッドの違いとは関係ありません)
まとめ
Vertex AI SDK から Gen AI SDK への移行を機に得た気付きとして、Gen AI SDK のレスポンスモデルである GenerateContentResponse は Pydantic ベースであるため、生成結果と生成時のメタデータを model_dump() や model_dump_json() を使ってシリアライズできることをご紹介しました。
まだ一部の機能が Gen AI SDK で未提供 (Vertex AI SDK でのみ利用可能) なものがあるため、すべてのユースケースで Gen AI SDK が使えるという状況ではありませんが、公式ドキュメントにおいて推奨の SDK とされており、更新も活発なため、ゆくゆくは Gen AI SDK に一本化されていくのではないかと思います。
今後のアップデートが楽しみです。