การทำงานอัตโนมัติ
การทำงานอัตโนมัติจะรันคำสั่งตามกำหนดเวลาและส่งผลลัพธ์เป็นเซสชันแชตปกติ ไม่ว่าจะเป็นสรุปข่าวรายวัน การทบทวนรายสัปดาห์ หรือรายงานรายเดือน แต่ละรอบทำงานบนเซิร์ฟเวอร์โดยไม่มีหน้าจอ ปรากฏในรายการแชต และเปิดเพื่อสนทนาต่อได้เหมือนบทสนทนาอื่น
องค์ประกอบ
การทำงานอัตโนมัติประกอบด้วยชื่อ คำสั่งแบบข้อความอิสระ ทริกเกอร์ตั้งแต่หนึ่งรายการขึ้นไป โมเดลเสริม (เว้นว่างหมายถึง Auto ซึ่งใช้โมเดลแชตเริ่มต้นของคุณในเวลาที่รัน) เป้าหมายการรัน และการตั้งค่าการแจ้งเตือน (ในแอปหรือปิด) เป้าหมายกำหนดสิ่งที่แต่ละรอบสร้าง: Chat session ซึ่งเป็นค่าเริ่มต้นจะจัดคิวคำสั่งเป็นบทสนทนา ส่วน Work task จะเปิด sandbox Work ที่แยกออกจากกัน โดยใช้คำสั่งเป็นข้อความแรก และอาจใช้ Work policy ที่ตั้งชื่อไว้ซึ่งเลือกในแบบฟอร์ม เมื่อเปิดการแจ้งเตือน รอบที่ล้มเหลวจะปรากฏใน กล่องข้อความแจ้งเตือน ด้วย คุณจึงรับทราบข้อผิดพลาดแม้หน้าการทำงานอัตโนมัติจะปิดอยู่ ชื่อและคำสั่งถูกเข้ารหัสขณะจัดเก็บ การทำงานอัตโนมัติทุกชุดเป็นของผู้ใช้ที่สร้าง
ทริกเกอร์ใช้รูปแบบร่วมกับปฏิทิน ได้แก่ once, hourly, daily, weekly, monthly, yearly และการทำงานอัตโนมัติหนึ่งชุดมีได้สูงสุดห้าทริกเกอร์ รอบถัดไปคือเหตุการณ์ที่ใกล้ที่สุดจากทริกเกอร์ทั้งหมด โดยคำนวณตามเขตเวลาท้องถิ่นของเซิร์ฟเวอร์
การทำงาน
ตัวจัดกำหนดการทำงานทุกนาทีภายใต้ lease สำหรับประสานงาน จึงมี replica เพียงหนึ่งตัวที่เลื่อนกำหนดเวลา เมื่อถึงเวลา ระบบจะบันทึกรอบ จัดคิวงานถาวร automation.run.v1 และเลื่อน next_run_at ด้วยการเปรียบเทียบแล้วตั้งค่า เพื่อให้แต่ละเหตุการณ์ทำงานได้มากที่สุดหนึ่งครั้ง งานจะสร้างเซสชันแชตที่ใช้ชื่อการทำงานอัตโนมัติ แล้วส่งคำสั่งผ่าน pipeline สร้างแชตถาวรแบบเดียวกับทุกบทสนทนา รวมถึงการกำหนดเส้นทางผู้ให้บริการ ค่าเริ่มต้นของเพอร์โซนา และการจัดเก็บ
หากเซิร์ฟเวอร์หยุดทำงานตอนที่เหตุการณ์ผ่านไป รอบ tick ถัดไปจะรันเหตุการณ์นั้นหนึ่งครั้งและข้ามช่วงที่พลาดซึ่งเก่ากว่า การพักการทำงานอัตโนมัติจะล้างกำหนดเวลา ส่วนการทำต่อหรือแก้ไขจะคำนวณใหม่จากเวลาปัจจุบัน การลบการทำงานอัตโนมัติจะลบประวัติการรันผ่าน foreign-key cascade
สถานะรอบจะสรุปจากบัญชีงานถาวร: สำเร็จเมื่อการสร้างแชตเสร็จสิ้น ล้มเหลวเมื่องานใดงานหนึ่งเข้าสู่ dead letter และล้มเหลวเป็น stalled เมื่อรอบที่อยู่ในคิวไม่เริ่มภายใน 30 นาที
รอบที่มี Work เป็นเป้าหมายทำงานแบบเดียวกัน แต่ใช้วงจรชีวิต Work แทนงานแชต: รอบจะบันทึกงานที่สร้าง (แท็บ Runs เชื่อมตรงไปยังงานนั้น), สำเร็จเมื่อตัวแทนทำงานเสร็จหรือหยุดเพื่อขอข้อมูล และล้มเหลวเมื่องานผิดพลาดหรือถูกยกเลิก ระบบตรวจสอบสิทธิ์ Work เมื่อกำหนดเวลาทำงาน ดังนั้นการเพิกถอนสิทธิ์ Work ของผู้ใช้จะหยุดการทำงานอัตโนมัติที่มี Work เป็นเป้าหมายด้วย รอบจะล้มเหลวเป็น work-access-denied แทนการข้ามโดยไม่แจ้ง policy ที่เลือกจะถูกตรวจสอบตอนบันทึก และค่าเริ่มต้นของเครือข่ายกับขีดจำกัดทรัพยากรจะใช้กับทุกงานที่การทำงานอัตโนมัติเปิด เฉพาะผู้ให้บริการโมเดลโดยตรงเท่านั้นที่ทำงานใน Work และโมเดลต้องรองรับเครื่องมือ ซึ่งเป็นกฎเดียวกับช่องเขียน Work
กิจวัตรของตัวแทน
การทำงานอัตโนมัติที่มี Work เป็นเป้าหมายสามารถผูกกับงาน Work ที่มีอยู่ ผ่าน workTaskId ได้เช่นกัน ซึ่งเป็นโครงสร้างเบื้องหลังส่วน Routines ใน แผงรายละเอียดของตัวแทน กิจวัตรที่ผูกไว้จะไม่สร้างงานใหม่ทุกครั้ง แต่ละเหตุการณ์จะเริ่มรอบภายในพื้นที่ทำงานและบทสนทนาของงานนั้น โดยใช้โมเดล ผู้ให้บริการ และ runtime policy ของงาน ดังนั้นช่องโมเดลและ policy ระดับการทำงานอัตโนมัติจึงไม่ใช้ และ policy ที่ส่งมาจะถูกนำออกตอนบันทึก การผูกจะถูกตรวจสอบตอนบันทึก (งานต้องมีอยู่และเป็นของผู้เรียก) เมื่อถึงเวลา หากงานถูกลบ รอบจะล้มเหลวเป็น work-task-missing; หากงานกำลังทำงานหรือมีตัวอย่างสดอยู่ เหตุการณ์จะล้มเหลวอย่างตรงไปตรงมาเป็น work-task-busy แทนการรอต่อท้ายคิว
ทริกเกอร์ webhook
นอกจากกำหนดเวลาแล้ว ระบบภายนอกยังสั่งให้การทำงานอัตโนมัติทำงานได้ ไม่ว่าจะเป็น CI pipeline บริการ cron หรือระบบบ้านอัตโนมัติ ในกล่องแก้ไขของการทำงานอัตโนมัติ Webhook trigger → Enable จะสร้าง secret เฉพาะของการทำงานอัตโนมัตินั้น ระบบเก็บเฉพาะ SHA-256 ข้อความจริงจึงแสดงเพียงครั้งเดียว การหมุน secret จะยกเลิกของเดิมทันที และการปิด webhook จะปิด endpoint อีกครั้ง
ระบบภายนอกสั่งให้การทำงานอัตโนมัติทำงานด้วย:
curl -X POST https://your-host/api/automations/<automationId>/webhook \
-H "Authorization: Bearer lwh_..."
(X-Libre-Webhook-Secret: lwh_... ใช้เป็น header ทางเลือกได้) การตอบกลับคือ 202 พร้อม id ของรอบที่เข้าคิว ซึ่งเป็นเส้นทางรันด้วยตนเองเดียวกับ Run now รอบจึงจบ แจ้งเตือน และปรากฏในประวัติเหมือนกันทุกประการ การเปรียบเทียบ secret ใช้เวลาคงที่ การทำงานอัตโนมัติที่ไม่มีอยู่กับ secret ที่ผิดตอบเหมือนกัน (ไม่เผย id ของการทำงานอัตโนมัติ) และการทำงานอัตโนมัติที่พักอยู่ตอบ 409 ต่างจาก Run now ของเจ้าของ ผู้เรียกจากภายนอกสั่งข้ามการพักไม่ได้
API
ทุก endpoint ยกเว้นการยิง webhook ต้องยืนยันตัวตนและทำงานเฉพาะกับการทำงานอัตโนมัติของผู้เรียกเอง ส่วนการยิง webhook ยืนยันตัวตนด้วย secret เฉพาะของการทำงานอัตโนมัตินั้นแทน
| เมธอด | เส้นทาง | วัตถุประสงค์ |
|---|---|---|
GET | /api/automations | แสดงรายการการทำงานอัตโนมัติ |
POST | /api/automations | สร้างการทำงานอัตโนมัติ |
GET | /api/automations/occurrences?from=&to= | เหตุการณ์ที่คำนวณไว้ในอนาคต |
GET | /api/automations/runs | ประวัติการรัน (กรองได้) |
GET | /api/automations/runs/summary | จำนวนที่ยังไม่เห็น + กลุ่มข้อมูล 30 วัน |
POST | /api/automations/runs/seen | ทำเครื่องหมายรอบที่เสร็จว่าเห็นแล้ว |
GET | /api/automations/:automationId | อ่านการทำงานอัตโนมัติหนึ่งรายการ |
PUT | /api/automations/:automationId | อัปเดตการทำงานอัตโนมัติ |
DELETE | /api/automations/:automationId | ลบการทำงานอัตโนมัติ |
POST | /api/automations/:automationId/pause | พักกำหนดเวลา |
POST | /api/automations/:automationId/resume | ทำกำหนดเวลาต่อ |
POST | /api/automations/:automationId/run | รันทันที (202 พร้อม id ของรอบ) |
POST | /api/automations/:automationId/webhook | ยิงด้วย secret (202) |
POST | /api/automations/:automationId/webhook-secret | สร้าง/หมุน secret |
DELETE | /api/automations/:automationId/webhook-secret | ปิด webhook |
ผู้ใช้หนึ่งคนเก็บการทำงานอัตโนมัติได้สูงสุด 50 รายการ ชื่อจำกัดที่ 200 อักขระ และคำสั่งจำกัดที่ 20,000 อักขระ