O pacote google-cloud-aiplatform inclui o SDK do AI Platform para Python e a biblioteca de cliente Python da Gemini Enterprise Agent Platform. Esta página aborda as seguintes categorias de mudanças no pacote google-cloud-aiplatform:
Os módulos de IA generativa são movidos para o SDK de IA Generativa do Google: os seguintes módulos de IA generativa no pacote
vertexaiforam descontinuados e migrados para o SDK de IA Generativa do Google (google-genai):vertexai.generative_modelsvertexai.language_modelsvertexai.vision_modelsvertexai.cachingvertexai.tuning
Para saber como migrar os módulos descontinuados para o SDK de IA generativa do Google, consulte Migrar módulos de IA generativa para o SDK de IA generativa do Google.
Reestruturação da interface do agente:as seguintes mudanças foram feitas nos módulos
agentplatformdogoogle-cloud-aiplatform:- Renomeações
- Promoções para o nível superior
- Remoção do inicializador global
Para saber como migrar para a nova estrutura do SDK, consulte Reestruturação do SDK da Agent Platform.
Desacoplamento de
agentplatform:google-cloud-agentplatformagora é uma distribuição independente e leve, além de ser a instalação recomendada para cargas de trabalho do agente. Se você só criar agentes, instale ogoogle-cloud-agentplatform, que não contém módulos de IA generativa. Os módulosagentplatformabrangem as integrações comuns, como[adk],[a2a],[agent_engines],[langchain],[ag2],[llama_index],[evaluation],[bigquery],[live]e[all].
O que não será afetado
A plataforma clássica de aprendizado de máquina (conjuntos de dados, treinamento, modelos, previsão, rastreamento, pipelines) tem suporte total, não é afetada pelas mudanças da versão 2.0.1 e não tem equivalente no SDK de IA generativa do Google. Você ainda pode acessar a avaliação, o Agent Runtime, os comandos e as habilidades instalando o google-cloud-aiplatform. google-cloud-aiplatform e google-genai coexistem em um ambiente, e google-genai agora é uma dependência rígida de 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 não está descontinuado, mas existe um equivalente no SDK de IA generativa do Google, que é a ferramenta recomendada.
Como mover módulos de IA generativa para o SDK de IA generativa do Google
Se você usa os módulos de IA generativa no pacote google-cloud-aiplatform, siga estas recomendações para migrar para o SDK de IA Generativa do Google (google-genai):
Defina
google-cloud-aiplatform < 2.0.0para que aumentos de dependências não relacionadas não possam remover os módulos abaixo de você.Procure os módulos descontinuados no seu código:
vertexai.generative_modelsvertexai.language_modelsvertexai.vision_modelsvertexai.cachingvertexai.tuning
Se você importar algum dos módulos Python afetados, vai receber o seguinte aviso de descontinuação:
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.Execute o conjunto de testes com
-W error::UserWarningpara detectar importações que você perdeu.Substitua
vertexai.init(...)por umgenai.Client(enterprise=True, project=..., location=...)explícito. Mantenhavertexai.init()se você também usa a interface clássica de machine learning.Antes
# 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")Depois
# pip install google-genai from google import genai from google.genai import types client = genai.Client( enterprise=True, project="my-project", location="global", )Ou configure no ambiente:
export GOOGLE_GENAI_USE_ENTERPRISE=true export GOOGLE_CLOUD_PROJECT=my-project export GOOGLE_CLOUD_LOCATION=globalfrom google import genai client = genai.Client()Principais considerações:
- O estado global se torna um cliente explícito.
vertexai.init()configurou todo o processo;genai.Client()é um objeto que você transmite. Com ogenai.Client(), é possível usar dois projetos ou regiões em um processo. enterprise=Trueé obrigatório. Se você omitir esse parâmetro, o cliente vai direcionar silenciosamente a API Gemini Developer, que vai falhar nas credenciais padrão do aplicativo ou exigir uma chave de API.- O nome do modelo passa da construção para cada chamada. Não há um objeto de modelo de vinculação única.
model=é um argumento de palavra-chave obrigatório em cada chamadaclient.models.*. - A autenticação não foi alterada. As credenciais padrão do aplicativo ainda são válidas, e o
credentials=aceita umgoogle.auth.credentials.Credentialsnos dois SDKs. - O
vertexai.init()também tinha configurações não generativas, comostaging_bucket,experiment,encryption_spec_key_name,service_accountenetwork.genai.Clientnão tem um equivalente para eles. - A grafia mais recente
enterprise=Trueé aceita a partir da versão 2.20.0 dogoogle-genai, mas a versão mais antigavertexai=Truefunciona em todas as versões e é a opção mais segura.
- O estado global se torna um cliente explícito.
Audite seu código para mudanças silenciosas em que o comportamento diverge sem um erro. Elas compilam e são executadas, mas mudam de significado.
Comportamento Antes Depois response.textem uma resposta bloqueada ou vaziaGera ValueErrorRetorna Noneresponse.textcom vários candidatosGera ValueErrorRegistra um aviso e retorna o primeiro candidato. Segmentação por cliente vertexai.init()Agent Platform implícitaOmitir vertexai=Truesilenciosamente tem como destino a API Gemini DeveloperEmbeddings auto_truncateO valor padrão é True.Não definido; o padrão do servidor é aplicado Uma função Python transmitida como uma ferramenta Sem suporte Executado automaticamente pelo SDK system_instructionVinculado uma vez ao modelo Precisa ser transmitido em todas as chamadas A mudança
response.texté a primeira a ser pesquisada. Todotry/except ValueErrorenvolvido em.textse torna código morto, e todo.textsem proteção agora pode gerarNone, em vez de umstr, como acontecia antes:if response.text is None: print( "blocked or empty:", response.prompt_feedback, response.candidates[0].finish_reason if response.candidates else None, )Mantenha o
google-cloud-aiplatforminstalado se você usa avaliação, Agent Runtime, comandos, conjuntos de dados, habilidades e toda a superfície clássica de aprendizado de máquina.Mude as chamadas para as novas versões. Comece com renomeações mecânicas e continue com a consolidação de
config=.
Mudanças nas chamadas com base em tarefas
Confira as chamadas alteradas com base na tarefa:
- Geração de texto
- Geração de streaming
- Geração assíncrona
- Sessões de chat
- Configuração, configurações de segurança e instruções do sistema
- Entrada multimodal
- Chamada de função e embasamento
- Embeddings
- Contagem de tokens
- Cache de contexto
- Previsão e ajuste em lote
Geração de texto
Para tarefas de geração de texto, todos os argumentos são somente palavras-chave. Chamadas posicionais geram TypeError.
Antes
model = GenerativeModel("gemini-2.5-flash")
response = model.generate_content("Why is the sky blue?")
print(response.text)
Depois
response = client.models.generate_content(
model="gemini-3.5-flash",
contents="Why is the sky blue?",
)
print(response.text)
Geração de streaming
Para tarefas de geração de streaming, a flag stream=True é removida. O streaming agora é um método separado que retorna Iterator[types.GenerateContentResponse]. Use if chunk.text: para verificar antes de acessar o texto, porque cada parte é um objeto de resposta completo, e o atributo .text às vezes pode ser None.
Antes
stream = model.generate_content("Tell me a story in 300 words.", stream=True)
for chunk in stream:
print(chunk.text, end="")
Depois
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="")
Geração assíncrona
Para tarefas de geração assíncronas, o sufixo "method-name" _async foi removido. Cada chamada assíncrona fica em client.aio.<module> com o mesmo nome de método da contraparte síncrona. Feche o cliente com await client.aio.aclose() ou use async with genai.Client(...).aio as aclient:.
Antes
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="")
Depois
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="")
Sessões de chat
Confira as seguintes mudanças nas tarefas de sessões de chat:
- Os chats são criados pelo cliente, não por um objeto de modelo.
chat.history(propriedade) se tornachat.get_history()(método). O novo método usacurated: bool = False. TransmitirTrueretorna apenas os turnos mantidos, que não têm um equivalente antigo.client.aio.chats.create(...)retorna umAsyncChatdiretamente. Somentesend_messageesend_message_streamsão aguardados.- As opções por turno são recolhidas em um argumento:
send_message(message, config=types.GenerateContentConfig(...)). O primeiro parâmetro também foi renomeado decontentparamessage. start_chat(response_validation=False)é um novo método sem equivalente em versões anteriores.
Antes
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)
Depois
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)
Configuração, configurações de segurança e instruções do sistema
Confira as seguintes mudanças nas tarefas de configuração, configurações de segurança e instruções do sistema:
Os argumentos a seguir são recolhidos em um
config=como campos deGenerateContentConfig:generation_configsafety_settingstoolstool_configlabelssystem_instruction
Um
dictsimples funciona em qualquer lugar que um tipo de configuração funcione.system_instructionpassa do construtor do modelo para a configuração por chamada. Na versão anterior do SDK,system_instructionera definido uma vez ao criarGenerativeModel. Agora,system_instructionprecisa ser transmitido em todas as chamadas ou incluído emclient.chats.create(config=...).As configurações de segurança mudam de
dictparalist. Por exemplo,[types.SafetySetting(category=c, threshold=t) for c, t in old_dict.items()].As enumerações são aceitas como strings simples e forçadas.
Os nomes de campos escalares não mudam:
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.Os novos campos sem equivalentes antigos incluem
thinking_config,cached_content,automatic_function_calling,http_options,media_resolutionespeech_config.
Antes
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,
},
)
Depois
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,
),
],
),
)
entrada multimodal
Confira as seguintes mudanças para tarefas de entrada multimodal:
| Antigo | Novo |
|---|---|
Part.from_uri(uri, mime_type), posicional permitida |
Part.from_uri(file_uri=, mime_type=), somente palavra-chave, parâmetro renomeado |
Part.from_data(data, mime_type) |
Part.from_bytes(data=, mime_type=), método renomeado |
Part.from_text(text) |
Part.from_text(text=), somente palavra-chave |
Image.load_from_file(path) |
Não há equivalente. Abra o arquivo e use Part.from_bytes. |
mime_typeé opcional emtypes.Part.from_uri()(inferido do lado do servidor), mas continua sendo obrigatório emtypes.Part.from_bytes().O
client.files.upload(...)só é compatível com a API Gemini Developer. Para cargas de trabalho da Agent Platform, continue transmitindo URIs do Cloud Storage usandofrom_uriou bytes inline usandofrom_bytes.
Antes
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",
)
Depois
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",
)
Chamada de função e embasamento
Confira as seguintes mudanças nas tarefas de chamada de função e embasamento:
- As ferramentas são movidas para
config=. Não há um argumentotools=na chamada ou em um objeto de modelo. Tool.from_google_search_retrieval(grounding.GoogleSearchRetrieval())se tornatypes.Tool(google_search=types.GoogleSearch()). Um método de fábrica se torna um campo simples.types.Tooltambém tem um campogoogle_search_retrievalseparado.response.function_callsé o acessador idiomático e não falha quando a parte zero é um texto. A travessia antiga ainda funciona.- O esquema JSON bruto é especificado em
parameters_json_schema. Umtypes.Schematipado é especificado emparameters. - Agora é possível transmitir uma função Python como uma ferramenta, e a chamada automática de função fica ativada por padrão quando você transmite a função. Se você portar um loop de ferramenta manual e transmitir um objeto de função, o SDK vai começar a executar seu código. Desative a chamada de função automática padrão com
automatic_function_calling=types.AutomaticFunctionCallingConfig(disable=True). Os seguintes tipos de ferramentas não têm equivalentes em versões anteriores:
code_execution,url_context,google_maps,computer_use,file_search,enterprise_web_search,mcp_servers.
Antes
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())
Depois
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())
Embeddings
Confira as seguintes mudanças para tarefas de incorporação:
TextEmbeddingInputfoi removido.task_typeetitleagora são por solicitação. Portanto, os lotes de tarefas mistas precisam ser divididos em várias chamadas.- O tipo de retorno mudou de uma lista direta para um objeto de resposta.
get_embeddings()retornava diretamente umlist[TextEmbedding], então os chamadores indexavam a lista diretamente (embeddings[0].values). Na nova versão,embed_content()retorna um objetoEmbedContentResponseque contém uma lista.embeddings, exigindo que você acesseresponse.embeddings[0].values. Os campos de incorporação individuais (.valuese.statistics) mantêm os nomes originais. O padrão de
auto_truncatenão é maisTrue. O novo campo temunsetcomo padrão. Se você depender do truncamento silencioso de entradas muito longas, definaauto_truncateexplicitamente.
Antes
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)
Depois
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)
Contagem de tokens
Confira as seguintes mudanças para tarefas de contagem de tokens:
total_billable_charactersfoi removido e não tem substituição. Qualquer estimativa de custo com base emtotal_billable_charactersprecisa ser reformulada (por exemplo, em relação atotal_tokensouresponse.usage_metadata) de uma chamada de geração.client.models.compute_tokens(...)foi adicionado para IDs de token e partes de string.A contagem off-line foi adicionada por
google.genai.local_tokenizer.LocalTokenizer.
Antes
model = GenerativeModel("gemini-2.5-flash")
response = model.count_tokens(["Why is the sky blue?"])
print(response.total_tokens)
print(response.total_billable_characters)
Depois
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)
O armazenamento em cache de contexto
Observe as seguintes mudanças nas tarefas de cache de contexto:
ttlmuda o tipo dedatetime.timedeltapara uma string de duração, como"86400s".- Os métodos de objeto de recurso se tornam chamadas de módulo do cliente.
updateretorna um novo objeto em vez de fazer mutações no local.
Antes
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()
Depois
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)
Predição em lote e ajuste
Confira as seguintes mudanças nas tarefas de previsão e ajuste em lote:
- A sondagem é baseada em vinculação, não no local. Não há
job.refresh()nemjob.has_ended. Busque um novo objeto declient.batches.get(name=...)e comparejob.statecom as stringsJOB_STATE_*. - Renomeações em lote:
source_modelparamodel,input_datasetparasrc,output_uri_prefixparaconfig.dest,job_display_nameparaconfig.display_name. - Os controles de forma de máquina em lote foram removidos e não têm equivalente na nova versão do SDK.
machine_type,accelerator_type,accelerator_count,starting_replica_countemax_replica_countnão são mais campos deCreateBatchJobConfig. - Os seguintes métodos foram renomeados:
sft.trainaclient.tunings.tune- De
source_modelparabase_model - De
train_datasetparatraining_dataset epochsaepoch_count
- Os conjuntos de dados de ajuste são encapsulados. Uma string
"gs://..."simples se tornatypes.TuningDataset(gcs_uri=...). adapter_sizemuda o tipo de umintpara uma string de enumeração, como"ADAPTER_SIZE_FOUR".
Antes
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,
)
Depois
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",
),
)
Reestruturação do SDK da Agent Platform
Se você usa os módulos agentplatform do google-cloud-aiplatform, siga estas recomendações para migrar para a nova estrutura do SDK:
O
google-cloud-agentplatformagora é uma distribuição independente e leve, além de ser a instalação recomendada para cargas de trabalho de agentes. Se você não precisar da interface clássica de aprendizado de máquina, mude a instalação depip install google-cloud-aiplatformparapip install google-cloud-agentplatform.Use a tabela a seguir para atualizar importações e caminhos de atributos:
Anterior Novo client.agent_engines.createclient.runtimes.create(Implante um ambiente de execução do agente em uma instância da Gemini Enterprise Agent Platform, que oferece sessões integradas, execução de código em sandbox e configuração de memória de contexto)
client.memory_banks.create(Crie recursos independentes do Memory Bank para persistir, gerenciar e recuperar memórias em várias interações)client.agent_engines.sandboxesclient.sandboxesclient.agent_engines.sandboxes.snapshotsclient.sandboxes.snapshotsclient.agent_engines.sandboxes.templatesclient.sandboxes.templatesclient.agent_engines.sessionsclient.sessionsclient.agent_engines.sessions.eventsclient.sessions.eventsclient.agent_engines.runtimes.revisionsclient.runtimes.revisionsclient.agent_engines.memoriesclient.memory_banks.memoriesagentplatform.agent_engines.templatesagentplatform.frameworksO inicializador global é removido, e os frameworks de agente não leem mais o projeto e o local do estado
aiplatform.init()ouvertexai.init(). Substitua a configuração derivada do inicializador por variáveis de ambiente para tudo o que estiver sendo executado em uma estrutura de agente. O código que depende do inicializador para configurar agentes implantados falha silenciosamente em vez de gerar um erro.Atualize os sites de chamada
evals.run_inference(agent=...)para transmitirtypes.Runtime, já que o SDK não aceita maistypes.AgentEngine.Faça as mudanças a seguir:
vertexai.Clientaagentplatform.Clientvertexai.ragaagentplatform.Client().rag
O
vertexai.Clientemite umFutureWarningna primeira instanciação:The vertexai.Client class is deprecated. Please use agentplatform.Client instead.vertexai.ragemite umUserWarningno momento da importação do módulo, não na chamada. Migre para o seguinte:import agentplatform client = agentplatform.Client(project="your-project", location="global") client.rag.create_corpus(...)Atualizar o tratamento de erros em torno de
AdkAppe chamadas de sessão. Os métodos de sessão síncronos e as execuções de agentes de streaming agora mostram o erro da API subjacente. Os chamadores que capturam um erro encapsulado genérico não correspondem mais. Substitua as capturas de exceções genéricas de wrapper de biblioteca porgoogle.api_core.exceptions.GoogleAPICallError(ou erros de status específicos, comoResourceExhaustedeNotFound).Atualize os chamadores de cliente ou o middleware para incluir o token de acesso OAuth do usuário em cada solicitação, já que os tokens agora são efêmeros e não são mantidos com o estado da sessão. Verifique se a atualização do token é gerenciada do lado do cliente.
O módulo
a2a.tasksfoi removido sem substituição.