@koda-sl/baker-cli 0.133.1 → 0.134.1

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 CHANGED
@@ -2185,7 +2185,7 @@ baker testimonials tags
2185
2185
 
2186
2186
  ### Winning Ads (`baker winning-ads`)
2187
2187
 
2188
- Search the **ad-dna** corpus of scored "winning" competitor ads for reference creatives to reproduce (e.g. with `baker canvas`), and manage the brands your library tracks (`follow` / `following` / `unfollow`). Each result carries a presigned media URL (~1h TTL), the ad's DNA summary, and scores. The CLI authenticates with the normal `BAKER_API_KEY`; the Baker backend proxies the request to the ad-dna service with a server-held token — no extra credential in the sandbox.
2188
+ Search the **ad-dna** corpus of scored "winning" competitor ads for reference creatives to reproduce (e.g. with `baker canvas`), and manage the brands your library tracks (`follow` / `following` / `feed` / `unfollow`). Each result carries a presigned media URL (~1h TTL), the ad's DNA summary, and scores. The CLI authenticates with the normal `BAKER_API_KEY`; the Baker backend proxies the request to the ad-dna service with a server-held token — no extra credential in the sandbox.
2189
2189
 
2190
2190
  > The corpus has **Meta + LinkedIn** connectors, so `--platform` inputs are limited to `meta,linkedin`. (Older result rows may still carry a legacy platform string.)
2191
2191
 
@@ -2289,9 +2289,29 @@ List the brands you follow → `GET /api/ad-library/following`. Each row shows `
2289
2289
  baker winning-ads following --output md
2290
2290
  ```
2291
2291
 
2292
+ ### `baker winning-ads feed`
2293
+
2294
+ Winners across **every** brand you follow, in one library → `GET /api/ad-library/feed`. The advertiser set is derived server-side from your follows (never a client-supplied list), so this is the "what's winning across everyone I track" view. Start here, then trim to specific brands with `--advertiser adv_1,adv_2`. Capped per advertiser (`--per-advertiser`, default 5, `0` = no cap) so no single brand floods the feed — the cap is enforced server-side, so it holds even when you narrow to one advertiser. Same lean winner cards as `search` / `winners` (add `--full` for DNA + longevity).
2295
+
2296
+ Response `data`: `winners`, `following_count` (how many brands you follow), `advertiser_ids` (the ids actually queried = follows ∩ requested), and — when relevant — `hints` (e.g. you follow nobody yet, or a requested id isn't in your follows and was skipped). In `--output md`/`files` the table is the payload and the hints are written to **stderr** so they still surface without corrupting the output.
2297
+
2298
+ ```bash
2299
+ baker winning-ads feed --per-advertiser 5 --output md
2300
+ baker winning-ads feed --advertiser adv_123,adv_456 --platform meta --output md
2301
+ ```
2302
+
2303
+ | Flag | Purpose |
2304
+ |---|---|
2305
+ | `--advertiser <ids>` | Trim to a comma-separated subset of your followed advertiser ids (ids you don't follow are skipped and reported) |
2306
+ | `--platform meta\|linkedin` | Filter to a single platform |
2307
+ | `--per-advertiser <n>` | Max winners kept per advertiser 0–50 (`0` = no cap, default 5) |
2308
+ | `--limit <n>` | Total winners across all follows 1–200 (default 40) |
2309
+ | `--winner-category <list>` | Restrict to specific winner categories |
2310
+ | `--format <list>` | Restrict to specific formats (e.g. `static,video`) |
2311
+
2292
2312
  ### `baker winning-ads winners <advertiser>`
2293
2313
 
2294
- Top winning ads for one advertiser id → `GET /api/ad-library/advertiser-winners`. Same lean winner cards as `search` (add `--full` for DNA + longevity). Supports `--top N` and `--platform meta|linkedin`.
2314
+ Top winning ads for one advertiser id → `GET /api/ad-library/advertiser-winners` (use `feed` for all your follows at once). Same lean winner cards as `search` (add `--full` for DNA + longevity). Supports `--top N` and `--platform meta|linkedin`.
2295
2315
 
2296
2316
  ```bash
2297
2317
  baker winning-ads winners adv_123 --top 15 --output md
@@ -3361,7 +3381,7 @@ Ref-image MIMEs: `image/png`, `image/jpeg`, `image/webp`, `image/gif` (via OpenR
3361
3381
  > - **gpt-image** (default frames): clean-plate exclusions placed **LAST** (OpenAI weights early text as composition), an explicit `photorealistic` cue, identity-critical reference **first**, and `quality=high` (gpt-image-2 forces high input fidelity automatically — the `input_fidelity` param is deliberately **not** sent). Gemini keeps exclusions inline; Recraft drops the photoreal cue.
3362
3382
  > - New advisories: `VIDEO_RAW_FACE_KEYFRAME` (a Seedance clip animating a RAW ingested image — real-person 422 risk), `IMAGE_PROMPT_PROFILE_MISSING`, `VIDEO_PROMPT_PROFILE_MISSING`.
3363
3383
 
3364
- > **Content-policy blocks are deterministic, not flaky.** ByteDance's Seedance rejects any first/last frame that reads as a real-person likeness (even an AI-generated face) — surfaced as `content_policy_blocked` (HTTP 422, **non-retryable**). This is ByteDance's upstream filter, so it fires on **any** reseller (Replicate or otherwise) — a provider swap does **not** route around it. Retrying **never** succeeds and wastes credits. Fix the cause: use a **synthetic/AI-generated** (non-identifiable) presenter face, or route a real face to **Veo** (`person_generation: allow_adult`), or make the source frame less photorealistic.
3384
+ > **Content-policy blocks are deterministic, not flaky — and now auto-recover.** ByteDance's Seedance rejects any first/last frame that reads as a real-person likeness (even an AI-generated face) — surfaced as `content_policy_blocked` (HTTP 422/`E005` "flagged as sensitive", **non-retryable on the same model**). This is ByteDance's upstream filter, so it fires on **any** reseller (Replicate or otherwise) — a provider swap does **not** route around it. **When a Seedance `video_generate` clip is blocked, the backend automatically re-renders that same clip on `google/veo-3.1-fast` (`person_generation: allow_adult`) the one curated model that clears the filter — so the run still completes.** The Seedance attempt is never billed (its output was never finalized); only the Veo render is charged. To skip that wasted first attempt entirely (and control look/cost), scaffold a photoreal-cast ad directly on Veo up front (`--real-face`, which also covers AI-generated photoreal faces), or make the source frame less photorealistic.
3365
3385
 
3366
3386
  ---
3367
3387
 
@@ -3966,7 +3986,7 @@ baker canvas run ./reference-ad.video.canvas.json
3966
3986
  | `--select-model <id>` | `~google/gemini-flash-latest` | Override the element-selection `text_generate` model. |
3967
3987
  | `--image-model <id>` | `openai/gpt-5.4-image-2` | Override the per-frame `image_generate` model (defaults to the strongest, matching `scaffold-static-ad`). |
3968
3988
  | `--video-model <id>` | scored router | Override the `video_generate` model **and skip the router**. Curated roster: `bytedance/seedance-2.0` (workhorse), `google/veo-3.1` (cine ceiling + real-face), `google/veo-3.1-fast` (cheap Veo), `kwaivgi/kling-v3.0-pro` (motion-transfer). |
3969
- | `--real-face` | off | Brief needs a real human likeness the router picks Veo (dodges the ByteDance real-person 422). |
3989
+ | `--real-face` | auto-detected | Force the Veo route for a photoreal human presenter (dodges the ByteDance real-person filter). **Usually unnecessary** — the scaffold auto-detects a photoreal on-camera person/animal cast from the deconstruct and routes it to Veo on its own; set this only to force it when the cast isn't detected. Covers AI-generated photoreal faces too, not just real ones. |
3970
3990
  | `--motion-transfer` | off | Motion driven from a reference / hyper-dynamic → the router picks Kling. |
3971
3991
  | `--identity` | off | Same character/product across clips → the router picks the Seedance workhorse. |
3972
3992
  | `--budget <tier>` | `standard` | Router cost posture: `economy` (cheap Veo-fast tier) / `standard` / `premium`. |
@@ -3975,7 +3995,10 @@ baker canvas run ./reference-ad.video.canvas.json
3975
3995
  **Scored model router.** When `--video-model` is omitted, a small weighted scorer picks from the curated
3976
3996
  roster and prints the choice as `models.video_route_reason` in the run report (mirroring Higgsfield's
3977
3997
  `models_explore`). Real-face → Veo, motion-transfer → Kling, else the Seedance workhorse; `--budget economy`
3978
- shifts a Veo pick to the fast tier. The scaffolder also bakes **per-intent param recipes** so the hero/reveal
3998
+ shifts a Veo pick to the fast tier. **The router runs after the deconstruct, so a photoreal on-camera
3999
+ person/animal cast is auto-detected and routed to Veo up front** — that cast would be blocked on Seedance by
4000
+ ByteDance's real-person filter, so picking Seedance would only burn a wasted attempt before the runtime
4001
+ auto-fallback re-renders it on Veo anyway. The scaffolder also bakes **per-intent param recipes** so the hero/reveal
3979
4002
  beat claims the 1080p cine ceiling automatically and a Kling hook beat maxes prompt adherence.
3980
4003
 
3981
4004
  Each scene is captured in a **shoot mode** — `ugc_selfie` (talking heads, the default look), `ugc_broll`, `studio_product` (pack shot), `lifestyle_cinematic`, or `screen_ui`. The scaffold derives one per scene (UGC by default; the cinematic and screen lanes are opt-in) and bakes its capture block into the frame and a camera default into the clip; override per scene with a `shoot_mode` field in that scene's `scenes/sNN.json`. Capture aesthetic + depth-of-field follow the mode (UGC stays flat; studio/lifestyle allow shallow DoF). Clips also carry **diegetic native audio** — the scene's own ambience described in the Seedance prompt, never music (the music bed is a separate, ducked track); set a scene's `ambient` field to steer it.
@@ -7307,8 +7307,8 @@ var videoGenerateNode = delegated({
7307
7307
  id: "video_generate",
7308
7308
  version: "2.0.0",
7309
7309
  category: "video",
7310
- summary: "Generate video for ad creatives. Curated roster: `bytedance/seedance-2.0` (identity/product workhorse), `google/veo-3.1` (photoreal cine ceiling + real-face fallback), `google/veo-3.1-fast` (cheap Veo iteration), `kwaivgi/kling-3.0` (motion-transfer/dynamic). Async with polling.",
7311
- when_to_use: "Use `bytedance/seedance-2.0` for identity/product output. Route real human likenesses to `google/veo-3.1` (dodges the ByteDance real-person filter); use `google/veo-3.1-fast` while iterating to keep cost low; `kwaivgi/kling-3.0` for motion-transfer/hyper-dynamic beats. The scaffolder's scored router picks for you. Each model gates its own durations/resolutions/aspect ratios in the registry \u2014 see the README per-model section.",
7310
+ summary: "Generate video for ad creatives. Curated roster: `bytedance/seedance-2.0` (identity/product workhorse, NO photoreal human faces), `google/veo-3.1` (photoreal cine ceiling + the human-face model), `google/veo-3.1-fast` (cheap Veo iteration), `kwaivgi/kling-3.0` (motion-transfer/dynamic). Async with polling.",
7311
+ when_to_use: "Use `bytedance/seedance-2.0` for identity/product output WITHOUT a photoreal human face on camera. Any clip whose frame shows a photoreal human face \u2014 a UGC creator, presenter, or testimonial speaker, REAL OR AI-GENERATED \u2014 must use `google/veo-3.1`: ByteDance's filter rejects photoreal human faces on Seedance (content_policy_blocked/E005), and a synthetic AI face does NOT clear it. Use `google/veo-3.1-fast` while iterating to keep cost low; `kwaivgi/kling-3.0` for motion-transfer/hyper-dynamic beats. `baker canvas scaffold-video` auto-routes a photoreal cast to Veo; a Seedance clip blocked at runtime also auto-recovers on Veo. Each model gates its own durations/resolutions/aspect ratios in the registry \u2014 see the README per-model section.",
7312
7312
  inputs: z28.object({
7313
7313
  first_frame: ImageRef.optional(),
7314
7314
  last_frame: ImageRef.optional(),
@@ -7798,4 +7798,4 @@ export {
7798
7798
  defaultRegistry,
7799
7799
  createEngineFromEnv
7800
7800
  };
7801
- //# sourceMappingURL=chunk-Q4UI5JZN.js.map
7801
+ //# sourceMappingURL=chunk-CIF62V7L.js.map