| # Contributing to DeerFlow |
|
|
| Thank you for your interest in contributing to DeerFlow! This guide will help you set up your development environment and understand our development workflow. |
|
|
| ## Development Environment Setup |
|
|
| We offer two development environments. **Docker is recommended** for the most consistent and hassle-free experience. |
|
|
| ### Option 1: Docker Development (Recommended) |
|
|
| Docker provides a consistent, isolated environment with all dependencies pre-configured. No need to install Node.js, Python, or nginx on your local machine. |
|
|
| #### Prerequisites |
|
|
| - Docker Desktop or Docker Engine |
| - pnpm (for caching optimization) |
|
|
| #### Setup Steps |
|
|
| 1. **Configure the application**: |
| ```bash |
| # Copy example configuration |
| cp config.example.yaml config.yaml |
| |
| # Set your API keys |
| export OPENAI_API_KEY="your-key-here" |
| # or edit config.yaml directly |
| ``` |
|
|
| 2. **Initialize Docker environment** (first time only): |
| ```bash |
| make docker-init |
| ``` |
| This will: |
| - Build Docker images |
| - Install frontend dependencies (pnpm) |
| - Install backend dependencies (uv) |
| - Share pnpm cache with host for faster builds |
|
|
| 3. **Start development services**: |
| ```bash |
| make docker-start |
| ``` |
| `make docker-start` reads `config.yaml` and starts `provisioner` only for provisioner/Kubernetes sandbox mode. |
|
|
| All services will start with hot-reload enabled: |
| - Frontend changes are automatically reloaded |
| - Backend changes trigger automatic restart |
| - LangGraph server supports hot-reload |
|
|
| 4. **Access the application**: |
| - Web Interface: http://localhost:2026 |
| - API Gateway: http://localhost:2026/api/* |
| - LangGraph: http://localhost:2026/api/langgraph/* |
|
|
| #### Docker Commands |
|
|
| ```bash |
| # Build the custom k3s image (with pre-cached sandbox image) |
| make docker-init |
| # Start Docker services (mode-aware, localhost:2026) |
| make docker-start |
| # Stop Docker development services |
| make docker-stop |
| # View Docker development logs |
| make docker-logs |
| # View Docker frontend logs |
| make docker-logs-frontend |
| # View Docker gateway logs |
| make docker-logs-gateway |
| ``` |
|
|
| #### Docker Architecture |
|
|
| ``` |
| Host Machine |
| β |
| Docker Compose (deer-flow-dev) |
| ββ nginx (port 2026) β Reverse proxy |
| ββ web (port 3000) β Frontend with hot-reload |
| ββ api (port 8001) β Gateway API with hot-reload |
| ββ langgraph (port 2024) β LangGraph server with hot-reload |
| ββ provisioner (optional, port 8002) β Started only in provisioner/K8s sandbox mode |
| ``` |
|
|
| **Benefits of Docker Development**: |
| - β
Consistent environment across different machines |
| - β
No need to install Node.js, Python, or nginx locally |
| - β
Isolated dependencies and services |
| - β
Easy cleanup and reset |
| - β
Hot-reload for all services |
| - β
Production-like environment |
|
|
| ### Option 2: Local Development |
|
|
| If you prefer to run services directly on your machine: |
|
|
| #### Prerequisites |
|
|
| Check that you have all required tools installed: |
|
|
| ```bash |
| make check |
| ``` |
|
|
| Required tools: |
| - Node.js 22+ |
| - pnpm |
| - uv (Python package manager) |
| - nginx |
|
|
| #### Setup Steps |
|
|
| 1. **Configure the application** (same as Docker setup above) |
|
|
| 2. **Install dependencies**: |
| ```bash |
| make install |
| ``` |
|
|
| 3. **Run development server** (starts all services with nginx): |
| ```bash |
| make dev |
| ``` |
|
|
| 4. **Access the application**: |
| - Web Interface: http://localhost:2026 |
| - All API requests are automatically proxied through nginx |
|
|
| #### Manual Service Control |
|
|
| If you need to start services individually: |
|
|
| 1. **Start backend services**: |
| ```bash |
| # Terminal 1: Start LangGraph Server (port 2024) |
| cd backend |
| make dev |
| |
| # Terminal 2: Start Gateway API (port 8001) |
| cd backend |
| make gateway |
| |
| # Terminal 3: Start Frontend (port 3000) |
| cd frontend |
| pnpm dev |
| ``` |
|
|
| 2. **Start nginx**: |
| ```bash |
| make nginx |
| # or directly: nginx -c $(pwd)/docker/nginx/nginx.local.conf -g 'daemon off;' |
| ``` |
|
|
| 3. **Access the application**: |
| - Web Interface: http://localhost:2026 |
|
|
| #### Nginx Configuration |
|
|
| The nginx configuration provides: |
| - Unified entry point on port 2026 |
| - Routes `/api/langgraph/*` to LangGraph Server (2024) |
| - Routes other `/api/*` endpoints to Gateway API (8001) |
| - Routes non-API requests to Frontend (3000) |
| - Centralized CORS handling |
| - SSE/streaming support for real-time agent responses |
| - Optimized timeouts for long-running operations |
|
|
| ## Project Structure |
|
|
| ``` |
| deer-flow/ |
| βββ config.example.yaml # Configuration template |
| βββ extensions_config.example.json # MCP and Skills configuration template |
| βββ Makefile # Build and development commands |
| βββ scripts/ |
| β βββ docker.sh # Docker management script |
| βββ docker/ |
| β βββ docker-compose-dev.yaml # Docker Compose configuration |
| β βββ nginx/ |
| β βββ nginx.conf # Nginx config for Docker |
| β βββ nginx.local.conf # Nginx config for local dev |
| βββ backend/ # Backend application |
| β βββ src/ |
| β β βββ gateway/ # Gateway API (port 8001) |
| β β βββ agents/ # LangGraph agents (port 2024) |
| β β βββ mcp/ # Model Context Protocol integration |
| β β βββ skills/ # Skills system |
| β β βββ sandbox/ # Sandbox execution |
| β βββ docs/ # Backend documentation |
| β βββ Makefile # Backend commands |
| βββ frontend/ # Frontend application |
| β βββ Makefile # Frontend commands |
| βββ skills/ # Agent skills |
| βββ public/ # Public skills |
| βββ custom/ # Custom skills |
| ``` |
|
|
| ## Architecture |
|
|
| ``` |
| Browser |
| β |
| Nginx (port 2026) β Unified entry point |
| ββ Frontend (port 3000) β / (non-API requests) |
| ββ Gateway API (port 8001) β /api/models, /api/mcp, /api/skills, /api/threads/*/artifacts |
| ββ LangGraph Server (port 2024) β /api/langgraph/* (agent interactions) |
| ``` |
|
|
| ## Development Workflow |
|
|
| 1. **Create a feature branch**: |
| ```bash |
| git checkout -b feature/your-feature-name |
| ``` |
|
|
| 2. **Make your changes** with hot-reload enabled |
|
|
| 3. **Test your changes** thoroughly |
|
|
| 4. **Commit your changes**: |
| ```bash |
| git add . |
| git commit -m "feat: description of your changes" |
| ``` |
|
|
| 5. **Push and create a Pull Request**: |
| ```bash |
| git push origin feature/your-feature-name |
| ``` |
|
|
| ## Testing |
|
|
| ```bash |
| # Backend tests |
| cd backend |
| uv run pytest |
| |
| # Frontend tests |
| cd frontend |
| pnpm test |
| ``` |
|
|
| ### PR Regression Checks |
|
|
| Every pull request runs the backend regression workflow at [.github/workflows/backend-unit-tests.yml](.github/workflows/backend-unit-tests.yml), including: |
|
|
| - `tests/test_provisioner_kubeconfig.py` |
| - `tests/test_docker_sandbox_mode_detection.py` |
|
|
| ## Code Style |
|
|
| - **Backend (Python)**: We use `ruff` for linting and formatting |
| - **Frontend (TypeScript)**: We use ESLint and Prettier |
|
|
| ## Documentation |
|
|
| - [Configuration Guide](backend/docs/CONFIGURATION.md) - Setup and configuration |
| - [Architecture Overview](backend/CLAUDE.md) - Technical architecture |
| - [MCP Setup Guide](MCP_SETUP.md) - Model Context Protocol configuration |
|
|
| ## Need Help? |
|
|
| - Check existing [Issues](https://github.com/bytedance/deer-flow/issues) |
| - Read the [Documentation](backend/docs/) |
| - Ask questions in [Discussions](https://github.com/bytedance/deer-flow/discussions) |
|
|
| ## License |
|
|
| By contributing to DeerFlow, you agree that your contributions will be licensed under the [MIT License](./LICENSE). |
|
|