6.9 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
DeerFlow is a LangGraph-based AI agent backend that provides a "super agent" with sandbox execution capabilities. The agent can execute code, browse the web, and manage files in isolated sandbox environments.
Commands
# Install dependencies
make install
# Run development server (LangGraph Studio)
make dev
# Lint
make lint
# Format code
make format
Architecture
Configuration System
The app uses a YAML-based configuration system loaded from config.yaml.
Setup: Copy config.example.yaml to config.yaml in the project root directory and customize for your environment.
# From project root (deer-flow/)
cp config.example.yaml config.yaml
Configuration priority:
- Explicit
config_pathargument DEER_FLOW_CONFIG_PATHenvironment variableconfig.yamlin current directory (backend/)config.yamlin parent directory (project root - recommended location)
Config values starting with $ are resolved as environment variables (e.g., $OPENAI_API_KEY).
Core Components
Agent Graph (src/agents/)
lead_agentis the main entry point registered inlanggraph.json- Uses
ThreadStatewhich extendsAgentStatewith sandbox state - Agent is created via
create_agent()with model, tools, middleware, and system prompt
Sandbox System (src/sandbox/)
- Abstract
Sandboxbase class defines interface:execute_command,read_file,write_file,list_dir SandboxProvidermanages sandbox lifecycle:acquire,get,releaseSandboxMiddlewareautomatically acquires sandbox on agent start and injects into stateLocalSandboxProvideris a singleton implementation for local execution- Sandbox tools (
bash,ls,read_file,write_file,str_replace) extract sandbox from tool runtime
Model Factory (src/models/)
create_chat_model()instantiates LLM from config using reflection- Supports
thinking_enabledflag with per-modelwhen_thinking_enabledoverrides
Tool System (src/tools/)
- Tools defined in config with
usepath (e.g.,src.sandbox.tools:bash_tool) get_available_tools()resolves tool paths via reflection- Community tools in
src/community/: Jina AI (web fetch), Tavily (web search) - Supports MCP (Model Context Protocol) for pluggable external tools
MCP System (src/mcp/)
- Integrates with MCP servers to provide pluggable external tools using
langchain-mcp-adapters - Uses
MultiServerMCPClientfrom langchain-mcp-adapters for multi-server management - Automatic initialization: Tools are loaded on first use with lazy initialization
- Supports both eager loading (FastAPI startup) and lazy loading (LangGraph Studio)
initialize_mcp_tools()can be called in FastAPI lifespan handler for eager loadingget_cached_mcp_tools()automatically initializes tools if not already loaded- Works seamlessly in both FastAPI server and LangGraph Studio environments
- Each server can be enabled/disabled independently via
enabledflag - Popular MCP servers: filesystem, postgres, github, brave-search, puppeteer
- Built on top of langchain-ai/langchain-mcp-adapters for seamless integration
Reflection System (src/reflection/)
resolve_variable()imports module and returns variable (e.g.,module:variable)resolve_class()imports and validates class against base class
Skills System (src/skills/)
- Skills provide specialized workflows for specific tasks (e.g., PDF processing, frontend design)
- Located in
deer-flow/skills/{public,custom}directory structure - Each skill has a
SKILL.mdfile with YAML front matter (name, description, license) - Skills are automatically discovered and loaded at runtime
load_skills()scans directories and parses SKILL.md files- Skills are injected into agent's system prompt with paths (only enabled skills)
- Path mapping system allows seamless access in both local and Docker sandbox:
- Local sandbox:
/mnt/skills→/path/to/deer-flow/skills - Docker sandbox: Automatically mounted as volume
- Local sandbox:
- Each skill can be enabled/disabled independently via
enabledflag in extensions config
Middleware System
- Custom middlewares in
src/agents/middlewares/: Title generation, thread data, clarification, etc. SummarizationMiddlewarefrom LangChain automatically condenses conversation history when token limits are approached- Configured in
config.yamlundersummarizationkey with trigger/keep thresholds - Middlewares are registered in
src/agents/lead_agent/agent.pywith execution order:ThreadDataMiddleware- Initializes thread contextSandboxMiddleware- Manages sandbox lifecycleSummarizationMiddleware- Reduces context when limits are approached (if enabled)TitleMiddleware- Generates conversation titlesClarificationMiddleware- Handles clarification requests (must be last)
Config Schema
Models, tools, sandbox providers, skills, and middleware settings are configured in config.yaml:
models[]: LLM configurations withuseclass pathtools[]: Tool configurations withusevariable path andgroupsandbox.use: Sandbox provider class pathskills.path: Host path to skills directory (optional, default:../skills)skills.container_path: Container mount path (default:/mnt/skills)title: Automatic thread title generation configurationsummarization: Automatic conversation summarization configuration
Extensions Configuration (extensions_config.json)
MCP servers and skills are configured together in extensions_config.json in project root:
Setup: Copy extensions_config.example.json to extensions_config.json in the project root directory.
# From project root (deer-flow/)
cp extensions_config.example.json extensions_config.json
Configuration priority:
- Explicit
config_pathargument DEER_FLOW_EXTENSIONS_CONFIG_PATHenvironment variableextensions_config.jsonin current directory (backend/)extensions_config.jsonin parent directory (project root - recommended location)- For backward compatibility:
mcp_config.json(will be deprecated)
Structure:
mcpServers: Map of MCP server name to configurationenabled: Whether the server is enabled (boolean)command: Command to execute to start the server (e.g., "npx", "python")args: Arguments to pass to the command (array)env: Environment variables (object with$VARsupport for env variable resolution)description: Human-readable description
skills: Map of skill name to state configurationenabled: Whether the skill is enabled (boolean, default: true if not specified)
Both MCP servers and skills can be modified at runtime via API endpoints.
Code Style
- Uses
rufffor linting and formatting - Line length: 240 characters
- Python 3.12+ with type hints
- Double quotes, space indentation