RPC and API

SDK แอป OpenClaw

OpenClaw App SDK คือ API ไคลเอนต์สาธารณะสำหรับแอปที่อยู่นอกโปรเซสของ OpenClaw ใช้ @openclaw/sdk เมื่อสคริปต์ แดชบอร์ด งาน CI ส่วนขยาย IDE หรือแอปภายนอกอื่นต้องการเชื่อมต่อกับ Gateway, เริ่มการรันเอเจนต์, สตรีมเหตุการณ์, รอผลลัพธ์, ยกเลิกงาน หรือตรวจสอบทรัพยากรของ Gateway

สิ่งที่จัดส่งในวันนี้

@openclaw/sdk มาพร้อมกับ:

พื้นผิว สถานะ สิ่งที่ทำ
OpenClaw พร้อมใช้งาน จุดเข้าหลักของไคลเอนต์ จัดการ transport, การเชื่อมต่อ, คำขอ และเหตุการณ์
GatewayClientTransport พร้อมใช้งาน WebSocket transport ที่รองรับโดยไคลเอนต์ Gateway
oc.agents พร้อมใช้งาน แสดงรายการ สร้าง อัปเดต ลบ และรับ handles ของเอเจนต์
Agent.run() พร้อมใช้งาน เริ่มการรัน Gateway agent และส่งคืน Run
oc.runs พร้อมใช้งาน สร้าง รับ รอ ยกเลิก และสตรีมการรัน
Run.events() พร้อมใช้งาน สตรีมเหตุการณ์ต่อการรันที่ทำให้เป็นมาตรฐาน พร้อม replay สำหรับการรันที่เร็ว
Run.wait() พร้อมใช้งาน เรียก agent.wait และส่งคืน RunResult ที่เสถียร
Run.cancel() พร้อมใช้งาน เรียก sessions.abort ตาม run id พร้อม session key เมื่อมี
oc.sessions พร้อมใช้งาน สร้าง แปลงค่า ส่งไปยัง patch ทำ compact และรับ handles ของเซสชัน
Session.send() พร้อมใช้งาน เรียก sessions.send และส่งคืน Run
oc.models พร้อมใช้งาน เรียก models.list และ RPC สถานะ models.authStatus ปัจจุบัน
oc.tools พร้อมใช้งาน แสดงรายการ กำหนดขอบเขต และเรียกใช้เครื่องมือ Gateway ผ่าน policy pipeline
oc.artifacts พร้อมใช้งาน แสดงรายการ รับ และดาวน์โหลดอาร์ติแฟกต์ transcript ของ Gateway
oc.approvals พร้อมใช้งาน แสดงรายการและแก้ไข exec approvals ผ่าน RPC approvals ของ Gateway
oc.environments บางส่วน แสดงรายการตัวเลือก environment ของ Gateway-local และ node; ยังไม่ได้ต่อ create/delete
oc.rawEvents() พร้อมใช้งาน เปิดเผยเหตุการณ์ Gateway แบบ raw สำหรับผู้บริโภคขั้นสูง
normalizeGatewayEvent() พร้อมใช้งาน แปลงเหตุการณ์ Gateway แบบ raw ให้เป็นรูปทรงเหตุการณ์ SDK ที่เสถียร

SDK ยัง export ประเภทหลักที่ใช้โดยพื้นผิวเหล่านั้น: AgentRunParams, RunResult, RunStatus, OpenClawEvent, OpenClawEventType, GatewayEvent, OpenClawTransport, GatewayRequestOptions, SessionCreateParams, SessionSendParams, ArtifactSummary, ArtifactQuery, ArtifactsListResult, ArtifactsGetResult, ArtifactsDownloadResult, RuntimeSelection, EnvironmentSelection, WorkspaceSelection, ApprovalMode และประเภทผลลัพธ์ที่เกี่ยวข้อง

เชื่อมต่อกับ Gateway

สร้างไคลเอนต์ด้วย URL ของ Gateway แบบชัดเจน หรือฉีด transport แบบกำหนดเองสำหรับ การทดสอบและ 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://..." }) เทียบเท่ากับ url ตัวเลือก gateway: "auto" ได้รับการยอมรับโดย constructor แต่การค้นพบ Gateway อัตโนมัติยังไม่ใช่ฟีเจอร์ SDK แยกต่างหาก; ให้ส่ง url เมื่อแอปยังไม่รู้วิธี ค้นหา Gateway อยู่แล้ว

สำหรับการทดสอบ ให้ส่ง object ที่ implement OpenClawTransport:

const oc = new OpenClaw({
  transport: {
    async request(method, params) {
      return { method, params };
    },
    async *events() {},
  },
});

รันเอเจนต์

ใช้ oc.agents.get(id) เมื่อแอปต้องการ handle ของเอเจนต์ จากนั้นเรียก agent.run()

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);

refs ของโมเดลที่ระบุ provider เช่น openai/gpt-5.5 จะถูกแยกเป็น overrides ของ Gateway provider และ model timeoutMs ยังคงเป็นมิลลิวินาทีใน SDK และ ถูกแปลงเป็นวินาที timeout ของ Gateway สำหรับ RPC agent

run.wait() ใช้ RPC agent.wait ของ Gateway กำหนดเวลารอที่หมดอายุ ขณะที่การรันยัง active จะส่งคืน status: "accepted" แทนการแสร้งว่า ตัวการรันเองหมดเวลา Runtime timeouts, การรันที่ถูก abort และการรันที่ถูกยกเลิกจะถูก ทำให้เป็นมาตรฐานเป็น timed_out หรือ cancelled

สร้างและนำเซสชันกลับมาใช้ใหม่

ใช้เซสชันเมื่อแอปต้องการสถานะ transcript ที่คงทน

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() เรียก sessions.send และส่งคืน Run handles ของเซสชันยัง รองรับ:

await session.abort(run.id);
await session.patch({ label: "renamed-session" });
await session.compact({ maxLines: 200 });

สตรีมเหตุการณ์

SDK ทำให้เหตุการณ์ Gateway แบบ raw อยู่ใน envelope OpenClawEvent ที่เสถียร:

type OpenClawEvent = {
  version: 1;
  id: string;
  ts: number;
  type: OpenClawEventType;
  runId?: string;
  sessionId?: string;
  sessionKey?: string;
  taskId?: string;
  agentId?: string;
  data: unknown;
  raw?: GatewayEvent;
};

ประเภทเหตุการณ์ทั่วไปประกอบด้วย:

ประเภทเหตุการณ์ เหตุการณ์ Gateway ต้นทาง
run.started การเริ่ม lifecycle ของ agent
run.completed การสิ้นสุด lifecycle ของ agent
run.failed ข้อผิดพลาด lifecycle ของ agent
run.cancelled การสิ้นสุด lifecycle ที่ถูก abort/ยกเลิก
run.timed_out การสิ้นสุด lifecycle เพราะ timeout
assistant.delta Delta การสตรีมของ Assistant
assistant.message ข้อความของ Assistant
thinking.delta สตรีมความคิดหรือแผน
tool.call.started การเริ่มเครื่องมือ/item/command
tool.call.delta การอัปเดตเครื่องมือ/item/command
tool.call.completed การเสร็จสิ้นเครื่องมือ/item/command
tool.call.failed ความล้มเหลวหรือสถานะถูกบล็อกของเครื่องมือ/item/command
approval.requested คำขออนุมัติ exec หรือ plugin
approval.resolved ผลการอนุมัติ exec หรือ plugin
session.created การสร้าง sessions.changed
session.updated การอัปเดต sessions.changed
session.compacted Compaction ของ sessions.changed
task.updated เหตุการณ์อัปเดตงาน
artifact.updated เหตุการณ์สตรีม patch
raw เหตุการณ์ใด ๆ ที่ยังไม่มี mapping SDK ที่เสถียร

Run.events() กรองเหตุการณ์ให้เหลือ run id เดียว และ replay เหตุการณ์ที่เห็นแล้วสำหรับ การรันที่เร็ว นั่นหมายความว่า flow ที่บันทึกไว้ปลอดภัย:

const run = await agent.run("Summarize the latest session.");

for await (const event of run.events()) {
  if (event.type === "run.completed") {
    break;
  }
}

สำหรับสตรีมทั้งแอป ให้ใช้ oc.events() สำหรับเฟรม Gateway แบบ raw ให้ใช้ oc.rawEvents()

โมเดล เครื่องมือ อาร์ติแฟกต์ และ approvals

ตัวช่วยโมเดล map ไปยังเมธอด Gateway ปัจจุบัน:

await oc.models.list();
await oc.models.status({ probe: false }); // calls models.authStatus

ตัวช่วยเครื่องมือเปิดเผย catalog ของ Gateway, effective tool view และการเรียกใช้ เครื่องมือ Gateway โดยตรง oc.tools.invoke() ส่งคืน envelope แบบ typed แทน การ throw สำหรับการปฏิเสธจาก policy หรือ approval

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",
});

ตัวช่วยอาร์ติแฟกต์เปิดเผย projection อาร์ติแฟกต์ของ Gateway สำหรับบริบท session, run หรือ task แต่ละ call ต้องมีขอบเขต sessionKey, runId หรือ 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);
}

ตัวช่วย approval ใช้ RPC exec approval:

const approvals = await oc.approvals.list();
await oc.approvals.respond("approval-id", { decision: "approve" });

ตัวช่วย environment เปิดเผยการค้นหา Gateway-local และ node แบบอ่านอย่างเดียว:

const { environments } = await oc.environments.list();
await oc.environments.status(environments[0].id);

สิ่งที่ยังไม่รองรับอย่างชัดเจนในวันนี้

SDK มีชื่อสำหรับโมเดลผลิตภัณฑ์ที่เราต้องการ แต่จะไม่แสร้งอย่างเงียบ ๆ ว่า Gateway RPCs มีอยู่ call เหล่านี้ปัจจุบัน throw ข้อผิดพลาด unsupported อย่างชัดเจน:

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");

ฟิลด์ต่อการรัน workspace, runtime, environment และ approvals ถูก typed เป็นรูปทรงในอนาคต แต่ Gateway ปัจจุบันยังไม่รองรับ overrides เหล่านั้นบน RPC agent หากผู้เรียกส่งค่าเหล่านั้น SDK จะ throw ก่อนส่งการรัน เพื่อไม่ให้งานถูก execute โดยไม่ได้ตั้งใจด้วย workspace, runtime, environment หรือพฤติกรรม approval ตามค่าเริ่มต้น

App SDK เทียบกับ Plugin SDK

ใช้ App SDK เมื่อโค้ดอยู่นอก OpenClaw:

  • สคริปต์ Node ที่เริ่มหรือสังเกตการรันของเอเจนต์
  • งาน CI ที่เรียก Gateway
  • แดชบอร์ดและแผงผู้ดูแลระบบ
  • ส่วนขยาย IDE
  • บริดจ์ภายนอกที่ไม่จำเป็นต้องกลายเป็น channel plugins
  • การทดสอบ integration ด้วย Gateway transports ปลอมหรือจริง

ใช้ Plugin SDK เมื่อโค้ดรันภายใน OpenClaw:

  • provider plugins
  • channel plugins
  • hooks ของเครื่องมือหรือ lifecycle
  • agent harness plugins
  • trusted runtime helpers

โค้ด App SDK ควร import จาก @openclaw/sdk โค้ด Plugin ควร import จาก subpaths openclaw/plugin-sdk/* ที่บันทึกไว้ อย่าผสมสัญญาทั้งสองเข้าด้วยกัน

ที่เกี่ยวข้อง