Social copywriter
ivy.agent.social-copywriter · v0.1.1
ivyx
Writes a brand's post from a brief: the brand's voice, audience and pillar go into the model's context with the accounts to write for, the model answers one variant per account (the text, hashtags, a first comment where the platform wants one), and the variants are packed as kind content-draft, which IVYX Social's intake fills a content item with for a person to approve. The model writes words, never a figure; the draft publishes nothing.
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 NodeThe request as the model's contextivy.node.copy-brief
Puts a content request together as one text for the model's turn: the brand, its voice and audience, the pillar, the format, the accounts to write for with each platform's length, the brief.
- takes
brieffrom the agent's inputclientfrom the agent's inputtonefrom the agent's inputaudiencefrom the agent's inputpillarfrom the agent's inputformatfrom the agent's inputtitlefrom the agent's inputaccountsfrom the agent's input
- 02Model turnWrite one variant per account
The context is a social media content request: the brand, its voice and audience, the pillar, the format, the accounts to write for with each platform's character limit, and the brief. Return a JSON object with variants: an object with one entry per account named, its key the account copied exactly, each {text, hashtags, first_comment}. The text is the caption or post in the brand's voice, within the platform's limit, no emojis unless the voice asks, no claims the brief does not make, no figures. hashtags is one string of 3 to 8 words separated by spaces, without the #. first_comment is for Instagram only (the hashtags may go there) and empty otherwise. Answer with the JSON object only.
- takes
contextfrom step 1outputSchemafrom step 1,output_schema
- 03Ivy NodePack the texts as a draftivy.node.content-pack
Turns the model's variants into one answer of kind content-draft keyed by account, each text held to its platform's length, the hashtags without their #; what IVYX Social's intake fills a content item with.
- takes
specfrom step 2,outputaccountsfrom the agent's inputrequest_idfrom the agent's inputclientfrom the agent's inputtitlefrom the agent's inputformatfrom the agent's inputpillarfrom the agent's inputbrieffrom the agent's input- returns
kind,request_id,client,title,format,pillar,brief,variants,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 |
|---|---|---|
| firm | string | The firm's slug in IVYX Social; the destination routes the delivery by it. |
| briefrequired | string | What the post should say and do. |
| clientrequired | string | Not declared |
| request_id | string | The content item's request id; the key that keeps one request from running twice. |
| title | string | Not declared |
| format | string | reel, image, carousel, text, thread, video, short, document, story. |
| pillar | string | Not declared |
| tone | string | The brand's voice. |
| audience | string | Who the brand speaks to. |
| accountsrequired | array | The accounts to write for: key (the collector key), platform. |
Outputs
| Field | Type | Description |
|---|---|---|
| kindrequired | string | content-draft |
| request_id | string | Not declared |
| client | string | Not declared |
| title | string | Not declared |
| format | string | Not declared |
| pillar | string | Not declared |
| brief | string | Not declared |
| variantsrequired | object | Not declared |
| count | 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
- two-accounts
A teaser for Instagram and LinkedIn is one variant per account, X's limit left alone since X was not asked.
- given
firmivyxbriefShow the new report in fifteen seconds.clientIVYXrequest_idcase-copy-1titleLaunch teaserformatreelpillarproducttoneConfident, plain, a little dry.accounts[{"key":"ig_ivyxai","platform":"instagram"},{"key":"li_ivyx","platform":"linkedin"}]- expects
kindequals content-draftcountequals 2request_idequals case-copy-1variants.ig_ivyxai.textmatches \Svariants.li_ivyx.textmatches \S
- x-only
One X account is one variant within 280 characters.
- given
briefWe moved the webinar to Thursday.clientIVYXaccounts[{"key":"x_ivyxai","platform":"x"}]- expects
kindequals content-draftcountequals 1variants.x_ivyxai.textmatches ^[\s\S]{1,280}$