SSD Nodes Learn 🎉 VPS từ $5.50/tháng
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-21

Agent harness là gì và cách hoạt động của nó

Agent harness là chương trình bao quanh LLM để duy trì vòng lặp, công cụ và trạng thái phiên. Bài viết giải thích sự khác biệt kỹ thuật giữa model và harness trong hệ thống AI.

Agent harness là gì

Agent harness là chương trình chạy bao quanh một language model để biến nó thành một agent. Nó duy trì vòng lặp liên tục gọi model, chứa các định nghĩa công cụ mà model được phép sử dụng, các quy tắc cấp quyền quyết định xem lệnh gọi nào được thực thi, trạng thái phiên làm việc tồn tại giữa các lượt truy vấn và thư mục làm việc nơi các tác vụ diễn ra. Bạn có thể thay thế model bên trong harness này.

Câu cuối cùng là điểm quan trọng nhất. Một model đơn lẻ chỉ trả lời câu hỏi rồi quên bạn ngay sau đó. Một harness sẽ hỏi model bước tiếp theo cần làm gì, chạy lệnh mà model yêu cầu, trả kết quả về và tiếp tục hỏi lại. Sự lặp lại đó chính là ý nghĩa của thuật ngữ "agent". Nếu các thuật ngữ liên quan vẫn còn mơ hồ, sự khác biệt giữa AI agent, LLM và assistant sẽ giúp bạn làm rõ các khái niệm trước khi chọn công cụ.

Harness không phải là model

Hai khái niệm này thường bị nhầm lẫn vì các nhà cung cấp phát hành chúng dưới cùng một tên thương hiệu.

dsh và DeepSeek là các sản phẩm khác nhau. DeepSeek Harness, được công bố tại github.com/deepseek-ai/deepseek-harness vào ngày 13 tháng 8 năm 2026 theo giấy phép MIT, là một chương trình Node mà bạn cài đặt trên máy. Các model DeepSeek là các trọng số (weights) được phục vụ phía sau một API (application programming interface). Hãy trỏ dsh vào một model từ nhà cung cấp khác và nó vẫn hoạt động, vì harness chỉ cần một thứ gì đó chấp nhận tin nhắn và trả về các lời gọi công cụ (tool calls).

Claude Code và Claude là một cặp tương tự. Claude Code là một harness: một chương trình terminal có vòng lặp, hệ thống phân quyền, cùng các công cụ file và shell. Claude là dòng model mà nó gọi theo mặc định. Codex và Gemini CLI cũng được phân tách theo cách tương tự.

Đây là bài kiểm tra để xác định rõ ràng mọi lúc. Bạn cài đặt một harness. Bạn gọi một model. Nếu thứ đó có phiên bản trên ổ đĩa của bạn và một file cấu hình trong thư mục home, đó là một harness. Nếu nó là một chuỗi ký tự bên trong file cấu hình đó, ví dụ như deepseek-chat, thì đó là model.

Vòng lặp thực tế hoạt động như thế nào

Một vòng lặp của harness diễn ra như sau. Hãy đọc kỹ, vì hầu hết sự khác biệt giữa các harness đều nằm trong năm bước này.

  1. Harness gửi toàn bộ nội dung hội thoại hiện tại, kèm theo danh sách các định nghĩa tool, tới model.
  2. Model phản hồi bằng văn bản hoặc yêu cầu gọi một trong các tool đó.
  3. Harness kiểm tra yêu cầu đó dựa trên các quy tắc cấp quyền, sau đó thực thi hoặc dừng lại để hỏi bạn.
  4. Harness chạy tool, ghi lại kết quả đầu ra và mã thoát (exit code), đồng thời cắt bớt kết quả nếu nó quá dài.
  5. Harness thêm kết quả đó vào hội thoại và quay lại bước 1.

Bước 3 là nơi các harness khác biệt nhiều nhất trong quá trình sử dụng hàng ngày. Một harness hỏi trước mỗi lệnh thì an toàn nhưng gây mệt mỏi. Một harness không bao giờ hỏi sẽ có lúc chạy một lệnh phá hoại trên đường dẫn mà model xác định sai. Mọi harness nghiêm túc hiện nay đều có thiết lập trung gian: danh sách cho phép (allowlist) các lệnh chạy không cần hỏi, và prompt xác nhận cho mọi thứ còn lại.

Bước 1 là nơi tạo ra những khác biệt còn lại. Hội thoại dài ra sau mỗi lượt và model có một context window cố định, vì vậy harness phải quyết định cái gì cần loại bỏ, cái gì cần tóm tắt, và cái gì cần ghi ra file để đọc lại sau. Quyết định đó là lý do chính khiến hai harness cùng điều khiển một model lại tạo ra chất lượng công việc khác nhau.

Hầu hết các harness hiện nay kết nối các tool bên ngoài thông qua MCP (model context protocol), một tiêu chuẩn để cung cấp tool cho bất kỳ harness nào hỗ trợ nó, nhờ đó một tích hợp có thể dùng cho nhiều harness. Chạy các MCP server trên VPS đề cập đến khía cạnh này.

Agent harness so với agent framework

Câu hỏi này xuất hiện mỗi khi một harness mới ra mắt, và các câu trả lời thường không thống nhất, một phần vì các nhà cung cấp cũng không đồng nhất với nhau. Dưới đây là cách phân biệt hợp lý nhất.

Framework là một thư viện mà bạn import vào. Bạn tự viết vòng lặp, tự quyết định khi nào gọi model, và tự xử lý kết quả từ các tool. LangChain là ví dụ điển hình: bạn nhận được các khối xây dựng và tự lắp ráp agent bằng code.

Harness là một chương trình mà bạn chạy. Vòng lặp đã được viết sẵn, các tool đã tồn tại, và mô hình phân quyền đã có cấu hình mặc định. Bạn có ngay một agent hoạt động từ lệnh đầu tiên và cấu hình nó từ đó.

Bài kiểm tra cài đặt thường là cách quyết định tốt nhất. Nếu bạn cài đặt xong rồi mới viết code, đó là framework. Nếu bạn cài đặt xong rồi bắt đầu tương tác với nó, đó là harness.

Ranh giới này thực sự gây tranh cãi, và bằng chứng rõ ràng nhất nằm trong chính tài liệu của LangChain. Tính đến tháng 8 năm 2026, họ mô tả Deep Agents là một framework "có quan điểm riêng, đầy đủ tính năng" (opinionated, batteries-included) được xây dựng trên LangGraph, trong khi kho lưu trữ langchain-ai/deepagents lại tự gọi mình là "agent harness đầy đủ tính năng". Cả hai mô tả đều hợp lý. Deep Agents là một Python SDK (bộ công cụ phát triển phần mềm) mà bạn import vào, nên bài kiểm tra cài đặt xác định nó là thư viện, nhưng nó cung cấp đủ hành vi mặc định để người dùng sử dụng nó như một harness. Microsoft đã phát hành một harness và các agent được host sẵn ra bản general availability vào tháng 8 năm 2026, cho thấy từ này hiện đã là một danh mục sản phẩm thay vì chỉ là thuật ngữ chuyên môn.

Vì vậy, hãy đặt câu hỏi dự đoán khối lượng công việc của bạn thay thế. Nếu bạn viết vòng lặp, bạn sở hữu vòng lặp đó: các lần thử lại (retries), việc cắt tỉa context, các prompt phân quyền và bản ghi lại những gì đã xảy ra. Nếu vòng lặp được cung cấp sẵn, bạn kế thừa giải pháp của người khác cho tất cả các vấn đề đó, giúp bắt đầu nhanh hơn nhiều nhưng lại khó thay đổi hơn về sau.

Sự khác biệt giữa harness và cửa sổ chat

Cửa sổ chat và harness đều hiển thị kết quả đầu ra của model. Sự khác biệt nằm ở việc công việc được thực hiện trên máy tính nào. Trong cửa sổ chat, bất kỳ mã nào model chạy đều được thực thi bên trong sandbox của nhà cung cấp, trên các file bạn đã tải lên, và nó sẽ biến mất khi phiên làm việc kết thúc. Một harness chạy các công cụ trên máy mà bạn đã khởi chạy nó, với tư cách là người dùng đã khởi chạy nó, trên các file thực tế của bạn, với các thông tin xác thực thực tế của bạn trong môi trường của nó.

Đó là toàn bộ lợi ích và toàn bộ rủi ro chỉ trong hai câu. Agent cuối cùng cũng có thể thực hiện công việc. Agent cũng có thể xóa công việc đó.

Các harness mà người dùng đang thực sự vận hành

Danh sách này được cố tình ghi ngày 19 tháng 8 năm 2026. Danh mục này thay đổi hàng tuần và bất kỳ bản tổng hợp nào cũng nhanh chóng trở nên lỗi thời.

  • Claude CodeCodex là các harness từ nhà cung cấp. Ưu tiên giao diện terminal, mặc định gắn liền với các model của chính nhà cung cấp đó, với cơ chế xử lý quyền hạn được trau chuốt nhất. So sánh Claude Code, Cursor, Codex và Copilot sẽ phân tích kỹ về chúng.
  • DeepSeek Harness (dsh) được cấp phép theo MIT và xây dựng trên một ý tưởng duy nhất: mọi thứ đều là plugin, vì vậy model, công cụ, phiên làm việc, sandbox và giao diện người dùng đều là các thành phần có thể thay thế. Nó đạt khoảng 166,800 sao trên GitHub vào ngày 19 tháng 8 năm 2026, sáu ngày sau khi được công bố.
  • Hermes, từ Nous Research, là một agent tự hành tổng quát thay vì chỉ là công cụ lập trình. Nó được phát hành theo giấy phép MIT vào tháng 2 năm 2026 và lưu trữ bộ nhớ cũng như kỹ năng trong một cơ sở dữ liệu SQLite cục bộ trên máy của bạn. Tự host Hermes trên VPS sẽ hướng dẫn chi tiết.
  • Omnigent là một meta-harness: nó điều khiển các harness khác, bao gồm Claude Code và Codex, thông qua một API duy nhất với các phiên làm việc chia sẻ, giới hạn chi tiêu và sandbox ở cấp độ hệ điều hành. Omnigent như một harness đa agent giải thích những lợi ích mà nó mang lại.
  • OneCLI là một harness chạy trong sandbox hướng tới các nhóm làm việc, được xây dựng xung quanh một gateway có khả năng chèn các credential thực vào các yêu cầu gửi đi, nhờ đó agent chỉ nhìn thấy các khóa giữ chỗ (placeholder keys).

dsh quick start chỉ là một câu lệnh duy nhất, và chạy nó một lần là cách nhanh nhất để hiểu harness là gì. Nó yêu cầu Node.js trên máy.

npx @deepseek-ai/dsh web

Câu lệnh đó khởi động web UI (giao diện người dùng) tại http://127.0.0.1:3080. Hãy đọc README trước khi bạn tin dùng nó, vì dsh tự mô tả là bản developer preview và nói rõ rằng sẽ có những thay đổi làm hỏng tính tương thích. Chạy DeepSeek Harness trên VPS đề cập đến việc cài đặt trên server, và tại sao địa chỉ đó bắt đầu bằng 127.0.0.1 giải thích về mặc định loopback.

Router nằm phía trên harness

Một model router đóng vai trò là proxy cục bộ giữa harness và API của nhà cung cấp. Claude Code Router là ví dụ phổ biến: nó bind vào 127.0.0.1:3456 theo mặc định, tiếp nhận các request mà Claude Code lẽ ra sẽ gửi trực tiếp đến nhà cung cấp của nó, rồi chuyển tiếp chúng đến nhà cung cấp mà bạn đã cấu hình. Harness không hề biết có sự thay đổi nào.

Router tồn tại vì model có thể thay thế được, do đó chúng là minh chứng tốt cho luận điểm chính của bài viết này. Chúng cũng tập trung rủi ro vì proxy nhìn thấy mọi prompt và nắm giữ mọi key của nhà cung cấp. Hãy coi nó là hạ tầng, không phải là một tiện ích. Nơi harness lưu trữ API key và cấu hình model cũng là vấn đề tương tự ở một lớp bên dưới.

Những thay đổi khi chạy harness trên VPS

Có 4 điểm thay đổi khi bạn chuyển harness từ laptop cá nhân sang một máy chủ thuê ngoài.

Nó vẫn chạy khi bạn đóng máy. Một tác vụ dài hạn sẽ không bị gián đoạn bởi việc bạn di chuyển hay hết pin. Hãy khởi chạy nó bên trong tmux và detach khỏi phiên làm việc:

tmux new -s agent
# start the harness, then press Ctrl-b and then d to detach
tmux attach -t agent

Đối với các tác vụ cần tự khởi động lại sau khi reboot, một user service sẽ hiệu quả hơn phiên terminal thông thường:

loginctl enable-linger $USER
systemctl --user status my-agent.service

loginctl enable-linger là phần mà nhiều người thường bỏ sót. Nếu thiếu nó, systemd sẽ dừng các service của user ngay khi phiên SSH cuối cùng của bạn đóng lại, khiến agent bị tắt mà không hề báo lỗi. Chạy dsh ở chế độ headless bằng systemd có chứa file unit mẫu. Khi đã có một phiên chạy trên server, việc mở thêm phiên thứ hai không tốn thêm tài nguyên, và hai phiên Claude Code trên cùng một máy có thể nhắn tin cho nhau, cho phép phiên bạn khởi động từ sáng có thể bàn giao công việc cho phiên kia mà không cần bạn phải thao tác thủ công.

Nó lưu trữ các key của bạn. Key của nhà cung cấp giờ đây nằm trong một file cấu hình trên server đó. Hãy kiểm tra quyền đọc file này:

ls -l ~/.config

Bất kỳ tiến trình nào chạy dưới quyền user của bạn đều có thể đọc file này, bao gồm cả agent và bất cứ thứ gì mà agent đó thực thi.

Nó có thể truy cập các máy khác của bạn. Một VPS nằm cùng private network với các máy khác sẽ cung cấp cho agent một đường dẫn để kết nối tới chúng. Đây chính là mục đích sử dụng, nhưng cũng là phạm vi ảnh hưởng nếu có sự cố (blast radius).

Nó có thể bị truy cập từ bất cứ đâu. Hầu hết các harness đều cung cấp giao diện web UI, và đa số đều bind nó vào loopback vì lý do bảo mật. Hãy kiểm tra cấu hình của bạn:

ss -tlnp | grep 3080

127.0.0.1:3080 nghĩa là chỉ bản thân server mới có thể kết nối. 0.0.0.0:3080 nghĩa là bất kỳ ai tìm thấy địa chỉ IP đều có thể truy cập. Hãy truy cập UI qua loopback bằng SSH tunnel thay vì thay đổi địa chỉ bind:

ssh -N -L 3080:127.0.0.1:3080 you@your-server

Sau đó mở http://127.0.0.1:3080 trên trình duyệt ở laptop của bạn. Lưu lượng truy cập sẽ chạy bên trong phiên SSH, vì vậy không có cổng mới nào bị lộ ra Internet.

Mỗi điểm trên cũng chính là lập luận về bảo mật

Hãy đọc lại bốn đặc tính đó dưới góc nhìn của một kẻ tấn công.

Nó chạy tự động không cần giám sát, nên không ai để ý khi model đọc nhầm đường dẫn. Nó giữ các key của bạn, nên chỉ cần một file cấu hình bị lộ là toàn bộ tài khoản nhà cung cấp của bạn bị chiếm. Nó có thể truy cập các máy chủ khác của bạn, nên một vụ prompt injection, tức là các chỉ dẫn ẩn trong trang web hoặc file mà agent đọc, giờ đây đã có đường dẫn đến máy chủ database của bạn. Nó có thể truy cập từ bất cứ đâu, nên một web UI bind vào 0.0.0.0 mà không có mật khẩu chính là một shell trên Internet công cộng.

Cách khắc phục cho từng trường hợp đều nhàm chán, và lần nào cũng giống nhau. Hãy cấp cho agent một user account không có đặc quyền thay vì dùng tài khoản của bạn:

sudo adduser --disabled-password --gecos "" agent

Hãy giữ web UI ở loopback và truy cập qua SSH. Cấp cho agent những credential hạn chế nhất mà vẫn đủ để nó hoàn thành công việc, vấn đề này được giữ bí mật không để lọt vào AI agent giải thích kỹ hơn. Đối với bất cứ thứ gì chạy khi bạn không giám sát, một máy dùng một lần (throwaway machine) luôn tốt hơn một máy được cấu hình cẩn thận: chạy coding agent trong VM dùng một lầnchạy Claude Code an toàn trên VPS đều đi theo hướng đó.

Bạn có cần một agent harness không?

Nếu công việc của bạn chỉ là từng câu hỏi một, một cửa sổ chat là đủ, và một harness chỉ thêm vào một vòng lặp mà bạn phải giám sát. Một harness bắt đầu phát huy giá trị khi một tác vụ cần thực hiện nhiều bước trên các file thực tế, hoặc khi nó phải tiếp tục làm việc trong lúc bạn đang ngủ.

Hầu hết các công cụ trong danh mục này còn rất mới. dsh ghi rõ là bản developer preview trong file README của chính nó tính đến tháng 8 năm 2026, và các công cụ còn lại đang thay đổi nhanh đến mức file cấu hình bạn viết hôm nay có thể cần chỉnh sửa vào tháng sau. Đó là lý do để giữ cho thiết lập của bạn nhỏ gọn và có thể tái lập, đồng thời là lý do để ghi lại những gì bạn đã thay đổi. Sự tiết chế tương tự cũng hữu ích bên trong vòng lặp, nơi một kỹ năng thúc đẩy agent hướng tới thay đổi nhỏ nhất có hiệu quả để lại cho bạn một bản diff mà bạn thực sự có thể đọc được sau khi kết thúc một lần chạy không cần giám sát. Hãy bắt đầu với một harness trên một server, giao cho nó một công việc và một key với quyền hạn hạn chế, và chỉ mở rộng quyền truy cập sau khi công việc đầu tiên đó đã trở nên nhàm chán trong một tuần. Các agent tự host đáng chạy hiện nay là một nơi hợp lý để chọn cái đầu tiên.

FAQ

Agent harness là gì nếu giải thích đơn giản?

Đó là chương trình bao quanh model. Model tạo ra văn bản và các yêu cầu sử dụng công cụ. Harness chạy vòng lặp để liên tục đặt câu hỏi, thực thi các công cụ mà model yêu cầu, áp đặt quy tắc về việc công cụ nào được chạy mà không cần cấp quyền, đồng thời duy trì trạng thái phiên làm việc và các file giữa các lượt phản hồi. Bạn có thể thay thế model mà harness vẫn hoạt động; đây là dấu hiệu rõ ràng nhất cho thấy hai thành phần này tách biệt.

Claude Code là model hay là harness?

Claude Code là một harness. Nó là một chương trình terminal có vòng lặp, hệ thống cấp quyền và các công cụ file và shell tích hợp sẵn. Claude là dòng model mà nó gọi theo mặc định. Sự phân tách tương tự cũng áp dụng cho DeepSeek Harness (dsh), vốn là một chương trình Node mà bạn cài đặt, còn các model DeepSeek được phục vụ qua API. Bạn cài đặt harness trên máy tính. Bạn gọi model qua mạng.

Sự khác biệt giữa agent harness và agent framework là gì?

Framework là một thư viện mà bạn import và viết code dựa trên đó, vì vậy bạn tự quản lý vòng lặp, việc thử lại và xử lý ngữ cảnh. Harness là một chương trình bạn chạy, vì vậy tất cả các tính năng đó đã được đóng gói sẵn với các thiết lập mặc định mà bạn chỉ cần cấu hình thay vì phải viết code. Trong thực tế, ranh giới này khá mờ nhạt: Deep Agents của LangChain là một SDK có thể import, nhưng chính repository của nó lại gọi đó là một agent harness "tất cả trong một" (batteries-included), tính đến tháng 8 năm 2026. Hãy tự hỏi liệu bạn có phải tự viết vòng lặp hay không. Câu trả lời đó sẽ quyết định thuật ngữ nào phù hợp với tình huống của bạn.

Tôi có cần VPS để chạy agent harness không?

Không. Mọi harness được nêu tên ở đây đều chạy được trên laptop. Một máy chủ sẽ thay đổi bốn yếu tố: agent vẫn tiếp tục chạy khi bạn gập máy, nó lưu trữ các key của bạn trên một máy luôn bật, nó có thể kết nối tới các máy chủ khác của bạn và bạn có thể quay lại cùng một phiên làm việc từ bất kỳ thiết bị nào. Mỗi yếu tố đó cũng là một vấn đề cần cân nhắc về bảo mật, vì vậy hãy cấp cho agent một tài khoản người dùng riêng và giữ mọi giao diện web (web UI) bind vào 127.0.0.1.

Tôi có thể sử dụng model khác bên trong cùng một harness không?

Thường là có, và đó là đặc tính định nghĩa của một harness. Hầu hết chúng đều nhận tên model và base URL trong file cấu hình, vì vậy việc trỏ nó sang một nhà cung cấp khác chỉ là thao tác chỉnh sửa thay vì viết lại. Ở những nơi mà harness không hỗ trợ trực tiếp, một local router như Claude Code Router sẽ đứng giữa harness và nhà cung cấp để chuyển đổi các yêu cầu, mặc định bind vào 127.0.0.1:3456. Hãy cẩn thận với proxy đó, vì nó nhìn thấy mọi prompt và nắm giữ mọi key.