Asset Generation
Rule
Use the Assets app when a workflow needs reusable brand media, a human picker,
or generated image/video assets that another app can reference by ID and URL.
Visual authority and brief
Assets produces media; it does not invent a replacement brand language. Before
generating, resolve the user's explicit subject, audience, message, format, and
must-preserve constraints, then the active library, preset, or linked design
system and its custom instructions, then approved Creative Context references.
Impeccable-inspired guidance is a quality lens for composition, hierarchy,
restraint, and finish — never a reason to override those sources.
Compile the request into a short art-direction brief: visual role, subject,
composition and crop, palette or material treatment, lighting or medium,
exact visible text if any, semantic constraints, and exclusions. Classify the
slot as produce (new media), direct (an existing approved asset), or
semantic (a UI/icon/diagram the caller should build with its own primitives).
Do not generate a decorative photo where the caller needs a semantic graphic.
If brand context is missing, make the result clearly exploratory rather than
claiming a brand match.
Choose The Path
- Use
generate-asset when a person should get newly generated, on-brand image
candidates and choose the winner in the inline picker. It matches a library
when libraryId is omitted, generates candidates, returns the picker filtered
to those run IDs, and works in in-app chat plus external MCP hosts.
- Use
open-asset-picker when a person should browse, search, or select an
existing asset inside an embedded picker, or when you want the picker to
handle generation itself. It still opens /library with the iframe/bridge
contract. The normal human Library workspace is /library and /library/:id.
Pass mediaType: "image" by default, or mediaType: "video" for video
libraries.
- Use unattended actions when the agent already knows what to do:
search-assets, list-assets, import-style-from-url, generate-image,
generate-image-batch, generate-video, refresh-generation-run, and
export-asset.
- In chat, consume composer
@ references as structured generation inputs:
brand-kit maps to libraryId, template maps to templateId, and
media-type chooses image generation versus video generation. If no mention
is available, use view-screen, list-libraries, and
list-templates to choose explicit args.
- Use Templates when the user asks for a repeatable output format like social
image, blog hero, or diagram. Call
list-templates and pass templateId
through generation/refinement actions. Templates may be global or associated
with one brand kit; only associated templates can pin images, skeletons, or
a canonical logo. *-generation-preset actions are deprecated aliases.
- Use generation sessions when another person needs to continue improving a
candidate. Sessions carry the brief, preset, active asset, feedback, and run
IDs without requiring the original chat thread.
- Use chat-driven
restyle-image and edit-image for preserving subjects,
applying library style, and making targeted changes. Do not surface separate
restyle, edit, or quality-tier buttons in host UIs.
- Use browser/deep-link fallback when the host cannot render MCP Apps inline
(CLIs and code editors like Claude Code and Codex). Surface the returned
picker link. When the user opens it, they can either click an asset — the
page auto-copies a short handoff summary for them to paste back into chat —
or simply tell you which one in words (e.g. "use image A" / "the second
one"). Both are first-class; don't insist on the paste-back if they just name
the pick.
Image Workflows
- Read the
creative-context skill and retrieve visual references separately
from factual evidence. Respect contextMode: "off", pinned packs, and the
exact reuse ladder before generation: approved native asset unchanged,
compose approved pieces, lightly adapt a real example, condition generation
on narrow references, then net-new only when the relevant corpus is empty.
- For human-in-the-loop generation, call
generate-asset first and preserve
the returned picker/candidate metadata. For unattended generation, pick or
match the library with list-libraries or match-library.
If the user wants a default look rather than a brand library, call
list-library-presets and then create-library-from-preset; the resulting
library is editable and reusable like any other library.
- For one asset, call
generate-image; for multiple independent slots, call
generate-image-batch with stable slotId values.
- Image generation actions are synchronous. After
generate-image or
generate-image-batch returns, use its compact images / asset summaries
directly; do not call get-generation-run, refresh-generation-run, or
regenerate just to verify image runs. Use get-asset for full asset details
and the audit-run actions for prompts, references, and settings.
A result with draftPendingApproval: true came from a kit the user can draft
in but not save into. Offer the candidate and say it needs a kit editor to be
saved; save-generated-image will refuse, so do not call it or retry. Video
carries the same marker on the initial async reply and on every
refresh-generation-run result, so it survives the poll.
- For template-backed work, pass a mentioned or selected
templateId; for handoff
work, pass sessionId.
- Let the server choose a small deterministic reference set unless the user
named exact assets. Canonical style anchors come from
assetLibraries.settings.canonicalStyleAssetIds and
assets.metadata.isStyleAnchor; they must remain subordinate to explicit
library, preset, and per-run constraints rather than introducing a second
visual language.
- Pass
tier: "fast" for exploration, tier: "best" for final/high-value
output, or tier: "auto" when there is no clear preference.
- Model/ratio compatibility: Gemini image models accept any
aspectRatio, but
gpt-image-2 supports only 1:1, 2:3, and 3:2. When the user needs
another ratio (16:9, 9:16, 4:5, 21:9, …), pick a Gemini model rather than
gpt-image-2 — an unsupported pairing is rejected upstream. Source of truth
is supportedAspectRatiosForModel / MODEL_ASPECT_RATIOS in shared/api.ts.
- Direct generation returns
id; picker selections return assetId. Preserve
that asset identifier with runId, previewUrl, downloadUrl, and
embedUrl. Preserve the immutable contextPackId and reuse labels on both
generation run and output-asset metadata; rendered pixels are not provenance.
- Use
refine-image for feedback on an existing asset, edit-image for
targeted changes, and restyle-image with subjectAssetId and
styleStrength for subject-preserving brand restyles.
- If a designer will take over, call
create-generation-session or
update-generation-session, then prepare-generation-session-continuation
when they want a chat preloaded with the session context.
For short vague prompts, enhance conservatively with library style context while
preserving the user's original prompt in run metadata. If a public website is
the style source, call import-style-from-url first so the library keeps the
hydrated browser-derived design brief. Use analyze-collection-style when a
collection needs upgraded vision brand analysis from image references before
generation. Brand QA scoring and best-of-N selection are deferred.
Generation success confirms a run and its provenance, not visual quality or
brand match. Report the selected library, preset, style anchors, and whether
the result used an Assets-grounded or fallback path. Claim a quality evaluator
only when one actually ran.
Video Workflows
- Call
generate-video with 16:9 or 9:16 and relevant image references.
- Poll
refresh-generation-run until the run completes and returns a video
asset.
- Use
export-asset when another app needs a download URL or artifact type.
Cross-App Use
- Hosted default: connect
https://assets.agent-native.com/_agent-native/mcp.
Do not put shared secrets in skill files.
- Local customization: run
npx @agent-native/core@latest app-skill launch --local from the
Assets app-skill manifest, or pass --into <path> for editable source.
- For MCP callers,
generate-asset is the portable first choice because the
same MCP App picker renders inline in Agent-Native chat, ChatGPT, and Claude
when the host supports MCP Apps. Include exact assetId, runId, media type,
and URLs in the final response so the caller can attach or embed the media.
Include presetId and sessionId when present.
Don't
- Do not call image/video providers directly from another app.
- Do not treat
images as the app identity; the app id is assets.
- Do not use picker UI for unattended generation when direct actions are enough.
- Do not use copyrighted screenshots or named studio/brand image sets as preset
references. Use broad textual guidance and user-provided references instead.
1---2name: asset-generation3description: Use Assets for brand-safe image or video generation, human picker UI, search/list/export actions, and cross-app asset selection. Use when a visual needs to be generated, refined, found, or handed off to another app.4---56# Asset Generation78## Rule910Use the Assets app when a workflow needs reusable brand media, a human picker,11or generated image/video assets that another app can reference by ID and URL.1213## Visual authority and brief1415Assets produces media; it does not invent a replacement brand language. Before16generating, resolve the user's explicit subject, audience, message, format, and17must-preserve constraints, then the active library, preset, or linked design18system and its custom instructions, then approved Creative Context references.19Impeccable-inspired guidance is a quality lens for composition, hierarchy,20restraint, and finish — never a reason to override those sources.2122Compile the request into a short art-direction brief: visual role, subject,23composition and crop, palette or material treatment, lighting or medium,24exact visible text if any, semantic constraints, and exclusions. Classify the25slot as `produce` (new media), `direct` (an existing approved asset), or26`semantic` (a UI/icon/diagram the caller should build with its own primitives).27Do not generate a decorative photo where the caller needs a semantic graphic.28If brand context is missing, make the result clearly exploratory rather than29claiming a brand match.3031## Choose The Path3233- Use `generate-asset` when a person should get newly generated, on-brand image34 candidates and choose the winner in the inline picker. It matches a library35 when `libraryId` is omitted, generates candidates, returns the picker filtered36 to those run IDs, and works in in-app chat plus external MCP hosts.37- Use `open-asset-picker` when a person should browse, search, or select an38 existing asset inside an embedded picker, or when you want the picker to39 handle generation itself. It still opens `/library` with the iframe/bridge40 contract. The normal human Library workspace is `/library` and `/library/:id`.41 Pass `mediaType: "image"` by default, or `mediaType: "video"` for video42 libraries.43- Use unattended actions when the agent already knows what to do:44 `search-assets`, `list-assets`, `import-style-from-url`, `generate-image`,45 `generate-image-batch`, `generate-video`, `refresh-generation-run`, and46 `export-asset`.47- In chat, consume composer `@` references as structured generation inputs:48 `brand-kit` maps to `libraryId`, `template` maps to `templateId`, and49 `media-type` chooses image generation versus video generation. If no mention50 is available, use `view-screen`, `list-libraries`, and51 `list-templates` to choose explicit args.52- Use Templates when the user asks for a repeatable output format like social53 image, blog hero, or diagram. Call `list-templates` and pass `templateId`54 through generation/refinement actions. Templates may be global or associated55 with one brand kit; only associated templates can pin images, skeletons, or56 a canonical logo. `*-generation-preset` actions are deprecated aliases.57- Use generation sessions when another person needs to continue improving a58 candidate. Sessions carry the brief, preset, active asset, feedback, and run59 IDs without requiring the original chat thread.60- Use chat-driven `restyle-image` and `edit-image` for preserving subjects,61 applying library style, and making targeted changes. Do not surface separate62 restyle, edit, or quality-tier buttons in host UIs.63- Use browser/deep-link fallback when the host cannot render MCP Apps inline64 (CLIs and code editors like Claude Code and Codex). Surface the returned65 picker link. When the user opens it, they can either click an asset — the66 page auto-copies a short handoff summary for them to paste back into chat —67 or simply tell you which one in words (e.g. "use image A" / "the second68 one"). Both are first-class; don't insist on the paste-back if they just name69 the pick.7071## Image Workflows72731. Read the `creative-context` skill and retrieve visual references separately74 from factual evidence. Respect `contextMode: "off"`, pinned packs, and the75 exact reuse ladder before generation: approved native asset unchanged,76 compose approved pieces, lightly adapt a real example, condition generation77 on narrow references, then net-new only when the relevant corpus is empty.782. For human-in-the-loop generation, call `generate-asset` first and preserve79 the returned picker/candidate metadata. For unattended generation, pick or80 match the library with `list-libraries` or `match-library`.81 If the user wants a default look rather than a brand library, call82 `list-library-presets` and then `create-library-from-preset`; the resulting83 library is editable and reusable like any other library.843. For one asset, call `generate-image`; for multiple independent slots, call85 `generate-image-batch` with stable `slotId` values.864. Image generation actions are synchronous. After `generate-image` or87 `generate-image-batch` returns, use its compact `images` / asset summaries88 directly; do not call `get-generation-run`, `refresh-generation-run`, or89 regenerate just to verify image runs. Use `get-asset` for full asset details90 and the audit-run actions for prompts, references, and settings.91 A result with `draftPendingApproval: true` came from a kit the user can draft92 in but not save into. Offer the candidate and say it needs a kit editor to be93 saved; `save-generated-image` will refuse, so do not call it or retry. Video94 carries the same marker on the initial async reply and on every95 `refresh-generation-run` result, so it survives the poll.965. For template-backed work, pass a mentioned or selected `templateId`; for handoff97 work, pass `sessionId`.986. Let the server choose a small deterministic reference set unless the user99 named exact assets. Canonical style anchors come from100 `assetLibraries.settings.canonicalStyleAssetIds` and101 `assets.metadata.isStyleAnchor`; they must remain subordinate to explicit102 library, preset, and per-run constraints rather than introducing a second103 visual language.1047. Pass `tier: "fast"` for exploration, `tier: "best"` for final/high-value105 output, or `tier: "auto"` when there is no clear preference.106 - Model/ratio compatibility: Gemini image models accept any `aspectRatio`, but107 `gpt-image-2` supports only `1:1`, `2:3`, and `3:2`. When the user needs108 another ratio (16:9, 9:16, 4:5, 21:9, …), pick a Gemini model rather than109 `gpt-image-2` — an unsupported pairing is rejected upstream. Source of truth110 is `supportedAspectRatiosForModel` / `MODEL_ASPECT_RATIOS` in `shared/api.ts`.1118. Direct generation returns `id`; picker selections return `assetId`. Preserve112 that asset identifier with `runId`, `previewUrl`, `downloadUrl`, and113 `embedUrl`. Preserve the immutable `contextPackId` and reuse labels on both114 generation run and output-asset metadata; rendered pixels are not provenance.1159. Use `refine-image` for feedback on an existing asset, `edit-image` for116 targeted changes, and `restyle-image` with `subjectAssetId` and117 `styleStrength` for subject-preserving brand restyles.11810. If a designer will take over, call `create-generation-session` or119 `update-generation-session`, then `prepare-generation-session-continuation`120 when they want a chat preloaded with the session context.121122For short vague prompts, enhance conservatively with library style context while123preserving the user's original prompt in run metadata. If a public website is124the style source, call `import-style-from-url` first so the library keeps the125hydrated browser-derived design brief. Use `analyze-collection-style` when a126collection needs upgraded vision brand analysis from image references before127generation. Brand QA scoring and best-of-N selection are deferred.128129Generation success confirms a run and its provenance, not visual quality or130brand match. Report the selected library, preset, style anchors, and whether131the result used an Assets-grounded or fallback path. Claim a quality evaluator132only when one actually ran.133134## Video Workflows1351361. Call `generate-video` with `16:9` or `9:16` and relevant image references.1372. Poll `refresh-generation-run` until the run completes and returns a video138 asset.1393. Use `export-asset` when another app needs a download URL or artifact type.140141## Cross-App Use142143- Hosted default: connect `https://assets.agent-native.com/_agent-native/mcp`.144 Do not put shared secrets in skill files.145- Local customization: run `npx @agent-native/core@latest app-skill launch --local` from the146 Assets app-skill manifest, or pass `--into <path>` for editable source.147- For MCP callers, `generate-asset` is the portable first choice because the148 same MCP App picker renders inline in Agent-Native chat, ChatGPT, and Claude149 when the host supports MCP Apps. Include exact `assetId`, `runId`, media type,150 and URLs in the final response so the caller can attach or embed the media.151 Include `presetId` and `sessionId` when present.152153## Don't154155- Do not call image/video providers directly from another app.156- Do not treat `images` as the app identity; the app id is `assets`.157- Do not use picker UI for unattended generation when direct actions are enough.158- Do not use copyrighted screenshots or named studio/brand image sets as preset159 references. Use broad textual guidance and user-provided references instead.