From dc39d30ab2d16a61d13822cb3b306f63e40967d1 Mon Sep 17 00:00:00 2001 From: Douglas Blank Date: Fri, 13 Sep 2024 08:03:46 -0400 Subject: [PATCH 1/6] Opik integration --- .../docs/observability/opik_integration.md | 93 ++++++++ docs/my-website/img/opik.png | Bin 0 -> 133383 bytes docs/my-website/sidebars.js | 1 + litellm/integrations/opik.py | 199 ++++++++++++++++++ litellm/litellm_core_utils/litellm_logging.py | 32 ++- litellm/utils.py | 1 + tests/local_testing/test_opik.py | 162 ++++++++++++++ 7 files changed, 486 insertions(+), 2 deletions(-) create mode 100644 docs/my-website/docs/observability/opik_integration.md create mode 100644 docs/my-website/img/opik.png create mode 100644 litellm/integrations/opik.py create mode 100644 tests/local_testing/test_opik.py diff --git a/docs/my-website/docs/observability/opik_integration.md b/docs/my-website/docs/observability/opik_integration.md new file mode 100644 index 000000000000..5f56999f20da --- /dev/null +++ b/docs/my-website/docs/observability/opik_integration.md @@ -0,0 +1,93 @@ +import Image from '@theme/IdealImage'; + +# Comet Opik - Logging + Evals +Opik is an open source end-to-end [LLM Evaluation Platform](https://www.comet.com/site/products/opik/?utm_source=litelllm&utm_medium=docs&utm_content=intro_paragraph) that helps developers track their LLM prompts and responses during both development and production. Users can define and run evaluations to test their LLMs apps before deployment to check for hallucinations, accuracy, context retrevial, and more! + + + + +:::info +We want to learn how we can make the callbacks better! Meet the LiteLLM [founders](https://calendly.com/d/4mp-gd3-k5k/berriai-1-1-onboarding-litellm-hosted-version) or +join our [discord](https://discord.gg/wuPM9dRgDw) +::: + +## Pre-Requisites + +Ensure you have run `pip install opik` for this integration + +```shell +pip install opik litellm +``` + +## Quick Start +Use just 2 lines of code, to instantly log your responses **across all providers** with Opik + +Get your Opik API Key by signing up [here](https://www.comet.com/signup?utm_source=litelllm&utm_medium=docs&utm_content=api_key_cell)! + +```python +import litellm +litellm.success_callback = ["opik"] +``` + +Full examples: + +```python +# pip install opik +import litellm +import os + +os.environ["OPIK_API_KEY"] = "" + +# LLM provider API Keys: +os.environ["OPENAI_API_KEY"] = "" + + + +# set "opik" as a callback, litellm will send the data to an Opik server (such as comet.com) +litellm.success_callback = ["opik"] + +# openai call +response = litellm.completion( + model="gpt-3.5-turbo", + messages=[ + {"role": "user", "content": "Why is tracking and evaluation of LLMs important?"} + ] +) +``` + +If you are using a streaming response, you need to surround the +call with Opik's `@track` and provide `current_span` and `current_trace`: + +```python +from opik import track +from opik.opik_context import get_current_trace, get_current_span + +litellm.success_callback = ["opik"] + +@track() +def streaming_function(input): + messages = [{"role": "user", "content": input}] + response = litellm.completion( + model="gpt-3.5-turbo", + messages=messages, + metadata = { + "opik": { + "current_span": get_current_span(), + "current_trace": get_current_trace(), + "tags": ["streaming-test"], + }, + }, + stream=True, + ) + return response + +response = streaming_function("Why is tracking and evaluation of LLMs important?") +chunks = list(response) +``` + +## Support & Talk to Founders + +- [Schedule Demo 👋](https://calendly.com/d/4mp-gd3-k5k/berriai-1-1-onboarding-litellm-hosted-version) +- [Community Discord 💭](https://discord.gg/wuPM9dRgDw) +- Our numbers 📞 +1 (770) 8783-106 / ‭+1 (412) 618-6238‬ +- Our emails ✉️ ishaan@berri.ai / krrish@berri.ai diff --git a/docs/my-website/img/opik.png b/docs/my-website/img/opik.png new file mode 100644 index 0000000000000000000000000000000000000000..d56195c5d5f92615a03a9cca12105440e6f486bb GIT binary patch literal 133383 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 F{{Wo|{i*-} literal 0 HcmV?d00001 diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 5920b8841b3f..b11778750dc3 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -278,6 +278,7 @@ const sidebars = { "observability/greenscale_integration", "observability/supabase_integration", `observability/telemetry`, + "observability/opik_integration", ], }, { diff --git a/litellm/integrations/opik.py b/litellm/integrations/opik.py new file mode 100644 index 000000000000..f1a3d157ae62 --- /dev/null +++ b/litellm/integrations/opik.py @@ -0,0 +1,199 @@ +from typing import Any, Dict, Callable +import litellm +from litellm.types.utils import ModelResponse +import datetime + +""" +Opik Logger that logs LLM events to an Opik server +""" + +BLUE = "\033[94m" +RED = "\033[91m" +RESET = "\033[0m" + +def pformat(text: str, level: str="info") -> str: + """ + Format the text with colors. + + Args: + text: the text to format + info: the mode ("input" or "error") + + Returns a formatted string + """ + return "%s%s%s" % (BLUE if level == "info" else RED, text, RESET) + +def get_current_span_id(metadata: Dict[str, Any]) -> str: + from opik.opik_context import get_current_span_data + + if metadata.get("current_span_data"): + current_span_data = metadata.get("current_span_data") + else: + current_span_data = get_current_span_data() + + if current_span_data: + return current_span_data.id + else: + return None + + +def get_current_trace_id(metadata: Dict[str, Any]) -> str: + from opik.opik_context import get_current_trace_data + + if metadata.get("current_trace_data"): + current_trace_data = metadata.get("current_trace_data") + else: + current_trace_data = get_current_trace_data() + + if current_trace_data: + return current_trace_data.id + else: + return None + + +def model_response_to_dict(response_obj: ModelResponse) -> Dict: + """ + Convert the ModelResponse to a dictionary. + + Args: + response_obj: the ModelResponse from the model vendor, standardized + + Returns a dictionary + """ + return response_obj.to_dict() + +def redact_secrets(item): + """ + Recursively redact sensitive information + """ + if isinstance(item, dict): + redacted_dict = {} + for key, value in item.items(): + value = redact_secrets(value) + if key == "api_key": + value = "***REDACTED***" + redacted_dict[key] = value + return redacted_dict + else: + return item + + +class OpikLogger(): + """ + Opik Logger for logging events to an Opik Server + """ + def __init__(self): + try: + import opik + self.opik = opik + except ImportError: + self.opik = None + + def log_event( + self, + kwargs: Dict[str, Any], + response_obj: ModelResponse, + start_time: datetime.datetime, + end_time: datetime.datetime, + print_verbose: Callable, + ) -> None: + """ + Args: + kwargs: the request dictionary + response_obj: ModelResponse from LLM model + start_time: datetime + end_time: datetime + print_verbose: function used for printing + """ + if self.opik is None: + print_verbose(pformat("opik is not installed", "error")) + print_verbose(pformat("pip install opik")) + return + + if kwargs.get("stream", False): + print_verbose("opik stream logging") + if kwargs.get("complete_streaming_response"): + response_obj = kwargs["complete_streaming_response"] + elif kwargs.get("async_complete_streaming_response"): + response_obj = kwargs["async_complete_streaming_response"] + else: + print_verbose("opik skipping chunk; waiting for end...") + return + else: + print_verbose("opik non-stream logging") + + # These can be set in the metadata, or in environment: + workspace = None + project_name = None + host = None + # litellm metadata: + metadata = kwargs.get("litellm_params", {}).get("metadata", {}) + # ----- + litellm_opik_metadata = metadata.get("opik", {}) + # Opik specific: + workspace = litellm_opik_metadata.get("workspace", None) + project_name = litellm_opik_metadata.get("project_name", None) + host = litellm_opik_metadata.get("host", None) + current_span_id = get_current_span_id(litellm_opik_metadata) + current_trace_id = get_current_trace_id(litellm_opik_metadata) + opik_metadata = litellm_opik_metadata.get("metadata", None) + opik_tags = litellm_opik_metadata.get("tags", None) + + client = self.opik.Opik( + workspace=workspace, + project_name=project_name, + host=host, + ) + + span_name = "%s_%s_%s" % ( + response_obj.get("model", "unknown-model"), + response_obj.get("object", "unknown-object"), + response_obj.get("created", 0), + ) + trace_name = response_obj.get("object", "unknown type") + + input_data = redact_secrets(kwargs) + output_data = model_response_to_dict(response_obj) + metadata = opik_metadata or {} + metadata["created_from"] = "litellm" + if kwargs.get("custom_llm_provider"): + opik_tags.append(kwargs["custom_llm_provider"]) + if "object" in response_obj: + metadata["type"] = response_obj["object"] + if "model" in response_obj: + metadata["model"] = response_obj["model"] + if "response_cost" in kwargs: + metadata["cost"] = { + "total_tokens": kwargs["response_cost"], + "currency": "USD" + } + + if current_trace_id is not None: + print_verbose(pformat("opik trace found!")) + else: + print_verbose(pformat("new opik trace created!")) + trace = client.trace( + name=trace_name, + input=input_data, + output=output_data, + metadata=metadata, + start_time=start_time, + end_time=end_time, + tags=opik_tags, + ) + current_trace_id = trace.id + + span = client.span( + trace_id=current_trace_id, + parent_span_id=current_span_id, + name=span_name, + type="llm", + input=input_data, + output=output_data, + metadata=metadata, + usage=output_data.get("usage"), + start_time=start_time, + end_time=end_time, + tags=opik_tags, + ) + client.flush() diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index f3af2dcbdf7e..0d6ffd2ba109 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -52,6 +52,16 @@ ) from litellm.utils import ( _get_base_model_from_metadata, +<<<<<<< HEAD +======= + add_breadcrumb, + capture_exception, + opikLogger, + customLogger, + liteDebuggerClient, + logfireLogger, + lunaryLogger, +>>>>>>> f6a8d7894 (Added Opik logging and evaluation) print_verbose, prompt_token_calculator, ) @@ -61,7 +71,13 @@ from ..integrations.berrispend import BerriSpendLogger from ..integrations.braintrust_logging import BraintrustLogger from ..integrations.clickhouse import ClickhouseLogger +<<<<<<< HEAD from ..integrations.datadog.datadog import DataDogLogger +======= +from ..integrations.opik import OpikLogger +from ..integrations.custom_logger import CustomLogger +from ..integrations.datadog import DataDogLogger +>>>>>>> f6a8d7894 (Added Opik logging and evaluation) from ..integrations.dynamodb import DyanmoDBLogger from ..integrations.galileo import GalileoObserve from ..integrations.gcs_bucket import GCSBucketLogger @@ -122,6 +138,7 @@ berrispendLogger = None supabaseClient = None liteDebuggerClient = None +opikLogger = None callback_list: Optional[List[str]] = [] user_logger_fn = None additional_details: Optional[Dict[str, str]] = {} @@ -184,7 +201,7 @@ def set_cache(self, credentials: dict, service_name: str, logging_obj: Any) -> N class Logging: - global supabaseClient, liteDebuggerClient, promptLayerLogger, weightsBiasesLogger, logfireLogger, capture_exception, add_breadcrumb, lunaryLogger, logfireLogger, prometheusLogger, slack_app + global supabaseClient, liteDebuggerClient, promptLayerLogger, weightsBiasesLogger, logfireLogger, capture_exception, add_breadcrumb, lunaryLogger, logfireLogger, prometheusLogger, slack_app, opikLogger custom_pricing: bool = False stream_options = None @@ -1325,6 +1342,15 @@ def success_handler( print_verbose=print_verbose, callback_func=callback, ) + if callback == "opik": + print_verbose("reaches opik for logging!") + opikLogger.log_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + ) except Exception as e: print_verbose( @@ -2018,7 +2044,7 @@ def set_callbacks(callback_list, function_id=None): """ Globally sets the callback client """ - global sentry_sdk_instance, capture_exception, add_breadcrumb, posthog, slack_app, alerts_channel, traceloopLogger, athinaLogger, heliconeLogger, aispendLogger, berrispendLogger, supabaseClient, liteDebuggerClient, lunaryLogger, promptLayerLogger, langFuseLogger, customLogger, weightsBiasesLogger, logfireLogger, dynamoLogger, s3Logger, dataDogLogger, prometheusLogger, greenscaleLogger, openMeterLogger + global sentry_sdk_instance, capture_exception, add_breadcrumb, posthog, slack_app, alerts_channel, traceloopLogger, athinaLogger, heliconeLogger, aispendLogger, berrispendLogger, supabaseClient, liteDebuggerClient, lunaryLogger, promptLayerLogger, langFuseLogger, customLogger, weightsBiasesLogger, logfireLogger, dynamoLogger, s3Logger, dataDogLogger, prometheusLogger, greenscaleLogger, openMeterLogger, opikLogger try: for callback in callback_list: @@ -2118,6 +2144,8 @@ def set_callbacks(callback_list, function_id=None): liteDebuggerClient = LiteDebugger(email=litellm.email) else: liteDebuggerClient = LiteDebugger(email=str(uuid.uuid4())) + elif callback == "opik": + opikLogger = OpikLogger() elif callable(callback): customLogger = CustomLogger() except Exception as e: diff --git a/litellm/utils.py b/litellm/utils.py index 9d63e1151112..1a9958148f57 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -179,6 +179,7 @@ executor = ThreadPoolExecutor(max_workers=MAX_THREADS) sentry_sdk_instance = None capture_exception = None +opikLogger = None add_breadcrumb = None posthog = None slack_app = None diff --git a/tests/local_testing/test_opik.py b/tests/local_testing/test_opik.py new file mode 100644 index 000000000000..1a52e344c549 --- /dev/null +++ b/tests/local_testing/test_opik.py @@ -0,0 +1,162 @@ +import asyncio +import io +import os +import pytest +import sys +import litellm + +litellm.num_retries = 3 + +OPIK_API_KEY = os.environ.get("OPIK_API_KEY") +OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY") +ANTHROPIC_API_KEY = os.environ.get("ANTHROPIC_API_KEY") + +def get_test_name(): + return os.environ.get('PYTEST_CURRENT_TEST', "pytest") + +@pytest.mark.asyncio +@pytest.mark.skipif(OPENAI_API_KEY is None, reason="OPEN_API_KEY not found in env") +@pytest.mark.skipif(OPIK_API_KEY is None, reason="OPIK_API_KEY not found in env") +async def test_opik_with_router(): + litellm.set_verbose = True + litellm.success_callback = ["opik"] + model_list = [ + { + "model_name": "gpt-3.5-turbo", + "litellm_params": { + "model": "gpt-3.5-turbo", + "api_key": OPENAI_API_KEY, + }, + } + ] + router = litellm.Router(model_list=model_list) + response = await router.acompletion( + model="gpt-3.5-turbo", + messages=[ + {"role": "user", "content": "Why is Opik logging and evaluation important?"} + ], + metadata = { + "opik": { + "metadata": { + "test_name": get_test_name(), + }, + "tags": ["test"], + }, + }, + ) + assert response.usage.prompt_tokens == 16 + +@pytest.mark.skipif(ANTHROPIC_API_KEY is None, reason="ANTHROPIC_API_KEY not found in env") +@pytest.mark.skipif(OPIK_API_KEY is None, reason="OPIK_API_KEY not found in env") +def test_opik_completion_with_anthropic(): + litellm.set_verbose = True + litellm.success_callback = ["opik"] + response = litellm.completion( + model="claude-instant-1.2", + messages=[{"role": "user", "content": "Why is Opik logging and evaluation important?"}], + max_tokens=10, + temperature=0.2, + metadata = { + "opik": { + "metadata": { + "test_name": get_test_name(), + }, + "tags": ["test"], + }, + }, + ) + assert response.usage.prompt_tokens == 18 + +@pytest.mark.skipif(OPENAI_API_KEY is None, reason="OPEN_API_KEY not found in env") +@pytest.mark.skipif(OPIK_API_KEY is None, reason="OPIK_API_KEY not found in env") +def test_opik_with_openai(): + litellm.set_verbose = True + litellm.success_callback = ["opik"] + response = litellm.completion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "Why is Opik logging and evaluation important?"}], + max_tokens=10, + temperature=0.2, + metadata = { + "opik": { + "metadata": { + "test_name": get_test_name(), + }, + "tags": ["test"], + }, + }, + ) + assert response.usage.prompt_tokens == 16 + + +@pytest.mark.skipif(OPENAI_API_KEY is None, reason="OPEN_API_KEY not found in env") +@pytest.mark.skipif(OPIK_API_KEY is None, reason="OPIK_API_KEY not found in env") +def test_opik_with_openai_and_track(): + from opik import track, flush_tracker + from opik.opik_context import get_current_span_data, get_current_trace_data + + litellm.set_verbose = True + litellm.success_callback = ["opik"] + + @track() + def complete_function(input): + assert get_current_span_data() is not None + assert get_current_trace_data() is not None + response = litellm.completion( + model="gpt-3.5-turbo", + messages=[ + { + "content": input, + "role": "user" + }, + ], + metadata={ + "opik": { + "current_span_data": get_current_span_data(), + "current_trace_data": get_current_trace_data(), + "tags": ["test"], + "metadata": { + "test_name": get_test_name(), + }, + }, + }, + ) + return response.to_dict() + + response = complete_function("Why is Opik logging and evaluation important?") + flush_tracker() + assert response["usage"]["prompt_tokens"] == 16 + +@pytest.mark.skipif(OPENAI_API_KEY is None, reason="OPEN_API_KEY not found in env") +@pytest.mark.skipif(OPIK_API_KEY is None, reason="OPIK_API_KEY not found in env") +def test_opik_with_streaming_openai(): + from opik import track, flush_tracker + from opik.opik_context import get_current_trace_data, get_current_span_data + + litellm.set_verbose = True + litellm.success_callback = ["opik"] + + @track() + def streaming_function(input): + messages = [{"role": "user", "content": input}] + response = litellm.completion( + model="gpt-3.5-turbo", + messages=messages, + metadata = { + "opik": { + "current_span_data": get_current_span_data(), + "current_trace_data": get_current_trace_data(), + "metadata": { + "test_name": get_test_name(), + }, + "tags": ["test"], + }, + }, + stream=True, + ) + return response + + response = streaming_function("Why is Opik logging and evaluation important?") + chunks = list(response) + flush_tracker() + assert len(chunks) > 10 From 76289401e4f666dc5f9e35e8f5b17ff6a22b80a7 Mon Sep 17 00:00:00 2001 From: Douglas Blank Date: Fri, 13 Sep 2024 08:34:03 -0400 Subject: [PATCH 2/6] Updated doc examples --- docs/my-website/docs/observability/opik_integration.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/my-website/docs/observability/opik_integration.md b/docs/my-website/docs/observability/opik_integration.md index 5f56999f20da..de4a8a06622e 100644 --- a/docs/my-website/docs/observability/opik_integration.md +++ b/docs/my-website/docs/observability/opik_integration.md @@ -56,11 +56,11 @@ response = litellm.completion( ``` If you are using a streaming response, you need to surround the -call with Opik's `@track` and provide `current_span` and `current_trace`: +call with Opik's `@track` and provide `current_span_data` and `current_trace_data`: ```python from opik import track -from opik.opik_context import get_current_trace, get_current_span +from opik.opik_context import get_current_trace_data, get_current_span_data litellm.success_callback = ["opik"] @@ -72,8 +72,8 @@ def streaming_function(input): messages=messages, metadata = { "opik": { - "current_span": get_current_span(), - "current_trace": get_current_trace(), + "current_span_data": get_current_span_data(), + "current_trace_data": get_current_trace_data(), "tags": ["streaming-test"], }, }, From 64199e7430ef6e4742c50d316135fe2d02c8f607 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Fri, 13 Sep 2024 10:00:09 -0400 Subject: [PATCH 3/6] Default tags should be [] in case appending --- litellm/integrations/opik.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/integrations/opik.py b/litellm/integrations/opik.py index f1a3d157ae62..e5db7dee9da4 100644 --- a/litellm/integrations/opik.py +++ b/litellm/integrations/opik.py @@ -137,7 +137,7 @@ def log_event( current_span_id = get_current_span_id(litellm_opik_metadata) current_trace_id = get_current_trace_id(litellm_opik_metadata) opik_metadata = litellm_opik_metadata.get("metadata", None) - opik_tags = litellm_opik_metadata.get("tags", None) + opik_tags = litellm_opik_metadata.get("tags", []) client = self.opik.Opik( workspace=workspace, From acecfb9bce932a6c8ea383c42c9ef580d3ce0173 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Tue, 1 Oct 2024 13:35:52 -0400 Subject: [PATCH 4/6] WIP --- litellm/__init__.py | 1 + litellm/integrations/{ => opik}/opik.py | 94 ++++--------------------- 2 files changed, 14 insertions(+), 81 deletions(-) rename litellm/integrations/{ => opik}/opik.py (68%) diff --git a/litellm/__init__.py b/litellm/__init__.py index abc336f34cbd..1ff963ad7fb8 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -51,6 +51,7 @@ "braintrust", "arize", "gcs_bucket", + "opik", ] _known_custom_logger_compatible_callbacks: List = list( get_args(_custom_logger_compatible_callbacks_literal) diff --git a/litellm/integrations/opik.py b/litellm/integrations/opik/opik.py similarity index 68% rename from litellm/integrations/opik.py rename to litellm/integrations/opik/opik.py index e5db7dee9da4..028f568326c0 100644 --- a/litellm/integrations/opik.py +++ b/litellm/integrations/opik/opik.py @@ -1,94 +1,26 @@ -from typing import Any, Dict, Callable -import litellm -from litellm.types.utils import ModelResponse -import datetime - """ Opik Logger that logs LLM events to an Opik server """ -BLUE = "\033[94m" -RED = "\033[91m" -RESET = "\033[0m" - -def pformat(text: str, level: str="info") -> str: - """ - Format the text with colors. - - Args: - text: the text to format - info: the mode ("input" or "error") - - Returns a formatted string - """ - return "%s%s%s" % (BLUE if level == "info" else RED, text, RESET) - -def get_current_span_id(metadata: Dict[str, Any]) -> str: - from opik.opik_context import get_current_span_data - - if metadata.get("current_span_data"): - current_span_data = metadata.get("current_span_data") - else: - current_span_data = get_current_span_data() - - if current_span_data: - return current_span_data.id - else: - return None - - -def get_current_trace_id(metadata: Dict[str, Any]) -> str: - from opik.opik_context import get_current_trace_data - - if metadata.get("current_trace_data"): - current_trace_data = metadata.get("current_trace_data") - else: - current_trace_data = get_current_trace_data() - - if current_trace_data: - return current_trace_data.id - else: - return None - - -def model_response_to_dict(response_obj: ModelResponse) -> Dict: - """ - Convert the ModelResponse to a dictionary. - - Args: - response_obj: the ModelResponse from the model vendor, standardized - - Returns a dictionary - """ - return response_obj.to_dict() +from typing import Any, Dict, Callable +import datetime -def redact_secrets(item): - """ - Recursively redact sensitive information - """ - if isinstance(item, dict): - redacted_dict = {} - for key, value in item.items(): - value = redact_secrets(value) - if key == "api_key": - value = "***REDACTED***" - redacted_dict[key] = value - return redacted_dict - else: - return item +import litellm +from litellm.types.utils import ModelResponse +from litellm.integrations.custom_logger import CustomLogger +from .utils import ( + pformat, + get_current_span_id, + get_current_trace_id, + model_response_to_dict, + redact_secrets, +) -class OpikLogger(): +class OpikLogger(CustomLogger): """ Opik Logger for logging events to an Opik Server """ - def __init__(self): - try: - import opik - self.opik = opik - except ImportError: - self.opik = None - def log_event( self, kwargs: Dict[str, Any], From 8da01d939397e8d032fe79cb2f4428ca25fd867d Mon Sep 17 00:00:00 2001 From: Jacques Verre Date: Mon, 7 Oct 2024 19:23:17 +0100 Subject: [PATCH 5/6] Opik integration --- litellm/integrations/opik/utils.py | 70 ++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 litellm/integrations/opik/utils.py diff --git a/litellm/integrations/opik/utils.py b/litellm/integrations/opik/utils.py new file mode 100644 index 000000000000..e1512e520d34 --- /dev/null +++ b/litellm/integrations/opik/utils.py @@ -0,0 +1,70 @@ + +BLUE = "\033[94m" +RED = "\033[91m" +RESET = "\033[0m" + +def pformat(text: str, level: str="info") -> str: + """ + Format the text with colors. + + Args: + text: the text to format + info: the mode ("input" or "error") + + Returns a formatted string + """ + return "%s%s%s" % (BLUE if level == "info" else RED, text, RESET) + +def get_current_span_id(metadata: Dict[str, Any]) -> str: + from opik.opik_context import get_current_span_data + + if metadata.get("current_span_data"): + current_span_data = metadata.get("current_span_data") + else: + current_span_data = get_current_span_data() + + if current_span_data: + return current_span_data.id + else: + return None + + +def get_current_trace_id(metadata: Dict[str, Any]) -> str: + from opik.opik_context import get_current_trace_data + + if metadata.get("current_trace_data"): + current_trace_data = metadata.get("current_trace_data") + else: + current_trace_data = get_current_trace_data() + + if current_trace_data: + return current_trace_data.id + else: + return None + + +def model_response_to_dict(response_obj: ModelResponse) -> Dict: + """ + Convert the ModelResponse to a dictionary. + + Args: + response_obj: the ModelResponse from the model vendor, standardized + + Returns a dictionary + """ + return response_obj.to_dict() + +def redact_secrets(item): + """ + Recursively redact sensitive information + """ + if isinstance(item, dict): + redacted_dict = {} + for key, value in item.items(): + value = redact_secrets(value) + if key == "api_key": + value = "***REDACTED***" + redacted_dict[key] = value + return redacted_dict + else: + return item From 4dcc4d4ce96065cda2aae6e0d35ff80a05afc5c9 Mon Sep 17 00:00:00 2001 From: Jacques Verre Date: Mon, 7 Oct 2024 19:42:04 +0100 Subject: [PATCH 6/6] Opik integration --- litellm/integrations/opik/opik.py | 7 +++++++ litellm/integrations/opik/utils.py | 3 +++ litellm/litellm_core_utils/litellm_logging.py | 18 ++---------------- litellm/utils.py | 1 + 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/litellm/integrations/opik/opik.py b/litellm/integrations/opik/opik.py index 028f568326c0..ceacd27e334a 100644 --- a/litellm/integrations/opik/opik.py +++ b/litellm/integrations/opik/opik.py @@ -21,6 +21,13 @@ class OpikLogger(CustomLogger): """ Opik Logger for logging events to an Opik Server """ + def __init__(self): + try: + import opik + self.opik = opik + except ImportError: + self.opik = None + def log_event( self, kwargs: Dict[str, Any], diff --git a/litellm/integrations/opik/utils.py b/litellm/integrations/opik/utils.py index e1512e520d34..2f5e350ddec0 100644 --- a/litellm/integrations/opik/utils.py +++ b/litellm/integrations/opik/utils.py @@ -1,3 +1,6 @@ +from typing import Any, Dict + +from litellm.types.utils import ModelResponse BLUE = "\033[94m" RED = "\033[91m" diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index 0d6ffd2ba109..5e18620b70b7 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -52,16 +52,6 @@ ) from litellm.utils import ( _get_base_model_from_metadata, -<<<<<<< HEAD -======= - add_breadcrumb, - capture_exception, - opikLogger, - customLogger, - liteDebuggerClient, - logfireLogger, - lunaryLogger, ->>>>>>> f6a8d7894 (Added Opik logging and evaluation) print_verbose, prompt_token_calculator, ) @@ -71,13 +61,9 @@ from ..integrations.berrispend import BerriSpendLogger from ..integrations.braintrust_logging import BraintrustLogger from ..integrations.clickhouse import ClickhouseLogger -<<<<<<< HEAD -from ..integrations.datadog.datadog import DataDogLogger -======= -from ..integrations.opik import OpikLogger +from ..integrations.opik.opik import OpikLogger from ..integrations.custom_logger import CustomLogger -from ..integrations.datadog import DataDogLogger ->>>>>>> f6a8d7894 (Added Opik logging and evaluation) +from ..integrations.datadog.datadog import DataDogLogger from ..integrations.dynamodb import DyanmoDBLogger from ..integrations.galileo import GalileoObserve from ..integrations.gcs_bucket import GCSBucketLogger diff --git a/litellm/utils.py b/litellm/utils.py index 1a9958148f57..ca6add7eb17f 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -192,6 +192,7 @@ weightsBiasesLogger = None customLogger = None langFuseLogger = None +opikLogger = None openMeterLogger = None lagoLogger = None dataDogLogger = None