Automation

งานที่กำหนดเวลาไว้

Cron คือตัวกำหนดเวลาในตัวของ Gateway โดยจะจัดเก็บงานแบบถาวร ปลุกเอเจนต์ในเวลาที่เหมาะสม และสามารถส่งผลลัพธ์ไปยังช่องแชต Webhook หรือไม่ส่งไปที่ใดเลย

เริ่มต้นอย่างรวดเร็ว

  • เพิ่มการเตือนแบบครั้งเดียว

    bash
    openclaw cron create "2027-02-01T16:00:00Z" \  --name "การเตือน" \  --session main \  --system-event "การเตือน: ตรวจสอบฉบับร่างเอกสาร cron" \  --wake now \  --delete-after-run
  • ตรวจสอบงานของคุณ

    bash
    openclaw cron listopenclaw cron get <job-id>openclaw cron show <job-id>
  • ดูประวัติการรัน

    bash
    openclaw cron runs --id <job-id>
  • วิธีการทำงานของ cron

    • Cron ทำงาน ภายในกระบวนการ Gateway ไม่ใช่ภายในโมเดล Gateway ต้องทำงานอยู่เพื่อให้กำหนดการเริ่มทำงานได้
    • ข้อกำหนดงาน สถานะรันไทม์ และประวัติการรันจะถูกจัดเก็บอย่างถาวรในฐานข้อมูลสถานะ SQLite ที่ใช้ร่วมกันของ OpenClaw ดังนั้นการเริ่มระบบใหม่จะไม่ทำให้กำหนดการสูญหาย
    • การเรียกใช้ cron แต่ละครั้งจะสร้างระเบียน งานเบื้องหลัง
    • งานแบบครั้งเดียว (--at) จะถูกลบโดยอัตโนมัติหลังจากสำเร็จตามค่าเริ่มต้น ให้ส่ง --keep-after-run เพื่อเก็บงานไว้
    • งบประมาณเวลาตามนาฬิกาสำหรับแต่ละรอบ: --timeout-seconds เมื่อตั้งค่าไว้ มิฉะนั้น งานรอบเอเจนต์แบบแยก/แยกออกจากเซสชันจะถูกจำกัดด้วยตัวเฝ้าระวัง 60 นาทีของ cron ก่อนที่การหมดเวลาของรอบเอเจนต์พื้นฐาน (agents.defaults.timeoutSeconds ค่าเริ่มต้น 48 ชั่วโมง) จะมีผล งานคำสั่งมีค่าเริ่มต้น 10 นาที และเพย์โหลดสคริปต์มีค่าเริ่มต้น 5 นาที
    • เมื่อ Gateway เริ่มทำงาน งานรอบเอเจนต์แบบแยกที่เลยกำหนดจะถูกกำหนดเวลาใหม่แทนการเล่นซ้ำทันที เพื่อไม่ให้งานเริ่มต้นโมเดล/เครื่องมือรบกวนช่วงเชื่อมต่อช่องทาง
    • หากคุณเรียกใช้ openclaw agent จาก cron ของระบบหรือตัวกำหนดเวลาภายนอกอื่น ให้ครอบด้วยการยกระดับเป็นการบังคับยุติ แม้ว่า CLI จะจัดการ SIGTERM/SIGINT อยู่แล้วก็ตาม การรันที่รองรับโดย Gateway จะขอให้ Gateway ยกเลิกการรันที่ยอมรับแล้ว ส่วนการรันสำรองแบบภายในเครื่องและแบบฝังตัวจะได้รับสัญญาณยกเลิกเดียวกัน สำหรับ GNU timeout ให้เลือกใช้ timeout -k 60 600 openclaw agent ... แทน timeout 600 ... แบบธรรมดา — ค่า -k เป็นมาตรการสำรองหากกระบวนการไม่สามารถปิดงานที่ค้างอยู่ได้ทันเวลา สำหรับยูนิต systemd ให้ใช้สัญญาณหยุด SIGTERM พร้อมช่วงผ่อนผัน (TimeoutStopSec) ก่อนการบังคับยุติขั้นสุดท้าย การใช้ --run-id ซ้ำขณะที่การรัน Gateway เดิมยังทำงานอยู่ จะแจ้งว่ารายการซ้ำกำลังดำเนินการอยู่แทนการเริ่มรันครั้งที่สอง
    การเพิ่มความแข็งแกร่งให้การรันแบบแยก
    • เมื่อการรันแบบแยกเสร็จสิ้น ระบบจะพยายามปิดแท็บ/กระบวนการเบราว์เซอร์ที่ติดตามสำหรับเซสชัน cron:<jobId> และกำจัดอินสแตนซ์รันไทม์ MCP ที่รวมมาและสร้างขึ้นสำหรับงาน ผ่านเส้นทางการรื้อถอนร่วมเดียวกับที่ใช้โดยการรันเซสชันหลักและเซสชันแบบกำหนดเอง ระบบจะละเว้นความล้มเหลวในการล้างข้อมูล เพื่อให้ผลลัพธ์ของ cron ยังคงมีผลเหนือกว่า
    • การรันแบบแยกที่ได้รับสิทธิ์จำกัดสำหรับการล้างข้อมูล cron ของตนเอง สามารถอ่านสถานะตัวกำหนดเวลา รายการที่กรองให้มีเฉพาะงานของตนเอง และประวัติการรันของงานนั้น รวมถึงสามารถลบได้เฉพาะงานของตนเองเท่านั้น
    • การรันแบบแยกจะป้องกันการตอบรับที่ล้าสมัย: หากผลลัพธ์แรกเป็นเพียงการอัปเดตสถานะชั่วคราว (on it, pulling everything together และคำบอกใบ้ที่คล้ายกัน) และไม่มีเอเจนต์ย่อยรุ่นถัดไปที่ยังรับผิดชอบคำตอบสุดท้าย OpenClaw จะส่งพรอมต์ซ้ำหนึ่งครั้งเพื่อขอผลลัพธ์จริงก่อนส่งมอบ
    • ระบบจะจดจำข้อมูลเมตาการปฏิเสธการดำเนินการแบบมีโครงสร้าง (รวมถึงตัวครอบ UNAVAILABLE ของโฮสต์ Node ซึ่งข้อผิดพลาดที่ซ้อนอยู่เริ่มต้นด้วย SYSTEM_RUN_DENIED หรือ INVALID_REQUEST) เพื่อไม่ให้รายงานคำสั่งที่ถูกบล็อกว่าเป็นการรันที่สำเร็จ ขณะเดียวกันจะไม่เข้าใจข้อความปกติของผู้ช่วยผิดว่าเป็นการปฏิเสธ
    • ความล้มเหลวของเอเจนต์ระดับการรันจะนับเป็นข้อผิดพลาดของงาน แม้ไม่มีเพย์โหลดตอบกลับ ดังนั้นความล้มเหลวของโมเดล/ผู้ให้บริการจะเพิ่มตัวนับข้อผิดพลาดและเรียกใช้การแจ้งเตือนความล้มเหลว แทนการปิดงานว่าสำเร็จ
    • เมื่องานถึง timeoutSeconds cron จะยกเลิกการรันและให้ช่วงเวลาสั้น ๆ สำหรับล้างข้อมูล หากการรันไม่สามารถปิดงานที่ค้างอยู่ได้ การล้างข้อมูลที่ Gateway เป็นเจ้าของจะบังคับล้างความเป็นเจ้าของเซสชันของการรันนั้น ก่อนที่ cron จะบันทึกการหมดเวลา เพื่อไม่ให้งานแชตในคิวติดค้างอยู่หลังเซสชันประมวลผลที่ล้าสมัย
    • การหยุดค้างระหว่างการตั้งค่า/เริ่มทำงานจะได้รับการหมดเวลาเฉพาะระยะ (เช่น cron: isolated agent setup timed out before runner start หรือ cron: isolated agent run stalled before execution start (last phase: context-engine)) ตัวเฝ้าระวังเหล่านี้ครอบคลุมผู้ให้บริการแบบฝังตัวและแบบรองรับโดย CLI แม้ก่อนกระบวนการ CLI ภายนอกจะเริ่มทำงาน และถูกจำกัดแยกจากค่า timeoutSeconds ที่ยาวนาน เพื่อให้ความล้มเหลวจากการเริ่มระบบเย็น/การยืนยันตัวตน/บริบทปรากฏขึ้นอย่างรวดเร็ว
    การกระทบยอดงาน

    การกระทบยอดงาน cron จะอิงรันไทม์เป็นลำดับแรก และอิงประวัติถาวรเป็นลำดับที่สอง: งาน cron ที่ทำงานอยู่จะยังคงอยู่ตราบใดที่รันไทม์ cron ยังคงติดตามว่างานนั้นกำลังทำงาน แม้ว่ายังมีแถวเซสชันลูกเก่าคงอยู่ก็ตาม เมื่อรันไทม์เลิกเป็นเจ้าของงานและพ้นช่วงผ่อนผัน 5 นาทีแล้ว การตรวจสอบบำรุงรักษาจะตรวจบันทึกการรันและสถานะงานที่จัดเก็บไว้อย่างถาวรสำหรับการรัน cron:<jobId>:<startedAt> ที่ตรงกัน ผลลัพธ์สิ้นสุดในตำแหน่งนั้นจะปิดบัญชีงานให้สมบูรณ์ มิฉะนั้น การบำรุงรักษาที่ Gateway เป็นเจ้าของสามารถทำเครื่องหมายงานเป็น lost ได้ การตรวจสอบ CLI แบบออฟไลน์สามารถกู้คืนจากประวัติถาวรได้ แต่ชุดงานที่ทำงานอยู่ภายในกระบวนการของตัวเองซึ่งว่างเปล่า ไม่ใช่หลักฐานว่าการรันที่ Gateway เป็นเจ้าของหายไปแล้ว

    ประเภทกำหนดการ

    ชนิด แฟล็ก CLI คำอธิบาย
    at --at การประทับเวลาแบบครั้งเดียว (ISO 8601 หรือแบบสัมพัทธ์ เช่น 20m)
    every --every ช่วงเวลาคงที่ (10m, 1h, 1d)
    cron --cron นิพจน์ cron แบบ 5 ฟิลด์หรือ 6 ฟิลด์ พร้อม --tz ซึ่งเป็นตัวเลือก
    on-exit --on-exit เริ่มทำงานหนึ่งครั้งเมื่อคำสั่งที่เฝ้าดูจบการทำงาน (ทริกเกอร์เหตุการณ์; ยังคงอยู่หลังการรื้อถอนรอบ; --on-exit-cwd เป็นตัวเลือก)

    การประทับเวลาที่ไม่มีเขตเวลาจะถือว่าเป็น UTC เพิ่ม --tz America/New_York เพื่อตีความวันเวลาของ --at ที่ไม่มีออฟเซ็ต หรือเพื่อประเมินนิพจน์ cron ในเขตเวลา IANA นั้น นิพจน์ cron ที่ไม่มี --tz จะใช้เขตเวลาของโฮสต์ Gateway ไม่สามารถใช้ --tz ร่วมกับ --every หรือ --on-exit ได้

    นิพจน์แบบเกิดซ้ำเมื่อต้นชั่วโมง (นาที 0 โดยฟิลด์ชั่วโมงเป็นไวลด์การ์ด) จะถูกกระจายเวลาโดยอัตโนมัติสูงสุด 5 นาที เพื่อลดการพุ่งสูงของโหลด ใช้ --exact เพื่อบังคับเวลาที่แม่นยำ หรือ --stagger 30s เพื่อกำหนดช่วงเวลาอย่างชัดเจน (เฉพาะกำหนดการ cron)

    จังหวะแบบไดนามิก (การกำหนดระยะ)

    งานที่เกิดซ้ำสามารถตั้งค่า pacing.min และ/หรือ pacing.max เป็นสตริงระยะเวลา เช่น 15m หรือ 4h โดยต้องกำหนดขอบเขตอย่างน้อยหนึ่งค่า ใช้ --pacing-min และ --pacing-max ร่วมกับ cron add|edit (--clear-pacing จะลบขอบเขตทั้งสอง)

    ระหว่างการรันแบบแยก งานที่กำหนดระยะสามารถเรียกเครื่องมือ cron ด้วย action: "next_check" และ in: "30m" ข้อเสนอจะมีผลเฉพาะกับงานที่กำลังทำงานอยู่ในขณะนั้น และวัดจากเวลาที่การรันเสร็จสมบูรณ์ OpenClaw จะจำกัดค่าให้อยู่ภายในขอบเขตที่กำหนดไว้อย่างเงียบ ๆ

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

    วันของเดือนและวันของสัปดาห์ใช้ตรรกะ OR

    นิพจน์ Cron จะถูกแยกวิเคราะห์โดย croner เมื่อทั้งฟิลด์วันของเดือนและวันของสัปดาห์ไม่ใช่ไวลด์การ์ด croner จะถือว่าตรงกันเมื่อฟิลด์ ใดฟิลด์หนึ่ง ตรงกัน ไม่ใช่ทั้งสองฟิลด์ นี่คือพฤติกรรมมาตรฐานของ Vixie cron

    bash
    # เจตนา: "9 นาฬิกาของวันที่ 15 เฉพาะเมื่อเป็นวันจันทร์"# ผลจริง: "9 นาฬิกาของทุกวันที่ 15 และ 9 นาฬิกาของทุกวันจันทร์"0 9 15 * 1

    กำหนดการนี้จะเริ่มทำงานประมาณ 5-6 ครั้งต่อเดือน แทนที่จะเป็น 0-1 ครั้งต่อเดือน หากต้องการให้ตรงตามเงื่อนไขทั้งสอง ให้ใช้ตัวแก้ไขวันของสัปดาห์ + ของ croner (0 9 15 * +1) หรือกำหนดเวลาตามฟิลด์หนึ่งและตรวจสอบอีกฟิลด์ในพรอมต์หรือคำสั่งของงาน

    ทริกเกอร์เหตุการณ์ (ตัวเฝ้าดูเงื่อนไข)

    ทริกเกอร์เหตุการณ์จะเพิ่มสคริปต์เงื่อนไขแบบไม่มีส่วนติดต่อให้กับกำหนดการ every หรือ cron Cron จะประเมินสคริปต์เมื่อถึงกำหนดของงาน และรันเพย์โหลดปกติเฉพาะเมื่อสคริปต์คืนค่า fire: true:

    json5
    {  schedule: { kind: "every", everyMs: 30000 },  trigger: {    // เริ่มทำงานเฉพาะเมื่อสถานะที่สังเกตได้แตกต่างจากการประเมินครั้งล่าสุด    script: "const res = await tools.call('exec', { command: 'gh pr checks 123 --json state -q \\'.[].state\\' | sort -u' }); const status = String(res?.result?.details?.aggregated ?? '').trim(); json({ fire: status !== trigger.state?.status, message: `CI ของ PR 123: ${trigger.state?.status ?? 'ไม่ทราบ'} -> ${status}`, state: { status } });",    once: false,  },  payload: { kind: "agentTurn", message: "ตรวจสอบการเปลี่ยนแปลงสถานะ CI" },}

    สคริปต์ต้องคืนค่า { fire, message?, state? } สถานะ JSON ก่อนหน้าจะพร้อมใช้งานในรูปแบบ trigger.state ที่ถูกตรึงอย่างลึก ให้คืนค่า state ใหม่เพื่อจัดเก็บอย่างถาวร สถานะถูกจำกัดไว้ที่ 16 KB เมื่อผลลัพธ์ที่เริ่มทำงานมี message cron จะผนวกค่านั้นต่อท้ายข้อความเหตุการณ์ระบบหรือข้อความรอบเอเจนต์ก่อนดำเนินการ once: true จะปิดใช้งานงานหลังจากเพย์โหลดที่เริ่มทำงานครั้งแรกสำเร็จ

    fire: false จะจัดเก็บสถานะการประเมินและตัวนับอย่างถาวร จากนั้นกำหนดเวลาใหม่โดยไม่สร้างประวัติการรัน หากการรันเพย์โหลดที่เริ่มทำงานล้มเหลว state ที่คืนมาจะ ไม่ ถูกจัดเก็บ — การประเมินครั้งถัดไปจะเห็นสถานะก่อนหน้าและสามารถเริ่มทำงานอีกครั้ง ดังนั้นควรเขียนสคริปต์เป็นการตรวจสอบแบบอ่านอย่างเดียว และเก็บการดำเนินการไว้ในเพย์โหลด กำหนดการทริกเกอร์มีช่วงเวลาขั้นต่ำที่กำหนดค่าได้ (ค่าเริ่มต้น 30 วินาที) การประเมินแต่ละครั้งมีงบประมาณเวลาตามนาฬิกา 30 วินาที และเรียกเครื่องมือได้สูงสุด 5 ครั้ง

    ออกแบบตัวเฝ้าดูโดยอิง สถานะที่ดำเนินการได้ ไม่ใช่เฉพาะความสำเร็จ: ตัวเฝ้าดูที่เงียบลงเมื่อการตรวจสอบล้มเหลวหรือหมดเวลา จะดูเหมือนทำงานปกติทั้งที่เสียอยู่ เปรียบเทียบผลการสังเกตกับ trigger.state และคืนสถานะใหม่เพื่อขจัดรายการซ้ำ อย่าพึ่งพาหน่วยความจำของโมเดลหรือกระบวนการ เมื่อเริ่มทำงาน ให้ทำให้ message มีข้อมูลครบถ้วนในตัวเอง เพราะค่านั้นจะกลายเป็นบริบทเหตุการณ์ทั้งหมดของการรันที่เริ่มทำงาน

    สร้างตัวเฝ้าดูจากไฟล์สคริปต์ในเครื่อง (- จะอ่านสคริปต์จาก stdin):

    bash
    openclaw cron add \  --name "ตัวเฝ้าดู CI ของ PR" \  --every 30s \  --trigger-script ./watch-pr-ci.js \  --message "ตอบสนองต่อการเปลี่ยนแปลงสถานะ CI" \  --session isolated

    เพย์โหลด

    ทุกงานมีเพย์โหลดเพียงหนึ่งชนิด ซึ่งเลือกด้วยแฟล็ก:

    เพย์โหลด แฟล็ก การทำงาน
    เหตุการณ์ระบบ --system-event <text> เข้าคิวในเซสชันหลัก โดยไม่เรียกโมเดลด้วยตัวเอง
    ข้อความเอเจนต์ --message <text> รอบการทำงานของเอเจนต์ที่ใช้โมเดล
    คำสั่ง --command <shell> หรือ --command-argv <json> เชลล์/โพรเซสบนโฮสต์ Gateway โดยไม่เรียกโมเดล
    สคริปต์ --script <file|-> สคริปต์โหมดโค้ดแบบไม่มีส่วนติดต่อผู้ใช้ที่ใช้เครื่องมือของเอเจนต์เจ้าของ

    ตัวเลือกรอบการทำงานของเอเจนต์

    --messagestringrequired

    ข้อความพรอมป์ (จำเป็นสำหรับงานเซสชันแบบแยก/ปัจจุบัน/กำหนดเอง)

    --modelstring

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

    --fallbacksstring

    รายการโมเดลสำรองรายงาน เช่น --fallbacks openai/gpt-5.6-sol,openrouter/meta-llama/llama-3.3-70b-instruct:free ส่ง --fallbacks "" สำหรับการทำงานแบบเข้มงวดที่ไม่มีโมเดลสำรอง

    --clear-fallbacksboolean

    เมื่อใช้กับ cron edit จะนำการแทนที่โมเดลสำรองรายงานออก เพื่อให้งานเป็นไปตามลำดับความสำคัญของโมเดลสำรองที่กำหนดค่าไว้ ใช้ร่วมกับ --fallbacks ไม่ได้

    --clear-modelboolean

    เมื่อใช้กับ cron edit จะนำการแทนที่โมเดลรายงานออก เพื่อให้งานเป็นไปตามลำดับความสำคัญปกติของโมเดล Cron (การแทนที่เซสชัน Cron ที่จัดเก็บไว้ หรือโมเดลของเอเจนต์/ค่าเริ่มต้น) ใช้ร่วมกับ --model ไม่ได้

    --thinkingstring

    แทนที่ระดับการคิด (off|minimal|low|medium|high|xhigh|adaptive|max|ultra) ระดับที่ใช้ได้ยังคงขึ้นอยู่กับโมเดลและรันไทม์เอเจนต์ที่เลือก

    --clear-thinkingboolean

    เมื่อใช้กับ cron edit จะนำการแทนที่การคิดรายงานออก ใช้ร่วมกับ --thinking ไม่ได้

    --light-contextboolean

    ข้ามการแทรกไฟล์เริ่มต้นของเวิร์กสเปซ

    --toolsstring

    จำกัดเครื่องมือที่งานสามารถใช้ได้ เช่น --tools exec,read

    --model กำหนดโมเดลหลักของงาน โดยไม่แทนที่การตั้งค่า /model ของเซสชัน ดังนั้นเชนโมเดลสำรองที่กำหนดค่าไว้ยังคงมีผลเพิ่มเติม หากแปลงค่าโมเดลไม่ได้หรือโมเดลไม่ได้รับอนุญาต การทำงานจะล้มเหลวพร้อมข้อผิดพลาดในการตรวจสอบความถูกต้องที่ชัดเจน แทนที่จะถอยกลับไปใช้ค่าเริ่มต้นโดยไม่มีการแจ้งเตือน หากงานมี --model แต่ไม่มีรายการโมเดลสำรองแบบชัดเจนหรือที่กำหนดค่าไว้ OpenClaw จะส่งการแทนที่โมเดลสำรองแบบว่าง แทนที่จะแอบเพิ่มโมเดลหลักของเอเจนต์เป็นเป้าหมายลองใหม่

    ลำดับความสำคัญในการเลือกโมเดลสำหรับงานแบบแยก จากสูงสุดก่อน:

    1. เพย์โหลดรายงาน model (การกำหนดค่าแบบชัดเจน หากโมเดลไม่ได้รับอนุญาต การทำงานจะล้มเหลว)
    2. การแทนที่โมเดลจากฮุก Gmail (เฉพาะเมื่อการทำงานมาจาก Gmail และการแทนที่นั้นได้รับอนุญาต)
    3. การแทนที่โมเดลของเซสชัน Cron ที่จัดเก็บไว้และผู้ใช้เลือก
    4. การเลือกโมเดลของเอเจนต์/ค่าเริ่มต้น

    โหมดเร็วเป็นไปตามการเลือกแบบสดที่แปลงค่าแล้ว หากการกำหนดค่าโมเดลที่เลือกมี params.fastMode งาน Cron แบบแยกจะใช้ค่านั้นเป็นค่าเริ่มต้น แต่การแทนที่ fastMode ที่จัดเก็บไว้ในเซสชัน (จากนั้นคือ fastModeDefault ของเอเจนต์) ยังคงมีลำดับความสำคัญเหนือการกำหนดค่าโมเดลได้ทั้งสองทิศทาง โหมดอัตโนมัติใช้เกณฑ์ตัด params.fastAutoOnSeconds ของโมเดล โดยมีค่าเริ่มต้นเป็น 60 วินาที

    หากการทำงานพบการส่งต่อจากการสลับโมเดลแบบสด Cron จะลองใหม่ด้วยผู้ให้บริการ/โมเดลที่สลับแล้ว และบันทึกการเลือกนั้น (รวมถึงโปรไฟล์การยืนยันตัวตนใหม่ หากมี) สำหรับการทำงานที่กำลังดำเนินอยู่ จำนวนการลองใหม่มีขีดจำกัด โดยหลังจากความพยายามครั้งแรกและการลองใหม่จากการสลับ 2 ครั้ง Cron จะยกเลิกแทนที่จะวนซ้ำ

    ก่อนเริ่มการทำงานแบบแยก OpenClaw จะตรวจสอบเอนด์พอยต์ภายในที่เข้าถึงได้สำหรับผู้ให้บริการ api: "ollama" และ api: "openai-completions" ที่กำหนดค่าไว้ ซึ่ง baseUrl เป็นลูปแบ็ก เครือข่ายส่วนตัว หรือ .local การตรวจสอบล่วงหน้านี้จะไล่ตามเชนโมเดลสำรองที่กำหนดค่าไว้ของงาน และจะทำเครื่องหมายการทำงานเป็น skipped ก็ต่อเมื่อผู้สมัครทั้งหมดเข้าถึงไม่ได้ ส่วน --fallbacks "" จะจำกัดการไล่ตรวจสอบอย่างเข้มงวดให้เหลือเฉพาะโมเดลหลัก เอนด์พอยต์ที่ใช้งานไม่ได้จะบันทึกการทำงานเป็น skipped พร้อมข้อผิดพลาดที่ชัดเจน แทนที่จะเริ่มเรียกโมเดล ผลลัพธ์จะถูกแคชเป็นเวลา 5 นาทีต่อเอนด์พอยต์ (ไม่ใช่ต่องานหรือโมเดล) ดังนั้นงานจำนวนมากที่ถึงกำหนดและใช้เซิร์ฟเวอร์ Ollama/vLLM/SGLang/LM Studio ภายในที่หยุดทำงานร่วมกัน จะมีค่าใช้จ่ายเพียงการตรวจสอบหนึ่งครั้งแทนที่จะเกิดคำขอจำนวนมากพร้อมกัน การทำงานที่ข้ามเนื่องจากการตรวจสอบล่วงหน้าจะไม่เพิ่มการหน่วงเวลาหลังข้อผิดพลาดในการดำเนินการ ตั้งค่า failureAlert.includeSkipped เพื่อเลือกรับการแจ้งเตือนการข้ามซ้ำ

    เพย์โหลดคำสั่ง

    เพย์โหลดคำสั่งเรียกใช้สคริปต์แบบกำหนดผลลัพธ์ได้ภายในตัวจัดกำหนดการของ Gateway โดยไม่เริ่มรอบการทำงานที่ใช้โมเดล สคริปต์ทำงานบนโฮสต์ Gateway บันทึก stdout/stderr บันทึกการทำงานไว้ในประวัติ Cron และใช้โหมดการนำส่ง announce, webhook และ none แบบเดียวกับงานรอบการทำงานของเอเจนต์

    bash
    openclaw cron create "*/15 * * * *" \  --name "Queue depth probe" \  --command "scripts/check-queue.sh" \  --command-cwd "/srv/app" \  --announce \  --channel telegram \  --to "-1001234567890"

    --command <shell> จัดเก็บ argv: ["sh", "-lc", <shell>] ใช้ --command-argv '["node","scripts/report.mjs"]' สำหรับการดำเนินการ argv แบบตรงตัวโดยไม่มีการแยกวิเคราะห์ของเชลล์ ตัวเลือกเสริม --command-env KEY=VALUE (ระบุซ้ำได้), --command-input, --timeout-seconds (ค่าเริ่มต้น 10 นาที), --no-output-timeout-seconds และ --output-max-bytes ใช้ควบคุมสภาพแวดล้อมของโพรเซส stdin และขอบเขตเอาต์พุต

    ข้อความที่นำส่งจะได้มาจากเอาต์พุตของโพรเซส โดย stdout ที่ไม่ว่างจะมีลำดับความสำคัญ หาก stdout ว่างและ stderr ไม่ว่าง ระบบจะนำส่ง stderr หากมีทั้งสองอย่าง Cron จะส่งบล็อก stdout: / stderr: ขนาดเล็ก รหัสออก 0 จะบันทึกการทำงานเป็น ok ส่วนรหัสออกที่ไม่ใช่ศูนย์ สัญญาณ หมดเวลา หรือหมดเวลาเนื่องจากไม่มีเอาต์พุต จะบันทึกเป็น error และอาจทริกเกอร์การแจ้งเตือนความล้มเหลว คำสั่งที่พิมพ์เพียง NO_REPLY จะใช้การระงับโทเค็นเงียบตามปกติของ Cron และไม่โพสต์สิ่งใดกลับไปยังแชต

    เพย์โหลดสคริปต์

    เพย์โหลดสคริปต์ทำงานแบบไม่มีส่วนติดต่อผู้ใช้ในตัวดำเนินการโหมดโค้ดเดียวกับสคริปต์ทริกเกอร์ โดยไม่เริ่มรอบการสนทนาของเอเจนต์ เปิดใช้ cron.triggers.enabled ก่อนสร้างหรือเรียกใช้ โดยเกตระบบอัตโนมัติที่เป็นอันตรายนี้ครอบคลุมทั้งสคริปต์ทริกเกอร์และเพย์โหลดสคริปต์ งานสคริปต์รองรับเฉพาะเป้าหมายเซสชัน main และ isolated

    bash
    openclaw cron create "0 * * * *" \  --name "Hourly queue check" \  --script ./automation/check-queue.js \  --script-timeout-seconds 300 \  --script-tool-budget 50 \  --session isolated \  --announce

    ใช้ --script <file|-> เพื่ออ่าน JavaScript จากไฟล์หรือ stdin ค่าหมดเวลามีค่าเริ่มต้นเป็น 300 วินาทีและจำกัดสูงสุดที่ 900 ส่วนงบประมาณเครื่องมือมีค่าเริ่มต้นเป็น 50 การเรียกและจำกัดสูงสุดที่ 200 งบประมาณเพย์โหลดเหล่านี้แยกจากงบประมาณการประเมินเกตทริกเกอร์ที่มีขนาดเล็กกว่า

    สคริปต์อาจส่งคืนอ็อบเจ็กต์ที่มีฟิลด์เสริมต่อไปนี้:

    • notify: ข้อความที่นำส่งผ่านโหมดการนำส่ง announce, webhook หรือ none ของงาน หากละไว้ จะไม่มีการนำส่งใด ๆ สำหรับงาน main ข้อความจะกลายเป็นเหตุการณ์ระบบ
    • wake: "now" ร้องขอ Heartbeat ทันทีหลังจากนำ notify (หรือเหตุการณ์เสร็จสิ้นแบบย่อ) เข้าคิว ส่วน "next-heartbeat" จะนำเหตุการณ์เข้าคิวสำหรับ Heartbeat ครั้งถัดไป
    • state: สถานะ JSON จำกัดที่ 16 KB และบันทึกถาวรหลังจากการทำงานสำเร็จเท่านั้น การทำงานครั้งถัดไปจะได้รับสำเนาแบบตรึงเป็น trigger.state ซึ่งสอดคล้องกับสคริปต์ทริกเกอร์ เนื่องจากเนมสเปซนั้นมีเจ้าของสถานะถาวรเพียงรายเดียว เพย์โหลดสคริปต์จึงไม่สามารถใช้ร่วมกับทริกเกอร์แบบมีเงื่อนไขในงานเดียวกันได้
    • nextCheck: ระยะเวลา เช่น "15m" ใช้ได้เฉพาะกับงานที่เปิดใช้การกำหนดจังหวะ และใช้ขีดจำกัดการกำหนดจังหวะเดียวกับข้อเสนอของรอบการทำงานเอเจนต์

    การโยนข้อผิดพลาด การหมดเวลา งบประมาณเครื่องมือหมด ผลลัพธ์ไม่ถูกต้อง และ nextCheck ที่ไม่มีการกำหนดจังหวะ ล้วนเป็นข้อผิดพลาดการทำงาน Cron ตามปกติ โดยจะเข้าสู่ประวัติการทำงาน การหน่วงเวลาหลังข้อผิดพลาด และการจัดการการแจ้งเตือนความล้มเหลว โดยไม่บันทึกสถานะที่ส่งคืนไว้อย่างถาวร

    รูปแบบการดำเนินการ

    รูปแบบ ค่า --session ทำงานใน เหมาะที่สุดสำหรับ
    เซสชันหลัก main เลนปลุก Cron โดยเฉพาะ การเตือนความจำ เหตุการณ์ระบบ
    แบบแยก isolated cron:<jobId> โดยเฉพาะ รายงาน งานเบื้องหลัง
    เซสชันปัจจุบัน current ผูกไว้เมื่อสร้าง งานประจำที่ตระหนักถึงบริบท
    เซสชันกำหนดเอง session:custom-id เซสชันที่มีชื่อและคงอยู่ถาวร เวิร์กโฟลว์ที่ต่อยอดจากประวัติ
    เซสชันหลัก เทียบกับ แบบแยก เทียบกับ กำหนดเอง

    งาน เซสชันหลัก จะนำเหตุการณ์ระบบเข้าคิวในเลนการทำงานที่ Cron เป็นเจ้าของ และปลุก Heartbeat หรือไม่ก็ได้ (--wake now หรือ --wake next-heartbeat) งานสามารถใช้บริบทการนำส่งล่าสุดของเซสชันหลักเป้าหมายสำหรับการตอบกลับได้ แต่จะไม่เพิ่มรอบ Cron ตามปกติลงในเลนแชตของมนุษย์ และไม่ต่ออายุความใหม่ของการรีเซ็ตรายวัน/เมื่อไม่มีการใช้งานสำหรับเซสชันเป้าหมาย งาน แบบแยก จะเรียกใช้รอบการทำงานเอเจนต์โดยเฉพาะด้วยเซสชันใหม่ ส่วน เซสชันกำหนดเอง (session:xxx) จะเก็บรักษาบริบทข้ามการทำงาน ทำให้ใช้เวิร์กโฟลว์อย่างการประชุมรายวันแบบยืนที่ต่อยอดจากสรุปก่อนหน้าได้

    เหตุการณ์ Cron ของเซสชันหลักเป็นการเตือนความจำแบบเหตุการณ์ระบบที่สมบูรณ์ในตัวเอง โดยจะไม่รวมคำสั่ง "Read HEARTBEAT.md" จากพรอมป์ Heartbeat เริ่มต้นโดยอัตโนมัติ หากการเตือนความจำควรตรวจสอบ HEARTBEAT.md ให้ระบุอย่างชัดเจนในข้อความเหตุการณ์ Cron

    ความหมายของ 'เซสชันใหม่' สำหรับงานแบบแยก

    แต่ละการทำงานจะมีทรานสคริปต์/รหัสเซสชันใหม่ OpenClaw จะส่งต่อค่ากำหนดที่ปลอดภัย (การตั้งค่าการคิด/เร็ว/ละเอียด ป้ายกำกับ การแทนที่โมเดล/การยืนยันตัวตนที่ผู้ใช้เลือกอย่างชัดเจน) แต่จะไม่สืบทอดบริบทการสนทนาแวดล้อมจากแถว Cron เก่า ได้แก่ การกำหนดเส้นทางช่องทาง/กลุ่ม นโยบายการส่งหรือการเข้าคิว การยกระดับ แหล่งที่มา หรือการผูกรันไทม์ ACP ใช้ current หรือ session:<id> เมื่อต้องการให้งานประจำต่อยอดจากบริบทการสนทนาเดิมโดยตั้งใจ

    สัญญาการทำงานแบบไม่มีผู้ดูแล

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

    สำหรับงานตามกำหนดเวลาที่เชื่อถือได้ คำสั่งของงานเองจะมีลำดับความสำคัญเมื่อจงใจขอคำถามหรือแผน และเอเจนต์อาจลบงานที่ไม่จำเป็นอีกต่อไป รอบการทำงานจากฮุกภายนอกจะได้รับเฉพาะสัญญาการทำงานแบบไม่มีผู้ดูแลร่วมกัน โดยจะไม่ได้รับการแทนที่หรือคำแนะนำให้ลบตัวเองนี้ข้ามขอบเขตเนื้อหาภายนอก

    การนำส่งของเอเจนต์ย่อยและ Discord

    เมื่อการทำงาน Cron แบบแยกประสานงานเอเจนต์ย่อย การนำส่งจะให้ความสำคัญกับเอาต์พุตสุดท้ายของผู้สืบทอดมากกว่าข้อความชั่วคราวเก่าของเอเจนต์แม่ หากผู้สืบทอดยังทำงานอยู่ OpenClaw จะระงับการอัปเดตบางส่วนจากเอเจนต์แม่แทนที่จะประกาศ

    สำหรับเป้าหมายการประกาศ Discord ที่เป็นข้อความล้วน OpenClaw จะส่งข้อความสุดท้ายมาตรฐานจากผู้ช่วยเพียงครั้งเดียว แทนการส่งซ้ำทั้งข้อความแบบสตรีม/ระหว่างดำเนินการและคำตอบสุดท้าย ส่วนสื่อและเพย์โหลด Discord แบบมีโครงสร้างยังคงถูกส่งแยกกัน เพื่อไม่ให้ไฟล์แนบและคอมโพเนนต์สูญหาย

    การนำส่งและเอาต์พุต

    โหมด สิ่งที่เกิดขึ้น
    announce นำส่งข้อความสุดท้ายไปยังเป้าหมายเป็นทางเลือกสำรอง หากเอเจนต์ไม่ได้ส่ง
    webhook POST เพย์โหลดเหตุการณ์เมื่อเสร็จสิ้นไปยัง URL
    none ไม่มีการนำส่งสำรองจากตัวรัน

    ใช้ --announce --channel telegram --to "-1001234567890" สำหรับการนำส่งผ่านช่องทาง สำหรับหัวข้อฟอรัม Telegram ให้ใช้ -1001234567890:topic:123; OpenClaw ยังรองรับรูปแบบย่อ -1001234567890:123 ที่ Telegram เป็นเจ้าของด้วย ผู้เรียก RPC/การกำหนดค่าโดยตรงสามารถส่ง delivery.threadId เป็นสตริงหรือตัวเลขได้ เป้าหมาย Slack/Discord/Mattermost ใช้คำนำหน้าที่ระบุชัดเจน (channel:<id>, user:<id>) ID ห้อง Matrix แยกตัวพิมพ์เล็กและใหญ่ ให้ใช้ ID ห้องที่ตรงกันทุกประการหรือรูปแบบ room:!room:server จาก Matrix

    เมื่อการนำส่งประกาศใช้ channel: "last" หรือละเว้น channel เป้าหมายที่มีคำนำหน้าผู้ให้บริการ เช่น telegram:123 สามารถเลือกช่องทางได้ ก่อนที่ cron จะย้อนกลับไปใช้ประวัติเซสชันหรือช่องทางเดียวที่กำหนดค่าไว้ มีเพียงคำนำหน้าที่ Plugin ซึ่งโหลดอยู่ประกาศไว้เท่านั้นที่เป็นตัวเลือกผู้ให้บริการ หากระบุ delivery.channel อย่างชัดเจน คำนำหน้าเป้าหมายต้องระบุผู้ให้บริการเดียวกัน โดย channel: "whatsapp" ร่วมกับ to: "telegram:123" จะถูกปฏิเสธ แทนที่จะปล่อยให้ WhatsApp ตีความ ID Telegram เป็นหมายเลขโทรศัพท์ คำนำหน้าประเภทเป้าหมายและบริการ (channel:<id>, user:<id>, imessage:<handle>, sms:<number>) ยังคงเป็นไวยากรณ์เป้าหมายที่ช่องทางเป็นเจ้าของ ไม่ใช่ตัวเลือกผู้ให้บริการ

    สำหรับงานแบบแยก การนำส่งแชตจะใช้ร่วมกัน หากมีเส้นทางแชต เอเจนต์สามารถใช้เครื่องมือ message ได้แม้ใช้ --no-deliver หากเอเจนต์ส่งไปยังเป้าหมายที่กำหนดค่าไว้/เป้าหมายปัจจุบัน OpenClaw จะข้ามการประกาศสำรอง มิฉะนั้น announce, webhook และ none จะควบคุมเฉพาะสิ่งที่ตัวรันทำกับคำตอบสุดท้ายหลังจบรอบของเอเจนต์

    เมื่อเอเจนต์สร้างการแจ้งเตือนแบบแยกจากแชตที่กำลังใช้งาน OpenClaw จะจัดเก็บเป้าหมายการนำส่งแบบสดที่เก็บรักษาไว้สำหรับเส้นทางประกาศสำรอง คีย์เซสชันภายในอาจเป็นตัวพิมพ์เล็ก แต่จะไม่มีการสร้างเป้าหมายการนำส่งของผู้ให้บริการขึ้นใหม่จากคีย์เหล่านั้นเมื่อมีบริบทแชตปัจจุบัน

    การนำส่งประกาศโดยนัยใช้รายการอนุญาตของช่องทางที่กำหนดค่าไว้เพื่อตรวจสอบความถูกต้องและเปลี่ยนเส้นทางเป้าหมายที่ล้าสมัย การอนุมัติจากที่เก็บการจับคู่ DM ไม่ใช่ผู้รับของระบบอัตโนมัติสำรอง ให้ตั้งค่า delivery.to หรือกำหนดค่ารายการ allowFrom ของช่องทาง เมื่องานตามกำหนดเวลาควรส่งไปยัง DM เชิงรุก

    การแจ้งเตือนความล้มเหลว

    การแจ้งเตือนความล้มเหลวใช้เส้นทางปลายทางแยกต่างหาก:

    • cron.failureDestination ตั้งค่าเริ่มต้นส่วนกลางสำหรับการแจ้งเตือนความล้มเหลว
    • job.delivery.failureDestination เขียนทับค่านั้นเป็นรายงาน
    • หากไม่ได้ตั้งค่าทั้งสองรายการและงานนำส่งผ่าน announce อยู่แล้ว การแจ้งเตือนความล้มเหลวจะย้อนกลับไปใช้เป้าหมายประกาศหลักนั้น
    • delivery.failureDestination รองรับเฉพาะงาน sessionTarget="isolated" เว้นแต่โหมดการนำส่งหลักจะเป็น webhook
    • failureAlert.includeSkipped: true เลือกให้งานหรือนโยบายการแจ้งเตือน cron ส่วนกลางส่งการแจ้งเตือนเมื่อข้ามการทำงานซ้ำ งานที่ถูกข้ามจะมีตัวนับการข้ามติดต่อกันแยกต่างหาก จึงไม่ส่งผลต่อการหน่วงแบบถอยกลับเมื่อเกิดข้อผิดพลาดในการดำเนินการ
    • openclaw cron edit เปิดให้ปรับแต่งการแจ้งเตือนเป็นรายงาน ได้แก่ --failure-alert/--no-failure-alert, --failure-alert-after <n>, --failure-alert-channel, --failure-alert-to, --failure-alert-cooldown, --failure-alert-include-skipped/--failure-alert-exclude-skipped, --failure-alert-mode และ --failure-alert-account-id

    ภาษาของเอาต์พุต

    งาน Cron จะไม่อนุมานภาษาสำหรับตอบกลับจากช่องทาง โลแคล หรือข้อความก่อนหน้า ให้ใส่กฎด้านภาษาไว้ในข้อความหรือเทมเพลตตามกำหนดเวลา:

    bash
    openclaw cron edit <jobId> \  --message "สรุปการอัปเดต ตอบเป็นภาษาจีน โดยคง URL, โค้ด และชื่อผลิตภัณฑ์ไว้เหมือนเดิม"

    สำหรับไฟล์เทมเพลต ให้คงคำสั่งด้านภาษาไว้ในพรอมต์ที่เรนเดอร์แล้ว และตรวจสอบว่าตัวยึดตำแหน่ง เช่น {{language}} ถูกเติมค่าก่อนงานทำงาน หากเอาต์พุตมีหลายภาษาปะปนกัน ให้ระบุกฎอย่างชัดเจน เช่น: "ใช้ภาษาจีนสำหรับข้อความบรรยายและคงศัพท์เทคนิคเป็นภาษาอังกฤษ"

    ตัวอย่าง CLI

    การแจ้งเตือนแบบครั้งเดียว

    bash
    openclaw cron add \  --name "ตรวจสอบปฏิทิน" \  --at "20m" \  --session main \  --system-event "Heartbeat ครั้งถัดไป: ตรวจสอบปฏิทิน" \  --wake now

    งานแบบแยกที่เกิดซ้ำ

    bash
    openclaw cron create "0 7 * * *" \  "สรุปการอัปเดตข้ามคืน" \  --name "สรุปช่วงเช้า" \  --tz "America/Los_Angeles" \  --session isolated \  --announce \  --channel slack \  --to "channel:C1234567890"

    เขียนทับโมเดลและการคิด

    bash
    openclaw cron add \  --name "การวิเคราะห์เชิงลึก" \  --cron "0 6 * * 1" \  --tz "America/Los_Angeles" \  --session isolated \  --message "การวิเคราะห์เชิงลึกรายสัปดาห์เกี่ยวกับความคืบหน้าของโครงการ" \  --model "opus" \  --thinking high \  --announce

    เอาต์พุต Webhook

    bash
    openclaw cron create "0 18 * * 1-5" \  "สรุปการปรับใช้ของวันนี้เป็น JSON" \  --name "สรุปการปรับใช้" \  --webhook "https://example.invalid/openclaw/cron"

    เอาต์พุตคำสั่ง

    bash
    openclaw cron create "*/15 * * * *" \  --name "โพรบความลึกของคิว" \  --command "scripts/check-queue.sh" \  --command-cwd "/srv/app" \  --announce \  --channel telegram \  --to "-1001234567890"

    การจัดการงาน

    bash
    # แสดงงานทั้งหมดopenclaw cron list # รับงานที่จัดเก็บไว้หนึ่งงานเป็น JSONopenclaw cron get <jobId> # แสดงงานหนึ่งงาน รวมถึงเส้นทางการนำส่งที่แก้ค่าแล้วopenclaw cron show <jobId> # เปิด/ปิดใช้งานโดยไม่ลบopenclaw cron enable <jobId>openclaw cron disable <jobId> # แก้ไขงานopenclaw cron edit <jobId> --message "พรอมต์ที่อัปเดตแล้ว" --model "opus" # บังคับเรียกใช้งานทันทีopenclaw cron run <jobId> # บังคับเรียกใช้งานทันทีและรอสถานะสิ้นสุดopenclaw cron run <jobId> --wait --wait-timeout 10m --poll-interval 2s # เรียกใช้เฉพาะเมื่อถึงกำหนดopenclaw cron run <jobId> --due # ดูประวัติการทำงานopenclaw cron runs --id <jobId> --limit 50 # ดูการทำงานที่ตรงกันหนึ่งรายการopenclaw cron runs --id <jobId> --run-id <runId> # ลบงานopenclaw cron remove <jobId> # การเลือกเอเจนต์ (การตั้งค่าแบบหลายเอเจนต์)openclaw cron create "0 6 * * *" "ตรวจสอบคิวปฏิบัติการ" --name "กวาดตรวจปฏิบัติการ" --session isolated --agent opsopenclaw cron edit <jobId> --clear-agent

    การเก็บเซสชันเข้าคลัง (ผ่าน Control UI หรือ sessions.patch { archived: true } จากผู้เรียกที่เป็นผู้ดูแลระบบของผู้ปฏิบัติงาน) จะปิดใช้งานงาน cron ที่เปิดใช้งานอยู่ทั้งหมดซึ่งผูกกับเซสชันนั้น ได้แก่ เซสชัน cron:<jobId> แบบแยก เป้าหมาย session:<key> หรือเลนการนำส่ง/ปลุก sessionKey การกู้คืนเซสชันจะไม่เปิดใช้งานงานเหล่านั้นอีกครั้ง ให้ใช้ openclaw cron enable <jobId> เซสชันที่มีงานที่ผูกไว้และเปิดใช้งานอยู่จะแสดงป้ายรูปนาฬิกาในแถบด้านข้างของ Control UI

    openclaw cron run <jobId> จะส่งคืนหลังจากเพิ่มการทำงานด้วยตนเองลงในคิว ใช้ --wait สำหรับฮุกปิดระบบ สคริปต์บำรุงรักษา หรือระบบอัตโนมัติอื่นที่ต้องบล็อกจนกว่าการทำงานในคิวจะเสร็จสิ้น โดยจะสำรวจ runId ที่ส่งคืนมา (ระยะหมดเวลาเริ่มต้น 10m, ช่วงเวลาสำรวจ 2s) และออกด้วย 0 สำหรับสถานะ ok และออกด้วยค่าที่ไม่ใช่ศูนย์สำหรับ error, skipped หรือการรอหมดเวลา

    เครื่องมือ cron ของเอเจนต์ส่งคืนสรุปงานแบบกระชับ (id, name, enabled, nextRunAtMs, scheduleKind, lastRunStatus) จาก cron(action: "list"); ใช้ cron(action: "get", jobId: "...") สำหรับคำจำกัดความงานแบบเต็มหนึ่งรายการ ผู้เรียก Gateway โดยตรงสามารถส่ง compact: true ไปยัง cron.list; การละเว้นค่านี้จะคงการตอบกลับแบบเต็มพร้อมตัวอย่างการนำส่ง

    openclaw cron create เป็นนามแฝงของ openclaw cron add งานใหม่สามารถใช้กำหนดการแบบระบุตำแหน่ง ("0 9 * * 1", "every 1h", "20m" หรือการประทับเวลา ISO) ตามด้วยพรอมต์เอเจนต์แบบระบุตำแหน่ง ใช้ --webhook <url> กับ cron add|create หรือ cron edit เพื่อ POST เพย์โหลดการทำงานที่เสร็จสิ้นแล้วไปยังปลายทาง HTTP; การนำส่ง Webhook ไม่สามารถใช้ร่วมกับแฟล็กการนำส่งแชต (--announce, --channel, --to, --thread-id, --account) สำหรับ cron edit, --clear-channel, --clear-to, --clear-thread-id และ --clear-account ให้ยกเลิกการตั้งค่าฟิลด์การกำหนดเส้นทางเหล่านั้นทีละรายการ (แต่ละรายการจะถูกปฏิเสธหากใช้ร่วมกับแฟล็กตั้งค่าที่ตรงกัน) ซึ่งต่างจาก --no-deliver ที่ปิดใช้งานเฉพาะการนำส่งสำรองของตัวรัน

    Webhook

    Gateway สามารถเปิดเผยปลายทาง HTTP Webhook สำหรับทริกเกอร์ภายนอก เปิดใช้งานในการกำหนดค่า:

    json5
    {  hooks: {    enabled: true,    token: "shared-secret",    path: "/hooks",  },}

    การยืนยันตัวตน

    ทุกคำขอต้องมีโทเค็นฮุกผ่านส่วนหัว:

    • Authorization: Bearer <token> (แนะนำ)
    • x-openclaw-token: <token>

    โทเค็นในสตริงคิวรีจะถูกปฏิเสธ

    POST /hooks/wake

    เพิ่มเหตุการณ์ระบบลงในคิวสำหรับเซสชันหลัก:

    bash
    curl -X POST http://127.0.0.1:18789/hooks/wake \  -H 'Authorization: Bearer SECRET' \  -H 'Content-Type: application/json' \  -d '{"text":"ได้รับอีเมลใหม่","mode":"now"}'
    textstringrequired

    คำอธิบายเหตุการณ์

    modestringdefault: now

    now หรือ next-heartbeat

    POST /hooks/agent

    เรียกใช้รอบของเอเจนต์แบบแยก:

    bash
    curl -X POST http://127.0.0.1:18789/hooks/agent \  -H 'Authorization: Bearer SECRET' \  -H 'Content-Type: application/json' \  -d '{"message":"สรุปกล่องขาเข้า","name":"อีเมล","model":"openai/gpt-5.6-sol"}'

    ฟิลด์: message (จำเป็น), name, agentId, sessionKey (ต้องใช้ hooks.allowRequestSessionKey=true), idempotencyKey, wakeMode, deliver, channel, to, model, thinking, timeoutSeconds.

    OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSLguK7guLjguIHguJfguLXguYjguYHguKHguJvguYTguKfguYkgKFBPU1QgL2hvb2tzLzxuYW1l )"> ชื่อฮุกแบบกำหนดเองจะถูกแปลงผ่าน hooks.mappings ในการกำหนดค่า การแมปสามารถแปลงเพย์โหลดใดๆ เป็นการดำเนินการ wake หรือ agent ด้วยเทมเพลตหรือการแปลงด้วยโค้ด

    การผสานรวม Gmail PubSub

    เชื่อมทริกเกอร์กล่องจดหมาย Gmail เข้ากับ OpenClaw ผ่าน Google PubSub

    การตั้งค่าด้วยตัวช่วยสร้าง (แนะนำ)

    bash
    openclaw webhooks gmail setup --account openclaw@gmail.com

    คำสั่งนี้จะเขียนการกำหนดค่า hooks.gmail, เปิดใช้ค่าที่ตั้งไว้ล่วงหน้าสำหรับ Gmail และกำหนดค่าเริ่มต้นเป็น Tailscale Funnel สำหรับตำแหน่งข้อมูลพุช (--tailscale funnel|serve|off)

    การเริ่ม Gateway โดยอัตโนมัติ

    เมื่อตั้งค่า hooks.enabled=true และ hooks.gmail.account แล้ว Gateway จะเริ่ม gog gmail watch serve ระหว่างการบูตและต่ออายุการเฝ้าดูโดยอัตโนมัติ ตั้งค่า OPENCLAW_SKIP_GMAIL_WATCHER=1 เพื่อเลือกไม่ใช้

    การตั้งค่าด้วยตนเองครั้งเดียว

  • เลือกโปรเจกต์ GCP

    เลือกโปรเจกต์ GCP ที่เป็นเจ้าของไคลเอ็นต์ OAuth ซึ่ง gog ใช้:

    bash
    gcloud auth logingcloud config set project <project-id>gcloud services enable gmail.googleapis.com pubsub.googleapis.com
  • สร้างหัวข้อและให้สิทธิ์การเข้าถึงพุชแก่ Gmail

    bash
    gcloud pubsub topics create gog-gmail-watchgcloud pubsub topics add-iam-policy-binding gog-gmail-watch \  --member=serviceAccount:gmail-api-push@system.gserviceaccount.com \  --role=roles/pubsub.publisher
  • เริ่มการเฝ้าดู

    bash
    gog gmail watch start \  --account openclaw@gmail.com \  --label INBOX \  --topic projects/<project-id>/topics/gog-gmail-watch
  • การแทนที่โมเดลสำหรับ Gmail

    json5
    {  hooks: {    gmail: {      model: "openai/gpt-5.6-sol",      thinking: "high",    },  },}

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

    การกำหนดค่า

    json5
    {  cron: {    enabled: true,    store: "~/.openclaw/cron/jobs.json",    triggers: {      enabled: false,    },    webhookToken: "replace-with-dedicated-webhook-token",    sessionRetention: "24h",  },}

    webhookToken จะถูกส่งเป็น Authorization: Bearer <token> ในคำขอ POST ของ Webhook Cron

    cron.store เป็นคีย์ที่เก็บข้อมูลเชิงตรรกะและพาธการย้ายข้อมูลของ doctor ไม่ใช่ไฟล์ JSON ที่ใช้งานอยู่สำหรับแก้ไขด้วยตนเอง ข้อมูลงานอยู่ใน SQLite ให้ใช้ CLI หรือ API ของ Gateway เพื่อแก้ไข

    ปิดใช้ Cron: cron.enabled: false หรือ OPENCLAW_SKIP_CRON=1

    ลักษณะการลองใหม่

    การลองใหม่สำหรับงานครั้งเดียว: ข้อผิดพลาดชั่วคราว (ขีดจำกัดอัตรา, โหลดเกิน, เครือข่าย, หมดเวลา, ข้อผิดพลาดของเซิร์ฟเวอร์) จะใช้กำหนดการลองใหม่ในตัว ข้อผิดพลาดถาวรจะปิดใช้งานงานทันที

    การลองใหม่สำหรับงานที่เกิดซ้ำ: ข้อผิดพลาดในการดำเนินการต่อเนื่องจะเพิ่มระยะหน่วงตามกำหนดการแบบขยาย (30s, 60s, 5m, 15m, 60m) ระยะหน่วงจะรีเซ็ตหลังการทำงานสำเร็จครั้งถัดไป

    การบำรุงรักษา

    cron.sessionRetention (ค่าเริ่มต้น 24h, false ใช้ปิดการทำงาน) จะล้างรายการเซสชันการทำงานแบบแยก ประวัติการทำงานจะเก็บแถวสถานะสิ้นสุดล่าสุด 2000 แถวต่องาน ส่วนแถวที่สูญหายจะยังคงมีช่วงเวลาล้างข้อมูล 24 ชั่วโมง

    การย้ายข้อมูลจากที่เก็บแบบเดิม

    เมื่ออัปเกรด ให้เรียกใช้ openclaw doctor --fix เพื่อนำเข้าไฟล์ ~/.openclaw/cron/jobs.json, jobs-state.json และ runs/*.jsonl แบบเดิมเข้าสู่ SQLite และเปลี่ยนชื่อไฟล์เหล่านั้นโดยเติมส่วนต่อท้าย .migrated แถวงานที่มีรูปแบบไม่ถูกต้องจะถูกข้ามระหว่างรันไทม์และคัดลอกไปยัง jobs-quarantine.json เพื่อซ่อมแซมหรือตรวจสอบภายหลัง

    การแก้ไขปัญหา

    ลำดับคำสั่ง

    bash
    openclaw statusopenclaw gateway statusopenclaw cron statusopenclaw cron listopenclaw cron runs --id <jobId> --limit 20openclaw system heartbeat lastopenclaw logs --followopenclaw doctor
    Cron ไม่ทำงาน
    • ตรวจสอบ cron.enabled และตัวแปรสภาพแวดล้อม OPENCLAW_SKIP_CRON
    • ยืนยันว่า Gateway ทำงานอย่างต่อเนื่อง
    • สำหรับกำหนดการ cron ให้ตรวจสอบเขตเวลา (--tz) เทียบกับเขตเวลาของโฮสต์
    • reason: not-due ในผลลัพธ์การทำงานหมายความว่าการทำงานด้วยตนเองได้รับการตรวจสอบด้วย openclaw cron run <jobId> --due และยังไม่ถึงกำหนดของงาน
    Cron ทำงานแต่ไม่มีการส่ง
    • โหมดการส่ง none หมายความว่าจะไม่มีการส่งสำรองจากตัวเรียกงาน เอเจนต์ยังคงส่งโดยตรงด้วยเครื่องมือ message ได้เมื่อมีเส้นทางแชต
    • เป้าหมายการส่งหายไปหรือไม่ถูกต้อง (channel/to) หมายความว่าระบบข้ามการส่งออก
    • สำหรับ Matrix งานที่คัดลอกมาหรืองานแบบเดิมซึ่งมี ID ห้อง delivery.to เป็นตัวพิมพ์เล็กอาจล้มเหลวได้ เนื่องจาก ID ห้องของ Matrix แยกแยะตัวพิมพ์เล็กและใหญ่ แก้ไขงานให้เป็นค่า !room:server หรือ room:!room:server ที่ตรงกันทุกประการจาก Matrix
    • ข้อผิดพลาดในการตรวจสอบสิทธิ์ของช่องทาง (unauthorized, Forbidden) หมายความว่าข้อมูลประจำตัวขัดขวางการส่ง
    • หากการทำงานแบบแยกส่งคืนเฉพาะโทเค็นเงียบ (NO_REPLY / no_reply) OpenClaw จะระงับทั้งการส่งออกโดยตรงและเส้นทางสรุปสำรองที่เข้าคิว ดังนั้นจึงไม่มีสิ่งใดถูกโพสต์กลับไปยังแชต
    • หากเอเจนต์ควรส่งข้อความถึงผู้ใช้ด้วยตนเอง ให้ตรวจสอบว่างานมีเส้นทางที่ใช้งานได้ (channel: "last" พร้อมแชตก่อนหน้า หรือช่องทาง/เป้าหมายที่ระบุไว้อย่างชัดเจน)
    Cron หรือ Heartbeat ดูเหมือนจะขัดขวางการเปลี่ยนรอบแบบ /new
    • ความใหม่สำหรับการรีเซ็ตรายวันและเมื่อไม่มีการใช้งานไม่ได้อิงตาม updatedAt ดู การจัดการเซสชัน
    • การปลุกโดย Cron, การทำงานของ Heartbeat, การแจ้งเตือน exec และการดูแลข้อมูลของ Gateway อาจอัปเดตแถวเซสชันสำหรับการกำหนดเส้นทาง/สถานะ แต่จะไม่ขยาย sessionStartedAt หรือ lastInteractionAt
    • สำหรับแถวแบบเดิมที่สร้างก่อนมีฟิลด์เหล่านั้น OpenClaw สามารถกู้คืน sessionStartedAt จากส่วนหัวเซสชัน JSONL ของทรานสคริปต์ได้เมื่อไฟล์ยังพร้อมใช้งาน แถวที่ไม่มีการใช้งานแบบเดิมซึ่งไม่มี lastInteractionAt จะใช้เวลาเริ่มต้นที่กู้คืนได้นั้นเป็นค่าฐานสำหรับช่วงไม่มีการใช้งาน
    ข้อควรระวังเกี่ยวกับเขตเวลา
    • Cron ที่ไม่มี --tz จะใช้เขตเวลาของโฮสต์ Gateway
    • กำหนดการ at ที่ไม่มีเขตเวลาจะถือว่าเป็น UTC
    • Heartbeat activeHours ใช้การแก้ค่าเขตเวลาที่กำหนดไว้

    เนื้อหาที่เกี่ยวข้อง

    Was this useful?
    On this page

    On this page