mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-11-15 07:41:20 +00:00
Bundled examples keep their behavior tests in backend/tests/, so the core backend workflow ran optional extension behavior on every pull request. Mark those suites with pytest.mark.bundled_extension, exclude them from the core shards and from the duration baseline, and run them in a dedicated workflow through make test-bundled-extensions. Tests of host mechanisms stay in the core shards even when an example package is the payload. The marked suites import deerflow.agents, config, runtime, knowledge and app.gateway, so the workflow triggers for backend/packages/**, backend/app/gateway/** and the marked test modules; a backend test pins those paths, the make target and both marker selections, and fails when a marked module is missing from the path list. Host/extension compatibility checks — a host API gate and authorization of contributed routes — live in test_extension_host_contracts.py so they still fail core CI. The committed duration baseline drops the 482 entries for the excluded suites. Refs #8173 Co-authored-by: REI-330 <173389910+REI-330@users.noreply.github.com> Co-authored-by: willem-bd <143703838+willem-bd@users.noreply.github.com> Co-authored-by: Eilen6316 <136898293+Eilen6316@users.noreply.github.com>
3.9 KiB
3.9 KiB
Backend (backend/)
The Python backend: the publishable harness in packages/harness/deerflow/, the
public extension contract in packages/extension-api/, and the unpublished
Gateway and IM channels in app/. In every deployment the agent runtime runs
inside the Gateway. Design docs are in docs/; start with
ARCHITECTURE.md and API.md.
Guides by area
Read the guide for an area before you change it.
| Area | Guide |
|---|---|
| Run streaming, checkpoints, run ownership | runtime |
| Repositories, leases, scheduled tasks, schema changes | persistence, migrations |
| Scheduler failure isolation | design conventions |
config.yaml, extensions_config.json |
config |
| Lead agent, prompt, thread state, middleware chain | agents, middlewares |
| Memory, subagents, skills, tools | memory, subagents, skills, tools |
| Sandbox, uploads, MCP, models, extensions | sandbox, uploads, mcp, models, extensions |
| Trace ID, embedded client, other root modules | harness package |
| Search, fetch and sandbox providers | community, then the provider's own guide |
| Gateway, routers, IM channels | gateway, routers, channels |
| Tests, benchmarks | tests, benchmarks |
Verify
make test # offline suite in parallel shards
make test-blocking-io # strict blocking-I/O suite
make test-bundled-extensions # behavior suites of bundled examples (not in make test)
make lint
make format
make test-live # calls real APIs; needs DEER_FLOW_RUN_LIVE_TESTS=1
Run make test and make test-blocking-io before and after a change. Every
feature and bug fix ships with a test in tests/. Live tests stay opt-in, so the
default suite needs no network and no API key.
Rules
- The harness never imports
app.app.*importsdeerflow.*, and not the reverse, because the harness is published on its own.tests/test_harness_boundary.pyenforces this in CI. - Start the Gateway with
make devormake gateway.make devexcludesDEER_FLOW_HOMEandbackend/sandboxfrom the reload watcher. A bareuvicorn --reloadrestarts the Gateway during a run, because agent tasks write Python files belowDEER_FLOW_HOME. - From the repository root, run backend tools with
uv run --no-sync --project backend.--projectkeeps the caller's working directory, so relative config paths still resolve.--no-synckeeps installed extras such as the PostgreSQL drivers. - Run Python through
uv runinsidebackend/, without--no-sync, so the environment matches the lock. - Guard POSIX-only test markers with
os.name. Windows collects the same files. - Tool approvals need addressable calls. Strip missing, empty and duplicate tool-call IDs before creating a pause or a tool result. See the run interaction policy.
- Add a schema change with
make migrate-rev MSG="..."and follow the migrations guide.