Fundamentals
Vòng lặp tác nhân
Vòng lặp tác tử là lần chạy "thực" đầy đủ của một tác tử: tiếp nhận → lắp ráp ngữ cảnh → suy luận mô hình → thực thi công cụ → truyền phát phản hồi → lưu bền. Đây là đường dẫn có thẩm quyền biến một tin nhắn thành các hành động và phản hồi cuối cùng, đồng thời giữ trạng thái phiên nhất quán.
Trong OpenClaw, một vòng lặp là một lần chạy đơn lẻ, được tuần tự hóa trên mỗi phiên, phát ra các sự kiện vòng đời và luồng khi mô hình suy nghĩ, gọi công cụ và truyền phát đầu ra. Tài liệu này giải thích cách vòng lặp xác thực đó được nối dây từ đầu đến cuối.
Điểm vào
- Gateway RPC:
agentvàagent.wait. - CLI: lệnh
agent.
Cách hoạt động (tổng quan)
- RPC
agentxác thực tham số, phân giải phiên (sessionKey/sessionId), lưu bền siêu dữ liệu phiên, trả về{ runId, acceptedAt }ngay lập tức. agentCommandchạy tác tử:- phân giải mô hình + giá trị mặc định thinking/verbose/trace
- tải ảnh chụp nhanh Skills
- gọi
runEmbeddedPiAgent(runtime pi-agent-core) - phát kết thúc/lỗi vòng đời nếu vòng lặp nhúng không phát một sự kiện như vậy
runEmbeddedPiAgent:- tuần tự hóa các lần chạy qua hàng đợi theo phiên + toàn cục
- phân giải mô hình + hồ sơ xác thực và dựng phiên pi
- đăng ký theo dõi sự kiện pi và truyền phát delta của trợ lý/công cụ
- áp đặt thời gian chờ -> hủy lần chạy nếu vượt quá
- với lượt Codex app-server, hủy một lượt đã được chấp nhận nếu nó ngừng tạo tiến trình app-server trước một sự kiện kết thúc
- trả về payload + siêu dữ liệu sử dụng
subscribeEmbeddedPiSessionbắc cầu các sự kiện pi-agent-core sang luồngagentcủa OpenClaw:- sự kiện công cụ =>
stream: "tool" - delta của trợ lý =>
stream: "assistant" - sự kiện vòng đời =>
stream: "lifecycle"(phase: "start" | "end" | "error")
- sự kiện công cụ =>
agent.waitdùngwaitForAgentRun:- chờ kết thúc/lỗi vòng đời cho
runId - trả về
{ status: ok|error|timeout, startedAt, endedAt, error? }
- chờ kết thúc/lỗi vòng đời cho
Xếp hàng + đồng thời
- Các lần chạy được tuần tự hóa theo khóa phiên (làn phiên) và tùy chọn qua một làn toàn cục.
- Điều này ngăn các cuộc đua công cụ/phiên và giữ lịch sử phiên nhất quán.
- Các kênh nhắn tin có thể chọn chế độ hàng đợi (thu thập/điều hướng/theo dõi) nạp vào hệ thống làn này. Xem Hàng đợi lệnh.
- Việc ghi bản ghi hội thoại cũng được bảo vệ bằng khóa ghi phiên trên tệp phiên. Khóa này
nhận biết tiến trình và dựa trên tệp, nên nó bắt được các trình ghi bỏ qua hàng đợi trong tiến trình hoặc đến từ
tiến trình khác. Trình ghi bản ghi hội thoại phiên chờ tối đa
session.writeLock.acquireTimeoutMstrước khi báo cáo phiên đang bận; mặc định là60000ms. - Khóa ghi phiên mặc định không tái nhập. Nếu một helper cố ý lồng việc giành
cùng khóa trong khi vẫn giữ một trình ghi logic duy nhất, nó phải chọn tham gia rõ ràng bằng
allowReentrant: true.
Chuẩn bị phiên + workspace
- Workspace được phân giải và tạo; các lần chạy trong sandbox có thể chuyển hướng đến gốc workspace sandbox.
- Skills được tải (hoặc dùng lại từ ảnh chụp nhanh) và được tiêm vào env và prompt.
- Các tệp bootstrap/ngữ cảnh được phân giải và tiêm vào báo cáo system prompt.
- Khóa ghi phiên được giành;
SessionManagerđược mở và chuẩn bị trước khi truyền phát. Bất kỳ đường dẫn ghi lại bản ghi hội thoại, Compaction hoặc cắt bớt nào sau đó đều phải lấy cùng khóa trước khi mở hoặc biến đổi tệp bản ghi hội thoại.
Lắp ráp prompt + system prompt
- System prompt được xây dựng từ prompt nền tảng của OpenClaw, prompt Skills, ngữ cảnh bootstrap và các ghi đè theo lần chạy.
- Các giới hạn theo mô hình và token dự trữ cho Compaction được áp đặt.
- Xem System prompt để biết mô hình nhìn thấy gì.
Điểm hook (nơi bạn có thể chặn)
OpenClaw có hai hệ thống hook:
- Hook nội bộ (hook Gateway): script hướng sự kiện cho lệnh và sự kiện vòng đời.
- Hook Plugin: điểm mở rộng bên trong vòng đời tác tử/công cụ và pipeline Gateway.
Hook nội bộ (hook Gateway)
agent:bootstrap: chạy trong khi dựng tệp bootstrap trước khi system prompt được hoàn tất. Dùng mục này để thêm/xóa tệp ngữ cảnh bootstrap.- Hook lệnh:
/new,/reset,/stopvà các sự kiện lệnh khác (xem tài liệu Hook).
Xem Hook để biết cách thiết lập và ví dụ.
Hook Plugin (vòng đời tác tử + Gateway)
Các hook này chạy bên trong vòng lặp tác tử hoặc pipeline Gateway:
before_model_resolve: chạy trước phiên (không cómessages) để ghi đè provider/model một cách xác định trước khi phân giải mô hình.before_prompt_build: chạy sau khi tải phiên (cómessages) để tiêmprependContext,systemPrompt,prependSystemContexthoặcappendSystemContexttrước khi gửi prompt. DùngprependContextcho văn bản động theo lượt và các trường system-context cho hướng dẫn ổn định nên nằm trong không gian system prompt.before_agent_start: hook tương thích kế thừa có thể chạy ở một trong hai pha; ưu tiên các hook rõ ràng ở trên.before_agent_reply: chạy sau hành động nội tuyến và trước lệnh gọi LLM, cho phép Plugin nhận lượt và trả về phản hồi tổng hợp hoặc làm im lặng toàn bộ lượt.agent_end: kiểm tra danh sách tin nhắn cuối cùng và siêu dữ liệu lần chạy sau khi hoàn tất.before_compaction/after_compaction: quan sát hoặc chú thích các chu kỳ Compaction.before_tool_call/after_tool_call: chặn tham số/kết quả công cụ.before_install: kiểm tra phát hiện quét tích hợp và tùy chọn chặn cài đặt skill hoặc Plugin.tool_result_persist: biến đổi đồng bộ kết quả công cụ trước khi chúng được ghi vào bản ghi hội thoại phiên do OpenClaw sở hữu.message_received/message_sending/message_sent: hook tin nhắn vào + ra.session_start/session_end: ranh giới vòng đời phiên.gateway_start/gateway_stop: sự kiện vòng đời Gateway.
Quy tắc quyết định hook cho bộ bảo vệ gửi ra/công cụ:
before_tool_call:{ block: true }là kết thúc và dừng các handler có mức ưu tiên thấp hơn.before_tool_call:{ block: false }là không thao tác và không xóa chặn trước đó.before_install:{ block: true }là kết thúc và dừng các handler có mức ưu tiên thấp hơn.before_install:{ block: false }là không thao tác và không xóa chặn trước đó.message_sending:{ cancel: true }là kết thúc và dừng các handler có mức ưu tiên thấp hơn.message_sending:{ cancel: false }là không thao tác và không xóa hủy trước đó.
Xem hook Plugin để biết API hook và chi tiết đăng ký.
Các harness có thể điều chỉnh các hook này theo cách khác. Harness Codex app-server giữ hook Plugin OpenClaw làm hợp đồng tương thích cho các bề mặt được phản chiếu đã ghi tài liệu, trong khi hook gốc Codex vẫn là một cơ chế Codex cấp thấp riêng biệt.
Truyền phát + phản hồi từng phần
- Delta của trợ lý được truyền phát từ pi-agent-core và phát ra dưới dạng sự kiện
assistant. - Truyền phát khối có thể phát phản hồi từng phần trên
text_endhoặcmessage_end. - Truyền phát suy luận có thể được phát như một luồng riêng hoặc dưới dạng phản hồi khối.
- Xem Truyền phát để biết hành vi chia khúc và phản hồi khối.
Thực thi công cụ + công cụ nhắn tin
- Sự kiện bắt đầu/cập nhật/kết thúc công cụ được phát trên luồng
tool. - Kết quả công cụ được làm sạch theo kích thước và payload hình ảnh trước khi ghi log/phát.
- Các lần gửi bằng công cụ nhắn tin được theo dõi để ngăn xác nhận trợ lý trùng lặp.
Định dạng phản hồi + triệt tiêu
- Payload cuối cùng được lắp ráp từ:
- văn bản trợ lý (và suy luận tùy chọn)
- tóm tắt công cụ nội tuyến (khi verbose + được phép)
- văn bản lỗi trợ lý khi mô hình lỗi
- Token im lặng chính xác
NO_REPLY/no_replyđược lọc khỏi payload gửi ra. - Các bản trùng lặp của công cụ nhắn tin được xóa khỏi danh sách payload cuối cùng.
- Nếu không còn payload có thể render và một công cụ bị lỗi, một phản hồi lỗi công cụ dự phòng được phát (trừ khi công cụ nhắn tin đã gửi một phản hồi hiển thị cho người dùng).
Compaction + thử lại
- Auto-compaction phát sự kiện luồng
compactionvà có thể kích hoạt thử lại. - Khi thử lại, bộ đệm trong bộ nhớ và tóm tắt công cụ được đặt lại để tránh đầu ra trùng lặp.
- Xem Compaction để biết pipeline Compaction.
Luồng sự kiện (hiện nay)
lifecycle: được phát bởisubscribeEmbeddedPiSession(và dưới dạng dự phòng bởiagentCommand)assistant: delta truyền phát từ pi-agent-coretool: sự kiện công cụ truyền phát từ pi-agent-core
Xử lý kênh chat
- Delta của trợ lý được đệm thành tin nhắn chat
delta. - Chat
finalđược phát khi kết thúc/lỗi vòng đời.
Thời gian chờ
- Mặc định của
agent.wait: 30 giây (chỉ phần chờ). Tham sốtimeoutMsghi đè. - Runtime tác tử: mặc định
agents.defaults.timeoutSecondslà 172800 giây (48 giờ); được áp đặt trong bộ hẹn giờ hủyrunEmbeddedPiAgent. - Runtime Cron:
timeoutSecondscủa lượt tác tử cô lập do cron sở hữu. Bộ lập lịch khởi động bộ hẹn giờ đó khi bắt đầu thực thi, hủy lần chạy bên dưới ở hạn chót đã cấu hình, rồi chạy dọn dẹp có giới hạn trước khi ghi nhận thời gian chờ để một phiên con cũ không thể giữ làn bị kẹt. - Chẩn đoán độ sống phiên: khi bật chẩn đoán,
diagnostics.stuckSessionWarnMsphân loại các phiênprocessingkéo dài mà không quan sát thấy phản hồi, công cụ, trạng thái, khối hoặc tiến trình ACP. Các lần chạy nhúng, lệnh gọi mô hình và lệnh gọi công cụ đang hoạt động được báo cáo làsession.long_running; công việc đang hoạt động nhưng không có tiến trình gần đây được báo cáo làsession.stalled;session.stuckđược dành cho sổ sách phiên cũ không có công việc đang hoạt động. Sổ sách phiên cũ giải phóng làn phiên bị ảnh hưởng ngay lập tức; các lần chạy nhúng bị đình trệ chỉ được hủy-xả saudiagnostics.stuckSessionAbortMs(mặc định: ít nhất 10 phút và gấp 5 lần ngưỡng cảnh báo) để công việc trong hàng đợi có thể tiếp tục mà không cắt ngang các lần chạy chỉ chậm. Khôi phục phát các kết quả requested/completed có cấu trúc, và trạng thái chẩn đoán chỉ được đánh dấu rảnh nếu cùng thế hệ xử lý vẫn còn hiện hành. Các chẩn đoánsession.stucklặp lại sẽ lùi dần trong khi phiên vẫn không đổi. - Thời gian chờ nhàn rỗi của mô hình: OpenClaw hủy một yêu cầu mô hình khi không có chunk phản hồi nào đến trước cửa sổ nhàn rỗi.
models.providers.<id>.timeoutSecondsmở rộng bộ canh chừng nhàn rỗi này cho các provider cục bộ/tự lưu trữ chậm; nếu không, OpenClaw dùngagents.defaults.timeoutSecondskhi được cấu hình, mặc định giới hạn ở 120 giây. Các lần chạy do Cron kích hoạt không có thời gian chờ mô hình hoặc tác tử rõ ràng sẽ tắt bộ canh chừng nhàn rỗi và dựa vào thời gian chờ ngoài của cron. - Thời gian chờ yêu cầu HTTP của provider:
models.providers.<id>.timeoutSecondsáp dụng cho các lần fetch HTTP mô hình của provider đó, bao gồm kết nối, header, body, thời gian chờ yêu cầu SDK, xử lý hủy guarded-fetch tổng thể và bộ canh chừng nhàn rỗi luồng mô hình. Dùng mục này cho các provider cục bộ/tự lưu trữ chậm như Ollama trước khi tăng thời gian chờ runtime của toàn bộ tác tử.
Nơi mọi thứ có thể kết thúc sớm
- Thời gian chờ tác tử (hủy)
- AbortSignal (hủy)
- Gateway ngắt kết nối hoặc thời gian chờ RPC
- Thời gian chờ
agent.wait(chỉ chờ, không dừng tác tử)
Liên quan
- Công cụ — công cụ tác tử có sẵn
- Hook — script hướng sự kiện được kích hoạt bởi sự kiện vòng đời tác tử
- Compaction — cách các cuộc trò chuyện dài được tóm tắt
- Phê duyệt Exec — cổng phê duyệt cho lệnh shell
- Thinking — cấu hình cấp độ thinking/reasoning