Cách tự build AI agent giống OpenClaw
Hướng dẫn xây dựng AI agent tự host có khả năng chạy shell commands. Lưu ý kỹ về hardening để tránh các lỗi privilege-escalation như CVE-2026-32922.
OpenClaw thực sự là gì
OpenClaw là một AI agent cá nhân tự host. Bạn chạy nó trên server riêng, kết nối với các ứng dụng chat bạn đang dùng, và nó có thể chạy shell commands, điều khiển browser, đọc và ghi file, cũng như thực hiện các hành động dựa trên tin nhắn bạn gửi. Nó có license MIT, ưu tiên lưu trữ local, và có hơn 380,000 GitHub stars tính đến giữa năm 2026, khiến nó trở thành một trong những project được star nhiều nhất trên nền tảng này. Thực chất, nó là một tập hợp các thành phần nhỏ được kết nối với nhau một cách hợp lý. Bài viết này sẽ đi sâu vào các thành phần đó để bạn hiểu cách một công cụ như thế này được xây dựng và những rủi ro tiềm ẩn là gì.
Một cảnh báo trước, vì nó sẽ định hình mọi lựa chọn thiết kế dưới đây. Vào tháng 3 năm 2026, OpenClaw đã bị lộ 9 lỗ hổng bảo mật chỉ trong vòng 4 ngày, bao gồm một lỗi privilege-escalation nghiêm trọng được đánh giá 9.9/10 (CVE-2026-32922). Project này được thiết kế để bạn, người vận hành, phải tự hardening nó. Một agent có thể chạy bất kỳ command nào chỉ an toàn bằng chính cái box mà nó chạy và các giới hạn bạn đặt ra cho nó. Hãy ghi nhớ điều đó khi đọc tiếp.
Gateway daemon: một process duy nhất, được giữ riêng tư
Trung tâm là một single long-running process, thường được gọi là gateway. Đây là control plane. Nó nhận tin nhắn, quyết định cần làm gì, chạy các tools, và gửi phản hồi lại. Mọi thứ khác đều plug vào nó.
Điểm quan trọng nhất về gateway là nơi nó lắng nghe. Theo mặc định, OpenClaw bind nó vào loopback address, 127.0.0.1, nên nó không thể truy cập từ internet trừ khi bạn chủ động expose nó. Hãy để nó ở đó. Đây là process duy nhất chạy các command để hoạt động, vì vậy một gateway bị expose sẽ trao cho bất kỳ ai tìm thấy nó một foothold từ xa vào server của bạn. Khi bạn cần kết nối với nó từ laptop, hãy dùng VPN hoặc SSH tunnel thay vì mở port. Không ai có thể tấn công một port mà họ không thể kết nối tới.
Channel connectors: nhận tin nhắn và gửi phản hồi
Một personal agent chỉ hữu ích nếu bạn có thể nói chuyện với nó từ các ứng dụng bạn đang dùng. Đó là nhiệm vụ của các channel connectors. Mỗi connector giao tiếp với một platform, chẳng hạn như Telegram, WhatsApp, Slack, hoặc Discord, thông qua bot API hoặc webhooks của platform đó.
Cấu trúc của chúng đều giống nhau. Connector đăng ký một bot với platform, nhận tin nhắn đến của bạn (bằng cách polling platform hoặc nhận webhook mà platform push tới), chuyển tin nhắn đó cho gateway, và gửi phản hồi của gateway ngược lại thông qua cùng một API đó. Connector chỉ là một lớp translation mỏng. Nó chuyển đổi "một tin nhắn Telegram vừa đến" thành "đây là text cho agent" và ngược lại. Tự xây dựng connector chủ yếu là việc đọc documentation bot của một platform và map format tin nhắn của nó sang format của gateway.
Bộ não và tool loop
Bên trong gateway là phần biến nó thành một agent thay vì chỉ là một chatbot. Đó là một vòng lặp (loop).
Một tin nhắn đến. Gateway gửi nó tới một language model cùng với một danh sách các tools mà model được phép dùng. Model đọc tin nhắn và quyết định: trả lời trực tiếp, hoặc gọi một tool. Nếu nó gọi một tool, gateway sẽ chạy tool đó, capture kết quả, và gửi kết quả đó lại cho model. Model xem xét kết quả và quyết định tiếp. Quá trình này lặp lại cho đến khi model không còn gì để làm và đưa ra phản hồi cuối cùng.
Vòng lặp đó chính là ý tưởng cốt lõi của một agent, và nó giống nhau dù agent nằm trong ứng dụng chat hay trong terminal. Để biết cách kết nối các tools vào vòng lặp đó một cách tiêu chuẩn, kết nối tools thông qua Model Context Protocol là bài đọc tiếp theo phù hợp, và về phía model, chạy chính model trên phần cứng của bạn sẽ bổ sung nửa còn lại.
Tool set là điểm mấu chốt, và cũng là mối nguy hiểm
Các tools là thứ làm cho OpenClaw mạnh mẽ. Một tool chạy shell command, một tool điều khiển browser, một tool đọc và ghi file. Cấp quyền cho vòng lặp trên truy cập vào chúng, và nó có thể làm gần như mọi thứ bạn có thể làm với bàn phím. Khả năng đó chính là toàn bộ sản phẩm, và cũng là toàn bộ rủi ro.
Một agent có thể chạy bất kỳ command nào, hoạt động dựa trên các instruction đến từ ứng dụng chat, là một attack surface lớn. Một instruction lỗi, một cuộc tấn công prompt-injection ẩn trong một trang web mà tool browser truy cập, hoặc một bug như các lỗi tháng 3 năm 2026 có thể biến "đọc lịch của tôi" thành "xóa file của tôi". Vì vậy, các giới hạn không phải là phần bổ sung tùy chọn. Hãy chạy agent dưới một unprivileged user chuyên dụng, không có quyền sudo, để nếu có bị compromise thì không thể escalate. Hãy đặt các dangerous tools sau một bước phê duyệt (approval step) để agent phải hỏi trước khi làm việc gì đó mang tính hủy diệt. Sandbox việc thực thi tool để nếu có command nào chạy mất kiểm soát thì vẫn được containment. Cách ly API key của model để nếu bị leak sẽ không trao cho attacker tài khoản của bạn.
Trước khi bạn expose bất cứ thứ gì chạy shell commands, hãy thực hiện các bước cơ bản một cách cẩn thận. Hãy tạo một checklist cho box của riêng bạn tại đây, sau đó làm theo từ trên xuống dưới:
Phần unprivileged-user được đề cập chi tiết trong chạy services dưới quyền unprivileged user, và hướng dẫn setup an toàn đầy đủ cho project thực tế nằm trong chạy OpenClaw an toàn trên VPS.
Memory dưới dạng file plain
Hầu hết mọi người mong đợi memory của một agent nằm trong một database. OpenClaw thì không. Nó lưu trữ memory dưới dạng các file Markdown plain trên disk, và lựa chọn đó rất đáng để học tập.
File rất đơn giản. Không có schema để migrate, không có service nào cần duy trì, và không có query language nào cần học. Chúng có thể inspect được: bạn có thể mở folder và đọc chính xác những gì agent hiểu về bạn, sửa một note sai bằng cách edit file, hoặc xóa một memory bằng cách xóa file đó. Và chúng có tính portable, vì việc chuyển agent sang server mới chỉ đơn giản là copy một directory. Đối với một personal agent cho một người dùng, một folder chứa các file text là đủ, và nó giữ cho toàn bộ hệ thống dễ quản lý.
Skills: cách portable để thêm khả năng
Ngoài các tools có sẵn, OpenClaw sử dụng một skill format có tính portable để cộng đồng có thể mở rộng khả năng của nó mà không cần thay đổi core. Một skill là một bundle chứa các instruction và đôi khi là code để dạy agent một task mới. Agent sẽ load một skill khi task yêu cầu.
Giá trị của một format như thế này là các khả năng trở nên có thể chia sẻ được. Ai đó viết một skill cho một công việc cụ thể, publish nó, và những người khác chỉ việc đưa nó vào. Nếu bạn xây dựng agent của riêng mình, việc định nghĩa một extension format nhỏ gọn, rõ ràng ngay từ đầu sẽ giúp bạn tránh việc phải hard-code mọi capability vào core sau này.
Tự dùng model của riêng bạn
OpenClaw là model-agnostic. Nó không đi kèm language model riêng. Thay vào đó, nó kết nối với model mà bạn chọn, có thể là một hosted API hoặc một model bạn tự chạy.
Sự phân tách này quan trọng về chi phí, quyền riêng tư và quyền kiểm soát. Một hosted API cung cấp cho bạn các model mạnh nhất mà không cần quản lý phần cứng, với mức giá tính trên mỗi token và các prompt của bạn sẽ rời khỏi server của bạn. Một self-hosted model, được phục vụ bằng thứ gì đó như Ollama, giữ mọi tin nhắn trên chính box của bạn và chỉ tốn chi phí phần cứng và điện năng, với cái giá là chạy một model nhỏ hơn hoặc chậm hơn. Nhiều người kết hợp cả hai. Nếu bạn muốn giữ một agent hoàn toàn riêng tư, self-hosting model trên VPS của bạn là mảnh ghép cuối cùng để lấp đầy khoảng trống đó, và Hermes Agent là một agent self-hosted khác đáng để so sánh.
Bạn có nên xây dựng một cái không?
Bạn có thể xây dựng tất cả những thứ này. Các thành phần không hề xa lạ: một daemon, một vài chat connector, một model-and-tools loop, một folder Markdown, và một plugin format. Hiểu chúng thực sự hữu ích, vì nó giúp giải mã mọi agent mà bạn sẽ sử dụng và cho bạn biết chính xác nơi nguy hiểm tồn tại.
Nhưng với hầu hết mọi người, câu trả lời trung thực là hãy chạy bản thực tế và hardening nó thay vì cố gắng tái phát minh lại nó. OpenClaw đã giải quyết xong các connector, loop, và skill format, và nó đã trải qua các đợt kiểm tra bảo mật thực tế. Công sức của bạn nên dành cho phần thực sự thuộc về bạn để làm cho đúng: đó là việc setup và hardening trên server của chính bạn. Hãy build một cái nhỏ để học. Hãy chạy và lock down bản thực tế để sử dụng.
Các nền tảng chung nằm trong xây dựng AI agent của riêng bạn trên VPS, và xây dựng một agent với Claude cho thấy các ý tưởng tương tự với một model cụ thể đóng vai trò là bộ não.
FAQ
Xây dựng một agent như OpenClaw có khó không?
Các thành phần riêng lẻ thì không khó. Một gateway process, một chat connector, một model-and-tools loop, và một folder file, mỗi thứ đều khá đơn giản. Phần khó là làm nó một cách an toàn. Một agent chạy shell commands từ các tin nhắn chat là một attack surface nghiêm trọng, và việc thiết lập đúng sandboxing, permissions, và unprivileged-user setup tốn nhiều công sức hơn là việc kết nối các feature lại với nhau.
Tại sao OpenClaw lưu trữ memory dưới dạng file Markdown thay vì database?
Vì đối với một personal agent cho một người dùng, file là đủ và đơn giản hơn nhiều. Không có dịch vụ database nào phải chạy, memory dễ dàng đọc và sửa bằng tay, và việc chuyển agent sang server khác chỉ là copy một directory. Database chỉ thực sự cần thiết ở quy mô lớn hơn, không phải ở đây.
Phần nguy hiểm nhất của một personal AI agent là gì?
Các tools cho phép nó hành động: chạy shell commands, điều khiển browser, và ghi file. Đó là lý do để xây dựng nó và cũng là lý do nó có thể gây hại cho bạn. Sự kiện bảo mật tháng 3 năm 2026 của OpenClaw, với 9 lỗi trong 4 ngày bao gồm một lỗi critical 9.9, là minh chứng rõ nhất cho việc cần xử lý layer tools một cách cẩn thận: chạy dưới quyền unprivileged user, kiểm soát các hành động mang tính hủy diệt, và sandbox việc thực thi.
Tôi có cần language model riêng để xây dựng một cái không?
Không. Các agent như OpenClaw là model-agnostic, nên bạn có thể kết nối với model mà bạn chọn. Đó có thể là một hosted API để có các model mạnh nhất, hoặc một model bạn tự chạy để có sự riêng tư hoàn toàn. Self-hosting với Ollama giữ mọi tin nhắn trên server của bạn với cái giá là phải chạy một model nhỏ hơn.