SaC — Software as Content について
SaCは、結果をテキストではなくインタラクティブなアプリとして提示するためのエージェント向けSDKです。同じURL上のアプリが会話に応じて更新され、クリックやチャットがエージェントに戻ります。
主な機能
- 01インタラクティブアプリの生成
- 02会話に応じたアプリの更新
- 03アプリ操作とチャットの処理
- 04LLM、検索、ストレージの差し替え
活用シーン
- 01操作できる旅行プランの作成
- 02ダッシュボードでのデータ探索
- 03選択肢の比較と意思決定支援
MCP 対応
SaCはClaude Codeなどのエージェントと接続するMCP stdioサーバーを備えています。エージェントはこれを通じてインタラクティブアプリを生成、更新できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx sac-sdkSAC_API_KEYシークレットAPI key for the LLM provider (OpenRouter, Anthropic, OpenAI, etc.)SAC_API_BASECustom API endpoint for OpenAI-compatible providersSAC_MODELOverride the default generation modelSAC_SEARCH_API_KEYシークレットTavily API key for web search in generated appsローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
AI エージェントは推論し、コードを書き、API を呼び出せます。しかし、あなたに返答する必要があるとき、使えるのはテキストだけです。SaC(Software as Content)は、欠けていた インタラクションレイヤー です。会話の進行に合わせて進化する、リアルタイムで、永続的かつインタラクティブなアプリでエージェントが応答します。スクリーンショットでも、マークダウンの壁でもありません。エージェントと一緒にクリックし、探索し、形作る、本物の UI です。
クイックスタート
1. インストール
pip install sac-sdk
2. 実行
sac serve
初回は API キーの入力を求められ、保存されます。その後、http://localhost:18420 を開き、「予算付きの3日間の東京旅行プランナー」と入力すると、リアルタイムで React アプリが表示されます。ボタンをクリックし、進化するように頼んでみてください。これが、組み込みのエージェントループで動作する SaC です。外部エージェントは必要ありません。
エージェントに接続する
SaC は、MCP、スキル、またはコードを通じて、すでに使っているエージェントに接続できます。
Claude Code(MCP)
pip install sac-sdk
sac setup claude-code # registers SaC as an MCP server
Claude Code を再起動して、次のように試してください。
「SaC MCP を使った、視覚化されたインタラクティブなアプリで、このコードベースを理解するのを手伝ってください。」
Codex(スキル)
pip install sac-sdk
sac setup codex # installs the SaC skill
sac serve # keep running in a terminal
OpenClaw(スキル)
pip install sac-sdk
sac setup openclaw # installs the SaC skill
sac serve # keep running in a terminal
Python(独自のエージェントを構築)
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
仕組み
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
◀── ...
URL は1つ、会話も1つです。エージェントはターンごとに新しいページを生成するのではなく、既存のアプリを進化させます。ユーザーはコンテキストを維持し、エージェントは状態を維持します。
2つのチャネル、1つのループ: 各応答は、UI の更新(アプリが進化する)またはチャットの返信(テキストの吹き出し)のいずれかです。ユーザーはアプリ内のボタンをクリックすることも、チャットに入力することもでき、どちらも同じコールバックを通じてエージェントに戻ります。
SaC を使う場面
SaC は、最終的な回答よりも 探索とインタラクション が重要なタスクに適しています。
適した用途: 旅行の計画、データ分析ダッシュボード、商品比較、プロジェクト計画、調査、財務レビュー、意思決定支援ツール、社内ツール
適さない用途: 単純な質疑応答、単発の自動化(「アラームを設定する」など)、テキストだけで完結する会話
カスタマイズ
すべてのレイヤーを差し替えられます。
from sac import SaC, FileStore
sac = SaC(
llm=YourLLMProvider(...), # any class implementing LLMProvider
search=YourSearchProvider(...), # any class implementing SearchProvider
store=FileStore(".sac"),
)
プロンプトは src/sac/runtime/prompts/ にあり、デフォルトのデザインシステムは src/sac/renderer/design-systems/default/ にあります。
アーキテクチャ
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
プロジェクトの状況
v0.1.2 — アルファ版です。コアプロトコル(生成 → 進化 → コールバックループ)は安定しており、sac.dynsoft.ai で本番運用されています。SDK の API は v1.0 に向けて調整中です。
コントリビューション
Issue や PR を歓迎します。現時点で特に効果の高いコントリビューションは次のとおりです。
- プロンプトの改善:
src/sac/runtime/prompts/ - デザインシステムへの貢献:
src/sac/renderer/design-systems/
ローカル開発の場合:pip install -e .
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。