Compatibilità: diversi livelli, domande diverse
Aggiornare un’integrazione con l’IA può comportare modifiche diverse, che è utile esaminare separatamente. L’SDK è la libreria che il client usa per comunicare con un servizio; l’API definisce l’interfaccia che accetta le richieste e restituisce le risposte; la configurazione può specificare una versione dell’API; l’identificatore del modello indica quale modello viene richiesto. Questi elementi sono correlati, ma non intercambiabili. Per esempio, un’applicazione può passare a un SDK diverso mantenendo la stessa versione dell’API, oppure cambiare l’identificatore del modello senza modificare la libreria. La combinazione specifica dipende dal fornitore e da come è realizzata l’integrazione.
Perciò, «l’aggiornamento funziona» non è una verifica abbastanza precisa. Ci sono almeno due domande diverse. La prima è tecnica: il client continua a inviare richieste accettate e riesce a interpretare le risposte e gli errori che riceve? La seconda è funzionale: il risultato continua a essere utile per il compito svolto dall’applicazione? I test di contratto riguardano principalmente la prima domanda. La seconda richiede di valutare il comportamento dell’applicazione e, quando pertinente, la qualità del modello.
Una modifica può superare le verifiche tecniche e produrre comunque una differenza funzionale. Può accadere anche il contrario: il testo generato può sembrare corretto durante una verifica manuale, mentre una proprietà del protocollo non viene più interpretata correttamente. Non usare un segnale come sostituto dell’altro. Registra separatamente che cosa è stato verificato, con quali evidenze e che cosa resta da controllare.
I materiali forniti includono documentazione dei fornitori sull’integrazione, sulla migrazione e sulle novità. Sono un punto di partenza per reperire informazioni specifiche, ma gli estratti disponibili non attestano un contratto dettagliato comune a tutti i fornitori. Di conseguenza, questa guida non attribuisce campi, tipi, errori o passaggi specifici a una determinata API. Prima di applicare la procedura, completa l’inventario consultando la documentazione aggiornata del servizio effettivamente usato dal tuo team.
Quale livello stai verificando
Usa questa distinzione per definire test circoscritti. I nomi dei livelli sono categorie di analisi; il modo in cui configurarli va verificato per ciascun fornitore.
| Livello | Domanda di compatibilità | Che cosa non dimostra da solo |
|---|---|---|
| SDK | La versione installata consente di creare e inviare le operazioni usate dall’applicazione? | Che il servizio accetti qualsiasi richiesta o che il modello mantenga lo stesso comportamento. |
| API | La richiesta e la risposta osservabili rispettano ancora il contratto documentato utilizzato dal client? | Che il contenuto generato sia equivalente o adeguato al prodotto. |
| Identificatore del modello | La configurazione indica la destinazione che il team intende usare? | Che due identificatori producano risposte identiche. |
| Comportamento funzionale | L’applicazione continua a soddisfare i requisiti del compito? | Che il protocollo, l’SDK o tutti gli stati di errore siano coperti correttamente. |
Inventariare il contratto prima di apportare modifiche
Prima di aggiornare, registra lo stato attuale dell’integrazione. Annota il nome e la versione dell’SDK installato, l’eventuale configurazione dell’API usata dal client, l’identificatore del modello configurato e il componente dell’applicazione che effettua la chiamata. Indica anche l’ambiente in cui viene eseguito il test, per esempio una configurazione di sviluppo o di prova. Non salvare nell’inventario chiavi o altri segreti: registra soltanto riferimenti sicuri alla configurazione.
Descrivi poi il confine tra la tua applicazione e il servizio. Elenca i campi inviati dall’applicazione, i tipi previsti per ciascuno e i campi obbligatori secondo la documentazione consultata. Per la risposta, documenta le proprietà che il client legge effettivamente, i tipi che si aspetta e il modo in cui gestisce la loro presenza o assenza. Non confondere l’insieme completo dei dati che un fornitore potrebbe restituire con il sottoinsieme che la tua applicazione deve usare.
Fai lo stesso per gli errori documentati e per le risposte non riuscite che il client deve gestire. Non trasformare un’osservazione isolata in una regola universale. Se la documentazione non specifica una forma, uno stato o una condizione, annotali come sconosciuti o non coperti, invece di attribuire loro un significato. Questa distinzione evita che un test locale venga presentato come una garanzia del fornitore.
Conserva l’inventario insieme alla modifica o in un registro consultabile dal team. Includi la data della revisione e il riferimento documentale interno utilizzato, senza copiare credenziali o dati degli utenti. Lo scopo non è descrivere in modo esaustivo l’intera API: è rendere esplicite le dipendenze effettive dell’applicazione, così da poter confrontare le versioni secondo un criterio stabile.
Inventario minimo prima dell’aggiornamento
Completa questi passaggi usando informazioni verificate nella documentazione aggiornata del fornitore e nella configurazione dell’applicazione.
- 01Annota SDK, versione installata e posizione della relativa configurazione.
- 02Registra la configurazione dell’API e l’identificatore del modello, se usati dall’integrazione.
- 03Elenca i campi della richiesta inviati dal client e i tipi previsti.
- 04Elenca le proprietà della risposta usate dal client e il modo in cui gestisce campi assenti o inattesi.
- 05Registra soltanto gli errori e i comportamenti documentati o osservati dal team, specificando quale delle due condizioni si applica.
- 06Indica come questioni da risolvere gli aspetti che non puoi confermare consultando una fonte primaria aggiornata.
Test di contratto senza pretendere testi identici
Un test di contratto dovrebbe verificare le proprietà osservabili dell’integrazione, non imporre in generale una frase esatta come requisito per una risposta generata. Tra le proprietà che potrebbero essere verificate, se fanno parte del contratto documentato e dell’uso dell’applicazione, ci sono la presenza di un campo obbligatorio, il suo tipo, la possibilità di interpretare la risposta e la gestione prevista di uno stato di errore noto. L’adeguatezza di queste verifiche dipende dal contratto specifico: non dare per scontati nomi di campi o significati che non hai verificato.
Il confronto letterale del testo è particolarmente fragile quando il servizio genera contenuti. Una variazione nella formulazione non dimostra, da sola, che il protocollo sia cambiato o che l’applicazione non svolga più la propria funzione. Al contrario, una risposta che non si riesce più a interpretare secondo le proprietà richieste dal client può segnalare un’incompatibilità tecnica. Mantieni le due osservazioni in categorie distinte e applica a ciascuna criteri adeguati.
Per testare il codice che trasforma i dati, usa risposte controllate. Un mock o una risposta sintetica permette di verificare in modo ripetibile che cosa fa il client davanti a strutture definite dal team. Tuttavia, un test con un mock non dimostra che il servizio reale restituisca quella struttura. Per ridurre questa incertezza, affianca ai test locali verifiche circoscritte sul servizio in un ambiente di prova, quando l’accesso e la documentazione lo consentono.
Il codice seguente è un esempio eseguibile di convalida di un’interfaccia interna fittizia. I nomi e i tipi sono volutamente illustrativi: non descrivono la risposta di un fornitore. Il test verifica i tipi e la presenza di proprietà usando una risposta controllata; non effettua chiamate di rete e non intende verificare la qualità di un modello. Sostituisci quell’interfaccia con il confine reale del tuo adattatore e confrontalo con la relativa documentazione.
Esempio autonomo che usa la libreria standard di Python. Convalida un’interfaccia interna fittizia, non un’API specifica.
import unittest
def validate_response(response):
required = {"request_id": str, "model_ref": str, "content": str}
if not isinstance(response, dict):
raise TypeError("La risposta deve essere un dizionario")
for field, expected_type in required.items():
if field not in response or not isinstance(response[field], expected_type):
raise ValueError(f"Campo assente o non valido: {field}")
class ContractTest(unittest.TestCase):
def test_accepts_controlled_response(self):
fixture = {
"request_id": "test-001",
"model_ref": "demo-model",
"content": "risposta sintetica",
}
validate_response(fixture)
if __name__ == "__main__":
unittest.main()
Separare i test locali dalle verifiche del servizio
Organizza la strategia in base al confine che ciascun test può osservare. I test unitari possono verificare la creazione di una richiesta e l’interpretazione di risposte sintetiche. I test dell’adattatore possono usare mock per verificare come l’applicazione reagisce a risposte controllate. Le verifiche su un servizio reale permettono di esaminare l’integrazione effettiva nelle condizioni dell’ambiente di prova. Nessuna di queste categorie va presentata come se coprisse automaticamente le altre.
Mantieni i dati sintetici privi di informazioni sensibili. Per i test che chiamano il servizio, usa una configurazione autorizzata per le prove e dati adatti a quell’ambiente. Documenta se il risultato dipende dalla disponibilità di servizi esterni, dalla configurazione o da limiti che il team non controlla. Non subordinare il successo di un test strutturale alla ricezione costante della stessa frase: verifica le proprietà del protocollo e valuta il contenuto in un insieme separato di criteri funzionali.
Una pratica utile consiste nel conservare campioni controllati che rappresentino i casi documentati rilevanti per il client. Per ciascun campione, spiega quale comportamento del tuo codice viene testato e qual è l’origine del campione: fixture progettata dal team, risposta registrata con autorizzazione o caso ricavato dalla documentazione. Non confondere queste categorie. Una fixture è un input di test, non la conferma che il fornitore restituirà sempre quella risposta.
Quando confronti la versione precedente con quella nuova, esegui lo stesso insieme di test locali su entrambe le versioni dell’adattatore, se possibile. Se un test non passa, individua innanzitutto il confine coinvolto: creazione della richiesta, interpretazione della risposta, configurazione o chiamata reale. Poi stabilisci se il fallimento rivela un’incompatibilità documentata, un presupposto interno da aggiornare, un limite del mock o un problema funzionale da valutare separatamente.
Scegliere il test giusto
La matrice aiuta a stabilire quali conclusioni consente di trarre ciascuna verifica. Adatta i test ai requisiti e alla documentazione dell’integrazione specifica.
| Tipo di verifica | Che cosa può convalidare | Limite della conclusione |
|---|---|---|
| Test unitari con dati sintetici | Logica locale, tipi previsti dall’adattatore e gestione delle fixture. | Non conferma il comportamento del servizio reale. |
| Con mock | Reazione del client a risposte ed errori controllati. | Non dimostra che il fornitore produca quei casi o quelle strutture. |
| Contro un servizio in ambiente di prova | Che una chiamata reale funzioni con la configurazione testata. | Da sola non dimostra tutti i casi né l’equivalenza funzionale. |
| Valutazione funzionale | Se i risultati rispettano i criteri del compito dell’applicazione. | Non sostituisce le verifiche del contratto tecnico. |
Esaminare la migrazione e classificare le differenze
Prima di modificare le dipendenze, consulta la guida alla migrazione e le note di rilascio pertinenti al fornitore, all’SDK e all’API che usi. Verifica che la documentazione riguardi il prodotto e la versione esaminati. Cerca modifiche incompatibili, elementi rimossi, nomi o tipi cambiati, impostazioni di configurazione e passaggi di migrazione. Se la documentazione disponibile non chiarisce un punto, non colmare la lacuna con un’ipotesi: registrala e chiedi conferma oppure progetta un test che consenta di esaminarla in sicurezza.
Classifica ogni differenza osservata in base al suo effetto. Potrebbe essere incompatibile se il client non riesce più a creare la richiesta o a interpretare una risposta necessaria. Potrebbe richiedere un adattamento se cambia un’aspettativa del client, anche quando esiste un percorso di migrazione documentato. Potrebbe essere compatibile con l’integrazione tecnica e richiedere comunque una valutazione funzionale indipendente. Oppure potrebbe non influire sul codice usato dall’applicazione. La classificazione descrive l’impatto verificato, non una proprietà universale dell’aggiornamento.
Conserva un confronto leggibile tra la versione precedente e quella nuova: configurazione, dipendenze, risultati dei test e modifiche applicate all’adattatore. Se un test fallisce, non eliminarlo semplicemente per ottenere un’esecuzione senza errori. Prima determina se il requisito non è più valido, se il test rappresentava in modo errato il contratto o se l’integrazione si è effettivamente rotta. Registra le evidenze e la decisione.
Le fonti fornite includono una guida alla migrazione dell’SDK Python di Agent Platform di Google Cloud, materiali di Microsoft Learn sull’SDK e l’API REST di Azure Language e sulle novità di Content Understanding, nonché una pubblicazione di OpenAI sull’evoluzione del suo SDK per agenti. Questi titoli individuano documentazione pertinente per esaminare i rispettivi prodotti; non bastano a dedurre che i relativi campi, le versioni o le procedure siano equivalenti, né a attribuire loro dettagli tecnici che qui non sono attestati.
Confronto prima e dopo
Questa procedura limita il confronto a ciò che il team può osservare e documentare, senza presumere che due versioni debbano generare testi identici.
- 01Fissa la versione corrente e conserva la relativa configurazione di prova.
- 02Leggi la documentazione di migrazione e registra le modifiche che riguardano i componenti effettivamente usati.
- 03Aggiorna la dipendenza o la configurazione in un ramo di lavoro e annota ogni modifica.
- 04Esegui prima i test locali usando gli stessi dati controllati.
- 05Esegui le verifiche consentite sul servizio di prova e separane i risultati da quelli locali.
- 06Classifica ogni differenza come incompatibilità tecnica, adattamento necessario, questione funzionale indipendente, differenza non rilevante o incertezza ancora da risolvere.
Convalidare in prova e distribuire gradualmente
Esegui la prima convalida in un ambiente di prova rappresentativo per configurazione, senza esporre dati o credenziali non necessari. Verifica che la dipendenza installata corrisponda alla versione prevista e che la configurazione dell’API e l’identificatore del modello, se applicabili, corrispondano all’obiettivo dell’aggiornamento. Questa verifica della configurazione evita di attribuire a una modifica dell’SDK una differenza che potrebbe dipendere da un altro livello.
Definisci i criteri di accettazione prima di eseguire i test. Per esempio: le verifiche strutturali concordate passano, il client gestisce i casi documentati coperti dalla suite, i test funzionali separati non mostrano violazioni note e le incertezze critiche hanno una decisione esplicita. Non trasformare questi criteri esemplificativi in requisiti universali: scegli quelli adeguati al rischio e all’uso della tua applicazione.
Se l’esito è soddisfacente, pianifica una distribuzione graduale compatibile con l’architettura e con i controlli del tuo team. Osserva i segnali tecnici pertinenti e mantieni la possibilità di tornare alla configurazione precedente. La strategia concreta dipende da come viene distribuito il prodotto: questa guida non può prescrivere un meccanismo unico valido per tutti i sistemi. Assicurati che il team sappia quale modifica è stata distribuita, quali evidenze la supportano e quale condizione indurrebbe a fermare il rilascio o a ripristinare la versione precedente.
Se non è possibile convalidare un punto importante, per mancanza di documentazione, accesso a un ambiente di prova o una risposta verificabile, rinvia l’approvazione oppure registra esplicitamente la limitazione e chi la accetta. Non aver osservato un errore non equivale a una verifica completa. Allo stesso modo, una chiamata reale riuscita non dimostra che tutti i campi, gli errori e i casi d’uso dell’applicazione siano compatibili.
Checklist di accettazione e registro della decisione
Prima dell’approvazione, verifica che la modifica sia delimitata: versione dell’SDK, configurazione prevista dell’API e del modello, se applicabili, e componenti dell’applicazione interessati. Conferma che la documentazione di migrazione consultata riguardi il prodotto corretto e che le istruzioni pertinenti siano state esaminate. Se la documentazione non risponde a una domanda sul contratto, mantienila visibile come incertezza: non trasformarla in un’aspettativa di test priva di riscontro.
Verifica che i test tecnici controllino proprietà di cui l’applicazione ha davvero bisogno e che i risultati dei test funzionali siano separati. Assicurati che mock e fixture siano identificati come dati controllati, non come risposte garantite dal servizio. Registra quali test hanno chiamato il servizio reale, con quale configurazione e con quali limitazioni. Se una modifica del testo è importante per il prodotto, descrivi il criterio funzionale che la rende rilevante, invece di definirla automaticamente una rottura del contratto.
La decisione può essere approvare, rinviare o ripristinare la configurazione precedente. Approvare significa che i criteri definiti sono stati soddisfatti e che le limitazioni restanti sono accettate esplicitamente. Rinviare significa che mancano evidenze necessarie o che resta un rischio da risolvere. Ripristinare significa tornare a una configurazione precedente quando la modifica causa un problema che il team considera inaccettabile. In tutti e tre i casi, annota chi decide, che cosa ha osservato e quale azione seguirà.
Questo registro trasforma l’aggiornamento in una decisione verificabile e facilita i confronti futuri. Aiuta inoltre altri team a distinguere un’incompatibilità reale da una variazione di comportamento o da un limite di copertura. Per proseguire l’apprendimento, l’argomento può essere collegato a materiali introduttivi sullo sviluppo, a confronti tra strumenti e alla scoperta di altre opzioni; questa navigazione contestuale non sostituisce la verifica tecnica specifica.
Decisione di rilascio
Adatta questi criteri al livello di rischio dell’integrazione. È preferibile registrare un’incertezza piuttosto che presentarla come risolta.
| Decisione | Quando prenderla in considerazione | Registrazione minima |
|---|---|---|
| Approvare | I criteri concordati sono soddisfatti e le limitazioni note hanno una decisione esplicita. | Versioni, configurazione, test eseguiti, risultati e limitazioni accettate. |
| Rinviare | Mancano documentazione, un test pertinente o una risposta a un’incertezza critica. | Questione aperta, possibile impatto, responsabile ed evidenze necessarie. |
| Ripristinare | L’aggiornamento causa un problema che supera la soglia accettata dal team. | Modifica ripristinata, segnale osservato, ambito interessato e piano di indagine. |
Questioni aperte
- Le fonti fornite non specificano il fornitore né le versioni concrete che il lettore dovrebbe aggiornare.
- Gli estratti disponibili non attestano campi, tipi, stati di errore o contratti di risposta di una specifica API.
- I nomi usati nell’esempio Python rappresentano un’interfaccia interna fittizia, non uno schema di un fornitore.
- L’applicabilità di una guida alla migrazione o di una pagina sulle novità va confermata per il prodotto e la versione effettivamente utilizzati.
Continua a esplorare
Fonti consultate
Correzioni e trasparenza
Se trovi un dato errato o non aggiornato, inviaci la pagina e la fonte da verificare.
Proponi una correzione