deer-flow/backend/packages/harness/deerflow/config/agent_storage_config.py
Aari 1aa813ddb3
feat: add managed subagents and delegation scopes (#4887)
* feat: manage and scope subagents

* fix: address subagent review feedback

* fix: address managed subagent review feedback

* fix: harden subagent settings semantics

* fix: harden managed subagent cache invalidation

* fix: reuse assembled lead agent inputs

* fix: migrate managed subagent definitions

---------

Co-authored-by: Willem Jiang <willem.jiang@gmail.com>
2026-08-24 11:04:23 +08:00

39 lines
1.6 KiB
Python

"""Custom-agent and managed-subagent definition storage configuration.
Controls where custom agent *definitions* (``config.yaml`` + ``SOUL.md``) are
persisted, together with deployment-level managed subagent definitions. This
is orthogonal to :class:`DatabaseConfig` (which governs the
run/thread/event persistence layer) and to the deermem memory store.
Backends:
- file: Per-user files under ``{base_dir}/users/{user_id}/agents/{name}/``
for Custom Agents and one JSON file per managed subagent under
``{base_dir}/managed-subagents/``. Node-local without a shared mount. This
remains the default so zero-config development is unaffected.
- db: Rows in the ``agents`` and ``managed_subagents`` tables of the existing
SQL persistence layer, shared by every node. Requires ``database.backend``
to be ``sqlite`` or ``postgres`` (validated at startup).
Agent *memory* (``memory.json``) is a separate concern handled by the deermem
storage layer and is not affected by this switch.
"""
from __future__ import annotations
from typing import Literal
from pydantic import BaseModel, Field
class AgentStorageConfig(BaseModel):
backend: Literal["file", "db"] = Field(
default="file",
description=(
"Storage backend for custom-agent and managed-subagent definitions. "
"'file' (default) keeps their on-disk layouts and is node-local without a shared mount. "
"'db' stores both definition types in the shared SQL persistence layer so a "
"multi-instance deployment sees the same catalog on every node; it requires "
"database.backend to be 'sqlite' or 'postgres'."
),
)