diff --git a/python/langsmith/run_trees.py b/python/langsmith/run_trees.py index f52dda1c1..85bb9bcd3 100644 --- a/python/langsmith/run_trees.py +++ b/python/langsmith/run_trees.py @@ -28,7 +28,7 @@ LANGSMITH_PREFIX = "langsmith-" LANGSMITH_DOTTED_ORDER = f"{LANGSMITH_PREFIX}trace" _CLIENT: Optional[Client] = None -_LOCK = threading.Lock() +_LOCK = threading.Lock() # Keeping around for a while for backwards compat # Note, this is called directly by langchain. Do not remove. @@ -37,9 +37,8 @@ def get_cached_client(**init_kwargs: Any) -> Client: global _CLIENT if _CLIENT is None: - with _LOCK: - if _CLIENT is None: - _CLIENT = Client(**init_kwargs) + if _CLIENT is None: + _CLIENT = Client(**init_kwargs) return _CLIENT @@ -163,7 +162,7 @@ def add_metadata(self, metadata: Dict[str, Any]) -> None: """Add metadata to the run.""" if self.extra is None: self.extra = {} - metadata_: dict = self.extra.setdefault("metadata", {}) + metadata_: dict = cast(dict, self.extra).setdefault("metadata", {}) metadata_.update(metadata) def add_outputs(self, outputs: Dict[str, Any]) -> None: diff --git a/python/langsmith/schemas.py b/python/langsmith/schemas.py index fb4e13ef6..d859418e7 100644 --- a/python/langsmith/schemas.py +++ b/python/langsmith/schemas.py @@ -2,7 +2,6 @@ from __future__ import annotations -import threading from datetime import datetime, timedelta, timezone from decimal import Decimal from enum import Enum @@ -201,6 +200,10 @@ class DatasetVersion(BaseModel): as_of: datetime +def _default_extra(): + return {"metadata": {}} + + class RunBase(BaseModel): """Base Run schema. @@ -226,7 +229,7 @@ class RunBase(BaseModel): end_time: Optional[datetime] = None """End time of the run, if applicable.""" - extra: Optional[dict] = None + extra: Optional[dict] = Field(default_factory=_default_extra) """Additional metadata or settings related to the run.""" error: Optional[str] = None @@ -258,16 +261,12 @@ class RunBase(BaseModel): """Attachments associated with the run. Each entry is a tuple of (mime_type, bytes).""" - _lock: threading.Lock = PrivateAttr(default_factory=threading.Lock) - @property def metadata(self) -> dict[str, Any]: """Retrieve the metadata (if any).""" - with self._lock: - if self.extra is None: - self.extra = {} - metadata = self.extra.setdefault("metadata", {}) - return metadata + if self.extra is None: + self.extra = {} + return self.extra.setdefault("metadata", {}) @property def revision_id(self) -> Optional[UUID]: