RPC and API
OpenClaw App-SDK
Das OpenClaw App SDK ist die öffentliche Client-API für Apps außerhalb des
OpenClaw-Prozesses. Verwenden Sie @openclaw/sdk, wenn ein Skript, Dashboard, CI-Job, eine IDE-
Erweiterung oder eine andere externe App eine Verbindung zum Gateway herstellen, Agent-
Läufe starten, Ereignisse streamen, auf Ergebnisse warten, Arbeit abbrechen oder Gateway-
Ressourcen prüfen möchte.
Was heute ausgeliefert wird
@openclaw/sdk wird mit Folgendem ausgeliefert:
| Oberfläche | Status | Funktion |
|---|---|---|
OpenClaw |
Bereit | Haupt-Einstiegspunkt des Clients. Verwaltet Transport, Verbindung, Anfragen und Ereignisse. |
GatewayClientTransport |
Bereit | WebSocket-Transport, der vom Gateway-Client unterstützt wird. |
oc.agents |
Bereit | Listet, erstellt, aktualisiert, löscht und ruft Agent-Handles ab. |
Agent.run() |
Bereit | Startet einen Gateway-agent-Lauf und gibt einen Run zurück. |
oc.runs |
Bereit | Erstellt, ruft ab, wartet auf, bricht ab und streamt Läufe. |
Run.events() |
Bereit | Streamt normalisierte Ereignisse pro Lauf mit Replay für schnelle Läufe. |
Run.wait() |
Bereit | Ruft agent.wait auf und gibt ein stabiles RunResult zurück. |
Run.cancel() |
Bereit | Ruft sessions.abort nach Lauf-ID auf, mit Sitzungsschlüssel, wenn verfügbar. |
oc.sessions |
Bereit | Erstellt, löst auf, sendet an, patcht, kompaktiert und ruft Sitzungs-Handles ab. |
Session.send() |
Bereit | Ruft sessions.send auf und gibt einen Run zurück. |
oc.models |
Bereit | Ruft models.list und den aktuellen models.authStatus-Status-RPC auf. |
oc.tools |
Bereit | Listet, scopt und ruft Gateway-Tools über die Policy-Pipeline auf. |
oc.artifacts |
Bereit | Listet, ruft ab und lädt Gateway-Transkript-Artefakte herunter. |
oc.approvals |
Bereit | Listet und löst Exec-Genehmigungen über Gateway-Genehmigungs-RPCs auf. |
oc.environments |
Teilweise | Listet Gateway-lokale und Node-Umgebungskandidaten; Erstellen/Löschen ist nicht verdrahtet. |
oc.rawEvents() |
Bereit | Stellt rohe Gateway-Ereignisse für fortgeschrittene Consumer bereit. |
normalizeGatewayEvent() |
Bereit | Konvertiert rohe Gateway-Ereignisse in die stabile SDK-Ereignisform. |
Das SDK exportiert außerdem die Kerntypen, die von diesen Oberflächen verwendet werden:
AgentRunParams, RunResult, RunStatus, OpenClawEvent,
OpenClawEventType, GatewayEvent, OpenClawTransport,
GatewayRequestOptions, SessionCreateParams, SessionSendParams,
ArtifactSummary, ArtifactQuery, ArtifactsListResult,
ArtifactsGetResult, ArtifactsDownloadResult, RuntimeSelection,
EnvironmentSelection, WorkspaceSelection, ApprovalMode und zugehörige
Ergebnistypen.
Mit einem Gateway verbinden
Erstellen Sie einen Client mit einer expliziten Gateway-URL, oder injizieren Sie einen benutzerdefinierten Transport für Tests und eingebettete App-Runtimes.
const oc = new OpenClaw({
url: "ws://127.0.0.1:18789",
token: process.env.OPENCLAW_GATEWAY_TOKEN,
requestTimeoutMs: 30_000,
});
await oc.connect();
new OpenClaw({ gateway: "ws://..." }) ist gleichwertig mit url. Die
Option gateway: "auto" wird vom Konstruktor akzeptiert, aber automatische Gateway-
Erkennung ist noch kein eigenes SDK-Feature; übergeben Sie url, wenn die App nicht
bereits weiß, wie sie das Gateway ermitteln soll.
Übergeben Sie für Tests ein Objekt, das OpenClawTransport implementiert:
const oc = new OpenClaw({
transport: {
async request(method, params) {
return { method, params };
},
async *events() {},
},
});
Einen Agent ausführen
Verwenden Sie oc.agents.get(id), wenn die App ein Agent-Handle benötigt, und rufen Sie dann
agent.run() auf.
const agent = await oc.agents.get("main");
const run = await agent.run({
input: "Review this pull request and suggest the smallest safe fix.",
model: "openai/gpt-5.5",
sessionKey: "main",
timeoutMs: 30_000,
});
for await (const event of run.events()) {
const data = event.data as { delta?: unknown };
if (event.type === "assistant.delta" && typeof data.delta === "string") {
process.stdout.write(data.delta);
}
}
const result = await run.wait({ timeoutMs: 120_000 });
console.log(result.status);
Provider-qualifizierte Modellreferenzen wie openai/gpt-5.5 werden in Gateway-
Überschreibungen für provider und model aufgeteilt. timeoutMs bleibt im SDK in Millisekunden
und wird für den agent-RPC in Gateway-Timeout-Sekunden umgewandelt.
run.wait() verwendet den Gateway-agent.wait-RPC. Eine Wartefrist, die abläuft,
während der Lauf noch aktiv ist, gibt status: "accepted" zurück, statt vorzugeben,
dass der Lauf selbst abgelaufen sei. Runtime-Timeouts, abgebrochene Läufe und stornierte Läufe werden
zu timed_out oder cancelled normalisiert.
Sitzungen erstellen und wiederverwenden
Verwenden Sie Sitzungen, wenn die App dauerhaften Transkriptzustand benötigt.
const session = await oc.sessions.create({
agentId: "main",
label: "release-review",
});
const run = await session.send("Prepare release notes from the current diff.");
await run.wait();
Session.send() ruft sessions.send auf und gibt einen Run zurück. Sitzungs-Handles unterstützen außerdem:
await session.abort(run.id);
await session.patch({ label: "renamed-session" });
await session.compact({ maxLines: 200 });
Ereignisse streamen
Das SDK normalisiert rohe Gateway-Ereignisse in einen stabilen OpenClawEvent-Umschlag:
type OpenClawEvent = {
version: 1;
id: string;
ts: number;
type: OpenClawEventType;
runId?: string;
sessionId?: string;
sessionKey?: string;
taskId?: string;
agentId?: string;
data: unknown;
raw?: GatewayEvent;
};
Häufige Ereignistypen sind:
| Ereignistyp | Quell-Gateway-Ereignis |
|---|---|
run.started |
Start des agent-Lebenszyklus |
run.completed |
Ende des agent-Lebenszyklus |
run.failed |
Fehler im agent-Lebenszyklus |
run.cancelled |
Ende eines abgebrochenen/stornierten Lebenszyklus |
run.timed_out |
Ende des Lebenszyklus durch Timeout |
assistant.delta |
Assistant-Streaming-Delta |
assistant.message |
Assistant-Nachricht |
thinking.delta |
Thinking- oder Plan-Stream |
tool.call.started |
Start von Tool/Element/Befehl |
tool.call.delta |
Aktualisierung von Tool/Element/Befehl |
tool.call.completed |
Abschluss von Tool/Element/Befehl |
tool.call.failed |
Fehler oder blockierter Status von Tool/Element/Befehl |
approval.requested |
Exec- oder Plugin-Genehmigungsanfrage |
approval.resolved |
Exec- oder Plugin-Genehmigungsauflösung |
session.created |
sessions.changed-Erstellung |
session.updated |
sessions.changed-Aktualisierung |
session.compacted |
sessions.changed-Compaction |
task.updated |
Aufgabenaktualisierungsereignisse |
artifact.updated |
Patch-Stream-Ereignisse |
raw |
Beliebiges Ereignis ohne stabile SDK-Zuordnung bisher |
Run.events() filtert Ereignisse auf eine Lauf-ID und spielt bereits gesehene Ereignisse für
schnelle Läufe erneut ab. Das bedeutet, dass der dokumentierte Ablauf sicher ist:
const run = await agent.run("Summarize the latest session.");
for await (const event of run.events()) {
if (event.type === "run.completed") {
break;
}
}
Verwenden Sie für appweite Streams oc.events(). Verwenden Sie für rohe Gateway-Frames
oc.rawEvents().
Modelle, Tools, Artefakte und Genehmigungen
Modell-Helfer werden aktuellen Gateway-Methoden zugeordnet:
await oc.models.list();
await oc.models.status({ probe: false }); // calls models.authStatus
Tool-Helfer stellen den Gateway-Katalog, die effektive Tool-Ansicht und den direkten
Gateway-Tool-Aufruf bereit. oc.tools.invoke() gibt einen typisierten Umschlag zurück,
statt bei Policy- oder Genehmigungsverweigerungen eine Ausnahme auszulösen.
await oc.tools.list();
await oc.tools.effective({ sessionKey: "main" });
await oc.tools.invoke("tool-name", {
args: { input: "value" },
sessionKey: "main",
confirm: false,
idempotencyKey: "tool-call-1",
});
Artefakt-Helfer stellen die Gateway-Artefaktprojektion für Sitzungs-, Lauf- oder
Aufgabenkontext bereit. Jeder Aufruf erfordert genau einen expliziten Scope sessionKey, runId oder
taskId:
const { artifacts } = await oc.artifacts.list({ sessionKey: "main" });
const first = artifacts[0];
if (first) {
const { artifact } = await oc.artifacts.get(first.id, { sessionKey: "main" });
const download = await oc.artifacts.download(artifact.id, { sessionKey: "main" });
console.log(download.encoding, download.url);
}
Genehmigungs-Helfer verwenden die Exec-Genehmigungs-RPCs:
const approvals = await oc.approvals.list();
await oc.approvals.respond("approval-id", { decision: "approve" });
Umgebungs-Helfer stellen schreibgeschützte Gateway-lokale und Node-Erkennung bereit:
const { environments } = await oc.environments.list();
await oc.environments.status(environments[0].id);
Heute ausdrücklich nicht unterstützt
Das SDK enthält Namen für das gewünschte Produktmodell, tut aber nicht stillschweigend so, als würden Gateway-RPCs existieren. Diese Aufrufe werfen derzeit explizite Fehler wegen Nichtunterstützung:
await oc.tasks.list();
await oc.tasks.get("task-id");
await oc.tasks.cancel("task-id");
await oc.environments.create({});
await oc.environments.delete("environment-id");
Die Felder workspace, runtime, environment und approvals pro Lauf sind als
zukünftige Form typisiert, aber das aktuelle Gateway unterstützt diese Überschreibungen für den
agent-RPC nicht. Wenn Aufrufer sie übergeben, wirft das SDK vor dem Absenden des Laufs,
damit Arbeit nicht versehentlich mit standardmäßigem Workspace-, Runtime-,
Umgebungs- oder Genehmigungsverhalten ausgeführt wird.
App SDK im Vergleich zum Plugin SDK
Verwenden Sie das App SDK, wenn Code außerhalb von OpenClaw lebt:
- Node-Skripte, die Agent-Läufe starten oder beobachten
- CI-Jobs, die ein Gateway aufrufen
- Dashboards und Admin-Panels
- IDE-Erweiterungen
- externe Bridges, die keine Kanal-Plugins werden müssen
- Integrationstests mit gefälschten oder echten Gateway-Transporten
Verwenden Sie das Plugin SDK, wenn Code innerhalb von OpenClaw läuft:
- Provider-Plugins
- Kanal-Plugins
- Tool- oder Lebenszyklus-Hooks
- Agent-Harness-Plugins
- vertrauenswürdige Runtime-Helfer
App SDK-Code sollte aus @openclaw/sdk importieren. Plugin-Code sollte aus
dokumentierten openclaw/plugin-sdk/*-Unterpfaden importieren. Vermischen Sie die beiden Verträge nicht.