Chuyển tới nội dung chính

Đại lý phụ

Công cụ delegate_task tạo ra các phiên bản AIAgent con với ngữ cảnh biệt lập, bộ công cụ bị hạn chế và phiên cuối của riêng chúng. Mỗi đứa trẻ có được một cuộc trò chuyện mới và làm việc độc lập - chỉ phần tóm tắt cuối cùng của nó mới phù hợp với bối cảnh của cha mẹ.

Nhiệm vụ đơn lẻ

delegate_task(
goal="Debug why tests fail",
context="Error: assertion in test_foo.py line 42",
toolsets=["terminal", "file"]
)

Lô song song

Tối đa 3 đại lý phụ đồng thời:

delegate_task(tasks=[
{"goal": "Research topic A", "toolsets": ["web"]},
{"goal": "Research topic B", "toolsets": ["web"]},
{"goal": "Fix the build", "toolsets": ["terminal", "file"]}
])

Ngữ cảnh phụ hoạt động như thế nào

Quan trọng: Các đại lý phụ không biết gì

Các nhóm phụ bắt đầu bằng một cuộc trò chuyện hoàn toàn mới. Họ không biết gì về lịch sử cuộc trò chuyện của phụ huynh, các cuộc gọi công cụ trước đó hoặc bất kỳ điều gì được thảo luận trước khi ủy quyền. Ngữ cảnh duy nhất của tác nhân phụ đến từ các trường goalcontext mà bạn cung cấp.

Điều này có nghĩa là bạn phải chuyển mọi thứ mà đại lý phụ cần:

# BAD - subagent has no idea what "the error" is
delegate_task(goal="Fix the error")

# GOOD - subagent has all context it needs
delegate_task(
goal="Fix the TypeError in api/handlers.py",
context="""The file api/handlers.py has a TypeError on line 47:
'NoneType' object has no attribute 'get'.
The function process_request() receives a dict from parse_body(),
but parse_body() returns None when Content-Type is missing.
The project is at /home/user/myproject and uses Python 3.11."""
)

Tác nhân phụ nhận được lời nhắc hệ thống tập trung được xây dựng từ mục tiêu và ngữ cảnh của bạn, hướng dẫn nó hoàn thành nhiệm vụ và cung cấp bản tóm tắt có cấu trúc về những gì nó đã làm, những gì nó tìm thấy, mọi tệp đã sửa đổi và mọi vấn đề gặp phải.

Ví dụ thực tế

Nghiên cứu song song

Nghiên cứu đồng thời nhiều chủ đề và thu thập tóm tắt:

delegate_task(tasks=[
{
"goal": "Research the current state of WebAssembly in 2025",
"context": "Focus on: browser support, non-browser runtimes, language support",
"toolsets": ["web"]
},
{
"goal": "Research the current state of RISC-V adoption in 2025",
"context": "Focus on: server chips, embedded systems, software ecosystem",
"toolsets": ["web"]
},
{
"goal": "Research quantum computing progress in 2025",
"context": "Focus on: error correction breakthroughs, practical applications, key players",
"toolsets": ["web"]
}
])

Đánh giá mã + Sửa lỗi

Ủy quyền quy trình xem xét và sửa lỗi cho một bối cảnh mới:

delegate_task(
goal="Review the authentication module for security issues and fix any found",
context="""Project at /home/user/webapp.
Auth module files: src/auth/login.py, src/auth/jwt.py, src/auth/middleware.py.
The project uses Flask, PyJWT, and bcrypt.
Focus on: SQL injection, JWT validation, password handling, session management.
Fix any issues found and run the test suite (pytest tests/auth/).""",
toolsets=["terminal", "file"]
)

Tái cấu trúc nhiều tệp

Ủy quyền một nhiệm vụ tái cấu trúc lớn có thể làm ngập bối cảnh của cấp độ gốc:

delegate_task(
goal="Refactor all Python files in src/ to replace print() with proper logging",
context="""Project at /home/user/myproject.
Use the 'logging' module with logger = logging.getLogger(__name__).
Replace print() calls with appropriate log levels:
- print(f"Error: ...") -> logger.error(...)
- print(f"Warning: ...") -> logger.warning(...)
- print(f"Debug: ...") -> logger.debug(...)
- Other prints -> logger.info(...)
Don't change print() in test files or CLI output.
Run pytest after to verify nothing broke.""",
toolsets=["terminal", "file"]
)

Chi tiết chế độ hàng loạt

Khi bạn cung cấp mảng tasks, các tác nhân phụ sẽ chạy song song bằng cách sử dụng nhóm luồng:

  • Tối đa đồng thời: 3 tác vụ (mảng tasks bị cắt ngắn còn 3 nếu dài hơn)
  • Nhóm luồng: Sử dụng ThreadPoolExecutor với MAX_CONCURRENT_CHILDREN = 3 công nhân
  • Hiển thị tiến trình: Ở chế độ CLI, chế độ xem dạng cây hiển thị các lệnh gọi công cụ từ mỗi tác nhân phụ trong thời gian thực với các dòng hoàn thành cho mỗi nhiệm vụ. Ở chế độ cổng, tiến trình được phân nhóm và chuyển tiếp đến lệnh gọi lại tiến trình của cấp độ gốc
  • Sắp xếp kết quả: Kết quả được sắp xếp theo chỉ mục nhiệm vụ để khớp với thứ tự đầu vào bất kể thứ tự hoàn thành
  • Truyền bá gián đoạn: Làm gián đoạn cấp độ gốc (ví dụ: gửi tin nhắn mới) sẽ làm gián đoạn tất cả các cấp độ con đang hoạt động

Ủy quyền một nhiệm vụ chạy trực tiếp mà không cần chi phí nhóm luồng.

Ghi đè mô hình

Bạn có thể định cấu hình một mô hình khác cho các tác nhân phụ thông qua config.yaml — hữu ích khi ủy thác các tác vụ đơn giản cho các mô hình rẻ hơn/nhanh hơn:

# In ~/.hermes/config.yaml
delegation:
model: "google/gemini-flash-2.0"

# Cheaper model for subagents
provider: "openrouter"

# Optional: route subagents to a different provider

Nếu bị bỏ qua, các tác nhân phụ sẽ sử dụng mô hình giống như tác nhân gốc.

Mẹo lựa chọn bộ công cụ

Tham số toolsets kiểm soát những công cụ mà tác nhân phụ có quyền truy cập. Chọn dựa trên nhiệm vụ:

Mẫu bộ công cụTrường hợp sử dụng
["terminal", "file"]Công việc viết mã, gỡ lỗi, chỉnh sửa tệp, xây dựng
["web"]Nghiên cứu, kiểm tra thực tế, tra cứu tài liệu
["terminal", "file", "web"]Nhiệm vụ toàn ngăn xếp (mặc định)
["file"]Phân tích chỉ đọc, xem xét mã mà không thực thi
["terminal"]Quản trị hệ thống, quản lý quy trình
  • delegation — không có ủy quyền đệ quy (ngăn chặn việc sinh sản vô hạn)
  • clarify — tác nhân phụ không thể tương tác với người dùng
  • memory — không ghi vào bộ nhớ liên tục được chia sẻ
  • code_execution — trẻ nên suy luận từng bước một
  • send_message — không có tác dụng phụ đa nền tảng (ví dụ: gửi tin nhắn Telegram)

Số lần lặp tối đa

Mỗi tác nhân phụ có một giới hạn lặp lại (mặc định: 50) để kiểm soát số lượt gọi công cụ có thể thực hiện:

delegate_task(
goal="Quick file check",
context="Check if /etc/nginx/nginx.conf exists and print its first 10 lines",
max_iterations=10

# Simple task, don't need many turns
)

Giới hạn độ sâu

Việc ủy quyền có giới hạn độ sâu là 2 — cha mẹ (độ sâu 0) có thể sinh ra con (độ sâu 1), nhưng con cái không thể ủy quyền thêm. Điều này ngăn chặn chuỗi ủy quyền đệ quy chạy trốn.

Thuộc tính chính

  • Mỗi tác nhân phụ có phiên cuối cùng riêng (tách biệt với tác nhân gốc)
  • Không có sự ủy quyền lồng nhau — con cái không thể ủy quyền thêm (không có cháu)
  • Các đại lý phụ không được gọi: delegate_task , clarify , memory , send_message , execute_code
  • Tuyên truyền ngắt — làm gián đoạn cấp độ gốc sẽ làm gián đoạn tất cả các hoạt động con
  • Chỉ bản tóm tắt cuối cùng mới được đưa vào ngữ cảnh của cấp độ gốc, giúp việc sử dụng mã thông báo luôn hiệu quả
  • Các tác nhân phụ kế thừa khóa API, cấu hình nhà cung cấp và nhóm thông tin xác thực của cha mẹ (cho phép xoay vòng khóa theo giới hạn tốc độ)

Ủy quyền và exec_code

Yếu tốđại biểu_taskthực thi_code
Lý luậnVòng lý luận LLM đầy đủChỉ thực thi mã Python
Bối cảnhCuộc trò chuyện mới mẻKhông có cuộc trò chuyện, chỉ có kịch bản
Quyền truy cập công cụTất cả các công cụ không bị chặn với lý luận7 công cụ thông qua RPC, không cần lý luận
Song songLên đến 3 đại lý con đồng thờiKịch bản đơn
Tốt nhất choNhiệm vụ phức tạp cần phán đoánĐường ống cơ khí nhiều bước
Chi phí mã thông báoCao hơn (vòng LLM đầy đủ)Thấp hơn (chỉ trả về thiết bị xuất chuẩn)
Tương tác người dùngKhông có (đại diện phụ không thể làm rõ)Không có

Quy tắc chung: Sử dụng delegate_task khi nhiệm vụ con yêu cầu lý luận, phán đoán hoặc giải quyết vấn đề gồm nhiều bước. Sử dụng execute_code khi bạn cần xử lý dữ liệu cơ học hoặc quy trình làm việc theo kịch bản.

Cấu hình

# In ~/.hermes/config.yaml
delegation:
max_iterations: 50

# Max turns per child (default: 50)
default_toolsets: ["terminal", "file", "web"]

# Default toolsets
model: "google/gemini-3-flash-preview"

# Optional provider/model override
provider: "openrouter"

# Optional built-in provider

# Or use a direct custom endpoint instead of provider:
delegation:
model: "qwen2.5-coder"
base_url: "http://localhost:1234/v1"
api_key: "local-key"

mẹo

Tác nhân tự động xử lý việc ủy quyền dựa trên mức độ phức tạp của nhiệm vụ. Bạn không cần phải yêu cầu nó ủy quyền một cách rõ ràng — nó sẽ làm như vậy khi thấy hợp lý.