Come dichiara una pagina Drupal, in modo che una macchina lo legga, che il contenuto è fatto con l'AI?
Approfondisci il progetto AI Disclosure
Quando un'etichetta AI è obbligatoria lo spiega l'articolo sull'articolo 50(4) dell'AI Act in Drupal. Qui si guarda la parte che legge una macchina: quale proprietà, quale valore, dove sta nella pagina e chi la scrive. Il modulo è AI Disclosure, che ho creato su drupal.org a partire dal piano della Drupal AI Initiative.
Come dichiara una pagina Drupal che il contenuto è fatto con l'AI?
Con due elementi nell'<head>: un blocco JSON-LD che porta la proprietà schema.org digitalSourceType, e un meta tag ai-disclosure. AI Disclosure li scrive tutti e due sulla pagina canonica di ogni contenuto che ha una dichiarazione risolta, partendo dal grado che la redazione gli ha assegnato.
Questo è il blocco che il sito emette oggi, in produzione, sulla versione inglese dell'articolo Quali query rallentano una rotta Drupal:
{
"@context": "https://schema.org",
"@type": "Article",
"@id": "https://giorgiopagano.org/en/articles/which-queries-slow-down-a-drupal-route",
"digitalSourceType": {
"@id": "https://schema.org/CompositeWithTrainedAlgorithmicMediaDigitalSource"
},
"disambiguatingDescription": "This content was produced by AI and edited by a person."
}E questo è il meta tag della stessa pagina, uguale nelle due lingue:
<meta name="ai-disclosure" content="ai_assisted_hitl; required=not-required; icon=ai_modified">Nessuno dei due si scrive a mano. Chi pubblica sceglie un grado nel campo del contenuto, e il resto lo deriva il modulo.
Che cos'è digitalSourceType e quali valori accetta?
digitalSourceType è una proprietà di schema.org che indica la natura della sorgente digitale di un CreativeWork. Il valore atteso è un membro dell'enumerazione IPTCDigitalSourceEnumeration, che riprende il vocabolario Digital Source Type dell'IPTC. Schema.org ne elenca diciassette membri, e secondo i dati Google riportati sulla stessa pagina la proprietà è usata da meno di mille domini.
Per un testo i valori che contano sono pochi:
| Membro schema.org | Definizione IPTC |
|---|---|
TrainedAlgorithmicMediaDigitalSource |
Created using Generative AI |
CompositeWithTrainedAlgorithmicMediaDigitalSource |
Edited using Generative AI |
CompositeSyntheticDigitalSource |
Composite including generative AI elements |
AlgorithmicallyEnhancedDigitalSource |
Algorithmically-altered media |
AlgorithmicMediaDigitalSource |
Pure algorithmic media, senza dati di addestramento |
Il dominio della proprietà è CreativeWork, quindi vale per Article, ImageObject, VideoObject e ogni altro tipo che ne discende.
Perché schema.org e IPTC usano nomi diversi per gli stessi valori?
Nel 2024 IPTC ha ritirato minorHumanEdits e digitalArt, sostituendoli con humanEdits e digitalCreation. Schema.org espone ancora i due termini ritirati e ignora i due nuovi.
| Termine IPTC | Stato in IPTC | Membro schema.org |
|---|---|---|
minorHumanEdits |
ritirato | MinorHumanEditsDigitalSource |
humanEdits |
attivo | assente |
digitalArt |
ritirato | DigitalArtDigitalSource |
digitalCreation |
attivo | assente |
Chi scrive il markup deve quindi scegliere fra un nome schema.org superato e un termine IPTC che schema.org ignora. AI Disclosure risolve così: il grado conserva l'URI IPTC, e il modulo lo traduce nel membro schema.org quando esiste. Quando manca, emette l'URI IPTC così com'è, nella forma http://cv.iptc.org/newscodes/digitalsourcetype/humanEdits. Lo schema http:// resta quello dichiarato dall'IPTC, perché con https:// l'identificatore indicherebbe una risorsa diversa.
I nove gradi forniti con il modulo usano solo termini che schema.org conosce. Il ramo dell'URI IPTC serve ai gradi che un sito crea per conto proprio.
Il vocabolario IPTC vale anche per un testo?
L'IPTC definisce il proprio schema con la frase «Indicates from which source a digital image was created»: è nato per le immagini. Schema.org lo lega a qualunque CreativeWork, testo compreso, e Google lo documenta per i post dei forum, che sono testo. Applicarlo a un articolo è quindi permesso, con definizioni scritte pensando a fotografie e video.
Il caso più delicato è il grado ai_assisted_hitl, quello usato da questo sito. Il modulo gli assegna compositeWithTrainedAlgorithmicMedia, che l'IPTC chiama «Edited using Generative AI» e descrive con operazioni di inpainting e outpainting. Il modulo stesso descrive il grado in due modi. La documentazione dice «A person led, AI helped throughout», e con questa lettura il termine composito è coerente. La configurazione del grado dice «AI wrote it, a person directed it», e la frase mostrata al lettore è «prodotto dall'AI e rivisto da una persona»: con questa lettura il candidato più vicino è trainedAlgorithmicMedia, «Created using Generative AI».
L'URI è un campo del grado, modificabile da /admin/config/content/ai-disclosure/grades. La issue che ha definito la marcatura lo prevede in modo esplicito: le correzioni al vocabolario sono aggiornamenti di configurazione, senza toccare il codice.
Per la traduzione automatica il grado ai_translated usa algorithmicallyEnhanced, che l'IPTC definisce come una modifica fatta da un algoritmo «without changing the main content of the media».
Quale grado di AI Disclosure diventa quale valore, e con quale tipo?
Ogni grado è un'entità di configurazione con un URI IPTC. Questa è la corrispondenza dei nove gradi forniti con la release 1.0.0-alpha2:
| Grado | URI IPTC del grado | digitalSourceType emesso |
|---|---|---|
human_only |
assente | proprietà omessa |
ai_metadata |
assente | proprietà omessa |
ai_rated |
assente | proprietà omessa |
ai_translated |
algorithmicallyEnhanced |
AlgorithmicallyEnhancedDigitalSource |
ai_summarized |
compositeWithTrainedAlgorithmicMedia |
CompositeWithTrainedAlgorithmicMediaDigitalSource |
ai_partly_assisted |
compositeWithTrainedAlgorithmicMedia |
CompositeWithTrainedAlgorithmicMediaDigitalSource |
ai_assisted_hitl |
compositeWithTrainedAlgorithmicMedia |
CompositeWithTrainedAlgorithmicMediaDigitalSource |
ai_generated_autonomous |
trainedAlgorithmicMedia |
TrainedAlgorithmicMediaDigitalSource |
ai_deepfake |
trainedAlgorithmicMedia |
TrainedAlgorithmicMediaDigitalSource |
I tre gradi senza URI riguardano contenuti che una persona ha scritto: l'AI ha scelto i tag o ha dato un punteggio. Per quei contenuti il blocco porta solo disambiguatingDescription, con la frase del grado.
Il @type dipende dall'entità. Un nodo diventa Article. Un media diventa ImageObject, VideoObject o AudioObject secondo il plugin di sorgente, e MediaObject quando il plugin è un altro. Ogni altra entità diventa CreativeWork. Il modulo legge il plugin dall'ID, senza dipendere dal modulo media.
Che cosa scrive il meta tag ai-disclosure?
Il meta tag porta tre informazioni separate da punto e virgola: il nome macchina del grado, il verdetto sull'obbligo di etichetta e l'icona che la pagina mostra davvero.
<meta name="ai-disclosure" content="ai_summarized; required=undetermined; icon=ai_generated">Il verdetto vale required, not-required oppure undetermined, scritto per esteso. Uno zero confonderebbe «valutato, fuori ambito» con «mai valutato», e quella distinzione è il motivo per cui il segnale esiste. Quando l'etichetta è dovuta e un'opera palesemente artistica ne limita il modo, il valore si allunga con modality=unobtrusive. L'icona è none quando il grado ne nomina una che il modulo non sa disegnare: il tag dice ciò che il lettore vede.
Nome e struttura vengono dal piano della Drupal AI Initiative, che nella issue #3586647 (si apre in una nuova scheda) definisce il meta tag «a cheap stable secondary signal». Il piano prevedeva required=0 e required=1: il verdetto scritto per esteso è una modifica successiva, segnalata nella documentazione del modulo come cambio di un formato pubblicato. Esiste anche una proposta di David E. Weekly, discussa nella W3C AI Content Disclosure Community Group, che usa lo stesso nome ai-disclosure con un altro contenuto: uno dei valori none, ai-assisted, ai-generated, autonomous o mixed. Secondo l'explainer, Chromium ha una scheda della funzione e Mozilla e WebKit hanno una richiesta di posizione aperta. Chi scrive un programma che legge questo meta tag riconosce il formato di AI Disclosure dal punto e virgola e dalla chiave required=.
Perché ogni traduzione ha la sua dichiarazione?
AI Disclosure conserva una dichiarazione per ogni entità e per ogni lingua, nel campo ai_disclosure. Una traduzione fatta con l'AI è un intervento che l'originale non ha avuto, e la pagina tradotta lo dichiara per conto suo.
Questo articolo lo mostra su se stesso. La versione italiana eredita il profilo editoriale del sito, con il grado ai_assisted_hitl. La versione inglese usa il profilo della traduzione rivista, e il suo <head> porta un valore diverso:
"digitalSourceType":{"@id":"https://schema.org/AlgorithmicallyEnhancedDigitalSource"}
<meta name="ai-disclosure" content="ai_translated; required=not-required; icon=ai_modified">Il grado ai_translated diventa AlgorithmicallyEnhancedDigitalSource, e il verdetto resta not-required perché una persona ha rivisto la traduzione.
Come si risale da un URI IPTC ai gradi?
Con il servizio ai_disclosure.grade_lookup, che fa il percorso inverso rispetto alla marcatura: riceve un URI IPTC e restituisce i gradi che lo portano. Serve a un modulo che trova l'URI dentro un file, per esempio nel manifesto C2PA di un'immagine caricata, e deve proporre un grado.
$lookup = \Drupal::service('ai_disclosure.grade_lookup');
$grades = $lookup->gradesForIptcUri(
'http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia',
\Drupal\ai_disclosure\GradeLookupFormat::Data,
);Sul sito, con i gradi forniti dal modulo, il risultato è questo:
{
"ai_generated_autonomous": {
"id": "ai_generated_autonomous",
"severity": 70,
"label": "Autonomously AI generated",
"label_required": true
},
"ai_deepfake": {
"id": "ai_deepfake",
"severity": 80,
"label": "AI deep fake (media)",
"label_required": true
}
}Un URI può corrispondere a più gradi, e il servizio li restituisce tutti, ordinati per gravità. La scelta del grado spetta al modulo che chiama, che conosce il contesto del file. Il confronto sull'URI è esatto: spazi o maiuscole diverse danno un risultato vuoto. Il risultato dipende dalla configurazione dei gradi, e getCacheTags() restituisce i tag da allegare a ciò che se ne ricava.
Google legge digitalSourceType su un articolo?
La documentazione di Google Search Central raccomanda digitalSourceType su DiscussionForumPosting e Comment. Per quei tipi Google supporta due valori: TrainedAlgorithmicMediaDigitalSource per i contenuti di un modello addestrato come un LLM, e AlgorithmicMediaDigitalSource per quelli di un processo più semplice, come un bot di risposta. Per quei tipi, un contenuto senza la proprietà Google lo considera scritto da una persona.
La pagina di Google sui dati strutturati Article cita digitalSourceType zero volte. La proprietà è valida per schema.org, e la documentazione di Google che ho letto la prevede solo su forum e commenti. Il mio giudizio è che il blocco vada messo lo stesso, perché i destinatari sono tre: Google, gli aggregatori e gli agenti che leggono la pagina. Un effetto sul posizionamento resta un'ipotesi da verificare, e chi lo promette oggi va oltre le fonti.
Come si attiva e come si verifica la marcatura?
Il JSON-LD e il meta tag sono attivi di default dopo l'installazione. Per controllarli:
- Apri
/admin/config/content/ai-disclosure/outpute verifica che le due caselle, una per il
JSON-LD e una per il meta tag, siano selezionate.
- Assegna un grado a un contenuto, con un profilo o dal campo di AI Disclosure nel modulo di
modifica.
- Apri la pagina canonica del contenuto e cerca i due elementi nel sorgente. Sulla versione
inglese dell'articolo sulle query lente il comando è questo:
curl -s https://giorgiopagano.org/en/articles/which-queries-slow-down-a-drupal-route | grep -o '"digitalSourceType":{[^}]*}\|<meta name="ai-disclosure"[^>]*>'Il risultato atteso sono due righe, il valore di digitalSourceType e il meta tag:
"digitalSourceType":{"@id":"https://schema.org/CompositeWithTrainedAlgorithmicMediaDigitalSource"}
<meta name="ai-disclosure" content="ai_assisted_hitl; required=not-required; icon=ai_modified">Per un altro sito basta cambiare l'URL. Con un grado senza URI IPTC la prima riga manca, e questo è il comportamento corretto.
- Incolla il sorgente nel validatore di schema.org (si apre in una nuova scheda) e controlla che
l'Article abbia digitalSourceType senza errori.
I media ricevono la marcatura solo quando hanno una pagina propria. Drupal installa media.settings.standalone_url disattivato, e senza quella impostazione /media/1 è una pagina assente.
Come convive con il JSON-LD del tema?
Il blocco di AI Disclosure si somma a quello che il tema scrive già. Su questo sito la pagina di un articolo porta due blocchi Article: quello del tema, con titolo, autore e data, e quello del modulo, con digitalSourceType. I due hanno lo stesso @id, l'URL canonico, e in JSON-LD lo stesso @id indica la stessa risorsa.
I due validatori li trattano così. Ho passato l'URL pubblico dell'articolo sulle query lente a entrambi:
| Strumento | Elementi Article |
Esito |
|---|---|---|
| Schema Markup Validator | 1, con le proprietà dei due blocchi | 0 errori, 0 avvisi |
| Rich Results Test di Google | 1 valido, con digitalSourceType accanto a headline |
2 problemi facoltativi su datePublished, che viene dal tema |
L'unione funziona perché il tema usa come @id lo stesso URL canonico che usa il modulo. Un tema che usa un @id diverso produce due oggetti distinti, e digitalSourceType finisce su un Article senza titolo.
Che cosa la marcatura lascia fuori?
La marcatura è un segnale di pagina, dichiarato da chi pubblica. Vive nell'HTML: un'immagine salvata dalla pagina la perde. La marcatura nel file, con IPTC nei metadati XMP o con un manifesto C2PA firmato, resta fuori dalla versione 1.0 del modulo, e l'articolo 50(2) la assegna al fornitore del sistema di AI. La marcatura di pagina registra ciò che la redazione ha dichiarato, e la sua affidabilità è quella della redazione.
Fonti
Tutte le fonti sono state consultate il 27 e il 28 settembre 2026.
- digitalSourceType (si apre in una nuova scheda), schema.org. Dominio
CreativeWorke uso in meno di mille domini secondo i dati Google. Fonte primaria. - IPTCDigitalSourceEnumeration (si apre in una nuova scheda), schema.org. I diciassette membri dell'enumerazione. Fonte primaria.
- Digital Source Type (si apre in una nuova scheda), IPTC NewsCodes. Definizioni dei termini, date di creazione e di ritiro. Fonte primaria.
- Discussion forum structured data (si apre in una nuova scheda), Google Search Central.
digitalSourceTypesuDiscussionForumPostingeComment, i due valori supportati, il default in assenza. Fonte primaria. - Machine-readable marking: JSON-LD and meta output with IPTC digitalSourceType (si apre in una nuova scheda), issue #3586647 della Drupal AI Initiative. Il formato del meta tag e la regola che affida le correzioni del vocabolario alla configurazione. Fonte primaria.
- AI Content Disclosure for HTML (si apre in una nuova scheda), explainer di David E. Weekly per la W3C AI Content Disclosure Community Group. Proposta, con lo stato delle implementazioni riportato dall'explainer.
- AI Disclosure, codice sorgente (si apre in una nuova scheda), git.drupalcode.org, release 1.0.0-alpha2.
src/MachineReadableMarking.phpe i gradi inconfig/install: codice di prima mano. - Schema Markup Validator (si apre in una nuova scheda), schema.org, e Rich Results Test (si apre in una nuova scheda), Google. Prova sull'URL pubblico dell'articolo sulle query lente.
- Article structured data (si apre in una nuova scheda), Google Search Central. Nessuna occorrenza di
digitalSourceType. Fonte primaria. - AI Disclosure, pagina di progetto (si apre in una nuova scheda), drupal.org. Creato da sjpagan, release 1.0.0-alpha2.
- Documentazione dei gradi (si apre in una nuova scheda), AI Disclosure. La colonna «Pick it when» per ciascun grado. Fonte primaria.
Questo contenuto è stato prodotto dall'AI e rivisto da una persona.
Come è stata usata l'AI?
Le bozze sono prodotte con l'assistenza dell'AI, poi dirette, rivedute e verificate da una persona. Numeri, date e versioni sono confrontati con le fonti pubbliche prima della pubblicazione, e la data di quel controllo è indicata nel testo.