- Kết nối AI agent dựa trên IRC với website portfolio cá nhân để khách truy cập có thể đặt câu hỏi và nhận câu trả lời dựa trên kết quả phân tích mã từ kho lưu trữ GitHub thực tế
- Không phải chatbot chỉ tóm tắt CV đơn thuần, mà được thiết kế như một agent có thể thực thi, thực hiện clone kho lưu trữ, tính toán test, xác minh mã
- Hệ thống được tách thành hai agent là nullclaw công khai và ironclaw riêng tư, giao tiếp an toàn thông qua mạng Tailscale
- Chọn giao thức IRC làm tầng truyền tải để đồng thời đạt được tự host, chuẩn hóa, chi phí thấp, đồng thời tách vai trò của mô hình Haiku 4.5 và Sonnet 4.6 để giới hạn chi phí ở mức $2/ngày
- Toàn bộ hệ thống vận hành với binary dưới 10MB, bộ nhớ dưới 5MB, được giới thiệu như một ví dụ hạ tầng AI gọn nhẹ đáp ứng cả bảo mật, chi phí và tính minh bạch
Xây dựng digital doorman
- Cấu trúc triển khai AI agent trên VPS $7/tháng và sử dụng máy chủ IRC cá nhân làm tầng truyền tải, kết nối với kho lưu trữ GitHub
- Khách truy cập có thể đặt câu hỏi cho AI trên website portfolio và nhận câu trả lời dựa trên mã nguồn thực tế
- Không phải chatbot kiểu tóm tắt CV đơn thuần, mà cung cấp phản hồi cụ thể thông qua phân tích mã
Giới hạn của "chatbot để hỏi về CV"
- Phần lớn chatbot portfolio chỉ dừng ở mức nạp nội dung CV vào mô hình rồi diễn đạt lại
- Cách này không cung cấp thông tin mới, và chỉ là một dạng đối thoại hình thức
- Với những câu hỏi như “Bạn quản lý test coverage như thế nào?”, cần có phản hồi cụ thể kiểu clone kho lưu trữ và đếm số lượng test
- Vì vậy tác giả đã xây dựng hạ tầng cho phép truy cập và phân tích mã trực tiếp
Kiến trúc hệ thống
- Gồm hai agent, hai máy chủ, hai ranh giới bảo mật
- nullclaw: doorman công khai, binary Zig 678KB, dùng khoảng 1MB RAM
- Chào khách truy cập, trả lời câu hỏi về dự án, thực hiện clone kho GitHub và xác minh dựa trên mã
- ironclaw: agent backend riêng tư, chạy trên hệ thống tách biệt
- Có thể truy cập email, lịch, ngữ cảnh cá nhân
- Nhận các yêu cầu phức tạp từ nullclaw thông qua kênh IRC #backoffice
- Hai hệ thống được kết nối qua Tailscale, và máy chủ công khai không thể truy cập dữ liệu cá nhân
Lý do chọn IRC
- Tính nhất quán về thẩm mỹ: website portfolio dùng UI kiểu terminal nên IRC client rất tự nhiên
- Tự host hoàn toàn: máy chủ IRC Ergo, web client gamja và nullclaw đều chạy trên hạ tầng riêng
- Giao thức đơn giản và được chuẩn hóa: IRC đã tồn tại 30 năm, không bị phụ thuộc nhà cung cấp, không có rủi ro thay đổi API
- Cùng một agent hoạt động giống nhau không chỉ trên web client mà cả trên irssi terminal client
Lựa chọn và thiết kế mô hình
- Dùng mô hình lớn là không hiệu quả, nên phân tách mô hình theo vai trò
-
Haiku 4.5**: xử lý hội thoại và truy vấn đơn giản,** phản hồi độ trễ cực thấp
- Sonnet 4.6: chỉ dùng khi phân tích mã và suy luận phức tạp
- Trần chi phí: giới hạn ở $2/ngày, $30/tháng
- Ngăn chi phí tăng vọt do lạm dụng hoặc hội thoại quá mức
- Thông qua cấu trúc suy luận nhiều tầng để đồng thời đạt được tốc độ và hiệu quả chi phí
Thiết kế bảo mật
- SSH: vô hiệu hóa đăng nhập root, chỉ cho phép xác thực bằng khóa, dùng cổng không chuẩn
- Tường lửa: chỉ mở SSH, IRC(TLS), HTTPS(WebSocket)
- Proxy Cloudflare: thực hiện chấm dứt TLS, giới hạn tốc độ, lọc bot
- Sandbox cho agent: chỉ cho phép công cụ chỉ đọc, giới hạn 10 hành động mỗi giờ
- Kiểm soát chi phí: hard cap $2/ngày, $30/tháng
- Kích hoạt log kiểm toán và cập nhật tự động
- Giảm thiểu bề mặt tấn công: chỉ chạy hai dịch vụ ergo và nullclaw, không phục vụ nội dung web trực tiếp
- Khi xảy ra xâm nhập, phạm vi thiệt hại cũng chỉ bị giới hạn ở mức bot IRC có trần $2/ngày
Cấu hình stack truyền thông
- Mọi thành phần đều ở dạng nhỏ gọn, tự host, có thể thay thế
- Ergo: máy chủ IRC, một binary Go đơn, 2.7MB RAM
- gamja: web IRC client, trang tĩnh 152KB, được phục vụ phía sau Cloudflare
- nullclaw: runtime AI agent, binary Zig 4MB, dùng khoảng 1MB bộ nhớ
- Toàn bộ hệ thống chạy với binary dưới 10MB, bộ nhớ nhàn rỗi dưới 5MB
- Có thể vận hành thoải mái ngay cả trên gói VPS rẻ nhất
Chức năng thực tế của nully (agent công khai)
- Xác định ngôn ngữ lập trình: kiểm tra thông qua ngữ cảnh nạp sẵn và xác minh kho lưu trữ
- Phân tích cấu trúc test: clone kho lưu trữ rồi trực tiếp đọc file test để báo cáo kết quả
- Giải thích dự án: ví dụ có thể trả lời chi tiết về dự án Fracture dựa trên mã
- Cung cấp thông tin liên hệ: chỉ đưa ra thông tin liên hệ chính xác, không bịa đặt
- Yêu cầu đặt lịch: chuyển tiếp đến ironclaw qua giao thức Google A2A, rồi trả về kết quả đã được cấu trúc
- Khách truy cập không nhận ra quá trình chuyển sang backend
Triển khai A2A
- Hỗ trợ giao thức Google A2A (v0.3.0) và thực hiện quản lý trạng thái tác vụ dựa trên JSON-RPC
- Công cụ
a2a_call gửi thông điệp đến agent từ xa và phân tích trạng thái tác vụ (hoàn tất/thất bại/đang xử lý)
- Bắt buộc HTTPS, nhưng trong mạng nội bộ Tailscale thì cho phép HTTP để thuận tiện debug
-
Cấu trúc phía ironclaw
- Phiên bản nullclaw không có API key riêng mà dùng LLM gateway của ironclaw như một proxy
- Chỉ duy trì một API key và một quan hệ thanh toán
- ironclaw xử lý toàn bộ yêu cầu suy luận và gánh chi phí
Bảo mật handoff
- Endpoint A2A có rủi ro prompt injection, nên áp dụng giới hạn nghiêm ngặt
- Các yêu cầu có thể chuyển cho ironclaw chỉ giới hạn ở lịch hẹn, liên hệ, tình trạng sẵn sàng
- Từ chối chuyển lệnh tùy ý
- Endpoint A2A của ironclaw được bảo vệ bằng tường lửa chỉ dành cho Tailscale
- Cả hai agent đều chạy ở chế độ giám sát và danh sách lệnh cho phép bị giới hạn
- nully quyết định có nâng cấp yêu cầu hay không, để ngăn việc thực thi lệnh bừa bãi
Bài học rút ra trong quá trình xây dựng
- Lựa chọn mô hình là một phần của thiết kế hệ thống, ảnh hưởng trực tiếp đến chi phí, độ trễ và trải nghiệm
- Tác giả dành nhiều thời gian hơn cho truyền thông, bảo mật và hạ tầng so với bản thân agent
- Sự đơn giản và tính mở của IRC khiến nó trở thành tầng truyền tải lý tưởng cho AI agent
- Cấu trúc tách nullclaw–ironclaw là cốt lõi của mô hình bảo mật
- Kết hợp giao thức A2A với kênh log IRC giúp có được cả giao tiếp có cấu trúc lẫn khả năng quan sát theo thời gian thực
- Tránh trùng lặp thông tin xác thực: dùng gateway của ironclaw làm proxy để duy trì một API key, một quan hệ thanh toán
Cách trải nghiệm
- Truy cập georgelarson.me/chat hoặc nhập
irc trong terminal trên trang chủ
- Nếu dùng IRC client:
irc.georgelarson.me, cổng 6697 (TLS), kênh #lobby
- nully đang chờ sẵn và có thể trò chuyện với khách truy cập theo thời gian thực
1 bình luận
Ý kiến trên Hacker News
Nếu agent OpenClaw có quyền truy cập email và dữ liệu cá nhân bị xâm nhập thì phạm vi thiệt hại có thể rất lớn
Nó không chỉ dừng ở mức bot IRC đơn giản, mà kẻ tấn công còn có thể đặt lại mật khẩu để gỡ giới hạn API, thậm chí lợi dụng làm trung tâm chia sẻ nội dung bất hợp pháp
Tôi khá tò mò vì sao lại chọn Haiku/Sonnet. Trên OpenRouter có nhiều model rẻ hơn đáng kể
Ví dụ Haiku 4.5 có giá $1 cho 1 triệu token đầu vào và $5 cho đầu ra, trong khi MiniMax M2.7 là $0.30 đầu vào, $1.20 đầu ra, còn Kimi K2.5 là $0.45 đầu vào, $2.20 đầu ra
Theo trải nghiệm của tôi thì M2.7 và K2.5 cho hiệu năng tương đương hoặc thậm chí tốt hơn Haiku
Đây cũng chính là lý do gần đây tôi dùng model của Anthropic khi làm agent. Haiku kiểm soát khá tốt khi người dùng đưa ra yêu cầu kỳ quặc, và cũng xử lý hội thoại mang tính cảm xúc một cách ổn định
IRC phù hợp làm lớp truyền tải nhưng không có delivery guarantee. Nếu mất kết nối thì các tin nhắn trong khoảng đó sẽ biến mất
Nó ổn cho chat thời gian thực, nhưng với agent xử lý công việc thực tế thì cần truyền at-least-once
SSE(Server-Sent Events) là một điểm cân bằng khá ổn. Nó hỗ trợ kết nối liên tục và có thể bổ sung logic truyền lại
Tôi từng làm một bot với ý tưởng tương tự trên chuyến tàu từ Tokyo đến Osaka
web-support-claw.oncanine.run — đó là một dự án tạo bot intercom cho website bằng cách đọc repo GitHub
Nó trả lời câu hỏi của khách truy cập nên không cần xây riêng một knowledge base
Về sau tôi khuyên nên có một instance Haiku để giám sát. Bạn cũng có thể nhận cảnh báo qua ntfy
Hiện giờ phòng chat hoàn toàn mất kiểm soát
Nếu mục đích là một “CV tương tác” thì không cần những tương tác từ số đông không xác định
Nhóm chúng tôi cũng dùng cấu trúc tương tự. Các agent giao tiếp qua một bảng tin nhắn FastAPI + SQLite gồm 4 agent (bán hàng, mạng xã hội, tài chính, chiến lược)
Thay vì giới hạn ngân sách theo ngày, chúng tôi quản lý trần chi phí ở tầng governance
Cấu trúc pub/sub của IRC rất hợp cho giao tiếp đa agent, nhưng chúng tôi dùng HTTP polling + khử trùng lặp. Kém thanh lịch hơn, nhưng dễ phục hồi hơn khi agent hay crash
Tôi cũng dùng IRC làm giao diện cho agent coding
Tôi chuyển prompt bằng cách đổi phòng, rồi điều khiển project từ xa
Có người nói rằng “hộp công khai không truy cập dữ liệu cá nhân”, và tôi nghĩ sẽ thú vị nếu biến nó thành một thử thách CTF
Giấu một flag trong hộp riêng tư, rồi ai truy cập được và lấy nó ra thì thưởng 50 đô
Thái độ của nully hơi thô ráp, nhưng tôi thích kiến trúc hệ thống tổng thể
Tôi cũng dùng kiến trúc phân tầng, và tầng thấp nhất là bot Qwen chạy local
Tôi tò mò về logic leo thang từ Haiku lên Opus
Ý tưởng này thật sự rất thú vị. Nó khiến tôi muốn tạo một bot để tự động hóa quy trình tuyển dụng
Bot sẽ phỏng vấn để xác định thiên hướng của ứng viên, tìm công việc phù hợp rồi tự động nộp đơn
Nếu bot phía công ty cũng đánh giá ứng viên theo cách tương tự, thì có thể ghép nối dựa trên sở thích của cả hai bên
Có thể triển khai hoàn toàn theo kiểu mã nguồn mở tự host, và cho tín hiệu tốt hơn nhiều so với CV