Phần lớn agent AI chạy một lượt một lần. Bạn gõ, chúng trả lời, chúng chờ. Bạn chính là vòng lặp. Agent chỉ là một lần gọi hàm.
Hermes Agent có chế độ đó — mặc định là vậy. Nhưng nó cũng mang theo một chế độ khác, gọi là /goal, ở đó agent tự chạy vòng lặp. Bạn đặt một mục tiêu kèm tiêu chí thành công, agent đề xuất, thực thi, đánh giá, thử lại, và cứ thế tiếp tục đến khi một LLM judge riêng đồng ý rằng tiêu chí đã đạt. v0.14.0 (16 tháng 5/2026) thêm /subgoal để bạn xếp thêm tiêu chí lên một vòng đang sống giữa chừng mà không restart (#25449).
Bài này đi xuyên qua cái thực sự đang xảy ra, khi nào đây là tool đúng, và những kiểu hỏng làm nó thành tool sai.
Chế độ mặc định (để đối chiếu)
Mỗi session chat trong Hermes là một lượt cho một tin nhắn của user. Agent đọc tin nhắn của bạn, tùy ý gọi tool, rồi trả về một câu trả lời. Nếu task chưa xong, bạn phải đẩy nó: "tiếp tục", "thử lại", "thế còn X". Bạn là vòng lặp bên ngoài.
Việc này ổn cho công việc thăm dò — "giải thích đoạn code này", "soạn cho tôi một memo", "tìm cho tôi một bug". Bạn muốn agent dừng sau mỗi bước để bạn có thể đổi hướng.
Nó không ổn cho task mà điều kiện thành công cụ thể và đường đi tới đó mang tính lặp. "Refactor module này đến khi pytest qua" là task ba mươi lượt nếu bạn lái từng lượt. Với /goal, nó là một câu lệnh.
/goal thực sự làm gì
/goal Make all tests in tests/api/ pass. Don't change the test assertions. Done when pytest exits 0.
Khi bạn gửi cái đó, ba thứ xảy ra:
- 1.Văn bản goal trở thành prompt mục tiêu cho worker. Mỗi lượt tiếp theo, worker model nhận một system message bao gồm goal và phiên bản tốt nhất hiện tại.
- 2.Một cuộc gọi LLM "judge" riêng chạy sau mỗi lượt worker. Judge thấy goal, trạng thái hiện tại, và phiên bản hoàn thành đề xuất. Nó trả về hoặc "done" (vòng lặp thoát), hoặc "tiếp tục đi, còn thiếu cái này".
- 3.Vòng lặp tiếp tục đến khi judge nói done — hoặc đến khi bạn dừng nó bằng
/stop, hoặc đến khi nó đạt giới hạn lặp đã cấu hình.
Judge là mảnh then chốt. Nó không phải cùng cuộc gọi LLM với worker, và nó không thấy chain of thought — chỉ thấy goal và trạng thái hiện tại. Sự tách biệt đó là cái làm /goal hoạt động: một worker model đã tự thuyết phục mình rằng câu trả lời của nó đúng là một thẩm phán kém. Một cuộc gọi LLM tươi không có context là một thẩm phán tốt hơn nhiều.
Mẫu này, trong codebase Hermes, được gọi là "Ralph loop" theo pseudocode kinh điển while not done: do(work); ralph = judge(work). Mở rộng /subgoal ở v0.14.0 cho phép người dùng tiêm tiêu chí judge mới vào một vòng đang chạy.
/subgoal — gắn tiêu chí giữa chừng
Bạn bắt đầu một /goal để refactor một module. Ba vòng vào, bạn nhận ra mình cũng muốn cuộc refactor giữ cyclomatic complexity dưới 10 cho mỗi hàm. Bạn không muốn dừng vòng lặp và khởi động lại.
/subgoal Each function must have cyclomatic complexity <= 10.
Lần tiếp theo judge chạy, nó tính cả ràng buộc mới đó. Nếu phiên bản tốt nhất hiện tại không vượt qua, vòng lặp tiếp tục. Nếu vượt qua, vòng lặp thoát.
Đây là loại tính năng nhìn nhỏ trong một bullet release notes — "tiêu chí người dùng thêm vào, được gắn vào một /goal đang sống" — nhưng hóa ra là cột chịu lực cho bất kỳ ai thực sự dùng vòng lặp. Mục tiêu thật được tinh chỉnh khi bạn nhìn agent làm việc. Không có /subgoal, cách duy nhất để tinh chỉnh là /stop + định nghĩa lại + /goal lại, mất luôn trạng thái dang dở.
Ví dụ thực tế
Refactor đến khi test qua
/goal Refactor src/api/users.py so the User class follows the new naming convention in src/conventions.md. Don't break any existing tests. Done when:
1. pytest exits 0
2. The User class matches the convention rules in conventions.md
Worker thử các refactor, judge kiểm cả hai điều kiện. Khi cả hai xanh, vòng lặp thoát.
Lặp trên một UI
/goal Make the button on /pricing more prominent. Done when:
1. The button is the largest interactive element above the fold on desktop
2. It uses the primary brand color (#FF5A50)
3. Existing Lighthouse accessibility score doesn't drop
Worker sửa CSS, judge chụp ảnh qua browser tool và kiểm. Nhiều lượt lặp được, mà bạn không phải trông coi.
Tìm một bug
/goal Find the cause of the intermittent test failure in tests/auth/test_session.py::test_logout_clears_cookie. Done when you produce a minimal failing repro and a one-paragraph explanation.
Judge ở đây kiểm rằng cả hai phần của deliverable đều có — bản repro tối thiểu và lời giải thích — không chỉ một trong hai đáp xuống. /subgoal cho bạn thêm một ràng buộc kiểu "lời giải thích phải tham chiếu vòng request/response liên quan" nếu bản nháp đầu quá mờ.
Khi nào không dùng
/goal là tool sai cho task mà:
- •Điều kiện thành công mơ hồ. "Làm cái này thanh lịch hơn" — judge không chấm được nhất quán, nên vòng lặp dao động hoặc đóng dấu cho qua. Dùng lượt-một-lượt ở đây.
- •Bạn muốn nhìn việc trong khi nó đang xảy ra. Mỗi lượt chạy đến hoàn tất trước khi judge nổ, nên bạn không có cùng mức hiển thị theo lượt. Dùng lượt-một-lượt hay
/handoffnếu việc xem xét giữa luồng có ý nghĩa. - •Chi phí quan trọng hơn tốc độ. Mỗi lượt lặp là một call worker cộng một call judge. Với goal 10 lần lặp, bạn trả 20 cuộc gọi LLM. Đáng cho việc refactor; phí phạm cho "tôi nên đặt tên biến này là gì".
- •Bạn chưa nghĩ kỹ về tiêu chí thành công. Tiêu chí rác → vòng lặp rác.
/goalthưởng cho sự cụ thể, và agent sẽ khai thác mọi mơ hồ.
/goal tương tác với /handoff ra sao
v0.14.0 cũng ra /handoff, chuyển một session sống giữa các model mà không mất context (#23395). Hai cái này ghép được: bạn có thể trao một goal-đang-tiến-hành từ một model nhanh sang một model deep-reasoning khi goal đập vào thứ mà model nhanh không giải được. Judge tiếp tục chấm cùng tiêu chí; worker chỉ vừa được nâng cấp.
Tương tự với /sessions (#20805) — bạn có thể ngắt một goal, duyệt sang một session khác, và phục hồi goal sau. Trạng thái vòng lặp được checkpoint.
Vị trí của nó trong stack agent
Ba hình dạng khác nhau của công việc tự trị, theo thứ tự tăng dần độ agent-tự-lái:
- 1.Lượt-một-lượt — bạn lái, agent đáp lời. Mang tính trò chuyện.
- 2.
/goal— bạn đặt tiêu chí, agent vòng đến khi đạt. Tự trị có giới hạn. - 3.Cron scheduling — agent chạy không giám sát theo lịch, giao về các nền tảng nhắn tin. Tự trị không giới hạn về thời gian.
/goal là cái ở giữa. Đây là tầm với đúng cho một loại task mà trước đây hoặc đòi trông coi nặng hoặc đòi script riêng. /subgoal của v0.14.0 làm vòng lặp lái được giữa chừng, và đó là cái biến nó từ một thứ kỳ thú thành một công cụ hằng ngày.