"""Product knowledge base module (obsidian-wiki compatible). Self-contained: knowledge ingestion, storage (DB mirror + Markdown vault), search and graph export all live here. The Gateway only depends on :class:`KnowledgeService` via :func:`make_knowledge_service`. """ from __future__ import annotations from typing import TYPE_CHECKING from deerflow.knowledge.obsidian_adapter import ObsidianWikiAdapter from deerflow.knowledge.repository import KnowledgeRepository from deerflow.knowledge.service import EmptyThreadError, KnowledgeService if TYPE_CHECKING: from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker from deerflow.config.knowledge_config import KnowledgeConfig __all__ = [ "EmptyThreadError", "KnowledgeRepository", "KnowledgeService", "ObsidianWikiAdapter", "make_knowledge_service", ] def make_knowledge_service( session_factory: async_sessionmaker[AsyncSession] | None, config: KnowledgeConfig, ) -> KnowledgeService | None: """Build the knowledge service. Returns ``None`` when persistence is memory-only (no session factory) or the feature is disabled — the router then responds 503. """ if session_factory is None or not config.enabled: return None return KnowledgeService(KnowledgeRepository(session_factory), config)