‫Agent Platform SDK ל-Python: מדריך להעברה לגרסה 2.0.1

החבילה google-cloud-aiplatform כוללת גם את ה-SDK של Agent Platform ל-Python וגם את ספריית הלקוח של Agent Platform ל-Python. בדף הזה מפורטות הקטגוריות הבאות של שינויים בחבילה google-cloud-aiplatform:

  • מודולים של AI גנרטיבי עוברים ל-Google Gen AI SDK: המודולים הבאים של AI גנרטיבי בחבילה vertexai הוצאו משימוש והועברו ל-Google Gen AI SDK‏ (google-genai):

    • vertexai.generative_models
    • vertexai.language_models
    • vertexai.vision_models
    • vertexai.caching
    • vertexai.tuning

    במאמר העברת מודולים של AI גנרטיבי ל-Google Gen AI SDK מוסבר איך להעביר את המודולים שהוצאו משימוש ל-Google Gen AI SDK.

  • שינוי מבנה של ממשק הסוכן: השינויים הבאים בוצעו במודולים של agentplatform ב-google-cloud-aiplatform:

    • שינויי שם
    • קידום לרמה העליונה
    • הסרת המאתחל הגלובלי

    במאמר שינוי המבנה של Agent Platform SDK מוסבר איך לעבור למבנה החדש של ה-SDK.

  • הפרדה של agentplatform: google-cloud-agentplatform הוא עכשיו הפצה קלה ועצמאית, וההתקנה המומלצת לעומסי עבודה של סוכנים. אם אתם רק יוצרים נציגים, התקינו את google-cloud-agentplatform, שלא מכיל מודולים של AI גנרטיבי. המודולים של agentplatform כוללים את השילובים הנפוצים, כמו [adk],‏ [a2a],‏ [agent_engines],‏ [langchain],‏ [ag2],‏ [llama_index],‏ [evaluation],‏ [bigquery],‏ [live] ו-[all].

מה לא מושפע

יש תמיכה מלאה בממשק הקלאסי של למידת המכונה (מערכי נתונים, אימון, מודלים, חיזוי, מעקב, צינורות עיבוד נתונים), הוא לא מושפע מהשינויים בגרסה 2.0.1 ואין לו מקבילה ב-Google Gen AI SDK. כדי להמשיך להשתמש בהערכה, ב-Agent Runtime, בהנחיות ובמיומנויות, צריך להתקין את google-cloud-aiplatform. ‫google-cloud-aiplatform ו-google-genai מתקיימים יחד באותה סביבה, ו-google-genai הוא עכשיו תלות קשיחה של google-cloud-aiplatform:

import agentplatform

client = agentplatform.Client(project="my-project", location="global")
# client.evals                  client.prompts
# client.prompt_optimizer client.datasets           client.skills

‫vertexai.batch_prediction לא הוצא משימוש, אבל יש כלי מקביל ב-Google Gen AI SDK ומומלץ להשתמש בו.

העברת מודולים של AI גנרטיבי ל-Google Gen AI SDK

אם אתם משתמשים במודולים של AI גנרטיבי בחבילה google-cloud-aiplatform, כדאי לפעול לפי ההמלצות הבאות כדי לעבור ל-Google Gen AI SDK‏ (google-genai):

  1. צריך להגדיר את google-cloud-aiplatform < 2.0.0 כדי ששינויים לא קשורים ביחסי התלות לא יסירו את המודולים שמתחת.

  2. מחפשים בקוד את המודולים שהוצאו משימוש:

    • vertexai.generative_models
    • vertexai.language_models
    • vertexai.vision_models
    • vertexai.caching
    • vertexai.tuning

    אם מייבאים אחד ממודולי Python המושפעים, מקבלים את אזהרת ההוצאה משימוש הבאה:

    UserWarning: This feature is deprecated as of June 24, 2025 and will be removed on
    June 24, 2026. For details, see
    https://cloud.google.com/vertex-ai/generative-ai/docs/deprecations/genai-vertexai-sdk.
    

    מריצים את חבילת המקרים לבדיקה עם -W error::UserWarning כדי לזהות ייבואים שפספסתם.

  3. מחליפים את vertexai.init(...) ב-genai.Client(enterprise=True, project=..., location=...) מפורש. אם אתם משתמשים גם בממשק הקלאסי של למידת המכונה, כדאי להשאיר את vertexai.init().

    לפני

    # pip install google-cloud-aiplatform
    
    import vertexai
    from vertexai.generative_models import GenerativeModel
    
    vertexai.init(project="my-project", location="us-central1")
    
    # Model identity and config are bound at construction time.
    model = GenerativeModel("gemini-2.5-flash")
    

    אחרי

    # pip install google-genai
    
    from google import genai
    from google.genai import types
    
    client = genai.Client(
        enterprise=True,
        project="my-project",
        location="global",
    )
    

    או להגדיר מהסביבה:

    export GOOGLE_GENAI_USE_ENTERPRISE=true
    export GOOGLE_CLOUD_PROJECT=my-project
    export GOOGLE_CLOUD_LOCATION=global
    
    from google import genai
    
    client = genai.Client()
    

    נקודות מרכזיות:

    • המצב הגלובלי הופך ללקוח מפורש. ‫vertexai.init() מגדיר את כל התהליך, ו-genai.Client() הוא אובייקט שמעבירים. ב-genai.Client(), אתם יכולים להשתמש בשני פרויקטים או אזורים בתהליך אחד.
    • השדה enterprise=True הוא שדה חובה. אם לא תציינו את זה, הלקוח יטרגט את Gemini Developer API בלי להודיע, ואז ייכשל ב-Application Default Credentials או ידרוש מפתח API.
    • שם המודל עובר מהבנייה לכל קריאה. אין אובייקט מודל של קישור חד-פעמי. ‫model= הוא ארגומנט מילת מפתח נדרש בכל קריאה ל-client.models.*.
    • האימות לא משתנה. פרטי הכניסה של ברירת המחדל של האפליקציה עדיין חלים, ו-credentials= מקבל google.auth.credentials.Credentials בשני ערכות ה-SDK.
    • ב-vertexai.init() היו גם הגדרות לא גנרטיביות כמו staging_bucket,‏ experiment,‏ encryption_spec_key_name,‏ service_account,‏ network. ל-genai.Client אין מקבילה להם.
    • האיות החדש יותר enterprise=True מקובל החל מגרסה 2.20.0 של google-genai, אבל הגרסה הישנה יותר vertexai=True פועלת בכל גרסה והיא הבחירה הבטוחה יותר.
  4. בודקים את הקוד כדי לזהות שינויים שקטים שבהם ההתנהגות משתנה בלי שגיאה. הם עוברים הידור ופועלים, אבל המשמעות שלהם משתנה.

    התנהגות לפני אחרי
    response.text בתשובה חסומה או ריקה הערך עולה ב-ValueError האפליקציה מחזירה את הערך None
    ‫response.text עם כמה מועמדים הערך עולה ב-ValueError מתעדת אזהרה ומחזירה את המועמד הראשון
    טירגוט לפי לקוח ‫vertexai.init() implied Agent Platform אם משמיטים את vertexai=True, המערכת מטרגטת באופן אוטומטי את Gemini Developer API
    הטמעות auto_truncate ברירת המחדל היא True לא מוגדר; חלה ברירת המחדל של השרת
    פונקציית Python שמועברת ככלי לא נתמך מופעלת באופן אוטומטי על ידי ה-SDK
    system_instruction המודל קשור פעם אחת צריך להעביר אותו בכל קריאה

    השינוי ב-response.text הוא השינוי הראשון שצריך לחפש. כל try/except ValueError שעוטף את .text הופך לקוד מת, וכל .text לא מוגן יכול עכשיו להניב None במקום שבו הוחזר בעבר str:

    if response.text is None:
        print(
            "blocked or empty:",
            response.prompt_feedback,
            response.candidates[0].finish_reason if response.candidates else None,
        )
    
  5. אם אתם משתמשים בהערכה, ב-Agent Runtime, בהנחיות, במערכי נתונים, במיומנויות ובכל הממשק הקלאסי של למידת המכונה, השאירו את google-cloud-aiplatform מותקן.

  6. משנים את הקריאות לגרסאות החדשות. מתחילים בשינוי שמות מכני, ואז ממשיכים לאיחוד config=.

שינויים בשיחות שמבוססות על משימות

השינויים בקריאות לפי המשימה:

יצירת טקסט

במשימות של יצירת טקסט, כל הארגומנטים הם מילות מפתח בלבד. קריאות לפי מיקום מעלות את TypeError.

לפני

model = GenerativeModel("gemini-2.5-flash")

response = model.generate_content("Why is the sky blue?")
print(response.text)

אחרי

response = client.models.generate_content(
    model="gemini-3.5-flash",
    contents="Why is the sky blue?",
)
print(response.text)

יצירת סטרימינג

במשימות של יצירת סטרימינג, הדגל stream=True מוסר. הסטרימינג הוא עכשיו שיטה נפרדת שמחזירה את Iterator[types.GenerateContentResponse]. כדאי להשתמש ב-if chunk.text: כדי לבדוק לפני שניגשים לטקסט, כי כל קטע הוא אובייקט תשובה מלא והמאפיין .text שלו יכול לפעמים להיות None.

לפני

stream = model.generate_content("Tell me a story in 300 words.", stream=True)
for chunk in stream:
    print(chunk.text, end="")

אחרי

for chunk in client.models.generate_content_stream(
    model="gemini-3.5-flash",
    contents="Tell me a story in 300 words.",
):
    if chunk.text:
        print(chunk.text, end="")

יצירה אסינכרונית

במשימות אסינכרוניות של יצירת תוכן, הסיומת _async של שם ה-method הוסרה. כל קריאה אסינכרונית נמצאת ב-client.aio.<module> עם אותו שם שיטה כמו המקבילה הסינכרונית שלה. סוגרים את הלקוח באמצעות await client.aio.aclose(), או משתמשים ב-async with genai.Client(...).aio as aclient:.

לפני

response = await model.generate_content_async("Why is the sky blue?")

async_stream = await model.generate_content_async("Why is the sky blue?", stream=True)
async for chunk in async_stream:
    print(chunk.text, end="")

אחרי

response = await client.aio.models.generate_content(
    model="gemini-3.5-flash",
    contents="Why is the sky blue?",
)

# Note the `await` in front of the async iterator.
async for chunk in await client.aio.models.generate_content_stream(
    model="gemini-3.5-flash",
    contents="Tell me a story in 300 words.",
):
    print(chunk.text, end="")

שיחות צ'אט

שימו לב לשינויים הבאים במשימות שנוצרות משיחות בצ'אט:

  • השיחות נוצרות מהלקוח, ולא מאובייקט מודל.
  • ‫chat.history (מאפיין) הופך ל-chat.get_history() (שיטה). השיטה החדשה נמשכת curated: bool = False. העברת True מחזירה רק את התורות שנשמרו, ואין לזה מקבילה ישנה.
  • ‫client.aio.chats.create(...) מחזיר AsyncChat ישירות. רק send_message ו-send_message_stream ממתינים.
  • האפשרויות לכל פנייה מכווצות לארגומנט אחד: send_message(message, config=types.GenerateContentConfig(...)). השם של הפרמטר הראשון גם השתנה מ-content ל-message.
  • ‫start_chat(response_validation=False) היא שיטה חדשה שאין לה מקבילה בגרסאות קודמות.

לפני

model = GenerativeModel("gemini-2.5-flash")
chat = model.start_chat()

print(chat.send_message("Tell me a story").text)

for content in chat.history:
    print(content.role, content.parts)

אחרי

chat = client.chats.create(model="gemini-3.5-flash")

print(chat.send_message("Tell me a story").text)

for content in chat.get_history():
    print(content.role, content.parts)

הגדרות, הגדרות בטיחות והוראות מערכת

שימו לב לשינויים הבאים במשימות שקשורות להגדרות, להגדרות הבטיחות ולהוראות המערכת:

  • הארגומנטים הבאים מכווצים ל-config= אחד כשדות של GenerateContentConfig:

    • generation_config
    • safety_settings
    • tools
    • tool_config
    • labels
    • system_instruction

    אפשר להשתמש ב-dict פשוט בכל מקום שבו אפשר להשתמש בסוג הגדרה.

  • הפרמטר system_instruction עובר מה-constructor של המודל להגדרה לכל קריאה. בגרסה הקודמת של ה-SDK, הערך של system_instruction הוגדר פעם אחת במהלך היצירה של GenerativeModel. עכשיו צריך להעביר את system_instruction בכל קריאה או לכלול אותו ב-client.chats.create(config=...).

  • הגדרות הבטיחות משתנות מ-dict ל-list. לדוגמה, [types.SafetySetting(category=c, threshold=t) for c, t in old_dict.items()].

  • ערכי Enums מתקבלים כמחרוזות פשוטות ומומרים.

  • שמות השדות הסקלריים לא משתנים: temperature,‏ top_p,‏ top_k,‏ candidate_count,‏ max_output_tokens,‏ stop_sequences,‏ presence_penalty,‏ frequency_penalty,‏ seed,‏ response_mime_type,‏ response_schema,‏ response_logprobs,‏ logprobs.

  • השדות החדשים שאין להם שדה מקביל ישן כוללים את thinking_config, cached_content, automatic_function_calling, http_options, media_resolution ו-speech_config.

לפני

from vertexai.generative_models import (
    GenerativeModel, GenerationConfig, HarmCategory, HarmBlockThreshold,
)

model = GenerativeModel(
    "gemini-2.5-flash",
    system_instruction=["Talk like a pirate.", "Don't use rude words."],
)

response = model.generate_content(
    contents="Why is the sky blue?",
    generation_config=GenerationConfig(temperature=0, top_p=0.95, max_output_tokens=100),
    safety_settings={
        HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
        HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_ONLY_HIGH,
    },
)

אחרי

from google.genai import types

response = client.models.generate_content(
    model="gemini-3.5-flash",
    contents="Why is the sky blue?",
    config=types.GenerateContentConfig(
      system_instruction="Talk like a pirate. Don't use rude words.",
      temperature=0,
      top_p=0.95,
      max_output_tokens=100,
      safety_settings=[
          types.SafetySetting(
              category="HARM_CATEGORY_HATE_SPEECH",
              threshold="BLOCK_MEDIUM_AND_ABOVE",
          ),
          types.SafetySetting(
              category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
              threshold=types.HarmBlockThreshold.BLOCK_ONLY_HIGH,
          ),
      ],
    ),
)

קלט מולטי-מודאלי

שימו לב לשינויים הבאים במשימות עם קלט מולטימודלי:

ישן חדש
‫Part.from_uri(uri, mime_type), מותר לפי מיקום ‫Part.from_uri(file_uri=, mime_type=), מילת מפתח בלבד, השם של הפרמטר השתנה
Part.from_data(data, mime_type) ‫Part.from_bytes(data=, mime_type=), השם של אמצעי התשלום שונה
Part.from_text(text) ‫Part.from_text(text=), מילת מפתח בלבד
Image.load_from_file(path) אין מקבילה; פותחים את הקובץ ומשתמשים ב-Part.from_bytes
  • הפרמטר mime_type הוא אופציונלי ב-types.Part.from_uri() (מזוהה בצד השרת), אבל הוא עדיין נדרש ב-types.Part.from_bytes().
  • ‫client.files.upload(...) נתמך רק ב-Gemini Developer API. בעומסי עבודה של Agent Platform, ממשיכים להעביר מזהי URI של Cloud Storage באמצעות from_uri או בייטים מוטבעים באמצעות from_bytes.

לפני

from vertexai.generative_models import GenerativeModel, Part, Image

image = Image.load_from_file("image.jpg")
print(model.generate_content(["What is shown in this image?", image]).text)

image_part = Part.from_uri(
    "gs://cloud-samples-data/generative-ai/image/scones.jpg",
    mime_type="image/jpeg",
)

אחרי

from google.genai import types

# Image.load_from_file has no equivalent: read the bytes yourself.
with open("image.jpg", "rb") as f:
    image = types.Part.from_bytes(data=f.read(), mime_type="image/jpeg")

response = client.models.generate_content(
    model="gemini-3.5-flash",
    contents=["What is shown in this image?", image],
)

image_part = types.Part.from_uri(
    file_uri="gs://cloud-samples-data/generative-ai/image/scones.jpg",
    mime_type="image/jpeg",
)

קריאה להפעלת פונקציות ועיגון

שימו לב לשינויים הבאים במשימות של קריאה להפעלת פונקציות וביסוס:

  • הכלים עוברים אל config=. אין ארגומנט tools= בקריאה או באובייקט של מודל.
  • ‫Tool.from_google_search_retrieval(grounding.GoogleSearchRetrieval()) הופך ל-types.Tool(google_search=types.GoogleSearch()). שיטת Factory הופכת לשדה רגיל. ב-types.Tool יש גם שדה google_search_retrieval נפרד.
  • ‫response.function_calls הוא ה-accessor האידיומטי והוא לא נכשל כשחלק אפס הוא טקסט. המעבר הישן עדיין פועל.
  • סכימת ה-JSON הגולמית מצוינת ב-parameters_json_schema. הערך של types.Schema מצוין ב-parameters.
  • עכשיו אתם יכולים להעביר פונקציית Python ככלי, וקריאה להפעלת פונקציות אוטומטית מופעלת כברירת מחדל כשאתם מעבירים את הפונקציה. אם אתם מעבירים לולאת כלים ידנית ומעבירים אובייקט פונקציה, ה-SDK מתחיל להריץ את הקוד שלכם. משביתים את הקריאה האוטומטית לפונקציות שמוגדרת כברירת מחדל באמצעות automatic_function_calling=types.AutomaticFunctionCallingConfig(disable=True).
  • לסוגי הכלים החדשים הבאים אין מקבילה בגרסאות קודמות: code_execution,‏ url_context,‏ google_maps,‏ computer_use,‏ file_search,‏ enterprise_web_search,‏ mcp_servers.

לפני

from vertexai.generative_models import GenerativeModel, FunctionDeclaration, Tool, grounding

weather_tool = Tool(function_declarations=[
    FunctionDeclaration(
        name="get_current_weather",
        description="Get the current weather in a given location",
        parameters={
            "type": "object",
            "properties": {"location": {"type": "string"}},
            "required": ["location"],
        },
    )
])

model = GenerativeModel("gemini-2.5-flash", tools=[weather_tool])
response = model.generate_content("What is the weather in Boston?")
call = response.candidates[0].content.parts[0].function_call

# Grounding
search_tool = Tool.from_google_search_retrieval(grounding.GoogleSearchRetrieval())

אחרי

from google.genai import types

weather_tool = types.Tool(function_declarations=[
    types.FunctionDeclaration(
        name="get_current_weather",
        description="Get the current weather in a given location",
        parameters_json_schema={
            "type": "object",
            "properties": {"location": {"type": "string"}},
            "required": ["location"],
        },
    )
])

response = client.models.generate_content(
    model="gemini-3.5-flash",
    contents="What is the weather in Boston?",
    config=types.GenerateContentConfig(tools=[weather_tool]),
)
call = response.function_calls[0]

# Grounding
search_tool = types.Tool(google_search=types.GoogleSearch())

הטמעות

שימו לב לשינויים הבאים בהטמעת משימות:

  • האפשרות TextEmbeddingInput הוסרה. הפרמטרים task_type ו-title מוגדרים עכשיו לכל בקשה, ולכן צריך לפצל קבוצות של משימות מעורבות לכמה קריאות.
  • סוג ההחזרה השתנה מרשימה ישירה לאובייקט תגובה. ‫get_embeddings() החזיר ישירות list[TextEmbedding], כך שהמתקשרים הוסיפו את הרשימה לאינדקס ישירות (embeddings[0].values). בגרסה החדשה, embed_content() מחזיר אובייקט EmbedContentResponse שמכיל רשימת .embeddings, ולכן צריך לגשת אל response.embeddings[0].values. שדות ההטמעה הנפרדים (.values ו-.statistics) שומרים על השמות המקוריים שלהם.
  • auto_truncate כבר לא מוגדר כברירת המחדל של True. ברירת המחדל של השדה החדש היא unset. אם אתם מסתמכים על חיתוך שקט של קלט ארוך מדי, הגדירו את auto_truncate באופן מפורש.

לפני

from vertexai.language_models import TextEmbeddingModel, TextEmbeddingInput

model = TextEmbeddingModel.from_pretrained("gemini-embedding-001")

text_input = TextEmbeddingInput(
    text="How do I get a driver's license?",
    task_type="RETRIEVAL_DOCUMENT",   # per input
    title="Driver's License",         # per input
)

embeddings = model.get_embeddings([text_input], output_dimensionality=3072, auto_truncate=True)
print(embeddings[0].values)

אחרי

from google.genai import types

response = client.models.embed_content(
    model="gemini-embedding-2",
    contents="How do I get a driver's license?",
    config=types.EmbedContentConfig(
        task_type="RETRIEVAL_DOCUMENT",   # now per request
        title="Driver's License",         # now per request
        output_dimensionality=3072,
        auto_truncate=True,
    ),
)
print(response.embeddings[0].values)

ספירת טוקנים

שימו לב לשינויים הבאים במשימות של ספירת טוקנים:

  • האפשרות total_billable_characters הוסרה ואין לה תחליף. כל אומדן עלות שמבוסס על total_billable_characters צריך לעבור עיבוד מחדש (לדוגמה, בהשוואה ל-total_tokens או ל-response.usage_metadata) מקריאה ליצירת תוכן.
  • נוסף client.models.compute_tokens(...) למזהי טוקנים ולחלקי מחרוזות.
  • הספירה אופליין נוספה דרך google.genai.local_tokenizer.LocalTokenizer.

לפני

model = GenerativeModel("gemini-2.5-flash")

response = model.count_tokens(["Why is the sky blue?"])
print(response.total_tokens)
print(response.total_billable_characters)

אחרי

response = client.models.count_tokens(
    model="gemini-3.5-flash",
    contents=["Why is the sky blue?"],
)
print(response.total_tokens)
print(response.cached_content_token_count)

שמירת הקשר במטמון

שימו לב לשינויים הבאים במשימות של שמירת הקשר במטמון:

  • הפונקציה ttl משנה את הסוג מ-datetime.timedelta למחרוזת משך זמן כמו "86400s".
  • השיטות של אובייקט המשאב הופכות לקריאות למודול הלקוח.
  • הפונקציה update מחזירה אובייקט חדש במקום לשנות את האובייקט הקיים.

לפני

import datetime
from vertexai.caching import CachedContent

cache = CachedContent.create(
    model_name="gemini-2.5-flash",
    system_instruction="Please answer my question formally",
    contents=contents,
    ttl=datetime.timedelta(days=1),
)
cache.update(ttl=datetime.timedelta(days=2))
cache.delete()

אחרי

from google.genai import types

cache = client.caches.create(
    model="gemini-3.5-flash",
    config=types.CreateCachedContentConfig(
        contents=contents,
        system_instruction="Please answer my question formally",
        ttl="86400s",
    ),
)
cache = client.caches.update(
    name=cache.name, config=types.UpdateCachedContentConfig(ttl="172800s")
)
client.caches.delete(name=cache.name)

חיזוי וכוונון באצווה

שימו לב לשינויים הבאים במשימות של חיזוי באצווה וכוונון:

  • הסקרים מבוססים על קישור מחדש, ולא על שינוי במקום. אין job.refresh() ואין job.has_ended. אחזור של אובייקט חדש מ-client.batches.get(name=...) והשוואה של job.state למחרוזות של JOB_STATE_*.
  • שינוי שמות של קבוצות: source_model ל-model, input_dataset ל-src, output_uri_prefix ל-config.dest, job_display_name ל-config.display_name.
  • אמצעי הבקרה של Batch machine-shape הוסרו ואין להם מקבילה בגרסת ה-SDK החדשה. ‫machine_type, ‏accelerator_type, ‏accelerator_count, ‏starting_replica_count ו-max_replica_count הם כבר לא שדות של CreateBatchJobConfig.
  • השמות של השיטות הבאות השתנו:
    • sft.train עד client.tunings.tune
    • source_model עד base_model
    • train_dataset עד training_dataset
    • epochs עד epoch_count
  • קבוצות הנתונים לכוונון עטופות. מחרוזת "gs://..." פשוטה הופכת ל-types.TuningDataset(gcs_uri=...).
  • השדה adapter_size משתנה מ-int למחרוזת enum כמו "ADAPTER_SIZE_FOUR".

לפני

from vertexai.batch_prediction import BatchPredictionJob
from vertexai.tuning import sft

job = BatchPredictionJob.submit(
    source_model="gemini-2.5-flash",
    input_dataset="bq://my-project.my-dataset.my-table",
    output_uri_prefix="bq://my-project.my-dataset.output",
)
while not job.has_ended:
    job.refresh()

tuning_job = sft.train(
    source_model="gemini-2.5-flash",
    train_dataset="gs://bucket/train.jsonl",
    epochs=1,
    adapter_size=4,
)

אחרי

from google.genai import types

job = client.batches.create(
    model="gemini-3.5-flash",
    src="bq://my-project.my-dataset.my-table",
    config=types.CreateBatchJobConfig(dest="bq://my-project.my-dataset.output"),
)
completed = {"JOB_STATE_SUCCEEDED", "JOB_STATE_FAILED", "JOB_STATE_CANCELLED", "JOB_STATE_PAUSED"}
while job.state not in completed:
    job = client.batches.get(name=job.name)

tuning_job = client.tunings.tune(
    base_model="gemini-3.5-flash",
    training_dataset=types.TuningDataset(gcs_uri="gs://bucket/train.jsonl"),
    config=types.CreateTuningJobConfig(
        epoch_count=1,
        adapter_size="ADAPTER_SIZE_FOUR",
    ),
)

שינוי המבנה של Agent Platform SDK

אם אתם משתמשים במודולים של agentplatform ב-google-cloud-aiplatform, כדאי לפעול לפי ההמלצות הבאות כדי לעבור למבנה החדש של ה-SDK:

  1. ‫google-cloud-agentplatform הוא עכשיו הפצה קלה ועצמאית, וההתקנה המומלצת לעומסי עבודה של סוכנים. אם אין לך צורך בממשק הקלאסי של למידת המכונה, צריך להחליף את ההתקנה מ-pip install google-cloud-aiplatform ל-pip install google-cloud-agentplatform.

  2. אתם יכולים להיעזר בטבלה הבאה כדי לעדכן את הייבוא ואת נתיבי המאפיינים:

    הקודם חדש
    client.agent_engines.create client.runtimes.create (פריסת מופע של Agent Runtime ב-Gemini Enterprise Agent Platform, שמספק סשנים מובנים של Agent Platform, הרצת קוד בארגז חול והגדרת זיכרון הקשר)
    client.memory_banks.create (יצירת משאבים נפרדים של Agent Platform Memory Bank כדי לשמור, לנהל ולאחזר זיכרונות מאינטראקציות שונות)
    client.agent_engines.sandboxes client.sandboxes
    client.agent_engines.sandboxes.snapshots client.sandboxes.snapshots
    client.agent_engines.sandboxes.templates client.sandboxes.templates
    client.agent_engines.sessions client.sessions
    client.agent_engines.sessions.events client.sessions.events
    client.agent_engines.runtimes.revisions client.runtimes.revisions
    client.agent_engines.memories client.memory_banks.memories
    agentplatform.agent_engines.templates agentplatform.frameworks
  3. המאתחל הגלובלי הוסר, ומסגרות הסוכנים כבר לא קוראות את הפרויקט והמיקום מהמצב aiplatform.init() או vertexai.init(). החלפת הגדרות שנגזרות מהמאתחל במשתני סביבה לכל מה שפועל בתוך מסגרת של סוכן. קוד שמסתמך על המאתחל כדי להגדיר סוכנים שנפרסו נכשל באופן שקט במקום להציג שגיאה.

  4. צריך לעדכן את evals.run_inference(agent=...) אתרי הקריאה כדי להעביר את types.Runtime, כי ה-SDK כבר לא מקבל את types.AgentEngine.

  5. מבצעים את השינויים הבאים:

    • vertexai.Client עד agentplatform.Client
    • vertexai.rag עד agentplatform.Client().rag

    ‫vertexai.Client פולט FutureWarning בהפעלה הראשונה:

    The vertexai.Client class is deprecated. Please use agentplatform.Client instead.
    

    ‫vertexai.rag פולט UserWarning בזמן הייבוא של המודול, ולא בזמן הקריאה. עוברים אל:

    import agentplatform
    
    client = agentplatform.Client(project="your-project", location="global")
    client.rag.create_corpus(...)
    
  6. עדכון הטיפול בשגיאות סביב AdkApp וקריאות לסשנים. בשיטות של סשנים סינכרוניים ובהפעלות של סוכנים בסטרימינג, עכשיו מוצגת השגיאה הבסיסית ב-API. קריאות שמקבלות שגיאה גנרית עטופה לא תואמות יותר. מחליפים את ה-catch של חריגות גנריות של wrapper בספרייה ב-google.api_core.exceptions.GoogleAPICallError (או בשגיאות סטטוס ספציפיות כמו ResourceExhausted ו-NotFound).

  7. צריך לעדכן את הגורמים שמבצעים קריאות ללקוח או את התוכנה המתווכת כך שיכללו את טוקן הגישה של המשתמש ב-OAuth בכל בקשה, כי הטוקנים הם זמניים ולא נשמרים במצב הסשן. חשוב לוודא שרענון הטוקן מנוהל בצד הלקוח.

  8. חשוב לשים לב שהמודול a2a.tasks הוסר בלי תחליף.