Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

OpenClaw ได้ย้ายจากเลเยอร์ความเข้ากันได้ย้อนหลังแบบกว้าง ไปสู่สถาปัตยกรรม Plugin สมัยใหม่ที่มี import แบบเจาะจงและมีเอกสารกำกับ หาก Plugin ของคุณสร้างขึ้นก่อน สถาปัตยกรรมใหม่ คู่มือนี้จะช่วยให้คุณย้ายระบบได้

สิ่งที่กำลังเปลี่ยนแปลง

ระบบ Plugin แบบเก่าให้พื้นผิวแบบเปิดกว้างสองส่วน ซึ่งทำให้ Plugin สามารถ import ทุกสิ่งที่ต้องใช้จากจุดเข้าเดียวได้:
  • openclaw/plugin-sdk/compat - import เดียวที่ re-export ตัวช่วยหลายสิบรายการ ถูกเพิ่มเข้ามาเพื่อให้ Plugin รุ่นเก่าที่อิง hook ยังทำงานได้ระหว่างที่ สถาปัตยกรรม Plugin ใหม่กำลังถูกสร้าง
  • openclaw/plugin-sdk/infra-runtime - barrel ตัวช่วย runtime แบบกว้างที่ รวม event ของระบบ, สถานะ Heartbeat, คิวการส่งมอบ, ตัวช่วย fetch/proxy, ตัวช่วยไฟล์, ประเภทการอนุมัติ และยูทิลิตีที่ไม่เกี่ยวข้องไว้ด้วยกัน
  • openclaw/plugin-sdk/config-runtime - barrel ความเข้ากันได้ของ config แบบกว้าง ที่ยังคงมีตัวช่วย load/write โดยตรงที่เลิกใช้แล้วระหว่างช่วง migration
  • openclaw/extension-api - bridge ที่ให้ Plugin เข้าถึงตัวช่วยฝั่ง host ได้โดยตรง เช่น embedded agent runner
  • api.registerEmbeddedExtensionFactory(...) - hook ของ bundled extension เฉพาะ Pi ที่ถูกนำออกแล้ว ซึ่งเคยสังเกต event ของ embedded-runner เช่น tool_result ได้
พื้นผิว import แบบกว้างเหล่านี้ตอนนี้ เลิกใช้แล้ว ยังทำงานได้ที่ runtime แต่ Plugin ใหม่ต้องไม่ใช้ และ Plugin ที่มีอยู่ควรย้ายออกก่อน release major ถัดไปจะนำออก API สำหรับลงทะเบียน embedded extension factory เฉพาะ Pi ถูกนำออกแล้ว; ให้ใช้ tool-result middleware แทน OpenClaw จะไม่ลบหรือตีความพฤติกรรม Plugin ที่มีเอกสารกำกับใหม่ใน change เดียวกับ ที่เพิ่มสิ่งทดแทน การเปลี่ยนแปลง contract ที่ทำให้ใช้งานร่วมกันไม่ได้ต้องผ่าน compatibility adapter, diagnostics, เอกสาร และช่วง deprecation ก่อน หลักการนี้ใช้กับ SDK imports, manifest fields, setup APIs, hooks และพฤติกรรม การลงทะเบียน runtime
เลเยอร์ความเข้ากันได้ย้อนหลังจะถูกนำออกใน release major ในอนาคต Plugin ที่ยังคง import จากพื้นผิวเหล่านี้จะพังเมื่อถึงเวลานั้น การลงทะเบียน embedded extension factory เฉพาะ Pi ไม่ถูกโหลดอีกต่อไปแล้ว

เหตุผลที่เปลี่ยนแปลง

แนวทางเดิมทำให้เกิดปัญหา:
  • เริ่มต้นช้า - การ import ตัวช่วยเดียวโหลดโมดูลที่ไม่เกี่ยวข้องหลายสิบรายการ
  • dependency แบบวงกลม - re-export แบบกว้างทำให้สร้าง import cycle ได้ง่าย
  • พื้นผิว API ไม่ชัดเจน - ไม่มีวิธีบอกว่า export ใดเสถียรและ export ใดเป็น internal
Plugin SDK สมัยใหม่แก้ปัญหานี้: แต่ละ import path (openclaw/plugin-sdk/\<subpath\>) เป็นโมดูลขนาดเล็กที่แยกตัวเอง มีวัตถุประสงค์ชัดเจนและมี contract ที่ documented seam อำนวยความสะดวกของ provider รุ่นเก่าสำหรับ bundled channels ก็ถูกนำออกแล้วเช่นกัน seam ตัวช่วยที่ผูกกับแบรนด์ channel เป็นทางลัดส่วนตัวของ mono-repo ไม่ใช่ contract ของ Plugin ที่เสถียร ให้ใช้ SDK subpath แบบ generic และแคบแทน ภายใน workspace ของ bundled Plugin ให้เก็บตัวช่วยที่ provider เป็นเจ้าของไว้ใน api.ts หรือ runtime-api.ts ของ Plugin นั้นเอง ตัวอย่าง bundled provider ปัจจุบัน:
  • Anthropic เก็บตัวช่วย stream เฉพาะ Claude ไว้ใน seam api.ts / contract-api.ts ของตัวเอง
  • OpenAI เก็บ provider builders, ตัวช่วย default-model และ realtime provider builders ไว้ใน api.ts ของตัวเอง
  • OpenRouter เก็บ provider builder และตัวช่วย onboarding/config ไว้ใน api.ts ของตัวเอง

แผน migration สำหรับ Talk และเสียงเรียลไทม์

โค้ด Talk สำหรับเสียงเรียลไทม์, โทรศัพท์, การประชุม และเบราว์เซอร์ กำลังย้ายจาก การทำ turn bookkeeping เฉพาะ surface ไปสู่ Talk session controller แบบใช้ร่วมกัน ที่ export โดย openclaw/plugin-sdk/realtime-voice controller ใหม่เป็นเจ้าของ ซอง event ของ Talk ร่วมกัน, สถานะ active turn, สถานะ capture, สถานะ output-audio, ประวัติ event ล่าสุด และการปฏิเสธ stale-turn Plugin ของ provider ควรยังคงเป็น เจ้าของ session เรียลไทม์เฉพาะ vendor; Plugin ของ surface ควรยังคงเป็นเจ้าของ รายละเอียดเฉพาะของ capture, playback, โทรศัพท์ และการประชุม migration ของ Talk นี้ตั้งใจให้เป็นการเปลี่ยนแบบ breaking-clean:
  1. เก็บ controller/runtime primitives ที่ใช้ร่วมกันไว้ใน plugin-sdk/realtime-voice
  2. ย้าย bundled surfaces ไปใช้ controller ที่ใช้ร่วมกัน: browser relay, managed-room handoff, voice-call realtime, voice-call streaming STT, Google Meet realtime และ native push-to-talk
  3. แทนที่ตระกูล Talk RPC เก่าด้วย API สุดท้าย talk.session.* และ talk.client.*
  4. ประกาศ live Talk event channel หนึ่งรายการใน Gateway hello-ok.features.events: talk.event
  5. ลบ endpoint HTTP เรียลไทม์เก่า และ path override instruction ขณะ request ทั้งหมด
โค้ดใหม่ไม่ควรเรียก createTalkEventSequencer(...) โดยตรง เว้นแต่กำลัง implement adapter ระดับต่ำหรือ test fixture ให้ใช้ controller ที่ใช้ร่วมกันแทน เพื่อให้ event ที่อยู่ใน scope ของ turn ไม่สามารถถูก emit โดยไม่มี turn id, การเรียก turnEnd / turnCancel ที่ stale ไม่สามารถล้าง active turn ที่ใหม่กว่า และ event lifecycle ของ output-audio สอดคล้องกันในโทรศัพท์, การประชุม, browser relay, managed-room handoff และ native Talk clients รูปทรง API สาธารณะเป้าหมายคือ:
// Gateway-owned Talk session API.
await gateway.request("talk.session.create", {
  mode: "realtime",
  transport: "gateway-relay",
  brain: "agent-consult",
  sessionKey: "main",
});
await gateway.request("talk.session.appendAudio", { sessionId, audioBase64 });
await gateway.request("talk.session.cancelOutput", { sessionId, reason: "barge-in" });
await gateway.request("talk.session.submitToolResult", {
  sessionId,
  callId,
  result: { status: "working" },
  options: { willContinue: true },
});
await gateway.request("talk.session.submitToolResult", {
  sessionId,
  callId,
  result: { status: "already_delivered" },
  options: { suppressResponse: true },
});
await gateway.request("talk.session.submitToolResult", { sessionId, callId, result });
await gateway.request("talk.session.close", { sessionId });

// Client-owned provider session API.
await gateway.request("talk.client.create", {
  mode: "realtime",
  transport: "webrtc",
  brain: "agent-consult",
  sessionKey: "main",
});
await gateway.request("talk.client.toolCall", { sessionKey, callId, name, args });
session ของ WebRTC/provider-websocket ที่เบราว์เซอร์เป็นเจ้าของใช้ talk.client.create เพราะเบราว์เซอร์เป็นเจ้าของการ negotiate กับ provider และ media transport ขณะที่ Gateway เป็นเจ้าของ credentials, instructions และ tool policy talk.session.* เป็น surface ร่วมที่ Gateway จัดการสำหรับ gateway-relay realtime, gateway-relay transcription และ session STT/TTS แบบ native ของ managed-room config รุ่นเก่าที่วาง realtime selectors ไว้ข้าง talk.provider / talk.providers ควรถูกซ่อมด้วย openclaw doctor --fix; runtime Talk จะไม่ตีความ config provider ของ speech/TTS เป็น config provider ของ realtime ชุดค่าที่รองรับสำหรับ talk.session.create ถูกตั้งใจให้มีขนาดเล็ก:
ModeTransportBrainOwnerNotes
realtimegateway-relayagent-consultGatewayเสียง provider แบบ full-duplex ที่ bridge ผ่าน Gateway; tool calls ถูก route ผ่าน tool agent-consult
transcriptiongateway-relaynoneGatewayเฉพาะ streaming STT; caller ส่ง input audio และรับ transcript events
stt-ttsmanaged-roomagent-consultNative/client roomห้องสไตล์ push-to-talk และ walkie-talkie ที่ client เป็นเจ้าของ capture/playback และ Gateway เป็นเจ้าของสถานะ turn
stt-ttsmanaged-roomdirect-toolsNative/client roomโหมดห้องสำหรับ admin เท่านั้น สำหรับ first-party surfaces ที่ trusted ซึ่ง execute Gateway tool actions โดยตรง
แผนที่ method ที่ถูกนำออก:
OldNew
talk.realtime.sessiontalk.client.create
talk.realtime.toolCalltalk.client.toolCall
talk.realtime.relayAudiotalk.session.appendAudio
talk.realtime.relayCanceltalk.session.cancelOutput or talk.session.cancelTurn
talk.realtime.relayToolResulttalk.session.submitToolResult
talk.realtime.relayStoptalk.session.close
talk.transcription.sessiontalk.session.create({ mode: "transcription" })
talk.transcription.relayAudiotalk.session.appendAudio
talk.transcription.relayCanceltalk.session.cancelTurn
talk.transcription.relayStoptalk.session.close
talk.handoff.createtalk.session.create({ transport: "managed-room" })
talk.handoff.jointalk.session.join
talk.handoff.revoketalk.session.close
ชุดคำศัพท์ควบคุมแบบรวมยังตั้งใจให้แคบเช่นกัน:
MethodApplies toContract
talk.session.appendAudiorealtime/gateway-relay, transcription/gateway-relayappend ชิ้นเสียง PCM แบบ base64 ไปยัง session provider ที่เป็นเจ้าของโดยการเชื่อมต่อ Gateway เดียวกัน
talk.session.startTurnstt-tts/managed-roomเริ่ม turn ของผู้ใช้ใน managed-room
talk.session.endTurnstt-tts/managed-roomสิ้นสุด active turn หลังจากตรวจสอบ stale-turn
talk.session.cancelTurnall Gateway-owned sessionsยกเลิกงาน active capture/provider/agent/TTS สำหรับ turn หนึ่ง
talk.session.cancelOutputrealtime/gateway-relayหยุด output เสียงของ assistant โดยไม่จำเป็นต้องสิ้นสุด turn ของผู้ใช้
talk.session.submitToolResultrealtime/gateway-relayทำ provider tool call ที่ relay emit ให้เสร็จสมบูรณ์; ส่ง options.willContinue สำหรับ output ชั่วคราว หรือ options.suppressResponse เพื่อตอบสนอง call โดยไม่มี response จาก assistant อีกครั้ง
talk.session.closeall unified sessionsหยุด relay sessions หรือ revoke สถานะ managed-room จากนั้นลืม unified session id
อย่าเพิ่มกรณีพิเศษของ provider หรือแพลตฟอร์มใน core เพื่อทำให้สิ่งนี้ทำงานได้ core เป็นเจ้าของความหมายของเซสชัน Talk ส่วน provider plugins เป็นเจ้าของการตั้งค่าเซสชันของ vendor Voice-call และ Google Meet เป็นเจ้าของอะแดปเตอร์โทรศัพท์/การประชุม Browser และ native apps เป็นเจ้าของ UX การจับภาพ/เล่นกลับของอุปกรณ์

นโยบายความเข้ากันได้

สำหรับ Plugin ภายนอก งานด้านความเข้ากันได้ให้ทำตามลำดับนี้:
  1. เพิ่มสัญญาใหม่
  2. คงพฤติกรรมเดิมไว้โดยเชื่อมผ่านอะแดปเตอร์ความเข้ากันได้
  3. ส่ง diagnostic หรือคำเตือนที่ระบุชื่อพาธเดิมและสิ่งที่ใช้แทน
  4. ครอบคลุมทั้งสองพาธในเทสต์
  5. จัดทำเอกสารการเลิกใช้และพาธการย้าย
  6. ลบออกหลังจากหน้าต่างการย้ายที่ประกาศไว้เท่านั้น โดยปกติใน major release
maintainers สามารถตรวจสอบคิวการย้ายปัจจุบันได้ด้วย pnpm plugins:boundary-report ใช้ pnpm plugins:boundary-report:summary สำหรับ จำนวนแบบกะทัดรัด, --owner <id> สำหรับ Plugin เดียวหรือเจ้าของความเข้ากันได้ และ pnpm plugins:boundary-report:ci เมื่อ CI gate ควรล้มเหลวจากระเบียน ความเข้ากันได้ที่ครบกำหนด, การ import SDK ที่สงวนไว้ข้ามเจ้าของ หรือ SDK subpaths ที่สงวนไว้แต่ไม่ได้ใช้ รายงานจะจัดกลุ่มระเบียนความเข้ากันได้ที่เลิกใช้แล้ว ตามวันที่ลบ, นับการอ้างอิงในโค้ด/เอกสารภายในเครื่อง, แสดงการ import SDK ที่สงวนไว้ข้ามเจ้าของ และสรุป bridge SDK ของ private memory-host เพื่อให้การล้างความเข้ากันได้ชัดเจน แทนที่จะพึ่งพาการค้นหาเฉพาะกิจ SDK subpaths ที่สงวนไว้ต้องมีการใช้งานของเจ้าของที่ติดตามไว้ ควรลบ helper exports ที่สงวนไว้แต่ไม่ได้ใช้ออกจาก SDK สาธารณะ หาก manifest field ยังยอมรับอยู่ ผู้เขียน Plugin สามารถใช้ต่อไปได้จนกว่า เอกสารและ diagnostic จะระบุเป็นอย่างอื่น โค้ดใหม่ควรใช้สิ่งที่เอกสารระบุให้ใช้แทน แต่ Plugin ที่มีอยู่ไม่ควรแตกใน minor releases ตามปกติ

วิธีการย้าย

1

ย้าย helpers สำหรับโหลด/เขียน runtime config

bundled plugins ควรหยุดเรียก api.runtime.config.loadConfig() และ api.runtime.config.writeConfigFile(...) โดยตรง ให้ใช้ config ที่ถูกส่งเข้า active call path อยู่แล้วเป็นหลัก handlers ที่มีอายุยาวซึ่งต้องการ snapshot ของ process ปัจจุบันสามารถใช้ api.runtime.config.current() ได้ tools ของ agent ที่มีอายุยาวควรใช้ ctx.getRuntimeConfig() ของ tool context ภายใน execute เพื่อให้ tool ที่ถูกสร้างก่อนการเขียน config ยังคงเห็น runtime config ที่ refresh แล้วการเขียน config ต้องผ่าน transactional helpers และเลือกนโยบาย หลังเขียน:
await api.runtime.config.mutateConfigFile({
  afterWrite: { mode: "auto" },
  mutate(draft) {
    draft.plugins ??= {};
  },
});
ใช้ afterWrite: { mode: "restart", reason: "..." } เมื่อ caller รู้ว่า การเปลี่ยนแปลงต้องการ gateway restart ที่สะอาด และใช้ afterWrite: { mode: "none", reason: "..." } เฉพาะเมื่อ caller เป็นเจ้าของ งานติดตามผลและตั้งใจต้องการปิด reload planner ผลลัพธ์การ mutate จะมีสรุป followUp ที่มีชนิดข้อมูลสำหรับเทสต์และการ logging; gateway ยังคงรับผิดชอบในการนำ restart ไปใช้หรือจัดตาราง loadConfig และ writeConfigFile ยังคงเป็น helpers ความเข้ากันได้ที่เลิกใช้แล้ว สำหรับ Plugin ภายนอกระหว่างหน้าต่างการย้าย และเตือนหนึ่งครั้งด้วย compatibility code runtime-config-load-write bundled plugins และ runtime code ใน repo ได้รับการปกป้องด้วย scanner guardrails ใน pnpm check:deprecated-api-usage และ pnpm check:no-runtime-action-load-config: การใช้งานใหม่ใน production plugin จะล้มเหลวทันที, การเขียน config โดยตรงจะล้มเหลว, methods ของ gateway server ต้องใช้ request runtime snapshot, runtime channel send/action/client helpers ต้องรับ config จาก boundary ของตน และ runtime modules ที่มีอายุยาว อนุญาตให้มีการเรียก loadConfig() แบบ ambient ได้เป็นศูนย์ครั้งโค้ด Plugin ใหม่ควรหลีกเลี่ยงการ import compatibility barrel แบบกว้าง openclaw/plugin-sdk/config-runtime ด้วย ใช้ SDK subpath แบบแคบที่ตรงกับงาน:
ความต้องการImport
ชนิดของ config เช่น OpenClawConfigopenclaw/plugin-sdk/config-contracts
assertion ของ config ที่โหลดแล้วและการค้นหา plugin-entry configopenclaw/plugin-sdk/plugin-config-runtime
การอ่าน snapshot ของ runtime ปัจจุบันopenclaw/plugin-sdk/runtime-config-snapshot
การเขียน configopenclaw/plugin-sdk/config-mutation
session store helpersopenclaw/plugin-sdk/session-store-runtime
config ตาราง Markdownopenclaw/plugin-sdk/markdown-table-runtime
group policy runtime helpersopenclaw/plugin-sdk/runtime-group-policy
การ resolve secret inputopenclaw/plugin-sdk/secret-input-runtime
model/session overridesopenclaw/plugin-sdk/model-session-runtime
bundled plugins และเทสต์ของพวกมันมี scanner ป้องกันการใช้ barrel แบบกว้าง เพื่อให้ imports และ mocks อยู่เฉพาะในพฤติกรรมที่ต้องใช้เท่านั้น barrel แบบกว้าง ยังคงมีอยู่เพื่อความเข้ากันได้ภายนอก แต่โค้ดใหม่ไม่ควร พึ่งพามัน
2

ย้ายส่วนขยาย tool-result ของ Pi ไปยัง middleware

bundled plugins ต้องแทนที่ tool-result handlers เฉพาะ Pi api.registerEmbeddedExtensionFactory(...) ด้วย middleware ที่เป็นกลางต่อ runtime
// Pi and Codex runtime dynamic tools
api.registerAgentToolResultMiddleware(async (event) => {
  return compactToolResult(event);
}, {
  runtimes: ["pi", "codex"],
});
อัปเดต manifest ของ Plugin ในเวลาเดียวกัน:
{
  "contracts": {
    "agentToolResultMiddleware": ["pi", "codex"]
  }
}
Plugin ภายนอกไม่สามารถลงทะเบียน tool-result middleware ได้เพราะมันสามารถ เขียน output ของ tool ที่มีความน่าเชื่อถือสูงใหม่ก่อนที่ model จะเห็น
3

ย้าย approval-native handlers ไปยัง capability facts

channel plugins ที่รองรับ approval ตอนนี้เปิดเผยพฤติกรรม approval แบบ native ผ่าน approvalCapability.nativeRuntime พร้อมกับ runtime-context registry ที่ใช้ร่วมกันการเปลี่ยนแปลงสำคัญ:
  • แทนที่ approvalCapability.handler.loadRuntime(...) ด้วย approvalCapability.nativeRuntime
  • ย้าย auth/delivery เฉพาะ approval ออกจาก wiring เดิม plugin.auth / plugin.approvals และไปไว้ที่ approvalCapability
  • ChannelPlugin.approvals ถูกลบออกจากสัญญา channel-plugin สาธารณะแล้ว; ย้าย delivery/native/render fields ไปไว้ที่ approvalCapability
  • plugin.auth ยังคงใช้สำหรับ flows การ login/logout ของ channel เท่านั้น; hooks ของ approval auth ที่นั่นจะไม่ถูก core อ่านอีกต่อไป
  • ลงทะเบียน runtime objects ที่ channel เป็นเจ้าของ เช่น clients, tokens หรือ Bolt apps ผ่าน openclaw/plugin-sdk/channel-runtime-context
  • อย่าส่ง notices การ reroute ที่ Plugin เป็นเจ้าของจาก native approval handlers; ตอนนี้ core เป็นเจ้าของ notices แบบ routed-elsewhere จากผลลัพธ์ delivery จริง
  • เมื่อส่ง channelRuntime เข้า createChannelManager(...) ให้ระบุ surface createPluginRuntime().channel จริง Partial stubs จะถูกปฏิเสธ
ดู /plugins/sdk-channel-plugins สำหรับ layout approval capability ปัจจุบัน
4

ตรวจสอบพฤติกรรม fallback ของ Windows wrapper

หาก Plugin ของคุณใช้ openclaw/plugin-sdk/windows-spawn wrappers ของ Windows .cmd/.bat ที่ resolve ไม่ได้จะ fail closed แล้ว เว้นแต่คุณจะส่ง allowShellFallback: true อย่างชัดเจน
// Before
const program = applyWindowsSpawnProgramPolicy({ candidate });

// After
const program = applyWindowsSpawnProgramPolicy({
  candidate,
  // Only set this for trusted compatibility callers that intentionally
  // accept shell-mediated fallback.
  allowShellFallback: true,
});
หาก caller ของคุณไม่ได้ตั้งใจพึ่งพา shell fallback อย่าตั้งค่า allowShellFallback และให้จัดการ error ที่ถูก throw แทน
5

ค้นหา imports ที่เลิกใช้แล้ว

ค้นหา Plugin ของคุณสำหรับ imports จาก surface ที่เลิกใช้แล้วรายการใดรายการหนึ่ง:
grep -r "plugin-sdk/compat" my-plugin/
grep -r "plugin-sdk/infra-runtime" my-plugin/
grep -r "plugin-sdk/config-runtime" my-plugin/
grep -r "openclaw/extension-api" my-plugin/
6

แทนที่ด้วย imports ที่เจาะจง

แต่ละ export จาก surface เดิมจะ map ไปยัง import path สมัยใหม่ที่เฉพาะเจาะจง:
// Before (deprecated backwards-compatibility layer)
import {
  createChannelReplyPipeline,
  createPluginRuntimeStore,
  resolveControlCommandGate,
} from "openclaw/plugin-sdk/compat";

// After (modern focused imports)
import { createChannelReplyPipeline } from "openclaw/plugin-sdk/channel-reply-pipeline";
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import { resolveControlCommandGate } from "openclaw/plugin-sdk/command-auth";
สำหรับ helpers ฝั่ง host ให้ใช้ plugin runtime ที่ inject เข้ามาแทนการ import โดยตรง:
// Before (deprecated extension-api bridge)
import { runEmbeddedPiAgent } from "openclaw/extension-api";
const result = await runEmbeddedPiAgent({ sessionId, prompt });

// After (injected runtime)
const result = await api.runtime.agent.runEmbeddedPiAgent({ sessionId, prompt });
รูปแบบเดียวกันใช้กับ legacy bridge helpers อื่นด้วย:
import เดิมสิ่งที่เทียบเท่าสมัยใหม่
resolveAgentDirapi.runtime.agent.resolveAgentDir
resolveAgentWorkspaceDirapi.runtime.agent.resolveAgentWorkspaceDir
resolveAgentIdentityapi.runtime.agent.resolveAgentIdentity
resolveThinkingDefaultapi.runtime.agent.resolveThinkingDefault
resolveAgentTimeoutMsapi.runtime.agent.resolveAgentTimeoutMs
ensureAgentWorkspaceapi.runtime.agent.ensureAgentWorkspace
session store helpersapi.runtime.agent.session.*
7

แทนที่ infra-runtime imports แบบกว้าง

openclaw/plugin-sdk/infra-runtime ยังคงมีอยู่เพื่อความเข้ากันได้ภายนอก แต่โค้ดใหม่ควร import surface helper ที่เจาะจงตามที่จำเป็นจริง:
ความต้องการImport
system event queue helpersopenclaw/plugin-sdk/system-event-runtime
Heartbeat wake, event และ visibility helpersopenclaw/plugin-sdk/heartbeat-runtime
การ drain pending delivery queueopenclaw/plugin-sdk/delivery-queue-runtime
telemetry ของ channel activityopenclaw/plugin-sdk/channel-activity-runtime
dedupe caches ในหน่วยความจำopenclaw/plugin-sdk/dedupe-runtime
helpers สำหรับพาธ local-file/media ที่ปลอดภัยopenclaw/plugin-sdk/file-access-runtime
fetch ที่รู้จัก dispatcheropenclaw/plugin-sdk/runtime-fetch
proxy และ guarded fetch helpersopenclaw/plugin-sdk/fetch-runtime
ชนิดนโยบาย SSRF dispatcheropenclaw/plugin-sdk/ssrf-dispatcher
ชนิด approval request/resolutionopenclaw/plugin-sdk/approval-runtime
approval reply payload และ command helpersopenclaw/plugin-sdk/approval-reply-runtime
error formatting helpersopenclaw/plugin-sdk/error-runtime
การรอ transport readinessopenclaw/plugin-sdk/transport-ready-runtime
secure token helpersopenclaw/plugin-sdk/secure-random-runtime
bounded async task concurrencyopenclaw/plugin-sdk/concurrency-runtime
numeric coercionopenclaw/plugin-sdk/number-runtime
process-local async lockopenclaw/plugin-sdk/async-lock-runtime
file locksopenclaw/plugin-sdk/file-lock
bundled plugins มี scanner ป้องกัน infra-runtime ดังนั้นโค้ดใน repo จึงไม่สามารถถอยกลับไปใช้ barrel แบบกว้างได้
8

ย้าย channel route helpers

โค้ด channel route ใหม่ควรใช้ openclaw/plugin-sdk/channel-route ชื่อ route-key และ comparable-target แบบเก่ายังคงอยู่เป็น aliases เพื่อความเข้ากันได้ระหว่างหน้าต่างการย้าย แต่ Plugin ใหม่ควรใช้ชื่อ route ที่อธิบายพฤติกรรมโดยตรง:
ตัวช่วยเก่าตัวช่วยสมัยใหม่
channelRouteIdentityKey(...)channelRouteDedupeKey(...)
channelRouteKey(...)channelRouteCompactKey(...)
ComparableChannelTargetChannelRouteParsedTarget
resolveComparableTargetForChannel(...)resolveRouteTargetForChannel(...)
resolveComparableTargetForLoadedChannel(...)resolveRouteTargetForLoadedChannel(...)
comparableChannelTargetsMatch(...)channelRouteTargetsMatchExact(...)
comparableChannelTargetsShareRoute(...)channelRouteTargetsShareConversation(...)
ตัวช่วย route สมัยใหม่จะ normalize { channel, to, accountId, threadId } อย่างสอดคล้องกันใน native approvals, reply suppression, inbound dedupe, การส่ง Cron และ session routing หาก Plugin ของคุณเป็นเจ้าของไวยากรณ์ target แบบกำหนดเอง ให้ใช้ resolveChannelRouteTargetWithParser(...) เพื่อปรับ parser นั้นให้เข้ากับสัญญา route target เดียวกัน
9

สร้างและทดสอบ

pnpm build
pnpm test -- my-plugin/

ข้อมูลอ้างอิงเส้นทาง import

พาธการนำเข้าวัตถุประสงค์รายการส่งออกสำคัญ
plugin-sdk/plugin-entryตัวช่วยรายการเข้า Plugin ตามมาตรฐานdefinePluginEntry
plugin-sdk/coreการส่งออกซ้ำแบบครอบคลุมรุ่นเก่าสำหรับนิยาม/ตัวสร้างรายการเข้าของช่องทางdefineChannelPluginEntry, createChatChannelPlugin
plugin-sdk/config-schemaการส่งออกสคีมาการกำหนดค่าระดับรากOpenClawSchema
plugin-sdk/provider-entryตัวช่วยรายการเข้าสำหรับผู้ให้บริการรายเดียวdefineSingleProviderPluginEntry
plugin-sdk/channel-coreนิยามและตัวสร้างรายการเข้าของช่องทางแบบเจาะจงdefineChannelPluginEntry, defineSetupPluginEntry, createChatChannelPlugin, createChannelPluginBase
plugin-sdk/setupตัวช่วยวิซาร์ดการตั้งค่าที่ใช้ร่วมกันพรอมป์ allowlist, ตัวสร้างสถานะการตั้งค่า
plugin-sdk/setup-runtimeตัวช่วยรันไทม์ขณะตั้งค่าอะแดปเตอร์แพตช์การตั้งค่าที่นำเข้าได้อย่างปลอดภัย, ตัวช่วยบันทึกการค้นหา, promptResolvedAllowFrom, splitSetupEntries, พร็อกซีการตั้งค่าแบบมอบหมาย
plugin-sdk/setup-adapter-runtimealias ของอะแดปเตอร์การตั้งค่าที่เลิกใช้แล้วใช้ plugin-sdk/setup-runtime
plugin-sdk/setup-toolsตัวช่วยเครื่องมือการตั้งค่าformatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR
plugin-sdk/account-coreตัวช่วยหลายบัญชีตัวช่วยรายการบัญชี/การกำหนดค่า/action-gate
plugin-sdk/account-idตัวช่วย account-idDEFAULT_ACCOUNT_ID, การทำ account-id ให้เป็นมาตรฐาน
plugin-sdk/account-resolutionตัวช่วยค้นหาบัญชีตัวช่วยค้นหาบัญชี + ตัวช่วย fallback ค่าเริ่มต้น
plugin-sdk/account-helpersตัวช่วยบัญชีแบบเจาะจงตัวช่วยรายการบัญชี/account-action
plugin-sdk/channel-setupอะแดปเตอร์วิซาร์ดการตั้งค่าcreateOptionalChannelSetupSurface, createOptionalChannelSetupAdapter, createOptionalChannelSetupWizard, รวมถึง DEFAULT_ACCOUNT_ID, createTopLevelChannelDmPolicy, setSetupChannelEnabled, splitSetupEntries
plugin-sdk/channel-pairingprimitive สำหรับการจับคู่ DMcreateChannelPairingController
plugin-sdk/channel-reply-pipelineการเชื่อมต่อคำนำหน้าการตอบกลับ, การพิมพ์, และการส่งมอบต้นทางcreateChannelReplyPipeline, resolveChannelSourceReplyDeliveryMode
plugin-sdk/channel-config-helpersfactory อะแดปเตอร์การกำหนดค่าและตัวช่วยการเข้าถึง DMcreateHybridChannelConfigAdapter, resolveChannelDmAccess, resolveChannelDmAllowFrom, resolveChannelDmPolicy, normalizeChannelDmPolicy, normalizeLegacyDmAliases
plugin-sdk/channel-config-schemaตัวสร้างสคีมาการกำหนดค่าprimitive สคีมาการกำหนดค่าช่องทางที่ใช้ร่วมกันและตัวสร้างทั่วไปเท่านั้น
plugin-sdk/bundled-channel-config-schemaสคีมาการกำหนดค่าที่บันเดิลมาเฉพาะ Plugin ที่บันเดิลมาและดูแลโดย OpenClaw เท่านั้น; Plugin ใหม่ต้องกำหนดสคีมาเฉพาะ Plugin เอง
plugin-sdk/channel-config-schema-legacyสคีมาการกำหนดค่าที่บันเดิลมาและเลิกใช้แล้วalias เพื่อความเข้ากันได้เท่านั้น; ใช้ plugin-sdk/bundled-channel-config-schema สำหรับ Plugin ที่บันเดิลมาและยังดูแลอยู่
plugin-sdk/telegram-command-configตัวช่วยการกำหนดค่าคำสั่ง Telegramการทำชื่อคำสั่งให้เป็นมาตรฐาน, การตัดแต่งคำอธิบาย, การตรวจสอบรายการซ้ำ/ความขัดแย้ง
plugin-sdk/channel-policyการแก้นโยบายกลุ่ม/DMresolveChannelGroupRequireMention
plugin-sdk/channel-lifecycleตัวช่วยสถานะบัญชีและวงจรชีวิตสตรีมฉบับร่างcreateAccountStatusSink, ตัวช่วยการสรุปพรีวิวฉบับร่าง
plugin-sdk/inbound-envelopeตัวช่วยซองข้อมูลขาเข้าตัวช่วยเส้นทางที่ใช้ร่วมกัน + ตัวสร้างซองข้อมูล
plugin-sdk/inbound-reply-dispatchตัวช่วยการตอบกลับขาเข้าตัวช่วยบันทึกและ dispatch ที่ใช้ร่วมกัน
plugin-sdk/messaging-targetsการแยกวิเคราะห์เป้าหมายการส่งข้อความตัวช่วยแยกวิเคราะห์/จับคู่เป้าหมาย
plugin-sdk/outbound-mediaตัวช่วยสื่อขาออกการโหลดสื่อขาออกที่ใช้ร่วมกัน
plugin-sdk/outbound-send-depsตัวช่วย dependency สำหรับการส่งขาออกการค้นหา resolveOutboundSendDep แบบเบาโดยไม่นำเข้ารันไทม์ขาออกเต็มรูปแบบ
plugin-sdk/outbound-runtimeตัวช่วยรันไทม์ขาออกตัวช่วยการส่งมอบขาออก, delegate ตัวตน/การส่ง, เซสชัน, การจัดรูปแบบ, และการวางแผน payload
plugin-sdk/thread-bindings-runtimeตัวช่วยการผูกเธรดตัวช่วยวงจรชีวิตและอะแดปเตอร์ของการผูกเธรด
plugin-sdk/agent-media-payloadตัวช่วย payload สื่อรุ่นเก่าตัวสร้าง payload สื่อของ Agent สำหรับเลย์เอาต์ฟิลด์รุ่นเก่า
plugin-sdk/channel-runtimeshim ความเข้ากันได้ที่เลิกใช้แล้วเฉพาะยูทิลิตีรันไทม์ช่องทางรุ่นเก่าเท่านั้น
plugin-sdk/channel-send-resultชนิดผลลัพธ์การส่งชนิดผลลัพธ์การตอบกลับ
plugin-sdk/runtime-storeที่เก็บ Plugin แบบถาวรcreatePluginRuntimeStore
plugin-sdk/runtimeตัวช่วยรันไทม์แบบกว้างตัวช่วยรันไทม์/การบันทึก/สำรองข้อมูล/ติดตั้ง Plugin
plugin-sdk/runtime-envตัวช่วยสภาพแวดล้อมรันไทม์แบบเจาะจงLogger/สภาพแวดล้อมรันไทม์, timeout, retry, และ backoff
plugin-sdk/plugin-runtimeตัวช่วยรันไทม์ Plugin ที่ใช้ร่วมกันตัวช่วยคำสั่ง/hooks/http/interactive ของ Plugin
plugin-sdk/hook-runtimeตัวช่วย hook pipelineตัวช่วย pipeline ของ Webhook/hook ภายในที่ใช้ร่วมกัน
plugin-sdk/lazy-runtimeตัวช่วยรันไทม์ lazycreateLazyRuntimeModule, createLazyRuntimeMethod, createLazyRuntimeMethodBinder, createLazyRuntimeNamedExport, createLazyRuntimeSurface
plugin-sdk/process-runtimeตัวช่วยโปรเซสตัวช่วย exec ที่ใช้ร่วมกัน
plugin-sdk/cli-runtimeตัวช่วยรันไทม์ CLIการจัดรูปแบบคำสั่ง, การรอ, ตัวช่วยเวอร์ชัน
plugin-sdk/gateway-runtimeตัวช่วย Gatewayไคลเอนต์ Gateway, ตัวช่วยเริ่มแบบ event-loop-ready, และตัวช่วยแพตช์สถานะช่องทาง
plugin-sdk/config-runtimeshim ความเข้ากันได้ของการกำหนดค่าที่เลิกใช้แล้วควรใช้ config-contracts, plugin-config-runtime, runtime-config-snapshot, และ config-mutation
plugin-sdk/telegram-command-configตัวช่วยคำสั่ง Telegramตัวช่วยตรวจสอบคำสั่ง Telegram ที่เสถียรเมื่อ fallback เมื่อ surface contract ของ Telegram ที่บันเดิลมาไม่พร้อมใช้งาน
plugin-sdk/approval-runtimeตัวช่วยพรอมป์การอนุมัติpayload การอนุมัติ exec/Plugin, ตัวช่วย capability/profile การอนุมัติ, ตัวช่วยการกำหนดเส้นทาง/รันไทม์การอนุมัติ native, และการจัดรูปแบบพาธแสดงผลการอนุมัติแบบมีโครงสร้าง
plugin-sdk/approval-auth-runtimeตัวช่วย auth การอนุมัติการแก้ approver, auth การดำเนินการในแชทเดียวกัน
plugin-sdk/approval-client-runtimeตัวช่วยไคลเอนต์การอนุมัติตัวช่วย profile/filter การอนุมัติ exec native
plugin-sdk/approval-delivery-runtimeตัวช่วยการส่งมอบการอนุมัติอะแดปเตอร์ capability/การส่งมอบการอนุมัติ native
plugin-sdk/approval-gateway-runtimeตัวช่วย Gateway การอนุมัติตัวช่วยการแก้ Gateway การอนุมัติที่ใช้ร่วมกัน
plugin-sdk/approval-handler-adapter-runtimeตัวช่วยอะแดปเตอร์การอนุมัติตัวช่วยโหลดอะแดปเตอร์การอนุมัติ native แบบเบาสำหรับ entrypoint ช่องทางที่เป็น hot path
plugin-sdk/approval-handler-runtimeตัวช่วย handler การอนุมัติตัวช่วยรันไทม์ handler การอนุมัติที่กว้างกว่า; ควรใช้ seam อะแดปเตอร์/Gateway ที่เจาะจงกว่าเมื่อเพียงพอ
plugin-sdk/approval-native-runtimeตัวช่วยเป้าหมายการอนุมัติตัวช่วยการผูกเป้าหมาย/บัญชีการอนุมัติ native
plugin-sdk/approval-reply-runtimeตัวช่วยการตอบกลับการอนุมัติตัวช่วย payload การตอบกลับการอนุมัติ exec/Plugin
plugin-sdk/channel-runtime-contextตัวช่วย runtime-context ของช่องทางตัวช่วย register/get/watch runtime-context ของช่องทางทั่วไป
plugin-sdk/security-runtimeตัวช่วยความปลอดภัยtrust ที่ใช้ร่วมกัน, การ gate DM, ตัวช่วยไฟล์/พาธที่จำกัดภายในราก, external-content, และการรวบรวม secret
plugin-sdk/ssrf-policyตัวช่วยนโยบาย SSRFตัวช่วย allowlist โฮสต์และนโยบายเครือข่ายส่วนตัว
plugin-sdk/ssrf-runtimeตัวช่วยรันไทม์ SSRFdispatcher แบบ pinned, fetch ที่มี guard, ตัวช่วยนโยบาย SSRF
plugin-sdk/system-event-runtimeตัวช่วยเหตุการณ์ระบบenqueueSystemEvent, peekSystemEventEntries
plugin-sdk/heartbeat-runtimeตัวช่วย Heartbeatตัวช่วย wake, event, และ visibility ของ Heartbeat
plugin-sdk/delivery-queue-runtimeตัวช่วยคิวการส่งมอบdrainPendingDeliveries
plugin-sdk/channel-activity-runtimeตัวช่วยกิจกรรมช่องทางrecordChannelActivity
plugin-sdk/dedupe-runtimeตัวช่วย dedupeแคช dedupe ในหน่วยความจำ
plugin-sdk/file-access-runtimeตัวช่วยการเข้าถึงไฟล์ตัวช่วยพาธไฟล์/สื่อภายในเครื่องที่ปลอดภัย
plugin-sdk/transport-ready-runtimeตัวช่วยความพร้อมของ transportwaitForTransportReady
plugin-sdk/collection-runtimeตัวช่วยแคชแบบมีขอบเขตpruneMapToMaxSize
plugin-sdk/diagnostic-runtimeตัวช่วยการ gate การวินิจฉัยisDiagnosticFlagEnabled, isDiagnosticsEnabled
plugin-sdk/error-runtimeตัวช่วยการจัดรูปแบบข้อผิดพลาดformatUncaughtError, isApprovalNotFoundError, ตัวช่วยกราฟข้อผิดพลาด
plugin-sdk/fetch-runtimeตัวช่วย fetch/proxy แบบห่อหุ้มresolveFetch, ตัวช่วย proxy, ตัวช่วยตัวเลือก EnvHttpProxyAgent
plugin-sdk/host-runtimeตัวช่วยการทำโฮสต์ให้เป็นมาตรฐานnormalizeHostname, normalizeScpRemoteHost
plugin-sdk/retry-runtimeตัวช่วย retryRetryConfig, retryAsync, ตัวเรียกใช้นโยบาย
plugin-sdk/allow-fromการจัดรูปแบบ allowlistformatAllowFromLowercase
plugin-sdk/allowlist-resolutionการแมปอินพุต allowlistmapAllowlistResolutionInputs
plugin-sdk/command-authการ gate คำสั่งและตัวช่วย surface คำสั่งresolveControlCommandGate, ตัวช่วยการอนุญาตผู้ส่ง, ตัวช่วยรีจิสทรีคำสั่งรวมถึงการจัดรูปแบบเมนูอาร์กิวเมนต์แบบไดนามิก
plugin-sdk/command-statusตัวเรนเดอร์สถานะ/ความช่วยเหลือของคำสั่งbuildCommandsMessage, buildCommandsMessagePaginated, buildHelpMessage
plugin-sdk/secret-inputการแยกวิเคราะห์อินพุต secretตัวช่วยอินพุต secret
plugin-sdk/webhook-ingressตัวช่วยคำขอ Webhookยูทิลิตีเป้าหมาย Webhook
plugin-sdk/webhook-request-guardsตัวช่วย guard เนื้อหา Webhookตัวช่วยอ่าน/จำกัดขนาดเนื้อหาคำขอ
plugin-sdk/reply-runtimeรันไทม์การตอบกลับที่ใช้ร่วมกันdispatch ขาเข้า, Heartbeat, ตัววางแผนการตอบกลับ, การแบ่งเป็น chunk
plugin-sdk/reply-dispatch-runtimeตัวช่วย dispatch การตอบกลับแบบเจาะจงตัวช่วย finalize, dispatch ผู้ให้บริการ, และป้ายกำกับบทสนทนา
plugin-sdk/reply-historyตัวช่วยประวัติการตอบกลับbuildHistoryContext, buildPendingHistoryContextFromMap, recordPendingHistoryEntry, clearHistoryEntriesIfEnabled
plugin-sdk/reply-referenceการวางแผน reference การตอบกลับcreateReplyReferencePlanner
plugin-sdk/reply-chunkingตัวช่วย chunk การตอบกลับตัวช่วยแบ่ง chunk ข้อความ/markdown
plugin-sdk/session-store-runtimeตัวช่วยที่เก็บเซสชันตัวช่วยพาธที่เก็บ + updated-at
plugin-sdk/state-pathsตัวช่วยพาธสถานะตัวช่วยไดเรกทอรีสถานะและ OAuth
plugin-sdk/routingตัวช่วยการกำหนดเส้นทาง/session-keyresolveAgentRoute, buildAgentSessionKey, resolveDefaultAgentBoundAccountId, ตัวช่วยการทำ session-key ให้เป็นมาตรฐาน
plugin-sdk/status-helpersตัวช่วยสถานะช่องทางตัวสร้างสรุปสถานะช่องทาง/บัญชี, ค่าเริ่มต้น runtime-state, ตัวช่วย metadata ของ issue
plugin-sdk/target-resolver-runtimeตัวช่วย target resolverตัวช่วย target resolver ที่ใช้ร่วมกัน
plugin-sdk/string-normalization-runtimeตัวช่วยการทำสตริงให้เป็นมาตรฐานตัวช่วยการทำ slug/สตริงให้เป็นมาตรฐาน
plugin-sdk/request-urlตัวช่วย URL คำขอดึง URL แบบสตริงจากอินพุตที่คล้ายคำขอ
plugin-sdk/run-commandตัวช่วยคำสั่งแบบจับเวลาตัวเรียกใช้คำสั่งแบบจับเวลาพร้อม stdout/stderr ที่ทำให้เป็นมาตรฐาน
plugin-sdk/param-readersตัวอ่านพารามิเตอร์ตัวอ่านพารามิเตอร์ทั่วไปของเครื่องมือ/CLI
plugin-sdk/tool-payloadการแยกเพย์โหลดของเครื่องมือแยกเพย์โหลดที่ทำให้เป็นมาตรฐานจากออบเจกต์ผลลัพธ์ของเครื่องมือ
plugin-sdk/tool-sendการแยกการส่งของเครื่องมือแยกฟิลด์เป้าหมายการส่งแบบบัญญัติจากอาร์กิวเมนต์ของเครื่องมือ
plugin-sdk/temp-pathตัวช่วยพาธชั่วคราวตัวช่วยพาธดาวน์โหลดชั่วคราวที่ใช้ร่วมกัน
plugin-sdk/logging-coreตัวช่วยการบันทึกล็อกตัวช่วย logger ของระบบย่อยและการปกปิดข้อมูล
plugin-sdk/markdown-table-runtimeตัวช่วยตาราง Markdownตัวช่วยโหมดตาราง Markdown
plugin-sdk/reply-payloadประเภทการตอบกลับข้อความประเภทเพย์โหลดการตอบกลับ
plugin-sdk/provider-setupตัวช่วยการตั้งค่า provider แบบคัดสรรสำหรับโลคัล/โฮสต์เองตัวช่วยค้นพบ/กำหนดค่า provider แบบโฮสต์เอง
plugin-sdk/self-hosted-provider-setupตัวช่วยการตั้งค่า provider แบบโฮสต์เองที่เข้ากันได้กับ OpenAI แบบเฉพาะเจาะจงตัวช่วยค้นพบ/กำหนดค่า provider แบบโฮสต์เองเดียวกัน
plugin-sdk/provider-auth-runtimeตัวช่วยการยืนยันตัวตนรันไทม์ของ providerตัวช่วยการแก้ค่า API key ระหว่างรันไทม์
plugin-sdk/provider-auth-api-keyตัวช่วยการตั้งค่า API key ของ providerตัวช่วย onboarding/เขียนโปรไฟล์สำหรับ API key
plugin-sdk/provider-auth-resultตัวช่วยผลลัพธ์การยืนยันตัวตนของ providerตัวสร้างผลลัพธ์การยืนยันตัวตน OAuth มาตรฐาน
plugin-sdk/provider-selection-runtimeตัวช่วยการเลือก providerการเลือก provider แบบกำหนดค่าไว้หรืออัตโนมัติ และการผสานการกำหนดค่า provider ดิบ
plugin-sdk/provider-env-varsตัวช่วย env-var ของ providerตัวช่วยค้นหา env-var สำหรับการยืนยันตัวตนของ provider
plugin-sdk/provider-model-sharedตัวช่วยโมเดล/การ replay ของ provider ที่ใช้ร่วมกันProviderReplayFamily, buildProviderReplayFamilyHooks, normalizeModelCompat, ตัวสร้างนโยบาย replay ที่ใช้ร่วมกัน, ตัวช่วย endpoint ของ provider และตัวช่วยทำให้ model-id เป็นมาตรฐาน
plugin-sdk/provider-catalog-sharedตัวช่วยแค็ตตาล็อก provider ที่ใช้ร่วมกันfindCatalogTemplate, buildSingleProviderApiKeyCatalog, buildManifestModelProviderConfig, supportsNativeStreamingUsageCompat, applyProviderNativeStreamingUsageCompat
plugin-sdk/provider-onboardแพตช์ onboarding ของ providerตัวช่วยการกำหนดค่า onboarding
plugin-sdk/provider-httpตัวช่วย HTTP ของ providerตัวช่วยความสามารถ HTTP/endpoint ทั่วไปของ provider รวมถึงตัวช่วยฟอร์ม multipart สำหรับการถอดเสียงเสียง
plugin-sdk/provider-web-fetchตัวช่วย web-fetch ของ providerตัวช่วยการลงทะเบียน/แคช provider แบบ web-fetch
plugin-sdk/provider-web-search-config-contractตัวช่วยการกำหนดค่า web-search ของ providerตัวช่วยการกำหนดค่า/ข้อมูลรับรอง web-search แบบแคบสำหรับ provider ที่ไม่ต้องการการเชื่อมต่อเปิดใช้ Plugin
plugin-sdk/provider-web-search-contractตัวช่วย contract ของ web-search ของ providerตัวช่วย contract การกำหนดค่า/ข้อมูลรับรอง web-search แบบแคบ เช่น createWebSearchProviderContractFields, enablePluginInConfig, resolveProviderWebSearchPluginConfig และตัวตั้งค่า/ตัวรับข้อมูลรับรองแบบมีขอบเขต
plugin-sdk/provider-web-searchตัวช่วย web-search ของ providerตัวช่วยการลงทะเบียน/แคช/รันไทม์ของ provider แบบ web-search
plugin-sdk/provider-toolsตัวช่วยความเข้ากันได้ของเครื่องมือ/สคีมาของ providerProviderToolCompatFamily, buildProviderToolCompatFamilyHooks และการล้างสคีมา Gemini + การวินิจฉัย
plugin-sdk/provider-usageตัวช่วยการใช้งานของ providerfetchClaudeUsage, fetchGeminiUsage, fetchGithubCopilotUsage และตัวช่วยการใช้งาน provider อื่น ๆ
plugin-sdk/provider-streamตัวช่วย wrapper สตรีมของ providerProviderStreamFamily, buildProviderStreamFamilyHooks, composeProviderStreamWrappers, ประเภท wrapper สตรีม และตัวช่วย wrapper Anthropic/Bedrock/DeepSeek V4/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot ที่ใช้ร่วมกัน
plugin-sdk/provider-transport-runtimeตัวช่วย transport ของ providerตัวช่วย transport แบบ native ของ provider เช่น guarded fetch, การแปลงข้อความ transport และสตรีมเหตุการณ์ transport ที่เขียนได้
plugin-sdk/keyed-async-queueคิว async แบบมีลำดับKeyedAsyncQueue
plugin-sdk/media-runtimeตัวช่วยสื่อที่ใช้ร่วมกันตัวช่วย fetch/แปลง/จัดเก็บสื่อ, การตรวจหามิติของวิดีโอด้วย ffprobe และตัวสร้างเพย์โหลดสื่อ
plugin-sdk/media-generation-runtimeตัวช่วยการสร้างสื่อที่ใช้ร่วมกันตัวช่วย failover ที่ใช้ร่วมกัน, การเลือก candidate และข้อความเมื่อโมเดลขาดหายสำหรับการสร้างรูปภาพ/วิดีโอ/เพลง
plugin-sdk/media-understandingตัวช่วยการทำความเข้าใจสื่อประเภท provider สำหรับการทำความเข้าใจสื่อ พร้อม export ตัวช่วยรูปภาพ/เสียงที่หันหน้าให้ provider
plugin-sdk/text-runtimeexport ความเข้ากันได้ของข้อความแบบกว้างที่เลิกใช้แล้วใช้ string-coerce-runtime, text-chunking, text-utility-runtime และ logging-core
plugin-sdk/text-chunkingตัวช่วยการแบ่งข้อความเป็นชิ้นตัวช่วยการแบ่งข้อความขาออกเป็นชิ้น
plugin-sdk/speechตัวช่วยคำพูดประเภท provider คำพูด พร้อม directive, registry, ตัวช่วยตรวจสอบที่หันหน้าให้ provider และตัวสร้าง TTS ที่เข้ากันได้กับ OpenAI
plugin-sdk/speech-coreคอร์คำพูดที่ใช้ร่วมกันประเภท provider คำพูด, registry, directive, การทำให้เป็นมาตรฐาน
plugin-sdk/realtime-transcriptionตัวช่วยการถอดเสียงแบบเรียลไทม์ประเภท provider, ตัวช่วย registry และตัวช่วยเซสชัน WebSocket ที่ใช้ร่วมกัน
plugin-sdk/realtime-voiceตัวช่วยเสียงแบบเรียลไทม์ประเภท provider, ตัวช่วย registry/การแก้ค่า, ตัวช่วยเซสชัน bridge, คิว talk-back ของ agent ที่ใช้ร่วมกัน, สุขภาพ transcript/event, การยับยั้ง echo และตัวช่วยปรึกษาบริบทแบบเร็ว
plugin-sdk/image-generationตัวช่วยการสร้างรูปภาพประเภท provider การสร้างรูปภาพ พร้อมตัวช่วย asset รูปภาพ/data URL และตัวสร้าง provider รูปภาพที่เข้ากันได้กับ OpenAI
plugin-sdk/image-generation-coreคอร์การสร้างรูปภาพที่ใช้ร่วมกันประเภทการสร้างรูปภาพ, failover, การยืนยันตัวตน และตัวช่วย registry
plugin-sdk/music-generationตัวช่วยการสร้างเพลงประเภท provider/request/result สำหรับการสร้างเพลง
plugin-sdk/music-generation-coreคอร์การสร้างเพลงที่ใช้ร่วมกันประเภทการสร้างเพลง, ตัวช่วย failover, การค้นหา provider และการแยกวิเคราะห์ model-ref
plugin-sdk/video-generationตัวช่วยการสร้างวิดีโอประเภท provider/request/result สำหรับการสร้างวิดีโอ
plugin-sdk/video-generation-coreคอร์การสร้างวิดีโอที่ใช้ร่วมกันประเภทการสร้างวิดีโอ, ตัวช่วย failover, การค้นหา provider และการแยกวิเคราะห์ model-ref
plugin-sdk/interactive-runtimeตัวช่วยการตอบกลับแบบโต้ตอบการทำให้เป็นมาตรฐาน/การลดรูปเพย์โหลดการตอบกลับแบบโต้ตอบ
plugin-sdk/channel-config-primitivesprimitive การกำหนดค่าช่องทางprimitive สคีมาการกำหนดค่าช่องทางแบบแคบ
plugin-sdk/channel-config-writesตัวช่วยการเขียนการกำหนดค่าช่องทางตัวช่วยการอนุญาตการเขียนการกำหนดค่าช่องทาง
plugin-sdk/channel-plugin-commonprelude ช่องทางที่ใช้ร่วมกันexport prelude ของ Plugin ช่องทางที่ใช้ร่วมกัน
plugin-sdk/channel-statusตัวช่วยสถานะช่องทางตัวช่วย snapshot/สรุปสถานะช่องทางที่ใช้ร่วมกัน
plugin-sdk/allowlist-config-editตัวช่วยการกำหนดค่า allowlistตัวช่วยแก้ไข/อ่านการกำหนดค่า allowlist
plugin-sdk/group-accessตัวช่วยการเข้าถึงกลุ่มตัวช่วยการตัดสินใจการเข้าถึงกลุ่มที่ใช้ร่วมกัน
plugin-sdk/direct-dmตัวช่วย DM โดยตรงตัวช่วยการยืนยันตัวตน/guard สำหรับ DM โดยตรงที่ใช้ร่วมกัน
plugin-sdk/extension-sharedตัวช่วย extension ที่ใช้ร่วมกันprimitive ตัวช่วย passive-channel/status และ ambient proxy
plugin-sdk/webhook-targetsตัวช่วยเป้าหมาย Webhookregistry เป้าหมาย Webhook และตัวช่วยติดตั้ง route
plugin-sdk/webhook-pathalias พาธ webhook ที่เลิกใช้แล้วใช้ plugin-sdk/webhook-ingress
plugin-sdk/web-mediaตัวช่วยสื่อเว็บที่ใช้ร่วมกันตัวช่วยโหลดสื่อระยะไกล/โลคัล
plugin-sdk/zodre-export ความเข้ากันได้ของ Zod ที่เลิกใช้แล้วimport zod จาก zod โดยตรง
plugin-sdk/memory-coreตัวช่วย memory-core ที่บันเดิลมาพื้นผิวตัวช่วย memory manager/config/file/CLI
plugin-sdk/memory-core-engine-runtimefacade รันไทม์ของเอนจินหน่วยความจำfacade รันไทม์ index/search ของหน่วยความจำ
plugin-sdk/memory-core-host-engine-foundationเอนจิน foundation ของโฮสต์หน่วยความจำexport เอนจิน foundation ของโฮสต์หน่วยความจำ
plugin-sdk/memory-core-host-engine-embeddingsเอนจิน embedding ของโฮสต์หน่วยความจำcontract ของ embedding หน่วยความจำ, การเข้าถึง registry, provider โลคัล และตัวช่วย batch/remote ทั่วไป; provider ระยะไกลแบบเจาะจงอยู่ใน Plugin ที่เป็นเจ้าของ
plugin-sdk/memory-core-host-engine-qmdเอนจิน QMD ของโฮสต์หน่วยความจำexport เอนจิน QMD ของโฮสต์หน่วยความจำ
plugin-sdk/memory-core-host-engine-storageเอนจิน storage ของโฮสต์หน่วยความจำexport เอนจิน storage ของโฮสต์หน่วยความจำ
plugin-sdk/memory-core-host-multimodalตัวช่วย multimodal ของโฮสต์หน่วยความจำตัวช่วย multimodal ของโฮสต์หน่วยความจำ
plugin-sdk/memory-core-host-queryตัวช่วย query ของโฮสต์หน่วยความจำตัวช่วย query ของโฮสต์หน่วยความจำ
plugin-sdk/memory-core-host-secretตัวช่วย secret ของโฮสต์หน่วยความจำตัวช่วย secret ของโฮสต์หน่วยความจำ
plugin-sdk/memory-core-host-eventsalias เหตุการณ์หน่วยความจำที่เลิกใช้แล้วใช้ plugin-sdk/memory-host-events
plugin-sdk/memory-core-host-statusตัวช่วยสถานะโฮสต์หน่วยความจำตัวช่วยสถานะโฮสต์หน่วยความจำ
plugin-sdk/memory-core-host-runtime-cliรันไทม์ CLI ของโฮสต์หน่วยความจำตัวช่วยรันไทม์ CLI ของโฮสต์หน่วยความจำ
plugin-sdk/memory-core-host-runtime-coreรันไทม์คอร์ของโฮสต์หน่วยความจำตัวช่วยรันไทม์คอร์ของโฮสต์หน่วยความจำ
plugin-sdk/memory-core-host-runtime-filesตัวช่วยไฟล์/รันไทม์ของโฮสต์หน่วยความจำตัวช่วยไฟล์/รันไทม์ของโฮสต์หน่วยความจำ
plugin-sdk/memory-host-corealias รันไทม์คอร์ของโฮสต์หน่วยความจำalias ที่เป็นกลางต่อ vendor สำหรับตัวช่วยรันไทม์คอร์ของโฮสต์หน่วยความจำ
plugin-sdk/memory-host-eventsalias บันทึกเหตุการณ์ของโฮสต์หน่วยความจำalias ที่เป็นกลางต่อ vendor สำหรับตัวช่วยบันทึกเหตุการณ์ของโฮสต์หน่วยความจำ
plugin-sdk/memory-host-filesalias ไฟล์/รันไทม์หน่วยความจำที่เลิกใช้แล้วใช้ plugin-sdk/memory-core-host-runtime-files
plugin-sdk/memory-host-markdownตัวช่วย markdown ที่จัดการให้ตัวช่วย managed-markdown ที่ใช้ร่วมกันสำหรับ Plugin ที่อยู่ใกล้หน่วยความจำ
plugin-sdk/memory-host-searchfacade การค้นหา Active Memoryfacade รันไทม์ของ search-manager สำหรับ active-memory แบบ lazy
plugin-sdk/memory-host-statusalias สถานะโฮสต์หน่วยความจำที่เลิกใช้แล้วใช้ plugin-sdk/memory-core-host-status
plugin-sdk/testingยูทิลิตีทดสอบbarrel ความเข้ากันได้ที่เลิกใช้แล้วแบบ repo-local; ใช้ subpath ทดสอบแบบ repo-local ที่เฉพาะเจาะจง เช่น plugin-sdk/plugin-test-runtime, plugin-sdk/channel-test-helpers, plugin-sdk/channel-target-testing, plugin-sdk/test-env และ plugin-sdk/test-fixtures
ตารางนี้จงใจให้เป็นชุดย่อยสำหรับการย้ายที่ใช้ร่วมกัน ไม่ใช่พื้นผิว SDK ทั้งหมด รายการ entrypoint ของคอมไพเลอร์อยู่ที่ scripts/lib/plugin-sdk-entrypoints.json; package exports จะถูกสร้างจาก ชุดย่อยสาธารณะ seam ตัวช่วยของ Plugin ที่รวมมากับแพ็กเกจซึ่งสงวนไว้ ถูกถอดออกจาก export map ของ SDK สาธารณะแล้ว ยกเว้น compatibility facade ที่มีเอกสารชัดเจน เช่น shim plugin-sdk/discord ที่เลิกใช้แล้วแต่ยังคงไว้สำหรับแพ็กเกจ @openclaw/discord@2026.3.13 ที่เผยแพร่ไปแล้ว ตัวช่วยเฉพาะ owner จะอยู่ภายใน แพ็กเกจ Plugin ที่เป็นเจ้าของนั้น พฤติกรรม host ที่ใช้ร่วมกันควรย้ายผ่านสัญญา SDK แบบทั่วไป เช่น plugin-sdk/gateway-runtime, plugin-sdk/security-runtime, และ plugin-sdk/plugin-config-runtime ใช้อิมพอร์ตที่แคบที่สุดซึ่งตรงกับงาน หากหา export ไม่พบ ให้ตรวจสอบซอร์สที่ src/plugin-sdk/ หรือถาม maintainers ว่าสัญญาทั่วไปใดควรเป็นเจ้าของสิ่งนั้น

การเลิกใช้ที่ยังมีผลอยู่

การเลิกใช้ที่แคบลงซึ่งใช้กับ plugin SDK, สัญญา provider, พื้นผิว runtime และ manifest แต่ละรายการยังคงทำงานได้ในวันนี้ แต่จะถูกลบออกใน major release ในอนาคต รายการใต้แต่ละหัวข้อจะ map API เก่าไปยังตัวแทนที่เป็น canonical
เดิม (openclaw/plugin-sdk/command-auth): buildCommandsMessage, buildCommandsMessagePaginated, buildHelpMessage.ใหม่ (openclaw/plugin-sdk/command-status): signature เดิม, export เดิม เพียงแค่อิมพอร์ตจาก subpath ที่แคบกว่า command-auth จะ re-export รายการเหล่านี้เป็น compat stub
// Before
import { buildHelpMessage } from "openclaw/plugin-sdk/command-auth";

// After
import { buildHelpMessage } from "openclaw/plugin-sdk/command-status";
เดิม: resolveInboundMentionRequirement({ facts, policy }) และ shouldDropInboundForMention(...) จาก openclaw/plugin-sdk/channel-inbound หรือ openclaw/plugin-sdk/channel-mention-gating.ใหม่: resolveInboundMentionDecision({ facts, policy }) - คืนค่า object การตัดสินใจเดียว แทนการเรียกสองครั้งที่แยกกันPlugin ช่องทางปลายน้ำ (Slack, Discord, Matrix, MS Teams) ได้เปลี่ยนแล้ว
openclaw/plugin-sdk/channel-runtime เป็น compatibility shim สำหรับ Plugin ช่องทางรุ่นเก่า อย่าอิมพอร์ตจากโค้ดใหม่ ให้ใช้ openclaw/plugin-sdk/channel-runtime-context สำหรับการลงทะเบียน object runtimeตัวช่วย channelActions* ใน openclaw/plugin-sdk/channel-actions ถูกเลิกใช้ พร้อมกับ export ช่องทาง “actions” แบบดิบ ให้เปิดเผย capability ผ่านพื้นผิว presentation เชิงความหมายแทน - Plugin ช่องทางประกาศว่าตน render อะไร (cards, buttons, selects) ไม่ใช่ชื่อ action ดิบใดที่ยอมรับ
เดิม: factory tool() จาก openclaw/plugin-sdk/provider-web-search.ใหม่: implement createTool(...) โดยตรงบน provider Plugin OpenClaw ไม่ต้องใช้ตัวช่วย SDK เพื่อลงทะเบียน wrapper ของเครื่องมืออีกต่อไป
เดิม: formatInboundEnvelope(...) (และ ChannelMessageForAgent.channelEnvelope) เพื่อสร้าง prompt envelope แบบ plaintext แบนจากข้อความช่องทางขาเข้าใหม่: BodyForAgent พร้อม block บริบทผู้ใช้แบบมีโครงสร้าง Plugin ช่องทางแนบ metadata การจัดเส้นทาง (thread, topic, reply-to, reactions) เป็น field ที่มี type แทนการต่อเข้ากับ prompt string ตัวช่วย formatAgentEnvelope(...) ยังรองรับสำหรับ envelope ที่สังเคราะห์ขึ้นเพื่อ assistant แต่ envelope plaintext ขาเข้ากำลังจะถูกเลิกใช้พื้นที่ที่ได้รับผลกระทบ: inbound_claim, message_received, และ Plugin ช่องทางกำหนดเองใดๆ ที่ post-process ข้อความ channelEnvelope
type alias สำหรับ discovery สี่รายการตอนนี้เป็น wrapper บางๆ เหนือ type ยุค catalog:
alias เดิมtype ใหม่
ProviderDiscoveryOrderProviderCatalogOrder
ProviderDiscoveryContextProviderCatalogContext
ProviderDiscoveryResultProviderCatalogResult
ProviderPluginDiscoveryProviderPluginCatalog
รวมถึง static bag ProviderCapabilities แบบเดิม - provider Plugin ควรใช้ hook ของ provider ที่ชัดเจน เช่น buildReplayPolicy, normalizeToolSchemas, และ wrapStreamFn แทน object แบบ static
เดิม (hook แยกสามรายการบน ProviderThinkingPolicy): isBinaryThinking(ctx), supportsXHighThinking(ctx), และ resolveDefaultThinkingLevel(ctx).ใหม่: resolveThinkingProfile(ctx) รายการเดียวที่คืนค่า ProviderThinkingProfile พร้อม id แบบ canonical, label ที่ไม่บังคับ, และรายการ level ที่จัดอันดับแล้ว OpenClaw จะ downgrade ค่าที่เก็บไว้ซึ่งล้าสมัย ตามอันดับ profile โดยอัตโนมัติimplement hook เดียวแทนสามรายการ hook เดิมยังทำงานระหว่างช่วงเลิกใช้ แต่จะไม่ถูก compose กับผลลัพธ์ profile
เดิม: implement resolveExternalOAuthProfiles(...) โดยไม่ประกาศ provider ใน Plugin manifestใหม่: ประกาศ contracts.externalAuthProviders ใน Plugin manifest และ implement resolveExternalAuthProfiles(...) เส้นทาง “auth fallback” เดิมจะ emit คำเตือนตอน runtime และจะถูกลบออก
{
  "contracts": {
    "externalAuthProviders": ["anthropic", "openai"]
  }
}
field manifest เดิม: providerAuthEnvVars: { anthropic: ["ANTHROPIC_API_KEY"] }.ใหม่: mirror การ lookup env-var เดิมลงใน setup.providers[].envVars บน manifest วิธีนี้รวม metadata env สำหรับ setup/status ไว้ที่เดียว และหลีกเลี่ยงการ boot runtime ของ Plugin เพียงเพื่อตอบ lookup env-varproviderAuthEnvVars ยังคงรองรับผ่าน compatibility adapter จนกว่าช่วงเลิกใช้จะปิดลง
เดิม: การเรียกแยกสามครั้ง - api.registerMemoryPromptSection(...), api.registerMemoryFlushPlan(...), api.registerMemoryRuntime(...).ใหม่: การเรียกเดียวบน memory-state API - registerMemoryCapability(pluginId, { promptBuilder, flushPlanResolver, runtime }).slot เดิมทั้งหมด ใช้การเรียกลงทะเบียนเดียว ตัวช่วย memory แบบ additive (registerMemoryPromptSupplement, registerMemoryCorpusSupplement, registerMemoryEmbeddingProvider) ไม่ได้รับผลกระทบ
type alias เดิมสองรายการยังคง export จาก src/plugins/runtime/types.ts:
เดิมใหม่
SubagentReadSessionParamsSubagentGetSessionMessagesParams
SubagentReadSessionResultSubagentGetSessionMessagesResult
method runtime readSession ถูกเลิกใช้ เพื่อใช้ getSessionMessages แทน signature เดิม; method เดิมจะเรียกต่อไปยัง method ใหม่
เดิม: runtime.tasks.flow (เอกพจน์) คืนค่า accessor ของ task-flow แบบ liveใหม่: runtime.tasks.managedFlows คง runtime การ mutate TaskFlow แบบ managed ไว้สำหรับ Plugin ที่สร้าง อัปเดต ยกเลิก หรือรัน child tasks จาก flow ใช้ runtime.tasks.flows เมื่อ Plugin ต้องการเพียงการอ่านแบบ DTO
// Before
const flow = api.runtime.tasks.flow.fromToolContext(ctx);
// After
const flow = api.runtime.tasks.managedFlows.fromToolContext(ctx);
ครอบคลุมใน “วิธีย้าย → ย้าย extension ผลลัพธ์เครื่องมือของ Pi ไปเป็น middleware” ด้านบน รวมไว้ที่นี่เพื่อความครบถ้วน: เส้นทาง Pi-only api.registerEmbeddedExtensionFactory(...) ที่ถูกลบออก ถูกแทนที่ด้วย api.registerAgentToolResultMiddleware(...) พร้อมรายการ runtime ที่ชัดเจน ใน contracts.agentToolResultMiddleware.
OpenClawSchemaType ที่ re-export จาก openclaw/plugin-sdk ตอนนี้เป็น alias หนึ่งบรรทัดของ OpenClawConfig ควรใช้ชื่อ canonical
// Before
import type { OpenClawSchemaType } from "openclaw/plugin-sdk";
// After
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-schema";
การเลิกใช้ระดับ extension (ภายใน Plugin ช่องทาง/provider ที่รวมมากับแพ็กเกจภายใต้ extensions/) ถูกติดตามไว้ใน barrel api.ts และ runtime-api.ts ของตนเอง สิ่งเหล่านี้ไม่กระทบสัญญา Plugin ของ third-party และไม่ได้แสดงรายการไว้ ที่นี่ หากคุณใช้ barrel local ของ Plugin ที่รวมมากับแพ็กเกจโดยตรง ให้อ่าน ความคิดเห็นเรื่องการเลิกใช้ใน barrel นั้นก่อนอัปเกรด

ไทม์ไลน์การลบ

เมื่อใดสิ่งที่จะเกิดขึ้น
ตอนนี้พื้นผิวที่เลิกใช้จะ emit คำเตือน runtime
major release ถัดไปพื้นผิวที่เลิกใช้จะถูกลบออก; Plugin ที่ยังใช้อยู่จะล้มเหลว
Plugin core ทั้งหมดถูกย้ายแล้ว Plugin ภายนอกควรย้ายก่อน major release ถัดไป

การระงับคำเตือนชั่วคราว

ตั้ง environment variables เหล่านี้ขณะทำงานย้าย:
OPENCLAW_SUPPRESS_PLUGIN_SDK_COMPAT_WARNING=1 openclaw gateway run
OPENCLAW_SUPPRESS_EXTENSION_API_WARNING=1 openclaw gateway run
นี่เป็นช่องทางหลีกเลี่ยงชั่วคราว ไม่ใช่วิธีแก้ถาวร

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