BÀI VIẾT

Tôi Tự Dựng Một ‘Devin’ Self-Host — Kiến Trúc Của Một Kỹ Sư AI Tự Chủ Mà Bạn Sở Hữu

Devin giá $500/tháng. Background agent của Cursor thì chạy trên cloud của người khác với code của bạn. Nên tôi dựng lại cùng năng lực đó trên máy của mình, bằng gói Claude tôi đã trả tiền. Đây là toàn bộ kiến trúc -- vòng lặp, data model, kế hoạch 6 phase, phần hardening -- và tại sao 70% trong đó là hạ tầng tôi đã có sẵn.

agentic ai production

Đọc cùng AI

Chọn nội dung để sao chép và dán vào trợ lý AI. Không tự gửi dữ liệu. Nội dung CMS được chuyển sang Markdown; dùng Markdown gốc nếu có.

Bạn giao một task bằng một câu. Một agent đọc repo, viết plan, sửa code, chạy test, sửa chỗ hỏng, tự review diff của chính nó, rồi mở pull request. Bạn review cái PR đó như review code của một junior. Đó là lời hứa của Devin, của background agent trong Cursor — và nó không phải chém gió, nó chạy thật.

Nhưng có mấy thứ làm tôi khó chịu. Code của tôi bị clone lên máy của họ. Chi phí tính theo từng task, nghĩa là công cụ đắt lên đúng lúc nó hữu ích nhất. Và cái agent là một hộp đen tôi cấu hình được nhưng không kiểm soát được — nó không biết convention của tôi, checklist review của tôi, định nghĩa “done” của tôi.

Nên qua vài buổi tối, tôi dựng lại đúng thứ đó trên phần cứng của mình, bằng gói Claude Max tôi vốn đã trả tiền. Tôi gọi nó là Origin, chạy ngay trong workspace agent self-host tôi dùng với team. Bài này là toàn bộ kiến trúc — vì một khi bạn nhìn ra nó, bạn sẽ hiểu một “kỹ sư tự chủ” không phải một moonshot. Nó là một lớp điều phối (orchestration) đặt lên trên những mảnh bạn gần như đã có sẵn.

Sự thật hơi phũ: phần lớn chỉ là “đường ống”

Tôi vẽ toàn bộ hệ thống ra trước khi viết dòng code mới nào. Đây:

flowchart LR
  U["tôi / đồng đội"] -->|"giao · hoặc gắn nhãn issue"| O["giao diện Origin"]
  O --> ORC["orchestrator"]
  ORC --> BR["Claude Agent SDK"]
  BR --> WS["bản clone repo cô lập"]
  WS -->|"push nhánh + PR"| GH["GitHub"]
  ORC -->|"chạy test"| TST["test runner"]
  ORC -->|"soi diff"| RV["auto-review"]
  BR -.->|"plan · tool · diff · test · pr"| O
  GH -.->|"nhãn issue / comment PR"| ORC

Giờ nhìn từng ô thực chất là gì:

  • Bộ thực thi là một thư viện. Claude Agent SDK cho bạn vòng lặp tự chủ với công cụ thật — shell bền, trình sửa file, git, web search, MCP server. Bạn trỏ nó vào một thư mục, nó đọc, sửa, chạy lệnh cho tới khi xong. Đây mới là phần thực sự khó, và người khác đã viết sẵn.
  • Vòng đời git là một shell script. Clone, tạo nhánh, commit, push, mở PR. Không có AI trong đó, và bạn muốn không có — git xác định nghĩa là một cú “ảo giác” không bao giờ push được vào main.
  • GitHub vốn đã là một API. gh mở PR. Test chạy bằng lệnh của chính repo. Review chạy bằng reviewer bạn đã tin.

Khoảng 70% của một kỹ sư tự chủ là hạ tầng đã tồn tại rồi. Khi tôi map cái của mình:

Năng lực Trạng thái Thực chất là gì
Bộ thực thi tự chủ (shell · edit · git · web) Có sẵn Claude Agent SDK
Clone → nhánh → commit → push → PR Có sẵn một shell wrapper
Danh tính GitHub theo user Có sẵn gh + token
Chạy test của repo Có sẵn lệnh của chính repo
Review diff soi-từng-khẳng-định Có sẵn một reviewer agent
Stream trực tiếp quá trình làm Có sẵn luồng sự kiện của SDK
Kill switch & chốt duyệt Có sẵn một cờ stop
Máy trạng thái run + event log Mới hai bảng nhỏ
Workspace cô lập + giới hạn Mới một worker + worktree
Vòng lặp plan → build → test → review → PR Mới orchestrator
Giao diện (board · session · diff) Mới một tab

Cái mới thì nhỏ: một run record, một vòng lặp điều phối, và một giao diện để xem. Agent mang lại phán đoán. Mọi thứ xung quanh là phần mềm thường mà tôi kiểm soát hoàn toàn. Chính cách nhìn đó là chìa khóa.

Vòng lặp biến một “demo” thành một “đồng nghiệp”

Một lời gọi agent kiểu “làm đi” chỉ là trò ảo thuật. Thứ bạn dám cho lại gần repo thật là một máy trạng thái có các chốt kiểm soát (checkpoint):

flowchart LR
  Q([task]) --> P[Plan]
  P -->|"⚑ duyệt plan"| B[Build]
  B --> T[Test]
  T -->|fail| B
  T -->|pass| R[Review]
  R --> S[Ship]
  S -->|"⚑ duyệt push"| PR([Pull request])
  1. Plan — đọc codebase, chẻ mục tiêu thành checklist kèm tiêu chí nghiệm thu rõ ràng.
  2. Build — code trong một bản clone cô lập, stream từng lệnh để tôi xem nó “nghĩ”.
  3. Test — chạy bộ test. Fail thì đưa output ngược lại và sửa. Giới hạn vài vòng để không lặp vô tận.
  4. Review — chạy một reviewer soi chính diff của nó trước khi dám hỏi tôi.
  5. Ship — push một nhánh work, mở PR kèm tóm tắt. Không bao giờ merge vào main.

Hai chặng có chốt duyệt của người: duyệt plan trước khi viết dòng nào, và duyệt trước khi push bất cứ thứ gì. Tư thế mặc định là quyết định thiết kế quan trọng nhất tôi đưa ra:

Origin là một đồng nghiệp chuyên mở pull request. Nó không phải một con bot có quyền commit vào main.

Câu đó là ranh giới giữa “tự chủ mà tôi tin” và “tự chủ mà tôi sợ”. Tôi có đòn bẩy của một agent làm việc trong lúc tôi họp, và tôi giữ đúng một thứ quan trọng — nút merge.

Hai cái bảng và vài endpoint

Toàn bộ trạng thái nằm trong hai bảng. Một run là bản ghi bền; các sự kiện của nó là log chỉ-thêm (append-only), nên giao diện dựng lại hoàn hảo khi reload và mọi hành động đều truy vết được.

runs        id · title · goal · repo · base_branch · work_branch
            status (queued→planning→building→testing→reviewing→awaiting_push→done / blocked / failed)
            plan · pr_url · budget · cost · approval_mode · member

run_events  id · run_id · seq · kind (status·plan·tool·text·diff·test·pr·error) · payload
            // chỉ-thêm · đã che secret · vừa dựng UI live vừa là nhật ký kiểm toán

Mọi thứ UI hiển thị và mọi thứ auditor cần đều là một phép chiếu của event log đó.

Dựng theo 6 phase

Tôi ship theo thứ tự phụ thuộc. P0–P1 là MVP chạy được trong khoảng một tuần — giao task, ra PR. Tới hết P4 là ngưỡng trước khi cho người khác đụng vào.

Phase Giao gì Công sức
P0 Data model & giao diện Run record, event log, board rỗng nối endpoint thật ~1–2 ngày
P1 Thực thi trong repo Clone → agent sửa trong repo → push → PR ~2–3 ngày
P2 Vòng lặp & chốt duyệt Plan → test-fix → review, chốt plan/push, steering ~3–4 ngày
P3 Giao diện session live Board + plan, activity stream, diff, tests, PR ~3–5 ngày
P4 Hardening Cô lập, secret, rào chắn, ngân sách, audit ~1–2 tuần
P5 Tích hợp team Trigger nhãn issue & comment PR, config per-project ~3–5 ngày

Cái 90% chẳng ai demo: làm cho nó an toàn

Mọi video autonomous-agent hào nhoáng đều dừng ở “nhìn nè, nó mở PR”. Khoảng cách giữa cái video đó và một công cụ team dùng hằng ngày nằm hoàn toàn ở phần an toàn không hào nhoáng. Tôi tốn phần lớn thời gian ở đây:

Kiểm soát Làm gì
Cô lập Mỗi run có worktree riêng dưới user sandbox không đặc quyền, bọc trong giới hạn CPU/bộ nhớ/thời gian
Bí mật có phạm vi Token GitHub chỉ nạp vào env của đúng một run, không lưu, không log; log được che
Rào chắn Chỉ push nhánh work, không --force, danh sách cấm lệnh phá hoại, path allowlist
Quét rò rỉ bí mật Quét diff tìm key trước khi push; chốt .gitignore để .env không đi kèm
Ngân sách cứng Trần tiền theo từng run, dừng khi chạm trần, chi phí hiện live
Kiểm toán Mọi lệnh shell, tool call, thao tác git ghi lại bất biến — ai, repo nào, làm gì

Một agent có shell + token của bạn thì mạnh và nguy hiểm. Bạn phải coi token như plutonium. Không thứ nào lên hình đẹp, nhưng tất cả là lý do tôi dám trỏ cái này vào một codebase nuôi lương.

Vì sao tự sở hữu thì thắng

Self-host mua được ba thứ mà bản hosted về cấu trúc không thể cho:

  1. Code không rời máy tôi. Không bên thứ ba nào giữ repo.
  2. Chi phí là subscription, không phải công-tơ. Origin chạy qua gói Claude Max của tôi. Không có bộ đếm theo-task nhảy số đúng lúc công cụ chứng minh nó hữu ích.
  3. Nó làm theo chuẩn của tôi. Convention của tôi, checklist PR của tôi, định nghĩa done của tôi — vì tôi viết cái harness. Nó tái dùng đúng bộ skill, ngân sách và knowledge base mà các agent của tôi đang chung.

Và vì nó sống trong workspace của tôi, nó ghép nối được: gắn nhãn một issue thì một run tự khởi động; comment vào một PR thì nó sửa. Kỹ sư tự chủ trở thành một phần của luồng làm việc, thay vì một cổng riêng tôi phải ghé.

Rút gọn cho các tech lead khác

Một kỹ sư tự chủ không phải sản phẩm bạn bị buộc phải thuê. Nó là một mẫu điều phối:

Một agent SDK đủ mạnh, chạy trong bản clone cô lập của repo, bọc trong vòng đời git xác định và vòng lặp plan-build-test-review-ship, kèm chốt duyệt của người và rào chắn cứng.

Cứ mua bản hosted nếu đánh đổi hợp với bạn — đó là sản phẩm thật và nó tốt. Nhưng nếu bạn có code riêng tư, ngân sách cố định, và có quan điểm về cách phần mềm của mình được viết, thì hãy biết: cùng năng lực đó chỉ là một cuối tuần điều phối đặt lên các công cụ bạn đã chạy sẵn. Đòn bẩy khổng lồ. Chìa khóa vẫn nằm trong túi bạn.

Đó mới là điều cốt lõi.

Thảo luận

Bình luận được duyệt trước khi công khai. Email của bạn được giữ riêng tư.

Viết bình luận

Cần tên và email. Không gửi thông tin bí mật.

Quyền riêng tư & dữ liệu

Đang tải xác minh chống spam…

← Về danh sáchRead in English