Scheduled Personal Ops¶
Tutorial นี้พาไปดู examples/scheduled_ops/ — สคริปต์สามตัวที่รันเอเจนต์อัตโนมัติตามตารางแบบ cron เพื่อจัดการงานส่วนตัวที่เกิดซ้ำ รวมกันแล้วสาธิตวิธีผสม Jarvis SDK, scheduler CLI และ Python TaskScheduler API เพื่อสร้างชั้นการดำเนินงานส่วนตัวที่รันอยู่เบื้องหลัง
สิ่งที่ต้องมีก่อน
- Python 3.10 ขึ้นไป
- ติดตั้ง OpenJarvis แล้ว:
uv sync --extra devจาก root ของ repository - มี inference engine กำลังรันอยู่ (Ollama พร้อม
qwen3:8bที่ดึงมาแล้ว หรือ cloud API key) - สำหรับการรองรับนิพจน์ cron แบบเต็ม ให้ติดตั้ง
croniter:uv add croniter
สคริปต์ทั้งสามตัว¶
| สคริปต์ | Agent | Tools | ตารางเริ่มต้น | จุดประสงค์ |
|---|---|---|---|---|
daily_digest.py |
orchestrator |
web_search, think |
ทุกวัน 9:00 น. | ค้นหาและสรุปข่าวเด่นตามหัวข้อที่เลือก |
code_review.py |
native_react |
git_log, git_diff, file_read, think |
จันทร์ 8:00 น. | รีวิว commit ของสัปดาห์ที่ผ่านมาในหนึ่ง repository |
gym_scheduler.py |
orchestrator |
web_search, think |
จ. พ. ศ. 6:00 น. | ตรวจเวลาเปิดยิมและตารางคลาส |
แต่ละสคริปต์ทำตามรูปแบบ SDK เดียวกัน: สร้าง instance ของ Jarvis เรียก j.ask() พร้อม agent และ tools พิมพ์ผลลัพธ์ แล้วปิด instance ตารางเวลาถูกจัดการจากภายนอกโดย scheduler daemon ของ OpenJarvis
Quick Start: รันสคริปต์ด้วยตนเอง¶
ทดสอบแต่ละสคริปต์โดยไม่ต้องมี scheduler รันอยู่ ด้วยการเรียกโดยตรง:
# Morning news digest for AI and robotics
uv run python examples/scheduled_ops/daily_digest.py --topics "AI,robotics"
# Code review for the current repository (last 7 days of commits)
uv run python examples/scheduled_ops/code_review.py --repo-path .
# Gym schedule check
uv run python examples/scheduled_ops/gym_scheduler.py --gym "24 Hour Fitness"
สคริปต์ทั้งหมดรับ flag --model และ --engine ได้:
uv run python examples/scheduled_ops/daily_digest.py \
--model qwen3:8b --engine ollama --topics "AI,finance"
Scheduler ทำงานอย่างไร¶
graph TD
A[jarvis scheduler start] --> B[Scheduler Daemon]
B --> C{Cron trigger fires}
C -->|0 9 * * *| D[daily_digest.py]
C -->|0 8 * * 1| E[code_review.py]
C -->|0 6 * * 1,3,5| F[gym_scheduler.py]
D --> G[OrchestratorAgent]
E --> H[NativeReActAgent]
F --> G
G --> I[web_search + think]
H --> J[git_diff + git_log + file_read + think]
I --> K[Output / Channel]
J --> K
Scheduler daemon อ่านงานที่ลงทะเบียนไว้จาก SQLite ยิงงานเหล่านั้นตามเวลาที่ถูกต้อง และส่ง prompt ที่ตั้งค่าไว้ไปยังเอเจนต์ แต่ละสคริปต์รันตรงๆ ได้ด้วยเช่นกัน — scheduler จำเป็นเฉพาะเมื่อต้องการทำงานแบบต่อเนื่องซ้ำโดยไม่มีคนคอยดูแล
ตั้งตารางเวลาด้วย CLI¶
ลงทะเบียนแต่ละสคริปต์เป็นงานที่เกิดซ้ำ โดยใช้ jarvis scheduler create:
# Morning digest every day at 9 AM
jarvis scheduler create "Run daily news digest" \
--type cron --value "0 9 * * *"
# Weekly code review every Monday at 8 AM
jarvis scheduler create "Run weekly code review" \
--type cron --value "0 8 * * 1"
# Gym check on Monday, Wednesday, Friday at 6 AM
jarvis scheduler create "Check gym schedule" \
--type cron --value "0 6 * * 1,3,5"
จากนั้นเริ่ม scheduler daemon แบบ foreground (หรือรันเป็น background service):
ดูรายการงานที่ลงทะเบียนไว้ได้ทุกเมื่อ:
รูปแบบนิพจน์ Cron
OpenJarvis ใช้รูปแบบ cron มาตรฐานห้าฟิลด์: minute hour day-of-month month day-of-week ติดตั้ง croniter (uv add croniter) เพื่อรองรับนิพจน์แบบเต็ม รวมถึงช่วงและ step value หากไม่ติดตั้ง รูปแบบพื้นฐาน hour:minute ก็ยังใช้งานได้
ตั้งค่าตารางเวลาด้วย TOML¶
ไฟล์ schedules.toml ใน examples/scheduled_ops/ กำหนดทั้งสามตารางเวลาแบบ declarative สะดวกสำหรับการทำ version control กับการตั้งค่า personal ops ของคุณ หรือแชร์ข้ามเครื่อง:
[schedules.daily_digest]
type = "cron"
value = "0 9 * * *"
description = "Morning news and social media digest"
script = "daily_digest.py"
[schedules.code_review]
type = "cron"
value = "0 8 * * 1"
description = "Weekly code review"
script = "code_review.py"
[schedules.gym_scheduler]
type = "cron"
value = "0 6 * * 1,3,5"
description = "Gym hours and class check"
script = "gym_scheduler.py"
ชี้เครื่องมือของคุณเองหรือ loader ที่กำหนดเองไปที่ไฟล์นี้ เพื่อลงทะเบียนงานทั้งหมดในครั้งเดียว
ลงทะเบียนงานผ่าน Python API¶
สคริปต์ gym_scheduler.py มี flag --register ที่สาธิตการลงทะเบียนงานเชิงโปรแกรมโดยใช้ TaskScheduler โดยตรง:
โค้ด Python ที่เทียบเท่ากัน:
from openjarvis.scheduler import TaskScheduler
from openjarvis.scheduler.store import SchedulerStore
store = SchedulerStore()
scheduler = TaskScheduler(store)
task = scheduler.create_task( # (1)!
prompt="Check gym schedule for 'Planet Fitness'",
schedule_type="cron",
schedule_value="0 6 * * 1,3,5",
agent="orchestrator",
tools="web_search,think",
)
print(f"Task registered: {task.id}")
print(f"Next run: {task.next_run}")
create_task()บันทึกงานลง SQLite และคำนวณเวลา trigger ครั้งถัดไป scheduler daemon จะรับรู้ทันทีโดยไม่ต้อง restart
สคริปต์ Daily Digest¶
สคริปต์ digest เป็นตัวที่ง่ายที่สุดในสามตัว มันสร้าง prompt ที่ประทับวันที่ แล้วส่งให้ orchestrator พร้อม web_search และ think:
from openjarvis import Jarvis
j = Jarvis() # uses defaults from ~/.openjarvis/config.toml
response = j.ask(
f"Today is {today}. Search and summarize the top news on: {topics}",
agent="orchestrator",
tools=["web_search", "think"],
)
j.close()
orchestrator ค้นหาแต่ละหัวข้อในคนละรอบ ใช้ think เพื่อสังเคราะห์ข้ามหัวข้อ แล้วคืนค่า digest แบบมีโครงสร้างพร้อมสรุปแบบ bullet-point และแนวโน้มหนึ่งย่อหน้า
ส่งผลลัพธ์ไปยัง Channel¶
หากต้องการส่งผลลัพธ์ของสคริปต์ไปยัง Slack หรือ channel อื่นที่รองรับ ให้ pipe stdout ผ่าน jarvis channel send:
uv run python examples/scheduled_ops/daily_digest.py \
--topics "AI,finance" | jarvis channel send slack
หรือเพิ่มการส่งออกไปยัง channel ไว้ในสคริปต์:
from openjarvis.channels import ChannelRegistry
channel = ChannelRegistry.create("slack", webhook_url="https://hooks.slack.com/...")
channel.send(response)
ดูรายการ channel ที่มีทั้งหมด:
Credential ของ Channel
การส่งออกไปยัง live channel ต้องมี credential เฉพาะของ channel นั้นๆ รัน jarvis add slack (หรือ provider ที่เกี่ยวข้อง) เพื่อตั้งค่า MCP server และ credential store จากนั้นตั้งค่า environment variable ในไฟล์ .env ของคุณก่อนเริ่ม scheduler daemon
เคล็ดลับการปรับแต่ง¶
- เปลี่ยนหัวข้อ: ส่ง
--topics "finance,healthcare,sports"ให้daily_digest.pyเพื่อได้ digest ที่ต่างออกไป - ช่วงเวลารีวิว: ส่ง
--days 14ให้code_review.pyเพื่อรีวิวรอบสองสัปดาห์แทนที่จะเป็นหนึ่งสัปดาห์ - สลับเอเจนต์: แทนที่
orchestratorด้วยnative_reactในสคริปต์ใดก็ได้ เพื่อเปรียบเทียบพฤติกรรมของเอเจนต์บนงานเดียวกัน - เพิ่มการเขียนไฟล์: เพิ่ม
"file_write"เข้าไปในรายการtoolsและปรับ prompt ให้บันทึกรายงานลงดิสก์แทนที่จะพิมพ์ออกมา - งานครั้งเดียว: ใช้
--type once --value "2026-04-01T09:00:00"กับjarvis scheduler createสำหรับงานที่ไม่ต้องเกิดซ้ำ
ดูเพิ่มเติม¶
- Architecture: Agents — รายละเอียดภายในของ
OrchestratorAgentและNativeReActAgent - Architecture: Tools and Memory — tool registry และ
ToolExecutor - Getting Started: Configuration — ค่าเริ่มต้นของ engine และโมเดล