Skip to main content

SaC SDK

Interaction layer between you and your agents.

PyPI version Python License

Live demo · Paper


AI agents can reason, code, and call APIs — but when they need to communicate back to you, all they have is text. SaC (Software as Content) is the missing interaction layer: your agent responds with a live, persistent, interactive app that evolves as the conversation continues. Not a screenshot, not a markdown wall — a real UI you click, explore, and shape together with your agent.

Quickstart

1. Install

pip install sac-sdk

2. Run

sac serve

First time? It'll ask for your API key and save it. Then open http://localhost:18420, type "3-day Tokyo trip planner with budget", and watch a live React app stream in. Click buttons. Ask it to evolve. This is SaC running a built-in agent loop — no external agent needed.

Connect to your agent

SaC plugs into the agent you already use — through MCP, Skill, or code.

Claude Code (MCP)

pip install sac-sdk
sac setup claude-code        # registers SaC as an MCP server

Restart Claude Code. Then try:

"Help me understand this codebase using a visualized and interactive app using SaC MCP."

Claude Code + SaC example

Setup details →

Codex (Skill)

pip install sac-sdk
sac setup codex              # installs the SaC skill
sac serve                    # keep running in a terminal
Codex + SaC example

Setup details →

OpenClaw (Skill)

pip install sac-sdk
sac setup openclaw           # installs the SaC skill
sac serve                    # keep running in a terminal
OpenClaw + SaC example

Setup details →

Python (build your own agent)

from sac import SaC

sac = SaC()
conv = sac.conversation()
app = await conv.generate("3-day Tokyo itinerary")
print(app.url)   # user opens this
# app.code contains the generated TSX

How it works

Your agent ──▶ SaC ──▶ User sees a live app at a URL
                   ◀── User clicks a button / types a message
Your agent ──▶ SaC ──▶ Same URL, app evolves in place
                   ◀── ...

One URL, one conversation. The agent doesn't generate a new page every turn — it evolves the existing app. Users keep their context; the agent keeps its state.

Two channels, one loop: every response is either a UI update (the app evolves) or a chat reply (a text bubble). Users can click buttons in the app OR type in the chat — both go back to the agent through the same callback.

When to use SaC

SaC is for tasks where exploration and interaction matter more than a final answer.

Good fit: trip planning, data analysis dashboards, comparison shopping, project planning, research, financial reviews, decision aids, internal tools

Not the right tool for: simple Q&A, one-shot automations ("set an alarm"), conversations that are purely text

Customize

Every layer is pluggable:

from sac import SaC, FileStore

sac = SaC(
    llm=YourLLMProvider(...),       # any class implementing LLMProvider
    search=YourSearchProvider(...), # any class implementing SearchProvider
    store=FileStore(".sac"),
)

Prompts live in src/sac/runtime/prompts/ and the default design system is in src/sac/renderer/design-systems/default/.

Architecture

src/sac/
├── sac.py / conversation.py    Entry + Conversation primitive
├── runtime/                    Generate + Evolve pipeline, prompts, providers
├── server/
│   ├── http/                   FastAPI + SSE streaming + viewer
│   └── mcp/                    MCP stdio server (Claude Code integration)
└── renderer/                   iframe sandbox + design system

Full architecture →

Project status

v0.1.2 — alpha. The core protocol (generate → evolve → callback loop) is stable and runs in production at sac.dynsoft.ai. The SDK surface is being polished toward v1.0.

Contributing

Issues and PRs welcome. Highest-leverage contributions right now:

For local dev: pip install -e .

Citation

@article{xie2026sac,
  title  = {Software as Content: Dynamic Applications as the Human-Agent Interaction Layer},
  author = {Xie, Mulong},
  year   = {2026},
  url    = {https://arxiv.org/abs/2603.21334}
}

License

Apache-2.0 · © 2026 Mulong Xie / Dynsoft Lab


Built by Dynsoft Lab. Questions: mulong@mulongxie.me

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sac_sdk-0.1.2.tar.gz (2.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sac_sdk-0.1.2-py3-none-any.whl (262.3 kB view details)

Uploaded Python 3

File details

Details for the file sac_sdk-0.1.2.tar.gz.

File metadata

  • Download URL: sac_sdk-0.1.2.tar.gz
  • Upload date:
  • Size: 2.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.0

File hashes

Hashes for sac_sdk-0.1.2.tar.gz
Algorithm Hash digest
SHA256 ba52c4b7c2b5f0d9f4240872e7f749335c620233172c5300ce806ff3ced21677
MD5 8e73405c6a43036f252e7aab130eebba
BLAKE2b-256 8a05c5c6bbc92c41b6bf7eae4061fc8ca95e31c43fea4a6daac516e286b98b86

See more details on using hashes here.

File details

Details for the file sac_sdk-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: sac_sdk-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 262.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.0

File hashes

Hashes for sac_sdk-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 072ee10bf53a696f8af94d1fdb522ca8eb6d3468a691d626c6c0c2db9565bbe6
MD5 d3edd60299541579cb7ed6e39db4a5b5
BLAKE2b-256 5ff5849efeb75ab6deda8dd7e27f13beaaa827591b1c97e2532ecbd49e664e1b

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page