Atualizar um SDK de IA sem interromper a integração: testes de contrato
Imagen generada con gpt-image-2.5-sunburst para InferamaFonte ↗
01

Compatibilidade: várias camadas, várias perguntas

Atualizar uma integração com IA pode envolver diferentes alterações, que convém analisar separadamente. O SDK é a biblioteca que o cliente usa para se comunicar com um serviço; a API define a interface que aceita solicitações e devolve respostas; a configuração pode identificar uma versão da API; e o identificador do modelo indica qual modelo está sendo solicitado. Esses elementos estão relacionados, mas não são intercambiáveis. Por exemplo, uma aplicação pode mudar de SDK e manter a versão da API, ou alterar o identificador do modelo sem modificar a biblioteca. A combinação específica depende do fornecedor e de como a integração foi criada.

Por isso, dizer que «a atualização funciona» não é uma verificação suficientemente precisa. Há pelo menos duas perguntas diferentes. A primeira é técnica: o cliente continua enviando uma solicitação aceita e consegue interpretar a resposta e os erros recebidos? A segunda é funcional: o resultado continua sendo útil para a tarefa da aplicação? Os testes de contrato tratam principalmente da primeira pergunta. A segunda exige avaliar o comportamento da aplicação e, quando apropriado, a qualidade do modelo.

Uma alteração pode passar nas verificações técnicas e, ainda assim, produzir uma diferença funcional. Também pode acontecer o contrário: o texto gerado pode parecer correto em um teste manual, enquanto uma propriedade do protocolo já não é interpretada adequadamente. Não use um desses sinais como substituto do outro. Registre separadamente o que foi verificado, com quais evidências e o que ainda falta avaliar.

A documentação fornecida inclui materiais de fornecedores sobre integração, migração e novidades. Eles servem como ponto de partida para localizar informações específicas, mas os trechos disponíveis não comprovam um contrato detalhado comum a todos os fornecedores. Portanto, este guia não atribui campos, tipos, erros nem etapas específicas a uma API determinada. Antes de aplicar o procedimento, complete o inventário com a documentação vigente do serviço realmente usado pela sua equipe.

Qual camada você está verificando?

Use esta separação para formular testes específicos. Os nomes das camadas são categorias de análise; a forma de configurá-las deve ser confirmada para cada fornecedor.

CamadaPergunta de compatibilidadeO que isso não demonstra por si só
SDKA versão instalada permite criar e enviar as operações usadas pela aplicação?Que o serviço aceite qualquer solicitação ou que o modelo mantenha o mesmo comportamento.
APIA solicitação e a resposta observáveis continuam seguindo o contrato documentado que o cliente usa?Que o conteúdo gerado seja equivalente ou adequado ao produto.
Identificador do modeloA configuração aponta para o destino que a equipe pretende usar?Que dois identificadores produzam respostas idênticas.
Comportamento funcionalA aplicação continua atendendo aos requisitos da tarefa?Que o protocolo, o SDK ou todos os estados de erro estejam cobertos corretamente.
02

Inventariar o contrato antes de fazer alterações

Antes de atualizar, registre o estado atual da integração. Anote o nome e a versão do SDK instalados, a configuração de API usada pelo cliente, se houver, o identificador do modelo configurado e o componente da aplicação que faz a chamada. Inclua também o ambiente em que o teste é executado, como uma configuração de desenvolvimento ou de testes. Não guarde chaves nem outros segredos no inventário; registre apenas referências seguras à configuração.

Em seguida, descreva a fronteira entre sua aplicação e o serviço. Liste os campos enviados pela aplicação, os tipos esperados para cada um e quais campos são obrigatórios segundo a documentação consultada. Na resposta, documente as propriedades que o cliente realmente lê, os tipos esperados e como ele trata a presença ou a ausência de cada propriedade. Não confunda o conjunto completo de dados que um fornecedor poderia devolver com o subconjunto que sua aplicação precisa consumir.

Faça o mesmo para os erros documentados e para as respostas não bem-sucedidas que o cliente deve tratar. Não transforme uma observação isolada em uma regra universal. Se a documentação não especificar um formato, estado ou condição, registre como desconhecido ou não coberto, em vez de atribuir um significado. Essa distinção evita que um teste local seja apresentado como garantia do fornecedor.

Guarde o inventário junto com a alteração ou em um registro que a equipe possa consultar. Inclua a data da revisão e a referência documental interna utilizada, sem copiar credenciais nem dados de usuários. O objetivo não é produzir uma descrição exaustiva de toda a API: é explicitar as dependências reais da aplicação para que seja possível comparar versões com um critério estável.

Inventário mínimo antes da atualização

Complete estas etapas com dados verificados na documentação vigente do fornecedor e na configuração da aplicação.

  1. 01Anote o SDK, a versão instalada e o local de sua configuração.
  2. 02Registre a configuração da API e o identificador do modelo, se a integração os utilizar.
  3. 03Liste os campos de solicitação que o cliente envia e os tipos esperados.
  4. 04Liste as propriedades da resposta consumidas pelo cliente e como ele trata campos ausentes ou inesperados.
  5. 05Registre somente erros e comportamentos que estejam documentados ou tenham sido observados pela equipe, identificando qual é qual.
  6. 06Marque como pendentes as questões que não puder confirmar em uma fonte primária vigente.
03

Testes de contrato sem exigir textos idênticos

Um teste de contrato deve verificar propriedades observáveis da integração, não impor uma frase exata como requisito geral para uma resposta gerada. Entre as propriedades que podem ser verificadas, se fizerem parte do contrato documentado e do uso da aplicação, estão a presença de um campo obrigatório, seu tipo, a possibilidade de interpretar a resposta e o tratamento previsto para um estado de erro conhecido. A adequação dessas verificações depende do contrato específico; não presuma nomes de campos nem significados que não tenha confirmado.

A comparação literal de texto é especialmente frágil quando o serviço gera conteúdo. Uma variação na redação não demonstra, por si só, que o protocolo mudou ou que a aplicação deixou de cumprir sua função. Por outro lado, uma resposta que já não pode ser interpretada segundo as propriedades exigidas pelo cliente pode indicar uma incompatibilidade técnica. Mantenha essas observações em categorias distintas e aplique critérios adequados a cada uma.

Para testar o código que transforma dados, use respostas controladas. Um mock ou uma resposta sintética permite verificar, de forma repetível, o que o cliente faz diante de estruturas definidas pela equipe. Mas um teste com mock não demonstra que o serviço real devolva essa estrutura. Para reduzir essa incerteza, combine os testes locais com verificações pontuais contra o serviço em um ambiente de testes, sempre que o acesso e a documentação permitirem.

O código a seguir é um exemplo executável de validação de uma interface interna fictícia. Os nomes e tipos são deliberadamente ilustrativos: não descrevem a resposta de um fornecedor. O teste verifica tipos e presença de propriedades usando uma resposta controlada; não faz chamadas de rede nem pretende avaliar a qualidade de um modelo. Substitua essa interface pela fronteira real do seu adaptador e compare-a com a respectiva documentação.

Teste local de uma resposta sintética · python

Exemplo independente usando a biblioteca padrão do Python. Valida uma interface interna fictícia, não uma API específica.

import unittest


def validate_response(response):
    required = {"request_id": str, "model_ref": str, "content": str}
    if not isinstance(response, dict):
        raise TypeError("A resposta deve ser um dicionário")
    for field, expected_type in required.items():
        if field not in response or not isinstance(response[field], expected_type):
            raise ValueError(f"Campo ausente ou inválido: {field}")


class ContractTest(unittest.TestCase):
    def test_accepts_controlled_response(self):
        fixture = {
            "request_id": "test-001",
            "model_ref": "demo-model",
            "content": "resposta sintética",
        }
        validate_response(fixture)


if __name__ == "__main__":
    unittest.main()
04

Separar testes locais das verificações do serviço

Divida a estratégia de acordo com o limite que cada teste consegue observar. Os testes unitários podem verificar a construção de uma solicitação e a interpretação de respostas sintéticas. Os testes do adaptador podem usar mocks para verificar como a aplicação reage a respostas controladas. As verificações contra um serviço real permitem examinar a integração efetiva nas condições do ambiente de testes. Nenhuma dessas categorias deve ser apresentada como se cobrisse automaticamente as demais.

Mantenha os dados sintéticos livres de informações sensíveis. Para os testes que chamam o serviço, use uma configuração autorizada para testes e dados adequados a esse ambiente. Documente se o resultado depende de disponibilidade externa, configuração ou limites que a equipe não controla. Não faça o sucesso de um teste estrutural depender de receber sempre uma frase idêntica: verifique as propriedades do protocolo e deixe a avaliação do conteúdo em um conjunto separado de critérios funcionais.

Uma prática útil é manter amostras controladas que representem os casos documentados relevantes para o cliente. Para cada amostra, explique qual comportamento do seu código ela testa e qual é sua origem: fixture criada pela equipe, resposta registrada com autorização ou caso derivado da documentação. Não misture essas categorias. Uma fixture é uma entrada de teste, não uma confirmação de que o fornecedor sempre devolverá aquela resposta.

Ao comparar a versão anterior com a nova, execute, sempre que possível, o mesmo conjunto de testes locais nas duas versões do adaptador. Se um teste falhar, identifique primeiro o limite afetado: criação da solicitação, interpretação da resposta, configuração ou chamada real. Depois, decida se a falha revela uma incompatibilidade documentada, uma suposição interna que precisa ser atualizada, uma limitação do mock ou um problema funcional que deve ser avaliado separadamente.

Escolha o teste apropriado

A matriz ajuda a decidir qual conclusão cada verificação permite tirar. Ajuste os testes aos requisitos e à documentação da integração específica.

Tipo de verificaçãoO que pode validarLimite da conclusão
Testes unitários com dados sintéticosLógica local, tipos presumidos pelo adaptador e tratamento de fixtures.Não confirma o comportamento do serviço real.
Com mocksReação do cliente a respostas e erros controlados.Não comprova que o fornecedor produza esses casos ou estruturas.
Contra o serviço em ambiente de testesQue uma chamada real funciona na configuração testada.Não demonstra, por si só, todos os casos nem a equivalência funcional.
Avaliação funcionalSe os resultados atendem aos critérios da tarefa da aplicação.Não substitui as verificações do contrato técnico.
05

Revisar a migração e classificar as diferenças

Antes de alterar dependências, consulte o guia de migração e as notas de versão relevantes para o fornecedor, o SDK e a API utilizados. Confirme se a documentação corresponde ao produto e à versão examinados. Procure alterações incompatíveis, elementos removidos, nomes ou tipos modificados, ajustes de configuração e etapas de migração. Se a documentação disponível não esclarecer um ponto, não preencha a lacuna com uma suposição: registre a dúvida e peça confirmação ou planeje um teste que permita investigá-la com segurança.

Classifique cada diferença observada de acordo com seu efeito. Ela pode ser incompatível se o cliente já não conseguir criar a solicitação ou interpretar uma resposta necessária. Pode exigir uma adaptação se uma expectativa do cliente mudar, mesmo que exista um caminho de migração documentado. Pode ser compatível com a integração técnica e, ainda assim, justificar uma avaliação funcional independente. Também pode não afetar o código usado pela aplicação. A classificação descreve o impacto comprovado, não uma propriedade universal de uma atualização.

Mantenha uma comparação clara entre a versão anterior e a nova: configuração, dependências, resultados dos testes e alterações aplicadas ao adaptador. Se um teste falhar, evite simplesmente apagá-lo para obter uma execução bem-sucedida. Primeiro determine se o requisito deixou de ser válido, se o teste representava incorretamente o contrato ou se a integração realmente foi interrompida. Registre as evidências e a decisão.

As fontes fornecidas incluem um guia de migração do SDK Python do Agent Platform, do Google Cloud; materiais do Microsoft Learn sobre o SDK e a API REST do Azure Language e sobre as novidades do Content Understanding; e uma publicação da OpenAI sobre a evolução do SDK de agentes. Esses títulos identificam documentação pertinente para investigar os respectivos produtos. Eles não bastam para inferir que os campos, as versões ou os processos sejam equivalentes, nem para atribuir detalhes técnicos que não estão comprovados aqui.

Comparação antes e depois

Este processo limita a comparação ao que a equipe consegue observar e documentar, sem presumir que duas versões devam produzir textos idênticos.

  1. 01Defina a versão atual e preserve sua configuração de testes.
  2. 02Leia a documentação de migração e registre as alterações que afetam componentes realmente utilizados.
  3. 03Atualize a dependência ou a configuração em uma ramificação de trabalho e anote cada modificação.
  4. 04Execute primeiro os testes locais com os mesmos dados controlados.
  5. 05Execute as verificações permitidas contra o serviço de testes e separe os resultados dos testes locais.
  6. 06Classifique cada diferença como incompatibilidade técnica, adaptação necessária, questão funcional independente, diferença irrelevante ou incerteza pendente.
06

Validar em testes e implantar gradualmente

Faça a primeira validação em um ambiente de testes com configuração representativa, mas sem expor dados nem credenciais desnecessários. Verifique se a dependência instalada corresponde à versão prevista e se a configuração da API e o identificador do modelo correspondem ao objetivo da atualização. Essa verificação de configuração evita atribuir a uma alteração no SDK uma diferença que pode vir de outra camada.

Defina critérios de aceitação antes de executar os testes. Por exemplo: as verificações estruturais acordadas devem passar; o cliente deve tratar os casos documentados cobertos pela suíte; os testes funcionais separados não devem indicar uma falha conhecida; e as incertezas críticas devem ter uma decisão explícita. Não transforme esses exemplos em requisitos universais: escolha os critérios adequados ao risco e ao uso da sua aplicação.

Se o resultado for satisfatório, planeje uma implantação gradual compatível com a arquitetura e os controles da sua equipe. Observe sinais técnicos pertinentes e preserve a possibilidade de voltar à configuração anterior. A estratégia concreta depende de como o produto é implantado; não existe um mecanismo único que este guia possa prescrever para todos os sistemas. Certifique-se de que a equipe saiba qual alteração foi implantada, quais evidências a sustentam e qual condição levaria a interrompê-la ou revertê-la.

Quando não for possível validar um ponto importante — por falta de documentação, acesso a um ambiente de testes ou uma resposta verificável —, adie a aprovação ou registre expressamente a limitação e quem a aceita. A ausência de uma falha observada não equivale a um teste completo. Da mesma forma, uma chamada real bem-sucedida não demonstra que todos os campos, erros e usos da aplicação sejam compatíveis.

07

Lista de aceitação e registro da decisão

Antes de aprovar, confirme que a alteração está bem delimitada: versão do SDK, configurações previstas da API e do modelo, se aplicável, e componentes afetados da aplicação. Confirme que a documentação de migração consultada corresponde ao produto correto e que as instruções relevantes foram revisadas. Se a documentação não responder a uma pergunta sobre o contrato, mantenha-a visível como incerteza; não a transforme em uma expectativa de teste sem respaldo.

Verifique se os testes técnicos validam propriedades de que a aplicação realmente precisa e se os resultados dos testes funcionais estão separados. Certifique-se de que mocks e fixtures estejam identificados como controlados, e não como respostas garantidas pelo serviço. Registre quais testes chamaram o serviço real, em que configuração e com quais limitações. Se uma alteração no texto for importante para o produto, descreva o critério funcional que a torna relevante, em vez de chamá-la automaticamente de quebra de contrato.

A decisão pode ser aprovar, adiar ou reverter. Aprovar significa que os critérios definidos foram atendidos e que as limitações restantes foram aceitas explicitamente. Adiar significa que faltam evidências necessárias ou que há um risco a resolver. Reverter significa voltar a uma configuração anterior quando a alteração causa um problema que a equipe considera inaceitável. Nos três casos, registre quem decidiu, o que foi observado e qual será a próxima ação.

Esse registro transforma a atualização em uma decisão que pode ser revisada e facilita comparações futuras. Também permite que outras equipes diferenciem uma incompatibilidade real de uma variação de comportamento ou de uma limitação de cobertura. Para continuar aprendendo, o tema pode ser conectado a materiais introdutórios sobre desenvolvimento, comparações de ferramentas e descoberta de opções; essa navegação contextual não substitui a verificação técnica específica.

Decisão de saída

Adapte estes critérios ao nível de risco da integração. É melhor registrar uma incerteza do que apresentá-la como resolvida.

DecisãoQuando considerarRegistro mínimo
AprovarOs critérios acordados foram atendidos e as limitações conhecidas têm uma decisão explícita.Versões, configuração, testes executados, resultados e limitações aceitas.
AdiarFalta documentação, um teste relevante ou uma resposta a uma incerteza crítica.Questão pendente, possível impacto, responsável e evidências necessárias.
ReverterA atualização causa um problema que ultrapassa o limite aceito pela equipe.Alteração revertida, sinal observado, escopo afetado e plano de investigação.

Questões em aberto

  • As fontes fornecidas não especificam qual fornecedor nem quais versões concretas o leitor deve atualizar.
  • Os trechos disponíveis não comprovam campos, tipos, estados de erro nem contratos de resposta de uma API específica.
  • Os nomes usados no exemplo de Python representam uma interface interna fictícia, não um esquema de fornecedor.
  • A aplicabilidade de um guia de migração ou de novidades deve ser confirmada para o produto e a versão realmente utilizados.
08

Continue a explorar

08

Fontes consultadas

03

Correções e transparência

Se encontrar informação incorreta ou desatualizada, envie-nos a página e a fonte que devemos rever.

Propor uma correção