From 9859cc8703f3af671e5280dd17bd9cfdcff2837f Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Fri, 1 Nov 2024 13:36:09 -0700 Subject: [PATCH 1/5] fix: defer version detection until run time --- .../pyproject.toml | 5 ----- .../instrumentation/guardrails/__init__.py | 17 +++++++++++------ .../test-requirements.txt | 3 +++ python/tox.ini | 5 ++++- 4 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 python/instrumentation/openinference-instrumentation-guardrails/test-requirements.txt diff --git a/python/instrumentation/openinference-instrumentation-guardrails/pyproject.toml b/python/instrumentation/openinference-instrumentation-guardrails/pyproject.toml index ac7da8195..e2698b2e0 100644 --- a/python/instrumentation/openinference-instrumentation-guardrails/pyproject.toml +++ b/python/instrumentation/openinference-instrumentation-guardrails/pyproject.toml @@ -37,11 +37,6 @@ dependencies = [ instruments = [ "guardrails-ai", ] -test = [ - "guardrails-ai == 0.4.5", - "opentelemetry-sdk", - "responses", -] [project.urls] Homepage = "https://github.com/Arize-ai/openinference/tree/main/python/instrumentation/openinference-instrumentation-guardrails" diff --git a/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py b/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py index cbfc7da67..316ef2d5d 100644 --- a/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py +++ b/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py @@ -1,13 +1,13 @@ import contextvars import logging from importlib import import_module, metadata -from typing import Any, Collection, Tuple, cast +from typing import Any, Collection, Tuple from opentelemetry import trace as trace_api from opentelemetry.instrumentation.instrumentor import BaseInstrumentor # type: ignore +from packaging.version import Version from wrapt import ObjectProxy, wrap_function_wrapper -import guardrails as gd from openinference.instrumentation import OITracer, TraceConfig from openinference.instrumentation.guardrails._wrap_guard_call import ( _ParseCallableWrapper, @@ -24,10 +24,7 @@ _LLM_PROVIDERS_MODULE = "guardrails.llm_providers" _RUNNER_MODULE = "guardrails.run" -GUARDRAILS_VERSION = cast( - Tuple[int, int, int], - tuple(map(int, metadata.version("guardrails-ai").split(".")[:3])), -) +GUARDRAILS_VERSION: Tuple[int, int, int] = (0, 0, 0) class _Contextvars(ObjectProxy): # type: ignore @@ -53,6 +50,12 @@ def instrumentation_dependencies(self) -> Collection[str]: return _instruments def _instrument(self, **kwargs: Any) -> None: + import guardrails as gd + + version = Version(metadata.version("guardrails-ai")) + global GUARDRAILS_VERSION + GUARDRAILS_VERSION = (version.major, version.minor, version.micro) + if GUARDRAILS_VERSION >= (0, 5, 2): logger.info("Guardrails version >= 0.5.2 detected, skipping instrumentation") return @@ -109,6 +112,8 @@ def _instrument(self, **kwargs: Any) -> None: ) def _uninstrument(self, **kwargs: Any) -> None: + import guardrails as gd + # not unwrapping by checking and using the __wrap__ attribute below because the # original package itself also uses wrapping if self._original_guardrails_llm_providers_call is not None: diff --git a/python/instrumentation/openinference-instrumentation-guardrails/test-requirements.txt b/python/instrumentation/openinference-instrumentation-guardrails/test-requirements.txt new file mode 100644 index 000000000..1b0cd5958 --- /dev/null +++ b/python/instrumentation/openinference-instrumentation-guardrails/test-requirements.txt @@ -0,0 +1,3 @@ +guardrails-ai==0.4.5 +opentelemetry-sdk +responses diff --git a/python/tox.ini b/python/tox.ini index 68aca3a18..c44819d5d 100644 --- a/python/tox.ini +++ b/python/tox.ini @@ -64,7 +64,10 @@ commands_pre = langchain: uv pip install --reinstall {toxinidir}/instrumentation/openinference-instrumentation-langchain[test] langchain-latest: uv pip install -U langchain langchain_core langchain_anthropic langchain_openai langchain_community langchain_core: uv pip install --reinstall {toxinidir}/instrumentation/openinference-instrumentation-langchain[type-check] - guardrails: uv pip install --reinstall {toxinidir}/instrumentation/openinference-instrumentation-guardrails[test] + guardrails: uv pip uninstall -r test-requirements.txt + guardrails: uv pip install --reinstall-package openinference-instrumentation-guardrails . + guardrails: python -c 'import openinference.instrumentation.guardrails' + guardrails: uv pip install -r test-requirements.txt guardrails-latest: uv pip install -U 'guardrails-ai<0.5.2' crewai: uv pip install --reinstall {toxinidir}/instrumentation/openinference-instrumentation-crewai[test] crewai-latest: uv pip install -U crewai From f18c45fc4f80b11acf5794a9e5b58d0ba5c279f1 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Fri, 1 Nov 2024 13:38:14 -0700 Subject: [PATCH 2/5] clean up --- .../src/openinference/instrumentation/guardrails/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py b/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py index 316ef2d5d..6d0120fce 100644 --- a/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py +++ b/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py @@ -50,8 +50,6 @@ def instrumentation_dependencies(self) -> Collection[str]: return _instruments def _instrument(self, **kwargs: Any) -> None: - import guardrails as gd - version = Version(metadata.version("guardrails-ai")) global GUARDRAILS_VERSION GUARDRAILS_VERSION = (version.major, version.minor, version.micro) @@ -60,6 +58,8 @@ def _instrument(self, **kwargs: Any) -> None: logger.info("Guardrails version >= 0.5.2 detected, skipping instrumentation") return + import guardrails as gd + if not (tracer_provider := kwargs.get("tracer_provider")): tracer_provider = trace_api.get_tracer_provider() if not (config := kwargs.get("config")): From 8b6c7340f5cb94950cf1faa55830917814957aa8 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Fri, 1 Nov 2024 14:08:45 -0700 Subject: [PATCH 3/5] clean up --- .../openinference/instrumentation/guardrails/__init__.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py b/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py index 6d0120fce..fd5f1b994 100644 --- a/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py +++ b/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py @@ -1,7 +1,7 @@ import contextvars import logging from importlib import import_module, metadata -from typing import Any, Collection, Tuple +from typing import Any, Collection from opentelemetry import trace as trace_api from opentelemetry.instrumentation.instrumentor import BaseInstrumentor # type: ignore @@ -24,8 +24,6 @@ _LLM_PROVIDERS_MODULE = "guardrails.llm_providers" _RUNNER_MODULE = "guardrails.run" -GUARDRAILS_VERSION: Tuple[int, int, int] = (0, 0, 0) - class _Contextvars(ObjectProxy): # type: ignore def __init__(self, cv: Any) -> None: @@ -51,10 +49,7 @@ def instrumentation_dependencies(self) -> Collection[str]: def _instrument(self, **kwargs: Any) -> None: version = Version(metadata.version("guardrails-ai")) - global GUARDRAILS_VERSION - GUARDRAILS_VERSION = (version.major, version.minor, version.micro) - - if GUARDRAILS_VERSION >= (0, 5, 2): + if (version.major, version.minor, version.micro) >= (0, 5, 2): logger.info("Guardrails version >= 0.5.2 detected, skipping instrumentation") return From d603d4ad19b50d8c2e6a4c8fada0a0b417acee6e Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Fri, 1 Nov 2024 14:45:56 -0700 Subject: [PATCH 4/5] change upper bound to <0.5.1 --- .../openinference/instrumentation/guardrails/__init__.py | 6 +++--- python/tox.ini | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py b/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py index fd5f1b994..dd482a075 100644 --- a/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py +++ b/python/instrumentation/openinference-instrumentation-guardrails/src/openinference/instrumentation/guardrails/__init__.py @@ -18,7 +18,7 @@ logger = logging.getLogger(__name__) -_instruments = ("guardrails-ai >= 0.4.5",) +_instruments = ("guardrails-ai>=0.4.5,<0.5.1",) _VALIDATION_MODULE = "guardrails.validator_service" _LLM_PROVIDERS_MODULE = "guardrails.llm_providers" @@ -49,8 +49,8 @@ def instrumentation_dependencies(self) -> Collection[str]: def _instrument(self, **kwargs: Any) -> None: version = Version(metadata.version("guardrails-ai")) - if (version.major, version.minor, version.micro) >= (0, 5, 2): - logger.info("Guardrails version >= 0.5.2 detected, skipping instrumentation") + if (version.major, version.minor, version.micro) >= (0, 5, 1): + logger.info("Guardrails version >= 0.5.1 detected, skipping instrumentation") return import guardrails as gd diff --git a/python/tox.ini b/python/tox.ini index c44819d5d..46c06fc1a 100644 --- a/python/tox.ini +++ b/python/tox.ini @@ -68,7 +68,7 @@ commands_pre = guardrails: uv pip install --reinstall-package openinference-instrumentation-guardrails . guardrails: python -c 'import openinference.instrumentation.guardrails' guardrails: uv pip install -r test-requirements.txt - guardrails-latest: uv pip install -U 'guardrails-ai<0.5.2' + guardrails-latest: uv pip install -U 'guardrails-ai<0.5.1' crewai: uv pip install --reinstall {toxinidir}/instrumentation/openinference-instrumentation-crewai[test] crewai-latest: uv pip install -U crewai haystack: uv pip install --reinstall {toxinidir}/instrumentation/openinference-instrumentation-haystack[test] From f215da29dd5131212d3c22d80c1b84e2a0de9d75 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Fri, 1 Nov 2024 14:46:29 -0700 Subject: [PATCH 5/5] add packaging --- .../openinference-instrumentation-guardrails/pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/python/instrumentation/openinference-instrumentation-guardrails/pyproject.toml b/python/instrumentation/openinference-instrumentation-guardrails/pyproject.toml index e2698b2e0..bed444dc7 100644 --- a/python/instrumentation/openinference-instrumentation-guardrails/pyproject.toml +++ b/python/instrumentation/openinference-instrumentation-guardrails/pyproject.toml @@ -31,6 +31,7 @@ dependencies = [ "openinference-semantic-conventions", "wrapt", "typing-extensions", + "packaging", ] [project.optional-dependencies]