Quản lý phiên & Nén (Chuyên sâu)
Tài liệu này giải thích cách OpenClaw quản lý phiên từ đầu đến cuối:- Định tuyến phiên (cách thông điệp đến được ánh xạ tới một
sessionKey) - Kho phiên (
sessions.json) và những gì nó theo dõi - Lưu trữ bản ghi hội thoại (
*.jsonl) và cấu trúc của nó - Vệ sinh bản ghi hội thoại (các chỉnh sửa theo nhà cung cấp trước khi chạy)
- Giới hạn ngữ cảnh (cửa sổ ngữ cảnh so với token được theo dõi)
- Nén (nén thủ công + tự động) và nơi gắn công việc trước khi nén
- Dọn dẹp im lặng (ví dụ: ghi bộ nhớ không nên tạo đầu ra hiển thị cho người dùng)
Nguồn sự thật: Gateway
OpenClaw được thiết kế xoay quanh một tiến trình Gateway duy nhất nắm quyền sở hữu trạng thái phiên.- Các UI (ứng dụng macOS, Control UI web, TUI) nên truy vấn Gateway để lấy danh sách phiên và số lượng token.
- Ở chế độ từ xa, các tệp phiên nằm trên máy chủ từ xa; “kiểm tra các tệp trên Mac cục bộ” sẽ không phản ánh những gì Gateway đang dùng.
Hai lớp lưu trữ
OpenClaw lưu trữ phiên ở hai lớp:-
Kho phiên (
sessions.json)- Ánh xạ khóa/giá trị:
sessionKey -> SessionEntry - Nhỏ, có thể thay đổi, an toàn để chỉnh sửa (hoặc xóa mục)
- Theo dõi metadata của phiên (session id hiện tại, hoạt động gần nhất, các toggle, bộ đếm token, v.v.)
- Ánh xạ khóa/giá trị:
-
Bản ghi hội thoại (
<sessionId>.jsonl)- Bản ghi chỉ-ghi-nối với cấu trúc cây (các mục có
id+parentId) - Lưu trữ cuộc trò chuyện thực tế + lời gọi công cụ + tóm tắt nén
- Dùng để tái dựng ngữ cảnh mô hình cho các lượt sau
- Bản ghi chỉ-ghi-nối với cấu trúc cây (các mục có
Vị trí trên đĩa
Theo từng tác tử, trên máy chủ gateway:- Kho:
~/.openclaw/agents/<agentId>/sessions/sessions.json - Bản ghi hội thoại:
~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl- Phiên theo chủ đề Telegram:
.../<sessionId>-topic-<threadId>.jsonl
- Phiên theo chủ đề Telegram:
src/config/sessions.ts.
Khóa phiên (sessionKey)
Một sessionKey xác định bạn đang ở “ngăn” hội thoại nào (định tuyến + cô lập).
Các mẫu phổ biến:
- Chat chính/trực tiếp (theo từng tác tử):
agent:<agentId>:<mainKey>(mặc địnhmain) - Nhóm:
agent:<agentId>:<channel>:group:<id> - Phòng/kênh (Discord/Slack):
agent:<agentId>:<channel>:channel:<id>hoặc...:room:<id> - Cron:
cron:<job.id> - Webhook:
hook:<uuid>(trừ khi bị ghi đè)
Session id (sessionId)
Mỗi sessionKey trỏ tới một sessionId hiện tại (tệp bản ghi hội thoại tiếp tục cuộc trò chuyện).
Quy tắc kinh nghiệm:
- Reset (
/new,/reset) tạo mộtsessionIdmới chosessionKeyđó. - Reset hằng ngày (mặc định 4:00 sáng theo giờ địa phương trên máy chủ gateway) tạo một
sessionIdmới ở thông điệp kế tiếp sau mốc reset. - Hết hạn khi nhàn rỗi (
session.reset.idleMinuteshoặc legacysession.idleMinutes) tạo mộtsessionIdmới khi một tin nhắn đến sau cửa sổ nhàn rỗi. Khi cả daily + idle đều được cấu hình, cái nào hết hạn trước sẽ được ưu tiên.
initSessionState() ở src/auto-reply/reply/session.ts.
Lược đồ kho phiên (sessions.json)
Kiểu giá trị của kho là SessionEntry trong src/config/sessions.ts.
Các trường chính (không đầy đủ):
sessionId: id bản ghi hội thoại hiện tại (tên tệp được suy ra từ đây trừ khi đặtsessionFile)updatedAt: dấu thời gian hoạt động gần nhấtsessionFile: ghi đè đường dẫn bản ghi hội thoại tường minh (tùy chọn)chatType:direct | group | room(giúp UI và chính sách gửi)provider,subject,room,space,displayName: metadata cho gắn nhãn nhóm/kênh- Toggle:
thinkingLevel,verboseLevel,reasoningLevel,elevatedLevelsendPolicy(ghi đè theo phiên)
- Chọn mô hình:
providerOverride,modelOverride,authProfileOverride
- Bộ đếm token (nỗ lực tốt nhất / phụ thuộc nhà cung cấp):
inputTokens,outputTokens,totalTokens,contextTokens
compactionCount: số lần tự động nén đã hoàn tất cho khóa phiên nàymemoryFlushAt: dấu thời gian của lần xả bộ nhớ trước khi nén gần nhấtmemoryFlushCompactionCount: số lần nén tại thời điểm lần xả cuối chạy
Cấu trúc bản ghi hội thoại (*.jsonl)
Bản ghi hội thoại được quản lý bởi @mariozechner/pi-coding-agent’s SessionManager.
Tệp ở định dạng JSONL:
- Dòng đầu: header phiên (
type: "session", bao gồmid,cwd,timestamp, tùy chọnparentSession) - Sau đó: các mục phiên với
id+parentId(cây)
message: thông điệp user/assistant/toolResultcustom_message: thông điệp do extension chèn có đi vào ngữ cảnh mô hình (có thể ẩn khỏi UI)custom: trạng thái extension không đi vào ngữ cảnh mô hìnhcompaction: tóm tắt nén được lưu vớifirstKeptEntryIdvàtokensBeforebranch_summary: tóm tắt được lưu khi điều hướng một nhánh cây
SessionManager để đọc/ghi chúng.
Cửa sổ ngữ cảnh vs token được theo dõi
Hai khái niệm khác nhau đều quan trọng:- Cửa sổ ngữ cảnh của mô hình: giới hạn cứng theo từng mô hình (token nhìn thấy bởi mô hình)
- Bộ đếm trong kho phiên: thống kê cuộn được ghi vào
sessions.json(dùng cho /status và dashboard)
- Cửa sổ ngữ cảnh đến từ danh mục mô hình (và có thể ghi đè qua cấu hình).
contextTokenstrong kho là giá trị ước lượng/báo cáo lúc chạy; đừng coi đó là bảo đảm nghiêm ngặt.
Nén: là gì
Nén tóm tắt cuộc trò chuyện cũ thành một mụccompaction được lưu trong bản ghi và giữ nguyên các thông điệp gần đây.
Sau khi nén, các lượt sau sẽ thấy:
- Tóm tắt nén
- Các thông điệp sau
firstKeptEntryId
- Khóa phiên sai? 33. Bắt đầu với /concepts/session và xác nhận
sessionKeytrong/status.
Khi nào tự động nén diễn ra (runtime Pi)
Trong tác tử Pi nhúng, tự động nén kích hoạt trong hai trường hợp:- Khôi phục tràn: mô hình trả lỗi tràn ngữ cảnh → nén → thử lại.
- Bảo trì theo ngưỡng: sau một lượt thành công, khi:
contextTokens > contextWindow - reserveTokens
Trong đó:
contextWindowlà cửa sổ ngữ cảnh của mô hìnhreserveTokenslà phần đệm dành cho prompt + đầu ra mô hình kế tiếp
Thiết lập nén (reserveTokens, keepRecentTokens)
Thiết lập nén của Pi nằm trong cài đặt Pi:
- Nếu
compaction.reserveTokens < reserveTokensFloor, OpenClaw sẽ nâng lên. - Mức sàn mặc định là
20000token. - Đặt
agents.defaults.compaction.reserveTokensFloor: 0để tắt mức sàn. - Nếu đã cao hơn, OpenClaw giữ nguyên.
ensurePiCompactionReserveTokens() trong src/agents/pi-settings.ts
(được gọi từ src/agents/pi-embedded-runner.ts).
Bề mặt hiển thị cho người dùng
Bạn có thể quan sát nén và trạng thái phiên qua:/status(trong bất kỳ phiên chat nào)openclaw status(CLI)openclaw sessions/sessions --json- Chế độ verbose:
🧹 Auto-compaction complete+ số lần nén
Dọn dẹp im lặng (NO_REPLY)
OpenClaw hỗ trợ các lượt “im lặng” cho tác vụ nền nơi người dùng không nên thấy đầu ra trung gian.
Quy ước:
- Assistant bắt đầu đầu ra bằng
NO_REPLYđể báo “không gửi phản hồi cho người dùng”. - OpenClaw loại bỏ/ẩn điều này ở lớp phân phối.
2026.1.10, OpenClaw cũng ẩn streaming nháp/đang gõ khi một mảnh (chunk) bắt đầu bằng NO_REPLY, để các thao tác im lặng không rò rỉ đầu ra từng phần giữa lượt.
“Xả bộ nhớ” trước khi nén (đã triển khai)
Mục tiêu: trước khi tự động nén xảy ra, chạy một lượt tác tử im lặng để ghi trạng thái bền vững xuống đĩa (ví dụ:memory/YYYY-MM-DD.md trong workspace của tác tử) để nén không thể
xóa ngữ cảnh quan trọng.
OpenClaw dùng cách tiếp cận xả trước ngưỡng:
- Theo dõi mức sử dụng ngữ cảnh của phiên.
- Khi vượt qua “ngưỡng mềm” (thấp hơn ngưỡng nén của Pi), chạy một chỉ thị im lặng “ghi bộ nhớ ngay” gửi cho tác tử.
- Dùng
NO_REPLYđể người dùng không thấy gì.
agents.defaults.compaction.memoryFlush):
enabled(mặc định:true)softThresholdTokens(mặc định:4000)prompt(thông điệp người dùng cho lượt xả)systemPrompt(system prompt bổ sung được nối cho lượt xả)
- Prompt/system prompt mặc định bao gồm gợi ý
NO_REPLYđể ẩn phân phối. - Lượt xả chạy một lần cho mỗi chu kỳ nén (được theo dõi trong
sessions.json). - Lượt xả chỉ chạy cho các phiên Pi nhúng (backend CLI bỏ qua).
- Lượt xả bị bỏ qua khi workspace của phiên là chỉ đọc (
workspaceAccess: "ro"hoặc"none"). - Xem Memory để biết bố cục tệp workspace và các mẫu ghi.
session_before_compact trong extension API, nhưng logic xả của OpenClaw hiện nằm phía Gateway.
Danh sách kiểm tra xử lý sự cố
- Session key sai? Bắt đầu với /concepts/session và xác nhận
sessionKeytrong/status. - Lệch giữa store và transcript? 37. Kiểm tra:
- Spam nén? 39. Xác nhận phản hồi bắt đầu bằng
NO_REPLY(token chính xác) và bạn đang dùng bản build có bao gồm bản sửa ức chế streaming.- cửa sổ ngữ cảnh mô hình (quá nhỏ)
- thiết lập nén (
reserveTokensquá cao so với cửa sổ mô hình có thể gây nén sớm) - phình to tool-result: bật/điều chỉnh cắt tỉa phiên
-
- “Xin chào, C-3PO! Xác nhận phản hồi bắt đầu bằng
NO_REPLY(token chính xác) và bạn đang ở bản build bao gồm bản sửa lỗi chặn streaming.
- “Xin chào, C-3PO! Xác nhận phản hồi bắt đầu bằng