mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-04-25 11:18:22 +00:00
63 lines
2.2 KiB
Python
63 lines
2.2 KiB
Python
"""Declarative feature flags and middleware positioning for create_deerflow_agent.
|
|
|
|
Pure data classes and decorators — no I/O, no side effects.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Literal
|
|
|
|
from langchain.agents.middleware import AgentMiddleware
|
|
|
|
|
|
@dataclass
|
|
class RuntimeFeatures:
|
|
"""Declarative feature flags for ``create_deerflow_agent``.
|
|
|
|
Most features accept:
|
|
- ``True``: use the built-in default middleware
|
|
- ``False``: disable
|
|
- An ``AgentMiddleware`` instance: use this custom implementation instead
|
|
|
|
``summarization`` and ``guardrail`` have no built-in default — they only
|
|
accept ``False`` (disable) or an ``AgentMiddleware`` instance (custom).
|
|
"""
|
|
|
|
sandbox: bool | AgentMiddleware = True
|
|
memory: bool | AgentMiddleware = False
|
|
summarization: Literal[False] | AgentMiddleware = False
|
|
subagent: bool | AgentMiddleware = False
|
|
vision: bool | AgentMiddleware = False
|
|
auto_title: bool | AgentMiddleware = False
|
|
guardrail: Literal[False] | AgentMiddleware = False
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Middleware positioning decorators
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
def Next(anchor: type[AgentMiddleware]):
|
|
"""Declare this middleware should be placed after *anchor* in the chain."""
|
|
if not (isinstance(anchor, type) and issubclass(anchor, AgentMiddleware)):
|
|
raise TypeError(f"@Next expects an AgentMiddleware subclass, got {anchor!r}")
|
|
|
|
def decorator(cls: type[AgentMiddleware]) -> type[AgentMiddleware]:
|
|
cls._next_anchor = anchor # type: ignore[attr-defined]
|
|
return cls
|
|
|
|
return decorator
|
|
|
|
|
|
def Prev(anchor: type[AgentMiddleware]):
|
|
"""Declare this middleware should be placed before *anchor* in the chain."""
|
|
if not (isinstance(anchor, type) and issubclass(anchor, AgentMiddleware)):
|
|
raise TypeError(f"@Prev expects an AgentMiddleware subclass, got {anchor!r}")
|
|
|
|
def decorator(cls: type[AgentMiddleware]) -> type[AgentMiddleware]:
|
|
cls._prev_anchor = anchor # type: ignore[attr-defined]
|
|
return cls
|
|
|
|
return decorator
|