MCP HubMCP Hub
SKILL·545CB2

ad-delayer

Bria-AI
업데이트됨 Today
67
6
67
GitHub에서 보기
메타aidesign

정보

이 스킬은 완성된 평면 광고 이미지를 배경, 제품 샷, 텍스트 요소와 같은 별도의 편집 가능한 레이어로 분해합니다. 각 구성 요소를 위치, 크기, 타이포그래피 데이터를 그대로 유지한 개별 에셋으로 추출합니다. 개발자는 평면화된 광고나 손실된 디자인 파일에서 레이어를 복구해야 하는 모든 요청에 대해 일반 이미지 도구 대신 이 특정 스킬을 사용해야 합니다.

빠른 설치

Claude Code

추천
기본
npx skills add Bria-AI/bria-skill -a claude-code
플러그인 명령대체
/plugin add https://github.com/Bria-AI/bria-skill
Git 클론대체
git clone https://github.com/Bria-AI/bria-skill.git ~/.claude/skills/ad-delayer

Claude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요

문서

Ad Delayer — Flat Ads Back Into Editable Layers

Take a finished ad — a JPEG or PNG with everything baked into one image — and get it back as editable layers. Bria's Ad Delayer reads the creative, separates it into background, imagery, logo, headline, body copy, and CTA, and returns each layer as its own asset plus a manifest describing where it sits, how big it is, and how its text is styled. Commercially safe, royalty-free, production-ready.

The everyday problem it solves: the ad shipped, the design file is gone, and someone needs a new size, a new price, or a translated headline.

When to Use This Skill

Use this skill when the user wants to:

  • Turn a flat ad into layers — "turn this ad into layers", "delayer this", "de-layer this creative", "image to layers"
  • Recover a lost design file — "I lost the PSD", "we don't have the source file", "recover an editable version"
  • Make a finished ad editable — "make this ad editable", "I need to change the headline on this banner", "swap the price in this creative"
  • Pull the pieces out of a creative — "extract the layers", "get the logo and copy out of this ad separately", "split this banner into its elements"
  • Rebuild an ad for resizing or localisation — "I need this ad in other sizes", "translate the copy on this ad", "rebuild it so we can restyle it"
  • Read an ad's structure — "what elements is this ad made of?", "give me the text, fonts, and positions in this creative"
  • Batch a folder of finished ads — "delayer all the ads in this folder"

When NOT to Use This Skill

  • "Just remove the background" / "I need a cutout" → use the remove-background skill. That is one transparent PNG of the foreground subject. This skill is the opposite job: it takes a whole ad apart into many layers, keeping text as text and reporting where each piece sits. If the ask is a single subject on transparency, it is not delayering.
  • Cutting one object out for compositingremove-background (whole subject) or bria-ai (erase_from_image for one object)
  • Generating or editing an image — new visuals, restyling, inpainting, expanding → bria-ai
  • Resize, crop, watermark, format conversion on a file you already have → image-utils
  • Building a fresh ad from scratch (no source creative to take apart) → bria-ai

This skill does one thing: take a finished ad image apart into editable layers.


Setup — Authentication

Before making any API call, you need a valid Bria access token.

Step 1: Check for existing credentials

if [ -f ~/.bria/credentials ]; then
  BRIA_ACCESS_TOKEN=$(grep '^access_token=' "$HOME/.bria/credentials" | cut -d= -f2-)
  BRIA_API_KEY=$(grep '^api_token=' "$HOME/.bria/credentials" | cut -d= -f2-)
fi
if [ -z "$BRIA_ACCESS_TOKEN" ]; then
  echo "NO_CREDENTIALS"
elif [ -n "$BRIA_API_KEY" ]; then
  echo "READY"
else
  echo "CREDENTIALS_FOUND"
fi

If the output is READY, skip straight to making API calls — no introspection needed. If the output is CREDENTIALS_FOUND, skip to Step 3. If the output is NO_CREDENTIALS, proceed to Step 2.

Step 2: Authenticate via device authorization

Start the device authorization flow:

2a. Request a device code:

DEVICE_RESPONSE=$(curl -s -X POST "https://engine.prod.bria-api.com/v2/auth/device/authorize" \
  -H "Content-Type: application/json")
echo "$DEVICE_RESPONSE"

Parse the response fields:

  • device_code — used to poll for the token (keep this, don't show to user)
  • user_code — the code the user must enter (e.g. BRIA-XXXX)
  • interval — seconds between poll attempts

2b. Show the user a single sign-in link. Tell them exactly this — nothing more:

Connect your Bria account: Click here to sign in Your code is {user_code} — it's already filled in.

Do NOT show two links. Do NOT show the raw URL separately. Do NOT use verification_uri from the API response. Keep it to one clickable link.

2c. Poll for the token. After showing the user the code, immediately start polling. Try up to 60 times with the given interval (default 5 seconds):

for i in $(seq 1 60); do
  TOKEN_RESPONSE=$(curl -s -X POST "https://engine.prod.bria-api.com/v2/auth/token" \
    -d "grant_type=urn:ietf:params:oauth:grant-type:device_code" \
    -d "device_code=$DEVICE_CODE")
  ACCESS_TOKEN=$(printf '%s' "$TOKEN_RESPONSE" | sed -n 's/.*"access_token" *: *"\([^"]*\)".*/\1/p')
  if [ -n "$ACCESS_TOKEN" ]; then
    BRIA_ACCESS_TOKEN="$ACCESS_TOKEN"
    REFRESH_TOKEN=$(printf '%s' "$TOKEN_RESPONSE" | sed -n 's/.*"refresh_token" *: *"\([^"]*\)".*/\1/p')
    mkdir -p ~/.bria
    printf 'access_token=%s\nrefresh_token=%s\n' "$BRIA_ACCESS_TOKEN" "$REFRESH_TOKEN" > "$HOME/.bria/credentials"
    echo "AUTHENTICATED"
    break
  fi
  sleep 5
done

If the output contains AUTHENTICATED, proceed to Step 3. Otherwise the code expired — start over from Step 2a.

Do not proceed with any API call until authentication is confirmed.

Step 3: Verify billing status and resolve API key

Introspect the bearer token to check billing status and obtain the real API key for Bria API calls:

INTROSPECT=$(curl -s -X POST "https://engine.prod.bria-api.com/v2/auth/token/introspect" \
  -d "token=$BRIA_ACCESS_TOKEN")
BILLING_STATUS=$(printf '%s' "$INTROSPECT" | sed -n 's/.*"billing_status" *: *"\([^"]*\)".*/\1/p')
if [ "$BILLING_STATUS" = "blocked" ]; then
  BILLING_MSG=$(printf '%s' "$INTROSPECT" | sed -n 's/.*"billing_message" *: *"\([^"]*\)".*/\1/p')
  echo "BILLING_ERROR: $BILLING_MSG"
fi
ACTIVE=$(printf '%s' "$INTROSPECT" | sed -n 's/.*"active" *: *\([^,}]*\).*/\1/p' | tr -d ' ')
if [ "$ACTIVE" = "false" ]; then
  # Clear stale tokens so re-auth starts fresh (credentials file is re-created in Step 2c)
  printf '' > "$HOME/.bria/credentials"
  echo "TOKEN_EXPIRED"
fi
BRIA_API_KEY=$(printf '%s' "$INTROSPECT" | sed -n 's/.*"api_token" *: *"\([^"]*\)".*/\1/p')
if [ -n "$BRIA_API_KEY" ]; then
  grep -v '^api_token=' "$HOME/.bria/credentials" > "$HOME/.bria/credentials.tmp" 2>/dev/null || true
  printf 'api_token=%s\n' "$BRIA_API_KEY" >> "$HOME/.bria/credentials.tmp"
  mv "$HOME/.bria/credentials.tmp" "$HOME/.bria/credentials"
fi

Interpret the output:

  • If it prints BILLING_ERROR: ... — relay the message to the user exactly as shown and stop. Do not make any API calls.
  • If it prints TOKEN_EXPIRED — the session is no longer valid. Tell the user their session expired and restart from Step 2.
  • Otherwise, BRIA_API_KEY now contains the real API key and is cached for future calls. Proceed to the next section.

How to Delayer an Ad

Source the helper script at references/code-examples/bria_delayer_client.sh (resolve <SKILL_DIR> to this skill's own directory), then make one call. It handles the local-file encoding, the JSON, the submit, the polling, and downloading every layer. The API key is auto-loaded from ~/.bria/credentials.

source <SKILL_DIR>/references/code-examples/bria_delayer_client.sh

# A local ad file
bria_delayer "/path/to/summer-sale.jpg"
# → saved summer-sale-layers/result.json
# → saved summer-sale-layers/background_1.png
# → saved summer-sale-layers/logo_1.png
# → saved summer-sale-layers/product_1.png
# → 3 layer image(s) plus result.json in summer-sale-layers

# An ad URL
bria_delayer "https://example.com/creatives/summer-sale.jpg"

That's it. One function call. Delayering is asynchronous and takes 2–3 minutes for a typical ad — the helper polls for up to 6 minutes and tells the user when it is still working.

Input

  • Local file path — encoded and sent with the request. No upload step, no temporary URL to manage.
  • Image URL — any publicly accessible, direct link to the image file. Passed straight through.

One ad per call — the API takes exactly one image per request. To do several, loop (see Examples).

Supported formats: PNG, JPEG, WEBP, AVIF, GIF, TIFF, BMP, SVG, PDF. There is no file-size limit. Ads larger than 800 px on either side need an enterprise plan; on other plans they are rejected before any work is done, so resize the ad first if the account is capped.

Options

OptionValuesDefaultNotes
--promptfree textnoneGuidance for the extraction. Use it to state something the pixels alone do not settle — "the headline and the sub-headline are separate lines", "the roundel top-right is the brand logo, not part of the product", "keep the price and the currency symbol as one text layer". Not needed for a normal run.
--effortminimal, low, medium, highmediumHow much reasoning Bria spends reading the ad. Raise it for a dense or unusual creative; lower it for a simple one.
--out-dirpath<input-stem>-layersWhere the layers land.

Two environment variables control the wait: BRIA_POLL_INTERVAL (default 10 seconds) and BRIA_POLL_ATTEMPTS (default 36, giving a 6-minute ceiling).

Output

One folder per input ad, named <input-stem>-layers/:

summer-sale-layers/
├── result.json          # the layer manifest
├── background_1.png     # one file per image layer, named by its layer id
├── logo_1.png
├── product_1.png
└── text_1_svg.svg       # each text layer's outlined-glyph twin (see below)

result.json is the full description of the ad:

{
  "canvas": { "width": 1080, "height": 1350 },
  "layers": [
    {
      "id": "canvas_background",
      "type": "vector",
      "subtype": "background",
      "bbox": { "x": 0, "y": 0, "width": 1080, "height": 1350 },
      "z_order": 0,
      "style": { "background_color": "#F4EFE7" }
    },
    {
      "id": "logo_1",
      "type": "image",
      "subtype": "logo",
      "bbox": { "x": 74, "y": 64, "width": 180, "height": 62 },
      "z_order": 4,
      "asset_path": "https://.../logo_1.png"
    },
    {
      "id": "primary_copy_1",
      "type": "text",
      "subtype": "headline",
      "bbox": { "x": 74, "y": 320, "width": 640, "height": 210 },
      "z_order": 5,
      "text": "Summer Sale\nup to 40% off",
      "text_style": {
        "color": "#1B1B1B",
        "font_family": "Poppins",
        "font_weight": 700,
        "font_size_px": 88,
        "line_height": 1.05,
        "text_align": "left"
      }
    }
  ],
  "font_stylesheets": ["https://fonts.googleapis.com/css2?family=Poppins:wght@400;700"]
}

Layer ids are role slots — canvas_background, background_1, logo_1, image_1, product_1, primary_copy_1, secondary_copy_1, cta_1, and so on, falling back to {subtype}_{index} when no slot was assigned. Filenames come straight from those ids; nothing is renamed or invented. Text layers carry their copy and typography in the manifest rather than as a flat image, which is what makes the headline editable. Only image layers have an asset_path, so a text-heavy ad yields fewer files than layers. z_order is paint order, back to front.

Copy comes back twice. Each piece of text is a pair: text_<n>_svg is an image layer holding an .svg of the text with its glyphs outlined as paths — an exact reproduction, but no longer editable text, and text_<n>_font is a text layer holding the same words as editable copy plus its text_style. The _font twin is marked "hidden": true, because the outlined SVG is what reproduces the ad exactly. Rebuilding the ad unchanged means painting the _svg layers and skipping every hidden layer; changing a headline, a font, or the language means dropping that _svg layer and rendering its _font twin instead. Painting both draws the text on top of itself.


Examples

Delayer one ad and read back what it is made of

source <SKILL_DIR>/references/code-examples/bria_delayer_client.sh
bria_delayer "/path/to/creatives/black-friday-1080x1350.jpg"
cat black-friday-1080x1350-layers/result.json

Delayer an ad from a URL, with guidance

source <SKILL_DIR>/references/code-examples/bria_delayer_client.sh
bria_delayer "https://example.com/ads/spring-promo.png" \
  --prompt "the small print at the bottom is one legal text layer; the badge top-left is the brand logo"

Take extra care on a dense creative

source <SKILL_DIR>/references/code-examples/bria_delayer_client.sh
bria_delayer "/path/to/multi-product-carousel.png" --effort high --out-dir ./carousel-layers

A very large or unusually complex ad

Big canvases take longer than the 6-minute default. Widen the window rather than re-running:

source <SKILL_DIR>/references/code-examples/bria_delayer_client.sh
BRIA_POLL_ATTEMPTS=90 bria_delayer "/path/to/billboard-6000x3000.png"   # 15-minute ceiling

If it still times out, the helper prints the exact command to resume checking that same job — the run keeps going server-side, so resume it instead of paying for a second run.

Delayer a folder of finished ads

source <SKILL_DIR>/references/code-examples/bria_delayer_client.sh
for ad in creatives/*.jpg; do
  [ -f "$ad" ] || continue
  bria_delayer "$ad" && echo "Done: $ad" || echo "Failed: $ad" >&2
done

Runs are sequential on purpose: the default limit is 9 delayering submits a minute per account, and each run takes minutes anyway.


How It Works

  1. The ad is sent to Bria's delayering endpoint (POST /v2/ads/image_to_layers) — a local file is encoded into the request, a URL is passed through
  2. The API accepts the job with HTTP 202 and a status_url; the work runs asynchronously
  3. The helper polls that status URL every 10 seconds until the run reaches a terminal state
  4. On completion the response carries a pointer to the layer manifest; the helper fetches it as result.json
  5. Every image layer's asset_path is downloaded next to the manifest, named after its layer id

Common Errors

Delayering runs asynchronously, so most failures arrive when the job's status is polled rather than as an immediate rejection. The helper handles all of these — this table is what it tells the user, and what it does next.

Only the 401 / 403 row is an authentication problem. A rejected or unreadable image, a failed run, or a timeout says nothing about the credentials — do not re-run the sign-in step for those, and do not clear ~/.bria/credentials.

Two rules for handling any of these:

  • The helper already applies the retry policy in the last column. Never re-submit the same ad by hand — every submit is a billed 2–3 minute run, and a failure the table marks "No" will fail again for the same reason. If the ad looks fine locally and Bria still rejects it, that is worth reporting, not retrying.
  • Tell the user the cause and the fix, not the mechanics. Endpoints, tokens, status URLs, poll counts and HTTP codes are not useful to them; the files you produced, or what to change about the ad, are.
ErrorCauseFix
422 "corrupt or empty"The image could not be readRe-export the ad and try again. No retry
422 "Unsupported image format"The file is not one of the supported formatsSave the ad as PNG, JPEG, or WEBP. No retry
422 "could not be fetched"The URL is not a public, direct link to the imageAttach the file itself instead of a link. No retry
400 / 422 on a request the skill builtMalformed requestTry once more; if it repeats it is an ad-delayer skill issue. No retry
401 / 403API key missing, invalid, or the account is not permittedDelete ~/.bria/credentials and run the authentication step again
413The ad is over 800 px per dimension and the account's plan is capped thereResize the ad to 800 px or less on its longest side, or move to an enterprise plan. No retry — it cannot succeed as-is
429Too many delayering submits in a minute for this account (9 by default)The helper waits and retries automatically (20s, 40s, 60s)
Job status ERROR / 500The delayering pipeline failedThe helper retries the ad exactly once, then reports the request_id to give Bria support
Job status UNKNOWNBria keeps job status for about a day; this one has aged outRun the ad again
Polling timeoutThe run is slower than the 6-minute defaultThe job is still going — the helper prints the command to resume checking it, or raise BRIA_POLL_ATTEMPTS

Additional Resources

  • API Endpoints Reference — the real endpoint contract: request fields, the 202/status/result-pointer flow, the manifest schema, error shapes, rate limits
  • Shell Client (bria_delayer_client.sh)bria_delayer (one call, end to end) plus bria_delayer_submit, bria_delayer_wait, and bria_delayer_download if the steps are needed separately

Related Skills

  • remove-background — One transparent PNG of the foreground subject (RMBG 2.0). Use it for cutouts; use this skill when a whole ad has to come apart
  • bria-ai — Full Bria API access: generate images, edit photos, remove objects, upscale, restyle, product photography, and 20+ more endpoints
  • image-utils — Local post-processing with Python Pillow: resize, crop, composite the recovered layers back together
  • vgl — Structured VGL JSON for deterministic control over new image generation

GitHub 저장소

Bria-AI/bria-skill
경로: skills/ad-delayer
0
agenagent-skillagent-skillsaiai-agentsclaude-code-skill
FAQ

자주 묻는 질문

ad-delayer Skill이란 무엇인가요?

ad-delayer은(는) Bria-AI이(가) 만든 Claude Skill입니다. Skill은 Claude가 필요할 때 불러오는 지침과 리소스를 묶어 추가 프롬프트 없이 ad-delayer 관련 작업을 수행할 수 있게 합니다.

ad-delayer은(는) 어떻게 설치하나요?

이 페이지의 설치 명령을 사용하세요. ad-delayer을(를) Claude Code 플러그인으로 추가하거나 저장소를 skills 디렉터리에 복제한 다음 Claude를 다시 시작해 Skill을 불러옵니다.

ad-delayer은(는) 어떤 카테고리에 속하나요?

ad-delayer은(는) 메타 카테고리에 속합니다.

ad-delayer은(는) 무료로 사용할 수 있나요?

네. ad-delayer은(는) AIMCP에 등록되어 있으며 무료로 설치할 수 있습니다.

연관 스킬

content-collections
메타

이 스킬은 콘텐츠 콜렉션(Content Collections)을 위한 프로덕션 검증된 설정을 제공합니다. 콘텐츠 콜렉션은 Markdown/MDX 파일을 Zod 검증이 포함된 타입 안전한 데이터 콜렉션으로 변환해주는 TypeScript 최우선 도구입니다. 블로그, 문서 사이트 또는 콘텐츠 중심의 Vite + React 애플리케이션을 구축할 때 타입 안전성과 자동 콘텐츠 검증을 보장하기 위해 사용하세요. Vite 플러그인 구성과 MDX 컴파일부터 배포 최적화 및 스키마 검증에 이르기까지 모든 것을 다룹니다.

스킬 보기
polymarket
메타

이 스킬은 개발자들이 Polymarket 예측 시장 플랫폼을 활용한 애플리케이션을 구축할 수 있도록 지원하며, 거래 및 시장 데이터를 위한 API 통합 기능을 포함합니다. 또한 WebSocket을 통한 실시간 데이터 스트리밍을 제공하여 실시간 거래와 시장 활동을 모니터링할 수 있습니다. 이를 통해 거래 전략을 구현하거나 실시간 시장 업데이트를 처리하는 도구를 생성하는 데 활용할 수 있습니다.

스킬 보기
creating-opencode-plugins
메타

이 스킬은 개발자들이 명령어, 파일, LSP 작업 등 25개 이상의 이벤트 유형에 연결되는 OpenCode 플러그인을 만들 수 있도록 돕습니다. JavaScript/TypeScript 모듈을 위한 플러그인 구조, 이벤트 API 명세, 구현 패턴을 제공합니다. OpenCode AI 어시스턴트의 라이프사이클을 사용자 정의 이벤트 기반 로직으로 가로채거나, 모니터링하거나, 확장해야 할 때 사용하세요.

스킬 보기
sglang
메타

SGLang은 RadixAttention 프리픽스 캐싱을 활용하여 JSON, 정규식, 에이전트 워크플로우를 위한 고속 구조화 생성에 특화된 고성능 LLM 서빙 프레임워크입니다. 특히 반복되는 프리픽스가 있는 작업에서 상당히 빠른 추론 속도를 제공하여 복잡한 구조화 출력 및 다중 턴 대화에 이상적입니다. 제약 디코딩이 필요하거나 광범위한 프리픽스 공유가 있는 애플리케이션을 구축할 때는 vLLM과 같은 대안보다 SGLang을 선택하십시오.

스킬 보기