"""LangGraph ToolNode용 도구 팩토리 패키지. 기존 capability 클래스를 StructuredTool로 래핑하여 LangGraph ToolNode에서 사용할 수 있도록 한다. """ from __future__ import annotations from typing import Any, Callable, Optional from .analysis_tools import build_analysis_tools from .search_tools import build_search_tools def build_all_tools( *, api_lookup_action: Optional[Any] = None, domain_adapter_fn: Optional[Callable[..., Any]] = None, ) -> list: """전체 도구 목록을 동적으로 생성한다. Parameters ---------- api_lookup_action : Optional[MinwonAnalysisAction] 공공데이터포털 API Action 인스턴스. domain_adapter_fn : Optional[Callable] 답변 초안 생성 클로저. 있으면 adapter_tools를 추가. Returns ------- list[StructuredTool] 전체 도구 목록. """ tools: list = [] tools.extend(build_search_tools(api_lookup_action)) tools.extend(build_analysis_tools(api_lookup_action)) if domain_adapter_fn: try: from .adapter_tools import build_adapter_tools tools.extend(build_adapter_tools(domain_adapter_fn)) except ImportError: import logging logging.getLogger(__name__).warning("adapter_tools 모듈 로드 실패, 어댑터 도구 생략") return tools def get_tool_approval_map(tools: list) -> dict[str, bool]: """각 도구의 requires_approval 메타데이터를 dict로 반환한다. approval_wait_node에서 동적 조회에 사용한다. Parameters ---------- tools : list[StructuredTool] 도구 목록. Returns ------- dict[str, bool] {tool_name: requires_approval} 매핑. """ result: dict[str, bool] = {} for tool in tools: meta = getattr(tool, "metadata", None) or {} result[tool.name] = meta.get("requires_approval", False) return result __all__ = [ "build_all_tools", "build_analysis_tools", "build_search_tools", "get_tool_approval_map", ]