DeepSeek Harness: Всё как Плагин — Архитектура и Практика
Разбираем DeepSeek Harness: как всё в системе становится плагином, примеры, архитектура и практические рекомендации для разработчиков.
Что такое DeepSeek Harness и его концепция
DeepSeek Harness — это фреймворк, позволяющий рассматривать любые компоненты системы как плагины. Он не навязывает жёсткую структуру, а задаёт contract‑based подход: каждый плагин объявляет свои возможности, а остальные части работают с ними через единый интерфейс. Такой подход упрощает расширение, тестирование и масштабирование как в небольших проектах, так и в крупных распределённых системах.
Во-первых, DeepSeek Harness делает акцент на изоляции: плагины запускаются в отдельном процессе или контейнере, что гарантирует предсказуемость и упрощает отладку. Во‑вторых, конфигурация декларативна — описывается в YAML‑файле, где указываются зависимости, точки входа и параметры. Это позволяет управлять жизненным циклом плагина без изменения кода.
Плагин как фундаментальный элемент
В DeepSeek Harness любой «модуль» — это плагин. Это могут быть AI‑агенты, сервисы ввода‑вывода, адаптеры к базе данных или даже простые скрипты‑обёртки. Плагин обязан предоставить метаданные (name, version, entrypoint) и реализовать интерфейс, объявленный в ядре фреймворка.
Пример регистрации плагина в манифесте plugin.yaml:
yamlname: deepseek-llm
version: "1.2.0"
entrypoint: "bin/llm-server"
dependencies:
- rust-runtime >=1.70
- tokio >=1.30
Команда для установки и активации плагина выглядит так:
bashdeepseek plugin install ./plugins/deepseek-llm
deepseek plugin enable deepseek-llm
После включения плагин автоматически регистрирует свою точку входа в общую сеть сервисов, что видно в логах:
[2025-09-26 10:15:42] INFO Plugin 'deepseek-llm' loaded (version 1.2.0)
[2025-09-26 10:15:42] INFO Registering endpoint /v1/generate
Ссылка на практику использования подобных подходов в реальных проектах: Набор навыков для работы с AI-агентами.
Архитектурные принципы
DeepSeek Harness опирается на несколько ключевых принципов, которые делают его привлекательным для инженеров, ценящих предсказуемость и поддерживаемость.
- Модульность — вся система собирается из независимых плагинов. Каждый из них отвечает только за свою задачу, что упрощает тестирование и замену.
- Декларативность — всё, что влияет на поведение системы, описывается в конфигурационных файлах, а не в коде. Это позволяет менять параметры без перекомпиляции.
- Изоляция процессов — каждый плагин работает в отдельном контейнере или подпроцессе, что защищает основной сервис от падений отдельных компонентов.
- Hot‑reload — изменения в конфигурации или в коде плагина могут быть применены без перезапуска всего приложения, что ускоряет итеративную разработку.
Пример типичной конфигурации harness.yaml, где перечислены плагины и их параметры:
yamlservices:
- name: llm-inference
plugin: deepseek-llm
resources:
cpu: 2
memory: 4G
env:
MODEL_PATH: /models/llm.bin
LOG_LEVEL: info
- name: data-ingest
plugin: file-ingest
schedule: "*/5 * * * *"
inputs:
- type: s3
bucket: my-data-bucket
prefix: raw/
Эти правила позволяют построить гибкую архитектуру, где каждый элемент можно масштабировать отдельно, а при необходимости добавить новый плагин, достаточно лишь разместить его в репозитории и указать в конфиге. Такой подход согласуется с рекомендациями из статьи Навыки реальных инженеров: практические практики из .agents о важности чёткой границы ответственности за отдельные части системы.
Как реализовать плагин в DeepSeek Harness
### Создание базового плагина
Во-первых, структура плагина проста: каталог с манифестом и исполняемым файлом‑handler. Манифест описывает метаданные — название, версию, список зависимостей. Далее создаём простой обработчик, который будет получать запрос от Harness и возвращать результат.
yaml# dsh-plugin.yaml
name: "example-hello"
version: "1.0.0"
description: "Простой плагин, возвращающий статический ответ"
author: "Alexey Kuznetsov"
dependencies:
- "github.com/deepseek/harness-sdk@v1"
go// main.go
package main
import (
"encoding/json"
"github.com/deepseek/harness-sdk/pkg/logger"
)
type Response struct {
Message string `json:"message"`
}
func handler(ctx logger.Context) (any, error) {
resp := Response{Message: "Привет, мир!"}
return resp, nil
}
func main() {
// Инициализация контекста и регистрация обработчика
_ = logger.New()
_ = logger.RegisterHandler("example-hello", handler)
// Дальнейшая логика запуска сервера – в рамках Harness
}
bash# Структура проекта
mkdir -p example-hello/{cmd,internal}
cp dsh-plugin.yaml example-hello/
go mod init example-hello
go get github.com/deepseek/harness-sdk@v1
go build -o bin/example-hello internal/main.go
Сборка и запуск выполняются в контейнере, который Harness поднимает автоматически. Важно, чтобы бинарник был упакован в образ с тем же именем, что указано в манифесте (example-hello).
Если нужно протестировать локально, удобно использовать утилиту dsh-cli:
bashdsh-cli run --plugin example-hello --input '{}'
Набор навыков для работы с AI-агентами описывает подходы к тестированию подобных плагинов в изоляции.
### Интеграция с существующими сервисами
Справедливой интеграции достигается через объявление плагина в конфигурации Harness и привязку его к нужному пайплайну. Пример конфигурации для подключения к существующему API‑сервису выглядит так:
yaml# harness-config.yaml
plugins:
- name: "example-hello"
version: "1.0.0"
endpoint: "https://my-service.example.com/api"
credentials:
type: "api_key"
key: "sk_1234567890abcdef"
bash# Регистрация плагина через CLI
dsh plugin register --file harness-config.yaml
С практической точки зрения, после регистрации плагин становится доступен в любом этапе пайплайна через шаг Run Plugin. Пример шага в YAML‑манифесте:
yamlsteps:
- name: "Execute hello plugin"
plugin: "example-hello"
args:
- "--mode=test"
timeout: "2m"
Если сервис уже развернут в Kubernetes, удобно использовать kubectl внутри плагина:
yaml# Пример кода внутри handler'а
import "k8s.io/client-go/kubernetes"
import "k8s.io/client-go/tools/clientcmd"
func getK8sClient() (kubernetes.Interface, error) {
kubeconfig, err := kubernetes.InClusterConfig()
if err != nil {
return nil, err
}
return kubernetes.NewForConfig(kubeconfig)
}
Такой подход позволяет переиспользовать уже существующие сервисы без изменения их кода.
Для более сложных сценариев, когда требуется взаимодействие с несколькими сервисами, удобно собрать конфигурацию в один YAML‑файл и передать его в плагин через переменные окружения:
yaml# env.yaml
HARNESS_API_URL: "https://harness.example.com/api"
HARNESS_API_KEY: "sk_harness_key"
bashexport $(cat env.yaml | xargs)
dsh plugin run --config env.yaml --input '{"action":"sync"}'
Simantic: симуляция прошивок для AI-агентов показывает, как можно использовать аналогичные подходы для моделирования работы плагинов в изолированных средах.
Автономная разработка на Rust с помощью Claw-Code — пример, как писать собственные обработчики на Rust, если требуется высокая производительность.
Во-первых, базовый плагин — это минимальный, проверяемый набор кода, который уже проходит тесты в CI. Во-вторых, интеграция с существующими сервисами требует корректного описания endpoint‑ов, аутентификации и параметров запуска. При соблюдении этих правил плагин будет работать предсказуемо, а инфраструктура останется стабильной годами.
Практические примеры использования
Автоматизация задач через плагины
Во-первых, DeepSeek Harness позволяет превратить любую обычную утилиту в плагин, который вызывается из скриптов или CI‑pipeline.
Пример — плагин, который создаёт резервную копию базы PostgreSQL на TrueNAS 48 ТБ хранилище.
bash# main.tf — описание плагина
terraform {
required_providers {
deepseek = {
source = "deepseek/dsh-plugin"
version = "~> 1.2"
}
}
}
provider "deepseek" {
# токен доступа к Harness
api_token = var.harness_token
}
resource "deepseek_plugin" "pg_backup" {
name = "pg-backup"
description = "Создаёт дамп PostgreSQL и отправляет его на TrueNAS"
runtime = "bash"
# скрипт, который будет выполнен как плагин
entrypoint = <<-EOT
#!/usr/bin/env bash
set -euo pipefail
# 1. формируем имя дампа
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
FILE="/tmp/pg_${TIMESTAMP}.dump"
# 2. делаем дамп
pg_dump -U ${var.pg_user} -F c -b -v -f "${FILE}" ${var.pg_db}
# 3. копируем на TrueNAS (NFS‑монтировка /mnt/truenas)
cp "${FILE}" /mnt/truenas/backups/postgres/
EOT
variables = {
pg_user = var.pg_user
pg_db = var.pg_db
}
}
Справочно: в статье «Навыки реальных инженеров: практические практики из .agents» (ссылка) описаны подходы к написанию таких скриптов.
С практической точки зрения, после того как плагин объявлен, его можно вызвать из любого CI‑скрипта:
bash# .github/workflows/backup.yml
name: PostgreSQL backup
on:
schedule:
- cron: '0 2 * * *' # каждый день в 02:00
jobs:
backup:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v3
- name: Run DeepSeek Harness plugin
run: |
terraform init
terraform apply -auto-approve
Интеграция с CI/CD и мониторингом
Согласно набору навыков для работы с AI‑агентами (ссылка), DeepSeek Harness удобно встраивается в GitHub Actions, GitLab CI или Jenkins.
Пример — пайплайн, который после успешного деплоя Kubernetes‑манифеста запускает плагин, проверяющий доступность сервиса через curl и отправляющий метрику в Prometheus.
yaml# .gitlab-ci.yml
stages:
- deploy
- test
- monitor
deploy:
stage: deploy
script:
- kubectl apply -f k8s/deployment.yaml
artifacts:
paths:
- k8s/
test:
stage: test
script:
- |
# Ждём, пока сервис станет доступен
for i in {1..10}; do
curl -sSf http://my-service.local/health && break
sleep 5
done
- echo "Сервис готов к тестированию"
needs: ["deploy"]
monitor:
stage: monitor
script:
- |
# Запускаем плагин, который отправляет метрику в Prometheus
deepseek plugin run pg-health-check --prometheus-url http://prometheus:9090
needs: ["test"]
only:
- main
В этом примере плагин pg-health-check (не показан) собирает метрики response_time и error_rate, после чего делает curl‑запрос к эндпоинту /health. Если метрика превышает порог, CI‑pipeline падает, что гарантирует предсказуемость работы сервиса.
Для более глубокого мониторинга рекомендуется включить экспорт метрик в Prometheus через встроенный /metrics‑эндпоинт плагина, как описано в статье «Simantic: симуляция прошивок для AI‑агентов» (ссылка).
Таким образом, DeepSeek Harness сочетает удобство плагин‑ориентированного доступа к любой логике с полноценной интеграцией в современные цепочки CI/CD и системами мониторинга, что делает его практичным инструментом для разработчиков, работающих с кластерами и инфраструктурой домашних серверов.
Ограничения и рекомендации по эксплуатации
### Потенциальные конфликты и безопасность
Во-первых, плагины DeepSeek Harness загружаются в общем процессе, поэтому конфликт версий или несовместимых зависимостей может привести к падению всего сервиса. С практической точки зрения важно фиксировать точные версии плагинов в манифесте и проверять их совместимость перед запуском.
Если мы посмотрим на пример docker‑compose.yml, где определены несколько плагинов, видно, что без указания версии может произойти неожиданный переход на последнюю стабильную сборку,breaks‑совместимость:
yamlversion: "3.9"
services:
harness:
image: deepseek/harness:latest
ports:
- "8080:8080"
volumes:
- ./plugins:/app/plugins
environment:
- PLUGINS_DIR=/app/plugins
restart: unless-stopped
Чтобы избежать конфликтов, рекомендуется явно указать версии плагинов в отдельном файле plugins/manifest.json:
json{
"plugins": [
{
"name": "deepseek-llm",
"version": "1.4.2"
},
{
"name": "deepseek-orchestrator",
"version": "2.1.0"
}
]
}
Команда проверки версии выглядит так:
bashdocker run --rm deepseek/harness:1.4.2 manifest list
Если плагин использует общие переменные окружения, лучше изолировать их с помощью пользовательских неймспейсов и ограниченных возможностей контейнера. Например, запуск с флагом --security-opt no-new-privileges и удалением лишних возможностей:
bashdocker run -d \ --name deepseek-plugin \ --security-opt no-new-privileges \ --cap-drop ALL \ --security-opt seccomp=./seccomp.json \ deepseek/harness:1.4.2
Для повышения предсказуемости применяйте AppArmor профиль, если он доступен в вашей ОС. Это уменьшит риск эскалации привилегий, если плагин будет скомпрометирован.
Ссылка на практические рекомендации из материалов проекта: Навыки реальных инженеров: практические практики из .agents.
### Поддержка и обновления
С практической точки зрения обновления плагинов DeepSeek Harness требуют тщательного планирования, иначе можно нарушить предсказуемость работы всей системы. Рекомендуется использовать фиксированные версии в docker‑compose.yml и проверять изменения в отдельном стенде перед применением в продакшн.
Пример обновления плагина без простоя:
bash# Сначала скачиваем новую версию
docker compose pull deepseek/harness-plugin:2.3.1
# Затем перезапускаем только сервис плагина
docker compose up -d deepseek/harness-plugin
Для отката к предыдущей версии достаточно указать нужный тег:
bashdocker compose down docker compose up -d deepseek/harness-plugin:2.2.5
В CI‑pipeline можно добавить шаг, который автоматически проверяет changelog и запускает набор тестов в изолированном контейнере. Это позволяет убедиться, что новая версия не нарушает работу других плагинов.
Если в вашем проекте используется несколько нод Proxmox, удобно применять canary‑деплой: обновляйте один узел, проверяйте метрики (Prometheus, Grafana) и только после подтверждения стабильности переключайте остальные ноды.
Ссылка на примеры автоматизации обновлений: Автономная разработка на Rust с помощью Claw-Code.
Для более детального руководства по поддержке AI‑агентов см. Набор навыков для работы с AI-агентами.
Часто задаваемые вопросы
Как DeepSeek Harness обеспечивает изоляцию плагинов и почему это важно для стабильности системы?
Плагины запускаются в отдельном процессе или контейнере, что предотвращает падение одного модуля от влияния на остальные части системы. Изоляция упрощает отладку, поскольку логи и метрики привязаны к конкретному процессу. При сбое плагина остальные сервисы продолжают работу без перезапуска. Это повышает предсказуемость и упрощает масштабирование.
Что требуется в YAML‑манифесте плагина для его корректной регистрации и как выглядит пример?
В манифесте указываются обязательные метаданные — name, version, entrypoint, а также список зависимостей. Пример из статьи показывает плагин deepseek-llm с указанием версии, пути к бинарнику и зависимостей rust-runtime и tokio. Эти сведения позволяют системе загрузить плагин и связать его с нужными ресурсами. Зависимости задаются с оператором >=, что гарантирует совместимость.
Какие команды используются для установки и активации плагина, и как можно проверить, что он успешно загружен?
Для установки используется deepseek plugin install <path>, а для включения — deepseek plugin enable <name>. После выполнения в логах появляется строка вида [...] INFO Plugin 'deepseek-llm' loaded (version 1.2.0). Проверка состояния возможна через deepseek plugin list, которая показывает статус активных и отключенных плагинов. Эти команды позволяют управлять жизненным циклом без изменения кода.
Как DeepSeek Harness определяет точки входа плагина и какие типичные сценарии использования этого подхода?
Точка входа объявляется в манифесте в поле entrypoint и регистрируется в общем сервисе после загрузки плагина. Это позволяет другим компонентам обращаться к функции через единый API, например, вызвать /v1/generate у LLM‑плагина. Типичные сценарии включают интеграцию AI‑агентов, адаптеров к базе данных или скриптов‑обёрток, которые могут быть подменены без изменения основной системы. Декларативная конфигурация упрощает добавление новых возможностей в продакшн.