Các hook Plugin là các điểm mở rộng trong tiến trình dành cho plugin OpenClaw. Sử dụng chúng khi một plugin cần kiểm tra hoặc thay đổi lượt chạy của agent, lệnh gọi công cụ, luồng tin nhắn, vòng đời phiên, định tuyến subagent, cài đặt hoặc quá trình khởi động Gateway. Thay vào đó, hãy dùng hook nội bộ khi bạn muốn một scriptDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
HOOK.md nhỏ do người vận hành cài đặt cho các sự kiện lệnh và Gateway như
/new, /reset, /stop, agent:bootstrap, hoặc gateway:startup.
Bắt đầu nhanh
Đăng ký hook plugin có kiểu bằngapi.on(...) từ entry plugin của bạn:
priority giảm dần. Các hook có cùng mức ưu tiên
giữ nguyên thứ tự đăng ký.
api.on(name, handler, opts?) chấp nhận:
priority— thứ tự trình xử lý (cao hơn chạy trước).timeoutMs— ngân sách tùy chọn cho từng hook. Khi được đặt, trình chạy hook hủy trình xử lý đó sau khi hết ngân sách và tiếp tục với trình xử lý tiếp theo, thay vì để tác vụ thiết lập chậm hoặc truy xuất hồi ức tiêu tốn thời gian chờ model đã cấu hình của bên gọi. Bỏ qua để dùng thời gian chờ quan sát/quyết định mặc định mà trình chạy hook áp dụng chung.
event.context.pluginConfig, tức cấu hình đã phân giải cho
plugin đã đăng ký trình xử lý đó. Dùng nó cho các quyết định hook cần
tùy chọn plugin hiện tại; OpenClaw chèn nó theo từng trình xử lý mà không làm thay đổi
đối tượng sự kiện dùng chung mà các plugin khác nhìn thấy.
Danh mục hook
Hook được nhóm theo bề mặt mà chúng mở rộng. Các tên in đậm chấp nhận kết quả quyết định (chặn, hủy, ghi đè hoặc yêu cầu phê duyệt); tất cả tên còn lại chỉ dùng để quan sát. Lượt agentbefore_model_resolve— ghi đè provider hoặc model trước khi thông điệp phiên được tảiagent_turn_prepare— tiêu thụ các lần chèn lượt plugin đang xếp hàng và thêm ngữ cảnh cùng lượt trước các hook promptbefore_prompt_build— thêm ngữ cảnh động hoặc văn bản system prompt trước lệnh gọi modelbefore_agent_start— pha kết hợp chỉ để tương thích; ưu tiên hai hook ở trênbefore_agent_reply— rút ngắn lượt model bằng phản hồi tổng hợp hoặc im lặngbefore_agent_finalize— kiểm tra câu trả lời cuối tự nhiên và yêu cầu thêm một lượt model nữaagent_end— quan sát các thông điệp cuối, trạng thái thành công và thời lượng chạyheartbeat_prompt_contribution— thêm ngữ cảnh chỉ dành cho Heartbeat cho plugin giám sát nền và vòng đời
model_call_started/model_call_ended— quan sát siêu dữ liệu lệnh gọi provider/model đã được làm sạch, thời gian, kết quả và mã băm request-id giới hạn mà không có nội dung prompt hoặc phản hồillm_input— quan sát đầu vào provider (system prompt, prompt, lịch sử)llm_output— quan sát đầu ra provider
before_tool_call— viết lại tham số công cụ, chặn thực thi hoặc yêu cầu phê duyệtafter_tool_call— quan sát kết quả công cụ, lỗi và thời lượngtool_result_persist— viết lại thông điệp assistant được tạo từ kết quả công cụbefore_message_write— kiểm tra hoặc chặn thao tác ghi thông điệp đang diễn ra (hiếm gặp)
inbound_claim— nhận xử lý một tin nhắn đến trước khi định tuyến agent (phản hồi tổng hợp)message_received— quan sát nội dung đến, người gửi, luồng và siêu dữ liệumessage_sending— viết lại nội dung gửi đi hoặc hủy phân phốimessage_sent— quan sát việc phân phối gửi đi thành công hoặc thất bạibefore_dispatch— kiểm tra hoặc viết lại một dispatch gửi đi trước khi bàn giao cho kênhreply_dispatch— tham gia vào pipeline dispatch phản hồi cuối
session_start/session_end— theo dõi các ranh giới vòng đời phiênbefore_compaction/after_compaction— quan sát hoặc chú thích các chu kỳ Compactionbefore_reset— quan sát sự kiện đặt lại phiên (/reset, đặt lại theo chương trình)
subagent_spawning/subagent_delivery_target/subagent_spawned/subagent_ended— điều phối định tuyến subagent và phân phối khi hoàn tất
gateway_start/gateway_stop— khởi động hoặc dừng các dịch vụ do plugin sở hữu cùng với Gatewaycron_changed— quan sát các thay đổi vòng đời Cron do gateway sở hữu (đã thêm, đã cập nhật, đã xóa, đã bắt đầu, đã hoàn tất, đã lên lịch)before_install— kiểm tra lượt quét cài đặt skill hoặc plugin và tùy chọn chặn
Chính sách lệnh gọi công cụ
before_tool_call nhận:
event.toolNameevent.paramsevent.runIdtùy chọnevent.toolCallIdtùy chọn- các trường ngữ cảnh như
ctx.agentId,ctx.sessionKey,ctx.sessionId,ctx.runId,ctx.jobId(được đặt trên các lượt chạy do Cron điều khiển), vàctx.tracechẩn đoán
block: truelà quyết định kết thúc và bỏ qua các trình xử lý có mức ưu tiên thấp hơn.block: falseđược coi là không có quyết định.paramsviết lại tham số công cụ để thực thi.requireApprovaltạm dừng lượt chạy agent và hỏi người dùng thông qua phê duyệt plugin. Lệnh/approvecó thể phê duyệt cả phê duyệt exec và plugin.- Một
block: truecó mức ưu tiên thấp hơn vẫn có thể chặn sau khi hook có mức ưu tiên cao hơn đã yêu cầu phê duyệt. onResolutionnhận quyết định phê duyệt đã phân giải —allow-once,allow-always,deny,timeout, hoặccancelled.
api.registerTrustedToolPolicy(...). Các chính sách này chạy trước các hook
before_tool_call thông thường và trước quyết định của plugin bên ngoài. Chỉ dùng chúng
cho các cổng đáng tin cậy của host như chính sách workspace, thực thi ngân sách hoặc
an toàn quy trình làm việc dành riêng. Plugin bên ngoài nên dùng hook before_tool_call
thông thường.
Lưu bền kết quả công cụ
Kết quả công cụ có thể bao gồmdetails có cấu trúc để render UI, chẩn đoán,
định tuyến media hoặc siêu dữ liệu do plugin sở hữu. Hãy xem details là siêu dữ liệu runtime,
không phải nội dung prompt:
- OpenClaw loại bỏ
toolResult.detailstrước khi phát lại cho provider và đầu vào Compaction để siêu dữ liệu không trở thành ngữ cảnh model. - Các mục phiên đã lưu bền chỉ giữ
detailscó giới hạn. Details quá lớn được thay bằng tóm tắt gọn vàpersistedDetailsTruncated: true. tool_result_persistvàbefore_message_writechạy trước giới hạn lưu bền cuối cùng. Hook vẫn nên giữdetailstrả về ở mức nhỏ và tránh đặt văn bản liên quan đến prompt chỉ trongdetails; đặt đầu ra công cụ mà model nhìn thấy trongcontent.
Hook prompt và model
Dùng các hook theo pha cụ thể cho plugin mới:before_model_resolve: chỉ nhận prompt hiện tại và siêu dữ liệu tệp đính kèm. Trả vềproviderOverridehoặcmodelOverride.agent_turn_prepare: nhận prompt hiện tại, thông điệp phiên đã chuẩn bị, và mọi lần chèn xếp hàng đúng một lần đã được rút cho phiên này. Trả vềprependContexthoặcappendContext.before_prompt_build: nhận prompt hiện tại và thông điệp phiên. Trả vềprependContext,appendContext,systemPrompt,prependSystemContext, hoặcappendSystemContext.heartbeat_prompt_contribution: chỉ chạy cho các lượt Heartbeat và trả vềprependContexthoặcappendContext. Hook này dành cho các trình giám sát nền cần tóm tắt trạng thái hiện tại mà không thay đổi các lượt do người dùng khởi tạo.
before_agent_start vẫn được giữ để tương thích. Ưu tiên các hook rõ ràng ở trên
để plugin của bạn không phụ thuộc vào một pha kết hợp cũ.
before_agent_start và agent_end bao gồm event.runId khi OpenClaw có thể
xác định lượt chạy đang hoạt động. Cùng giá trị đó cũng có sẵn trên ctx.runId.
Các lượt chạy do Cron điều khiển cũng cung cấp ctx.jobId (id công việc cron khởi nguồn) để
hook plugin có thể giới hạn phạm vi metric, tác dụng phụ hoặc trạng thái cho một công việc
đã lên lịch cụ thể.
agent_end là hook quan sát và chạy fire-and-forget sau lượt. Trình chạy hook
áp dụng thời gian chờ 30 giây để một plugin hoặc endpoint embedding bị treo
không thể khiến promise hook chờ mãi. Việc hết thời gian chờ được ghi log và
OpenClaw tiếp tục; nó không hủy tác vụ mạng do plugin sở hữu trừ khi
plugin cũng dùng tín hiệu hủy riêng.
Dùng model_call_started và model_call_ended cho telemetry lệnh gọi provider
không nên nhận prompt thô, lịch sử, phản hồi, header, thân request
hoặc request ID của provider. Các hook này bao gồm siêu dữ liệu ổn định như
runId, callId, provider, model, api/transport tùy chọn,
durationMs/outcome cuối, và upstreamRequestIdHash khi OpenClaw có thể suy ra
mã băm request-id provider có giới hạn.
before_agent_finalize chỉ chạy khi một harness sắp chấp nhận câu trả lời assistant cuối tự nhiên.
Nó không phải là đường dẫn hủy /stop và không chạy khi người dùng hủy một lượt.
Trả về { action: "revise", reason } để yêu cầu harness thêm một lượt model nữa
trước khi hoàn tất, { action: "finalize", reason? } để buộc hoàn tất, hoặc bỏ qua kết quả để tiếp tục.
Các hook Stop gốc của Codex được chuyển tiếp vào hook này dưới dạng quyết định
before_agent_finalize của OpenClaw.
Plugin không được đóng gói cần llm_input, llm_output,
before_agent_finalize, hoặc agent_end phải đặt:
plugins.entries.<id>.hooks.allowPromptInjection=false.
Phần mở rộng phiên và lần chèn lượt tiếp theo
Plugin quy trình làm việc có thể lưu bền trạng thái phiên nhỏ tương thích JSON bằngapi.registerSessionExtension(...) và cập nhật nó thông qua phương thức
sessions.pluginPatch của Gateway. Các hàng phiên chiếu trạng thái phần mở rộng đã đăng ký
thông qua pluginExtensions, cho phép Control UI và các client khác render
trạng thái do plugin sở hữu mà không cần biết nội bộ plugin.
Dùng api.enqueueNextTurnInjection(...) khi một plugin cần ngữ cảnh bền vững
đến được lượt model tiếp theo đúng một lần. OpenClaw rút các lần chèn đã xếp hàng trước
hook prompt, loại bỏ các lần chèn hết hạn và khử trùng lặp theo idempotencyKey
cho từng plugin. Đây là seam phù hợp cho tiếp tục sau phê duyệt, tóm tắt chính sách,
delta của trình giám sát nền và tiếp tục lệnh cần hiển thị với
model ở lượt tiếp theo nhưng không nên trở thành văn bản system prompt vĩnh viễn.
Ngữ nghĩa dọn dẹp là một phần của hợp đồng. Callback dọn dẹp phần mở rộng phiên và
dọn dẹp vòng đời runtime nhận reset, delete, disable, hoặc
restart. Host xóa trạng thái phần mở rộng phiên lưu bền và các lần chèn lượt tiếp theo đang chờ
của plugin sở hữu khi reset/delete/disable; restart giữ
trạng thái phiên bền vững trong khi callback dọn dẹp cho phép plugin giải phóng công việc scheduler,
ngữ cảnh chạy và các tài nguyên ngoài băng khác cho thế hệ runtime cũ.
Hook tin nhắn
Dùng hook tin nhắn cho định tuyến cấp kênh và chính sách phân phối:message_received: quan sát nội dung đến, người gửi,threadId,messageId,senderId, tương quan lượt chạy/phiên tùy chọn, và siêu dữ liệu.message_sending: viết lạicontenthoặc trả về{ cancel: true }.message_sent: quan sát thành công hoặc thất bại cuối cùng.
content có thể chứa bản ghi lời nói ẩn
ngay cả khi payload của kênh không có văn bản/chú thích hiển thị. Việc ghi lại
content chỉ cập nhật bản ghi hiển thị với hook; nó không được hiển thị dưới dạng
chú thích phương tiện.
Ngữ cảnh hook tin nhắn hiển thị các trường tương quan ổn định khi có:
ctx.sessionKey, ctx.runId, ctx.messageId, ctx.senderId, ctx.trace,
ctx.traceId, ctx.spanId, ctx.parentSpanId, và ctx.callDepth. Ưu tiên
các trường hạng nhất này trước khi đọc siêu dữ liệu cũ.
Ưu tiên các trường threadId và replyToId có kiểu trước khi dùng siêu dữ liệu
riêng theo kênh.
Quy tắc quyết định:
message_sendingvớicancel: truelà quyết định cuối cùng.message_sendingvớicancel: falseđược xem là không có quyết định.contentđã ghi lại tiếp tục chuyển đến các hook có độ ưu tiên thấp hơn trừ khi một hook sau đó hủy việc gửi.
Hook cài đặt
before_install chạy sau quá trình quét tích hợp sẵn cho các lượt cài đặt skill và Plugin.
Trả về các phát hiện bổ sung hoặc { block: true, blockReason } để dừng
cài đặt.
block: true là quyết định cuối cùng. block: false được xem là không có quyết định.
Vòng đời Gateway
Dùnggateway_start cho các dịch vụ Plugin cần trạng thái do Gateway sở hữu. Ngữ cảnh
hiển thị ctx.config, ctx.workspaceDir, và ctx.getCron?.() để kiểm tra và
cập nhật cron. Dùng gateway_stop để dọn dẹp các tài nguyên chạy lâu.
Không dựa vào hook nội bộ gateway:startup cho các dịch vụ runtime do Plugin sở hữu.
cron_changed kích hoạt cho các sự kiện vòng đời cron do gateway sở hữu với payload
sự kiện có kiểu bao gồm các lý do added, updated, removed, started, finished,
và scheduled. Sự kiện mang một ảnh chụp nhanh PluginHookGatewayCronJob
(bao gồm state.nextRunAtMs, state.lastRunStatus, và
state.lastError khi có) cùng với một PluginHookGatewayCronDeliveryStatus
là not-requested | delivered | not-delivered | unknown. Các sự kiện đã xóa
vẫn mang ảnh chụp nhanh công việc đã xóa để bộ lập lịch bên ngoài có thể
đối chiếu trạng thái. Dùng ctx.getCron?.() và ctx.config từ ngữ cảnh runtime
khi đồng bộ bộ lập lịch đánh thức bên ngoài, và giữ OpenClaw làm
nguồn sự thật cho việc kiểm tra đến hạn và thực thi.
Các tính năng sắp ngừng hỗ trợ
Một vài bề mặt liền kề hook đã bị ngừng hỗ trợ nhưng vẫn được hỗ trợ. Hãy di chuyển trước bản phát hành lớn tiếp theo:- Phong bì kênh văn bản thuần túy trong các trình xử lý
inbound_claimvàmessage_received. ĐọcBodyForAgentvà các khối ngữ cảnh người dùng có cấu trúc thay vì phân tích văn bản phong bì phẳng. Xem Phong bì kênh văn bản thuần túy → BodyForAgent. before_agent_startvẫn tồn tại để tương thích. Plugin mới nên dùngbefore_model_resolvevàbefore_prompt_buildthay vì pha kết hợp.onResolutiontrongbefore_tool_callhiện dùng union có kiểuPluginApprovalResolution(allow-once/allow-always/deny/timeout/cancelled) thay vìstringdạng tự do.
command-auth → command-status — xem
Di chuyển Plugin SDK → Các tính năng đang ngừng hỗ trợ.
Liên quan
- Di chuyển Plugin SDK — các tính năng đang ngừng hỗ trợ và mốc thời gian gỡ bỏ
- Xây dựng Plugin
- Tổng quan Plugin SDK
- Điểm vào Plugin
- Hook nội bộ
- Nội bộ kiến trúc Plugin