deer-flow/README_ru.md
He Wang 08afdcb907
feat(channels): add DingTalk channel integration (#2628)
* feat(channels): add DingTalk channel integration

Add a new DingTalk messaging channel using the dingtalk-stream SDK
with Stream Push (WebSocket), requiring no public IP. Supports both
plain sampleMarkdown replies and optional AI Card streaming for a
typewriter effect when card_template_id is configured.

- Add DingTalkChannel implementation with token management, message
  routing, allowed_users filtering, and markdown adaptation
- Register dingtalk in channel service registry and capability map
- Propagate inbound metadata to outbound messages in ChannelManager
  for DingTalk sender context (sender_staff_id, conversation_type)
- Add dingtalk-stream dependency to pyproject.toml
- Add configuration examples in config.example.yaml and .env.example
- Update all README translations with setup instructions
- Add comprehensive test suite (test_dingtalk_channel.py) and
  metadata propagation test in test_channels.py
- Update backend CLAUDE.md to document DingTalk channel

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(channels): address PR review feedback for DingTalk integration

- Replace runtime mutation of CHANNEL_CAPABILITIES with a
  `supports_streaming` property on the Channel base class, overridden
  by DingTalkChannel, FeishuChannel, and WeComChannel
- Store stream client reference and attempt graceful disconnect in
  stop(); guard _on_chatbot_message with _running check to prevent
  post-stop message processing
- Use msg.chat_id as the primary routing key in send/send_file via
  a shared _resolve_routing helper, with metadata as fallback
- Fix process() return type annotation from tuple[str, str] to
  tuple[int, str] to match AckMessage.STATUS_OK
- Protect _incoming_messages with threading.Lock for cross-thread
  safety between the Stream Push thread and the asyncio loop
- Re-add Docker Compose URL guidance removed during DingTalk setup
  docs addition in README.md
- Fix incomplete sentence in README_zh.md (missing verb "启用")

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(docs): restore plain paragraph format for Docker Compose note

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(channels): fix isinstance TypeError and add file size guard in DingTalk channel

Use tuple syntax for isinstance() type check to avoid runtime TypeError
with PEP 604 union types. Add upload size limit (20MB) before reading
files into memory. Narrow exception handlers to specific types.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(channels): propagate markdown fallback errors and validate access token response

- Re-raise exceptions in _send_markdown_fallback to prevent partial
  deliveries (files sent without accompanying text)
- Validate _get_access_token response: reject non-dict bodies, empty
  tokens, and coerce invalid expireIn to a safe default
- Add tests for both fixes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(channels): validate upload response and broaden send_file exception handling

- Validate _upload_media JSON response: handle JSONDecodeError and
  non-dict payloads gracefully by returning None
- Broaden send_file exception tuple to include TypeError and
  AttributeError for unexpected JSON shapes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(channels): fix streaming race on channel registration and slim outbound metadata

- Register channel in service before calling start() to avoid race
  where background receiver publishes inbound before registration,
  causing manager to fall back to static CHANNEL_CAPABILITIES
- Strip known-large metadata keys (raw_message, ref_msg) from outbound
  messages to prevent memory bloat from propagated inbound payloads

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Update service.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update CLAUDE.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Willem Jiang <willem.jiang@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-30 11:25:33 +08:00

30 KiB
Raw Blame History

🦌 DeerFlow - 2.0

English | 中文 | 日本語 | Français | Русский

Python Node.js License: MIT

bytedance%2Fdeer-flow | Trendshift

28 февраля 2026 года DeerFlow занял 🏆 #1 в GitHub Trending после релиза версии 2. Спасибо огромное нашему сообществу — всё благодаря вам! 💪🔥

DeerFlow (Deep Exploration and Efficient Research Flow) — open-source Super Agent Harness, который управляет Sub-Agents, Memory и Sandbox для решения почти любой задачи. Всё на основе расширяемых Skills.

https://github.com/user-attachments/assets/a8bcadc4-e040-4cf2-8fda-dd768b999c18

Note

DeerFlow 2.0 — проект переписан с нуля. Общего кода с v1 нет. Если нужен оригинальный Deep Research фреймворк — он живёт в ветке 1.x, туда тоже принимают контрибьюты. Активная разработка идёт в 2.0.

Официальный сайт

image

Больше информации и живые демо на официальном сайте.

Coding Plan от ByteDance Volcengine

英文方舟

InfoQuest

DeerFlow интегрирован с инструментарием для умного поиска и краулинга от BytePlus — InfoQuest (есть бесплатный онлайн-доступ)

InfoQuest_banner

Содержание

Установка одной фразой для coding agent

Если вы используете Claude Code, Codex, Cursor, Windsurf или другой coding agent, просто отправьте ему эту фразу:

Если DeerFlow еще не клонирован, сначала клонируй его, а затем подготовь локальное окружение разработки по инструкции https://raw.githubusercontent.com/bytedance/deer-flow/main/Install.md

Этот prompt предназначен для coding agent. Он просит агента при необходимости сначала клонировать репозиторий, предпочесть Docker, если он доступен, и в конце вернуть точную команду запуска и список недостающих настроек.

Быстрый старт

Конфигурация

  1. Склонировать репозиторий DeerFlow

    git clone https://github.com/bytedance/deer-flow.git
    cd deer-flow
    
  2. Сгенерировать локальные конфиги

    Из корня проекта (deer-flow/) запустите:

    make config
    

    Команда создаёт локальные конфиги на основе шаблонов.

  3. Настроить модель

    Отредактируйте config.yaml и задайте хотя бы одну модель:

    models:
      - name: gpt-4                       # Внутренний идентификатор
        display_name: GPT-4               # Отображаемое имя
        use: langchain_openai:ChatOpenAI  # Путь к классу LangChain
        model: gpt-4                      # Идентификатор модели для API
        api_key: $OPENAI_API_KEY          # API-ключ (рекомендуется: переменная окружения)
        max_tokens: 4096                  # Максимальное количество токенов на запрос
        temperature: 0.7                  # Температура сэмплирования
    
      - name: openrouter-gemini-2.5-flash
        display_name: Gemini 2.5 Flash (OpenRouter)
        use: langchain_openai:ChatOpenAI
        model: google/gemini-2.5-flash-preview
        api_key: $OPENAI_API_KEY
        base_url: https://openrouter.ai/api/v1
    
      - name: gpt-5-responses
        display_name: GPT-5 (Responses API)
        use: langchain_openai:ChatOpenAI
        model: gpt-5
        api_key: $OPENAI_API_KEY
        use_responses_api: true
        output_version: responses/v1
    

    OpenRouter и аналогичные OpenAI-совместимые шлюзы настраиваются через langchain_openai:ChatOpenAI с параметром base_url. Для CLI-провайдеров:

    models:
      - name: gpt-5.4
        display_name: GPT-5.4 (Codex CLI)
        use: deerflow.models.openai_codex_provider:CodexChatModel
        model: gpt-5.4
        supports_thinking: true
        supports_reasoning_effort: true
    
      - name: claude-sonnet-4.6
        display_name: Claude Sonnet 4.6 (Claude Code OAuth)
        use: deerflow.models.claude_provider:ClaudeChatModel
        model: claude-sonnet-4-6
        max_tokens: 4096
        supports_thinking: true
    
    • Codex CLI читает ~/.codex/auth.json
    • Claude Code принимает CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_AUTH_TOKEN или ~/.claude/.credentials.json
    • На macOS при необходимости экспортируйте аутентификацию Claude Code явно:
    eval "$(python3 scripts/export_claude_code_oauth.py --print-export)"
    
  4. Указать API-ключи

    • Вариант А: файл .env в корне проекта (рекомендуется)
    TAVILY_API_KEY=your-tavily-api-key
    OPENAI_API_KEY=your-openai-api-key
    INFOQUEST_API_KEY=your-infoquest-api-key
    
    • Вариант Б: переменные окружения в терминале
    export OPENAI_API_KEY=your-openai-api-key
    
    • Вариант В: напрямую в config.yaml (не рекомендуется для продакшена)

Запуск

Вариант 1: Docker (рекомендуется)

Разработка (hot-reload, монтирование исходников):

make docker-init    # Загрузить образ Sandbox (один раз или при обновлении)
make docker-start   # Запустить сервисы

Продакшен (собирает образы локально):

make up     # Собрать образы и запустить все сервисы
make down   # Остановить и удалить контейнеры

Tip

На Linux при ошибке permission denied для Docker daemon добавьте пользователя в группу docker и перелогиньтесь. Подробнее в CONTRIBUTING.md.

Адрес: http://localhost:2026

Вариант 2: Локальная разработка

  1. Проверить зависимости:

    make check  # Проверяет Node.js 22+, pnpm, uv, nginx
    
  2. Установить зависимости:

    make install
    
  3. (Опционально) Загрузить образ Sandbox заранее:

    make setup-sandbox
    
  4. Запустить сервисы:

    make dev
    
  5. Адрес: http://localhost:2026

Дополнительно

Режим Sandbox

DeerFlow поддерживает несколько режимов выполнения:

  • Локальное выполнение — код запускается прямо на хосте
  • Docker — код выполняется в изолированных Docker-контейнерах
  • Docker + Kubernetes — выполнение в Kubernetes-подах через provisioner

Подробнее в руководстве по конфигурации Sandbox.

MCP-сервер

DeerFlow поддерживает настраиваемые MCP-серверы для расширения возможностей. Для HTTP/SSE MCP-серверов поддерживаются OAuth-токены (client_credentials, refresh_token). Подробнее в руководстве по MCP-серверу.

Мессенджеры

DeerFlow принимает задачи прямо из мессенджеров. Каналы запускаются автоматически при настройке, публичный IP не нужен.

Канал Транспорт Сложность
Telegram Bot API (long-polling) Просто
Slack Socket Mode Средне
Feishu / Lark WebSocket Средне
DingTalk Stream Push (WebSocket) Средне

Конфигурация в config.yaml:

channels:
  feishu:
    enabled: true
    app_id: $FEISHU_APP_ID
    app_secret: $FEISHU_APP_SECRET
    # domain: https://open.feishu.cn       # China (default)
    # domain: https://open.larksuite.com   # International

  slack:
    enabled: true
    bot_token: $SLACK_BOT_TOKEN
    app_token: $SLACK_APP_TOKEN
    allowed_users: []

  telegram:
    enabled: true
    bot_token: $TELEGRAM_BOT_TOKEN
    allowed_users: []

  dingtalk:
    enabled: true
    client_id: $DINGTALK_CLIENT_ID             # ClientId с DingTalk Open Platform
    client_secret: $DINGTALK_CLIENT_SECRET     # ClientSecret с DingTalk Open Platform
    allowed_users: []                          # пусто = разрешить всем
    card_template_id: ""                       # Опционально: ID шаблона AI Card для потокового эффекта печатной машинки

Настройка Telegram

  1. Напишите @BotFather, отправьте /newbot и скопируйте HTTP API-токен.
  2. Укажите TELEGRAM_BOT_TOKEN в .env и включите канал в config.yaml.

Настройка DingTalk

  1. Создайте приложение на DingTalk Open Platform и включите возможность Робот.
  2. На странице настроек робота установите режим приёма сообщений на Stream.
  3. Скопируйте Client ID и Client Secret. Укажите DINGTALK_CLIENT_ID и DINGTALK_CLIENT_SECRET в .env и включите канал в config.yaml.
  4. (Опционально) Для включения потоковых ответов AI Card (эффект печатной машинки) создайте шаблон AI Card на платформе карточек DingTalk, затем укажите card_template_id в config.yaml с ID шаблона. Также необходимо запросить разрешения Card.Streaming.Write и Card.Instance.Write.

Доступные команды

Команда Описание
/new Начать новый диалог
/status Показать информацию о текущем треде
/models Список доступных моделей
/memory Просмотреть память
/help Показать справку

Сообщения без команды воспринимаются как обычный чат — DeerFlow создаёт тред и отвечает.

Трассировка LangSmith

DeerFlow имеет встроенную интеграцию с LangSmith для наблюдаемости. При включении все вызовы LLM, запуски агентов и выполнения инструментов отслеживаются и отображаются в дашборде LangSmith.

Добавьте в файл .env в корне проекта:

LANGSMITH_TRACING=true
LANGSMITH_API_KEY=lsv2_pt_xxxxxxxxxxxxxxxx
LANGSMITH_PROJECT=deer-flow

LANGSMITH_ENDPOINT по умолчанию https://api.smith.langchain.com и может быть переопределён при необходимости. Устаревшие переменные LANGCHAIN_* (LANGCHAIN_TRACING_V2, LANGCHAIN_API_KEY и т.д.) также поддерживаются для обратной совместимости; LANGSMITH_* имеет приоритет, когда заданы обе.

В Docker-развёртываниях трассировка отключена по умолчанию. Установите LANGSMITH_TRACING=true и LANGSMITH_API_KEY в .env для включения.

От Deep Research к Super Agent Harness

DeerFlow начинался как фреймворк для Deep Research, и сообщество вышло далеко за эти рамки. После запуска разработчики строили пайплайны, генерировали презентации, поднимали дашборды, автоматизировали контент. То, чего мы не ожидали.

Стало понятно: DeerFlow не просто research-инструмент. Это harness: runtime, который даёт агентам необходимую инфраструктуру.

Поэтому мы переписали всё с нуля.

DeerFlow 2.0 — это Super Agent Harness «из коробки». Batteries included, полностью расширяемый. Построен на LangGraph и LangChain. По умолчанию есть всё, что нужно агенту: файловая система, memory, skills, sandbox-выполнение и возможность планировать и запускать sub-agents для сложных многошаговых задач.

Используйте как есть. Или разберите и переделайте под себя.

Core Features

Skills & Tools

Skills — это то, что позволяет DeerFlow делать почти что угодно.

Agent Skill — это структурированный модуль: Markdown-файл с описанием воркфлоу, лучших практик и ссылок на ресурсы. DeerFlow поставляется со встроенными skills для ресёрча, генерации отчётов, слайдов, веб-страниц, изображений и видео. Но главное — расширяемость: добавляйте свои skills, заменяйте встроенные или собирайте из них составные воркфлоу.

Skills загружаются по мере необходимости, только когда задача их требует. Это держит контекстное окно чистым.

# Пути внутри контейнера sandbox
/mnt/skills/public
├── research/SKILL.md
├── report-generation/SKILL.md
├── slide-creation/SKILL.md
├── web-page/SKILL.md
└── image-generation/SKILL.md

/mnt/skills/custom
└── your-custom-skill/SKILL.md      ← ваш skill

Интеграция с Claude Code

Skill claude-to-deerflow позволяет работать с DeerFlow прямо из Claude Code. Отправляйте задачи, проверяйте статус, управляйте тредами, не выходя из терминала.

Установка скилла:

npx skills add https://github.com/bytedance/deer-flow --skill claude-to-deerflow

Что можно делать:

  • Отправлять сообщения в DeerFlow и получать потоковые ответы
  • Выбирать режимы выполнения: flash (быстро), standard, pro (planning), ultra (sub-agents)
  • Проверять статус DeerFlow, просматривать модели, скиллы, агентов
  • Управлять тредами и историей диалога
  • Загружать файлы для анализа

Полный справочник API в skills/public/claude-to-deerflow/SKILL.md.

Sub-Agents

Сложные задачи редко решаются за один проход. DeerFlow их декомпозирует.

Lead agent запускает sub-agents на лету, каждый со своим изолированным контекстом, инструментами и условиями завершения. Sub-agents работают параллельно, возвращают структурированные результаты, а lead agent собирает всё в единый итог.

Вот как DeerFlow справляется с задачами на минуты и часы: research-задача разветвляется в дюжину sub-agents, каждый копает свой угол, потом всё сходится в один отчёт, или сайт, или слайддек со сгенерированными визуалами. Один harness, много рук.

Sandbox & файловая система

DeerFlow не просто говорит о том, что умеет что-то делать. У него есть собственный компьютер.

Каждая задача выполняется внутри изолированного Docker-контейнера с полной файловой системой: skills, workspace, uploads, outputs. Агент читает, пишет и редактирует файлы. Выполняет bash-команды и пишет код. Смотрит на изображения. Всё изолировано, всё прозрачно, никакого пересечения между сессиями.

Это разница между чатботом с доступом к инструментам и агентом с реальной средой выполнения.

# Пути внутри контейнера sandbox
/mnt/user-data/
├── uploads/          ← ваши файлы
├── workspace/        ← рабочая директория агентов
└── outputs/          ← результаты

Context Engineering

Изолированный контекст: каждый sub-agent работает в своём контексте и не видит контекст главного агента или других sub-agents. Агент фокусируется на своей задаче.

Управление контекстом: внутри сессии DeerFlow агрессивно сжимает контекст и суммирует завершённые подзадачи, выгружает промежуточные результаты в файловую систему, сжимает то, что уже не актуально. На длинных многошаговых задачах контекстное окно не переполняется.

Long-Term Memory

Большинство агентов забывают всё, когда диалог заканчивается. DeerFlow помнит.

DeerFlow сохраняет ваш профиль, предпочтения и накопленные знания между сессиями. Чем больше используете, тем лучше он вас знает: стиль, технологический стек, повторяющиеся воркфлоу. Всё хранится локально и остаётся под вашим контролем.

Рекомендуемые модели

DeerFlow работает с любым LLM через OpenAI-совместимый API. Лучше всего — с моделями, которые поддерживают:

  • Большое контекстное окно (100k+ токенов) — для deep research и многошаговых задач
  • Reasoning capabilities — для адаптивного планирования и сложной декомпозиции
  • Multimodal inputs — для работы с изображениями и видео
  • Strong tool-use — для надёжного вызова функций и структурированных ответов

Встроенный Python-клиент

DeerFlow можно использовать как Python-библиотеку прямо в коде — без запуска HTTP-сервисов. DeerFlowClient даёт доступ ко всем возможностям агента и Gateway, возвращает те же схемы ответов, что и HTTP Gateway API:

from deerflow.client import DeerFlowClient

client = DeerFlowClient()

# Chat
response = client.chat("Analyze this paper for me", thread_id="my-thread")

# Streaming (LangGraph SSE protocol: values, messages-tuple, end)
for event in client.stream("hello"):
    if event.type == "messages-tuple" and event.data.get("type") == "ai":
        print(event.data["content"])

# Configuration & management — returns Gateway-aligned dicts
models = client.list_models()        # {"models": [...]}
skills = client.list_skills()        # {"skills": [...]}
client.update_skill("web-search", enabled=True)
client.upload_files("thread-1", ["./report.pdf"])  # {"success": True, "files": [...]}

Документация

⚠️ Безопасность

Неправильное развёртывание может привести к угрозам безопасности

DeerFlow обладает ключевыми высокопривилегированными возможностями, включая выполнение системных команд, операции с ресурсами и вызов бизнес-логики. По умолчанию он рассчитан на развёртывание в локальной доверенной среде (доступ только через loopback-адрес 127.0.0.1). Если вы разворачиваете агент в недоверенных средах — локальных сетях, публичных облачных серверах или других окружениях, доступных с нескольких устройств — без строгих мер безопасности, это может привести к следующим угрозам:

  • Несанкционированные вызовы: функциональность агента может быть обнаружена неавторизованными третьими лицами или вредоносными сканерами, что приведёт к массовым несанкционированным запросам с выполнением высокорисковых операций (системные команды, чтение/запись файлов) и серьёзным последствиям для безопасности.
  • Юридические и compliance-риски: если агент будет незаконно использован для кибератак, кражи данных или других противоправных действий, это может повлечь юридическую ответственность и compliance-риски.

Рекомендации по безопасности

Примечание: настоятельно рекомендуем развёртывать DeerFlow только в локальной доверенной сети. Если вам необходимо развёртывание через несколько устройств или сетей, обязательно реализуйте строгие меры безопасности, например:

  • Белый список IP-адресов: используйте iptables или аппаратные межсетевые экраны / коммутаторы с ACL, чтобы настроить правила белого списка IP и заблокировать доступ со всех остальных адресов.
  • Шлюз аутентификации: настройте обратный прокси (nginx и др.) и включите строгую предварительную аутентификацию, запрещающую любой доступ без авторизации.
  • Сетевая изоляция: по возможности разместите агент и доверенные устройства в одном выделенном VLAN, изолированном от остальной сети.
  • Следите за обновлениями: регулярно отслеживайте обновления безопасности проекта DeerFlow.

Участие в разработке

Приветствуем контрибьюторов! Настройка среды разработки, воркфлоу и гайдлайны — в CONTRIBUTING.md.

Лицензия

Проект распространяется под лицензией MIT.

Благодарности

DeerFlow стоит на плечах open-source сообщества. Спасибо всем проектам и разработчикам, чья работа сделала его возможным.

Отдельная благодарность:

  • LangChain — фреймворк для взаимодействия с LLM и построения цепочек.
  • LangGraph — многоагентная оркестрация, на которой держатся сложные воркфлоу DeerFlow.

Ключевые контрибьюторы

Авторы DeerFlow, без которых проекта бы не было:

История звёзд

Star History Chart