← All ivy-agents
IVYXSTUDIO · IVY AGENT
S

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.

  1. 01
    Lay the request out per platform
    ivy.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_item from the agent's input
    format from the agent's input
    targets from the agent's input
    Ivy Node
  2. 02
    Instagram?

    Lets what follows run only when has_instagram of step 1 is true.

    Branch
  3. 03
    Publish on Instagram
    ivy.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
    connection from step 1, ig.connection
    ig_user_id from step 1, ig.ig_user_id
    account from step 1, ig.account
    text from step 1, ig.text
    hashtags from step 1, ig.hashtags
    first_comment from step 1, ig.first_comment
    media_urls from step 1, ig.media_urls
    format from step 1, ig.format
    Ivy Node
  4. 04
    LinkedIn?

    Lets what follows run only when has_linkedin of step 1 is true.

    Branch
  5. 05
    Publish on LinkedIn
    ivy.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
    connection from step 1, li.connection
    author from step 1, li.author
    account from step 1, li.account
    text from step 1, li.text
    hashtags from step 1, li.hashtags
    link from step 1, li.link
    link_title from step 1, li.link_title
    Ivy Node
  6. 06
    X?

    Lets what follows run only when has_x of step 1 is true.

    Branch
  7. 07
    Post on X
    ivy.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
    connection from step 1, x.connection
    account from step 1, x.account
    handle from step 1, x.handle
    texts from step 1, x.texts
    hashtags from step 1, x.hashtags
    Ivy Node
  8. 08
    The publish results
    ivy.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_item from step 1
    skipped from step 1
    results_a from step 3, results
    results_b from step 5, results
    results_c from step 7, results
    returns
    kind, content_item, results, count, published
    Ivy Node

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.

message-sendNetwork

Inputs

FieldTypeDescription
firmstringThe firm's slug in IVYX Social; the destination routes the delivery by it.
content_itemrequiredstringThe content item's id in IVYX Social.
formatstringNot declared
targetsrequiredarrayOne per account: platform, account, connection, ig_user_id | author | handle, text, hashtags, first_comment, media_urls, link, link_title.

Outputs

FieldTypeDescription
kindrequiredstringpublish-result
content_itemstringNot declared
resultsrequiredarrayNot declared
countintegerNot declared
publishedintegerNot 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
    firm ivyx
    content_item case-ci-1
    targets [{"platform":"x","account":"x_ivyxai","connection":{"$secret":"connection.standin-x"},"text":"Five myths about AI vis...
    expects
    kind equals publish-result
    content_item equals case-ci-1
    count equals 1
    published equals 1
    results.0.post_key equals x:t9
  • no-publisher

    A YouTube target has no publisher and is a failed row with the reason, nothing sent.

    given
    firm ivyx
    content_item case-ci-2
    targets [{"platform":"youtube","account":"yt_ivyx","connection":{"$secret":"connection.standin-google"},"text":"x"}]
    expects
    kind equals publish-result
    count equals 1
    published equals 0
    results.0.status equals failed