ข้ามไปที่เนื้อหา

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 รันอยู่ ด้วยการเรียกโดยตรง:

Terminal
# 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 ได้:

Terminal
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:

Terminal
# 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):

Terminal
jarvis scheduler start

ดูรายการงานที่ลงทะเบียนไว้ได้ทุกเมื่อ:

Terminal
jarvis scheduler list

รูปแบบนิพจน์ 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 ของคุณ หรือแชร์ข้ามเครื่อง:

examples/scheduled_ops/schedules.toml
[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 โดยตรง:

Terminal
uv run python examples/scheduled_ops/gym_scheduler.py \
    --register --gym "Planet Fitness"

โค้ด Python ที่เทียบเท่ากัน:

Programmatic task registration
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}")
  1. create_task() บันทึกงานลง SQLite และคำนวณเวลา trigger ครั้งถัดไป scheduler daemon จะรับรู้ทันทีโดยไม่ต้อง restart

สคริปต์ Daily Digest

สคริปต์ digest เป็นตัวที่ง่ายที่สุดในสามตัว มันสร้าง prompt ที่ประทับวันที่ แล้วส่งให้ orchestrator พร้อม web_search และ think:

examples/scheduled_ops/daily_digest.py
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:

Terminal
uv run python examples/scheduled_ops/daily_digest.py \
    --topics "AI,finance" | jarvis channel send slack

หรือเพิ่มการส่งออกไปยัง channel ไว้ในสคริปต์:

In-script channel output
from openjarvis.channels import ChannelRegistry

channel = ChannelRegistry.create("slack", webhook_url="https://hooks.slack.com/...")
channel.send(response)

ดูรายการ channel ที่มีทั้งหมด:

Terminal
jarvis channel list

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 สำหรับงานที่ไม่ต้องเกิดซ้ำ

ดูเพิ่มเติม