[project] name = "deer-flow" version = "2.1.0" description = "LangGraph-based AI agent system with sandbox execution capabilities" readme = "README.md" requires-python = ">=3.12" dependencies = [ "deerflow-harness", "fastapi>=0.115.0", "httpx>=0.28.0", "python-multipart>=0.0.31", "sse-starlette>=2.1.0", "uvicorn[standard]>=0.34.0", "lark-oapi>=1.4.0", "slack-sdk>=3.33.0", "python-telegram-bot>=21.0", "langgraph-sdk>=0.1.51", "markdown-to-mrkdwn>=0.3.1", "wecom-aibot-python-sdk>=0.1.6", "dingtalk-stream>=0.24.3", "bcrypt>=4.0.0", "pyjwt>=2.13.0", "email-validator>=2.0.0", "e2b-code-interpreter>=2.8.1", ] [project.optional-dependencies] postgres = ["deerflow-harness[postgres]"] redis = ["deerflow-harness[redis]"] discord = ["discord.py>=2.7.0"] monocle = ["deerflow-harness[monocle]"] browser = ["deerflow-harness[browser]"] memory-zh = ["deerflow-harness[memory-zh]"] [dependency-groups] dev = [ "blockbuster>=1.5.26,<1.6", "hypothesis>=6.100,<7", "jsonschema>=4.26.0", "prompt-toolkit>=3.0.0", "pytest>=9.0.3", "pytest-asyncio>=1.3.0", "ruff>=0.14.11", # Monocle tracer (also the deerflow-harness[monocle] extra); kept in the dev # group so the tracing tests can import it without forcing it onto installs. "monocle_apptrace>=0.8.8", # redis is an optional runtime extra (deerflow-harness[redis]); pin it in the # dev group so the stream-bridge tests can always import/exercise the redis # bridge without forcing it onto production installs. "redis>=5.0.0", # TUI runtime dep (also declared as the deerflow-harness[tui] extra); kept in # the dev group so the terminal workbench can be run and tested locally / in CI. "textual>=0.80", ] [tool.pytest.ini_options] markers = [ "no_auto_user: disable the conftest autouse contextvar fixture for this test", "allow_blocking_io: opt out of the strict Blockbuster gate in tests/blocking_io/", "integration: tests that require an external service (e.g. Redis); skipped when unavailable", ] [tool.uv] index-url = "https://pypi.org/simple" # langgraph-sdk 0.4.2 (pulled in by langgraph 1.2.9 for DeltaChannel) pins # `websockets<16,>=14`, silently downgrading websockets 16.0 -> 15.0.1. The # pin is not grounded in any API incompatibility: websockets 16's only # breaking change is requiring Python >=3.10 (we require >=3.12), the sdk # only imports `websockets.asyncio.client`/`websockets.exceptions` (both # 16-compatible), and DeerFlow never uses the sdk's WebSocket transport # (httpx/SSE only). Pin the exact pre-upgrade 16.0 for the IM channel # integrations (dingtalk-stream, python-telegram-bot, etc.) that ran on it # before. Remove once langgraph-sdk relaxes the pin upstream. Note: enabling # the `openai[realtime]` or `slack-sdk[optional]` extras would conflict (they # also cap websockets<16). override-dependencies = ["websockets==16.0"] [tool.uv.workspace] members = ["packages/harness"] [tool.uv.sources] deerflow-harness = { workspace = true }