🖍️ v0.1.5-rc.2 · MIT · chạy trên máy bạn

DeepSeek
Harness

Harness agent lập trình, lắp ghép như xếp hình crayon.

DSH là một harness mã nguồn mở: mỗi khả năng — đọc file, chạy lệnh, gọi model, sandbox, giao diện web — là một plugin riêng biệt trong một file cấu hình. Bạn muốn bật gì, tắt gì, thay gì… chỉ cần thêm hoặc bớt một dòng.

  • ≈120plugin nhỏ, tách rời
  • 6mặt tiền: web, TUI, headless, SDK…
  • 3mức sandbox + duyệt tay
  • 1lệnh để chạy, không cần build
Ơ kìa, harness gì mà cưng dữ vậy ta!
DSH
Nhập môn

DSH là gì ta?

Một lớp vỏ điều khiển agent — lo hết phần “không vui”, để bạn chỉ còn việc giao việc và xem nó làm.

Composition

DeepSeek Harness (DSH) là một harness: nó giữ vòng lặp agent, phiên làm việc, quyền hạn, sandbox, ngữ cảnh và đường nối tới model.

Toàn bộ hệ thống được ghép từ những plugin nhỏ. Một bản ghép chỉ là danh sách các dòng plugin — đọc là hiểu, sửa là chạy.

Profile & preset

Một profile là chồng các lớp cấu hình: bundle lõi → patch của bạn → patch chung ở $DSH_HOME → overlay khi chạy.

Một agent preset là phần mà mỗi phiên tự đóng góp: công cụ, persona, các đoạn prompt.

Chạy ở nhà

File, shell, phiên làm việc và khoá API đều nằm trên máy bạn. Giao diện web chỉ nghe ở 127.0.0.1.

Không có tài khoản trung gian, không có “cloud của chúng tôi”. Bạn cài, bạn chạy, bạn giữ dữ liệu.

“Nhỏ” là một tính năng

Gần 120 gói plugin @deepseek-ai/dsh-* chia nhau từng việc: đọc file, chạy bash, nén ngữ cảnh, đo token, xin phép người dùng…

Muốn thay cách lưu phiên? Thay đúng một dòng. Muốn bỏ webhook? Tắt đúng một dòng. Không phải chui vào ruột một khối khổng lồ.

Bản phát hành

Phiên bản đang xem: v0.1.5-rc.2 · giấy phép MIT · cài bằng npm, chạy bằng Node.js.

Mã nguồn mở tại github.com/deepseek-ai/deepseek-harness, gói phát hành @deepseek-ai/dsh. Vì đang ở nhánh RC nên API còn “nhúc nhích” — nhưng đó cũng là lúc đóng góp dễ được nhận nhất.

Vì sao mê

Ưu điểm — kể vanh vách

Chín điều khiến DSH khác một “con chatbot biết sửa file”.

Plugin-first, không nguyên khối

Mỗi khả năng là một dòng có id, name, config, disabled. Bật, tắt, thay, hay tự viết thêm — tất cả đều cùng một động tác.

Cấu hình phân lớp

Bundle → patch profile → patch ở $DSH_HOME--patch khi chạy. Lớp sau đè lớp trước theo từng id, không đục vào lõi.

Sandbox 3 mức + xin phép

read-only · workspace-write · danger-full-access. Việc vượt rào sẽ hỏi bạn; bạn tắt hỏi thì nó bị từ chối. Agent mạnh, nhưng không tự tung tự tác.

Ngữ cảnh có kế hoạch

Nén hai tầng (compaction cơ bản + tỉa kết quả tool), đo token từng lượt, checkpoint phiên — để cuộc trò chuyện dài không tự bốc hơi.

Không khoá nhà cung cấp

Lớp dsh-llm tách khỏi adapter: DeepSeek, pi-ai, mock server, và cả replay (ghi lại một phiên rồi phát lại) để test không tốn token.

Sáu mặt tiền, một lõi

Web GUI, headless (một việc rồi thoát), TUI trong terminal, SDK JSON-RPC, ACP cho client tự động hoá, và profile desktop. Cùng một bản ghép, khác cái cửa bước vào.

Đa agent thật thà

Subagent chạy nền, workflow fan-out nhiều agent, vòng lặp Ralph với agent mới tinh từng vòng, và mục tiêu sống qua nhiều lượt — có trần số vòng, không chạy hoang.

Sống chung hệ sinh thái

Có sẵn MCP client, hooks tương thích Claude Code và Codex, webhook GitHub, schedule, đọc tmux, ngữ cảnh thời gian, tệp đính kèm.

Mở rộng ngay trong phiên

Viết plugin Cordis động khi đang chạy: nửa Host (Node) và nửa Client (UI trình duyệt), có Slot, theme, RPC riêng và HMR. Không cần build lại gì cả.

Đồ nghề

Tính năng, xếp theo nhóm

Tên trong ngoặc là gói plugin thật — bạn sẽ gặp đúng cái tên đó trong cấu hình.

File & tìm kiếm

Đọc, ghi, liệt kê file; glob và grep cả cây thư mục mà không cần mở vòng lặp shell.

dsh-tool-fsdsh-tool-fs-search

Sửa từng đoạn

Thay đúng đoạn cần thay thay vì ghi lại cả file — diff gọn, ít tai nạn.

dsh-tool-str-replace-editor

Shell thật

Chạy bash, giữ luôn phiên giữa các lệnh; có cả PowerShell và biến thể giữ phiên.

dsh-tool-bashdsh-tool-pwsh

Việc & việc nền

Danh sách việc để chia nhỏ tiến độ, và job chạy nền có id để hỏi thăm hoặc dừng giữa chừng.

dsh-tool-tododsh-jobs-local

Chốt bàn giao

Khai báo rõ file nào là sản phẩm cuối, để người dùng mở đúng thứ thay vì tự đoán.

dsh-tool-present

Gọi subagent

Đẩy việc lặt vặt sang agent khác: fork giữ ngữ cảnh, spawn thì sạch sẽ, có công cụ điều khiển để dừng hoặc nhắn thêm.

dsh-tool-subagentdsh-subagent

Workflow fan-out

Viết một script JS để chia việc cho nhiều agent theo giai đoạn, gom kết quả có cấu trúc — audit, migration, nghiên cứu nhiều hướng.

dsh-tool-workflowdsh-workflow-worker-thread

Vòng lặp Ralph

Mỗi vòng một agent mới tinh, không mang ký ức cũ; workspace chính là bộ nhớ dài hạn.

dsh-tool-ralph

Mục tiêu dài hơi

Một mục tiêu sống qua nhiều lượt tự động, có trần số vòng và trạng thái bị chặn rõ ràng.

dsh-goaldsh-goal-round-driver

Skill theo thư mục

Chỉ dẫn chuyên môn đóng gói thành skill, chỉ nạp khi đúng việc — ngữ cảnh không phình.

dsh-skilldsh-skill-filesystem

Chế độ lập kế hoạch

Bắt agent trình kế hoạch và chờ duyệt trước khi động vào file — hợp với việc lớn, việc rủi ro.

dsh-plan-mode

Nén ngữ cảnh & đo token

Nén hội thoại theo ngân sách, tỉa bớt kết quả tool dài, và luôn biết mình đang tốn bao nhiêu.

dsh-compaction-basicdsh-token-meter

Phiên bền & checkpoint

Phiên ghi ra JSONL, có checkpoint để quay lại, có truy vấn và chiếu lại lịch sử khi cần.

dsh-session-persistence-jsonldsh-session-checkpoint-policy

Plugin động trong phiên

Viết plugin mới ngay lúc đang chạy — cả nửa Host lẫn nửa Client (Slot, theme, UI trình duyệt), có HMR và RPC riêng.

dsh-tool-cordisdsh-cordis-client-runner

MCP & hooks

Cắm server MCP làm nguồn công cụ; dùng lại hooks quen thuộc của Claude Code và Codex.

dsh-mcp-clientdsh-hooks-claude-code

Hẹn giờ & webhook

Việc chạy theo lịch, và webhook GitHub để agent phản ứng với review, issue, push.

dsh-scheduledsh-webhook-github

Ranh giới & quyền

Sandbox hệ thống file, chính sách sandbox, và luồng xin phép người dùng — tách thành plugin riêng, thay được.

dsh-fs-sandboxdsh-user-approval

Giao diện web local

Web GUI chạy ở 127.0.0.1: xem tool card, tiến trình, plugin, và cả plugin động do chính phiên tạo ra.

dsh-web-appdsh-host-webserver

Headless, SDK, ACP

Chạy một việc rồi in kết quả (hợp với CI), nhúng qua JSON-RPC, hoặc phục vụ client tự động hoá qua ACP stdio.

dsh-headlessdsh-sdk-appdsh-acp-app

Tìm & đọc web

Tìm kiếm và mở nội dung trang web, có proxy HTTP riêng để kiểm soát đường ra.

dsh-tool-webdsh-http-proxy
Ruột gan

Ghép lại thì ra DSH

Ba mặt phẳng: phần dùng chung, phần của bạn, và phần của riêng một phiên.

🏗️ Bundle lõi

Lớp nền do DSH phát hành.

  • Plugin dùng chung, xếp theo thứ tự
  • Mỗi gói là một patch “insert”
  • Ví dụ: dsh-base

🎚️ Patch của bạn

Nơi bạn thật sự sửa.

  • cordis.patch.yml trong profile
  • Rồi patch chung ở $DSH_HOME
  • Rồi --patch khi chạy
  • Cùng id → lớp sau thắng

🎒 Phiên đang chạy

Một agent preset đóng góp phần của nó.

  • Công cụ của phiên
  • Persona & các đoạn prompt
  • Plugin động tạo lúc đang chạy

Hai loại “nhà”

Host composition giữ những thứ dùng chung cho mọi phiên: lưu phiên, sandbox & duyệt, route model, registry subagent.

Agent preset chỉ giữ thứ thuộc về một phiên: công cụ, persona, prompt. Cái gì nhiều phiên cùng đọc thì thuộc Host; cái gì chỉ một phiên dùng thì để trong preset.

Xem trước khi chạy

Không cần đoán cây cấu hình: --dump-config in ra bản đã ghép (kèm lớp của bạn), --dump-default-config in bản gốc không có lớp người dùng.

Patch reload kiểu live còn cho phép đổi cấu hình mà không phải khởi động lại.

cordis.patch.yml — một dòng là một khả năng
# Mảng patch của loader: chèn, đè theo id, hoặc tắt.
- insert:
    - id: llm
      name: '@deepseek-ai/dsh-llm'

    - id: web
      name: '@deepseek-ai/dsh-tool-web'

    - id: hmr            # tắt bằng đúng một dòng
      name: '@deepseek-ai/cordis-plugin-hmr'
      disabled: true
      config:
        root: ['.']

Đọc một dòng là hiểu cả hệ thống

Mỗi dòng nói rõ ba chuyện: id để các lớp sau gọi tên nó, name để biết gói nào, và config để biết nó hành xử ra sao.

disabled: true là cách tắt một khả năng mà không xoá gì — bật lại chỉ cần đổi thành false hoặc bỏ dòng đi.

Trích cú pháp thật từ dsh-base/cordis.patch.yml của bản 0.1.5-rc.2

Chọn cửa

Sáu mặt tiền, một bộ ruột

Cùng một bản ghép plugin — chỉ khác cái cửa bạn bước vào.

LệnhDùng khi nào
dsh webMở giao diện web ở 127.0.0.1 — xem tool card, tiến trình, plugin ngay trên trình duyệt.
dsh --profile headless "…"Giao một việc, in kết quả rồi thoát. Hợp với CI và script.
dsh --profile tuiLàm việc ngay trong terminal, không cần trình duyệt.
dsh --profile sdkNhúng vào ứng dụng khác qua JSON-RPC (bản sdk-minimal cho cây agent tối giản).
dsh --profile acpPhục vụ client tự động hoá qua ACP stdio cho tới khi ngắt kết nối.
dsh --from-default-profile webTạo profile riêng từ template có sẵn rồi chạy luôn — tha hồ thử nghiệm.
dsh plugin --profile <tên> add <gói>Cài thêm plugin ngoài cây: lệnh được chuyển tiếp cho pnpm trong thư mục profile.
dsh --dump-configIn cây cấu hình đã ghép rồi thoát — xem trước khi tin.
Bắt tay vào

Ba bước là chạy được

Cần Node.js (bản LTS mới là đủ). Không cần clone repo, không cần build.

terminal — chạy thử trong 30 giây
# 1. mở giao diện web, không cần cài gì
$ npx @deepseek-ai/dsh web

# 2. hoặc một việc rồi thoát (hợp với CI)
$ npx @deepseek-ai/dsh --profile headless \
      "chạy test và tóm tắt lỗi"

# 3. tạo profile riêng từ template web
$ npx @deepseek-ai/dsh --profile cua-toi \
      --from-default-profile web

# 4. xem cây cấu hình đã ghép
$ npx @deepseek-ai/dsh --dump-config \
      --profile cua-toi

Chạy là có mặt tiền

dsh web tự khởi tạo profile lần đầu rồi mở giao diện ở 127.0.0.1. Thư mục bạn đang đứng chính là workspace mặc định.

Chọn mức tin tưởng

Bắt đầu với chế độ chỉ đọc hoặc ghi trong workspace. Khi cần agent làm việc nặng hơn, bạn nới quyền — và mọi bước vượt rào vẫn hỏi lại.

Chỉnh sửa bằng một dòng

Mở cordis.patch.yml của profile, thêm hoặc tắt một dòng plugin. Muốn thử cái gì mới thì dsh plugin --profile <tên> add <gói>.

Hỏi đáp

Thắc mắc thường gặp

Bé hỏi, người lớn trả lời.

DSH có bắt tôi dùng model DeepSeek không?
Không. Lớp dsh-llm là phần trung lập, còn adapter mới là chỗ cắm model: dsh-llm-deepseek, dsh-llm-pi-ai, và cho việc test thì có dsh-llm-mock-server cùng dsh-llm-replay (ghi lại một phiên rồi phát lại, không tốn token).
Dữ liệu của tôi đi đâu?
Ở nhà bạn. Phiên lưu thành JSONL trong $DSH_HOME, credentials để ở local, web UI chỉ nghe trên 127.0.0.1. Phần phải ra internet chỉ là lời gọi tới model — và bạn đổi route đó được.
Agent có phá máy tôi không?
Có rào: sandbox ba mức cộng luồng xin phép. Việc vượt rào sẽ hiện lời hỏi để bạn cho phép hoặc từ chối; nếu bạn tắt hỏi thì nó bị chặn luôn, chứ không tự vượt. Mức danger-full-access là lựa chọn có ý thức của bạn, không phải mặc định.
Tôi tự thêm được gì không?
Ba cách, từ nhẹ tới mạnh: (1) bật/tắt một dòng trong patch; (2) dsh plugin --profile <tên> add <gói> để cài plugin ngoài cây; (3) viết plugin Cordis động ngay trong phiên đang chạy — cả nửa Host lẫn nửa Client UI.
Dùng chung được với Claude Code / Codex không?
Được. Có dsh-hooks-claude-codedsh-hooks-codex để tái dùng hooks quen thuộc, cộng dsh-mcp-client để cắm server MCP làm nguồn công cụ.