Sub-agents
Sub-agents là các phiên chạy agent nền được khởi tạo từ một phiên chạy agent hiện có. Chúng chạy trong phiên riêng (agent:<agentId>:subagent:<uuid>) và khi hoàn tất sẽ thông báo kết quả trở lại kênh chat của người yêu cầu.
Slash command
Sử dụng/subagents để kiểm tra hoặc điều khiển các phiên chạy sub-agent cho phiên hiện tại:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>
- Song song hóa các tác vụ “nghiên cứu / tác vụ dài / công cụ chậm” mà không chặn phiên chạy chính.
- Giữ sub-agents được cô lập theo mặc định (tách phiên + sandbox tùy chọn).
- Giữ bề mặt công cụ khó bị lạm dụng: sub-agents không được cấp session tools theo mặc định.
- Hỗ trợ độ sâu lồng nhau có thể cấu hình cho các mô hình điều phối (orchestrator patterns).
agents.defaults.subagents.model hoặc ghi đè theo từng agent.
Tool
Sử dụngsessions_spawn:
- Khởi động một phiên chạy sub-agent (
deliver: false, lane toàn cục:subagent) - Sau đó chạy bước announce và đăng phản hồi announce lên kênh chat của người yêu cầu
- Model mặc định: kế thừa từ caller trừ khi bạn đặt
agents.defaults.subagents.model(hoặcagents.list[].subagents.modeltheo từng agent); nếu chỉ định rõsessions_spawn.modelthì giá trị này vẫn được ưu tiên. - Thinking mặc định: kế thừa từ caller trừ khi bạn đặt
agents.defaults.subagents.thinking(hoặcagents.list[].subagents.thinkingtheo từng agent); nếu chỉ định rõsessions_spawn.thinkingthì giá trị này vẫn được ưu tiên.
task(bắt buộc)label?(tùy chọn)agentId?(tùy chọn; khởi tạo dưới một agent id khác nếu được phép)model?(tùy chọn; ghi đè model của sub-agent; các giá trị không hợp lệ sẽ bị bỏ qua và sub-agent sẽ chạy với model mặc định kèm cảnh báo trong kết quả công cụ)thinking?(tùy chọn; ghi đè mức độ suy luận cho lần chạy của sub-agent)runTimeoutSeconds?(mặc định0; khi được thiết lập, lần chạy của sub-agent sẽ bị hủy sau N giây)cleanup?(delete|keep, mặc địnhkeep)
agents.list[].subagents.allowAgents: danh sách agent id có thể được nhắm tới quaagentId(["*"]để cho phép tất cả). Mặc định: chỉ agent gửi yêu cầu.
- Sử dụng
agents_listđể xem những agent id nào hiện được phép chosessions_spawn.
- Các phiên sub-agent sẽ được tự động lưu trữ sau
agents.defaults.subagents.archiveAfterMinutes(mặc định: 60). - Việc lưu trữ sử dụng
sessions.deletevà đổi tên bản ghi thành*.deleted.<timestamp>(cùng thư mục). cleanup: "delete"sẽ lưu trữ ngay sau khi thông báo (vẫn giữ lại bản ghi thông qua đổi tên).- Tự động lưu trữ hoạt động theo cơ chế best-effort; các bộ hẹn giờ đang chờ sẽ bị mất nếu gateway khởi động lại.
runTimeoutSecondskhông tự động lưu trữ; nó chỉ dừng lần chạy. Phiên sẽ vẫn tồn tại cho đến khi được tự động lưu trữ.- Tự động lưu trữ áp dụng như nhau cho các phiên độ sâu 1 và độ sâu 2.
Sub-Agent lồng nhau
Mặc định, sub-agent không thể tạo sub-agent riêng của mình (maxSpawnDepth: 1). Bạn có thể bật một cấp lồng nhau bằng cách đặt maxSpawnDepth: 2, cho phép mô hình điều phối (orchestrator pattern): main → orchestrator sub-agent → worker sub-sub-agents.
Cách bật
Đồng thời
| Độ sâu | Dạng khóa phiên | Vai trò | Có thể tạo thêm không? |
|---|---|---|---|
| 0 | agent:<id>:main | Agent chính | Luôn luôn |
| 1 | agent:<id>:subagent:<uuid> | Sub-agent (orchestrator khi cho phép độ sâu 2) | Chỉ khi maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | Sub-sub-agent (worker lá) | Không bao giờ |
Chuỗi announce
Sub-agent sử dụng một làn hàng đợi riêng (subagent) tách biệt với hàng đợi agent chính, vì vậy các lần chạy sub-agent không chặn các phản hồi đến.
- Worker ở độ sâu 2 hoàn tất → gửi announce tới tiến trình cha (orchestrator độ sâu 1)
- Orchestrator độ sâu 1 nhận announce, tổng hợp kết quả, hoàn tất → gửi announce tới main
- Agent main nhận announce và gửi kết quả tới người dùng
Chính sách công cụ theo độ sâu
- Độ sâu 1 (orchestrator, khi
maxSpawnDepth >= 2): Được cấpsessions_spawn,subagents,sessions_list,sessions_historyđể có thể quản lý các tiến trình con. Các công cụ session/system khác vẫn bị từ chối. - Độ sâu 1 (leaf, khi
maxSpawnDepth == 1): Không có công cụ session (hành vi mặc định hiện tại). - Độ sâu 2 (leaf worker): Không có công cụ session —
sessions_spawnluôn bị từ chối ở độ sâu 2. Không thể tạo thêm tiến trình con.
Công cụ sessions_spawn
Mỗi phiên agent (ở bất kỳ độ sâu nào) có thể có tối đa maxChildrenPerAgent (mặc định: 5) tiến trình con đang hoạt động cùng lúc. Điều này ngăn chặn việc mở rộng mất kiểm soát từ một orchestrator duy nhất.
Tham số
Dừng một orchestrator độ sâu 1 sẽ tự động dừng tất cả các tiến trình con độ sâu 2 của nó:/stoptrong chat chính sẽ dừng tất cả agent độ sâu 1 và lan truyền tới các tiến trình con độ sâu 2 của chúng./subagents kill <id>dừng một sub-agent cụ thể và lan truyền tới các tiến trình con của nó./subagents kill alldừng tất cả sub-agent của người yêu cầu và lan truyền tiếp.
Xác thực
Xác thực sub-agent được phân giải theo agent id, không theo loại phiên:- Khóa phiên sub-agent là
agent:<agentId>:subagent:<uuid>. - Auth store được tải từ
agentDircủa agent đó. - Các hồ sơ xác thực của agent chính được gộp vào như một fallback; hồ sơ của agent sẽ ghi đè hồ sơ chính nếu có xung đột.
Announce
Sub-agent báo cáo lại thông qua một bước announce:- Bước announce chạy bên trong phiên sub-agent (không phải phiên của người yêu cầu).
- Nếu sub-agent trả lời chính xác
ANNOUNCE_SKIP, sẽ không có nội dung nào được đăng. - Ngược lại, nội dung announce sẽ được đăng lên kênh chat của người yêu cầu thông qua một lệnh gọi
agenttiếp theo (deliver=true). - Phản hồi announce giữ nguyên định tuyến luồng/chủ đề khi có (Slack threads, Telegram topics, Matrix threads).
- Thông điệp announce được chuẩn hóa theo một mẫu ổn định:
Status:được suy ra từ kết quả chạy (success,error,timeout, hoặcunknown).Result:nội dung tóm tắt từ bước announce (hoặc(not available)nếu thiếu).Notes:chi tiết lỗi và các ngữ cảnh hữu ích khác.
Statuskhông được suy đoán từ đầu ra của model; nó đến từ các tín hiệu kết quả khi chạy.
- Thời gian chạy (ví dụ:
runtime 5m12s) - Mức sử dụng token (đầu vào/đầu ra/tổng)
- Chi phí ước tính khi đã cấu hình giá model (
models.providers.*.models[].cost) sessionKey,sessionId, và đường dẫn transcript (để agent chính có thể lấy lịch sử quasessions_historyhoặc kiểm tra file trên đĩa)
Quản lý Sub-Agent (/subagents)
Sử dụng lệnh slash /subagents để kiểm tra và điều khiển các lần chạy sub-agent cho phiên hiện tại:
sessions_listsessions_historysessions_sendsessions_spawn
1, 2), tiền tố run id, session key đầy đủ, hoặc last.
Ghi đè thông qua cấu hình:
Đồng thời
Các sub-agent sử dụng một hàng đợi nội bộ chuyên dụng trong cùng tiến trình:- Tên lane:
subagent - Độ đồng thời:
agents.defaults.subagents.maxConcurrent(mặc định8)
Dừng
- Gửi
/stoptrong cuộc trò chuyện của requester sẽ hủy phiên requester và dừng mọi tiến trình sub-agent đang chạy được tạo từ đó, bao gồm cả các tiến trình con lồng nhau. /subagents kill <id>sẽ dừng một sub-agent cụ thể và dừng cả các tiến trình con của nó.
Hạn chế
- Thông báo của sub-agent là best-effort. Nếu gateway khởi động lại, các tác vụ “announce back” đang chờ sẽ bị mất.
- Sub-agent vẫn chia sẻ cùng tài nguyên của tiến trình gateway; hãy xem
maxConcurrentnhư một van an toàn. sessions_spawnluôn không chặn: nó trả về{ status: "accepted", runId, childSessionKey }ngay lập tức.- Ngữ cảnh của sub-agent chỉ chèn
AGENTS.md+TOOLS.md(không cóSOUL.md,IDENTITY.md,USER.md,HEARTBEAT.md, hoặcBOOTSTRAP.md). - Độ sâu lồng tối đa là 5 (
maxSpawnDepthphạm vi: 1–5). Độ sâu 2 được khuyến nghị cho hầu hết các trường hợp sử dụng. maxChildrenPerAgentgiới hạn số tiến trình con đang hoạt động trên mỗi phiên (mặc định: 5, phạm vi: 1–20).