mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-07-28 08:56:13 +00:00
* feat(persistence): wire alembic migrations + bootstrap schema on startup Closes #3682. Pre-#3658 DBs lack the `runs.token_usage_by_model` column because alembic was never wired up — startup only ran `create_all`, which never ALTERs existing tables. Adds a hybrid bootstrap in FastAPI lifespan (replaces bare `create_all`): - empty DB → create_all + stamp head - legacy DB → stamp 0001_baseline + upgrade head - versioned DB → upgrade head Concurrency: Postgres `pg_advisory_lock` (cross-process); SQLite per-engine `asyncio.Lock` + 30s `PRAGMA busy_timeout` on both prod and alembic engines. Column revisions use `safe_add_column` / `safe_drop_column` idempotent helpers as fallback. Other bits: - 0001 baseline (chain root) + 0002 add `runs.token_usage_by_model` - `include_object` filter so alembic ignores LangGraph checkpointer tables - `make migrate-rev MSG="..."` for authoring new revisions (no migrate/stamp targets — startup is the only execution path) - Tests: three-branch decision, concurrency, #3682 regression, env filter, blocking-IO gate anchor - CLAUDE.md: new "Schema migrations" section * fix(style): fix lint error * perf(persistence): address review feedback on alembic bootstrap Behavioural fixes - _SQLITE_LOCKS now keyed via WeakKeyDictionary so id-reuse after GC cannot return a stale, loop-bound lock and the cache cannot leak one entry per disposed engine. - safe_add_column compares nullable / server_default against the desired column when the name already exists and emits a warning on drift, surfacing manual-ALTER workarounds instead of silently no-op'ing. - _postgres_lock issues SET LOCAL idle_in_transaction_session_timeout=0 before pg_advisory_lock, so managed Postgres cannot kill the idle lock-holding session mid-upgrade and silently release the advisory lock. - legacy branch now backfills missing baseline tables via a restricted create_all (Base.metadata.create_all scoped to _BASELINE_TABLE_NAMES). Restores pre-#1930 upgraders whose channel_* tables were never provisioned, without pre-empting future create_table revisions for newly-added models. Schema parity - runs.token_usage_by_model gains server_default=text("'{}'") in both the ORM model and the 0001_baseline create_table, matching what 0002 adds via ALTER. create_all and alembic-upgrade paths now produce identical column definitions. - New parity test compares Base.metadata.create_all output against a pure alembic upgrade base->head, asserting column-set, nullable, and server_default agree across all tables (normalized through the same helper safe_add_column's drift check uses). Guards - test_baseline_table_names_constant_matches_0001 pins _BASELINE_TABLE_NAMES to 0001_baseline.upgrade()'s actual output -- the constant cannot drift silently when someone edits 0001. - test_legacy_backfill_skips_non_baseline_tables verifies the restricted backfill does not create a phantom table on Base.metadata, modelling a future revision that would otherwise collide on op.create_table. Doc residuals - Three-branch decision table is now consistent across bootstrap.py top docstring, engine.py comment, test module docstring, and CLAUDE.md. - Stale test anchor in blocking_io/test_persistence_engine_sqlite.py docstring now points at the real file. * fix(style): fix lint error * fix(persistence): close drift detection holes - _check_column_drift compares column type via a family equivalence allowlist ({JSON, JSONB}). Catches the wrong-type workaround `TEXT NOT NULL DEFAULT '{}'` that previously slipped through silently, while keeping Postgres JSON/JSONB dialect reflection quiet. Reflected and desired type are also echoed in every drift warning's payload for operator triage. - Extract _escape_url_for_alembic so bootstrap._alembic_safe_url and scripts/_autogen_revision share the ConfigParser % escape rule instead of duplicating it. - backend/README.md: add `make migrate-rev MSG=...` to Commands and a Schema Migrations section per the repo's README/CLAUDE.md sync policy. - test_base_to_dict.py: scope the test ORM class to an isolated MetaData so the create_all-vs-alembic parity test (added in the previous commit) is not polluted by the phantom table on the full pytest session.
456 lines
19 KiB
Markdown
456 lines
19 KiB
Markdown
# DeerFlow Backend
|
|
|
|
DeerFlow is a LangGraph-based AI super agent with sandbox execution, persistent memory, and extensible tool integration. The backend enables AI agents to execute code, browse the web, manage files, delegate tasks to subagents, and retain context across conversations - all in isolated, per-thread environments.
|
|
|
|
---
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌──────────────────────────────────────┐
|
|
│ Nginx (Port 2026) │
|
|
│ Unified reverse proxy │
|
|
└───────┬──────────────────┬───────────┘
|
|
│
|
|
/api/langgraph/* │ /api/* (other)
|
|
rewritten to /api/* │
|
|
▼
|
|
┌────────────────────────────────────────┐
|
|
│ Gateway API (8001) │
|
|
│ FastAPI REST + agent runtime │
|
|
│ │
|
|
│ Models, MCP, Skills, Memory, Uploads, │
|
|
│ Artifacts, Threads, Runs, Streaming │
|
|
│ │
|
|
│ ┌────────────────────────────────────┐ │
|
|
│ │ Lead Agent │ │
|
|
│ │ Middleware Chain, Tools, Subagents │ │
|
|
│ └────────────────────────────────────┘ │
|
|
└────────────────────────────────────────┘
|
|
```
|
|
|
|
**Request Routing** (via Nginx):
|
|
- `/api/langgraph/*` → Gateway LangGraph-compatible API - agent interactions, threads, streaming
|
|
- `/api/*` (other) → Gateway API - models, MCP, skills, memory, artifacts, uploads, thread-local cleanup
|
|
- `/` (non-API) → Frontend - Next.js web interface
|
|
|
|
---
|
|
|
|
## Core Components
|
|
|
|
### Lead Agent
|
|
|
|
The single LangGraph agent (`lead_agent`) is the runtime entry point, created via `make_lead_agent(config)`. It combines:
|
|
|
|
- **Dynamic model selection** with thinking and vision support
|
|
- **Middleware chain** for cross-cutting concerns (9 middlewares)
|
|
- **Tool system** with sandbox, MCP, community, and built-in tools
|
|
- **Subagent delegation** for parallel task execution
|
|
- **System prompt** with skills injection, memory context, and working directory guidance
|
|
|
|
### Middleware Chain
|
|
|
|
Middlewares execute in strict order, each handling a specific concern:
|
|
|
|
| # | Middleware | Purpose |
|
|
|---|-----------|---------|
|
|
| 1 | **ThreadDataMiddleware** | Creates per-thread isolated directories (workspace, uploads, outputs) |
|
|
| 2 | **UploadsMiddleware** | Injects newly uploaded files into conversation context |
|
|
| 3 | **SandboxMiddleware** | Acquires sandbox environment for code execution |
|
|
| 4 | **SummarizationMiddleware** | Reduces context when approaching token limits (optional) |
|
|
| 5 | **TodoListMiddleware** | Tracks multi-step tasks in plan mode (optional) |
|
|
| 6 | **TitleMiddleware** | Auto-generates conversation titles after first exchange |
|
|
| 7 | **MemoryMiddleware** | Queues conversations for async memory extraction |
|
|
| 8 | **ViewImageMiddleware** | Injects image data for vision-capable models (conditional) |
|
|
| 9 | **ClarificationMiddleware** | Intercepts clarification requests and interrupts execution (must be last) |
|
|
|
|
### Sandbox System
|
|
|
|
Per-thread isolated execution with virtual path translation:
|
|
|
|
- **Abstract interface**: `execute_command`, `read_file`, `write_file`, `list_dir`
|
|
- **Providers**: `LocalSandboxProvider` (filesystem) and `AioSandboxProvider` (Docker, in community/). Async runtime paths use async sandbox lifecycle hooks so startup, readiness polling, and release do not block the event loop. `AioSandboxProvider` validates active-cache and warm-pool containers during acquire/reuse, dropping definitively dead entries so a thread can provision a fresh sandbox after an unexpected container exit while keeping `get()` as an in-memory lookup. Backend health-check failures are treated as unknown, not dead, and a container that cannot be verified during discovery is simply not adopted (acquire falls through to create instead of failing).
|
|
- **Virtual paths**: `/mnt/user-data/{workspace,uploads,outputs}` → thread-specific physical directories
|
|
- **Skills path**: `/mnt/skills` → `deer-flow/skills/` directory
|
|
- **Skills loading**: Recursively discovers nested `SKILL.md` files under `skills/{public,custom}` and preserves nested container paths
|
|
- **File-write safety**: `str_replace` serializes read-modify-write per `(sandbox.id, path)` so isolated sandboxes keep concurrency even when virtual paths match
|
|
- **Tools**: `bash`, `ls`, `read_file`, `write_file`, `str_replace` (`write_file` overwrites by default and exposes `append` for end-of-file writes; `bash` is disabled by default when using `LocalSandboxProvider`; use `AioSandboxProvider` for isolated shell access)
|
|
|
|
### Subagent System
|
|
|
|
Async task delegation with concurrent execution:
|
|
|
|
- **Built-in agents**: `general-purpose` (full toolset) and `bash` (command specialist, exposed only when shell access is available)
|
|
- **Concurrency**: Max 3 subagents per turn, 15-minute timeout
|
|
- **Execution**: Background thread pools with status tracking and SSE events
|
|
- **Flow**: Agent calls `task()` tool → executor runs subagent in background → polls for completion → returns result
|
|
|
|
### Memory System
|
|
|
|
LLM-powered persistent context retention across conversations:
|
|
|
|
- **Automatic extraction**: Analyzes conversations for user context, facts, and preferences
|
|
- **Structured storage**: User context (work, personal, top-of-mind), history, and confidence-scored facts
|
|
- **Debounced updates**: Batches updates to minimize LLM calls (configurable wait time)
|
|
- **System prompt injection**: Top facts + context injected into agent prompts
|
|
- **Storage**: JSON file with mtime-based cache invalidation
|
|
|
|
### Tool Ecosystem
|
|
|
|
| Category | Tools |
|
|
|----------|-------|
|
|
| **Sandbox** | `bash`, `ls`, `read_file`, `write_file`, `str_replace` |
|
|
| **Built-in** | `present_files`, `ask_clarification`, `view_image`, `task` (subagent) |
|
|
| **Community** | Tavily (web search), Jina AI (web fetch), Firecrawl (scraping), DuckDuckGo (image search) |
|
|
| **MCP** | Any Model Context Protocol server (stdio, SSE, HTTP transports) |
|
|
| **Skills** | Domain-specific workflows injected via system prompt |
|
|
|
|
### Gateway API
|
|
|
|
FastAPI application providing REST endpoints for frontend integration:
|
|
|
|
| Route | Purpose |
|
|
|-------|---------|
|
|
| `GET /api/models` | List available LLM models |
|
|
| `GET/PUT /api/mcp/config` | Manage MCP server configurations |
|
|
| `POST /api/mcp/cache/reset` | Reset cached MCP tools so they reload on next use |
|
|
| `GET/PUT /api/skills` | List and manage skills |
|
|
| `POST /api/skills/install` | Install skill from `.skill` archive |
|
|
| `GET /api/memory` | Retrieve memory data |
|
|
| `POST /api/memory/reload` | Force memory reload |
|
|
| `GET /api/memory/config` | Memory configuration |
|
|
| `GET /api/memory/status` | Combined config + data |
|
|
| `POST /api/threads/{id}/uploads` | Upload files (auto-converts PDF/PPT/Excel/Word to Markdown, rejects directory paths, auto-renames duplicate filenames in one request) |
|
|
| `GET /api/threads/{id}/uploads/list` | List uploaded files |
|
|
| `DELETE /api/threads/{id}` | Delete DeerFlow-managed local thread data after LangGraph thread deletion; unexpected failures are logged server-side and return a generic 500 detail |
|
|
| `GET /api/threads/{id}/artifacts/{path}` | Serve generated artifacts |
|
|
|
|
### IM Channels
|
|
|
|
The IM bridge supports Feishu, Slack, and Telegram. Slack and Telegram still use the final `runs.wait()` response path, while Feishu now streams through `runs.stream(["messages-tuple", "values"])` and updates a single in-thread card in place.
|
|
|
|
For Feishu card updates, DeerFlow stores the running card's `message_id` per inbound message and patches that same card until the run finishes, preserving the existing `OK` / `DONE` reaction flow.
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
### Prerequisites
|
|
|
|
- Python 3.12+
|
|
- [uv](https://docs.astral.sh/uv/) package manager
|
|
- API keys for your chosen LLM provider
|
|
|
|
### Installation
|
|
|
|
```bash
|
|
cd deer-flow
|
|
|
|
# Copy configuration files
|
|
cp config.example.yaml config.yaml
|
|
|
|
# Install backend dependencies
|
|
cd backend
|
|
make install
|
|
```
|
|
|
|
### Configuration
|
|
|
|
Edit `config.yaml` in the project root:
|
|
|
|
```yaml
|
|
models:
|
|
- name: gpt-4o
|
|
display_name: GPT-4o
|
|
use: langchain_openai:ChatOpenAI
|
|
model: gpt-4o
|
|
api_key: $OPENAI_API_KEY
|
|
supports_thinking: false
|
|
supports_vision: true
|
|
|
|
- name: gpt-5-responses
|
|
display_name: GPT-5 (Responses API)
|
|
use: langchain_openai:ChatOpenAI
|
|
model: gpt-5
|
|
api_key: $OPENAI_API_KEY
|
|
use_responses_api: true
|
|
output_version: responses/v1
|
|
supports_vision: true
|
|
```
|
|
|
|
Set your API keys:
|
|
|
|
```bash
|
|
export OPENAI_API_KEY="your-api-key-here"
|
|
```
|
|
|
|
### Running
|
|
|
|
**Full Application** (from project root):
|
|
|
|
```bash
|
|
make dev # Starts Gateway + Frontend + Nginx
|
|
```
|
|
|
|
Access at: http://localhost:2026
|
|
|
|
**Backend Only** (from backend directory):
|
|
|
|
```bash
|
|
# Gateway API + embedded agent runtime
|
|
make dev
|
|
```
|
|
|
|
Direct access: Gateway at http://localhost:8001
|
|
|
|
---
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
backend/
|
|
├── src/
|
|
│ ├── agents/ # Agent system
|
|
│ │ ├── lead_agent/ # Main agent (factory, prompts)
|
|
│ │ ├── middlewares/ # 9 middleware components
|
|
│ │ ├── memory/ # Memory extraction & storage
|
|
│ │ └── thread_state.py # ThreadState schema
|
|
│ ├── gateway/ # FastAPI Gateway API
|
|
│ │ ├── app.py # Application setup
|
|
│ │ └── routers/ # 6 route modules
|
|
│ ├── sandbox/ # Sandbox execution
|
|
│ │ ├── local/ # Local filesystem provider
|
|
│ │ ├── sandbox.py # Abstract interface
|
|
│ │ ├── tools.py # bash, ls, read/write/str_replace
|
|
│ │ └── middleware.py # Sandbox lifecycle
|
|
│ ├── subagents/ # Subagent delegation
|
|
│ │ ├── builtins/ # general-purpose, bash agents
|
|
│ │ ├── executor.py # Background execution engine
|
|
│ │ └── registry.py # Agent registry
|
|
│ ├── tools/builtins/ # Built-in tools
|
|
│ ├── mcp/ # MCP protocol integration
|
|
│ ├── models/ # Model factory
|
|
│ ├── skills/ # Skill discovery & loading
|
|
│ ├── config/ # Configuration system
|
|
│ ├── community/ # Community tools & providers
|
|
│ ├── reflection/ # Dynamic module loading
|
|
│ └── utils/ # Utilities
|
|
├── docs/ # Documentation
|
|
├── tests/ # Test suite
|
|
├── langgraph.json # LangGraph graph registry for tooling/Studio compatibility
|
|
├── pyproject.toml # Python dependencies
|
|
├── Makefile # Development commands
|
|
└── Dockerfile # Container build
|
|
```
|
|
|
|
`langgraph.json` is not the default service entrypoint. The scripts and Docker
|
|
deployments run the Gateway embedded runtime; the file is kept for LangGraph
|
|
tooling, Studio, or direct LangGraph Server compatibility.
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
### Main Configuration (`config.yaml`)
|
|
|
|
Place in project root. Config values starting with `$` resolve as environment variables.
|
|
|
|
Key sections:
|
|
- `models` - LLM configurations with class paths, API keys, thinking/vision flags
|
|
- `tools` - Tool definitions with module paths and groups
|
|
- `tool_groups` - Logical tool groupings
|
|
- `sandbox` - Execution environment provider
|
|
- `skills` - Skills directory paths
|
|
- `title` - Auto-title generation settings
|
|
- `summarization` - Context summarization settings
|
|
- `subagents` - Subagent system (enabled/disabled)
|
|
- `memory` - Memory system settings (enabled, storage, debounce, facts limits)
|
|
|
|
Provider note:
|
|
- `models[*].use` references provider classes by module path (for example `langchain_openai:ChatOpenAI`).
|
|
- If a provider module is missing, DeerFlow now returns an actionable error with install guidance (for example `uv add langchain-google-genai`).
|
|
|
|
### Extensions Configuration (`extensions_config.json`)
|
|
|
|
MCP servers and skill states in a single file:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"github": {
|
|
"enabled": true,
|
|
"type": "stdio",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-github"],
|
|
"env": {"GITHUB_TOKEN": "$GITHUB_TOKEN"}
|
|
},
|
|
"secure-http": {
|
|
"enabled": true,
|
|
"type": "http",
|
|
"url": "https://api.example.com/mcp",
|
|
"oauth": {
|
|
"enabled": true,
|
|
"token_url": "https://auth.example.com/oauth/token",
|
|
"grant_type": "client_credentials",
|
|
"client_id": "$MCP_OAUTH_CLIENT_ID",
|
|
"client_secret": "$MCP_OAUTH_CLIENT_SECRET"
|
|
}
|
|
}
|
|
},
|
|
"skills": {
|
|
"pdf-processing": {"enabled": true}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Environment Variables
|
|
|
|
- `DEER_FLOW_CONFIG_PATH` - Override config.yaml location
|
|
- `DEER_FLOW_EXTENSIONS_CONFIG_PATH` - Override extensions_config.json location
|
|
- Model API keys: `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `DEEPSEEK_API_KEY`, etc.
|
|
- Tool API keys: `TAVILY_API_KEY`, `GITHUB_TOKEN`, etc.
|
|
|
|
### LangSmith Tracing
|
|
|
|
DeerFlow has built-in [LangSmith](https://smith.langchain.com) integration for observability. When enabled, all LLM calls, agent runs, tool executions, and middleware processing are traced and visible in the LangSmith dashboard.
|
|
|
|
**Setup:**
|
|
|
|
1. Sign up at [smith.langchain.com](https://smith.langchain.com) and create a project.
|
|
2. Add the following to your `.env` file in the project root:
|
|
|
|
```bash
|
|
LANGSMITH_TRACING=true
|
|
LANGSMITH_ENDPOINT=https://api.smith.langchain.com
|
|
LANGSMITH_API_KEY=lsv2_pt_xxxxxxxxxxxxxxxx
|
|
LANGSMITH_PROJECT=xxx
|
|
```
|
|
|
|
**Legacy variables:** The `LANGCHAIN_TRACING_V2`, `LANGCHAIN_API_KEY`, `LANGCHAIN_PROJECT`, and `LANGCHAIN_ENDPOINT` variables are also supported for backward compatibility. `LANGSMITH_*` variables take precedence when both are set.
|
|
|
|
### Langfuse Tracing
|
|
|
|
DeerFlow also supports [Langfuse](https://langfuse.com) observability for LangChain-compatible runs.
|
|
|
|
Add the following to your `.env` file:
|
|
|
|
```bash
|
|
LANGFUSE_TRACING=true
|
|
LANGFUSE_PUBLIC_KEY=pk-lf-xxxxxxxxxxxxxxxx
|
|
LANGFUSE_SECRET_KEY=sk-lf-xxxxxxxxxxxxxxxx
|
|
LANGFUSE_BASE_URL=https://cloud.langfuse.com
|
|
```
|
|
|
|
If you are using a self-hosted Langfuse deployment, set `LANGFUSE_BASE_URL` to your Langfuse host.
|
|
|
|
### Dual Provider Behavior
|
|
|
|
If both LangSmith and Langfuse are enabled, DeerFlow initializes and attaches both callbacks so the same run data is reported to both systems.
|
|
|
|
If a provider is explicitly enabled but required credentials are missing, or the provider callback cannot be initialized, DeerFlow raises an error when tracing is initialized during model creation instead of silently disabling tracing.
|
|
|
|
**Docker:** In `docker-compose.yaml`, tracing is disabled by default (`LANGSMITH_TRACING=false`). Set `LANGSMITH_TRACING=true` and/or `LANGFUSE_TRACING=true` in your `.env`, together with the required credentials, to enable tracing in containerized deployments.
|
|
|
|
---
|
|
|
|
## Development
|
|
|
|
### Commands
|
|
|
|
```bash
|
|
make install # Install dependencies
|
|
make dev # Run Gateway API + embedded agent runtime (port 8001)
|
|
make gateway # Run Gateway API without reload (port 8001)
|
|
make lint # Run linter (ruff)
|
|
make format # Format code (ruff)
|
|
make detect-blocking-io # Inventory blocking IO that may block the backend event loop
|
|
make migrate-rev MSG="..." # Autogenerate a new alembic revision against the live ORM models
|
|
```
|
|
|
|
### Schema Migrations
|
|
|
|
DeerFlow's application tables (`runs`, `threads_meta`, `feedback`, `users`,
|
|
`run_events`, and the `channel_*` tables) are owned by alembic. The Gateway
|
|
runs `alembic upgrade head` automatically on startup via
|
|
`bootstrap_schema(engine, backend=...)`, so operators do not run `alembic`
|
|
manually in production. Bootstrap is concurrency-safe (Postgres advisory lock
|
|
across processes; per-engine `asyncio.Lock` inside one SQLite process) and
|
|
idempotent against pre-existing schemas (empty / legacy / versioned).
|
|
|
|
When you add or change an ORM model, ship the change as a new revision under
|
|
`packages/harness/deerflow/persistence/migrations/versions/`:
|
|
|
|
```bash
|
|
make migrate-rev MSG="add foo column to runs"
|
|
```
|
|
|
|
The target invokes `scripts/_autogen_revision.py`, which builds a fresh temp
|
|
SQLite at `head` and diffs the live models against it — so a clean checkout
|
|
does not need a pre-existing `./data/deerflow.db`. Review the generated file
|
|
and switch raw `op.add_column` / `op.drop_column` calls to the idempotent
|
|
helpers in `migrations/_helpers.py` before committing. There is no
|
|
`make migrate` / `make migrate-stamp` target on purpose — Gateway startup is
|
|
the only execution path, which keeps operational mistakes off the table. See
|
|
`backend/CLAUDE.md` (Schema Migrations) for the full design.
|
|
|
|
### Code Style
|
|
|
|
- **Linter/Formatter**: `ruff`
|
|
- **Line length**: 240 characters
|
|
- **Python**: 3.12+ with type hints
|
|
- **Quotes**: Double quotes
|
|
- **Indentation**: 4 spaces
|
|
|
|
### Testing
|
|
|
|
```bash
|
|
uv run pytest
|
|
```
|
|
|
|
`make detect-blocking-io` statically scans backend business code for blocking
|
|
IO that may run on the backend event loop and is not test-coverage-bound. It
|
|
prints a concise summary for human review and writes complete JSON findings to
|
|
`.deer-flow/blocking-io-findings.json` at the repository root (regardless of
|
|
whether the target is invoked from the repo root or from `backend/`). JSON
|
|
findings include both broad IO category and review-oriented fields such as
|
|
`priority`, `location`, `blocking_call`, `event_loop_exposure`, `reason`, and
|
|
`code`. `priority` is a deterministic review ordering from the operation type,
|
|
not proof of a bug. Bare-name same-file calls are resolved by function name,
|
|
so duplicate helper names in one file can conservatively over-report async
|
|
reachability.
|
|
|
|
---
|
|
|
|
## Technology Stack
|
|
|
|
- **LangGraph** (1.0.6+) - Agent framework and multi-agent orchestration
|
|
- **LangChain** (1.2.3+) - LLM abstractions and tool system
|
|
- **FastAPI** (0.115.0+) - Gateway REST API
|
|
- **langchain-mcp-adapters** - Model Context Protocol support
|
|
- **agent-sandbox** - Sandboxed code execution
|
|
- **markitdown** - Multi-format document conversion
|
|
- **tavily-python** / **firecrawl-py** - Web search and scraping
|
|
|
|
---
|
|
|
|
## Documentation
|
|
|
|
- [Configuration Guide](docs/CONFIGURATION.md)
|
|
- [Architecture Details](docs/ARCHITECTURE.md)
|
|
- [API Reference](docs/API.md)
|
|
- [File Upload](docs/FILE_UPLOAD.md)
|
|
- [Path Examples](docs/PATH_EXAMPLES.md)
|
|
- [Context Summarization](docs/summarization.md)
|
|
- [Plan Mode](docs/plan_mode_usage.md)
|
|
- [Setup Guide](docs/SETUP.md)
|
|
|
|
---
|
|
|
|
## License
|
|
|
|
See the [LICENSE](../LICENSE) file in the project root.
|
|
|
|
## Contributing
|
|
|
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines.
|