{"id":78769,"plugin_id":"plugin_asdk_app_6a7afe588ab08191833eda9ff7fd59a1","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-11-03T18:27:57.574Z","digest":"d792d0ebb4466bd186fd3118056788af2fe70fa946b9220a8187865826cc9b64","against":null,"payload":{"description":"Make things on an operator's Dreambooth account from a conversation — a photo filter previewed before it is created, a photo frame designed and refined with the image model, a whole booth designed from a description, adjusted (settings, button text, frames, filters) and created at its own link, or a copy of a booth they already run. Use for \"make me a filter that looks…\", \"design me a frame with…\", \"design a booth for…\", \"make it 4 photos\", \"set up another booth like my Bandung one\". Read this before creating anything: these are the only tools here that change an account, nothing here edits or deletes what already exists, and a create called twice makes two of the thing.","included_files":[],"name":"creating-filters-and-booths","skill_md_contents":"---\nname: creating-filters-and-booths\ndescription: Make things on an operator's Dreambooth account from a conversation — a photo filter previewed before it is created, a photo frame designed and refined with the image model, a whole booth designed from a description, adjusted (settings, button text, frames, filters) and created at its own link, or a copy of a booth they already run. Use for \"make me a filter that looks…\", \"design me a frame with…\", \"design a booth for…\", \"make it 4 photos\", \"set up another booth like my Bandung one\". Read this before creating anything: these are the only tools here that change an account, nothing here edits or deletes what already exists, and a create called twice makes two of the thing.\n---\n\n# Making things on an operator's account\n\nEverything in this connector reads, except the tools below. They are the only\ncalls that leave an account different from how they found it, none of them can\nbe reversed from this conversation, and none of them touches a booth, frame or\nfilter that already exists — editing and deleting are dashboard work, always.\n\n| They ask for | Tools, in order |\n|---|---|\n| A photo filter from a described look | `preview_filter` (free, shows it) → `create_filter` |\n| A photo frame from a description | `start_frame` → `check_generation` → `refine_frame` (if asked) → `save_frame` |\n| A whole new booth | `start_booth` → `check_generation` → `refine_booth` / `update_booth_draft` (if asked) → `create_booth` |\n| Another booth like one they run | `list_projects` → `duplicate_project` |\n\n`get_booth_draft` reads a booth draft back by id when the conversation has moved\non; `check_generation` reports every background job. Neither creates anything.\n\n## Before you call any of them\n\n**Say what you are about to make, in their words, and let them answer.** The\nhost shows its own approval dialog, but that dialog shows arguments, not intent\n— \"contrast 112, saturation 88\" is not something an operator can check. A\nsentence they can agree or object to is: *\"A filter called Senja Hangat — warmer,\nslightly faded, a little less contrast. Make it?\"*\n\n**Nothing here edits or deletes what exists.** There is no tool that changes an\nexisting filter, frame or booth, and the connector cannot PUT or DELETE\nanything. A booth *draft* can be changed before it is created (below); a booth\nthat exists cannot. If they want to adjust or remove something that exists,\nsend them to the dashboard. Do not offer a duplicate as a way to \"edit\".\n\n**Creating twice makes two.** `create_filter`, `save_frame`, `create_booth` and\n`duplicate_project` are non-idempotent and say so in their annotations. If a\ncreate times out, do NOT repeat it — the write may have succeeded and only the\nreply went missing. Tell them to check their dashboard first. Repeating a read,\na preview, a check or a draft edit is free; repeating a create is not.\n\n**Nothing \"exists\" until the tool that makes it says so.** Previews, drafts and\nrunning jobs are not things the operator has. Never describe a frame as saved or\na booth as created before `save_frame` / `create_booth` has finished and\n`check_generation` says `done`.\n\n## Filters — `preview_filter`, then `create_filter`\n\nThe operator describes a look. You turn it into numbers. That translation is the\nwhole job, and getting the scale wrong produces a filter that is created\nsuccessfully and looks broken — a failure that reports nothing, because as far\nas every system involved is concerned it worked.\n\n**Preview first, always.** `preview_filter` renders the Studio's sample photo\nthrough the adjustments and shows it in the chat, for free, and names the\nadjustments a still preview cannot show (shadows, highlights and the like — the\nbooth still applies them). Show it, let them react, then create with the same\nadjustments.\n\n**The ranges are in the tool's schema. Read them there rather than guessing.**\nThey fall into three groups: some are 0–200 where **100 means unchanged**\n(brightness, contrast, saturation), some are -100–100 where **0 means unchanged**\n(temperature, exposure, shadows and most others), and blur is 0–10 in pixels.\nConfusing the first two is the common mistake, and it is the one that produces a\ngrey or blown-out filter from a request for a subtle one.\n\n**Only send what they asked to change.** An omitted adjustment keeps its neutral\nvalue. Sending every field at neutral creates a filter that does nothing.\n\n**Name it something they will recognise** in a list of filters — their words if\nthey named it, otherwise something descriptive. Never \"Untitled\".\n\n**It is private unless they ask otherwise.** Do not set it public to be helpful.\n\n**Report what came back, not what you sent.** The result carries what the Studio\nactually stored. If it differs from your arguments, the stored version is the\ntruth.\n\nSome looks cannot be built this way at all: `.cube` LUT imports and anything\nneeding an uploaded file are dashboard work. Say so rather than approximating a\nLUT with adjustments and calling it the same thing.\n\n## Frames — `start_frame` → `check_generation` → `refine_frame` → `save_frame`\n\nA frame is designed the way the Studio's Frame Studio does it: a thread with\nthe image model, one version at a time.\n\n**`start_frame` returns a job id, not a frame.** Say that generating takes about\na minute, then poll `check_generation` (every 15 seconds or so). When it says\n`done` it carries a preview image, a `threadId` and a `generationId` — a\npreview, not a saved frame. Show it.\n\n**Changes go through `refine_frame` on the same thread**, one instruction at a\ntime (\"warmer\", \"thicker border\", \"fewer motifs\"), and only when the operator\nasks — never iterate on your own. Earlier versions stay in the thread and can\nstill be saved.\n\n**`save_frame` is the only step that creates a frame**, from one chosen\n`generationId`, once the operator has picked a version. Saving twice makes two\nframes.\n\n**Generation is capped per account per day.** A refusal naming when it resets\nis correct behaviour, not a failure; relay it.\n\n## Booths — `start_booth` → `check_generation` → `refine_booth` / `update_booth_draft` → `create_booth`\n\nA booth is designed the way dreambooth.app/new does it: a DRAFT first (title,\ncolours, welcome screens, in-booth background), argued with in conversation,\nthen created.\n\n**Gather first, then start.** There is no questions step: before `start_booth`,\nask what /new would ask — the occasion or business, the vibe and colours, and\nthe language the booth should speak — and put all of it in the prompt. Each\n`start_booth` is a new draft and spends one of its three full generations, so do\nnot call it speculatively or twice for one request.\n\n**`start_booth` returns a job id, not a booth.** Say designing takes one to three\nminutes; poll `check_generation`. When it says `done` it carries `draft{…}` —\ntitle, headline, button text, palette, proposed link name, a welcome preview —\nand the card in the chat shows it. A draft is not a booth. Do not say \"your\nbooth is ready\".\n\n**Two ways to change a draft, and they are different:**\n\n- **`refine_booth` redraws** — the welcome screen (phone, laptop or both), the\n  in-booth background, or the whole draft from a new description. This is for\n  what is *painted*: the headline and subtext of a designed welcome are part of\n  the image, so \"change the headline\" is a redraw. Redraws are limited (five\n  per draft, three full rebuilds); `check_generation` reports what is left.\n- **`update_booth_draft` sets, without a redraw** — the title, the link name,\n  the welcome button text, the colours, capture mode, the booth's language,\n  which frames and filters it carries, its AI effect, and the page settings the\n  dashboard editor offers: number of photos, countdown, timeouts, GIF and\n  recording, retake, checkout, payment, result. It answers at once with the\n  draft, `applied` and `rejected`. **Relay a rejection as a sentence** (\"the\n  headline on this draft is painted into the image — shall I redraw it?\"), never\n  as success. Prices and packages are dashboard work; it will say so.\n\n**`create_booth` is the only step that makes a booth**, and it makes a complete\none: it reads the draft (so everything `update_booth_draft` set is carried),\nchecks the link name, draws the booth's own three frames, adds starter frames\nand the Studio's default filter the way /new does, then creates the booth. The\ntitle and link name default to the draft's — confirm them with the operator\nbefore calling, and say it takes **two to six minutes**. Filters made with\n`create_filter` and frames saved with `save_frame` in this conversation are\ncarried automatically. If the link name is taken it stops before drawing\nanything — ask for another and call again. When `check_generation` says `done`\nthe result carries the booth's public link and a dashboard link; the booth is\nlive (unlisted) at once. After that, it is a booth that exists: changes happen\nin the dashboard, not here.\n\n**If the conversation lost the draft**, `get_booth_draft` reads it back by\n`draftId` (drafts live seven days); `start_booth` again only when the operator\nwants a different booth.\n\n## `duplicate_project`\n\n**Resolve the name to an id first.** They will say \"my Bandung booth\", never an\nid. Call `list_projects`, find it, confirm which one if more than one matches.\nDuplicating the wrong booth is not dangerous, but it is a booth they now have to\ndelete.\n\n**The copy is named by the Studio** — `<original>-copy`, then `-copy-1` and so\non. You do not choose the name and cannot pass one.\n\n**It does not inherit the original's public address.** Nothing already published\nor shared is disturbed by the copy, and the copy is not reachable at the\noriginal's link. If they want the new booth public, that is a dashboard step.\n\n**It copies settings, packages and promos — not sessions, media or money.** A\nduplicate starts with no history. Say that if they seem to expect otherwise.\n\n**A copy is not an edit.** If they want a *different* booth rather than a copy,\ndesign one with `start_booth`; if they want to change one that exists, that is\nthe dashboard.\n\n## When something is refused\n\nThese calls can come back refused, and the message is written to be relayed.\n\n**\"This connection is read-only\"** means the operator connected without granting\npermission to create things. They need to reconnect and approve it. Say that;\ndo not retry.\n\n**\"This token cannot create things\"** means the account was connected by the\nolder sign-in path, which is not allowed to write. Reconnecting through the\nnormal sign-in fixes it.\n\n**A used-up allowance** (daily frame generations, a draft's redraws or full\ngenerations, booth drafts per hour) names what remains possible. Relay that.\n\n**\"Booth generation is not enabled on this Dreambooth\"** means the feature is\noff server-side; nothing was generated. Offer the dashboard's own flow.\n\nEither way, relay the sentence. None of these is a Dreambooth outage and none is\nworth retrying.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}