{
  "markdown": "<!-- mcp-name: ai.dynsoft/sac -->\n<div align=\"center\">\n\n# SaC SDK\n\n### Interaction layer between you and your agents.\n\n[![PyPI version](https://img.shields.io/pypi/v/sac-sdk.svg)](https://pypi.org/project/sac-sdk/)\n[![Python](https://img.shields.io/pypi/pyversions/sac-sdk.svg)](https://pypi.org/project/sac-sdk/)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](./LICENSE)\n\n[Home Page](https://sac.dynsoft.ai) · [Full Paper](https://arxiv.org/abs/2603.21334)\n\n</div>\n\n---\n\nAI 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.\n\n<!-- TODO: add demo GIF here -->\n\n## Quickstart\n\n### 1. Install\n\n```bash\npip install sac-sdk\n```\n\n### 2. Run\n\n```bash\nsac serve\n```\n\nFirst 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.\n\n## Connect to your agent\n\nSaC plugs into the agent you already use — through [MCP](#claude-code-mcp), [Skill](#codex-skill), or [code](#python-build-your-own-agent).\n\n### Claude Code (MCP)\n\n```bash\npip install sac-sdk\nsac setup claude-code        # registers SaC as an MCP server\n```\n\nRestart Claude Code. Then try:\n\n> *\"Help me understand this codebase using a visualized and interactive app using SaC MCP.\"*\n\n<img src=\"./docs/example-claudecode.jpg\" alt=\"Claude Code + SaC example\" width=\"800\" />\n\n[Setup details →](./integrations/claude-code/)\n\n### Codex (Skill)\n\n```bash\npip install sac-sdk\nsac setup codex              # installs the SaC skill\nsac serve                    # keep running in a terminal\n```\n\n<img src=\"./docs/example-codex.jpg\" alt=\"Codex + SaC example\" width=\"800\" />\n\n[Setup details →](./integrations/codex/)\n\n### OpenClaw (Skill)\n\n```bash\npip install sac-sdk\nsac setup openclaw           # installs the SaC skill\nsac serve                    # keep running in a terminal\n```\n\n<img src=\"./docs/example-openclaw.jpg\" alt=\"OpenClaw + SaC example\" width=\"800\" />\n\n[Setup details →](./integrations/openclaw/)\n\n### Python (build your own agent)\n\n```python\nfrom sac import SaC\n\nsac = SaC()\nconv = sac.conversation()\napp = await conv.generate(\"3-day Tokyo itinerary\")\nprint(app.url)   # user opens this\n# app.code contains the generated TSX\n```\n\n## How it works\n\n```\nYour agent ──▶ SaC ──▶ User sees a live app at a URL\n                   ◀── User clicks a button / types a message\nYour agent ──▶ SaC ──▶ Same URL, app evolves in place\n                   ◀── ...\n```\n\nOne 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.\n\n**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.\n\n## When to use SaC\n\nSaC is for tasks where **exploration and interaction** matter more than a final answer.\n\n**Good fit:** trip planning, data analysis dashboards, comparison shopping, project planning, research, financial reviews, decision aids, internal tools\n\n**Not the right tool for:** simple Q&A, one-shot automations (\"set an alarm\"), conversations that are purely text\n\n## Customize\n\nEvery layer is pluggable:\n\n```python\nfrom sac import SaC, FileStore\n\nsac = SaC(\n    llm=YourLLMProvider(...),       # any class implementing LLMProvider\n    search=YourSearchProvider(...), # any class implementing SearchProvider\n    store=FileStore(\".sac\"),\n)\n```\n\nPrompts live in [`src/sac/runtime/prompts/`](./src/sac/runtime/prompts/) and\nthe default design system is in [`src/sac/renderer/design-systems/default/`](./src/sac/renderer/design-systems/default/).\n\n## Architecture\n\n```\nsrc/sac/\n├── sac.py / conversation.py    Entry + Conversation primitive\n├── runtime/                    Generate + Evolve pipeline, prompts, providers\n├── server/\n│   ├── http/                   FastAPI + SSE streaming + viewer\n│   └── mcp/                    MCP stdio server (Claude Code integration)\n└── renderer/                   iframe sandbox + design system\n```\n\n[Full architecture →](./docs/architecture.md)\n\n## Project status\n\n`v0.1.2` — alpha. The core protocol (generate → evolve → callback loop) is stable and runs in production at [sac.dynsoft.ai](https://sac.dynsoft.ai). The SDK surface is being polished toward v1.0.\n\n## Contributing\n\nIssues and PRs welcome. Highest-leverage contributions right now:\n- **Prompt improvements** in [`src/sac/runtime/prompts/`](./src/sac/runtime/prompts/)\n- **Design system contributions** in [`src/sac/renderer/design-systems/`](./src/sac/renderer/design-systems/)\n\nFor local dev: `pip install -e .`\n\n## Citation\n\n```bibtex\n@article{xie2026sac,\n  title  = {Software as Content: Dynamic Applications as the Human-Agent Interaction Layer},\n  author = {Xie, Mulong},\n  year   = {2026},\n  url    = {https://arxiv.org/abs/2603.21334}\n}\n```\n\n## License\n\n[Apache-2.0](./LICENSE) · © 2026 Mulong Xie / Dynsoft Lab\n\n---\n\n<div align=\"center\">\n\nBuilt by [Dynsoft Lab](https://sac.dynsoft.ai). Questions: [mulong@mulongxie.me](mailto:mulong@mulongxie.me)\n\n</div>\n",
  "bytes": 5553,
  "sha": "cd771a4a0772999ac04d26358c580ea981fa9cd67199799ec898faa72c36d8ad",
  "repo_slug": "software-as-content/software-as-content-sdk",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_ai_dynsoft_sac_e578b012/readme"
}