DeepSeek Harness: Відкритий фреймворк агентів, де буквально усе — плагін
Повний стек агентів, опублікований на GitHub
13 серпня 2026 року DeepSeek випустила розробницьку прев’ю DeepSeek Harness (dsh). Репозиторій знаходиться за адресою deepseek-ai/deepseek-harness. На кінець дня там було 1,6 тис. зірок, 12 293 коммітів та 19 контриб’юторів — цифри, які показують, що це не хак для вихідних. Кодова база на 97,1% складається з TypeScript, 1,6% — CSS і 0,7% — Python. Версія пакету на момент публікації: 0.1.0-rc.5
Лендінг-сторінка розміщена на deepseek.com/harness, а документація для розробників — на deepseek-harness.github.io/deepseek-harness
Ліцензія: MIT
Головний тезис в одному реченні
З README: “Агент = Модель + Harness”
Модель — це душа. Harness дозволяє агенту розуміти своє оточення, використовувати інструменти і продовжувати працювати в реальних умовах. Позиція DeepSeek: кожна можливість — моделі, інструменти, навички, сесії, сандбокси, сховища, цикли, планування та інтерфейс — це змінюваний плагін
Це не просто слоган. Це вимушене архітектурою правило
Cordis: ядро всього
DeepSeek Harness побудований на основі Cordis, вбудованого фреймворку плагінів. Дизайн Cordis описаний у статті під назвою A Programming Paradigm for Spatiotemporal Composability
Увесь фреймворк зводиться до п’яти ідей:
- Плагін — це об’єкт, який реалізує Service. Він може бути функцією з
injectіapply(ctx), або підкласомService - Контекст — це репозиторій сервісів. Плагін заявляє стабільний ключ, такий як
ctx.tools,ctx.llmабоctx.sessions. Інші плагіни шукають сервіси за ключом, а не імпортують конкретні реалізації - Оголошуйте залежність від сервісів через
inject. Плагін, який називає потрібні сервіси, чекає, поки вони не з’являться. Без ручного керування порядком запуску - Типізовані події для комунікації. Чотири режими відправки:
emit(відправив і забув),waterfall(у стилі middleware зnext()),parallel(всі слухачі працюють одночасно) таserial(слухачі працюють по черзі з поверненням значень) - Реєстрації — це оборотні ефекти. Розділи промптів, схеми інструментів, адаптери, слухачі — усе встановлюється через
ctx.effect(), тому перезавантаження та видалення розгортають їх передбачувано
Модель waterfall Cordis — це middleware оточуючого типу. Слухач отримує (...args, next). Викличте next(), щоб передати керування наступному сервісу; поверніться без next(), щоб зупинити ланцюг. Для подій з єдиним рішенням зупинка ланцюга — це саме дизайн: слухач політики може повністю взяти рішення на себе
Усе — плагін (серйозно)
Список плагінів на deepseek.com/harness розписує всю поверхню можливостей:
- Models — бекенди LLM (DeepSeek, OpenAI, Anthropic, Bedrock, Vertex, Azure, Codex плюс будь-яка OpenAI-сумісна кінцева точка)
- Tools — те, що може викликати модель
- Skills — повторно використовувані пакети промптів та інструментів
- Sessions — керування станом розмови
- Sandboxes — місце, де виконується код (PTY bash, локальний бекенд
danger-full-access, рідний сандбокс на основі landlock) - Storage — збереження сесій
- Loops — логіка ходів агента
- Scheduling — диспетчеризація субагентів та завдань
- UI — Web інтерфейс, який за замовчуванням обслуговується на порті 3080
Розробник може вибрати, замінити або розширити будь-що з цього через конфігурацію — без змін у вихідному коді самого DeepSeek Harness. Каталог конфігурації плагінів генерується автоматично з вихідного коду (scripts/gen-config-catalog.ts) і перевіряється CI при кожному билді, тому кожне поле у блоці config: файлу cordis.yml точно відповідає оголошеному типу конфігурації плагіна
Чотири режими виконання
Документація постачається з чотирма пресетами. Кожен призначений для іншого сценарію використання
Standard Mode — Повноцінний агент для кодування: редагування файлів, оболонка, пошук файлів і вебу, навички, планування, цілі, субагенти та робочі процеси. Це стандартний досвід Web інтерфейсу
Code Mode — Все, що є в Standard, але інструменти надаються через Code Mode SDK, тому модель може об’єднувати багатокрокові операції в одну програму TypeScript. Одна згенерована моделлю програма замінює кілька раундів викликів інструментів
Minimal Mode — Два інструменти: стійка оболонка bash і str_replace_editor. Призначено для бенчмаркінгу моделей у урізаному середовищі. Ніяких навичок, планування, субагентів — чиста здатність моделі проти реальної кодової бази
Creator Mode — Створено для написання власних пресетів агентів. Включає всі можливості Standard режиму плюс інспекцію виконання, експерименти з плагінами Cordis в пам’яті та керівництво з авторства пресетів. Саме так ви створюєте п’ятий, шостий, сьомий режими
Кожен запуск простежується
Ось чому Harness виділяється на тлі більшості інструментів для агентів. Усе, що бачить модель, записується до журналу сесій лише для дописування:
- Системні промпти
- Виведення міркувань
- Виклики інструментів та їх результати
- Рішення щодо планування субагентів
- Кожна ін’єкція контексту
В інтерфейсі Web є подання Trajectory, де можна переглядати ці записи з фільтрацією за джерелом. Відновлення, розгалуження, пошук і повторне відтворення — всі чотири операції працюють з тим самим потоком подій. Без окремої бази даних трейсів, без кроку експорту. JSONL сесії є джерелом істини
Для Python SDK директорія сесій зберігає нестиснутий JSONL зі зібраними запитами моделі та викликами інструментів. Приклад у examples/jsonrpc-agent/minimal.py демонструє це повністю
Конфігурація моделей: DeepSeek + будь-що
Сторінка конфігурації моделей (Configure models) має три шари
DeepSeek Official. Відкрийте Settings → Models, вставте API ключ DeepSeek, збережіть. Ключ — тільки для запису. Після збереження інтерфейс отримує прихований дескриптор, ніколи — відкритий текст. Ключі зберігаються в \$DSH_HOME/.credentials.yaml; сторінка налаштувань зберігає лише посилання на облікові дані
Catalog providers. Натисніть “Add provider”, виберіть Anthropic або OpenAI, вставте ключ. Постачальники з рідною авторизацією (Bedrock через AWS creds + region, Vertex через ADC project, Azure через api-version, Codex через OAuth) не працюють лише з полем API ключа — кожен потребує власного шляху авторизації
Custom providers. Для корпоративного шлюзу, самохостованого сервера або будь-якого постачальника, якого немає в каталозі. Встановіть Provider ID у нижньому регістрі (постійний — запити, збережені сесії, значення за замовчуванням для моделей і посилання на облікові дані всі його використовують), базову URL, API протокол, облікові дані та хоча б одну модель
Візуальним моделям потрібен ще один крок. Оскільки кастомна кінцева точка не може оголосити підтримувані модальності, форма не може автоматично визначити підтримку зору. Ви додаєте input: [text, image] до моделі в \$DSH_HOME/settings.yaml. Якщо всі ваші кастомні моделі приймають зображення, встановіть defaultInput: [text, image] один раз на рівні постачальника, а не для кожної моделі окремо. Поле input — це твердження, а не перевірка: якщо ви заявили, що модель підтримує зір, але кінцева точка насправді ні — постачальник відхилить запит, а не Harness
Вирішення проблем прямо описано в документації:
MISSING_CREDENTIAL→ збережіть ключ постачальника через сторінку Models або експортуйте відповідну змінну оточенняUNKNOWN_MODEL→ виберіть сконфігуровану модель або додайте відсутню модель до кастомного постачальника- “Get available models повертає 401” → перевірте ключ. Виявлення моделей викликає OpenAI-сумісну кінцеву точку
GET /models. Якщо ваш сервіс не відкриває її, введіть моделі вручну - “Зображення відхилено перед відправкою” → модель не оголосила модальність
image. Додайтеinput: [text, image] - “Постачальник відхиляє запит із зображенням” → модель заявила здатність до зору, якої насправді немає в кінцевій точці. Видаліть
imageзі списку і розпочні нову сесію (старе зображення залишається в журналі сесій і продовжить повторювати той самий запит)
Початок роботи: три шляхи
Шлях 1: npx @deepseek-ai/dsh web
Встановіть Node.js, запустіть одну команду. Web інтерфейс запуститься на http://127.0.0.1:3080. І все. Без клонування, без збірки, без pnpm
npx @deepseek-ai/dsh webДалі: Settings → Models → вставте API ключ DeepSeek. Виберіть робочий простір (директорія, з якої був викликаний dsh, підходить). Почніть сесію:
Підсумуйте цей репозиторій і визначте його основні пакети
Агент читає та редагує файли робочого простору, запускає команди, делегує роботу і підтримує план. Будь-яка операція, яка потребує підтвердження відповідно до активної політики дозволів, показує діалог у Web інтерфейсі перед виконанням
Шлях 2: Клонування та збірка з вихідного коду
git clone https://github.com/deepseek-ai/deepseek-harness.gitcd deepseek-harnesspnpm installpnpm run buildpnpm dsh webШлях 3: Python SDK
Вимоги: Python 3.10+, Linux x64 / Linux arm64 / macOS 14+ на arm64, сумісна з DeepSeek кінцева точка
git clone https://github.com/deepseek-ai/deepseek-harness.gitcd deepseek-harnesspython -m venv .venv. .venv/bin/activatepython -m pip install deepseek-harness-sdkВстановіть облікові дані:
export DEEPSEEK_API_KEY=sk-your-key-here# Optional:# export DSH_MODEL=deepseek-v4-flash# export DSH_SYSTEM_PROMPT='You are a helpful software engineer assistant.'Запустіть завдання проти ізольованого робочого простору:
python examples/jsonrpc-agent/minimal.py \ --workspace /absolute/path/to/workspace \ --session-root /absolute/path/to/sessions \ --session-id example-001 \ "Перевірте репозиторій і виправте падаючі тести."Для власного коду точкою входу SDK є DeepSeekHarness як менеджер контексту:
from pathlib import Pathfrom 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( "Перевірте репозиторій і виправте падаючі тести.", session_id="example-001", ) print(result.final_response)DeepSeekHarness ліниво запускає включений виконуваний модуль і повторно використовує його, поки блок with не завершиться. Використовуйте той самий ID сесії, щоб зберегти процес Bash (робочу директорію, змінні оточення, функції оболонки). Використовуйте новий ID сесії для незалежного завдання
Мінімальна композиція jsonrpc-agent навмисно рідка: тільки стійка bash і str_replace_editor як інструменти, з якими працює модель. Таймаут Bash — 300 секунд. Обмеження виведення редактора — 16 000 символів. Компакція контексту відключена. Файлова система використовує простий локальний бекенд — шляхи редактора можуть звертатися до всього, що бачить виконуваний процес. Документація прямо попереджає: “Запускайте це тільки в одноразовому checkout або контейнері.” Стійкий PTY-бекенд також вимагає POSIX-основу терміналу — підтримки Windows для цієї композиції немає
Напишіть свій перший плагін
Посібник: Ваш перший плагін. Плагін — це модуль TypeScript, який експортує функцію apply:
import type { Context } from '@deepseek-ai/cordis'
export const name = 'hello-plugin'
export function apply(ctx: Context) { console.log('[hello-plugin] plugin loaded!')}Зареєструйте його в патчі cordis.yml:
- insert: - id: hello name: '/absolute/path/to/deepseek-harness/scratch-plugin/src/my-plugin.ts'Завантажте з оверлеєм:
pnpm dsh web --patch ./scratch-plugin/cordis.ymlАвтоматичне очищення — це основна фішка. Усе, що зареєстровано через ctx — слухачі подій, інструменти, таймери — очищається при вивантаженні плагіна. Без ручного removeListener або clearInterval. Для явного очищення (мережні з’єднання) поверніть диспозер з ctx.effect()
Залежності оголошуються за допомогою inject:
export const name = 'my-tool-plugin'export const inject = ['tools']
export function apply(ctx: Context) { // ctx.tools is ready here}Cordis чекає на кожен потрібний сервіс перед тим, як завантажити плагін
Існують три форми плагінів: функція (вище), об’єкт з apply і клас, що розширює Service. Використовуйте класову форму, коли сам плагін надає сервіс для інших плагінів
Напишіть свій перший інструмент
Посібник: Створіть інструмент. Використовуйте defineTool з @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 виводить і перевіряє args з parameters. execute повертає канонічне значення, оголошене output.schema. output.render перетворює це канонічне значення на контент, з яким працює модель. Після перезапуску з патчем запитайте у Web інтерфейсі: “Використай інструмент greet, щоб вітати Аду”. Модель викличе greet і отримає Hello, Ada!
Наступні кроки з посібника — це конфігурація плагінів, довідник з авторства інструментів (вкладені схеми, канонічні значення, фонова робота, хуки політики, Code Mode, картки UI) та шуарування можливостей (розбиття пакетів Service Definition → Service Provider → Consumer)
Режими входу CLI
Команда @deepseek-ai/dsh — це лончер продукту. Чотири точки входу:
| Команда | Призначення |
|---|---|
dsh --profile <name> |
Завантажити іменований профіль з \$DSH_HOME/profiles/<name> |
dsh --profile headless "job" |
Запустити одну нову збережену сесію, вивести кінцеву відповідь, завершити роботу |
dsh web |
Псевдонім --profile web |
dsh plugin --profile <name> <pnpm args> |
Керувати плагінами профілю, пересилаючи аргументи до pnpm |
Директорія виклику — це корінь робочого простору за замовчуванням. Профілі web та headless автоматично ініціалізуються з поставлених шаблонів при першому використанні. Будь-який інший профіль потрібно створити через dsh plugin
Прапори лончера йдуть першими. Перший токен, який лончер не розпізнає, стає аргументами програми. Приклад: dsh --profile web --port 8080 передає --port 8080 веб-програмі, а не лончеру
Директорія профілю містить package.json (залежності плагінів поза деревом, плюс маніфест профілю dsh.profile із впорядкованим списком bundles) та cordis.patch.yml (власний шар патчів користувача). Порядок композиції над порожнім коренем такий: патч кожного бандла в порядку dsh.profile.bundles → cordis.patch.yml профілю → \$DSH_HOME/cordis.patch.yml на рівні домашньої директорії → оверлеї --patch. Використовуйте --dump-default-config та --dump-config, щоб перевірити складене дерево без його завантаження
Спільнотні плагіни та екосистема
Позначте свій репозиторій плагіна тегом dsh-plugin на GitHub, щоб його можна було знайти. Офіційний сайт прямо посилається на цю сторінку з темою. Також існує спільнота Discord DeepSeek Harness для обговорень
Проект використовує GitHub Discussions для зворотного зв’язку та звітів про помилки. Документація посилається на CONTRIBUTING.md для робочого процесу розробки, architecture.md для системного дизайну та AGENTS.md для конвенцій кодування, специфічних для агентів
Розробницька прев’ю — так, це буде ламатися
README пише це ВЕЛИКИМИ ЛІТЕРАМИ: “БУДУТЬ ЗМІНИ, ЩО РУЙНУЮТЬ СУМІСНІСТЬ.”
Основні плагіни та API ще розвиваються. Лендінг-сторінка говорить це прямо: “DeepSeek Harness залишається в розробницькій прев’ю і все ще тестується розробниками, які створюють харнеси для агентів”
Якщо ви будуєте поверх нього, зафіксуйте хеш комміта, тримайте свої плагіни тонкими щодо каталогу конфігурації і будьте готові перетестувати на кожному rc-бапсі. Автоматичне очищення плагінів та ін’єкція залежностей роблять перетестування менш болючим, ніж у монолітних фреймворків, але “розробницька прев’ю” означає рівно те, що сказано
Що робить це іншим
Більшість сучасних фреймворків агентів починаються з циклу ходів і додають розширюваність як додаток. Harness робить навпаки: розширюваність є фреймворком, а цикл ходів — просто ще одним плагіном. Спостережуваний результат — три речі, які зазвичай не можна отримати в одному пакеті:
- Замінюйте будь-що без форку. Не подобається вбудована система інструментів? Замініть її. Потрібен інший шар маршрутизації LLM? Змініть постачальника. Усе розв’язується через ключі сервісів Cordis
- Простежуваність за замовчуванням. Журнал лише для дописування — це не додаток для спостереження. Це і є принцип роботи сесій. Відновлення, розгалуження, пошук і повторне відтворення використовують той самий потік
- Компонувані пресети, а не флаг-фічі. Чотири режими (Standard / Code / Minimal / Creator) — це просто впорядковані шари патчів пакетів плагінів. Ви можете накласти свої пресети зверху за допомогою YAML замість коду
Чи переможе цей підхід над монолітними SDK — залежить від того, чи створить екосистема плагінів достатньо сторонніх інструментів і постачальників, щоб історія заміни/перекомбінації стала реальною. При 1,6 тис. зірок і 12 тис. коммітів у перший день, імпульс явно є
Посилання
- Лендінг-сторінка DeepSeek Harness
- deepseek-ai/deepseek-harness на GitHub
- Швидкий старт документації для розробників
- Посібник з конфігурації моделей
- Посібник з Python SDK
- Посібник: Ваш перший плагін
- Посібник: Створіть інструмент
- Cordis Primer
- Каталог конфігурації плагінів
- CLI README
- Cordis на GitHub
- Стаття Cordis: A Programming Paradigm for Spatiotemporal Composability
- Тема спільноти dsh-plugin на GitHub
- Discord DeepSeek Harness