LLM-lesbarer Planning Output
Key-Value Forecast mit Order-Kontext als JSON
Order in GAM aufloesen, Custom-Targeting IDs aufloesen, constrained Forecast ausfuehren und ein stabiles JSON Objekt zurueckgeben, das ein anderes LLM ohne Raten lesen kann.
"Codex, erstelle einen LLM-lesbaren JSON Forecast fuer Order OR-2026-SUMMER. Loese die Order auf, loese key-values audience=sports und hb_pb=20, forecaste Homepage/Sports Ad Units vom 2026-07-01 bis 2026-07-31 fuer 500000 Impressions mit 300x250 und 728x90, splitte Verfuegbarkeit nach Format und gib nur das Decision JSON zurueck."
Ein normalisiertes forecastDecision JSON mit Order-Metadaten, aufgeloesten key/value IDs, Forecast-Zahlen, Format-Split, Risiko und naechster sicherer Aktion.
Agentenablauf
- 01
Order mit list_orders finden, dann get_order aufrufen, damit orderId, status, advertiserId und traffickerId im JSON stehen.
- 02
Jedes key-value mit search_custom_targeting und get_custom_targeting_values aufloesen; nie nur Labels wie audience=sports an den Forecast uebergeben.
- 03
get_standalone_forecast fuer Draft-Bedarf, get_delivery_forecast_by_line_item fuer bestehende Line Items oder get_prospective_delivery_forecast fuer mehrere gemeinsam simulierte geplante Line Items nutzen.
- 04
breakdownTargets nach Creative-Format hinzufuegen, damit das LLM 300x250 und 728x90 vergleicht statt eine gemischte Kapazitaet zu lesen.
- 05
Den Raw Forecast in ein striktes forecastDecision Objekt mappen, bevor das LLM eine Empfehlung geben darf.
MCP-Funktionen
Parent-MCP-Aufruf mit reporting action.
| Funktion | Kosten | Zweck |
|---|---|---|
reporting(action="list_orders") | 0 cr | Findet die GAM Order per Name. |
reporting(action="get_order") | 0 cr | Holt vollstaendige Order-Metadaten. |
reporting(action="search_custom_targeting") | 0 cr | Loest Key-Namen zu Key IDs auf. |
reporting(action="get_custom_targeting_values") | 0 cr | Loest erlaubte Value IDs pro Key auf. |
reporting(action="get_standalone_forecast") | 0 cr | Forecastet das aufgeloeste Targeting vor Booking. |
reporting(action="get_delivery_forecast_by_line_item") | 0 cr | Vergleicht mit Forecast eines bestehenden Line Items. |
reporting(action="get_prospective_delivery_forecast") | 0 cr | Simuliert mehrere geplante Line Items gemeinsam. |
JSON Payload
{
"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"
]
}
}
}Beispielausgabe
- {"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 aufgeloest, Targeting IDs explizit, Forecast read-only."}
Dimensionen und Metrics
| Name | Quelle | Beschreibung |
|---|---|---|
| ORDER_ID | GAM | Order ID |
| ORDER_NAME | GAM | Order Name |
| AD_UNIT_ID | GAM | Zielinventar IDs |
| CREATIVE_TARGET_AD_UNIT_SIZE | GAM | Format-Split |
| KEY_VALUES_ID | GAM | Aufgeloeste Key-Value IDs |
| KEY_VALUES_NAME | GAM | Lesbare Key-Value Labels |
| Name | Quelle | Beschreibung |
|---|---|---|
availableUnits | Derived | Forecast-Verfuegbarkeit |
matchedUnits | Derived | Einheiten passend zum Targeting |
deliveredUnits | Derived | Bereits gelieferte Einheiten im Kontext |
utilizationPercent | Derived | Inventardruck-Indikator |
formatSplit | Derived | Verfuegbarkeit nach Creative-Format |
riskLevel | Derived | Risikolabel |
Grenzen
- Zukuenftige Verfuegbarkeit ist kein HISTORICAL REST Report; fuer diese Frage nicht run_custom_report nutzen.
- Order-Kontext ist beschreibend: er reserviert kein Inventar und mutiert keine Order.
- Key-values muessen als keyId/valueIds im JSON stehen, damit ein anderer Agent denselben Forecast wiederholen kann.
- Forecasts sollten kurz vor Booking neu erzeugt werden, besonders nach Aenderungen an priority, sizes, caps oder targeting.
Nutze den redaktionellen Guide fuer die Zielgruppenlogik und komme dann fuer exakte MCP Actions, Felder und Payloads hierher zurueck.
