Tối qua, DeepSeek mã nguồn mở “DeepSeek Harness” theo giấy phép MIT — một runtime cho AI agent được xây dựng quanh một ràng buộc khá triệt để: mọi thứ đều là plugin. Model adapter, tool registry, session log, sandbox, và thậm chí cả agent loop (vòng lặp điều phối) cũng là plugin. Chỉ vài giờ sau khi công bố, repo đã vượt 33.000 sao trên GitHub.

Tôi dành cả buổi sáng đọc source code và nghĩ về ý nghĩa của nó với những đội đã dành cả năm qua để ghép LangGraph, tool registry tự viết, và session state tự chế. Nhận định của tôi: ý tưởng “mọi thứ là plugin” không mới về mặt kiến trúc, nhưng DeepSeek áp dụng nó nhất quán hơn bất kỳ framework agent nào tôi từng thấy — và có một bài học cụ thể ngay cả khi bạn không bao giờ dùng code của họ.

”Mọi thứ là plugin” thực sự nghĩa là gì

Hầu hết framework agent cho phép bạn thay model. Một số cho phép thay tool. Rất ít framework cho phép thay loop — logic điều khiển quyết định “gọi tool nào, đọc kết quả, quyết định bước tiếp theo”. DeepSeek Harness coi loop chỉ là một plugin khác, triển khai một interface nhỏ, được vận hành bởi meta-framework tên Cordis mà họ mô tả là “một programming paradigm cho spatiotemporal composability.”

Trong thực tế, điều này có nghĩa là bạn có thể:

  • Thay model adapter mà không đụng vào code tool (dùng Claude, GPT, hay model chạy local tùy ý)
  • Thay tool registry bằng một registry nội bộ công ty, tự áp RBAC riêng
  • Hot-swap plugin session/log để đẩy dữ liệu về hệ thống observability của bạn thay vì stdout
  • Thay chính loop — ví dụ chuyển từ ReAct loop đơn giản sang mô hình planner/executor — mà không cần viết lại tool hay model adapter

Đây là bản rút gọn của plugin contract, dựa theo thiết kế của harness:

interface AgentPlugin<T = unknown> {
  name: string;
  kind: "model" | "tool" | "loop" | "session" | "sandbox";
  init(ctx: AgentContext): Promise<T>;
}

// Chính loop cũng chỉ là một plugin
class ReactLoop implements AgentPlugin<LoopHandle> {
  name = "react-loop";
  kind = "loop" as const;

  async init(ctx: AgentContext) {
    return {
      async run(input: string) {
        let state = ctx.session.init(input);
        while (!state.done) {
          const action = await ctx.model.decide(state);
          const result = await ctx.tools.invoke(action);
          state = ctx.session.append(state, action, result);
        }
        return state.final;
      },
    };
  }
}

Điểm mấu chốt: ReactLoop không biết nó đang dùng model nào, tool nào, hay session backend nào. Nó chỉ biết interface AgentContext. Thay ctx.model bằng model local, thay ctx.tools bằng registry nội bộ có giới hạn quyền, code của loop không hề thay đổi.

Vì sao điều này quan trọng hơn vẻ ngoài

Tôi đã xây 3 stack agent nội bộ trong 18 tháng qua, và lỗi lặp lại luôn giống nhau: logic loop và logic tool bị quấn vào nhau. Ai đó thêm rule “nếu kết quả tool có chứa PII thì redact trước khi log” bên trong loop, rồi 6 tháng sau không ai có thể thay logging backend mà không phải audit lại toàn bộ loop để tìm business logic ẩn.

Ranh giới plugin buộc một kỷ luật: loop chỉ điều phối, plugin sở hữu hành vi. Kỷ luật này đáng áp dụng ngay cả khi bạn không bao giờ cài DeepSeek Harness. Nếu bạn đang duy trì stack dựa trên Claude Agent SDK hay Model Context Protocol (MCP), hãy tự hỏi: mình có thể thay tool registry mà không đụng vào loop code không? Nếu câu trả lời là không, bạn đang gặp đúng vấn đề coupling mà kiến trúc của DeepSeek được thiết kế để tránh.

Thử nghiệm thực tế: thay model adapter

Tôi clone repo và chạy phép thử nhanh nhất có thể — thay model adapter mặc định bằng model local, giữ nguyên toàn bộ tool và loop:

git clone https://github.com/deepseek-ai/deepseek-harness
cd deepseek-harness
npm install

# harness.config.ts
export default {
  plugins: {
    model: "./plugins/model-local-ollama.ts",  // đã thay
    tools: ["./plugins/tool-fs.ts", "./plugins/tool-http.ts"],  // giữ nguyên
    loop: "./plugins/loop-react.ts",  // giữ nguyên
  },
};
npx deepseek-harness run --task "list files in ./src and summarize the largest one"

Không cần sửa code tool, không cần sửa code loop — chỉ đổi plugin model. Đó là toàn bộ luận điểm của họ, và trong phép thử này nó đúng như quảng cáo. Với những đội đang cân nhắc giữa model mở và model đóng vì lý do chi phí, đây là một đặc tính thực sự hữu ích: bạn có thể A/B test giữa các nhà cung cấp model trên cùng một stack tool + loop, thay vì phải đấu dây lại toàn bộ agent mỗi lần muốn so sánh.

Chỗ tôi sẽ phản biện

Kiến trúc plugin đánh đổi sự đơn giản để lấy tính linh hoạt, và cái giá đó không miễn phí. Một kỹ sư junior debug “vì sao agent gọi sai tool” giờ phải lần theo ba ranh giới plugin thay vì đọc một file từ trên xuống dưới. Nếu team bạn nhỏ và agent chỉ làm một việc, một loop monolithic thường dễ suy luận hơn — bạn không cần độ composability cấp Cordis để xây một bot phân loại ticket hỗ trợ.

Kiến trúc này chỉ đáng độ phức tạp của nó khi bạn có nhiều agent dùng chung hạ tầng — loop khác nhau, phạm vi tool khác nhau, nhưng cùng model adapter và session backend. Đó chính xác là tình huống của chúng tôi với 3 agent nội bộ dùng chung pipeline observability, và đây là nơi tôi sẽ thực sự thử nghiệm pattern này.

Bài học thực tiễn

Bạn không cần áp dụng toàn bộ DeepSeek Harness để lấy được giá trị từ bản phát hành này. Hãy tự audit stack agent của mình một điều: bạn có thể thay model, thay tool, và thay session backend độc lập với nhau không, hay chúng đang bị hàn chết vào nhau? Nếu bị hàn chết, đó chính là việc refactor cần ưu tiên trước dự án agent tiếp theo, chứ không phải sau.

Nguồn: DeepSeek open sources an agent harness where everything is a plugin — The New Stack, deepseek-ai/deepseek-harness trên GitHub

Xuất nội dung

Bình luận