Social publish
ivy.agent.social-publish · v0.1.0
ivyx
Publishes an approved content item: one target per account (the platform, its connection, the approved text and media), laid out per platform, each publisher behind an if (Instagram, LinkedIn, X), and the rows packed as kind publish-result, which IVYX Social's intake marks the item published with and links the new post to it. Speaks for the brand: each publisher is held for a person by this project's policy, after IVYX Social's own approval.
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 NodeLay the request out per platformivy.node.publish-plan
Reads an IVYX Social publish request (the content item and a target per account: platform, connection, ids, the approved text, media URLs) and lays it out per platform with a flag each, so the agent's if-branches run the right publisher.
- takes
content_itemfrom the agent's inputformatfrom the agent's inputtargetsfrom the agent's input
- 02BranchInstagram?
Lets what follows run only when has_instagram of step 1 is true.
- 03Ivy NodePublish on Instagramivy.node.ig-publish
Publishes to an Instagram professional account through the Graph API with a Meta connection: a container is created from the public media URLs (one image, several for a carousel, a video for a reel), waited on until finished, then published; the caption and the first comment are posted.
Runs only on the then branch of step 2.
- takes
connectionfrom step 1,ig.connectionig_user_idfrom step 1,ig.ig_user_idaccountfrom step 1,ig.accounttextfrom step 1,ig.texthashtagsfrom step 1,ig.hashtagsfirst_commentfrom step 1,ig.first_commentmedia_urlsfrom step 1,ig.media_urlsformatfrom step 1,ig.format
- 04BranchLinkedIn?
Lets what follows run only when has_linkedin of step 1 is true.
- 05Ivy NodePublish on LinkedInivy.node.li-publish
Publishes a post as a LinkedIn company page (or as the member, for a personal account) through the Community Management API with a LinkedIn connection: the text, and an article link when given.
Runs only on the then branch of step 4.
- takes
connectionfrom step 1,li.connectionauthorfrom step 1,li.authoraccountfrom step 1,li.accounttextfrom step 1,li.texthashtagsfrom step 1,li.hashtagslinkfrom step 1,li.linklink_titlefrom step 1,li.link_title
- 06BranchX?
Lets what follows run only when has_x of step 1 is true.
- 07Ivy NodePost on Xivy.node.x-publish
Posts as the X account through the X API v2 with an X connection: one post, a thread (each text replies to the one before), or a reply to a given post.
Runs only on the then branch of step 6.
- takes
connectionfrom step 1,x.connectionaccountfrom step 1,x.accounthandlefrom step 1,x.handletextsfrom step 1,x.textshashtagsfrom step 1,x.hashtags
- 08Ivy NodeThe publish resultsivy.node.publish-pack
Gathers the publishers' rows into one answer of kind publish-result for an IVYX Social content item; a target no publisher ran for is a failed row with the reason.
Runs only on the else branch of step 6.
- takes
content_itemfrom step 1skippedfrom step 1results_afrom step 3,resultsresults_bfrom step 5,resultsresults_cfrom step 7,results- returns
kind,content_item,results,count,published
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.
- Instagram: publish a post, a carousel or a reelivy.node.ig-publish · v0.1.0
- LinkedIn: publish a post as the pageivy.node.li-publish · v0.1.0
- Social: pack the publish resultsivy.node.publish-pack · v0.1.0
- Social: lay a publish request out per platformivy.node.publish-plan · v0.1.0
- X: post, a thread or a replyivy.node.x-publish · v0.1.0
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. |
| content_itemrequired | string | The content item's id in IVYX Social. |
| format | string | Not declared |
| targetsrequired | array | One per account: platform, account, connection, ig_user_id | author | handle, text, hashtags, first_comment, media_urls, link, link_title. |
Outputs
| Field | Type | Description |
|---|---|---|
| kindrequired | string | publish-result |
| content_item | string | Not declared |
| resultsrequired | array | Not declared |
| count | integer | Not declared |
| published | 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, tools/connectors-standin.py on 127.0.0.1:18911, its connections stored as the secrets connection.standin-<platform>
- x-post
An approved X post is published through the stand-in and comes back with its post key.
- given
firmivyxcontent_itemcase-ci-1targets[{"platform":"x","account":"x_ivyxai","connection":{"$secret":"connection.standin-x"},"text":"Five myths about AI vis...- expects
kindequals publish-resultcontent_itemequals case-ci-1countequals 1publishedequals 1results.0.post_keyequals x:t9
- no-publisher
A YouTube target has no publisher and is a failed row with the reason, nothing sent.
- given
firmivyxcontent_itemcase-ci-2targets[{"platform":"youtube","account":"yt_ivyx","connection":{"$secret":"connection.standin-google"},"text":"x"}]- expects
kindequals publish-resultcountequals 1publishedequals 0results.0.statusequals failed