Skills

การกำหนดค่า Skills

การกำหนดค่าส่วนใหญ่ของสกิลอยู่ใต้ skills ใน ~/.openclaw/openclaw.json การมองเห็นเฉพาะเอเจนต์อยู่ใต้ agents.defaults.skills และ agents.list[].skills.

json5
{  skills: {    allowBundled: ["gemini", "peekaboo"],    load: {      extraDirs: ["~/Projects/agent-scripts/skills"],      allowSymlinkTargets: ["~/Projects/manager/skills"],      watch: true,      watchDebounceMs: 250,    },    install: {      preferBrew: true,      nodeManager: "npm",      allowUploadedArchives: false,    },    workshop: {      autonomous: { enabled: false },      allowSymlinkTargetWrites: false,      approvalPolicy: "pending",      maxPending: 50,      maxSkillBytes: 40000,    },    entries: {      "image-lab": {        enabled: true,        apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" },        env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },      },      peekaboo: { enabled: true },      sag: { enabled: false },    },  },}

การโหลด (skills.load)

skills.load.extraDirsstring[]

ไดเรกทอรีสกิลเพิ่มเติมที่จะสแกน โดยมีลำดับความสำคัญต่ำที่สุด (หลังสกิลที่บันเดิลมา และสกิลจาก Plugin) พาธจะถูกขยายโดยรองรับ ~

skills.load.allowSymlinkTargetsstring[]

ไดเรกทอรีเป้าหมายจริงที่เชื่อถือได้ ซึ่งโฟลเดอร์สกิลที่เป็น symlink อาจ resolve ไปหาได้ แม้ symlink จะอยู่นอก root ที่กำหนดค่าไว้ ใช้ค่านี้สำหรับเลย์เอาต์ sibling repo ที่ตั้งใจไว้ เช่น <workspace>/skills/manager -> ~/Projects/manager/skills จำกัดรายการนี้ให้แคบ อย่าชี้ไปยัง root กว้าง ๆ เช่น ~ หรือ ~/Projects

skills.load.watchbooleandefault: true

เฝ้าดูโฟลเดอร์สกิลและรีเฟรช snapshot ของสกิลเมื่อไฟล์ SKILL.md เปลี่ยนแปลง ครอบคลุมไฟล์ซ้อนภายใน root ของสกิลแบบกลุ่ม

skills.load.watchDebounceMsnumberdefault: 250

หน้าต่าง debounce สำหรับเหตุการณ์ watcher ของสกิล หน่วยเป็นมิลลิวินาที

การติดตั้ง (skills.install)

skills.install.preferBrewbooleandefault: true

เลือกใช้ตัวติดตั้ง Homebrew เมื่อมี brew

skills.install.nodeManager"npm" | "pnpm" | "yarn" | "bun"default: "npm"

ค่ากำหนดตัวจัดการแพ็กเกจ Node สำหรับการติดตั้งสกิล ค่านี้มีผลเฉพาะกับการติดตั้งสกิลเท่านั้น runtime ของ Gateway ยังควรใช้ Node (ไม่แนะนำ Bun สำหรับ WhatsApp/Telegram) ใช้ openclaw setup --node-manager สำหรับ npm, pnpm, หรือ bun; ตั้งค่า "yarn" ด้วยตนเองสำหรับการติดตั้งสกิลที่อิง Yarn

skills.install.allowUploadedArchivesbooleandefault: false

อนุญาตให้ไคลเอนต์ Gateway operator.admin ที่เชื่อถือได้ติดตั้งไฟล์ zip ส่วนตัวที่ staging ผ่าน skills.upload.* การติดตั้ง ClawHub ปกติไม่จำเป็นต้องใช้ การตั้งค่านี้

นโยบายการติดตั้งของผู้ปฏิบัติงาน (security.installPolicy)

ใช้ security.installPolicy เมื่อผู้ปฏิบัติงานต้องการคำสั่ง local ที่เชื่อถือได้เพื่อ อนุมัติหรือบล็อกการติดตั้งสกิลและ Plugin ด้วยนโยบายเฉพาะ host นโยบายนี้ ทำงานหลังจาก OpenClaw staging วัสดุต้นทางแล้ว และก่อนที่การติดตั้งหรืออัปเดต จะดำเนินต่อไป นโยบายนี้ใช้กับสกิล ClawHub, สกิลที่อัปโหลด, สกิล Git/local, ตัวติดตั้ง dependency ของสกิล และแหล่งติดตั้ง/อัปเดต Plugin

json5
{  security: {    installPolicy: {      enabled: true,      // Omit targets to cover every supported target.      targets: ["skill", "plugin"],      exec: {        source: "exec",        command: "/usr/local/bin/openclaw-install-policy",        args: ["--json"],        timeoutMs: 10000,        noOutputTimeoutMs: 10000,        maxOutputBytes: 1048576,        passEnv: ["OPENCLAW_STATE_DIR", "PATH"],        env: { POLICY_MODE: "strict" },        trustedDirs: ["/usr/local/bin"],      },    },  },}
security.installPolicy.enabledbooleandefault: false

เปิดใช้นโยบายการติดตั้งที่ผู้ปฏิบัติงานเป็นเจ้าของ เมื่อเปิดใช้โดยไม่มีคำสั่ง exec ที่ถูกต้อง การติดตั้งจะล้มเหลวแบบปิดกั้น

security.installPolicy.targets("skill" | "plugin")[]

ตัวกรองเป้าหมายแบบไม่บังคับ เมื่อไม่ระบุ นโยบายจะใช้กับทุกเป้าหมายที่รองรับ เพื่อให้การติดตั้งใหม่ไม่เปิดให้ผ่านโดยไม่คาดคิด

security.installPolicy.exec.commandstring

พาธแบบ absolute ไปยัง executable ของนโยบายที่เชื่อถือได้ OpenClaw เรียกใช้โดยไม่ผ่าน shell และตรวจสอบพาธก่อนใช้งาน

security.installPolicy.exec.argsstring[]

อาร์กิวเมนต์แบบคงที่ที่ส่งหลัง command

security.installPolicy.exec.timeoutMsnumberdefault: 10000

runtime ตามเวลาจริงสูงสุดสำหรับการตัดสินใจของนโยบายหนึ่งครั้ง

security.installPolicy.exec.noOutputTimeoutMsnumberdefault: timeoutMs

เวลาสูงสุดที่ไม่มีเอาต์พุต stdout หรือ stderr ก่อนที่นโยบายจะล้มเหลวแบบปิดกั้น

security.installPolicy.exec.maxOutputBytesnumberdefault: 1048576

จำนวนไบต์รวมสูงสุดของ stdout และ stderr ที่ยอมรับจาก process ของนโยบาย

security.installPolicy.exec.env"Record<string,
security.installPolicy.exec.passEnvstring[]

ชื่อตัวแปรสภาพแวดล้อมที่คัดลอกจาก process ของ OpenClaw ไปยัง process ของนโยบาย ส่งผ่านเฉพาะตัวแปรที่ระบุชื่อเท่านั้น

security.installPolicy.exec.trustedDirsstring[]

allowlist แบบไม่บังคับของไดเรกทอรีที่อาจมี executable ของนโยบาย

security.installPolicy.exec.allowInsecurePathbooleandefault: false

ข้ามการตรวจสอบเจ้าของและสิทธิ์ของพาธคำสั่ง ใช้เฉพาะเมื่อพาธ ได้รับการป้องกันโดยกลไกอื่น

security.installPolicy.exec.allowSymlinkCommandbooleandefault: false

อนุญาตให้พาธคำสั่งที่กำหนดค่าเป็น symlink ได้ เป้าหมายที่ resolve แล้วต้อง ยังผ่านการตรวจสอบพาธอื่น ๆ อาร์กิวเมนต์สคริปต์ interpreter ต้องเป็น ไฟล์ปกติโดยตรง ไม่ใช่ symlink

นโยบายจะรับออบเจ็กต์ JSON หนึ่งรายการทาง stdin พร้อม protocolVersion: 1, openclawVersion, targetType, targetName, sourcePath, sourcePathKind, source แบบมีโครงสร้างที่ไม่บังคับ, origin แบบมีโครงสร้าง และ request นโยบายต้องเขียน ออบเจ็กต์ JSON หนึ่งรายการทาง stdout: { "protocolVersion": 1, "decision": "allow" } หรือ { "protocolVersion": 1, "decision": "block", "reason": "..." } การออกด้วยค่าไม่เป็นศูนย์, timeout, JSON ผิดรูปแบบ, ฟิลด์ขาดหาย หรือเวอร์ชันโปรโตคอลที่ไม่รองรับ จะล้มเหลวแบบปิดกั้น

OpenClaw ไม่เรียกใช้นโยบายการติดตั้งระหว่างการเริ่มต้น Gateway ตามปกติ การติดตั้ง และการอัปเดตจะล้มเหลวแบบปิดกั้นเมื่อนโยบายเปิดใช้อยู่แต่ไม่พร้อมใช้งาน openclaw doctor ทำการตรวจสอบแบบ static และ openclaw doctor --deep เรียกใช้โพรบการติดตั้งจำลอง กับคำสั่งที่กำหนดค่าไว้

การอัปเดตเป็นชุดใช้นโยบายแยกตามเป้าหมาย: การอัปเดตสกิลหรือ Plugin ที่ถูกบล็อกจะล้มเหลว เฉพาะเป้าหมายนั้น โดยไม่ปิดใช้นโยบายหรือข้ามเป้าหมายถัดไปในชุด

ตัวอย่าง stdin:

json
{  "protocolVersion": 1,  "openclawVersion": "2026.6.1",  "targetType": "skill",  "targetName": "weather",  "sourcePath": "/var/folders/.../openclaw-skill-clawhub/root",  "sourcePathKind": "directory",  "source": {    "kind": "clawhub",    "authority": "openclaw",    "mutable": false,    "network": true  },  "origin": {    "type": "clawhub",    "registry": "https://clawhub.openclaw.ai",    "slug": "weather",    "version": "1.0.0"  },  "request": {    "kind": "skill-install",    "mode": "install",    "requestedSpecifier": "clawhub:weather@1.0.0"  },  "skill": {    "installId": "clawhub"  }}

คำสั่งนโยบายขั้นต่ำ:

js
#!/usr/bin/env node let input = "";process.stdin.setEncoding("utf8");process.stdin.on("data", (chunk) => {  input += chunk;});process.stdin.on("end", () => {  const request = JSON.parse(input);  if (request.targetType === "plugin" && request.source?.kind === "local-path") {    process.stdout.write(      JSON.stringify({        protocolVersion: 1,        decision: "block",        reason: "local plugin paths are not approved on this host",      }),    );    return;  }  process.stdout.write(JSON.stringify({ protocolVersion: 1, decision: "allow" }));});

allowlist ของสกิลที่บันเดิลมา

skills.allowBundledstring[]

allowlist แบบไม่บังคับสำหรับสกิลที่ บันเดิลมา เท่านั้น เมื่อตั้งค่าแล้ว เฉพาะสกิลที่บันเดิลมา ในรายการเท่านั้นที่จะมีสิทธิ์ใช้งาน สกิลแบบจัดการ, ระดับเอเจนต์ และ workspace จะไม่ได้รับผลกระทบ

รายการรายสกิล (skills.entries)

คีย์ใต้ entries จะตรงกับ name ของสกิลโดยค่าเริ่มต้น หากสกิลกำหนด metadata.openclaw.skillKey ให้ใช้คีย์นั้นแทน ใส่เครื่องหมายคำพูดครอบชื่อที่มีขีดกลาง (JSON5 อนุญาตให้ใช้คีย์ที่มีเครื่องหมายคำพูด)

OPENCLAW_DOCS_MARKER:paramOpen:IHBhdGg9InNraWxscy5lbnRyaWVzLjxrZXk .enabled" type="boolean"> false ปิดใช้งานสกิลแม้จะถูกบันเดิลหรือติดตั้งแล้ว สกิลที่บันเดิลมา coding-agent เป็นแบบ opt-in ตั้งค่าเป็น true และตรวจสอบให้แน่ใจว่ามี CLI อย่างใดอย่างหนึ่งจาก claude, codex, opencode หรือ CLI อื่นที่รองรับติดตั้งและผ่านการยืนยันตัวตนแล้ว

OPENCLAW_DOCS_MARKER:paramOpen:IHBhdGg9InNraWxscy5lbnRyaWVzLjxrZXk .apiKey" type='string | { source, provider, id }'> ฟิลด์อำนวยความสะดวกสำหรับสกิลที่ประกาศ metadata.openclaw.primaryEnv รองรับสตริง plaintext หรือ SecretRef: { source: "env", provider: "default", id: "VAR_NAME" }

"skills.entries.<key�����r�
"skills.entries.<key�w₫��ܩ

allowlist ของเอเจนต์ (agents)

ใช้การกำหนดค่าเอเจนต์เมื่อคุณต้องการ root สกิลของเครื่อง/workspace เดียวกัน แต่มี ชุดสกิลที่มองเห็นได้แตกต่างกันต่อเอเจนต์

json5
{  agents: {    defaults: {      skills: ["github", "weather"], // shared baseline    },    list: [      { id: "writer" }, // inherits github, weather      { id: "docs", skills: ["docs-search"] }, // replaces defaults entirely      { id: "locked-down", skills: [] }, // no skills    ],  },}
agents.defaults.skillsstring[]

allowlist baseline ที่ใช้ร่วมกัน ซึ่งเอเจนต์ที่ละเว้น agents.list[].skills จะสืบทอด ละเว้นทั้งหมดเพื่อให้สกิลไม่ถูกจำกัดโดยค่าเริ่มต้น

agents.list[].skillsstring[]

ชุดสกิลสุดท้ายที่ระบุชัดเจนสำหรับเอเจนต์นั้น รายการที่ระบุชัดเจนจะ แทนที่ ค่าเริ่มต้นที่สืบทอดมา โดยไม่ merge กัน ตั้งเป็น [] เพื่อไม่เปิดเผยสกิลใด ๆ สำหรับเอเจนต์นั้น

Workshop (skills.workshop)

skills.workshop.autonomous.enabledbooleandefault: false

เมื่อเป็น true เอเจนต์สามารถสร้างข้อเสนอที่รอพิจารณาจากสัญญาณการสนทนาที่คงทน หลังจากเทิร์นสำเร็จ การสร้างสกิลที่ผู้ใช้ร้องขอจะผ่าน Skill Workshop เสมอ ไม่ว่าการตั้งค่านี้จะเป็นอย่างไร

skills.workshop.approvalPolicy"pending" | "auto"default: "pending"

pending ต้องได้รับการอนุมัติจากผู้ปฏิบัติงานก่อนการ apply, reject หรือ quarantine ที่เอเจนต์เริ่มต้น auto อนุญาตการกระทำเหล่านั้นโดยไม่ต้องอนุมัติ

skills.workshop.allowSymlinkTargetWritesbooleandefault: false

อนุญาตให้การ apply ของ Skill Workshop เขียนผ่าน symlink สกิลของ workspace ซึ่ง เป้าหมายจริงได้รับความเชื่อถือแล้วโดย skills.load.allowSymlinkTargets ปิดค่านี้ไว้ เว้นแต่การ apply ข้อเสนอที่สร้างขึ้นควรแก้ไข root สกิลที่ใช้ร่วมกันนั้น

skills.workshop.maxPendingnumberdefault: 50

จำนวนข้อเสนอที่รอดำเนินการและถูกกักกันสูงสุดที่เก็บไว้ต่อ workspace

skills.workshop.maxSkillBytesnumberdefault: 40000

ขนาดสูงสุดของเนื้อหาข้อเสนอเป็นไบต์ คำอธิบายข้อเสนอถูกจำกัดแบบตายตัวไว้ที่ 160 ไบต์ เพราะจะแสดงในเอาต์พุตการค้นพบและการแสดงรายการ

โดยค่าเริ่มต้น รูท Skills ของ workspace, project-agent, extra-dir และแบบ bundled เป็นขอบเขตการกักกัน โฟลเดอร์ Skills แบบ symlink ใต้ <workspace>/skills ที่ resolve ออกไปนอกรูทจะถูกข้ามพร้อมข้อความ log

หากต้องการอนุญาตเลย์เอาต์ symlink โดยตั้งใจ ให้ประกาศเป้าหมายที่เชื่อถือได้:

json5
{  skills: {    load: {      extraDirs: ["~/Projects/manager/skills"],      allowSymlinkTargets: ["~/Projects/manager/skills"],    },  },}

ด้วย config นี้ <workspace>/skills/manager -> ~/Projects/manager/skills จะได้รับการยอมรับ หลังจาก resolve realpath แล้ว extraDirs จะสแกน repo พี่น้องโดยตรง; allowSymlinkTargets จะคง path แบบ symlink ไว้สำหรับเลย์เอาต์ที่มีอยู่

การ apply ของ Skill Workshop จะไม่เขียนผ่าน symlink เหล่านั้นโดยค่าเริ่มต้น หากต้องการให้ Workshop apply แก้ไข Skills ใต้เป้าหมาย symlink ที่เชื่อถือแล้ว ให้เลือกเปิดใช้ แยกต่างหาก:

json5
{  skills: {    load: {      allowSymlinkTargets: ["~/Projects/manager/skills"],    },    workshop: {      allowSymlinkTargetWrites: true,    },  },}

ไดเรกทอรี ~/.openclaw/skills ที่จัดการโดยระบบและไดเรกทอรีส่วนตัว ~/.agents/skills ยอมรับ symlink ของไดเรกทอรี Skills อยู่แล้ว (การกักกัน SKILL.md ต่อ Skill ยังคง มีผล)

Skills แบบ sandbox และ env vars

ส่ง secrets เข้าไปใน Docker sandbox ด้วย:

json5
{  agents: {    defaults: {      sandbox: {        docker: {          env: { GEMINI_API_KEY: "your-key-here" },        },      },    },  },}

การเตือนลำดับการโหลด

text
workspace/skills      (highest)workspace/.agents/skills~/.agents/skills~/.openclaw/skillsbundled skillsskills.load.extraDirs (lowest)

การเปลี่ยนแปลง Skills และ config จะมีผลใน session ใหม่ถัดไปเมื่อเปิดใช้ watcher หรือใน agent turn ถัดไปเมื่อ watcher ตรวจพบการเปลี่ยนแปลง

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

Was this useful?
On this page

On this page