mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-04-25 11:18:22 +00:00
53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
"""Async stream bridge factory.
|
|
|
|
Provides an **async context manager** aligned with
|
|
:func:`deerflow.runtime.checkpointer.async_provider.make_checkpointer`.
|
|
|
|
Usage (e.g. FastAPI lifespan)::
|
|
|
|
from deerflow.agents.stream_bridge import make_stream_bridge
|
|
|
|
async with make_stream_bridge() as bridge:
|
|
app.state.stream_bridge = bridge
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import contextlib
|
|
import logging
|
|
from collections.abc import AsyncIterator
|
|
|
|
from deerflow.config.app_config import AppConfig
|
|
|
|
from .base import StreamBridge
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@contextlib.asynccontextmanager
|
|
async def make_stream_bridge(config=None) -> AsyncIterator[StreamBridge]:
|
|
"""Async context manager that yields a :class:`StreamBridge`.
|
|
|
|
Falls back to :class:`MemoryStreamBridge` when no configuration is
|
|
provided and nothing is set globally.
|
|
"""
|
|
if config is None:
|
|
config = AppConfig.current().stream_bridge
|
|
|
|
if config is None or config.type == "memory":
|
|
from deerflow.runtime.stream_bridge.memory import MemoryStreamBridge
|
|
|
|
maxsize = config.queue_maxsize if config is not None else 256
|
|
bridge = MemoryStreamBridge(queue_maxsize=maxsize)
|
|
logger.info("Stream bridge initialised: memory (queue_maxsize=%d)", maxsize)
|
|
try:
|
|
yield bridge
|
|
finally:
|
|
await bridge.close()
|
|
return
|
|
|
|
if config.type == "redis":
|
|
raise NotImplementedError("Redis stream bridge planned for Phase 2")
|
|
|
|
raise ValueError(f"Unknown stream bridge type: {config.type!r}")
|