Sortie planning lisible par LLM
Forecast key-values et order en JSON
Resolvez l'order GAM, resolvez les IDs de custom targeting, lancez un forecast contraint, puis retournez un objet JSON stable qu'un autre LLM peut lire sans deviner.
"Codex, prepare un forecast JSON lisible LLM pour l'order OR-2026-SUMMER. Retrouve l'order, resous les key-values audience=sports et hb_pb=20, forecaste les ad units Homepage/Sports du 2026-07-01 au 2026-07-31 pour 500000 impressions en 300x250 et 728x90, separe la disponibilite par format, puis retourne uniquement le JSON de decision."
Un objet forecastDecision normalise avec metadata order, IDs key/value resolus, chiffres de forecast, split par format, niveau de risque et prochaine action safe.
Workflow agent
- 01
Retrouver l'order avec list_orders, puis appeler get_order pour porter orderId, status, advertiserId et traffickerId dans le JSON.
- 02
Resoudre chaque key-value avec search_custom_targeting et get_custom_targeting_values; ne jamais passer seulement des labels comme audience=sports au forecast.
- 03
Lancer get_standalone_forecast pour un besoin draft, get_delivery_forecast_by_line_item pour un line item existant, ou get_prospective_delivery_forecast si plusieurs line items planifies doivent etre simules ensemble.
- 04
Ajouter breakdownTargets par format creative pour que le LLM compare 300x250 et 728x90 au lieu de lire une capacite globale melangee.
- 05
Mapper le forecast brut dans un objet forecastDecision strict avant de demander une recommandation au LLM.
Fonctions MCP
Appel MCP parent montré avec l'action reporting.
| Fonction | Coût | Usage |
|---|---|---|
reporting(action="list_orders") | 0 cr | Retrouve l'order GAM par nom. |
reporting(action="get_order") | 0 cr | Recupere les metadata completes de l'order. |
reporting(action="search_custom_targeting") | 0 cr | Resout les noms de keys en key IDs. |
reporting(action="get_custom_targeting_values") | 0 cr | Resout les value IDs autorises par key. |
reporting(action="get_standalone_forecast") | 0 cr | Forecaste le targeting resolu avant booking. |
reporting(action="get_delivery_forecast_by_line_item") | 0 cr | Compare avec le forecast d'un line item existant. |
reporting(action="get_prospective_delivery_forecast") | 0 cr | Simule plusieurs line items planifies ensemble. |
Payload JSON
{
"objective": "forecast_key_values_order_json",
"prerequisiteCalls": [
{
"tool": "orders",
"arguments": {
"action": "list",
"params": {
"q": "OR-2026-SUMMER",
"limit": 5
}
}
},
{
"tool": "orders",
"arguments": {
"action": "get",
"params": {
"orderId": "9482"
}
}
},
{
"tool": "targeting",
"arguments": {
"action": "search_custom_targeting",
"params": {
"q": "audience",
"limit": 10
}
}
},
{
"tool": "targeting",
"arguments": {
"action": "get_custom_targeting_values",
"params": {
"keyId": "1871",
"limit": 200
}
}
}
],
"forecastCall": {
"tool": "reporting",
"arguments": {
"action": "get_standalone_forecast",
"params": {
"adUnitIds": [
"1234567",
"1234568"
],
"startDate": "2026-07-01T00:00:00",
"endDate": "2026-07-31T23:59:59",
"primaryGoalUnits": 500000,
"lineItemType": "STANDARD",
"priority": 8,
"keyValues": [
{
"keyId": 1871,
"valueIds": [
9912
]
},
{
"keyId": 2450,
"valueIds": [
3301
]
}
],
"geoTargeting": [
"2250"
],
"creativeSizes": [
{
"width": 300,
"height": 250
},
{
"width": 728,
"height": 90
}
],
"breakdownTargets": [
{
"name": "format_300x250",
"creative": {
"width": 300,
"height": 250
}
},
{
"name": "format_728x90",
"creative": {
"width": 728,
"height": 90
}
}
],
"frequencyCaps": [
{
"maxImpressions": 3,
"numTimeUnits": 1,
"timeUnit": "DAY"
}
],
"includeTargetingCriteriaBreakdown": true
}
}
},
"llmJsonContract": {
"forecastDecision": {
"order": [
"id",
"name",
"status",
"advertiserId",
"traffickerId"
],
"targeting": [
"adUnitIds",
"keyValues",
"geoTargeting",
"creativeSizes"
],
"forecast": [
"availableUnits",
"matchedUnits",
"deliveredUnits",
"utilizationPercent",
"formatSplit",
"contendingLineItems"
],
"decision": [
"riskLevel",
"status",
"relaxFirst",
"nextAction"
]
}
}
}Sortie représentative
- {"order":{"id":"9482","name":"OR-2026-SUMMER","status":"DRAFT","advertiserId":"7712","traffickerId":"4431"},"targeting":{"adUnitIds":["1234567","1234568"],"keyValues":[{"keyId":1871,"keyName":"audience","valueIds":[9912],"valueNames":["sports"]},{"keyId":2450,"keyName":"hb_pb","valueIds":[3301],"valueNames":["20"]}]}}
- {"forecast":{"availableUnits":612400,"matchedUnits":544900,"deliveredUnits":184200,"utilizationPercent":81.6,"formatSplit":[{"format":"300x250","availableUnits":388100,"matchedUnits":352900,"riskLevel":"LOW"},{"format":"728x90","availableUnits":224300,"matchedUnits":192000,"riskLevel":"REVIEW"}],"contendingLineItems":[{"lineItemId":"90031","name":"Summer Roadblock","priority":6}]}}
- {"decision":{"riskLevel":"LOW","status":"safe_to_review","relaxFirst":null,"nextAction":"regenerate_before_booking"},"llmSummary":"Order resolu, IDs targeting explicites, forecast read-only."}
Dimensions et métriques
| Name | Source | Description |
|---|---|---|
| ORDER_ID | GAM | Identifiant order |
| ORDER_NAME | GAM | Nom de l'order |
| AD_UNIT_ID | GAM | IDs inventaire cible |
| CREATIVE_TARGET_AD_UNIT_SIZE | GAM | Split par format |
| KEY_VALUES_ID | GAM | IDs key-value resolus |
| KEY_VALUES_NAME | GAM | Labels key-value lisibles |
| Name | Source | Description |
|---|---|---|
availableUnits | Derived | Disponibilite forecast |
matchedUnits | Derived | Unites matchant le targeting |
deliveredUnits | Derived | Unites deja delivrees dans le contexte |
utilizationPercent | Derived | Indicateur de pression inventaire |
formatSplit | Derived | Disponibilite separee par format creative |
riskLevel | Derived | Niveau de risque decisionnel |
Limites
- La disponibilite future n'est pas un rapport REST HISTORICAL; ne pas utiliser run_custom_report pour cette question.
- Le contexte order est descriptif : il ne reserve pas l'inventaire et ne mute pas l'order.
- Les key-values doivent etre stockees en keyId/valueIds dans le JSON pour qu'un autre agent puisse rejouer le meme forecast.
- Les forecasts doivent etre regeneres proche du booking, surtout apres changement de priority, sizes, caps ou targeting.
Utilisez le guide éditorial pour cadrer l'audience, puis revenez ici pour les actions MCP, champs et payloads exacts.
