Output planning leggibile dal LLM
Forecast key-values e order in JSON
Risolvi l'order GAM, risolvi gli ID di custom targeting, esegui un forecast vincolato e restituisci un oggetto JSON stabile che un altro LLM possa leggere senza indovinare.
"Codex, prepara un forecast JSON leggibile dal LLM per l'order OR-2026-SUMMER. Trova l'order, risolvi le key-values audience=sports e hb_pb=20, forecastea le ad units Homepage/Sports dal 2026-07-01 al 2026-07-31 per 500000 impression con 300x250 e 728x90, separa la disponibilita per formato, poi restituisci solo il JSON decisionale."
Un oggetto forecastDecision normalizzato con metadata order, ID key/value risolti, numeri forecast, split per formato, rischio e prossima azione sicura.
Flusso agente
- 01
Trovare l'order con list_orders, poi chiamare get_order per portare orderId, status, advertiserId e traffickerId nel JSON.
- 02
Risolvere ogni key-value con search_custom_targeting e get_custom_targeting_values; non passare mai solo label come audience=sports al forecast.
- 03
Eseguire get_standalone_forecast per un bisogno draft, get_delivery_forecast_by_line_item per un line item esistente, o get_prospective_delivery_forecast se piu line items pianificati devono essere simulati insieme.
- 04
Aggiungere breakdownTargets per formato creative per far confrontare al LLM 300x250 e 728x90 invece di leggere una capacita miscelata.
- 05
Mappare il forecast grezzo in un oggetto forecastDecision stretto prima di chiedere una raccomandazione al LLM.
Funzioni MCP
Chiamata MCP parent mostrata con l'azione reporting.
| Funzione | Costo | Uso |
|---|---|---|
reporting(action="list_orders") | 0 cr | Trova l'order GAM per nome. |
reporting(action="get_order") | 0 cr | Recupera metadata completa dell'order. |
reporting(action="search_custom_targeting") | 0 cr | Risolve nomi key in key ID. |
reporting(action="get_custom_targeting_values") | 0 cr | Risolve value ID consentiti per key. |
reporting(action="get_standalone_forecast") | 0 cr | Forecastea il targeting risolto prima del booking. |
reporting(action="get_delivery_forecast_by_line_item") | 0 cr | Confronta con forecast di un line item esistente. |
reporting(action="get_prospective_delivery_forecast") | 0 cr | Simula piu line items pianificati insieme. |
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"
]
}
}
}Output rappresentativo
- {"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 risolto, targeting esplicito, forecast read-only."}
Dimensioni e metriche
| Name | Fonte | Descrizione |
|---|---|---|
| ORDER_ID | GAM | Identificativo order |
| ORDER_NAME | GAM | Nome order |
| AD_UNIT_ID | GAM | ID inventory target |
| CREATIVE_TARGET_AD_UNIT_SIZE | GAM | Split per formato |
| KEY_VALUES_ID | GAM | ID key-value risolti |
| KEY_VALUES_NAME | GAM | Label key-value leggibili |
| Name | Fonte | Descrizione |
|---|---|---|
availableUnits | Derived | Disponibilita forecast |
matchedUnits | Derived | Unita che matchano il targeting |
deliveredUnits | Derived | Unita gia deliverate nel contesto |
utilizationPercent | Derived | Indicatore pressione inventory |
formatSplit | Derived | Disponibilita per formato creative |
riskLevel | Derived | Livello di rischio |
Limiti
- La disponibilita futura non e un report REST HISTORICAL; non usare run_custom_report per questa domanda.
- Il contesto order e descrittivo: non riserva inventory e non muta l'order.
- Le key-values devono essere salvate come keyId/valueIds nel JSON cosi un altro agente puo ripetere lo stesso forecast.
- I forecast vanno rigenerati vicino al booking, soprattutto dopo cambi di priority, sizes, caps o targeting.
Usa la guida editoriale per il contesto audience, poi torna qui per azioni MCP, campi e payload esatti.
