以下の内容はhttps://polar3130.hatenablog.com/entry/2025/05/21/183000より取得しました。


Vertex AI SDK と Gen AI SDK のレスポンスモデルの違い

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

GooglePython 向けに提供している 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)

  • Gemini API in Vertex AI を利用するための SDK
  • Vertex AI 経由で Gemini モデルを利用できる

参考: googleapis/python-aiplatform

3. Google AI Python SDK (google-generativeai)

  • Gemini Developer API を利用するための SDK
  • Vertex AI には非対応
  • 現在は非推奨となっており、2025 年 8 月末で EOL 予定

参考: 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 への移行ガイドに記載があります

ai.google.dev

Gen AI SDK の Issue でも言及があります

github.com

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 に一本化されていくのではないかと思います。
今後のアップデートが楽しみです。




以上の内容はhttps://polar3130.hatenablog.com/entry/2025/05/21/183000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14