

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Ejemplo 3: Metadatos contextuales
<a name="monetization-functions-examples-contextual-metadata"></a>

Esta sección proporciona JSONata expresiones para patrones comunes cuando se trabaja con `GetMetadata` respuestas de inferencia elemental. Utilízalas en el `Output` bloque de tu `AWS_SERVICE_REQUEST` función.

**nota**  
`GetMetadata`devuelve una `items` matriz en la que cada elemento representa una foto analizada con categorías de IAB taxonomía y evaluaciones de seguridad de la GARM marca. Cuando el intervalo de tiempo de la consulta abarca varias tomas, la respuesta incluye varios elementos. Las expresiones de las siguientes secciones solucionan este problema agrupando todas las tomas.  
Para ver el esquema completo de `GetMetadata` respuestas de Elemental Inference, consulta la referencia de la API de Elemental Inference.

## Crea la ventana de tiempo de consulta
<a name="monetization-functions-examples-contextual-metadata-timewindow"></a>

Usa la siguiente expresión para el `Body` campo de tu `AWS_SERVICE_REQUEST` función:

```
{%'{"outputName": "my-contextual-output", "timeSpecification": {"ptsBased": {"startPts": ' & $string(($exists(inference.previousBreakEndPts) and inference.previousBreakEndPts > inference.pts - 30 * inference.timescale ? inference.previousBreakEndPts : inference.pts - 30 * inference.timescale)) & ', "endPts": ' & $string(inference.pts + 1) & ', "timescale": ' & $string(inference.timescale) & '}}, "parameters": {"contextualMetadata": {}}}' %}
```

Esta expresión selecciona la más reciente `inference.previousBreakEndPts` y una retrospectiva de 30 segundos, garantizando que la ventana de consulta nunca supere los 30 segundos. Si no `inference.previousBreakEndPts` está disponible (por ejemplo, la primera pausa publicitaria), la expresión utiliza de forma predeterminada la retrospectiva de 30 segundos.

**nota**  
`my-contextual-output`Sustitúyala por el nombre de la salida de metadatos contextuales de tu feed de Inferencia Elemental.

## Extract IAB identificadores de categoría
<a name="monetization-functions-examples-contextual-metadata-iab-ids"></a>

```
{%response.statusCode = 200 ? $join($distinct(response.body.items.metadata.contextualMetadata.iabTaxonomy.categories.uniqueId), ',') : ''%}
```

Resultado: `"641,645,324"` — ID únicos de la taxonomía de IAB contenido, adecuados para pasarlos como parámetro de consulta (por ejemplo,`iab_cats=641,645,324`).

## Extract IAB rutas de categorías
<a name="monetization-functions-examples-contextual-metadata-iab-paths"></a>

```
{%response.statusCode = 200 ? $join($distinct(response.body.items.metadata.contextualMetadata.iabTaxonomy.categories.($join(path, ' > '))), '|') : ''%}
```

Resultado: `"Genres > Animation & Anime|Genres > Family/Children|Entertainment > Movies"` — rutas taxonómicas legibles por humanos.

## Extracto marcado GRANJA categories
<a name="monetization-functions-examples-contextual-metadata-garm-flagged"></a>

```
{%response.statusCode = 200 ? $join($distinct(response.body.items.metadata.contextualMetadata.garm.suitability.categories[flagged = true].category), ',') : ''%}
```

Resultado`"ILLEGAL_DRUGS_TOBACCO_ALCOHOL"`: categorías para excluirlas de la segmentación de anuncios o para informar a tu servidor de decisiones publicitarias de los problemas relacionados con la seguridad de la marca.

## Determina la más alta GARM nivel de riesgo
<a name="monetization-functions-examples-contextual-metadata-garm-risk"></a>

```
{%response.statusCode = 200 and $exists(response.body.items) ? ($names := ['NONE','LOW','MEDIUM','HIGH']; $flagged := response.body.items.metadata.contextualMetadata.garm.suitability.categories[flagged = true].risk; $scores := $map($flagged, function($r){ $r = 'HIGH' ? 3 : $r = 'MEDIUM' ? 2 : $r = 'LOW' ? 1 : 0 }); $count($scores) > 0 ? $names[$max($scores)] : 'NONE') : ''%}
```

Resultado: `"MEDIUM"` — el nivel de riesgo más desfavorable en todas las vacunas y GARM categorías analizadas. Devuelve una cadena vacía si la solicitud falla o si falta el cuerpo de la respuesta, de modo que los datos faltantes no se notifican como tales. `NONE`

## Compruebe la seguridad de la marca
<a name="monetization-functions-examples-contextual-metadata-brand-safe"></a>

```
{%response.statusCode = 200 and $exists(response.body.items) ? $string($not($exists(response.body.items.metadata.contextualMetadata.garm.suitability.categories[flagged = true]))) : ''%}
```

Resultado: `"false"` si alguna GARM categoría está marcada, `"true"` si el contenido es seguro para la marca. Devuelve una cadena vacía si la solicitud falla o si falta el cuerpo de la respuesta.

**importante**  
El `$exists(response.body.items)` guardia es obligatorio. Una respuesta puede mostrar el código de estado 200 mientras `response.body` está`null`, por ejemplo, cuando el cuerpo supera los 20 000 caracteres o no es un JSON válido. Sin la protección, la expresión se devuelve `"true"` e indica que el contenido es seguro para la marca, aunque las GARM clasificaciones nunca se hayan recibido.

## Señal contextual combinada
<a name="monetization-functions-examples-contextual-metadata-combined"></a>

```
{%response.statusCode = 200 ? $string({'categories': $distinct(response.body.items.metadata.contextualMetadata.iabTaxonomy.categories.($join(path, ' > '))), 'category_ids': $distinct(response.body.items.metadata.contextualMetadata.iabTaxonomy.categories.uniqueId), 'garm_flagged': $distinct(response.body.items.metadata.contextualMetadata.garm.suitability.categories[flagged = true].category)}) : ''%}
```

Resultado: una cadena JSON que combina todas las señales contextuales en una única carga útil estructurada.

## Per-shot detalle
<a name="monetization-functions-examples-contextual-metadata-per-shot"></a>

```
{%response.statusCode = 200 ? $string(response.body.items.{'pts': pts, 'categories': metadata.contextualMetadata.iabTaxonomy.categories.($join(path, ' > ')), 'garm_flagged': metadata.contextualMetadata.garm.suitability.categories[flagged = true].category}) : ''%}
```

Resultado: conjunto de objetos por toma que preservan qué contenido y en qué PTS activó qué clasificaciones. Utilízalo cuando la lógica de toma de decisiones de anuncios necesite granularidad temporal.

## Consejos y prácticas recomendadas
<a name="monetization-functions-examples-contextual-metadata-tips"></a>

Usa los siguientes consejos para crear expresiones de salida para las respuestas de la inferencia elemental.
+ Compruébalo siempre `response.statusCode` antes de procesar el cuerpo. Si la llamada falla, `response.body` es`null`.
+ `$distinct()`Utilízalo para deduplicar categorías en varias tomas.
+ Elemental Inference muestra varias IAB categorías por toma y un conjunto de categorías de seguridad de GARM marca. Para conocer los límites actuales, consulta la documentación de Elemental Inference.
+ Cuando la ventana de tiempo abarca varias tomas, la respuesta contiene varios elementos de la `items` matriz.
+ El tamaño máximo de respuesta es de 20 000 caracteres. Si recibe respuestas truncadas, reduzca el intervalo de tiempo.
+ Usa las claves `temp.*` de salida cuando te conectes con otras funciones de a `SEQUENTIAL_EXECUTOR` y `player_params.*` cuando pases valores directamente a la URL del servidor de decisiones publicitarias.
+ Para ver la lista completa de JSONata funciones y operadores compatibles, consulta[JSONata referencia de expresiones para funciones](monetization-functions-jsonata.md).

Para obtener la guía de configuración completa, incluidos los requisitos previos y las políticas de recursos, consulte[Integración de la inferencia elemental](monetization-functions-elemental-inference-integration.md). Para ver la referencia del tipo de función, consulte[AWS solicitud de servicio](monetization-functions-types-aws-service-request.md).