From 2ae2fa3551649170657310ca991cc00840bc2985 Mon Sep 17 00:00:00 2001 From: Joel Alexander Date: Mon, 8 Jul 2024 17:22:22 -0400 Subject: [PATCH 1/3] add additional info to langchain handler, fix float on parse, try catch json dumps --- cookbook/langchain/trace_langchain_simple.py | 2 +- .../trace_langchain_with_deployed_prompt.py | 5 ++-- parea/client.py | 6 ++-- parea/helpers.py | 10 +++++++ parea/utils/trace_integrations/langchain.py | 30 ++++++++++++++++++- parea/utils/universal_encoder.py | 6 +++- pyproject.toml | 2 +- 7 files changed, 51 insertions(+), 10 deletions(-) diff --git a/cookbook/langchain/trace_langchain_simple.py b/cookbook/langchain/trace_langchain_simple.py index f6377fd8..e5530c5c 100644 --- a/cookbook/langchain/trace_langchain_simple.py +++ b/cookbook/langchain/trace_langchain_simple.py @@ -22,7 +22,7 @@ def main(): return chain.invoke( {"input": "Write a Hello World program in Python using FastAPI."}, - config={"callbacks": [handler]}, + config={"callbacks": [PareaAILangchainTracer(session_id="123", tags=["fastapi"], metadata={"key": "value"}, end_user_identifier="user123", deployment_id="456")]}, ) diff --git a/cookbook/langchain/trace_langchain_with_deployed_prompt.py b/cookbook/langchain/trace_langchain_with_deployed_prompt.py index 4890888e..8f26ff8d 100644 --- a/cookbook/langchain/trace_langchain_with_deployed_prompt.py +++ b/cookbook/langchain/trace_langchain_with_deployed_prompt.py @@ -12,7 +12,6 @@ load_dotenv() p = Parea(api_key=os.getenv("PAREA_API_KEY")) -handler = PareaAILangchainTracer() CONTEXT = """Company: Nike. 2023 @@ -63,11 +62,11 @@ def main(question): "context": CONTEXT, "question": question, }, - config={"callbacks": [handler]}, + config={"callbacks": [PareaAILangchainTracer(deployment_id="p-JTDYylldIrMbMisT70DJZ")]}, ) summary = summary_chain.invoke( {"content": answer}, - config={"callbacks": [handler]}, + config={"callbacks": [PareaAILangchainTracer(deployment_id="p-OGWAo6yvVKr1hUBY6bmHw")]}, ) return summary diff --git a/parea/client.py b/parea/client.py index 05e98c7d..85c6c672 100644 --- a/parea/client.py +++ b/parea/client.py @@ -63,9 +63,9 @@ @define class Parea: - api_key: str = field(init=True, default=os.getenv("PAREA_API_KEY")) - project_name: str = field(init=True, default="default") - cache: Cache = field(init=True, default=None) + api_key: str = field(default=os.getenv("PAREA_API_KEY")) + project_name: str = field(default="default") + cache: Cache = field(default=None) _project: ProjectSchema = field(init=False, default=None) _client: HTTPClient = field(init=False, default=HTTPClient()) diff --git a/parea/helpers.py b/parea/helpers.py index bbf27f4e..748f9306 100644 --- a/parea/helpers.py +++ b/parea/helpers.py @@ -90,8 +90,18 @@ def structure_union_type(obj: Any, cl: type) -> Any: else: return None + def structure_float_or_none(obj: Any, cl: type) -> Optional[float]: + if obj is None: + return None + try: + return float(obj) + except (ValueError, TypeError): + return None + converter = GenConverter() converter.register_structure_hook(Union[str, Dict[str, str], None], structure_union_type) + converter.register_structure_hook(float, structure_float_or_none) + converter.register_structure_hook(Optional[float], structure_float_or_none) return converter.structure(d, TraceLogTree) diff --git a/parea/utils/trace_integrations/langchain.py b/parea/utils/trace_integrations/langchain.py index df529674..6cdfd38d 100644 --- a/parea/utils/trace_integrations/langchain.py +++ b/parea/utils/trace_integrations/langchain.py @@ -1,4 +1,4 @@ -from typing import Union +from typing import Any, Dict, List, Optional, Union import logging from uuid import UUID @@ -19,6 +19,29 @@ class PareaAILangchainTracer(BaseTracer): parent_trace_id: UUID _parea_root_trace_id: str = None _parea_parent_trace_id: str = None + _session_id: Optional[str] = None + _tags: List[str] = [] + _metadata: Dict[str, Any] = {} + _end_user_identifier: Optional[str] = None + _deployment_id: Optional[str] = None + + def __init__( + self, + session_id: Optional[str] = None, + tags: Optional[List[str]] = None, + metadata: Optional[Dict[str, Any]] = None, + end_user_identifier: Optional[str] = None, + deployment_id: Optional[str] = None, + **kwargs: Any, + ): + super().__init__(**kwargs) + self._session_id = session_id + self._end_user_identifier = end_user_identifier + self._deployment_id = deployment_id + if tags: + self._tags = tags + if metadata: + self._metadata = metadata def _persist_run(self, run: Union[Run, LLMRun, ChainRun, ToolRun]) -> None: if is_logging_disabled(): @@ -27,6 +50,11 @@ 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 + data["_session_id"] = self._session_id or None + data["_tags"] = self._tags or None + data["_metadata"] = self._metadata or None + data["_end_user_identifier"] = self._end_user_identifier or None + data["_deployment_id"] = self._deployment_id or None # check if run has an attribute execution order if (hasattr(run, "execution_order") and run.execution_order == 1) or run.parent_run_id is None: data["_parea_parent_trace_id"] = self._parea_parent_trace_id or None diff --git a/parea/utils/universal_encoder.py b/parea/utils/universal_encoder.py index c7c242be..84e4565a 100644 --- a/parea/utils/universal_encoder.py +++ b/parea/utils/universal_encoder.py @@ -128,4 +128,8 @@ def default(self, obj: Any): def json_dumps(obj, **kwargs) -> str: - return json.dumps(obj, cls=UniversalEncoder, **kwargs) if not isinstance(obj, str) else obj + try: + return json.dumps(obj, cls=UniversalEncoder, **kwargs) if not isinstance(obj, str) else obj + except TypeError as e: + logger.debug(f"Error serializing object: {obj} with error: {e}") + return str(obj) diff --git a/pyproject.toml b/pyproject.toml index e7897487..5f29f901 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.184" +version = "0.2.185" description = "Parea python sdk" readme = "README.md" authors = ["joel-parea-ai "] From b589e5a5e06c2edac2f08301d18d072568d351e0 Mon Sep 17 00:00:00 2001 From: Joel Alexander Date: Mon, 8 Jul 2024 17:24:29 -0400 Subject: [PATCH 2/3] add additional info to langchain handler, fix float on parse, try catch json dumps --- parea/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parea/client.py b/parea/client.py index 85c6c672..d681d209 100644 --- a/parea/client.py +++ b/parea/client.py @@ -81,7 +81,7 @@ def __attrs_post_init__(self): parea_logger.set_project_uuid(self.project_uuid) except httpx.HTTPStatusError as e: if e.response.status_code == 502: - logger.error(f"Error creating Parea project please try again") + logger.error("Error creating Parea project please try again") else: raise parea_logger.set_client(self._client) From 237e1ebe6da2f5f3204b05c87c3f9ceafbc5d985 Mon Sep 17 00:00:00 2001 From: Joel Alexander Date: Mon, 8 Jul 2024 17:27:28 -0400 Subject: [PATCH 3/3] add additional info to langchain handler, fix float on parse, try catch json dumps --- parea/utils/trace_integrations/langchain.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/parea/utils/trace_integrations/langchain.py b/parea/utils/trace_integrations/langchain.py index 6cdfd38d..9c4aac27 100644 --- a/parea/utils/trace_integrations/langchain.py +++ b/parea/utils/trace_integrations/langchain.py @@ -50,11 +50,11 @@ 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 - data["_session_id"] = self._session_id or None - data["_tags"] = self._tags or None - data["_metadata"] = self._metadata or None - data["_end_user_identifier"] = self._end_user_identifier or None - data["_deployment_id"] = self._deployment_id or None + data["_session_id"] = self._session_id + data["_tags"] = self._tags + data["_metadata"] = self._metadata + data["_end_user_identifier"] = self._end_user_identifier + data["_deployment_id"] = self._deployment_id # check if run has an attribute execution order if (hasattr(run, "execution_order") and run.execution_order == 1) or run.parent_run_id is None: data["_parea_parent_trace_id"] = self._parea_parent_trace_id or None