Vertex AI Extensions から Agent Platform に移行する

Vertex AI Extensions の非推奨に伴い、既存のワークフローを Gemini Enterprise Agent Platform(Agent Platform)に移行する必要があります。このガイドでは、3 つのコア拡張機能カテゴリの移行パスについて説明します。

コード インタープリタ拡張機能

移行先: Agent Platform Code Execution Sandbox 代替: Gemini API CodeExecution ツール

コード インタープリタ拡張機能は、Agent Platform コード実行サンドボックスに移行する必要があります。このマネージド サービスは、信頼できない AI 生成コードを実行するために特別に設計された、安全で分離されたステートフル サンドボックス環境を提供します。プログラムによる実行、財務計算、データ サイエンス ワークフローに最適です。

または、生成パス中に Gemini モデルがコードをネイティブに自動的に記述して実行することを希望する場合は、google-genai SDK の組み込み code_execution ツールを使用できます。

移行の例

Vertex AI Extensions:

from vertexai.preview import extensions

extension = extensions.Extension.from_hub("code_interpreter")
response = extension.execute(
    operation_id="generate_and_execute_code",
    operation_params={"code": "import math\nprint(math.sqrt(15376))"}
)

Agent Platform コード実行サンドボックス:

オプション 1: Agent Development Kit(ADK)を使用する

from google.adk.code_executors.agent_engine_sandbox_code_executor import (
    AgentEngineSandboxCodeExecutor,
)
from vertexai.preview.reasoning_engines import Agent

root_agent = Agent(
    model="gemini-2.0-flash-001",
    name="agent_engine_code_execution_agent",
    instruction=base_system_instruction()
    + """
You need to assist the user with their queries by looking at the data and the
context in the conversation. Your final answer should summarize the code and
code execution relevant to the user query.

Include all pieces of data required to answer the question, such as a table
from code execution results. If the query can be answered directly without
writing code, generate the textual response directly. Take care not to manually
run commands like `pip install`. When plotting trends, sort data by the x-axis.
""",
    code_executor=AgentEngineSandboxCodeExecutor(
        sandbox_resource_name=None,
        agent_engine_resource_name=None,
    ),
)

オプション 2: GenAI クライアント SDK を使用する

from google import genai

# Initialize Gemini model
model = genai.Client().models

# Ask Gemini to generate code for a calculation
prompt = """
Write Python code to calculate the mean and standard deviation of these numbers:
[23, 45, 67, 89, 12, 34, 56]

Return only the Python code, no explanations.
"""

response = model.generate_content(
    model="gemini-2.5-flash",
    contents=prompt
)
generated_code = response.text.replace("```python", "").replace("```", "").strip()


# Execute the generated code in Agent Engine Sandbox using new pattern
exec_response = client.agent_engines.sandboxes.execute_code(
    name=sandbox_resource_name,
    input_data={"code": generated_code},
)

# Parse response with new file handling logic
for output in exec_response.outputs:
    if output.mime_type == "application/json" and output.metadata is None:
        result = json.loads(output.data.decode("utf-8"))
        if result.get("msg_out"):
            print(result.get("msg_out"))
        if result.get("msg_err"):
            print(f"Error occurred: {result.get('msg_err')}")

オプション 3: 動的な手動ツールとして定義する

import json
import re
from google.genai.types import FunctionDeclaration, Tool


def execute_python_code(code: str) -> str:
    """Execute Python code in a secure sandbox.

    Args:
        code: Python code to execute
    Returns:
        The output from code execution
    """
    # Extract code block if wrapped in markdown
    code_match = re.search(r"```python\n(.*?)\n```", code, re.DOTALL)
    code_to_execute = code_match.group(1) if code_match else code

    # Execute in sandbox
    response = client.agent_engines.sandboxes.execute_code(
        name=sandbox_resource_name, input_data={"code": code_to_execute}
    )

    # Parse response using new pattern
    for output in response.outputs:
        if output.mime_type == "application/json" and output.metadata is None:
            result = json.loads(output.data.decode("utf-8"))

            if result.get("msg_err"):
                return f"Error: {result.get('msg_err')}"
            return result.get("msg_out", "Code executed successfully")

    return "Code executed (no output)"


# Create a tool from the function
code_tool = Tool(
    function_declarations=[FunctionDeclaration.from_func(execute_python_code)]
)

Google 検索拡張機能

移行先: Google 検索によるグラウンディング

Google 検索によるグラウンディングに移行します。この機能により、モデルのレスポンスが信頼できる検索インデックスと最新の一般公開情報に固定され、事実性の高い回答が得られます。

移行の例

Vertex AI Extensions:

from vertexai.preview import extensions

extension = extensions.Extension.from_hub("google_search")
response = extension.execute(
    operation_id="search",
    operation_params={"query": "What is the next total solar eclipse in the US?"}
)

Google GenAI SDK を使用して Google 検索によるグラウンディングを行う:

from google import genai
from google.genai.types import GenerateContentConfig, GoogleSearch, Tool

client = genai.Client()

response = client.models.generate_content(
    model="gemini-3.1-flash",
    contents="When is the next total solar eclipse in the United States?",
    config=GenerateContentConfig(
        tools=[Tool(google_search=GoogleSearch())],
        temperature=0.0,
    ),
)
print(response.text)

カスタムの拡張

移行先: 関数呼び出し(ツールの使用)

OpenAPI 仕様で構成したカスタム拡張機能を関数呼び出しに移行します。関数呼び出しを使用すると、ソースファイル内で外部プラットフォーム API を定義し、そのインターフェースの抽象化をモデルに転送できます。

移行の例

Vertex AI Extensions:

from vertexai.preview import extensions

extension = extensions.Extension.create(
    manifest={
        "name": "my_custom_api",
        "apiSpec": {"openApiYaml": "..."}
    }
)

Google GenAI SDK を使用したツール使用:

from google import genai
from google.genai.types import GenerateContentConfig


def get_order_status(order_id: str) -> str:
    """Returns the current status of a customer order.

    Args:
        order_id: The unique identifier of the order.
    """
    statuses = {"123": "Shipped", "456": "Processing"}
    return statuses.get(order_id, "Order not found")


client = genai.Client()

response = client.models.generate_content(
    model="gemini-3.0-pro",
    contents="Can you check the status of my order 123?",
    config=GenerateContentConfig(
        tools=[get_order_status],
    ),
)

print(response.text)