govon-runtime / src /inference /graph /tools /adapter_tools.py
github-actions
sync: c44e5ea
3e685d7
"""์–ด๋Œ‘ํ„ฐ๋ณ„ ๋…๋ฆฝ ๋„๊ตฌ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๋ชจ๋“ˆ.
AdapterRegistry์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ˆœํšŒํ•˜์—ฌ
๊ฐ๊ฐ์— ๋Œ€์‘ํ•˜๋Š” StructuredTool์„ ์ƒ์„ฑํ•œ๋‹ค.
adapters.yaml์— ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ƒˆ ๋„๊ตฌ๊ฐ€ ๋“ฑ๋ก๋œ๋‹ค.
"""
from __future__ import annotations
import json
from typing import Callable, List
from langchain_core.tools import StructuredTool
from pydantic import BaseModel, Field
from src.inference.adapter_registry import AdapterRegistry
class AdapterToolInput(BaseModel):
"""Adapter tool input schema."""
query: str = Field(description="Civil complaint or legal query text")
def build_adapter_tools(domain_adapter_fn: Callable) -> List[StructuredTool]:
"""AdapterRegistry์˜ ๋ชจ๋“  ์–ด๋Œ‘ํ„ฐ์— ๋Œ€ํ•ด StructuredTool์„ ๋™์  ์ƒ์„ฑํ•œ๋‹ค.
Parameters
----------
domain_adapter_fn : Callable
``async (query, context, session) -> dict`` ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ๋‹ต๋ณ€ ์ƒ์„ฑ ํ•จ์ˆ˜.
Returns
-------
List[StructuredTool]
์–ด๋Œ‘ํ„ฐ ์ˆ˜๋งŒํผ์˜ ๋„๊ตฌ ๋ฆฌ์ŠคํŠธ.
"""
registry = AdapterRegistry.get_instance()
tools: List[StructuredTool] = []
for adapter_name in registry.list_available():
description = registry.get_tool_description(adapter_name)
meta = registry.get_meta(adapter_name)
tool_name = f"{adapter_name}_adapter"
# ํด๋กœ์ €๋กœ adapter_name์„ ์บก์ฒ˜
def _make_execute(name: str) -> Callable:
async def _adapter_execute(query: str) -> str:
try:
# session=None: ToolNode์—์„œ๋Š” ์„ธ์…˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ถˆํ•„์š”.
# persist_node๊ฐ€ ๋ณ„๋„๋กœ ์„ธ์…˜ ์ €์žฅ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
result = await domain_adapter_fn(
query=query,
context={"adapter": name},
session=None,
)
return json.dumps(result, ensure_ascii=False)
except Exception as e:
return json.dumps(
{"error": str(e), "success": False},
ensure_ascii=False,
)
return _adapter_execute
requires_approval = meta.requires_approval if meta else True
tool = StructuredTool.from_function(
coroutine=_make_execute(adapter_name),
name=tool_name,
description=description,
args_schema=AdapterToolInput,
metadata={"requires_approval": requires_approval},
)
tools.append(tool)
return tools