Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

0
respostas

[Sugestão] A2A 1.0: Algumas observações sobre a migração ( "perdi" algumas horas )

Olá sobreviventes,

Passei as ultimas horas migrando o projeto multiagente para a versão 1.0 do A2A e achei que valeria a pena compartilhar algumas descobertas. Talvez poupe algumas horas de sofrimento de quem estiver passando pelo mesmo processo.

A maior dificuldade foi que boa parte dos exemplos, vídeos, posts, respostas de IA ainda estão baseados na série 0.x do SDK.

O resultado é que muito código aparentemente correto simplesmente não funciona mais na v1.0.

Os erros que mais encontrei foram:

AttributeError: configuration

problemas com:

role="agent"

e também código usando:

ClientFactory.create(...)

que não existe mais da mesma forma.


O que mudou?

A principal mudança é arquitetural.

O SDK deixou de utilizar os modelos Pydantic internos e passou a trabalhar diretamente com os tipos gerados a partir da especificação Protobuf(Google - framework gRPC).

Na prática:

  • O Protobuf virou a fonte principal da verdade.
  • O ClientFactory foi substituído por create_client().
  • O fluxo agora gira em torno de Message, SendMessageRequest e StreamResponse.
  • Os helpers foram centralizados em a2a.helpers.
  • AgentCard ganhou supported_interfaces.
  • AgentCapabilities perdeu input_modes e output_modes.

Algumas mudanças rápidas de sintaxe

AntesDepois
role="agent"Role.ROLE_AGENT
role="user"Role.ROLE_USER
ClientFactory.create()await create_client()
AgentCard(url=...)supported_interfaces=[AgentInterface(...)]

O erro mais complexo e traiçoeiro que encontrei

Esse aqui consumiu mais tempo do que deveria.

Você cria a mensagem normalmente:

msg = new_text_message(
    "Olá",
    role=Role.ROLE_USER
)

Tudo parece correto.

Então você tenta:

await client.send_message(msg)

e recebe:

AttributeError: configuration

O problema não está na Message.

O problema é que o método espera um SendMessageRequest, não uma Message.

O correto é:

request = SendMessageRequest()
request.message.CopyFrom(msg)

await client.send_message(request)

Depois disso tudo começou a funcionar normalmente.


Uma dica que acabou me salvando

Quando a documentação não estava clara, comecei a inspecionar diretamente os objetos protobuf.

Por exemplo:

Message.DESCRIPTOR.fields
SendMessageRequest.DESCRIPTOR.fields
Role.DESCRIPTOR

Também foi assim que descobri os enums corretos:

from a2a.types import Role

Role.ROLE_USER
Role.ROLE_AGENT

e até:

Role.Name(1)
Role.Value("ROLE_USER")

Se você estiver tentando descobrir o que realmente existe no protocolo, isso ajuda muito.


E afinal, a mudança valeu a pena?

Depois da dor inicial, sinceramente acho que sim.

Tenho que estudar mais contudo percebi:

  • Suporte multilingue (Python, Java, C, ....)
  • Mais controle sobre o protocolo (Server).
  • Menos camadas escondidas.
  • Menos acoplamento interno.
  • Melhor interoperabilidade entre linguagens.
  • Mais previsibilidade durante o debugging.

No meu caso, depois que entendi a nova estrutura, ficou muito mais fácil descobrir o que estava acontecendo olhando diretamente para os DESCRIPTORs do protocolo.


Guia oficial de migração

O material que realmente me ajudou a fechar a migração foi este:

https://github.com/a2aproject/a2a-python/blob/main/docs/migrations/v1_0/README.md

Recomendo fortemente a leitura antes de começar qualquer atualização de projeto.


Espero que isso ajude alguém que esteja travado na atualização de Supervisors, Executors, AgentCards ou no novo fluxo baseado em Protobuf.

Se alguém estiver passando pela mesma migração e quiser trocar experiências, ou acrescentar alguma info/crítica, fico feliz em ajudar no que eu conseguir.