diff --git a/parea/__init__.py b/parea/__init__.py index 3e3bf081..a8201cb3 100644 --- a/parea/__init__.py +++ b/parea/__init__.py @@ -18,7 +18,7 @@ from parea.experiment.experiment import Experiment from parea.helpers import gen_trace_id, write_trace_logs_to_csv from parea.parea_logger import parea_logger -from parea.utils.trace_utils import get_current_trace_id, get_root_trace_id, trace, trace_insert +from parea.utils.trace_utils import clear_trace_context, get_current_trace_id, get_root_trace_id, trace, trace_insert from parea.wrapper.openai_raw_api_tracer import aprocess_stream_and_yield, process_stream_and_yield from parea.wrapper.utils import convert_openai_raw_to_log diff --git a/parea/utils/trace_integrations/langchain.py b/parea/utils/trace_integrations/langchain.py index 035410cb..879adce8 100644 --- a/parea/utils/trace_integrations/langchain.py +++ b/parea/utils/trace_integrations/langchain.py @@ -1,5 +1,6 @@ from typing import Union +import logging from uuid import UUID from langchain_core.tracers import BaseTracer @@ -11,6 +12,8 @@ from parea.schemas.log import TraceIntegrations from parea.utils.trace_utils import fill_trace_data, get_current_trace_id, get_root_trace_id +logger = logging.getLogger() + class PareaAILangchainTracer(BaseTracer): parent_trace_id: UUID @@ -24,7 +27,8 @@ def _persist_run(self, run: Union[Run, LLMRun, ChainRun, ToolRun]) -> None: # using .dict() since langchain Run class currently set to Pydantic v1 data = run.dict() data["_parea_root_trace_id"] = self._parea_root_trace_id or None - if run.execution_order == 1: + # check if run has an attribute execution order + if hasattr(run, "execution_order") and run.execution_order == 1: data["_parea_parent_trace_id"] = self._parea_parent_trace_id or None parea_logger.record_vendor_log(data, TraceIntegrations.LANGCHAIN) @@ -32,8 +36,8 @@ def get_parent_trace_id(self) -> UUID: return self.parent_trace_id def _on_run_create(self, run: Run) -> None: - if run.execution_order == 1: - # need to check if any traces already exist\ + if hasattr(run, "execution_order") and run.execution_order == 1: + # need to check if any traces already exist self._parea_root_trace_id = get_root_trace_id() if parent_trace_id := get_current_trace_id(): self._parea_parent_trace_id = parent_trace_id diff --git a/parea/utils/trace_utils.py b/parea/utils/trace_utils.py index 96f0c576..292d4117 100644 --- a/parea/utils/trace_utils.py +++ b/parea/utils/trace_utils.py @@ -34,6 +34,14 @@ execution_order_counters = contextvars.ContextVar("execution_order_counters", default={}) +def clear_trace_context(): + global trace_context, trace_data, thread_ids_running_evals, execution_order_counters + trace_context = contextvars.ContextVar("trace_context", default=[]) + trace_data = contextvars.ContextVar("trace_data", default={}) + thread_ids_running_evals = contextvars.ContextVar("thread_ids_running_evals", default=[]) + execution_order_counters = contextvars.ContextVar("execution_order_counters", default={}) + + def log_in_thread(target_func: Callable, data: Dict[str, Any]): logging_thread = threading.Thread(target=target_func, kwargs=data) logging_thread.start() diff --git a/pyproject.toml b/pyproject.toml index 4f5382c3..47c60a0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "parea-ai" packages = [{ include = "parea" }] -version = "0.2.165" +version = "0.2.166" description = "Parea python sdk" readme = "README.md" authors = ["joel-parea-ai "]