technical architecture plugins contextengine

ContextEngine chuyên sâu: OpenClaw 2026.3.7 đã biến quản lý ngữ cảnh thành plugin như thế nào

OpenClaws.io Team

OpenClaws.io Team

@openclaws

March 9, 2026

10 phút đọc

ContextEngine chuyên sâu: OpenClaw 2026.3.7 đã biến quản lý ngữ cảnh thành plugin như thế nào

Agent AI của bạn trả lời đúng hay tự tin bịa ra câu trả lời, phần lớn phụ thuộc vào quản lý ngữ cảnh—cách mà lịch sử hội thoại, kết quả từ tool, và kiến thức bên ngoài được nhồi vào cửa sổ ngữ cảnh hữu hạn của model. Trước OpenClaw 2026.3.7, logic này bị hardcode cứng trong core. Giờ nó là một plugin.

Vấn đề

OpenClaw dùng sliding-window compaction: hội thoại dài quá thì tóm tắt tin cũ, nhường chỗ cho tin mới. Chạy được. Nhưng có đánh đổi, và không phải ai cũng hài lòng:

  • Tóm tắt là mất chi tiết. Agent code cần tham chiếu một hàm từ 50 lượt trước? Biến mất rồi.
  • Không có bộ nhớ giữa các phiên. Đóng phiên là mất ngữ cảnh. Cuộc hội thoại nào cũng bắt đầu từ số không.
  • Một chiến lược duy nhất, thích thì dùng. Muốn assembly dựa trên RAG? Phân nhánh hội thoại? Token budget tùy chỉnh? Không có cách nào sạch sẽ.

Mọi người tìm cách lách—monkey-patch code nội bộ, fork core, bọc thêm lớp orchestration bên ngoài. Không cách nào bền vững.

ContextEngine: Plugin slot cho quản lý ngữ cảnh

Phiên bản 2026.3.7 tách toàn bộ vòng đời ngữ cảnh ra, định nghĩa một interface rõ ràng, và mở ra dưới dạng plugin slot. Viết plugin, implement interface, và bạn sở hữu phần quản lý ngữ cảnh.

Cách kết nối

Đăng ký engine qua plugin API:

typescript
// In your plugin's bootstrap
export default function myContextPlugin(api: PluginAPI) {
  api.registerContextEngine('my-engine', (config) => {
    return new MyCustomContextEngine(config);
  });
}

Chọn nó trong config:

yaml
plugins:
  slots:
    contextEngine: my-engine

Không cấu hình plugin nào? OpenClaw gói hành vi cũ vào LegacyContextEngine. Người dùng hiện tại không bị ảnh hưởng gì.

Bảy lifecycle hooks

Interface cung cấp bảy hook—mỗi hook cho một giai đoạn quan trọng trong một lượt hội thoại:

1. `bootstrap()`

Engine khởi động. Kết nối vector DB, xây graph, load state đã lưu.

typescript
async bootstrap(): Promise<void> {
  this.vectorStore = await connectToVectorDB(this.config.dbUrl);
  this.sessionGraph = new DAG();
}

2. `ingest(message: Message)`

Một tin nhắn mới đến—input từ người dùng, phản hồi của assistant, output từ tool. Bạn quyết định lưu trữ và index nó thế nào.

typescript
async ingest(message: Message): Promise<void> {
  // Add to the DAG
  const node = this.sessionGraph.addNode(message);
  // Index for retrieval
  const embedding = await embed(message.content);
  await this.vectorStore.upsert(node.id, embedding, message);
}

3. `assemble(budget: TokenBudget): AssembledContext`

Hook quan trọng nhất. Trước mỗi lần gọi model, OpenClaw đưa cho bạn một token budget và bảo: xây cho tôi một ngữ cảnh. Cái bạn trả về chính xác là cái model nhìn thấy.

Engine khác nhau, chiến lược khác nhau hoàn toàn:

typescript
async assemble(budget: TokenBudget): AssembledContext {
  const recentMessages = this.sessionGraph.getRecent(budget.soft * 0.6);
  const relevantHistory = await this.vectorStore.query(
    this.currentQuery,
    budget.soft * 0.3
  );
  const systemContext = this.buildSystemPrompt(budget.soft * 0.1);

  return {
    system: systemContext,
    messages: [...relevantHistory, ...recentMessages],
    tokenEstimate: this.estimateTokens([systemContext, ...relevantHistory, ...recentMessages]),
  };
}

4. `compact()`

Ngữ cảnh vượt quá hard token limit. Phải cắt giảm. Engine mặc định tóm tắt tin cũ. Plugin của bạn có thể cắt tỉa node trong graph, chuyển sang vector store, hoặc bỏ qua hoàn toàn nếu assemble() đã nằm trong budget.

5. `afterTurn(turn: Turn)`

Một lượt hoàn tất—người dùng nói, agent trả lời. Thời điểm tốt để lưu state, cập nhật index, hoặc khởi chạy tác vụ nền.

6. `prepareSubagentSpawn(parentContext: Context): SubagentContext`

Agent đang spawn một subagent. Con được bao nhiêu ngữ cảnh? Cho hết thì vỡ token budget. Không cho gì thì nó mù tịt. Hook này cho phép bạn kiểm soát chính xác những gì subagent nhận được.

typescript
prepareSubagentSpawn(parentContext: Context): SubagentContext {
  // Give the subagent a focused slice of context
  const relevantNodes = this.sessionGraph.getSubtree(parentContext.taskId);
  return {
    messages: relevantNodes.map(n => n.message),
    metadata: { parentSessionId: this.sessionId },
  };
}

7. `onSubagentEnded(result: SubagentResult)`

Subagent chạy xong. Kết quả cần quay về ngữ cảnh cha bằng cách nào đó—merge hết, tóm tắt, hay chọn lọc. Tùy bạn.

Kiến trúc: Slot vs. Hook

ContextEngine là slot, không phải hook. Hook mang tính cộng dồn—mười plugin có thể cùng lắng nghe onMessage. Slot mang tính độc quyền. Chỉ một ContextEngine tại một thời điểm.

┌─────────────────────────────────────┐
│           Plugin Registry           │
│                                     │
│  Hook (cộng dồn):                   │
│    onMessage  → [plugin1, plugin2]  │
│    onTool     → [plugin3]           │
│                                     │
│  Slot (độc quyền):                  │
│    contextEngine → my-engine        │
│    (mặc định: LegacyContextEngine)  │
└─────────────────────────────────────┘

Khi khởi động, OpenClaw đọc plugins.slots.contextEngine, tìm factory đã đăng ký, và khởi tạo nó. Engine không tồn tại? Khởi động fail ngay. Ầm ĩ, rõ ràng. Không có fallback im lặng—đó là quyết định có chủ đích. Bạn phải biết mình đang chạy context engine nào.

Cách ly subagent dùng AsyncLocalStorage: mỗi agent con có runtime riêng, được scoped riêng biệt. State của plugin không bị rò rỉ qua ranh giới giữa các agent.

Những gì mọi người đang xây

Lossless-Claw

GitHub · Martian Engineering

Plugin ContextEngine nghiêm túc đầu tiên. Thay thế sliding-window compaction bằng hệ thống tóm tắt dựa trên DAG, giữ lại mọi tin nhắn gốc mà vẫn nằm trong giới hạn token.

  • Mỗi tin nhắn trở thành một node trong đồ thị có hướng không chu trình
  • Các node gom thành "episode" theo chủ đề
  • Vượt budget? Episode cũ được tóm tắt, nhưng bản gốc vẫn nằm trong graph
  • Nếu lượt sau tham chiếu nội dung cũ, engine lấy bản gốc ra—không phải bản tóm tắt

Nếu bạn từng gặp cảnh agent code quên mất một hàm nó tự viết cách đây một tiếng—đây là giải pháp.

MemOS Cloud Plugin

GitHub · MemTensor

Làm đúng một việc: cho agent của bạn bộ nhớ tồn tại giữa các phiên.

  • Trong bootstrap(): kéo các ký ức liên quan từ MemOS Cloud dựa trên tin nhắn mở đầu
  • Trong afterTurn(): lưu lượt mới lên cloud
  • Trong assemble(): chèn ký ức đã recall vào system context

Agent nhớ cuộc hội thoại tuần trước, sở thích của bạn, dự án của bạn. Bạn không cần nhắc lại nữa.

Tiếp theo là gì

Từ GitHub issues và Discord, mọi người đang làm:

  • RAG-native assembly: Bỏ qua lịch sử tin nhắn, xây ngữ cảnh từ các đoạn tài liệu được truy xuất. OpenClaw như một công cụ tìm kiếm hội thoại.
  • Bộ nhớ chia sẻ multi-agent: Nhiều agent cùng dùng chung một knowledge graph. Workflow cộng tác mà không bị trùng lặp ngữ cảnh.
  • Tối ưu token budget: Tự động điều chỉnh thành phần ngữ cảnh dựa trên model đang dùng—giá cả, thế mạnh, độ dài context.
  • Phân nhánh hội thoại: Ngữ cảnh dạng cây. Khám phá các nhánh khác nhau, quay lại, giữ nguyên tất cả.

Tại sao điều này thay đổi cuộc chơi

OpenClaw luôn có thể thêm channel, model, và tool. Nhưng ngữ cảnh—cách agent thực sự suy nghĩ—bị khóa trong core. Muốn đụng vào phải fork.

ContextEngine phá vỡ rào cản đó. Và một khi đã mở, hiệu ứng cộng hưởng bắt đầu:

  1. 1.Nhà phát triển plugin cuối cùng cũng có thể cạnh tranh trên bài toán khó nhất trong agent UX: chất lượng ngữ cảnh.
  2. 2.Khách hàng doanh nghiệp có được kiểm soát compliance—biên tập trước khi model nhìn thấy, thực thi chính sách lưu trữ, audit mọi prompt.
  3. 3.Nhà nghiên cứu có thể thử nghiệm chiến lược ngữ cảnh mới mà không cần duy trì fork.
  4. 4.Nhà cung cấp model có thể ship plugin được tinh chỉnh cho kiến trúc của họ. Model ngữ cảnh dài và model ngữ cảnh ngắn không nên dùng cùng một chiến lược.

Đây mới là hình dạng thật sự của một framework trở thành platform. Không phải đổi tên. Không phải một bài blog tuyên bố "tầm nhìn." Một thay đổi kiến trúc cụ thể khiến hệ sinh thái tự củng cố chính nó. Nhiều plugin hơn → nhiều người dùng hơn → nhiều developer hơn → nhiều plugin hơn. Vòng lặp đó một khi đã quay, rất khó dừng lại.

Con tôm hùm vừa mọc thêm một càng mới.

Theo dõi tin mới

Nhận thông báo về tính năng mới và tích hợp. Không spam, hủy đăng ký bất cứ lúc nào.