Social post designer
ivy.agent.social-post-designer · v0.1.0
ivyx
Turns a client's brief into a social post: a model writes the copy and the palette, the card is drawn in three sizes (square, portrait, landscape) and a key visual is painted behind the campaign. What comes out is kind deliverables, which IVYX Agency keeps with the run and shows on the client, the service and Home. The request arrives on a webhook (or a mailbox with the same start); the renderers are deterministic, so a weak answer from the model still yields a readable card.
Steps
In the order the agent's file lists them, each with where its inputs come from and the values the file fixes. A branch or a loop is a step too.
- 01Ivy NodePut the request together for the modelivy.node.design-brief
Puts the request together as one text for the model's turn: the client, the service, the month, the brief and the figures, so the model writes for the right client.
- takes
brieffrom the agent's inputclientfrom the agent's inputservicefrom the agent's inputrequest_idfrom the agent's input
- 02Model turnWrite the copy and the palette from the brief
The context is a client's brief for a social media post, with the client's name. Return a JSON object with: headline (at most 7 words, the one thing to say), subline (at most 16 words), cta (at most 3 words, a verb), palette (an object with bg, accent and text as 6-digit hex colours that fit the brief's mood; dark bg with light text or the reverse, always readable), layout (one of poster, split, band, minimal; poster when unsure), brand (the client's name as given), caption (one sentence saying what the visual shows, for the record), art_style (one of gradient, waves, grid, blobs for the picture behind the campaign). Answer with the JSON object only. Colours are 6-digit hex. Keep the words short and concrete; no exclamation marks; no claims the brief does not make.
- takes
contextfrom step 1
- 03Ivy NodeDraw the card in three sizesivy.node.design-svg-card
Draws a social post, a poster or a banner as SVG from a spec (headline, subline, cta, palette, layout, brand) in the sizes asked for.
- takes
specfrom step 2,outputfallback_textfrom the agent's input,briefname_prefixfrom the agent's input,client- set
sizes["1080x1080","1080x1350","1200x628"]
- 04Ivy NodePaint the key visualivy.node.design-png-art
Paints an abstract key visual (gradient, waves, grid or blobs) in a palette and writes it as a PNG with the standard library, no Pillow.
- takes
palettefrom step 2,output.palettestylefrom step 2,output.art_stylename_prefixfrom the agent's input,client- set
size1200x630seed7
- 05Ivy NodePack the deliverablesivy.node.design-pack
Gathers the files the steps before it made into one answer of kind deliverables (request, client, service, brief, the spec, the files with their bytes).
- takes
specfrom step 2,outputrequest_idfrom the agent's inputclientfrom the agent's inputservicefrom the agent's inputbrieffrom the agent's inputfiles_afrom step 3,filesfiles_bfrom step 4,files- returns
kind,request_id,client,service,brief,spec,files,count
Nodes it brings
Adding this agent in IVYX Studio adds these nodes with it. A node your workspace already has is kept as it is, even at another version.
What it touches
Collected from what each of its nodes declares, plus the model call when a step is a model turn. A declaration is the author's statement, and it is what policy rules select on.
Inputs
| Field | Type | Description |
|---|---|---|
| briefrequired | string | What the client asked for, in their words or the account lead's: the subject, the audience, the tone, the colours if any. |
| client | string | The client's name, as IVYX Agency knows it. |
| service | string | The service this is work for, as IVYX Agency knows it (e.g. Content Production). |
| request_id | string | The request's id on the channel it came from; the key that keeps one request from running twice. |
Outputs
| Field | Type | Description |
|---|---|---|
| kindrequired | string | deliverables: what this output is, for a receiver that takes several kinds. |
| request_id | string | Not declared |
| client | string | Not declared |
| service | string | Not declared |
| brief | string | Not declared |
| spec | object | The design spec the model wrote from the brief, as rendered. |
| filesrequired | array | The files made: name, mime, kind, bytes, data (base64), width, height, caption, variant. |
| countrequired | integer | Not declared |
Tests
2 of 2 test cases passed on Oct 25, 2026, in the publisher's own environment, before this version was published. The registry keeps that record; it does not run the cases again.
Requires: python:3.9, a model core
- friday-roast
A coffee brand's weekly post is three SVG cards in the post sizes and a PNG key visual, delivered as one deliverables answer.
- given
briefAcme Coffee wants an Instagram post for the Friday roast: a new single origin every week, delivered before the weeken...clientAcme CoffeeserviceContent Productionrequest_idcase-post-1- expects
kindequals deliverablescountequals 4request_idequals case-post-1clientequals Acme Coffeefiles.0.variantequals 1080x1080files.1.variantequals 1080x1350files.2.variantequals 1200x628files.0.datamatches ^PHN2Zyfiles.3.mimeequals image/pngspec.headlinematches \S
- terse-brief
A one-line brief with no client still gets the four files.
- given
briefGym opening in March.- expects
kindequals deliverablescountequals 4