RPC and API
OpenClaw App SDK API の設計
このページは、公開 OpenClaw App SDK の詳細な API リファレンス設計です。これは意図的に Plugin SDK とは分けられています。
公開アプリ SDK は 2 つのレイヤーで構築する必要があります。
- 低レベルの生成済み Gateway クライアント。
OpenClaw、Agent、Session、Run、Task、Artifact、Approval、Environmentオブジェクトを備えた高レベルで使いやすいラッパー。
名前空間設計
低レベルの名前空間は Gateway リソースに厳密に従う必要があります。
oc.agents.list();oc.agents.get("main");oc.agents.create(...);oc.agents.update(...); oc.sessions.list();oc.sessions.create(...);oc.sessions.resolve(...);oc.sessions.send(...);oc.sessions.messages(...);oc.sessions.fork(...);oc.sessions.compact(...);oc.sessions.abort(...); oc.runs.create(...);oc.runs.get(runId);oc.runs.events(runId, { after });oc.runs.wait(runId);oc.runs.cancel(runId); oc.tasks.list({ status: "running" });oc.tasks.get(taskId);oc.tasks.cancel(taskId, { reason });oc.tasks.events(taskId, { after }); // future API oc.models.list();oc.models.status(); // Gateway models.authStatus oc.tools.list();oc.tools.invoke("tool-name", { sessionKey, idempotencyKey }); oc.artifacts.list({ runId });oc.artifacts.get(artifactId, { runId });oc.artifacts.download(artifactId, { runId }); oc.approvals.list();oc.approvals.respond(approvalId, ...); oc.environments.list();oc.environments.create(...); // future API: current SDK throws unsupportedoc.environments.status(environmentId);oc.environments.delete(environmentId); // future API: current SDK throws unsupported高レベルのラッパーは、一般的なフローを快適にするオブジェクトを返す必要があります。
const run = await agent.run(inputOrParams);await run.cancel();await run.wait(); for await (const event of run.events()) { // normalized event stream} const artifacts = await run.artifacts.list();const session = await run.session();イベント契約
公開 SDK は、バージョン付きで再生可能な正規化イベントを公開する必要があります。
type OpenClawEvent = { version: 1; id: string; ts: number; type: OpenClawEventType; runId?: string; sessionId?: string; sessionKey?: string; taskId?: string; agentId?: string; data: unknown; raw?: unknown;};id は再生カーソルです。利用側は
events({ after: id }) で再接続し、保持期間が許す場合は見逃したイベントを受け取れる必要があります。
推奨される正規化イベントファミリー:
| イベント | 意味 |
|---|---|
run.created |
実行が受け付けられた。 |
run.queued |
実行がセッションレーン、ランタイム、または環境を待っている。 |
run.started |
ランタイムが実行を開始した。 |
run.completed |
実行が正常に完了した。 |
run.failed |
実行がエラーで終了した。 |
run.cancelled |
実行がキャンセルされた。 |
run.timed_out |
実行がタイムアウトを超過した。 |
assistant.delta |
アシスタントのテキスト差分。 |
assistant.message |
完全なアシスタントメッセージまたは置換。 |
thinking.delta |
ポリシーで公開が許可される場合の推論または計画の差分。 |
tool.call.started |
ツール呼び出しが開始された。 |
tool.call.delta |
ツール呼び出しが進行状況または部分出力をストリームした。 |
tool.call.completed |
ツール呼び出しが正常に返された。 |
tool.call.failed |
ツール呼び出しが失敗した。 |
approval.requested |
実行またはツールに承認が必要。 |
approval.resolved |
承認が許可、拒否、期限切れ、またはキャンセルされた。 |
question.requested |
ランタイムがユーザーまたはホストアプリに入力を求めている。 |
question.answered |
ホストアプリが回答を提供した。 |
artifact.created |
新しい成果物が利用可能になった。 |
artifact.updated |
既存の成果物が変更された。 |
session.created |
セッションが作成された。 |
session.updated |
セッションのメタデータが変更された。 |
session.compacted |
セッションの Compaction が発生した。 |
task.updated |
バックグラウンドタスクの状態が変更された。 |
git.branch |
ランタイムがブランチ状態を観測または変更した。 |
git.diff |
ランタイムが diff を生成または変更した。 |
git.pr |
ランタイムがプルリクエストを作成、更新、またはリンクした。 |
ランタイムネイティブのペイロードは raw から利用可能にする必要がありますが、通常の UI でアプリが raw を解析する必要があってはなりません。
結果契約
Run.wait() は安定した結果エンベロープを返す必要があります。
type RunResult = { runId: string; status: "accepted" | "completed" | "failed" | "cancelled" | "timed_out"; sessionId?: string; sessionKey?: string; taskId?: string; startedAt?: string | number; endedAt?: string | number; output?: { text?: string; messages?: SDKMessage[]; }; usage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number; costUsd?: number; }; artifacts?: ArtifactSummary[]; error?: SDKError;};結果は平凡で安定している必要があります。タイムスタンプ値は Gateway の形状を保持するため、現在のライフサイクルに基づく実行は通常エポックミリ秒の数値を報告しますが、アダプターはまだ ISO 文字列を公開する場合があります。リッチな UI、ツールトレース、ランタイムネイティブの詳細は、イベントと成果物に属します。
accepted は非終端の待機結果です。これは、実行がライフサイクルの終了/エラーを生成する前に Gateway の待機期限が切れたことを意味します。timed_out として扱ってはなりません。timed_out は、実行が自身のランタイムタイムアウトを超過した場合に予約されています。
承認と質問
コーディングエージェントは安全境界を頻繁にまたぐため、承認はファーストクラスでなければなりません。
run.onApproval(async (request) => { if (request.kind === "tool" && request.toolName === "exec") { return request.approveOnce({ reason: "CI command allowed by policy" }); } return request.askUser();});承認イベントは次を含む必要があります。
- 承認 ID
- 実行 ID とセッション ID
- リクエスト種別
- 要求されたアクションの概要
- ツール名または環境アクション
- リスクレベル
- 利用可能な判断
- 有効期限
- 判断を再利用できるかどうか
質問は承認とは別です。質問はユーザーまたはホストアプリに情報を求めます。承認はアクションを実行する許可を求めます。
ToolSpace モデル
アプリは、プラグイン内部をインポートせずにツールサーフェスを理解する必要があります。
const tools = await run.toolSpace(); for (const tool of tools.list()) { console.log(tool.name, tool.source, tool.requiresApproval);}SDK は次を公開する必要があります。
- 正規化されたツールメタデータ
- ソース: OpenClaw、MCP、プラグイン、チャンネル、ランタイム、またはアプリ
- スキーマ概要
- 承認ポリシー
- ランタイム互換性
- ツールが非表示、読み取り専用、書き込み可能、またはホスト対応かどうか
SDK 経由のツール呼び出しは明示的でスコープ付きである必要があります。ほとんどのアプリは任意のツールを直接呼び出すのではなく、エージェントを実行するべきです。
成果物モデル
成果物はファイル以外もカバーする必要があります。
type ArtifactSummary = { id: string; runId?: string; sessionId?: string; type: | "file" | "patch" | "diff" | "log" | "media" | "screenshot" | "trajectory" | "pull_request" | "workspace"; title?: string; mimeType?: string; sizeBytes?: number; createdAt: string; expiresAt?: string;};一般的な例:
- ファイル編集と生成ファイル
- パッチバンドル
- VCS diff
- スクリーンショットとメディア出力
- ログとトレースバンドル
- プルリクエストリンク
- ランタイム軌跡
- 管理対象環境のワークスペーススナップショット
成果物アクセスは、すべての成果物が通常のローカルファイルであると仮定せずに、墨消し、保持、ダウンロード URL をサポートする必要があります。
セキュリティモデル
アプリ SDK は権限について明示的でなければなりません。
推奨されるトークンスコープ:
| スコープ | 許可する内容 |
|---|---|
agent.read |
エージェントの一覧表示と検査。 |
agent.run |
実行の開始。 |
session.read |
セッションメタデータとメッセージの読み取り。 |
session.write |
セッションの作成、送信、フォーク、Compaction、中止。 |
task.read |
バックグラウンドタスク状態の読み取り。 |
task.write |
タスク通知ポリシーのキャンセルまたは変更。 |
approval.respond |
リクエストの承認または拒否。 |
tools.invoke |
公開されたツールの直接呼び出し。 |
artifacts.read |
成果物の一覧表示とダウンロード。 |
environment.write |
管理対象環境の作成または破棄。 |
admin |
管理操作。 |
デフォルト:
- デフォルトではシークレットを転送しない
- 環境変数の無制限のパススルーをしない
- シークレット値ではなくシークレット参照
- 明示的なサンドボックスとネットワークポリシー
- 明示的なリモート環境保持
- ポリシーが別の扱いを証明しない限り、ホスト実行には承認
- 呼び出し元がより強い診断スコープを持たない限り、raw ランタイムイベントは Gateway を離れる前に墨消しされる
管理対象環境プロバイダー
管理対象エージェントは環境プロバイダーとして実装する必要があります。
type EnvironmentProvider = { id: string; capabilities: { checkout?: boolean; sandbox?: boolean; networkPolicy?: boolean; secrets?: boolean; artifacts?: boolean; logs?: boolean; pullRequests?: boolean; longRunning?: boolean; };};最初の実装はホスト型 SaaS である必要はありません。既存の Node ホスト、一時的なワークスペース、CI 形式のランナー、または Testbox 形式の環境を対象にできます。重要な契約は次のとおりです。
- ワークスペースを準備する
- 安全な環境とシークレットをバインドする
- 実行を開始する
- イベントをストリームする
- 成果物を収集する
- ポリシーに従ってクリーンアップまたは保持する
これが安定すれば、ホスト型クラウドサービスは同じプロバイダー契約を実装できます。
パッケージ構造
推奨パッケージ:
| パッケージ | 目的 |
|---|---|
@openclaw/sdk |
公開高レベル SDK と生成済み低レベル Gateway クライアント。 |
@openclaw/sdk-react |
ダッシュボードとアプリビルダー向けのオプション React フック。 |
@openclaw/sdk-testing |
アプリ統合用のテストヘルパーと偽 Gateway サーバー。 |
リポジトリにはすでにプラグイン向けの openclaw/plugin-sdk/* があります。プラグイン作成者とアプリ開発者の混乱を避けるため、その名前空間は分離したままにしてください。
生成クライアント戦略
低レベルクライアントは、バージョン付き Gateway プロトコルスキーマから生成し、その後、手書きの使いやすいクラスでラップする必要があります。
レイヤリング:
- Gateway スキーマの信頼できる唯一の情報源。
- 生成された低レベル TypeScript クライアント。
- 外部入力とイベントペイロード用のランタイムバリデーター。
- 高レベルの
OpenClaw、Agent、Session、Run、Task、Artifactラッパー。 - クックブック例と統合テスト。
利点:
- プロトコルのずれが見える
- テストで生成されたメソッドを Gateway エクスポートと比較できる
- App SDK は Plugin SDK 内部から独立したままになる
- 低レベルの利用者は引き続きプロトコル全体にアクセスできる
- 高レベルの利用者は小さなプロダクト API を利用できる