@adcp/client 4.22.1 → 4.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -9
- package/bin/adcp.js +83 -18
- package/dist/lib/index.d.ts +3 -5
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +16 -12
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/server/index.d.ts +5 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +10 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/postgres-task-store.d.ts +105 -0
- package/dist/lib/server/postgres-task-store.d.ts.map +1 -0
- package/dist/lib/server/postgres-task-store.js +267 -0
- package/dist/lib/server/postgres-task-store.js.map +1 -0
- package/dist/lib/server/responses.d.ts +1 -0
- package/dist/lib/server/responses.d.ts.map +1 -1
- package/dist/lib/server/responses.js +1 -0
- package/dist/lib/server/responses.js.map +1 -1
- package/dist/lib/server/test-controller.d.ts +88 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -0
- package/dist/lib/server/test-controller.js +227 -0
- package/dist/lib/server/test-controller.js.map +1 -0
- package/dist/lib/testing/agent-tester.d.ts +1 -1
- package/dist/lib/testing/agent-tester.d.ts.map +1 -1
- package/dist/lib/testing/agent-tester.js +13 -1
- package/dist/lib/testing/agent-tester.js.map +1 -1
- package/dist/lib/testing/compliance/comply.d.ts +24 -5
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +318 -277
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/index.d.ts +2 -1
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js +6 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/platform-storyboards.d.ts +44 -0
- package/dist/lib/testing/compliance/platform-storyboards.d.ts.map +1 -0
- package/dist/lib/testing/compliance/platform-storyboards.js +232 -0
- package/dist/lib/testing/compliance/platform-storyboards.js.map +1 -0
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts +2 -9
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.js +15 -46
- package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -1
- package/dist/lib/testing/compliance/types.d.ts +22 -1
- package/dist/lib/testing/compliance/types.d.ts.map +1 -1
- package/dist/lib/testing/index.d.ts +1 -1
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js +6 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/orchestrator.d.ts.map +1 -1
- package/dist/lib/testing/orchestrator.js +5 -1
- package/dist/lib/testing/orchestrator.js.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.d.ts +19 -1
- package/dist/lib/testing/scenarios/brand-rights.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.js +138 -1
- package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
- package/dist/lib/testing/scenarios/deterministic.js +7 -7
- package/dist/lib/testing/scenarios/deterministic.js.map +1 -1
- package/dist/lib/testing/scenarios/index.d.ts +1 -1
- package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/index.js +4 -2
- package/dist/lib/testing/scenarios/index.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +4 -4
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
- package/dist/lib/testing/storyboard/loader.d.ts +1 -0
- package/dist/lib/testing/storyboard/loader.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/loader.js +14 -0
- package/dist/lib/testing/storyboard/loader.js.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.js +88 -11
- package/dist/lib/testing/storyboard/request-builder.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +83 -5
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/task-map.d.ts +2 -0
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/task-map.js +23 -9
- package/dist/lib/testing/storyboard/task-map.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +6 -2
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.js +21 -4
- package/dist/lib/testing/storyboard/validations.js.map +1 -1
- package/dist/lib/testing/types.d.ts +1 -1
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/core.generated.d.ts +242 -3
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +1 -1
- package/dist/lib/types/schemas.generated.d.ts +3697 -3468
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +226 -118
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +281 -79
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.d.ts +2 -2
- package/dist/lib/utils/capabilities.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.js +9 -3
- package/dist/lib/utils/capabilities.js.map +1 -1
- package/dist/lib/utils/response-schemas.d.ts.map +1 -1
- package/dist/lib/utils/response-schemas.js +9 -0
- package/dist/lib/utils/response-schemas.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/docs/llms.txt +56 -32
- package/package.json +8 -2
- package/skills/adcp/SKILL.md +118 -33
- package/skills/build-creative-agent/SKILL.md +221 -0
- package/skills/build-generative-seller-agent/SKILL.md +288 -0
- package/skills/build-retail-media-agent/SKILL.md +237 -0
- package/skills/build-seller-agent/SKILL.md +313 -0
- package/skills/build-signals-agent/SKILL.md +203 -0
- package/storyboards/audience_sync.yaml +18 -29
- package/storyboards/behavioral_analysis.yaml +40 -72
- package/storyboards/brand_rights.yaml +172 -75
- package/storyboards/campaign_governance_conditions.yaml +187 -0
- package/storyboards/campaign_governance_delivery.yaml +231 -0
- package/storyboards/campaign_governance_denied.yaml +136 -0
- package/storyboards/capability_discovery.yaml +106 -0
- package/storyboards/content_standards.yaml +251 -0
- package/storyboards/creative_ad_server.yaml +108 -16
- package/storyboards/creative_generative.yaml +317 -0
- package/storyboards/creative_lifecycle.yaml +284 -0
- package/storyboards/creative_sales_agent.yaml +2 -6
- package/storyboards/creative_template.yaml +3 -6
- package/storyboards/deterministic_testing.yaml +271 -245
- package/storyboards/error_compliance.yaml +105 -108
- package/storyboards/media_buy_catalog_creative.yaml +8 -5
- package/storyboards/media_buy_generative_seller.yaml +581 -0
- package/storyboards/media_buy_governance_escalation.yaml +10 -6
- package/storyboards/media_buy_guaranteed_approval.yaml +21 -19
- package/storyboards/media_buy_non_guaranteed.yaml +9 -8
- package/storyboards/media_buy_proposal_mode.yaml +12 -11
- package/storyboards/media_buy_seller.yaml +161 -173
- package/storyboards/media_buy_state_machine.yaml +102 -101
- package/storyboards/property_governance.yaml +239 -0
- package/storyboards/schema.yaml +3 -2
- package/storyboards/schema_validation.yaml +58 -51
- package/storyboards/si_session.yaml +99 -317
- package/storyboards/signal_marketplace.yaml +9 -5
- package/storyboards/signal_owned.yaml +6 -5
- package/storyboards/social_platform.yaml +274 -0
- package/storyboards/test-kits/acme-outdoor.yaml +118 -0
- package/storyboards/test-kits/nova-motors.yaml +134 -0
- package/storyboards/governance_content_standards.yaml +0 -213
- package/storyboards/governance_property_lists.yaml +0 -372
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
id: creative_generative
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Generative creative agent"
|
|
4
|
+
category: creative_generative
|
|
5
|
+
summary: "Agent that takes a brief and generates finished creatives from scratch — no input assets required."
|
|
6
|
+
|
|
7
|
+
narrative: |
|
|
8
|
+
You run a generative creative platform — an AI ad network, a generative DSP, or any system
|
|
9
|
+
that creates ad creatives from a natural-language brief and brand identity. The buyer doesn't
|
|
10
|
+
push assets to you. Instead, they describe what they want, point you at a brand.json, and
|
|
11
|
+
your agent produces finished creatives ready for trafficking.
|
|
12
|
+
|
|
13
|
+
This is fundamentally different from template-based transformation (Celtra) or library-based
|
|
14
|
+
retrieval (Innovid). Your agent creates something new. The buyer sends a brief, optionally
|
|
15
|
+
with seed assets or constraints, and your platform generates creatives — potentially in
|
|
16
|
+
multiple formats at once.
|
|
17
|
+
|
|
18
|
+
This storyboard walks through the generation flow: format discovery, brief-driven generation,
|
|
19
|
+
multi-format builds, iterative refinement, and quality progression from draft to production.
|
|
20
|
+
|
|
21
|
+
agent:
|
|
22
|
+
interaction_model: stateless_generate
|
|
23
|
+
capabilities:
|
|
24
|
+
- supports_generation
|
|
25
|
+
examples:
|
|
26
|
+
- "OpenAds"
|
|
27
|
+
- "AI ad networks"
|
|
28
|
+
- "Generative DSPs"
|
|
29
|
+
|
|
30
|
+
caller:
|
|
31
|
+
role: buyer_agent
|
|
32
|
+
example: "Scope3 (DSP)"
|
|
33
|
+
|
|
34
|
+
prerequisites:
|
|
35
|
+
description: |
|
|
36
|
+
The caller needs a brand identity (brand.json at the brand's domain) for the agent
|
|
37
|
+
to resolve visual identity — logos, colors, fonts, tone. The test kit provides a
|
|
38
|
+
sample brand with campaign parameters.
|
|
39
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
40
|
+
|
|
41
|
+
phases:
|
|
42
|
+
- id: format_discovery
|
|
43
|
+
title: "Discover generative formats"
|
|
44
|
+
narrative: |
|
|
45
|
+
The buyer needs to know what your agent can generate. Unlike a template platform
|
|
46
|
+
where formats are fixed dimensions, generative formats describe what the agent
|
|
47
|
+
produces — the output type, constraints, and what inputs it accepts. A generative
|
|
48
|
+
format might be "display_300x250_generative" that accepts a brief and produces
|
|
49
|
+
a finished banner, or "social_post_generative" that creates platform-native content.
|
|
50
|
+
|
|
51
|
+
steps:
|
|
52
|
+
- id: discover_formats
|
|
53
|
+
title: "Discover available generative formats"
|
|
54
|
+
narrative: |
|
|
55
|
+
The buyer asks: "What can you generate?" Your platform returns the formats
|
|
56
|
+
you support. Each format describes the output type, dimensions, and what
|
|
57
|
+
inputs it needs (brief text, brand reference, seed images, etc.).
|
|
58
|
+
task: list_creative_formats
|
|
59
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
60
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
61
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
62
|
+
comply_scenario: creative_sync
|
|
63
|
+
stateful: false
|
|
64
|
+
expected: |
|
|
65
|
+
Return your generative formats. Each format should include:
|
|
66
|
+
- format_id with your agent_url and a unique id
|
|
67
|
+
- Human-readable name and description
|
|
68
|
+
- Asset slots describing what inputs are accepted (brief text, images, etc.)
|
|
69
|
+
- Render dimensions for the output
|
|
70
|
+
- Variables for any dynamic fields the buyer can control
|
|
71
|
+
|
|
72
|
+
sample_request: {}
|
|
73
|
+
|
|
74
|
+
validations:
|
|
75
|
+
- check: response_schema
|
|
76
|
+
description: "Response matches list-creative-formats-response.json schema"
|
|
77
|
+
- check: field_present
|
|
78
|
+
path: "formats"
|
|
79
|
+
description: "Response contains a formats array"
|
|
80
|
+
- check: field_present
|
|
81
|
+
path: "formats[0].format_id.agent_url"
|
|
82
|
+
description: "Each format has a format_id with agent_url"
|
|
83
|
+
|
|
84
|
+
- id: generate_from_brief
|
|
85
|
+
title: "Generate from brief"
|
|
86
|
+
narrative: |
|
|
87
|
+
The buyer describes what they want in natural language and your agent generates
|
|
88
|
+
a creative from scratch. The brief includes the campaign message, target audience
|
|
89
|
+
context, and a brand reference so your agent can resolve visual identity.
|
|
90
|
+
|
|
91
|
+
This is the core generative flow. The buyer doesn't provide finished assets —
|
|
92
|
+
they provide intent, and your agent creates.
|
|
93
|
+
|
|
94
|
+
steps:
|
|
95
|
+
- id: build_draft
|
|
96
|
+
title: "Generate a draft creative from brief"
|
|
97
|
+
narrative: |
|
|
98
|
+
The buyer sends a brief describing the campaign and a target format. Your
|
|
99
|
+
agent generates a draft creative — fast, lower-fidelity output the buyer can
|
|
100
|
+
review before committing to a production build.
|
|
101
|
+
|
|
102
|
+
The brief is passed as a message alongside the target format. The brand
|
|
103
|
+
reference lets your agent resolve brand.json for visual identity.
|
|
104
|
+
task: build_creative
|
|
105
|
+
schema_ref: "media-buy/build-creative-request.json"
|
|
106
|
+
response_schema_ref: "media-buy/build-creative-response.json"
|
|
107
|
+
doc_ref: "/creative/task-reference/build_creative"
|
|
108
|
+
comply_scenario: creative_flow
|
|
109
|
+
stateful: false
|
|
110
|
+
expected: |
|
|
111
|
+
Return a generated creative manifest:
|
|
112
|
+
- creative_manifest with the generated assets (images, copy, serving code)
|
|
113
|
+
- format_id matching the target format
|
|
114
|
+
- If include_preview is true, include a preview render
|
|
115
|
+
|
|
116
|
+
The output should be a coherent creative that reflects the brief and brand
|
|
117
|
+
identity — not a template with placeholder text.
|
|
118
|
+
|
|
119
|
+
sample_request:
|
|
120
|
+
message: "Create a display banner for a summer outdoor gear sale. Bold, adventurous tone. Headline should emphasize 40% off. Target audience: active adults 25-54."
|
|
121
|
+
target_format_id:
|
|
122
|
+
agent_url: "https://your-agent.example.com"
|
|
123
|
+
id: "display_300x250_generative"
|
|
124
|
+
brand:
|
|
125
|
+
domain: "acme-outdoor.example.com"
|
|
126
|
+
quality: "draft"
|
|
127
|
+
include_preview: true
|
|
128
|
+
|
|
129
|
+
validations:
|
|
130
|
+
- check: response_schema
|
|
131
|
+
description: "Response matches build-creative-response.json schema"
|
|
132
|
+
- check: field_present
|
|
133
|
+
path: "creative_manifest.assets"
|
|
134
|
+
description: "Output manifest includes generated assets"
|
|
135
|
+
- check: field_present
|
|
136
|
+
path: "creative_manifest.format_id"
|
|
137
|
+
description: "Output manifest includes format_id"
|
|
138
|
+
|
|
139
|
+
- id: refine
|
|
140
|
+
title: "Refine the creative"
|
|
141
|
+
narrative: |
|
|
142
|
+
The buyer reviews the draft and wants changes. They send the generated manifest
|
|
143
|
+
back with refinement instructions. Your agent modifies the creative based on the
|
|
144
|
+
feedback — adjusting copy, swapping imagery, or changing the layout.
|
|
145
|
+
|
|
146
|
+
This is iterative: the buyer can refine multiple times until they're satisfied,
|
|
147
|
+
then request a production-quality build.
|
|
148
|
+
|
|
149
|
+
steps:
|
|
150
|
+
- id: refine_creative
|
|
151
|
+
title: "Refine with feedback"
|
|
152
|
+
narrative: |
|
|
153
|
+
The buyer passes the generated manifest back with a message describing what
|
|
154
|
+
to change. Your agent applies the refinements and returns an updated creative.
|
|
155
|
+
task: build_creative
|
|
156
|
+
schema_ref: "media-buy/build-creative-request.json"
|
|
157
|
+
response_schema_ref: "media-buy/build-creative-response.json"
|
|
158
|
+
doc_ref: "/creative/task-reference/build_creative"
|
|
159
|
+
comply_scenario: creative_flow
|
|
160
|
+
stateful: false
|
|
161
|
+
expected: |
|
|
162
|
+
Return a refined creative manifest reflecting the requested changes.
|
|
163
|
+
The output should preserve what worked in the original while applying
|
|
164
|
+
the refinements.
|
|
165
|
+
|
|
166
|
+
sample_request:
|
|
167
|
+
message: "Make the headline larger. Replace the mountain imagery with a trail running scene. Add a CTA button that says 'Shop Now'."
|
|
168
|
+
creative_manifest:
|
|
169
|
+
format_id:
|
|
170
|
+
agent_url: "https://your-agent.example.com"
|
|
171
|
+
id: "display_300x250_generative"
|
|
172
|
+
assets:
|
|
173
|
+
- asset_id: "generated_image"
|
|
174
|
+
asset_type: "image"
|
|
175
|
+
url: "https://your-agent.example.com/generated/abc123.jpg"
|
|
176
|
+
- asset_id: "headline"
|
|
177
|
+
asset_type: "text"
|
|
178
|
+
text: "Summer Sale — 40% Off All Gear"
|
|
179
|
+
target_format_id:
|
|
180
|
+
agent_url: "https://your-agent.example.com"
|
|
181
|
+
id: "display_300x250_generative"
|
|
182
|
+
brand:
|
|
183
|
+
domain: "acme-outdoor.example.com"
|
|
184
|
+
quality: "draft"
|
|
185
|
+
include_preview: true
|
|
186
|
+
|
|
187
|
+
validations:
|
|
188
|
+
- check: response_schema
|
|
189
|
+
description: "Response matches build-creative-response.json schema"
|
|
190
|
+
- check: field_present
|
|
191
|
+
path: "creative_manifest.assets"
|
|
192
|
+
description: "Refined manifest includes assets"
|
|
193
|
+
|
|
194
|
+
- id: multi_format
|
|
195
|
+
title: "Multi-format generation"
|
|
196
|
+
narrative: |
|
|
197
|
+
The buyer needs the creative in multiple sizes. Instead of generating each
|
|
198
|
+
format separately, they pass target_format_ids (plural) and your agent produces
|
|
199
|
+
all formats in a single call. This is where generative agents shine — adapting
|
|
200
|
+
a concept across formats while maintaining visual coherence.
|
|
201
|
+
|
|
202
|
+
steps:
|
|
203
|
+
- id: build_multi_format
|
|
204
|
+
title: "Generate for multiple formats"
|
|
205
|
+
narrative: |
|
|
206
|
+
The buyer passes the refined manifest with multiple target formats. Your
|
|
207
|
+
agent generates a creative for each format, adapting layout, copy, and
|
|
208
|
+
imagery to fit each size while maintaining brand consistency.
|
|
209
|
+
task: build_creative
|
|
210
|
+
schema_ref: "media-buy/build-creative-request.json"
|
|
211
|
+
response_schema_ref: "media-buy/build-creative-response.json"
|
|
212
|
+
doc_ref: "/creative/task-reference/build_creative"
|
|
213
|
+
comply_scenario: creative_flow
|
|
214
|
+
stateful: false
|
|
215
|
+
expected: |
|
|
216
|
+
Return creative manifests for each requested format in creative_manifests
|
|
217
|
+
(plural). Each manifest should:
|
|
218
|
+
- Have a format_id matching one of the target formats
|
|
219
|
+
- Contain complete, format-appropriate assets
|
|
220
|
+
- Maintain visual coherence across formats
|
|
221
|
+
|
|
222
|
+
If a format cannot be produced, include it with an error — don't fail
|
|
223
|
+
the entire request.
|
|
224
|
+
|
|
225
|
+
sample_request:
|
|
226
|
+
message: "Generate production-ready versions for all three sizes."
|
|
227
|
+
creative_manifest:
|
|
228
|
+
format_id:
|
|
229
|
+
agent_url: "https://your-agent.example.com"
|
|
230
|
+
id: "display_300x250_generative"
|
|
231
|
+
assets:
|
|
232
|
+
- asset_id: "generated_image"
|
|
233
|
+
asset_type: "image"
|
|
234
|
+
url: "https://your-agent.example.com/generated/abc123-refined.jpg"
|
|
235
|
+
- asset_id: "headline"
|
|
236
|
+
asset_type: "text"
|
|
237
|
+
text: "Summer Sale — 40% Off All Gear"
|
|
238
|
+
- asset_id: "cta"
|
|
239
|
+
asset_type: "text"
|
|
240
|
+
text: "Shop Now"
|
|
241
|
+
target_format_ids:
|
|
242
|
+
- agent_url: "https://your-agent.example.com"
|
|
243
|
+
id: "display_300x250_generative"
|
|
244
|
+
- agent_url: "https://your-agent.example.com"
|
|
245
|
+
id: "display_728x90_generative"
|
|
246
|
+
- agent_url: "https://your-agent.example.com"
|
|
247
|
+
id: "display_320x50_generative"
|
|
248
|
+
brand:
|
|
249
|
+
domain: "acme-outdoor.example.com"
|
|
250
|
+
quality: "production"
|
|
251
|
+
|
|
252
|
+
validations:
|
|
253
|
+
- check: response_schema
|
|
254
|
+
description: "Response matches build-creative-response.json schema"
|
|
255
|
+
- check: field_present
|
|
256
|
+
path: "creative_manifests"
|
|
257
|
+
description: "Response contains creative_manifests array (plural)"
|
|
258
|
+
|
|
259
|
+
- id: production_build
|
|
260
|
+
title: "Production build"
|
|
261
|
+
narrative: |
|
|
262
|
+
The buyer is satisfied with the concept and needs a final, production-quality
|
|
263
|
+
creative ready for trafficking. They switch quality from draft to production.
|
|
264
|
+
Your agent generates the finished output with full-fidelity assets.
|
|
265
|
+
|
|
266
|
+
steps:
|
|
267
|
+
- id: build_production
|
|
268
|
+
title: "Build at production quality"
|
|
269
|
+
narrative: |
|
|
270
|
+
The buyer requests a production-quality build of the approved concept. Your
|
|
271
|
+
agent generates the final creative with full-fidelity rendering, polished
|
|
272
|
+
assets, and serving code ready for trafficking.
|
|
273
|
+
task: build_creative
|
|
274
|
+
schema_ref: "media-buy/build-creative-request.json"
|
|
275
|
+
response_schema_ref: "media-buy/build-creative-response.json"
|
|
276
|
+
doc_ref: "/creative/task-reference/build_creative"
|
|
277
|
+
comply_scenario: creative_flow
|
|
278
|
+
stateful: false
|
|
279
|
+
expected: |
|
|
280
|
+
Return a production-quality creative manifest:
|
|
281
|
+
- Full-fidelity generated assets
|
|
282
|
+
- Serving code (HTML, JavaScript, or VAST) ready for trafficking
|
|
283
|
+
- Provenance metadata if AI-generated (digital_source_type, ai_tool)
|
|
284
|
+
|
|
285
|
+
sample_request:
|
|
286
|
+
message: "Final production build. No changes needed."
|
|
287
|
+
creative_manifest:
|
|
288
|
+
format_id:
|
|
289
|
+
agent_url: "https://your-agent.example.com"
|
|
290
|
+
id: "display_300x250_generative"
|
|
291
|
+
assets:
|
|
292
|
+
- asset_id: "generated_image"
|
|
293
|
+
asset_type: "image"
|
|
294
|
+
url: "https://your-agent.example.com/generated/abc123-refined.jpg"
|
|
295
|
+
- asset_id: "headline"
|
|
296
|
+
asset_type: "text"
|
|
297
|
+
text: "Summer Sale — 40% Off All Gear"
|
|
298
|
+
- asset_id: "cta"
|
|
299
|
+
asset_type: "text"
|
|
300
|
+
text: "Shop Now"
|
|
301
|
+
target_format_id:
|
|
302
|
+
agent_url: "https://your-agent.example.com"
|
|
303
|
+
id: "display_300x250_generative"
|
|
304
|
+
brand:
|
|
305
|
+
domain: "acme-outdoor.example.com"
|
|
306
|
+
quality: "production"
|
|
307
|
+
include_preview: true
|
|
308
|
+
|
|
309
|
+
validations:
|
|
310
|
+
- check: response_schema
|
|
311
|
+
description: "Response matches build-creative-response.json schema"
|
|
312
|
+
- check: field_present
|
|
313
|
+
path: "creative_manifest.assets"
|
|
314
|
+
description: "Production manifest includes assets"
|
|
315
|
+
- check: field_present
|
|
316
|
+
path: "creative_manifest.format_id"
|
|
317
|
+
description: "Production manifest includes format_id"
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
id: creative_lifecycle
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Creative lifecycle"
|
|
4
|
+
category: creative_lifecycle
|
|
5
|
+
summary: "Full creative lifecycle on a stateful platform: sync multiple creatives, list with filtering, build and preview across formats, observe status transitions."
|
|
6
|
+
track: creative
|
|
7
|
+
required_tools:
|
|
8
|
+
- list_creative_formats
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
You run a creative platform with a persistent library — an ad server, creative management
|
|
12
|
+
platform, or publisher that accepts and stores creative assets. A buyer agent pushes
|
|
13
|
+
multiple creatives in different formats, queries the library, builds serving tags, previews
|
|
14
|
+
renderings, and monitors creative status as assets move through your review pipeline.
|
|
15
|
+
|
|
16
|
+
This storyboard covers the complete creative lifecycle from the buyer's perspective:
|
|
17
|
+
uploading assets, browsing the library, building deliverables across formats, and
|
|
18
|
+
observing status transitions as creatives move from pending_review through to accepted.
|
|
19
|
+
|
|
20
|
+
The individual creative storyboards (template, ad server, sales agent) cover specific
|
|
21
|
+
interaction models. This storyboard tests the full lifecycle across multiple creatives
|
|
22
|
+
and formats on a single platform.
|
|
23
|
+
|
|
24
|
+
agent:
|
|
25
|
+
interaction_model: stateful_preloaded
|
|
26
|
+
capabilities:
|
|
27
|
+
- has_creative_library
|
|
28
|
+
- supports_transformation
|
|
29
|
+
examples:
|
|
30
|
+
- "Innovid"
|
|
31
|
+
- "Flashtalking"
|
|
32
|
+
- "CM360"
|
|
33
|
+
- "Creative management platforms"
|
|
34
|
+
|
|
35
|
+
caller:
|
|
36
|
+
role: buyer_agent
|
|
37
|
+
example: "Pinnacle Agency (buyer)"
|
|
38
|
+
|
|
39
|
+
prerequisites:
|
|
40
|
+
description: |
|
|
41
|
+
The caller needs creative assets in multiple formats (display, video, native) and
|
|
42
|
+
a brand identity. The test kit provides sample assets at standard ad dimensions.
|
|
43
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
44
|
+
|
|
45
|
+
phases:
|
|
46
|
+
- id: discover_formats
|
|
47
|
+
title: "Discover accepted formats"
|
|
48
|
+
narrative: |
|
|
49
|
+
Before pushing any creatives, the buyer discovers what formats your platform accepts.
|
|
50
|
+
This determines which assets to prepare and what dimensions and specs to target.
|
|
51
|
+
|
|
52
|
+
steps:
|
|
53
|
+
- id: list_formats
|
|
54
|
+
title: "List creative formats"
|
|
55
|
+
narrative: |
|
|
56
|
+
The buyer calls list_creative_formats to discover what your platform accepts.
|
|
57
|
+
The response defines format specs: dimensions, asset requirements, mime types,
|
|
58
|
+
and any platform-specific constraints.
|
|
59
|
+
task: list_creative_formats
|
|
60
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
61
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
62
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
63
|
+
comply_scenario: creative_lifecycle
|
|
64
|
+
stateful: false
|
|
65
|
+
expected: |
|
|
66
|
+
Return all creative formats your platform accepts:
|
|
67
|
+
- format_id with your agent_url and unique id
|
|
68
|
+
- Asset requirements (dimensions, file sizes, mime types)
|
|
69
|
+
- Render dimensions
|
|
70
|
+
- At least two formats (e.g., display and video)
|
|
71
|
+
|
|
72
|
+
sample_request: {}
|
|
73
|
+
|
|
74
|
+
validations:
|
|
75
|
+
- check: response_schema
|
|
76
|
+
description: "Response matches list-creative-formats-response.json schema"
|
|
77
|
+
- check: field_present
|
|
78
|
+
path: "formats"
|
|
79
|
+
description: "Response contains formats array"
|
|
80
|
+
|
|
81
|
+
- id: sync_multiple
|
|
82
|
+
title: "Sync multiple creatives"
|
|
83
|
+
narrative: |
|
|
84
|
+
The buyer pushes three creatives in different formats to your platform: a display
|
|
85
|
+
banner, a video spot, and a native card. Your platform validates each creative
|
|
86
|
+
against its format specs and returns per-creative status.
|
|
87
|
+
|
|
88
|
+
steps:
|
|
89
|
+
- id: sync_creatives
|
|
90
|
+
title: "Push three creatives in different formats"
|
|
91
|
+
narrative: |
|
|
92
|
+
The buyer syncs three creatives simultaneously: a 300x250 display banner, a 30s
|
|
93
|
+
video spot, and a native content card. Your platform validates each against its
|
|
94
|
+
format specs and returns per-creative action and status.
|
|
95
|
+
task: sync_creatives
|
|
96
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
97
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
98
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
99
|
+
comply_scenario: creative_lifecycle
|
|
100
|
+
stateful: true
|
|
101
|
+
expected: |
|
|
102
|
+
Accept and validate all three creatives:
|
|
103
|
+
- Per-creative action: created
|
|
104
|
+
- Per-creative status: accepted or pending_review
|
|
105
|
+
- Validation results for each creative
|
|
106
|
+
- Platform-assigned IDs if applicable
|
|
107
|
+
|
|
108
|
+
sample_request:
|
|
109
|
+
account:
|
|
110
|
+
brand:
|
|
111
|
+
domain: "acmeoutdoor.com"
|
|
112
|
+
operator: "pinnacle-agency.com"
|
|
113
|
+
creatives:
|
|
114
|
+
- creative_id: "display_trail_pro_300x250"
|
|
115
|
+
name: "Trail Pro 3000 - Display 300x250"
|
|
116
|
+
format_id:
|
|
117
|
+
agent_url: "https://your-platform.example.com"
|
|
118
|
+
id: "display_300x250"
|
|
119
|
+
assets:
|
|
120
|
+
- asset_id: "image"
|
|
121
|
+
asset_type: "image"
|
|
122
|
+
url: "https://cdn.pinnacle-agency.example/trail-pro-300x250.png"
|
|
123
|
+
mime_type: "image/png"
|
|
124
|
+
- creative_id: "video_30s_trail_pro"
|
|
125
|
+
name: "Trail Pro 3000 - 30s Video"
|
|
126
|
+
format_id:
|
|
127
|
+
agent_url: "https://your-platform.example.com"
|
|
128
|
+
id: "video_30s"
|
|
129
|
+
assets:
|
|
130
|
+
- asset_id: "video"
|
|
131
|
+
asset_type: "video"
|
|
132
|
+
url: "https://cdn.pinnacle-agency.example/trail-pro-30s.mp4"
|
|
133
|
+
mime_type: "video/mp4"
|
|
134
|
+
- creative_id: "native_trail_pro"
|
|
135
|
+
name: "Trail Pro 3000 - Native Card"
|
|
136
|
+
format_id:
|
|
137
|
+
agent_url: "https://your-platform.example.com"
|
|
138
|
+
id: "native_content"
|
|
139
|
+
assets:
|
|
140
|
+
- asset_id: "image"
|
|
141
|
+
asset_type: "image"
|
|
142
|
+
url: "https://cdn.pinnacle-agency.example/trail-pro-native.png"
|
|
143
|
+
mime_type: "image/png"
|
|
144
|
+
- asset_id: "headline"
|
|
145
|
+
asset_type: "text"
|
|
146
|
+
content: "Trail Pro 3000 — Built for the Summit"
|
|
147
|
+
|
|
148
|
+
validations:
|
|
149
|
+
- check: response_schema
|
|
150
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
151
|
+
- check: field_present
|
|
152
|
+
path: "results"
|
|
153
|
+
description: "Response contains per-creative results"
|
|
154
|
+
|
|
155
|
+
- id: list_and_filter
|
|
156
|
+
title: "List creatives with filtering"
|
|
157
|
+
narrative: |
|
|
158
|
+
The buyer queries the creative library to see their synced creatives. First a broad
|
|
159
|
+
list, then filtered by format. This verifies the library correctly stores and indexes
|
|
160
|
+
the pushed creatives.
|
|
161
|
+
|
|
162
|
+
steps:
|
|
163
|
+
- id: list_all
|
|
164
|
+
title: "List all creatives in library"
|
|
165
|
+
narrative: |
|
|
166
|
+
The buyer calls list_creatives with no filters to see all creatives in the
|
|
167
|
+
library for their account. The response includes the three creatives synced
|
|
168
|
+
in the previous phase.
|
|
169
|
+
task: list_creatives
|
|
170
|
+
schema_ref: "creative/list-creatives-request.json"
|
|
171
|
+
response_schema_ref: "creative/list-creatives-response.json"
|
|
172
|
+
doc_ref: "/creative/task-reference/list_creatives"
|
|
173
|
+
comply_scenario: creative_lifecycle
|
|
174
|
+
stateful: true
|
|
175
|
+
expected: |
|
|
176
|
+
Return creatives in the library:
|
|
177
|
+
- creatives array containing the synced items
|
|
178
|
+
- Each creative includes: creative_id, name, format_id, status
|
|
179
|
+
- At least three creatives from the sync phase
|
|
180
|
+
|
|
181
|
+
sample_request:
|
|
182
|
+
account:
|
|
183
|
+
brand:
|
|
184
|
+
domain: "acmeoutdoor.com"
|
|
185
|
+
operator: "pinnacle-agency.com"
|
|
186
|
+
|
|
187
|
+
validations:
|
|
188
|
+
- check: response_schema
|
|
189
|
+
description: "Response matches list-creatives-response.json schema"
|
|
190
|
+
- check: field_present
|
|
191
|
+
path: "creatives"
|
|
192
|
+
description: "Response contains creatives array"
|
|
193
|
+
|
|
194
|
+
- id: list_filtered
|
|
195
|
+
title: "List creatives filtered by format"
|
|
196
|
+
narrative: |
|
|
197
|
+
The buyer lists creatives filtered to a specific format (display only). The
|
|
198
|
+
response should only include creatives matching that format.
|
|
199
|
+
task: list_creatives
|
|
200
|
+
schema_ref: "creative/list-creatives-request.json"
|
|
201
|
+
response_schema_ref: "creative/list-creatives-response.json"
|
|
202
|
+
doc_ref: "/creative/task-reference/list_creatives"
|
|
203
|
+
comply_scenario: creative_lifecycle
|
|
204
|
+
stateful: true
|
|
205
|
+
expected: |
|
|
206
|
+
Return only creatives matching the format filter:
|
|
207
|
+
- creatives array filtered to display format
|
|
208
|
+
- Should include display_trail_pro_300x250 but not video or native
|
|
209
|
+
|
|
210
|
+
sample_request:
|
|
211
|
+
account:
|
|
212
|
+
brand:
|
|
213
|
+
domain: "acmeoutdoor.com"
|
|
214
|
+
operator: "pinnacle-agency.com"
|
|
215
|
+
filters:
|
|
216
|
+
format_ids:
|
|
217
|
+
- agent_url: "https://your-platform.example.com"
|
|
218
|
+
id: "display_300x250"
|
|
219
|
+
|
|
220
|
+
validations:
|
|
221
|
+
- check: response_schema
|
|
222
|
+
description: "Response matches list-creatives-response.json schema"
|
|
223
|
+
- check: field_present
|
|
224
|
+
path: "creatives"
|
|
225
|
+
description: "Response contains filtered creatives"
|
|
226
|
+
|
|
227
|
+
- id: build_and_preview
|
|
228
|
+
title: "Build and preview across formats"
|
|
229
|
+
narrative: |
|
|
230
|
+
The buyer builds serving tags and previews renderings for the synced creatives.
|
|
231
|
+
This tests multi-format output: a display tag, a VAST tag for video, and a
|
|
232
|
+
native rendering preview.
|
|
233
|
+
|
|
234
|
+
steps:
|
|
235
|
+
- id: preview_display
|
|
236
|
+
title: "Preview the display creative"
|
|
237
|
+
narrative: |
|
|
238
|
+
The buyer calls preview_creative for the display banner to see how it renders
|
|
239
|
+
in the platform's environment before going live.
|
|
240
|
+
task: preview_creative
|
|
241
|
+
schema_ref: "creative/preview-creative-request.json"
|
|
242
|
+
response_schema_ref: "creative/preview-creative-response.json"
|
|
243
|
+
doc_ref: "/creative/task-reference/preview_creative"
|
|
244
|
+
comply_scenario: creative_flow
|
|
245
|
+
stateful: true
|
|
246
|
+
expected: |
|
|
247
|
+
Return a preview of the display creative:
|
|
248
|
+
- preview_url: rendered preview the buyer can inspect
|
|
249
|
+
- render_dimensions: matches the 300x250 format
|
|
250
|
+
- status: preview available
|
|
251
|
+
|
|
252
|
+
sample_request:
|
|
253
|
+
creative_id: "display_trail_pro_300x250"
|
|
254
|
+
|
|
255
|
+
validations:
|
|
256
|
+
- check: response_schema
|
|
257
|
+
description: "Response matches preview-creative-response.json schema"
|
|
258
|
+
|
|
259
|
+
- id: build_video_tag
|
|
260
|
+
title: "Build a VAST tag for the video creative"
|
|
261
|
+
narrative: |
|
|
262
|
+
The buyer builds a serving tag for the video creative. The platform produces
|
|
263
|
+
a VAST-compatible tag that the buyer can traffic to ad servers.
|
|
264
|
+
task: build_creative
|
|
265
|
+
schema_ref: "creative/build-creative-request.json"
|
|
266
|
+
response_schema_ref: "creative/build-creative-response.json"
|
|
267
|
+
doc_ref: "/creative/task-reference/build_creative"
|
|
268
|
+
comply_scenario: creative_flow
|
|
269
|
+
stateful: true
|
|
270
|
+
expected: |
|
|
271
|
+
Return a built serving tag for the video creative:
|
|
272
|
+
- tag: VAST-compatible serving tag or URL
|
|
273
|
+
- format: matches the video format
|
|
274
|
+
- creative_id: matches the requested creative
|
|
275
|
+
|
|
276
|
+
sample_request:
|
|
277
|
+
creative_id: "video_30s_trail_pro"
|
|
278
|
+
output_format:
|
|
279
|
+
agent_url: "https://your-platform.example.com"
|
|
280
|
+
id: "vast_30s"
|
|
281
|
+
|
|
282
|
+
validations:
|
|
283
|
+
- check: response_schema
|
|
284
|
+
description: "Response matches build-creative-response.json schema"
|
|
@@ -3,14 +3,10 @@ version: "1.0.0"
|
|
|
3
3
|
title: "Sales agent with creative capabilities"
|
|
4
4
|
category: creative_sales_agent
|
|
5
5
|
summary: "Stateful sales agent that accepts pushed creative assets and renders them in its environment."
|
|
6
|
-
platform_types:
|
|
7
|
-
- retail_media
|
|
8
|
-
- social_platform
|
|
9
|
-
|
|
10
6
|
track: creative
|
|
11
7
|
required_tools:
|
|
12
8
|
- sync_creatives
|
|
13
|
-
|
|
9
|
+
|
|
14
10
|
narrative: |
|
|
15
11
|
You run a publisher platform, retail media network, or other sell-side system that
|
|
16
12
|
accepts creative assets from buyers. The buyer pushes assets or catalog items to your
|
|
@@ -165,5 +161,5 @@ phases:
|
|
|
165
161
|
- check: response_schema
|
|
166
162
|
description: "Response matches preview-creative-response.json schema"
|
|
167
163
|
- check: field_present
|
|
168
|
-
path: "previews[0].renders[0].
|
|
164
|
+
path: "previews[0].renders[0].preview_url"
|
|
169
165
|
description: "Preview includes a renderable URL"
|
|
@@ -3,14 +3,10 @@ version: "1.0.0"
|
|
|
3
3
|
title: "Creative template and transformation agent"
|
|
4
4
|
category: creative_template
|
|
5
5
|
summary: "Stateless creative agent that takes assets in, applies templates, and produces tags or rendered output."
|
|
6
|
-
platform_types:
|
|
7
|
-
- creative_transformer
|
|
8
|
-
- creative_library
|
|
9
|
-
|
|
10
6
|
track: creative
|
|
11
7
|
required_tools:
|
|
12
8
|
- build_creative
|
|
13
|
-
|
|
9
|
+
|
|
14
10
|
narrative: |
|
|
15
11
|
You build a creative management or rich media platform — think Celtra, a format
|
|
16
12
|
conversion service, or any tool that defines ad templates and transforms input assets
|
|
@@ -122,6 +118,7 @@ phases:
|
|
|
122
118
|
description: "Response matches schema"
|
|
123
119
|
- check: field_value
|
|
124
120
|
path: "formats[*].type"
|
|
121
|
+
value: "display"
|
|
125
122
|
description: "All returned formats are display type"
|
|
126
123
|
|
|
127
124
|
- id: preview
|
|
@@ -186,7 +183,7 @@ phases:
|
|
|
186
183
|
- check: response_schema
|
|
187
184
|
description: "Response matches preview-creative-response.json schema"
|
|
188
185
|
- check: field_present
|
|
189
|
-
path: "previews[0].renders[0].
|
|
186
|
+
path: "previews[0].renders[0].preview_url"
|
|
190
187
|
description: "Preview includes a renderable URL"
|
|
191
188
|
|
|
192
189
|
- id: build
|