Nhiệm vụ theo lịch trình (Cron)
Lên lịch các tác vụ để chạy tự động bằng ngôn ngữ tự nhiên hoặc biểu thức cron. Hermes cung cấp khả năng quản lý cron thông qua một công cụ
cronjob duy nhất với các thao tác kiểu hành động thay vì các công cụ lập lịch/danh sách/xóa riêng biệt.
Hiện tại cron có thể làm gì
Công việc định kỳ có thể:
- lên lịch các nhiệm vụ một lần hoặc định kỳ
- tạm dừng, tiếp tục, chỉnh sửa, kích hoạt và xóa công việc
- gắn không, một hoặc nhiều kỹ năng vào một công việc
- gửi kết quả trở lại cuộc trò chuyện gốc, tệp cục bộ hoặc mục tiêu nền tảng được định cấu hình
- chạy trong phiên tác nhân mới với danh sách công cụ tĩnh thông thường
- chạy ở chế độ không có tác nhân — một tập lệnh theo lịch trình, thiết bị xuất chuẩn của nó được phân phối nguyên văn, không liên quan đến LLM (xem phần no-agent mode bên dưới)
Tất cả những điều này đều có sẵn cho chính Hermes thông qua công cụ `cronjob
, vì vậy bạn có thể tạo, tạm dừng, chỉnh sửa và xóa công việc bằng cách hỏi bằng ngôn ngữ đơn giản — không cần CLI.
cảnh báo
Các phiên chạy cron không thể tạo ra nhiều công việc định kỳ hơn theo cách đệ quy. Hermes vô hiệu hóa các công cụ quản lý cron bên trong quá trình thực thi cron để ngăn chặn các vòng lặp lập kế hoạch chạy trốn.
Tạo các tác vụ theo lịch trình
Đang trò chuyện với
/cron
`
/cron add 30m "Remind me to check the build"
/cron add "every 2h" "Check server status"
/cron add "every 1h" "Summarize new feed items" --skill blogwatcher
/cron add "every 1h" "Use both skills and combine the result" --skill blogwatcher --skill maps
`
### Từ CLI độc lập
`bash
Hermes cron create "every 2h" "Check server status"
Hermes cron create "every 1h" "Summarize new feed items" --skill blogwatcher
Hermes cron create "every 1h" "Use both skills and combine the result" \
--skill blogwatcher \
--skill maps \
--name "Skill combo"
`
### Qua cuộc trò chuyện tự nhiên
Hãy hỏi Hermes một cách bình thường:
``` text
Every morning at 9am, check Hacker News for AI news and send me a summary on Telegram.
`
``Hermes sẽ sử dụng công cụ
`cronjob
` thống nhất trong nội bộ.
## Công việc định kỳ được hỗ trợ kỹ năng
Một công việc định kỳ có thể tải một hoặc nhiều kỹ năng trước khi chạy lời nhắc.
### Kỹ năng đơn
`Python
cronjob(
action="create",
skill="blogwatcher",
prompt="Check the configured feeds and summarize anything new.",
schedule="0 9 * * *",
name="Morning feeds",
)
`
### Đa kỹ năng
Các kỹ năng được nạp theo thứ tự. Lời nhắc trở thành hướng dẫn nhiệm vụ được xếp chồng lên trên các kỹ năng đó.
`Python
cronjob(
action="create",
skills=["blogwatcher", "maps"],
prompt="Look for new local events and interesting nearby places, then combine them into one short brief.",
schedule="every 6h",
name="Local brief",
)
`
``Điều này rất hữu ích khi bạn muốn một tổng đài viên được lên lịch kế thừa các quy trình làm việc có thể tái sử dụng mà không cần đưa toàn bộ văn bản kỹ năng vào chính dấu nhắc cron.
## Chạy một công việc trong thư mục dự án
Các công việc định kỳ mặc định chạy tách khỏi bất kỳ repo nào - không có
`AGENTS.md
,
`Claude.md
` hoặc
.Cursorrules
` được tải và các công cụ đầu cuối / tệp / mã thực thi chạy từ bất kỳ thư mục làm việc nào mà cổng bắt đầu. Vượt qua
`
--workdir
` (CLI) hoặc
`workdir=
` (gọi công cụ) để thay đổi điều đó:
``` bash
# Standalone CLI (schedule and prompt are positional)
Hermes cron create "every 1d at 09:00" \
"Audit open PRs, summarize CI health, and post to #eng" \
--workdir /home/me/projects/acme
`
`
``` python
# From a chat, via the cronjob tool
cronjob(
action="create",
schedule="every 1d at 09:00",
workdir="/home/me/projects/acme",
prompt="Audit open PRs, summarize CI health, and post to #eng",
)
`
``Khi
`workdir
` được đặt:
-
`AGENTS.md
,
`Claude.md
` và
.Cursorrules
` từ thư mục đó được đưa vào dấu nhắc hệ thống (cùng thứ tự khám phá với CLI tương tác)
-
`terminal
,
`read_file
,
`write_file
,
`patch
,
`search_files
` và
`execute_code
` đều sử dụng thư mục đó làm thư mục làm việc (thông qua
`TERMINAL_CWD
)
- Đường dẫn phải là thư mục tuyệt đối tồn tại — đường dẫn tương đối và thư mục bị thiếu sẽ bị từ chối tại thời điểm tạo/cập nhật
- Truyền
--workdir ""
` (hoặc
`workdir=""
` qua công cụ) khi chỉnh sửa để xóa và khôi phục hành vi cũ
:::note[Serialization]
Các công việc có
`workdir
` chạy tuần tự theo dấu tích của bộ lập lịch chứ không phải trong nhóm song song. Điều này là có chủ ý -
`TERMINAL_CWD
` là quy trình toàn cầu, vì vậy hai công việc Workdir chạy cùng lúc sẽ làm hỏng cwd của nhau. Các công việc không có Workdir vẫn chạy song song như trước.
:::
## Chạy các công việc định kỳ trong một hồ sơ cụ thể
Theo mặc định, công việc định kỳ sẽ kế thừa bất kỳ hồ sơ Hermes nào sở hữu cổng/CLI đã tạo ra nó. Chuyển
--profile <name>
` (CLI) hoặc
`profile=
` (công cụ cronjob) để nhắm mục tiêu lại công việc ở một cấu hình khác — bộ lập lịch giải quyết
`Hermes_HOME
` của cấu hình đó, tạm thời chuyển sang cấu hình đó trong suốt thời gian chạy, tải
.env
+
`config.yaml
` của nó và thực hiện công việc ở đó:
``` bash
# Pin a job to the
`night-ops
` profile regardless of where it was scheduled
Hermes cron create "every 1d at 03:00" \
"Tail the security log and flag anomalies" \
--profile night-ops
`
`
``` python
# From a chat, via the cronjob tool
cronjob(
action="create",
schedule="every 1d at 03:00",
prompt="Tail the security log and flag anomalies",
profile="night-ops",
)
`
``Sử dụng
--profile default
` để ghim rõ ràng vào hồ sơ Hermes gốc. Hồ sơ được đặt tên phải tồn tại; người lên lịch từ chối tạo hồ sơ một cách nhanh chóng. Để xóa mã pin hồ sơ trong
`cron edit
, hãy chuyển một chuỗi trống (
--profile ""
` hoặc
`profile=""
) — công việc sẽ quay lại chạy trong bất kỳ cấu hình nào của chính bộ lập lịch.
Nếu hồ sơ đã ghim sau đó bị xóa, bộ lập lịch sẽ ghi lại cảnh báo và quay lại chạy công việc trong hồ sơ hiện tại thay vì gặp sự cố — vì vậy, tham chiếu
`profile
` cũ sẽ không bao giờ ảnh hưởng đến công việc.:::note Serialization
Các công việc có bộ
`profile
` cũng chạy tuần tự, vì lý do tương tự như các công việc được ghim
`workdir
: chuyển đổi
`Hermes_HOME
` là một đột biến toàn bộ quy trình, do đó, hai công việc được ghim hồ sơ chạy song song sẽ chạy đua với nhau. Các công việc đã bỏ ghim vẫn chạy trong nhóm song song bình thường.
:::
## Công việc chỉnh sửa
Bạn không cần phải xóa và tạo lại công việc chỉ để thay đổi chúng.
:::tip[Job reference]
Trình giữ chỗ
<job_id>
` bên dưới (và trong [Lifecycle actions](#lifecycle-actions)) cũng chấp nhận tên công việc (không phân biệt chữ hoa chữ thường) — tiện dụng khi bạn nhớ
`morning-digest
` chứ không phải ID hex. ID công việc chính xác được ưu tiên hơn so với tên trùng khớp; nếu tham chiếu không phải là ID và tên khớp với nhiều công việc, lệnh sẽ từ chối và in ID ứng viên để bạn có thể phân biệt.
:::
### Trò chuyện
``` bash
/cron edit <job_id> --schedule "every 4h"
/cron edit <job_id> --prompt "Use the revised task"
/cron edit <job_id> --skill blogwatcher --skill maps
/cron edit <job_id> --remove-skill blogwatcher
/cron edit <job_id> --clear-skills
`
### CLI độc lập
`bash
Hermes cron edit <job_id> --schedule "every 4h"
Hermes cron edit <job_id> --prompt "Use the revised task"
Hermes cron edit <job_id> --skill blogwatcher --skill maps
Hermes cron edit <job_id> --add-skill maps
Hermes cron edit <job_id> --remove-skill blogwatcher
Hermes cron edit <job_id> --clear-skills
`
``Ghi chú:
-
`
--skill
` lặp lại thay thế danh sách kỹ năng đính kèm của công việc
-
--add-skill
` thêm vào danh sách hiện có mà không thay thế
-
--remove-skill
` loại bỏ các kỹ năng kèm theo cụ thể
-
--clear-skills
` loại bỏ tất cả các kỹ năng kèm theo
## Hành động trong vòng đời
Các công việc định kỳ giờ đây có vòng đời đầy đủ hơn việc chỉ tạo/xóa.
### Trò chuyện
``` bash
/cron list
/cron pause <job_id>
/cron resume <job_id>
/cron run <job_id>
/cron remove <job_id>
`
### CLI độc lập
`bash
Hermes cron list
Hermes cron pause <job_id>
Hermes cron resume <job_id>
Hermes cron run <job_id>
Hermes cron remove <job_id>
Hermes cron status
Hermes cron tick
`
``Họ làm gì:
-
`pause
` — giữ công việc nhưng ngừng lên lịch cho nó
-
`resume
- kích hoạt lại công việc và tính toán lần chạy tiếp theo trong tương lai
-
`run
- kích hoạt công việc ở dấu tích của lịch trình tiếp theo
-
`remove
- xóa nó hoàn toàn
## Cách thức hoạt động`**Việc thực thi cron được xử lý bởi daemon cổng.** Cổng này đánh dấu bộ lập lịch cứ sau 60 giây, chạy mọi công việc đến hạn trong các phiên tác nhân bị cô lập.
``` bash
Hermes gateway install # Install as a user service
sudo Hermes gateway install --system # Linux: boot-time system service for servers
Hermes gateway # Or run in foreground
Hermes cron list
Hermes cron status
`
### Hành vi của bộ lập lịch cổng
Trên mỗi tích tắc Hermes:
1. tải công việc từ
~/.Hermes/cron/jobs.JSON
`
2. kiểm tra
`next_run_at
` theo thời gian hiện tại
3. bắt đầu phiên
`AIAgent
` mới cho mỗi công việc đến hạn
4. tùy ý đưa một hoặc nhiều kỹ năng kèm theo vào phiên mới đó
5. chạy lời nhắc để hoàn thành
6. đưa ra phản hồi cuối cùng
7. Cập nhật siêu dữ liệu chạy và thời gian dự kiến tiếp theo
Khóa tệp tại
~/.Hermes/cron/.tick.lock
` ngăn các dấu tích của bộ lập lịch chồng chéo chạy hai lần cùng một lô công việc.
## Tùy chọn giao hàng
Khi lên lịch công việc, bạn chỉ định nơi đầu ra sẽ đi:
| Tùy chọn | Mô tả | Ví dụ |
|--------|-------------|----------|
|
"origin"
` | Quay lại nơi công việc được tạo ra | Mặc định trên nền tảng nhắn tin |
|
"local"
` | Chỉ lưu vào tệp cục bộ (
~/.Hermes/cron/output/
) | Mặc định trên CLI |
|
"Telegram"
` | Kênh chủ Telegram | Công dụng
`Telegram_HOME_CHANNEL
` |
|
"Telegram:123456"
` | Trò chuyện Telegram cụ thể theo ID | Giao hàng trực tiếp |
|
"Telegram:-100123:17585"
` | Chủ đề Telegram cụ thể | Định dạng
`chat_id:thread_id
` |
|
"Discord"
` | Kênh gia đình Discord | Công dụng
`Discord_HOME_CHANNEL
` |
|
"Discord:#engineering"
` | Kênh Discord cụ thể | Theo tên kênh |
|
"Slack"
` | Kênh nhà Slack | |
|
"WhatsApp"
` | Trang chủ WhatsApp | |
|
"Signal"
` | Tín hiệu | |
|
"Matrix"
` | Phòng nhà ma trận | |
|
"Mattermost"
` | Kênh chủ đề quan trọng nhất | |
|
"email"
` | Email | |
|
"sms"
` | SMS qua Twilio | |
|
"homeassistant"
` | Trợ lý tại nhà | |
|
"DingTalk"
` | DingTalk | |
|
"Feishu"
` | Feishu/Lark | |
|
"WeCom"
` | WeCom | |
|
"weixin"
` | Weixin (WeChat) | |
|
"BlueBubbles"
` | BlueBubble (iMessage) | |
|
"qqbot"
` | QQ Bot (Tencent QQ) | |
|
"all"
` | Truy cập mọi kênh gia đình được kết nối | Đã giải quyết vào thời điểm cháy |
|
"Telegram,Discord"
` | Hãy theo dõi một nhóm kênh cụ thể | Danh sách được phân tách bằng dấu phẩy |
|
"origin,all"
` | Phân phối đến tận nơi **cộng** mọi kênh được kết nối khác | Kết hợp bất kỳ mã thông báo nào |
Phản hồi cuối cùng của tổng đài viên sẽ được gửi tự động. Bạn không cần gọi
`send_message
` trong dấu nhắc cron.
### Mục đích định tuyến (
`all
)
all
` cho phép bạn gửi một công việc định kỳ tới mọi kênh nhắn tin mà bạn đã định cấu hình mà không cần phải liệt kê chúng theo tên. Nó **được giải quyết vào thời điểm hỏa hoạn**, do đó, công việc được tạo trước khi bạn kết nối Telegram sẽ nhận Telegram ở tích tắc tiếp theo sau khi bạn đặt
`Telegram_HOME_CHANNEL
.Ngữ nghĩa:
`all
` mở rộng sang mọi nền tảng với kênh chính được định cấu hình. Không có gì là ổn; công việc chỉ đơn giản là không tạo ra mục tiêu phân phối và được ghi nhận là lỗi phân phối ngược dòng.
all
` bao gồm các mục tiêu rõ ràng.
`origin,all
` cung cấp cuộc trò chuyện gốc *cộng với* mọi kênh gia đình được kết nối khác, loại bỏ trùng lặp bằng
(platform, chat_id, thread_id)
.
### Chủ đề cron Telegram (
`Telegram_CRON_THREAD_ID
)
Khi chế độ chủ đề Telegram được bật, DM gốc được dành riêng làm phòng chờ của hệ thống — các câu trả lời được gửi ở đó sẽ bị từ chối kèm theo lời nhắc ở sảnh và
`reply_to_message_id
` bị loại bỏ, vì vậy bạn không thể trả lời tin nhắn cron xuất hiện trong cuộc trò chuyện chính.
Thay vào đó, hãy trỏ cron vào một chủ đề diễn đàn dành riêng:
1. Trong Telegram, mở bot DM và tạo một chủ đề có tên ví dụ:
`Cron
. Nhấn và giữ tiêu đề chủ đề → **Sao chép liên kết**; số nguyên cuối cùng là
`message_thread_id
` của chủ đề.
2. Đặt
`Telegram_CRON_THREAD_ID=<that id>
` trong
.env
` của bạn.
Điều này chỉ áp dụng cho việc giao hàng định kỳ.
`Telegram_HOME_CHANNEL_THREAD_ID
` (được sử dụng ở nơi khác, ví dụ: thông báo khởi động lại) không thay đổi. Các mục tiêu
`deliver="Telegram:chat_id:thread_id"
` rõ ràng tiếp tục giành chiến thắng trước var env. Giờ đây, các câu trả lời cho tin nhắn cron đã đến phiên chủ đề hiện có, do đó bạn có thể hành động trực tiếp với chúng.
### Gói phản hồi
Theo mặc định, đầu ra cron đã phân phối được gói bằng đầu trang và chân trang để người nhận biết nó đến từ một tác vụ đã lên lịch:
`
Cronjob Response: Morning feeds
-------------
<agent output here>
Note: The agent cannot see this message, and therefore cannot respond to it.
`
``Để phân phối đầu ra tác nhân thô mà không có trình bao bọc, hãy đặt
`cron.wrap_response
` thành
`false
:
``` yaml
# ~/.Hermes/config.yaml
cron:
wrap_response: false
`
### Đàn áp im lặng
Nếu phản hồi cuối cùng của tổng đài viên bắt đầu bằng
[SILENT]
` thì việc phân phối sẽ bị chặn hoàn toàn. Đầu ra vẫn được lưu cục bộ để kiểm tra (trong
~/.Hermes/cron/output/
), nhưng không có thông báo nào được gửi đến mục tiêu phân phối.
Điều này hữu ích cho việc giám sát các công việc chỉ nên báo cáo khi có sự cố:
``` text
Check if nginx is running. If everything is healthy, respond with only [SILENT].
Otherwise, report the issue.
`
``Các công việc không thành công luôn được phân phối bất kể điểm đánh dấu
[SILENT]
- chỉ những lần chạy thành công mới có thể bị tắt tiếng.
## Hết thời gian chờ tập lệnh
Các tập lệnh chạy trước (được đính kèm qua tham số
`script
) có thời gian chờ mặc định là 120 giây. Nếu tập lệnh của bạn cần dài hơn — ví dụ: để bao gồm độ trễ ngẫu nhiên nhằm tránh các kiểu định thời gian giống như bot — bạn có thể tăng điều này:
`YAML
# ~/.Hermes/config.yaml
cron:
script_timeout_seconds: 300 # 5 minutes
`
``Hoặc đặt biến môi trường
`Hermes_CRON_SCRIPT_TIMEOUT
. Thứ tự phân giải là: env var → config.yaml → 120s mặc định.
## Chế độ không có tác nhân (công việc chỉ có tập lệnh)
Đối với các công việc định kỳ không cần lý luận LLM — cơ quan giám sát cổ điển, cảnh báo ổ đĩa/bộ nhớ, nhịp tim, ping CI — hãy vượt qua
`no_agent=True
` tại thời điểm tạo. Bộ lập lịch chạy tập lệnh của bạn theo lịch trình và phân phối trực tiếp thiết bị xuất chuẩn của nó, bỏ qua hoàn toàn tác nhân:
``` bash
Hermes cron create "every 5m" \
--no-agent \
--script memory-watchdog.sh \
--deliver Telegram \
--name "memory-watchdog"
`
``Ngữ nghĩa:
- Tập lệnh xuất chuẩn (đã được cắt bớt) → gửi nguyên văn như thông báo.
- **Thiết bị xuất chuẩn trống → tích tắc im lặng**, không giao hàng. Đây là mẫu cơ quan giám sát: "chỉ nói điều gì đó khi có điều gì đó không ổn".
- Thoát hoặc hết thời gian khác 0 → một cảnh báo lỗi được gửi đi, do đó cơ quan giám sát bị hỏng không thể âm thầm thất bại.
-
\{"wakeAgent": false}
` ở dòng cuối → đánh dấu im lặng (cùng cổng sử dụng công việc LLM).
- Không có mã thông báo, không có mô hình, không có dự phòng của nhà cung cấp — công việc không bao giờ chạm tới lớp suy luận.
Các tệp
.sh
` /
.bash
` chạy dưới
/bin/bash
; bất cứ điều gì khác trong trình thông dịch Python hiện tại (
`sys.executable
). Các tập lệnh phải tồn tại trong
~/.Hermes/scripts/
` (quy tắc hộp cát giống như cổng tập lệnh chạy trước).
### Nhân viên sẽ thiết lập những thứ này cho bạn
Lược đồ của công cụ
`cronjob
` hiển thị trực tiếp
`no_agent
` cho Hermes, vì vậy bạn có thể mô tả cơ quan giám sát trong cuộc trò chuyện và để nhân viên kết nối nó:
``` text
Ping me on Telegram if RAM is over 85%, every 5 minutes.
`
``Hermes sẽ viết script kiểm tra tới
~/.Hermes/scripts/
` thông qua
`write_file
, sau đó gọi:
`Python
cronjob(action="create", schedule="every 5m",
script="memory-watchdog.sh", no_agent=True,
deliver="Telegram", name="memory-watchdog")
`
``Nó tự động chọn
`no_agent=True
` khi nội dung tin nhắn được xác định đầy đủ bởi tập lệnh (cơ quan giám sát, cảnh báo ngưỡng, nhịp tim). Công cụ tương tự cũng cho phép tổng đài viên tạm dừng, tiếp tục, chỉnh sửa và xóa công việc — vì vậy toàn bộ vòng đời được điều khiển bằng trò chuyện mà không cần bất kỳ ai chạm vào CLI.
Xem [Script-Only Cron Jobs guide](/docs/guides/cron-script-only) để biết các ví dụ hoạt động.
## Xâu chuỗi công việc với
`context_from
``Các công việc định kỳ chạy trong các phiên riêng biệt mà không có bộ nhớ về các lần chạy trước đó. Nhưng đôi khi kết quả của một công việc lại chính xác là những gì công việc tiếp theo cần. Tham số
`context_from
` tự động kết nối - Lời nhắc của Công việc B nhận đầu ra gần đây nhất của Công việc A được thêm vào trước dưới dạng ngữ cảnh khi chạy.
`
`Python
# Job 1: Collect raw data
cronjob(
action="create",
prompt="Fetch the top 10 AI/ML stories from Hacker News. Save them to ~/.Hermes/data/briefs/raw.md in markdown format with title, URL, and score.",
schedule="0 7 * * *",
name="AI News Collector",
)
# Job 2: Triage — receives Job 1's output as context
# Get Job 1's ID from: cronjob(action="list")
cronjob(
action="create",
prompt="Read ~/.Hermes/data/briefs/raw.md. Score each story 1–10 for engagement potential and novelty. Output the top 5 to ~/.Hermes/data/briefs/ranked.md.",
schedule="30 7 * * *",
context_from="<job1_id>",
name="AI News Triage",
)
# Job 3: Ship — receives Job 2's output as context
cronjob(
action="create",
prompt="Read ~/.Hermes/data/briefs/ranked.md. Write 3 tweet drafts (hook + body + hashtags). Deliver to Telegram:7976161601.",
schedule="0 8 * * *",
context_from="<job2_id>",
name="AI News Brief",
)
`
``**Cách thức hoạt động:**
- Khi Công việc 2 kích hoạt, Hermes đọc kết quả gần đây nhất của Công việc 1 từ
~/.Hermes/cron/output/\{job1_id}/*.md
- Đầu ra đó được tự động thêm vào lời nhắc của Công việc 2
- Công việc 2 không cần mã hóa "đọc tệp này" - nó nhận nội dung dưới dạng ngữ cảnh
- Chuỗi có thể có độ dài bất kỳ: Công việc 1 → Công việc 2 → Công việc 3 → ...
**
`context_from
` chấp nhận những gì:**
| Định dạng | Ví dụ |
|--------|----------|
| ID công việc đơn (chuỗi) |
context_from="a1b2c3d4"
` |
| Nhiều ID công việc (danh sách) |
context_from=["job_a", "job_b"]
` |
Các đầu ra được nối theo thứ tự được liệt kê.
**Khi nào nên sử dụng:**
- Quy trình nhiều giai đoạn (thu thập → lọc → định dạng → phân phối)
- Nhiệm vụ phụ thuộc trong đó công việc của bước N phụ thuộc vào đầu ra của bước N−1
- Mô hình phân tán/phân xuất trong đó một công việc tổng hợp kết quả từ một số công việc khác
## Khôi phục nhà cung cấp
Các công việc định kỳ kế thừa các nhà cung cấp dự phòng đã định cấu hình của bạn và xoay vòng nhóm thông tin xác thực. Nếu khóa API chính bị giới hạn tốc độ hoặc nhà cung cấp trả về lỗi, tác nhân cron có thể:
- **Quay lại nhà cung cấp thay thế** nếu bạn đã định cấu hình
`fallback_providers
` (hoặc
`fallback_model
` cũ) trong
`config.yaml
- **Chuyển sang thông tin xác thực tiếp theo** trong [credential pool](/docs/user-guide/configuration#credential-pool-strategies) của bạn cho cùng một nhà cung cấp
Điều này có nghĩa là các công việc định kỳ chạy ở tần suất cao hoặc trong giờ cao điểm sẽ linh hoạt hơn — một khóa giới hạn tốc độ duy nhất sẽ không bị lỗi trong toàn bộ quá trình chạy.
## Định dạng lịch biểu
Phản hồi cuối cùng của tổng đài viên được gửi tự động — bạn **không** cần đưa
`send_message
` vào dấu nhắc cron cho cùng đích đến đó. Nếu một lần chạy cron gọi
`send_message
` đến mục tiêu chính xác mà bộ lập lịch sẽ gửi tới, Hermes sẽ bỏ qua lần gửi trùng lặp đó và yêu cầu mô hình đưa nội dung hướng tới người dùng vào phản hồi cuối cùng. Chỉ sử dụng
`send_message
` cho các mục tiêu bổ sung hoặc mục tiêu khác.
### Độ trễ tương đối (một lần)
``` text
30m → Run once in 30 minutes
2h → Run once in 2 hours
1d → Run once in 1 day
`
### Khoảng thời gian (định kỳ)
`text
every 30m → Every 30 minutes
every 2h → Every 2 hours
every 1d → Every day
`
### Biểu thức Cron
`text
0 9 * * * → Daily at 9:00 AM
0 9 * * 1-5 → Weekdays at 9:00 AM
0 */6 * * * → Every 6 hours
30 8 1 * * → First of every month at 8:30 AM
0 0 * * 0 → Every Sunday at midnight
`
### Dấu thời gian ISO
`text
2026-03-15T09:00:00 → One-time at March 15, 2026 9:00 AM
`
## Hành vi lặp lại
| Loại lịch trình | Lặp lại mặc định | Hành vi |
|--------------|-------|----------|
| Một lần (
`30m
, dấu thời gian) | 1 | Chạy một lần |
| Khoảng thời gian (
`every 2h
) | mãi mãi | Chạy cho đến khi bị xóa |
| Biểu thức Cron | mãi mãi | Chạy cho đến khi bị xóa |
Bạn có thể ghi đè lên nó:
`Python
cronjob(
action="create",
prompt="...",
schedule="every 2h",
repeat=5,
)
`
## Quản lý công việc theo chương trình
API đối mặt với tác nhân là một công cụ:
`Python
cronjob(action="create", ...)
cronjob(action="list")
cronjob(action="update", job_id="...")
cronjob(action="pause", job_id="...")
cronjob(action="resume", job_id="...")
cronjob(action="run", job_id="...")
cronjob(action="remove", job_id="...")
`
``Đối với
`update
, vượt qua
`skills=[]
` để xóa tất cả các kỹ năng đính kèm.
## Bộ công cụ có sẵn cho cron jobs
Cron thực hiện từng công việc trong phiên tác nhân mới mà không đính kèm nền tảng trò chuyện. Theo mặc định, tác nhân cron nhận **bộ công cụ bạn đã định cấu hình cho nền tảng
`cron
` trong
`Hermes tools
`
** — không phải mặc định CLI, không phải mọi thứ dưới ánh mặt trời.
``` bash
Hermes tools
# → pick the "cron" platform in the curses UI
# → toggle toolsets on/off just like you would for Telegram/Discord/etc.
`
``Kiểm soát chặt chẽ hơn theo từng công việc có sẵn thông qua trường
`enabled_toolsets
` trên
`cronjob.create
` (hoặc trên công việc hiện có thông qua
`cronjob.update
):
``` text
cronjob(action="create", name="weekly-news-summary",
schedule="every sunday 9am",
enabled_toolsets=["web", "file"], # just web + file, no terminal/browser/etc.
prompt="Summarize this week's AI news: ...")
`
``Khi
`enabled_toolsets
` được thực hiện một công việc, nó sẽ thắng; nếu không thì cấu hình nền tảng cron
`Hermes tools
` sẽ thắng; nếu không thì Hermes sẽ quay trở lại các giá trị mặc định có sẵn. Điều này quan trọng đối với việc kiểm soát chi phí: đưa
`moa
,
`browser
,
`delegation
` vào mọi công việc "tìm nạp tin tức" nhỏ làm nổi bật lời nhắc lược đồ công cụ trên mỗi lệnh gọi LLM.
### Bỏ qua hoàn toàn tác nhân:
`wakeAgent
``Nếu công việc định kỳ của bạn đính kèm tập lệnh kiểm tra trước (thông qua
`script=
), tập lệnh có thể quyết định trong thời gian chạy liệu Hermes có nên gọi tác nhân hay không. Phát ra dòng stdout cuối cùng có dạng:
`text
\{"wakeAgent": false}
`
``…và cron bỏ qua toàn bộ quá trình chạy tác nhân đối với dấu tích này. Hữu ích cho các cuộc thăm dò thường xuyên (cứ sau 1–5 phút) chỉ cần đánh thức LLM khi trạng thái thực sự thay đổi - nếu không, bạn sẽ phải trả tiền cho tác nhân không có nội dung lặp đi lặp lại.
`Python
# pre-check script
import JSON, sys
latest = fetch_latest_issue_count()
prev = read_state("issue_count")
if latest == prev:
print(JSON.dumps(\{"wakeAgent": False})) # skip this tick
sys.exit(0)
write_state("issue_count", latest)
print(JSON.dumps(\{"wakeAgent": True, "context": \{"new_issues": latest - prev}}))
`
``Khi
`wakeAgent
` bị bỏ qua, mặc định là
`true
` (đánh thức tác nhân như bình thường).
#### Bí quyết: cổng chạy trước giá rẻ
Cổng
`wakeAgent
` cung cấp cho bạn một cách miễn phí $ để quyết định xem công việc đã lên lịch có nên chi tiêu bất kỳ mã thông báo LLM nào hay không. Ba mẫu bao gồm hầu hết các trường hợp sử dụng.
**Cổng thay đổi tệp** — chỉ chạy khi tệp đã xem có nội dung mới kể từ lần đánh dấu thành công cuối cùng. Bộ lập lịch ghi lại
`last_run_at
` của từng công việc; so sánh nó với mtime của tập tin.
``` bash
#!/bin/bash
# ~/.Hermes/scripts/feed-changed.sh
FEED="$HOME/data/feed.JSON"
STATE="$HOME/.Hermes/scripts/.feed-changed.last"
test -f "$FEED" || { echo '\{"wakeAgent": false}'; exit 0; }
mtime=$(stat -c %Y "$FEED")
last=$(cat "$STATE" 2>/dev/null || echo 0)
if [ "$mtime" -le "$last" ]; then
echo '\{"wakeAgent": false}'
else
echo "$mtime" > "$STATE"
echo '\{"wakeAgent": true}'
fi
`
`
``` text
cronjob(action="create", name="process-feed",
schedule="every 30m",
script="feed-changed.sh",
prompt="A new ~/data/feed.JSON has landed. Summarize what changed.")
`
`**Cổng cờ bên ngoài** — chỉ chạy khi một số quy trình khác đã báo hiệu sự sẵn sàng (ví dụ: móc triển khai thả tệp, công việc CI đặt giá trị trong kho lưu trữ trạng thái của bạn).
`bash
#!/bin/bash
# ~/.Hermes/scripts/flag-ready.sh
if test -f /tmp/new-data-ready; then
rm -f /tmp/new-data-ready
echo '\{"wakeAgent": true}'
else
echo '\{"wakeAgent": false}'
fi
`
`
``` text
cronjob(action="create", name="nightly-analysis",
schedule="0 9 * * *",
script="flag-ready.sh",
prompt="Run the nightly analysis over today's batch.")
`
``**Cổng đếm SQL** — chỉ chạy khi có hàng mới cần xử lý trong cơ sở dữ liệu của riêng bạn. Tập lệnh cũng có thể chuyển số đếm cho tác nhân thông qua
`context
, để tác nhân biết số lượng đang xem mà không cần truy vấn lại.
`Python
#!/usr/bin/env Python
# ~/.Hermes/scripts/new-rows.py
import JSON, SQLite3
conn = SQLite3.connect("/home/me/data/app.db")
n = conn.execute(
"SELECT COUNT(*) FROM messages WHERE ts > strftime('%s','now','-2 hours')"
).fetchone()[0]
if n < 1:
print(JSON.dumps(\{"wakeAgent": False}))
else:
print(JSON.dumps(\{"wakeAgent": True, "context": \{"new_rows": n}}))
`
`
``` text
cronjob(action="create", name="summarize-new-msgs",
schedule="every 2h",
script="new-rows.py",
prompt="Summarize the new messages from the last 2 hours.")
`
``Mẫu tương tự hoạt động với bất kỳ nguồn dữ liệu nào bạn có thể truy vấn từ tập lệnh - Postgres, API HTTP, kho lưu trữ trạng thái của riêng bạn - mà không cần đưa bộ đánh giá SQL vào hệ thống con cron.
:::tip
~/.Hermes/state.db
` của Hermes là một lược đồ nội bộ thay đổi giữa các lần phát hành. Đừng truy vấn nó từ một cổng chạy trước — thay vào đó hãy trỏ vào cơ sở dữ liệu hoặc nguồn cấp dữ liệu của riêng bạn.
:::
Tín dụng: bộ công thức này được thúc đẩy bởi khám phá của @iankar8 trong [#2654](https://GitHub.com/NousResearch/Hermes-agent/pull/2654), đề xuất thêm trình kích hoạt sql/file/command làm cơ chế song song. Cổng
`script
+
`wakeAgent
` đã bao gồm cả ba trường hợp ở mức 0 USD, do đó, công việc được chuyển xuống dưới dạng tài liệu thay thế.
### Chuỗi công việc:
`context_from
``Một công việc định kỳ có thể sử dụng kết quả đầu ra thành công gần đây nhất của một hoặc nhiều công việc khác bằng cách liệt kê tên (hoặc ID) của chúng trong
`context_from
:
``` text
cronjob(action="create", name="daily-digest",
schedule="every day 7am",
context_from=["ai-news-fetch", "GitHub-prs-fetch"],
prompt="Write the daily digest using the outputs above.")
`
``Kết quả đầu ra đã hoàn thành gần đây nhất của các công việc được tham chiếu sẽ được đưa vào phía trên dấu nhắc làm ngữ cảnh cho lần chạy này. Mỗi mục nhập ngược dòng phải là ID hoặc tên công việc hợp lệ (xem
`cronjob action="list"
). Lưu ý: chuỗi đọc đầu ra *đã hoàn thành gần đây nhất* - nó không chờ các công việc ngược dòng đang chạy trong cùng một tích tắc.
## Lưu trữ công việc
Công việc được lưu trữ trong
~/.Hermes/cron/jobs.JSON
. Đầu ra từ các lần chạy công việc được lưu vào
~/.Hermes/cron/output/\{job_id}/\{timestamp}.md
.
Công việc có thể lưu trữ
`model
` và
`provider
` dưới dạng
`null
. Khi các trường đó bị bỏ qua, Hermes sẽ giải quyết chúng tại thời điểm thực thi từ cấu hình chung. Chúng chỉ xuất hiện trong bản ghi công việc khi đặt ghi đè theo công việc.
Bộ lưu trữ sử dụng chức năng ghi tệp nguyên tử để quá trình ghi bị gián đoạn không để lại tệp công việc được ghi một phần.
## Lời nhắc độc lập vẫn quan trọng
:::warning[Important]
Công việc định kỳ chạy trong phiên tác nhân hoàn toàn mới. Lời nhắc phải chứa mọi thứ mà nhân viên cần mà các kỹ năng đính kèm chưa cung cấp.
:::
**Xấu:**
"Check on that server issue"
``**TỐT:**
"SSH into server 192.168.1.100 as user 'deploy', check if nginx is running with 'systemctl status nginx', and verify https://example.com returns HTTP 200."
## Bảo mật
Lời nhắc tác vụ theo lịch trình được quét để tìm các mẫu lọc lời nhắc và trích xuất thông tin xác thực tại thời điểm tạo và cập nhật. Các lời nhắc chứa các thủ thuật Unicode vô hình, các nỗ lực cửa hậu SSH hoặc các tải trọng lấy cắp bí mật rõ ràng đều bị chặn.