needhelp
← Back to blog

DeepSeek Harness: Framework Agentowy Open Source, Gdzie Dosłownie Wszystko Jest Pluginem

by needhelp
DeepSeek
AI Agents
Open Source
Cordis
Plugin Architecture

Pełny Stos Agentowy, Wrzucony na GitHub

DeepSeek opublikowało podgląd developerski DeepSeek Harness (dsh) 13 sierpnia 2026 roku. Repozytorium znajduje się pod adresem deepseek-ai/deepseek-harness. Do końca dnia miało 1.6k gwiazdek, 12.293 commity i 19 współautorów — liczby te mówią, że nie jest to projekt weekendowy. Baza kodu to w 97.1% TypeScript, 1.6% CSS i 0.7% Python. Wersja pakietu w momencie publikacji: 0.1.0-rc.5.

Strona docelowa znajduje się pod adresem deepseek.com/harness, a dokumentacja dla developerów pod adresem deepseek-harness.github.io/deepseek-harness.

Licencjonowane na warunkach MIT.

Hasło w Jednym Wierszu

Z README: “Agent = Model + Harness.”

Model to dusza. Harness pozwala agentowi zrozumieć swoje środowisko, używać narzędzi i kontynuować pracę w rzeczywistych ustawieniach. Podejście DeepSeek: każda możliwość — modele, narzędzia, umiejętności, sesje, piaskownice, magazynowanie, pętle, harmonogramowanie i UI — jest wymienialnym pluginem.

To nie slogan. To wymuszane przez architekturę.

Cordis: Jądro Pod Wszystkim

DeepSeek Harness jest zbudowane na bazie Cordis, vendored frameworku pluginów. Projekt Cordis jest opisany w artykule o nazwie A Programming Paradigm for Spatiotemporal Composability.

Cały framework sprowadza się do pięciu idei:

  1. Plugin to obiekt implementujący Service. Może to być funkcja z inject i apply(ctx), lub podklasa Service.
  2. Kontekst to repozytorium usług. Plugin zajmuje stabilny klucz, taki jak ctx.tools, ctx.llm lub ctx.sessions. Inne pluginy znajdują usługi po kluczu zamiast importować konkretne implementacje.
  3. Zadeklaruj zależność usługi poprzez inject. Plugin, który wymienia wymagane usługi, czeka, aż te usługi zaistnieją. Brak ręcznego sekwencjonowania uruchamiania.
  4. Typowane Zdarzenia do komunikacji. Cztery tryby wysyłania: emit (wyślij i zapomnij), waterfall (w stylu middleware z next()), parallel (wszyscy słuchacze działają równocześnie) i serial (słuchacze działają po kolei z wartościami zwracanymi).
  5. Rejestracje to odwracalne efekty. Sekcje promptów, schematy narzędzi, adaptery, słuchacze — wszystko instaluje się przez ctx.effect(), więc przeładowanie i wyłączenie odwracają je w przewidywalny sposób.

Model waterfall Cordis to around middleware. Słuchacz otrzymuje (...args, next). Wywołaj next(), aby przekazać do następnej usługi; zwróć bez next(), aby spowodować zwarcie. Dla zdarzeń pojedynczej decyzji zwarcie jest częścią projektu — słuchacz polityki może całkowicie przejąć decyzję.

Wszystko Jest Pluginem (Poważnie)

Lista pluginów na deepseek.com/harness precyzyjnie opisuje pełną powierzchnię możliwości:

  • Models — backendy LLM (DeepSeek, OpenAI, Anthropic, Bedrock, Vertex, Azure, Codex, plus dowolny endpoint zgodny z OpenAI)
  • Tools — to, co model może wywołać
  • Skills — wielokrotnego użytku pakiety promptów i narzędzi
  • Sessions — zarządzanie stanem rozmowy
  • Sandboxes — miejsce, gdzie działa kod (PTY bash, lokalny backend danger-full-access, natywna piaskownica oparta na landlock)
  • Storage — trwałość sesji
  • Loops — logika tury agenta
  • Scheduling — podagent i przydział zadań
  • UI — interfejs webowy domyślnie serwowany na porcie 3080

Developer może wybrać, wymienić lub rozszerzyć dowolną z tych rzeczy poprzez konfigurację — bez zmian w źródle samego DeepSeek Harness. Katalog Konfiguracji Pluginów jest automatycznie generowany ze źródła (scripts/gen-config-catalog.ts) i weryfikowany na świeżo przez CI, więc każde pole w bloku config: pliku cordis.yml dokładnie odpowiada zadeklarowanemu typowi konfiguracji pluginu.

Cztery Tryby Środowiska Uruchomieniowego

Dokumentacja zawiera cztery preset. Każdy jest skierowany do innego przypadku użycia.

Standard Mode — Pełny agent kodujący: edycja plików, shell, wyszukiwanie plików i sieci, umiejętności, planowanie, cele, podagenty i przepływy pracy. To domyślne doświadczenie Web UI.

Code Mode — Wszystko co w Standardzie, ale narzędzia są eksponowane przez Code Mode SDK, dzięki czemu model może łączyć wielokrokowe operacje w jednym programie TypeScript. Jeden program wygenerowany przez model zastępuje kilka rund wywołań narzędzi.

Minimal Mode — Tylko dwa narzędzia: trwały shell bash i str_replace_editor. Służy do benchmarkowania modeli w uproszczonym środowisku. Brak umiejętności, planowania, podagentów — czysta zdolność modelu przeciw prawdziwej bazie kodu.

Creator Mode — Zbudowane do pisania niestandardowych presetów agenta. Zawiera wszystkie możliwości trybu Standard plus inspekcję w czasie działania, eksperymenty z pluginem Cordis w pamięci i wskazówki dotyczące tworzenia presetów. W ten sposób budujesz piąty, szósty, siódmy tryb.

Każde Uruchomienie Jest Możliwe Do Śledzenia

Tutaj Harness wyróżnia się na tle większości narzędzi agentowych. Wszystko, co widzi model, jest rejestrowane w dzienniku sesji typu append-only:

  • Prompty systemowe
  • Wynik wnioskowania
  • Wywołania narzędzi i ich wyniki
  • Decyzje harmonogramowania podagentów
  • Każda iniekcja kontekstu

Web UI ma widok Trajectory, gdzie można sprawdzić te rekordy przefiltrowane według źródła. Wznawianie, rozgałęzianie, wyszukiwanie i odtwarzanie — wszystkie cztery operacje działają na tym samym strumieniu zdarzeń. Brak oddzielnej bazy danych śledzenia, brak kroku eksportu. JSONL sesji jest źródłem prawdy.

Dla Python SDK katalog sesji przechowuje nieskompresowany JSONL zawierający złożone żądania modelu i wywołania narzędzi. Przykład w examples/jsonrpc-agent/minimal.py pokazuje to od początku do końca.

Konfiguracja Modelu: DeepSeek + Wszystko

Strona konfiguracji modelu (Konfiguruj modele) ma trzy warstwy.

DeepSeek Oficjalny. Otwórz Ustawienia → Modele, wklej klucz API DeepSeek, zapisz. Klucz jest tylko do zapisu. Po zapisaniu UI otrzymuje zredagowany deskryptor, nigdy nie czysty tekst. Klucze znajdują się w \$DSH_HOME/.credentials.yaml; strona ustawień przechowuje tylko odwołanie do poświadczeń.

Dostawcy z katalogu. Kliknij “Dodaj dostawcę”, wybierz Anthropic lub OpenAI, wklej klucz. Dostawcy używający natywnej autoryzacji (Bedrock przez creds AWS + region, Vertex przez projekt ADC, Azure przez api-version, Codex przez OAuth) nie działają z samym polem klucza API — każdy potrzebuje własnej ścieżki autoryzacji.

Dostawcy niestandardowi. Dla bramki firmowej, serwera hostowanego we własnym zakresie lub dowolnego dostawcy spoza katalogu. Ustaw małe litery ID Dostawcy (trwałe — żądania, zapisane sesje, domyślne modele i odwołania do poświadczeń go wszystkie używają), podstawowy URL, protokół API, poświadczenia i co najmniej jeden model.

Modele wizualne wymagają dodatkowego kroku. Ponieważ niestandardowy endpoint nie ma sposobu, aby ogłosić obsługiwane modalności, formularz nie może automatycznie wykryć obsługi widzenia. Dodaj input: [text, image] do modelu w \$DSH_HOME/settings.yaml. Jeśli wszystkie Twoje niestandardowe modele akceptują obrazy, ustaw defaultInput: [text, image] raz na poziomie dostawcy zamiast na model. Pole input to twierdzenie, a nie sprawdzenie — jeśli twierdzisz, że model robi widzenie, ale endpoint w rzeczywistości nie robi, dostawca odrzuca żądanie zamiast Harness.

Rozwiązywanie problemów jest opisane bezpośrednio w dokumentacji:

  • MISSING_CREDENTIAL → przechowaj klucz dostawcy przez stronę Modele lub wyeksportuj wspomnianą zmienną środowiskową
  • UNKNOWN_MODEL → wybierz skonfigurowany model, lub dodaj brakujący model do dostawcy niestandardowego
  • “Pobierz dostępne modele zwraca 401” → sprawdź klucz. Odkrywanie modeli wywołuje zgodny z OpenAI endpoint GET /models. Jeśli Twoja usługa tego nie eksponuje, wprowadź modele ręcznie.
  • “Obraz odrzucony przed wysłaniem” → model nie zadeklarował modalności image. Dodaj input: [text, image].
  • “Dostawca odrzuca żądanie z obrazem” → model zadeklarował zdolność widzenia, której jego endpoint w rzeczywistości nie ma. Usuń image z listy i rozpocznij nową sesję (stary obraz pozostaje w dzienniku sesji i ciągle powtarza to samo żądanie).

Pierwsze Kroki: Trzy Ścieżki

Ścieżka 1: npx @deepseek-ai/dsh web

Zainstaluj Node.js, uruchom jedno polecenie. Web UI uruchamia się pod adresem http://127.0.0.1:3080. Koniec. Brak klonowania, brak budowania, brak pnpm.

Terminal window
npx @deepseek-ai/dsh web

Następnie: Ustawienia → Modele → wklej klucz API DeepSeek. Wybierz obszar roboczy (katalog, w którym wywołano dsh, działa). Rozpocznij sesję:

Podsumuj to repozytorium i zidentyfikuj jego główne pakiety.

Agent czyta i edytuje pliki obszaru roboczego, uruchamia polecenia, deleguje pracę i utrzymuje plan. Każda operacja, która wymaga zatwierdzenia w ramach aktywnej polityki uprawnień, wyświetla okno dialogowe w Web UI przed wykonaniem.

Ścieżka 2: Sklonuj i Zbuduj ze Źródła

Terminal window
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build
pnpm dsh web

Ścieżka 3: Python SDK

Wymagania: Python 3.10+, Linux x64 / Linux arm64 / macOS 14+ na arm64, endpoint zgodny z DeepSeek.

Terminal window
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
python -m venv .venv
. .venv/bin/activate
python -m pip install deepseek-harness-sdk

Ustaw poświadczenia:

8000/v1
export DEEPSEEK_API_KEY=sk-your-key-here
# Opcjonalnie:
# export DSH_MODEL=deepseek-v4-flash
# export DSH_SYSTEM_PROMPT='You are a helpful software engineer assistant.'

Uruchom zadanie przeciw izolowanemu obszarowi roboczemu:

Terminal window
python examples/jsonrpc-agent/minimal.py \
--workspace /absolute/path/to/workspace \
--session-root /absolute/path/to/sessions \
--session-id example-001 \
"Inspect the repository and fix the failing tests."

Dla własnego kodu punktem wejścia SDK jest DeepSeekHarness jako menedżer kontekstu:

from pathlib import Path
from deepseek_harness import DeepSeekHarness
config = Path("examples/jsonrpc-agent/minimal.cordis.yml").resolve()
workspace = Path("/absolute/path/to/workspace").resolve()
sessions = Path("/absolute/path/to/sessions").resolve()
with DeepSeekHarness(
provider="deepseek-official",
model="deepseek-v4-flash",
max_tokens=49_152,
cwd=str(workspace),
session_root=str(sessions),
cordis=str(config),
) as harness:
result = harness.run(
"Inspect the repository and fix the failing tests.",
session_id="example-001",
)
print(result.final_response)

DeepSeekHarness leniwie uruchamia dołączone środowisko uruchomieniowe i używa go ponownie, aż blok with wyjdzie. Użyj ponownie tego samego ID sesji, aby zachować proces Bash (katalog roboczy, zmienne env, funkcje powłoki). Użyj świeżego ID sesji dla niezależnego zadania.

Minimalna kompozycja jsonrpc-agent jest celowo skromna: tylko trwały bash i str_replace_editor jako narzędzia skierowane do modelu. Limit czasu Bash 300 sekund. Limit wyjścia edytora 16.000 znaków. Kompresja kontekstu wyłączona. System plików używa gołego lokalnego backendu — ścieżki edytora mogą odnosić się do wszystkiego, co proces runtime widzi. Dokumentacja jawnie ostrzega: “Uruchamiaj tylko w ramach jednorazowego checkoutu lub kontenera.” Trwały backend PTY wymaga również podłoża terminala POSIX — brak obsługi Windows dla tej kompozycji.

Napisz Swój Pierwszy Plugin

Poradnik: Twój pierwszy plugin. Plugin to moduł TypeScript eksportujący funkcję apply:

import type { Context } from '@deepseek-ai/cordis'
export const name = 'hello-plugin'
export function apply(ctx: Context) {
console.log('[hello-plugin] plugin loaded!')
}

Zarejestruj go w patche cordis.yml:

- insert:
- id: hello
name: '/absolute/path/to/deepseek-harness/scratch-plugin/src/my-plugin.ts'

Uruchom z nakładką:

Terminal window
pnpm dsh web --patch ./scratch-plugin/cordis.yml

Automatyczne czyszczenie to zabójcza funkcja. Wszystko zarejestrowane przez ctx — słuchacze zdarzeń, narzędzia, timery — jest czyszczone, gdy plugin jest wyładowywany. Brak ręcznego removeListener lub clearInterval. Dla jawnego czyszczenia (połączenia sieciowe) zwróć disposer z ctx.effect().

Zależności są deklarowane za pomocą inject:

export const name = 'my-tool-plugin'
export const inject = ['tools']
export function apply(ctx: Context) {
// ctx.tools is ready here
}

Cordis czeka na każdą wymaganą usługę przed załadowaniem pluginu.

Istnieją trzy formy pluginu: funkcja (powyżej), obiekt z apply i klasa rozszerzająca Service. Użyj formy klasowej, gdy sam plugin dostarcza usługę, którą mogą zużyć inne pluginy.

Napisz Swoje Pierwsze Narzędzie

Poradnik: Zbuduj narzędzie. Użyj defineTool z @deepseek-ai/dsh-tools:

import type { Context } from '@deepseek-ai/cordis'
import { defineTool } from '@deepseek-ai/dsh-tools'
export const name = 'greet-tool'
export const inject = ['tools']
export function apply(ctx: Context) {
ctx.tools.register(defineTool({
name: 'greet',
description: 'Greet someone by name.',
parameters: {
name: {
type: 'string',
required: true,
description: 'The name to greet',
},
},
output: {
schema: { type: 'string' },
render: (_args, value) => [{ type: 'text', text: value }],
},
async execute(args) {
return `Hello, ${args.name}!`
},
}))
}

defineTool wnioskuje i weryfikuje args z parameters. execute zwraca kanoniczną wartość zadeklarowaną przez output.schema. output.render przekształca tę kanoniczną wartość na treść skierowaną do modelu. Po ponownym uruchomieniu z patchem zapytaj Web UI: “Użyj narzędzia greet, aby powitać Adę.” Model wywołuje greet i otrzymuje Hello, Ada!.

Kolejne kroki z poradnika to konfiguracja pluginu, odniesienie do tworzenia narzędzi (zagnieżdżone schematy, kanoniczne wartości, praca w tle, hooki polityki, Code Mode, karty UI) i warstwowanie możliwości (Definicja Usługi → Dostawca Usługi → podział pakietu konsumenta).

Tryby Wejścia CLI

Polecenie @deepseek-ai/dsh to launcher produktu. Cztery punkty wejścia:

Polecenie Cel
dsh --profile <name> Uruchom nazwany profil w \$DSH_HOME/profiles/<name>
dsh --profile headless "job" Uruchom jedną nową trwałą sesję, wydrukuj ostateczną odpowiedź, wyjdź
dsh web Alias --profile web
dsh plugin --profile <name> <pnpm args> Zarządzaj pluginami profilu przekazując do pnpm

Katalog wywołania to domyślny korzeń obszaru roboczego. Profile web i headless są automatycznie inicjowane z dostarczonych szablonów przy pierwszym użyciu. Każdy inny profil musi zostać utworzony przez dsh plugin.

Flagi launchera są pierwsze. Pierwszy token, którego launcher nie rozpoznaje, staje się argumentem aplikacji. Przykład: dsh --profile web --port 8080 przekazuje --port 8080 do aplikacji webowej, a nie do launchera.

Katalog profilu zawiera package.json (zależności pluginów poza drzewem, plus manifest profilu dsh.profile z jego uporządkowaną listą bundles) i cordis.patch.yml (własna warstwa patcha użytkownika). Kolejność kompozycji na pustym korzeniu to: patch każdego bundle w kolejności dsh.profile.bundlescordis.patch.yml profilu → \$DSH_HOME/cordis.patch.yml na poziomie domu → nakładki --patch. Użyj --dump-default-config i --dump-config, aby sprawdzić złożone drzewo bez uruchamiania go.

Pluginy Społecznościowe i Ekosystem

Otaguj swoje repozytorium pluginu tagiem dsh-plugin na GitHubie, aby było łatwiejsze do znalezienia. Oficjalna strona bezpośrednio linkuje do tej strony tematycznej. Istnieje również społeczność Discord DeepSeek Harness do dyskusji.

Projekt używa GitHub Discussions do informacji zwrotnych i zgłoszeń błędów. Dokumentacja linkuje do CONTRIBUTING.md dla przepływu pracy rozwoju, architecture.md dla projektu systemu i AGENTS.md dla specyficznych dla agenta konwencji kodowania.

Podgląd Developerski — Tak, To Się Zepsuje

README umieszcza to w WIELKICH LITERACH: “BĘDĄ ZMIANY ŁAMIĄCE KOMPATYBILNOŚĆ.”

Podstawowe pluginy i API wciąż ewoluują. Strona docelowa mówi to bezpośrednio: “DeepSeek Harness pozostaje w wersji podglądu developerskiego i jest wciąż testowany przez developerów tworzących harnessy agentowe.”

Jeśli budujesz na jego podstawie, przypnij hash commitu, utrzymuj swoje pluginy cienkie względem katalogu konfiguracji i spodziewaj się ponownego testowania przy każdym podbiciu rc. Automatyczne czyszczenie pluginów i wstrzykiwanie zależności sprawiają, że ponowne testowanie jest mniej bolesne niż w frameworkach monolitycznych, ale “podgląd developerski” oznacza dokładnie to, co mówi.

Co Czyni To Innym

Większość dzisiejszych frameworków agentowych zaczyna od pętli tury i dołącza rozszerzalność jako dodatek na później. Harness odwraca to: rozszerzalność jest frameworkiem, a pętla tury to po prostu kolejny plugin. Widocznym rezultatem są trzy rzeczy, których zwykle nie dostajesz w jednym pakiecie:

  • Wymień wszystko bez forka. Nie podoba Ci się wbudowany system narzędzi? Zastąp go. Chcesz innej warstwy routingu LLM? Wymień dostawcę. Wszystko rozwiązuje się przez klucze usług Cordis.
  • Śledzalność domyślnie. Dziennik append-only nie jest dodatkiem do obserwowalności. To sposób, w jaki działają sesje. Wznawianie, rozgałęzianie, wyszukiwanie i odtwarzanie wszystkie używają tego samego strumienia.
  • Komponowalne presety, a nie flagi funkcji. Cztery tryby (Standard / Code / Minimal / Creator) to po prostu uporządkowane warstwy patchy pakietów pluginów. Możesz nakładać własne presety za pomocą YAML zamiast kodu.

To, czy to podejście zwycięży z monolitycznymi SDK, zależy od tego, czy ekosystem pluginów wyprodukuje wystarczająco dużo narzędzi i dostawców stron trzecich, aby historia wymiany/rekompozycji stała się rzeczywistością. Przy 1.6k gwiazdek i 12k commitach pierwszego dnia, wyraźnie jest w tym rozpędu.

Bibliografia

Share this page