@stainlu/openclaw-managed-agents
v0.2.0
Published
TypeScript SDK for OpenClaw Managed Agents — the open alternative to Claude Managed Agents
Maintainers
Readme
OpenClaw Managed Agents TypeScript SDK
TypeScript/JavaScript client for the OpenClaw Managed Agents API. Zero runtime dependencies — uses native fetch.
Install
npm install @stainlu/openclaw-managed-agentsRequires Node 18.17+ (native fetch). Works in browsers and edge runtimes that provide fetch + ReadableStream.
Usage
import { OpenClawClient } from "@stainlu/openclaw-managed-agents";
// `apiToken` matches the orchestrator's OPENCLAW_API_TOKEN.
// Omit it for a local orchestrator without auth.
const client = new OpenClawClient({
baseUrl: "http://localhost:8080",
apiToken: process.env.OPENCLAW_API_TOKEN,
});
const agent = await client.agents.create({
model: "moonshot/kimi-k2.5",
instructions: "You are a research assistant.",
});
const session = await client.sessions.create({ agentId: agent.agent_id });
await client.sessions.send(session.session_id, { content: "What is 2+2?" });
for await (const event of client.sessions.stream(session.session_id)) {
if (event.type === "agent.message") {
console.log(event.content);
} else if (event.type === "agent.tool_use") {
console.log(`[tool: ${event.tool_name}]`);
}
}Resources
| Resource | Methods |
|---|---|
| client.agents | create, get, list, update, archive, delete, listVersions, warm, run |
| client.environments | create, get, list, delete |
| client.sessions | create, get, list, delete, send, cancel, compact, logs, events, stream, confirmTool |
| client.vaults | create, get, list, delete, addCredential, listCredentials, deleteCredential |
Error handling
Non-2xx responses throw OpenClawError with .status and .body:
import { OpenClawClient, OpenClawError } from "@stainlu/openclaw-managed-agents";
try {
await client.agents.get("agt_missing");
} catch (err) {
if (err instanceof OpenClawError && err.status === 404) {
// agent not found
}
}Streaming
sessions.stream() is an AsyncGenerator<Event>. Cancel early with break:
for await (const event of client.sessions.stream(sessionId)) {
if (event.type === "agent.message") break;
}The server closes the stream after ~30 seconds of idle with no new events.
