Đủ Rẻ Để Thực Sự Thuộc Về Mình
Thị trường harness cho AI agent cứ liên tục tung ra những bản wrapper to hơn, bóng bẩy hơn quanh cùng một cái loop cũ. Tôi bắt đầu tự viết một cái cho riêng mình — và câu trả lời không nằm ở tính năng. Nó là câu chuyện về ngân sách, sự linh hoạt, và cái sức nặng thầm lặng khi bạn thực sự làm chủ cái vòng lặp chạy workflow của mình.
Tôi vừa dựng xong một công cụ CLI siêu nhỏ để thay thế Claude Code — tranh thủ ba ngày nghỉ lễ vừa rồi. Chỉ là một file Python đơn giản: nạp skill, chạy hook, gọi MCP và điều hướng qua OpenRouter. Nhưng câu chốt trong bản kế hoạch đó là thứ làm tôi suy nghĩ mãi: "Đủ rẻ để tự sở hữu, đến mức lần tới SDK có thay đổi, mình cũng chẳng buồn bận tâm."
Đó là tất cả mục tiêu. Không phải để nhanh hơn. Không phải để thông minh hơn. Mà là để rẻ hơn khi sở hữu.
Thị trường "harness" (bộ khung điều phối) cho AI agent bây giờ đang quá ồn ào. Claude Code, Codex, Cursor, Aider, OpenHarness, Cline — mỗi tháng lại có thêm một cái tên mới bọc lấy cái vòng lặp (loop) cũ rích đó. Mỗi bên lại áp đặt những "quan điểm" riêng về cách viết skill, cách dùng hook, server MCP, cửa sổ ngữ cảnh hay cách tính tiền. Và cứ mỗi quý, họ lại tung ra một bản cập nhật làm hỏng hết những gì bạn đang dùng (breaking change).
Tôi vẫn dùng chúng. Chúng tiện và trải nghiệm mặc định (ergonomics) rất tốt.
Nhưng vấn đề là: Khi workflow hằng ngày của bạn chạy qua bộ khung của người khác, thực tế là bạn đang đi thuê chính những thói quen của mình. Ngày họ đổi định dạng skill, thói quen của bạn gãy. Ngày model yêu thích bị khai tử, bạn buộc phải di cư. Ngày họ đổi bảng giá, ngân sách của bạn biến động theo. Bạn chẳng bao giờ thấy sợi xích đó đâu — cho đến khi bạn thử giật mạnh nó.
"Tự sở hữu" thực chất mang lại điều gì?
Khi bắt đầu tự viết bộ khung riêng, tôi tưởng mình sẽ sa đà vào tính năng. Nhưng không. Nó xoay quanh ba giá trị thầm lặng hơn:
- Đầu tiên là Ngân sách: Hầu hết các công cụ hiện nay tính tiền theo token với giá của vendor. Nếu bạn tự trỏ loop của mình vào OpenRouter, những model như Gemma-4 bản free có thể xử lý 90% nhu cầu với giá 0 đồng. Ngay cả khi trả phí, mức sàn chỉ khoảng $0.06 cho mỗi triệu token input — rẻ hơn Haiku-4.5 tới 13 lần. Bạn toàn quyền kiểm soát "nút vặn" chi phí: giới hạn 1 đô mỗi ngày, 2 xu mỗi lần gọi, tối đa 5 lượt phản hồi. Quyền quyết định nằm ở file config của bạn, không phải ở vendor.
- Thứ hai là sự Linh hoạt: Bộ khung "nhà làm" có thể làm những thứ mà không công cụ thương mại nào sẽ làm: tự động ẩn địa chỉ ví trong mọi tin nhắn gửi đi, từ chối mọi tool call nằm ngoài allowlist, hay dump toàn bộ trace ra ổ cứng để điều tra sau này. Bạn làm được vì bạn tự viết, chẳng cần chờ vendor phê duyệt.
- Thứ ba là tính Cá nhân: Codebase của bạn là thứ bạn có thể đọc vèo cái là xong trong một buổi chiều. Bạn biết chính xác điều gì xảy ra từ lúc nhập prompt đến khi nhận kết quả. Không hệ thống plugin rườm rà, không thu thập dữ liệu ẩn (telemetry), không cần thấp thỏm xem bản cập nhật tiếp theo sẽ thay đổi điều gì.
Bản kế hoạch đó đã lớn lên như thế nào?
Kế hoạch ban đầu chỉ là 6 file. Một lúc sau, nó đã lớn thành một package thực sự — 9 MCP server trong một "kho công cụ" riêng, phần lõi được tách ra thành hàng chục module. Ngôi nhà lớn hơn — điều đó ổn thôi. Sự tăng trưởng mà bạn hiểu được vẫn tốt hơn một hộp đen mà bạn chỉ tin tưởng mù quáng.
Đây là những gì bên trong lúc này:
- Cửa Vào (
cli.py+bot.py): Hai điểm vào — terminal và Telegram. Cùng một vòng lặp chạy đằng sau cả hai. Thêm một "cửa trước" không tốn gì khi bạn đã tự sở hữu hành lang. - Tầng Nhớ (Memory Layer —
memory.py): Lắp ráp system prompt từ lệnh cơ bản, sở thích người dùng và danh mục skill. Ký ức dài hạn lưu trong SQLite có full-text search — AI có thể gợi nhớ ngữ cảnh cũ mà không cần đọc lại toàn bộ log. - Vòng Lặp Agent (
loop.py): Trái timwhile True. Gửi tin nhắn cho model, nhận lệnh gọi tool, thực thi, đưa kết quả ngược lại. Bẫy stuck-loop: 3 lần gọi giống hệt nhau liên tiếp thì dừng lại và giải thích lý do. - Budget Guard (
budget_guard.py): Module duy nhất được phép gọi OpenRouter. Thực thi fallback chain, giới hạn chi phí mỗi lần gọi, giới hạn theo ngày, và 5 phút cooldown sau khi gặp lỗi có thể thử lại. Bốn cái nút chỉnh nằm gọn một chỗ. - Bộ Lọc Bảo Mật (
security.py): Chạy trên mọi đầu ra của tool trước khi model thấy, và trên mọi câu trả lời trước khi đến tay người dùng. Địa chỉ ví bị ẩn. Private key bị xóa sạch. Seed phrase bị bắt. Nỗ lực prompt-injection từ tool output bị bọc lại và đánh dấu. - MCP Registry (
mcp_client.py): Kết nối với các server bên ngoài qua giao thức MCP. Kho công cụ hiện tại: máy tính, EVM, phân tích on-chain, tìm kiếm web, scraping URL, engine chiến lược, đọc/ghi memory, gửi Telegram. - Persistence (
persistence.py): Trạng thái được lưu bằng SQLite. Lịch sử trò chuyện, sổ cái chi phí, cooldown của model — tất cả trong một file có thể mở bằngsqlite3và kiểm tra trong 10 giây. - Trace (
trace.py): Hộp đen máy bay. Mọi byte vào và ra đều được ghi xuống đĩa. Khi có sự cố, bạn mở log ra xem — không tốn tiền chạy lại để debug.
Tám căn phòng và một kho công cụ. Nhưng bạn vẫn đứng trong bếp mà nhìn thấy cửa chính. Không có plugin system giả làm móng nhà, không có event bus mà bạn không lần ra được, không có marketplace mà bạn không kiểm toán được.
Tại sao sự tối giản này lại mạnh mẽ?
Triết lý "Bạn đứng trong bếp vẫn nhìn được cửa chính" mang lại hai lợi thế cực lớn:
- Tính minh bạch tuyệt đối (Auditability): Trong các hệ thống lớn, khi một lỗi xảy ra, nó thường bị nuốt chửng bởi một "Event Bus" phức tạp hoặc một mớ plugin chồng chéo. Ở đây, nếu có lỗi, bạn chỉ cần lần theo "hành lang" nối các căn phòng này. Bạn biết chắc chắn lỗi nằm ở đâu.
- Không có "Ma thuật đen": Không có telemetry gửi dữ liệu về cho vendor, không có những tính năng "thông minh" tự ý can thiệp vào prompt của bạn.
Khi bạn làm chủ được vòng lặp này, bạn không còn là người dùng AI nữa. Bạn trở thành người vận hành (operator) hệ thống. Đó là sự khác biệt giữa việc lái một chiếc xe số tự động của hãng và việc tự tay ráp một chiếc xe go-kart: cái sau có thể thô kệch, nhưng bạn biết rõ từng con ốc, và nó chạy chính xác theo cách bạn muốn.
Cái giá phải trả (Nói thẳng)
Bạn tự viết loop, bạn tự lo lỗi. Trước khi bắt đầu, mối lo ngân sách lớn nhất của tôi là prompt caching — vì system prompt dài và lặp lại ở mỗi lượt. Tôi cứ nghĩ phải tự tay triển khai phần quản lý cache này. Hóa ra không cần: các provider trên OpenRouter xử lý cache hit trên các prefix lặp lại một cách tự động. Một mối lo được gạch bỏ trước khi tôi viết dòng code nào.
Những thứ thực sự "hành" bạn: OpenRouter trả về prompt_tokens trong khi hệ thống kế toán của bạn lại chờ input_tokens. Chỉ cần quên đổi tên biến một lần, sổ cái chi phí sẽ báo $0 một cách ngây thơ. Bạn vá lỗi, và đi tiếp.
Bạn phải chịu trách nhiệm cho tất cả những gì mà các công cụ xịn sò kia từng gánh thay: bẫy vòng lặp vô tận, fallback chain, logic cooldown hay quét prompt-injection. Không có gì quá khó, nhưng tất cả đều là việc của bạn.
Tuần đầu tiên, mọi thứ sẽ chậm hơn nhiều so với việc cài Claude Code rồi dùng luôn. Nhưng đến tháng thứ hai, bạn thậm chí không còn nhận ra bộ khung đó đang tồn tại. Đó mới chính là đích đến.
Đôi dòng suy ngẫm
Tôi không khuyên bạn phải vứt bỏ các công cụ hiện có. Thường thì cái gì tiện nhất vẫn là cái tốt nhất để làm việc.
Nhưng đâu đó trong stack công nghệ của bạn, chắc chắn có một mảnh hạ tầng mà bạn đã ngừng đặt câu hỏi chỉ vì nó miễn phí, hoặc vì nó là mặc định, hay vì "ai cũng dùng thế". Model đứng sau agent, định dạng skill, hệ thống hook hay cách tính tiền... mỗi thứ đó đều là một quyết định thầm lặng mà người khác đã chọn thay bạn.
Không phải tầng nào cũng cần bạn phải tự xây. Nhưng cái "vòng lặp" (loop) cốt lõi thì đôi khi cần đấy.
Ngành công nghiệp AI sẽ tiếp tục tung ra những bộ khung to lớn hơn, bóng bẩy hơn. Một phần trong đó thực sự hữu ích, nhưng phần lớn là "lock-in" núp bóng sự tiện lợi.
Bộ khung tự dựng vừa xấu vừa rẻ của bạn sẽ chẳng thể cạnh tranh được ở những mặt đó. Nó chỉ làm được đúng một việc duy nhất: Nó mãi mãi là của bạn.
Và thật lòng mà nói? Có lẽ đó là tính năng duy nhất thực sự quan trọng.
Repo ở đây nếu bạn muốn đọc cái vòng lặp đó.
Mảnh nhỏ nhất trong workflow hằng ngày mà bạn có thể tự viết lại trong một ngày cuối tuần là gì — và liệu việc đó có thay đổi được điều gì không?