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

החבילה google-cloud-aiplatform כוללת גם את AI Platform SDK ל-Python וגם את ספריית הלקוח של Python ל-Gemini Enterprise Agent Platform. בדף הזה מפורטות הקטגוריות הבאות של שינויים בחבילה 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.

  • שינוי במבנה של Agent surface: בוצעו השינויים הבאים במודולים 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 הוא שדה חובה. אם לא מציינים את ה-API, הלקוח מכוון בשקט אל Gemini Developer API, ואז נכשל ב-Application Default Credentials או דורש מפתח API.
    • שם הדגם עובר משלב הפיתוח לכל שיחה. אין אובייקט מודל של bind-once. ‫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 מתקבל החל מגרסה google-genai 2.20.0, אבל הגרסה הישנה יותר vertexai=True פועלת בכל גרסה והיא הבחירה הבטוחה יותר.
  4. בודקים את הקוד כדי לזהות שינויים שקורים בלי שגיאה, אבל משנים את ההתנהגות של האתר. הן עוברות קומפילציה ופועלות, אבל המשמעות שלהן משתנה.

    התנהגות לפני אחרי
    response.text בתשובה חסומה או ריקה העלאה של ValueError החזרה None
    response.text עם כמה מועמדים העלאה של ValueError מתעד אזהרה, מחזיר את המועמד הראשון
    טירגוט לקוחות vertexai.init() 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. מומלץ להשאיר את google-cloud-aiplatform מותקן אם אתם משתמשים בהערכה, ב-Agent Runtime, בהנחיות, במערכי נתונים, במיומנויות ובכל הממשק הקלאסי של למידת מכונה.

  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-name הוסרה. כל קריאה אסינכרונית נמצאת ב-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 (property) הופך ל-chat.get_history() (method). השיטה החדשה אורכת 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 עובר מהבנאי של המודל להגדרה לכל קריאה. בגרסה הקודמת של ה-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=), keyword-only, parameter renamed
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 הוא פונקציית הגישה האידיומטית, והוא לא נכשל אם החלק האפס הוא טקסט. המעבר הישן עדיין פועל.
  • סכימת 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.
  • הוסרו פקדים של צורות מכונה באצווה, ואין להם מקבילה בגרסת ה-SDK החדשה. השדות machine_type,‏ accelerator_type,‏ accelerator_count,‏ starting_replica_count ו-max_replica_count כבר לא שייכים ל-CreateBatchJobConfig.
  • השמות של ה-methods הבאות שונו:
    • 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 (Deploy an Agent Runtime on Gemini Enterprise Agent Platform instance, which provides built-in Sessions, Sandbox code execution, and context memory configuration)
    client.memory_banks.create (Create standalone Memory Bank resources for persisting, managing, and retrieving memories across interactions)
    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(). החלפת הגדרות שמקורן בפונקציית אתחול במשתני סביבה לכל מה שפועל במסגרת סוכן. קוד שמסתמך על הפונקציה initializer כדי להגדיר סוכנים שנפרסו נכשל בשקט במקום להציג שגיאה.

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

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

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

    vertexai.Client emits a FutureWarning on first instantiation:

    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 הבסיסית. מתקשרים שמקבלים שגיאה כללית עטופה כבר לא תואמים. מחליפים את ה-catches של חריגים גנריים של עטיפת ספריות ב-google.api_core.exceptions.GoogleAPICallError (או בשגיאות סטטוס ספציפיות כמו ResourceExhausted ו-NotFound).

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

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