Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .changeset/format-assets-produced-by.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"adcontextprotocol": minor
---

Add `produced_by` enum to `format.assets[]` slots to distinguish buyer-provided inputs from creative-agent-generated outputs.

`produced_by: 'buyer'` (default, backward-compatible) means the buyer provides the asset in `build_creative` input requests. `produced_by: 'build_creative'` means the creative agent generates the asset in the response; buyers MUST NOT include it in input requests, and implementations MUST reject requests that supply a value for such a slot.

Added to both `baseIndividualAsset` and `baseGroupAsset` definitions. Resolves conformance ambiguity in adapters that currently declare output slots using `required: false` because no better discriminator existed. Closes #4021.
37 changes: 32 additions & 5 deletions static/schemas/source/core/format.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,29 @@
},
"required": {
"type": "boolean",
"description": "Whether this asset is required (true) or optional (false). Required assets must be provided for a valid creative. Optional assets enhance the creative but are not mandatory."
"default": false,
"description": "Whether this asset is required (true) or optional (false). Required assets must be provided for a valid creative. Optional assets enhance the creative but are not mandatory. Only applies to buyer-provided slots (produced_by: 'buyer')."
},
"produced_by": {
"type": "string",
"enum": ["buyer", "build_creative"],
"default": "buyer",
"description": "Who produces this asset. 'buyer' (default) means the buyer provides this asset in build_creative input requests. 'build_creative' means the creative agent generates this asset in the response; buyers MUST NOT include it in input requests, and implementations MUST reject build_creative requests that supply a value for this slot."
},
"overlays": {
"type": "array",
"description": "Publisher-controlled elements rendered on top of buyer content at this asset's position (e.g., video player controls, publisher logos). Creative agents should avoid placing critical content (CTAs, logos, key copy) within overlay bounds.",
"items": { "$ref": "/schemas/core/overlay.json" }
}
},
"required": ["item_type", "asset_id", "asset_type", "required"]
"required": ["item_type", "asset_id", "asset_type", "required"],
"if": {
"properties": { "produced_by": { "const": "build_creative" } },
"required": ["produced_by"]
},
"then": {
"properties": { "required": { "const": false } }
}
},
"baseGroupAsset": {
"type": "object",
Expand All @@ -46,16 +60,29 @@
},
"required": {
"type": "boolean",
"description": "Whether this asset is required within each repetition of the group",
"description": "Whether this asset is required within each repetition of the group. Only applies to buyer-provided slots (produced_by: 'buyer').",
"default": false
},
"produced_by": {
"type": "string",
"enum": ["buyer", "build_creative"],
"default": "buyer",
"description": "Who produces this asset. 'buyer' (default) means the buyer provides this asset in build_creative input requests. 'build_creative' means the creative agent generates this asset in the response; buyers MUST NOT include it in input requests, and implementations MUST reject build_creative requests that supply a value for this slot."
},
"overlays": {
"type": "array",
"description": "Publisher-controlled elements rendered on top of buyer content at this asset's position (e.g., carousel navigation arrows, slide indicators). Creative agents should avoid placing critical content within overlay bounds.",
"items": { "$ref": "/schemas/core/overlay.json" }
}
},
"required": ["asset_id", "asset_type", "required"]
"required": ["asset_id", "asset_type", "required"],
"if": {
"properties": { "produced_by": { "const": "build_creative" } },
"required": ["produced_by"]
},
"then": {
"properties": { "required": { "const": false } }
}
}
},
"properties": {
Expand Down Expand Up @@ -195,7 +222,7 @@
},
"assets": {
"type": "array",
"description": "Array of all assets supported for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Use the 'required' boolean on each asset to indicate whether it's mandatory.",
"description": "Array of all assets supported for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Use the 'required' boolean on each asset to indicate whether it's mandatory. Use 'produced_by' to distinguish slots the buyer provides in build_creative requests ('buyer', default) from slots the creative agent generates in the response ('build_creative').",
"items": {
"oneOf": [
{
Expand Down
Loading