Spaces:
Sleeping
Sleeping
File size: 2,783 Bytes
515f392 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
"""
LangSmith ์ถ์ (tracing) ์ ํธ๋ฆฌํฐ ๋ชจ๋.
LangGraph ๋
ธ๋ ์คํ์ LangSmith์์ ์ถ์ ํ๊ณ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ณต์ ๋ฌธ์: https://docs.langchain.com/langsmith/trace-with-langgraph
"""
import os
import logging
import asyncio
from functools import wraps
from typing import Any, Callable
from inspect import iscoroutinefunction
from langsmith import traceable
logger = logging.getLogger(__name__)
def ensure_tracing_enabled() -> bool:
"""
LangSmith ์ถ์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง ํ์ธํฉ๋๋ค.
Returns:
bool: ์ถ์ ์ด ํ์ฑํ๋์ด ์์ผ๋ฉด True, ๊ทธ๋ ์ง ์์ผ๋ฉด False
"""
required_vars = ["LANGCHAIN_TRACING_V2", "LANGCHAIN_API_KEY"]
missing_vars = [var for var in required_vars if not os.getenv(var)]
if missing_vars:
logger.warning(
"LangSmith ์ถ์ ์ด ๋นํ์ฑํ๋์์ต๋๋ค. ๋๋ฝ๋ ํ๊ฒฝ๋ณ์: %s",
", ".join(missing_vars)
)
return False
return True
def trace_node(node_name: str) -> Callable:
"""
LangGraph ๋
ธ๋ ์คํ์ ์ถ์ ํ๋ ๋ฐ์ฝ๋ ์ดํฐ.
์ด ๋ฐ์ฝ๋ ์ดํฐ๋ ๊ฐ ๋
ธ๋์ ์
๋ ฅ/์ถ๋ ฅ, ์คํ ์๊ฐ, ์๋ฌ๋ฅผ
LangSmith ๋์๋ณด๋์ ์๋์ผ๋ก ๊ธฐ๋กํฉ๋๋ค.
๋๊ธฐ ๋ฐ ๋น๋๊ธฐ ํจ์ ๋ชจ๋ ์ง์ํฉ๋๋ค.
Args:
node_name: LangSmith์ ํ์๋ ๋
ธ๋ ์ด๋ฆ
Returns:
Callable: ๋ฐ์ฝ๋ ์ดํธ๋ ํจ์
Example:
@trace_node("check_cache")
async def check_cache_node(state: AgentState) -> AgentState:
# ๋
ธ๋ ๋ก์ง
return state
"""
def decorator(func: Callable) -> Callable:
# async ํจ์์ธ์ง ํ์ธ
if iscoroutinefunction(func):
@wraps(func)
@traceable(name=node_name, run_type="chain")
async def async_wrapper(*args, **kwargs) -> Any:
try:
result = await func(*args, **kwargs)
return result
except Exception as e:
logger.error("๐ด ๋
ธ๋ ์คํจ: %s - %s", node_name, str(e))
raise
return async_wrapper
else:
@wraps(func)
@traceable(name=node_name, run_type="chain")
def sync_wrapper(*args, **kwargs) -> Any:
try:
result = func(*args, **kwargs)
return result
except Exception as e:
logger.error("๐ด ๋
ธ๋ ์คํจ: %s - %s", node_name, str(e))
raise
return sync_wrapper
return decorator
# ๋ชจ๋ import ์ ์๋์ผ๋ก ์ถ์ ์ค์ ํ์ธ
ensure_tracing_enabled()
|