OpenSource-Hub

deer-flow

フレームワーク

bytedance/deer-flow

オープンソースの長時間実行型スーパーエージェントフレームワーク。リサーチ、コーディング、創作をサポート。

概要

DeerFlow は、サブエージェント、メモリ、サンドボックス、スキルを統制し、数分から数時間規模のタスクを処理するオープンソースのスーパーエージェントフレームワークです。拡張可能なツールとマルチエージェントワークフローを備え、ディープリサーチ、コーディング、コンテンツ作成をサポートします。

README プレビュー

# 🦌 DeerFlow - 2.0\n\nEnglish | [中文](./README_zh.md) | [日本語](./README_ja.md) | [Français](./README_fr.md) | [Русский](./README_ru.md)\n\n[](./backend/pyproject.toml)\n[](./Makefile)\n[](./LICENSE)\n\n\n> On February 28th, 2026, DeerFlow claimed the 🏆 #1 spot on GitHub Trending following the launch of version 2. Thanks a million to our incredible community — you made this happen! 💪🔥\n\nDeerFlow (**D**eep **E**xploration and **E**fficient **R**esearch **Flow**) is an open-source **super agent harness** that orchestrates **sub-agents**, **memory**, and **sandboxes** to do almost anything — powered by **extensible skills**.\n\nhttps://github.com/user-attachments/assets/a8bcadc4-e040-4cf2-8fda-dd768b999c18\n\n> [!NOTE]\n> **DeerFlow 2.0 is a ground-up rewrite.** It shares no code with v1. If you're looking for the original Deep Research framework, it's maintained on the [`1.x` branch](https://github.com/bytedance/deer-flow/tree/main-1.x) — contributions there are still welcome. Active development has moved to 2.0.\n\n## Official Website\n\n[](https://deerflow.tech)\n\nLearn more and see **real demos** on our [**official website**](https://deerflow.tech).\n\n## Coding Plan from ByteDance Volcengine\n\n\n\n- We strongly recommend using Doubao-Seed-2.0-Code, DeepSeek v3.2 and Kimi 2.5 to run DeerFlow\n- [Learn more](https://www.byteplus.com/en/activity/codingplan?utm_campaign=deer_flow&utm_content=deer_flow&utm_medium=devrel&utm_source=OWO&utm_term=deer_flow)\n- [中国大陆地区的开发者请点击这里](https://www.volcengine.com/activity/codingplan?utm_campaign=deer_flow&utm_content=deer_flow&utm_medium=devrel&utm_source=OWO&utm_term=deer_flow)\n\n## InfoQuest\n\nDeerFlow has newly integrated the intelligent search and crawling toolset independently developed by BytePlus--[InfoQuest (supports free online experience)](https://docs.byteplus.com/en/docs/InfoQuest/What_is_Info_Quest)\n\n\n  \n\n\n---\n\n## Table of Contents\n\n- [🦌 DeerFlow - 2.0](#-deerflow---20)\n  - [Official Website](#offici

FAQ (5)

トラブル対応
DeerFlowでGATEWAY_PORTが空であることが原因の「ValueError: invalid literal for int() with base 10: ''」を修正するにはどうすればよいですか?

ゲートウェイが失敗する原因は、os.getenv("GATEWAY_PORT", "8001") が変数が未設定の場合にのみデフォルト値を返すためです。空だが定義されている変数は "" となり、int("") は ValueError を発生させます。

即時の回避策: 変数を未設定にするか、有効な数値のポートを指定してください:

unset GATEWAY_PORT
uv run uvicorn app.gateway.app:app --port 8001

または明示的に設定します:

GATEWAY_PORT=8001 GATEWAY_HOST=0.0.0.0 uv run uvicorn app.gateway.app:app --port 8001

Docker では -e GATEWAY_PORT= を使用しないでください。変数を省略するか、値を渡してください:

docker run -e GATEWAY_PORT=8001 ...

Docker Compose では、未設定のシェル変数が空文字列に展開されるのを防ぐため、デフォルト値を指定してください:

GATEWAY_PORT: ${PORT:-8001}
GATEWAY_HOST: ${GATEWAY_HOST:-0.0.0.0}

backend/app/gateway/config.py における恒久的なコード修正: None と "" のみを未設定として扱い、GATEWAY_PORT=0 は保持します:

port_raw = os.getenv("GATEWAY_PORT")
port = 8001 if port_raw is None or port_raw == "" else int(port_raw)
host = os.getenv("GATEWAY_HOST") or "0.0.0.0"

参照 Issue #5800
トラブル対応
ディレクトリスキャン中にファイルが削除された場合にアップロードリスティングが 500 FileNotFoundError を返す問題を修正する方法

backend/packages/harness/deerflow/uploads/manager.py の list_files_in_dir にパッチを当て、ファイルシステムの競合を許容するようにしてください。os.scandir() の後で entry.stat(follow_symlinks=False) を try/except OSError で囲み、ENOENT、ENOTDIR、ELOOP などの一時的なルックアップエラーではそのエントリをスキップし、EACCES のようなオペレーショナルエラーは再送出してください。また、os.scandir の前または実行中にディレクトリが消えた場合は、それまでに収集したエントリを返すことで対処してください。

例:

try:
    st = entry.stat(follow_symlinks=False)
except OSError as e:
    if e.errno in (errno.ENOENT, errno.ENOTDIR, errno.ELOOP):
        continue
    raise

これを防ぐために entry.is_file() に依存しないでください。POSIX では、ファイルシステムを再確認せずに scandir からキャッシュされた d_type を使用する場合があります。stat() が FileNotFoundError を送出する状況をシミュレートし、消えたエントリがスキップされ、残りのファイルが返されることを検証する回帰テストを追加してください。

参照 Issue #6097
トラブル対応
Python 3.13にアップグレードした後、RunJournal.flush()がスレッド間のミドルウェアイベントをドロップする問題を修正する方法

Python 3.13.16以降および3.14.8以降では、asyncio.to_thread()がイベントループに制御を譲らずに再開することがあります。そのため、ワーカーからcall_soon_threadsafe()でキューに入れられたコールバックは、RunJournal.flush()がバッファをチェックする時点でまだ保留中の可能性があります。flush()は空のバッファを検出し、_detach_runtime_dependencies()がジャーナルを閉じ、後続のコールバックは_closedで早期リターンしてしまい、最後のミドルウェアイベントが静かに失われます。

flush()を修正するには、ドレイン前に一度制御を譲り、その後でクローズ状態を再チェックします:

async def flush(self):
    # Let cross-thread call_soon_threadsafe callbacks land on the owner loop.
    await asyncio.sleep(0)

    if self._closed:
        return

    # Existing buffer-drain/queue-join logic follows here.

_detach_runtime_dependencies()の前にawait journal.flush()を維持してください。observability/auditパスでも同様に、flush()がキューにジョインする前に保留中の外部スレッドからのUsage/Auditのエンキューをドレインし、ワーカーをクローズ済みとマークする前にシャットダウンをフェンスしてください。

以下で検証してください:

cd backend
PYTHONPATH=. uv run pytest tests/test_run_journal.py::test_cross_thread_middleware_events_are_serialized_on_owner_loop

このリグレッションは、gh-105836/GH-141696によるCPythonの_chain_futureの変更が原因です。Python 3.12.15では追加のループ反復が強制されるため、Python 3.12へのピン留めは一時的な回避策となります。await asyncio.sleep(0)フェンスを追加することで、3.12、3.13、3.14のすべてで修正されます。

参照 Issue #6564
トラブル対応
globフィルターにスペース、引用符、またはドル記号が含まれている場合に、E2Bのgrepがexit code 2で失敗する問題を修正するにはどうすればよいですか?

E2B issue #6528 の修正(fix(e2b): quote grep filename filters)を含むリリースにアップグレードしてください。このバグは、E2BSandbox.grep() が --include=release *.txt のようなクォートされていないシェル引数を構築するため、シェルがそれを分割または展開してしまうことが原因で発生します。アダプターにパッチを適用する際は、引数の一部だけでなく引数全体をシェルクォートしてください。sh -c で実行されるコマンドに追加する前に、shlex.quote(f"--include={glob}") を使用してください。トランスポートがサポートしている場合は、["grep", f"--include={glob}", ...] のような argv 配列を渡すことを優先してください。これにより、ワイルドカードのセマンティクスを維持しながら、スペース、アポストロフィ、ダブルクォート、リテラルな $ 文字が保持されます。一時的な回避策として、*.txt のようなシェルメタ文字を含まない glob を使用し、一致するパスを Python でフィルタリングしてください。

参照 Issue #6528
トラブル対応
Helm 経由で DeerFlow をデプロイする際に、Live Browser WebSocket 接続が失敗する(404 / 101 Switching Protocols が返されない)のはなぜですか?

Helmチャートのnginx ConfigMap(deploy/helm/deer-flow/templates/configmap-nginx.yaml)には、Live Browserエンドポイント/api/threads/<thread_id>/browser/stream専用のlocationがありません。リクエストは汎用のthreads locationに振り分けられ、そこでUpgrade: websocketが削除され、Connectionがcloseに書き換えられるため、Gatewayには通常のHTTPリクエストが届き、WebSocketハンドシェイクが完了しません。

修正方法:configmap-nginx.yamlのnginxテンプレートに、Docker/ローカルのnginx設定に既に存在するものと同じ、専用のlocationブロックを追加します:

location ~ ^/api/threads/[^/]+/browser/stream {
    proxy_pass http://gateway;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 3600s;
}

その後、helm upgradeで再デプロイします(またはhelm templateで再レンダリングしてnginxポッドを再起動します)。ハンドシェイクが成功するとHTTP/1.1 101 Switching Protocolsが返されます。なお、make devとDockerスタックには既にこのlocationが含まれているため、このバグはHelmでデプロイされた環境でのみ発生します。Gatewayはアップグレード後も認証とスレッドの所有権を引き続き強制します。

参照 Issue #7147