From 4064bfc6dd6c1e6bd9253cd9b4bc57c97a5b6ef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacques=20Verr=C3=A9?= Date: Thu, 10 Oct 2024 13:57:50 +0100 Subject: [PATCH] [Feat] Observability integration - Opik by Comet (#6062) * Added Opik logging and evaluation * Updated doc examples * Default tags should be [] in case appending * WIP * Work in progress * Opik integration * Opik integration * Revert changes on litellm_logging.py * Updated Opik integration for synchronous API calls * Updated Opik documentation --------- Co-authored-by: Douglas Blank Co-authored-by: Doug Blank --- .../docs/observability/opik_integration.md | 95 ++++++ docs/my-website/img/opik.png | Bin 0 -> 133383 bytes docs/my-website/sidebars.js | 1 + litellm/__init__.py | 1 + litellm/integrations/opik/opik.py | 308 ++++++++++++++++++ litellm/integrations/opik/utils.py | 106 ++++++ tests/local_testing/test_opik.py | 175 ++++++++++ 7 files changed, 686 insertions(+) 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/opik.py create mode 100644 litellm/integrations/opik/utils.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 000000000..d8075c70e --- /dev/null +++ b/docs/my-website/docs/observability/opik_integration.md @@ -0,0 +1,95 @@ +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 + +You can learn more about setting up Opik in the [Opik quickstart guide](https://www.comet.com/docs/opik/quickstart/). You can also learn more about self-hosting Opik in our [self-hosting guide](https://www.comet.com/docs/opik/self-host/local_deployment). + +## Quick Start +Use just 4 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 +from litellm.integrations.opik.opik import OpikLogger +import litellm + +opik_logger = OpikLogger() +litellm.callbacks = [opik_logger] +``` + +Full examples: + +```python +from litellm.integrations.opik.opik import OpikLogger +import litellm +import os + +# Configure the Opik API key or call opik.configure() +os.environ["OPIK_API_KEY"] = "" +os.environ["OPIK_WORKSPACE"] = "" + +# 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) +opik_logger = OpikLogger() +litellm.callbacks = [opik_logger] + +# 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 liteLLM within a function tracked using Opik's `@track` decorator, +you will need provide the `current_span_data` field in the metadata attribute +so that the LLM call is assigned to the correct trace: + +```python +from opik import track +from opik.opik_context import get_current_span_data +from litellm.integrations.opik.opik import OpikLogger +import litellm + +opik_logger = OpikLogger() +litellm.callbacks = [opik_logger] + +@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(), + "tags": ["streaming-test"], + }, + } + ) + 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 6389db9a2..0ab40a1c5 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -293,6 +293,7 @@ const sidebars = { "observability/greenscale_integration", "observability/supabase_integration", `observability/telemetry`, + "observability/opik_integration", ], }, { diff --git a/litellm/__init__.py b/litellm/__init__.py index 2f8ae7cde..55276570b 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -52,6 +52,7 @@ _custom_logger_compatible_callbacks_literal = Literal[ "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/opik.py b/litellm/integrations/opik/opik.py new file mode 100644 index 000000000..5cb15b5bc --- /dev/null +++ b/litellm/integrations/opik/opik.py @@ -0,0 +1,308 @@ +""" +Opik Logger that logs LLM events to an Opik server +""" + +from typing import Dict, List +import json + +from litellm._logging import verbose_logger +import traceback + +from .utils import ( + get_opik_config_variable, + create_uuid7, + create_usage_object, + get_traces_and_spans_from_payload +) + +import asyncio +from litellm.llms.custom_httpx.http_handler import ( + get_async_httpx_client, + _get_httpx_client, + httpxSpecialProvider, +) + +from litellm.integrations.custom_batch_logger import CustomBatchLogger + +class OpikLogger(CustomBatchLogger): + """ + Opik Logger for logging events to an Opik Server + """ + + def __init__(self, **kwargs): + self.async_httpx_client = get_async_httpx_client( + llm_provider=httpxSpecialProvider.LoggingCallback + ) + self.sync_httpx_client = _get_httpx_client() + + self.opik_project_name = get_opik_config_variable( + "project_name", + user_value=kwargs.get("project_name", None), + default_value="Default Project" + ) + + opik_base_url = get_opik_config_variable( + "url_override", + user_value=kwargs.get("url", None), + default_value="https://www.comet.com/opik/api" + ) + opik_api_key = get_opik_config_variable( + "api_key", + user_value=kwargs.get("api_key", None), + default_value=None + ) + opik_workspace = get_opik_config_variable( + "workspace", + user_value=kwargs.get("workspace", None), + default_value=None + ) + + self.trace_url = f"{opik_base_url}/v1/private/traces/batch" + self.span_url = f"{opik_base_url}/v1/private/spans/batch" + + self.headers = {} + if opik_workspace: + self.headers["Comet-Workspace"] = opik_workspace + + if opik_api_key: + self.headers["authorization"] = opik_api_key + + try: + asyncio.create_task(self.periodic_flush()) + self.flush_lock = asyncio.Lock() + except Exception as e: + verbose_logger.debug( + f"OpikLogger - Asynchronous processing not initialized as we are not running in an async context" + ) + self.flush_lock = None + + super().__init__(**kwargs, flush_lock=self.flush_lock) + + async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): + try: + opik_payload = self._create_opik_payload( + kwargs=kwargs, + response_obj=response_obj, + start_time=start_time, + end_time=end_time + ) + + self.log_queue.extend(opik_payload) + verbose_logger.debug(f"OpikLogger added event to log_queue - Will flush in {self.flush_interval} seconds...") + + if len(self.log_queue) >= self.batch_size: + verbose_logger.debug("OpikLogger - Flushing batch") + await self.flush_queue() + except Exception as e: + verbose_logger.exception( + f"OpikLogger failed to log success event - {str(e)}\n{traceback.format_exc()}" + ) + + def _sync_send(self, url: str, headers: Dict[str, str], batch: List[Dict]): + try: + response = self.sync_httpx_client.post( + url=url, + headers=headers, + json=batch + ) + response.raise_for_status() + if response.status_code != 204: + raise Exception( + f"Response from opik API status_code: {response.status_code}, text: {response.text}" + ) + except Exception as e: + verbose_logger.exception( + f"OpikLogger failed to send batch - {str(e)}\n{traceback.format_exc()}" + ) + + def log_success_event(self, kwargs, response_obj, start_time, end_time): + try: + opik_payload = self._create_opik_payload( + kwargs=kwargs, + response_obj=response_obj, + start_time=start_time, + end_time=end_time + ) + + traces, spans = get_traces_and_spans_from_payload(opik_payload) + if len(traces) > 0: + self._sync_send(self.trace_url, self.headers, {"traces": traces}) + if len(spans) > 0: + self._sync_send(self.span_url, self.headers, {"spans": spans}) + except Exception as e: + verbose_logger.exception( + f"OpikLogger failed to log success event - {str(e)}\n{traceback.format_exc()}" + ) + + async def _submit_batch(self, url: str, headers: Dict[str, str], batch: List[Dict]): + try: + response = await self.async_httpx_client.post( + url=url, + headers=headers, + json=batch + ) + response.raise_for_status() + + if response.status_code >= 300: + verbose_logger.error( + f"OpikLogger - Error: {response.status_code} - {response.text}" + ) + else: + verbose_logger.debug( + f"OpikLogger - {len(self.log_queue)} Opik events submitted" + ) + except Exception as e: + verbose_logger.exception( + f"OpikLogger failed to send batch - {str(e)}\n{traceback.format_exc()}" + ) + + def _create_opik_headers(self): + headers = {} + if self.opik_workspace: + headers["Comet-Workspace"] = self.opik_workspace + + if self.opik_api_key: + headers["authorization"] = self.opik_api_key + return headers + + + async def async_send_batch(self): + verbose_logger.exception("Calling async_send_batch") + if not self.log_queue: + return + + # Split the log_queue into traces and spans + traces, spans = get_traces_and_spans_from_payload(self.log_queue) + + # Send trace batch + if len(traces) > 0: + await self._submit_batch(self.trace_url, self.headers, {"traces": traces}) + if len(spans) > 0: + await self._submit_batch(self.span_url, self.headers, {"spans": spans}) + + + def _create_opik_payload(self, kwargs, response_obj, start_time, end_time) -> List[Dict]: + + + # Get metadata + _litellm_params = kwargs.get("litellm_params", {}) or {} + litellm_params_metadata = _litellm_params.get("metadata", {}) or {} + + # Extract opik metadata + litellm_opik_metadata = litellm_params_metadata.get("opik", {}) + verbose_logger.debug(f"litellm_opik_metadata - {json.dumps(litellm_opik_metadata, default=str)}") + project_name = litellm_opik_metadata.get("project_name", self.opik_project_name) + + # Extract trace_id and parent_span_id + current_span_data = litellm_opik_metadata.get("current_span_data", None) + if isinstance(current_span_data, dict): + trace_id = current_span_data.get("trace_id", None) + parent_span_id = current_span_data.get("id", None) + elif current_span_data: + trace_id = current_span_data.trace_id + parent_span_id = current_span_data.id + else: + trace_id = None + parent_span_id = None + # Create Opik tags + opik_tags = litellm_opik_metadata.get("tags", []) + if kwargs.get("custom_llm_provider"): + opik_tags.append(kwargs["custom_llm_provider"]) + + # Use standard_logging_object to create metadata and input/output data + standard_logging_object = kwargs.get("standard_logging_object", None) + if standard_logging_object is None: + verbose_logger.debug("OpikLogger skipping event; no standard_logging_object found") + return [] + + # Create input and output data + input_data = standard_logging_object.get("messages", {}) + output_data = standard_logging_object.get("response", {}) + + # Create usage object + usage = create_usage_object(response_obj["usage"]) + + # Define span and trace names + 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") + + # Create metadata object, we add the opik metadata first and then + # update it with the standard_logging_object metadata + metadata = litellm_opik_metadata + if "current_span_data" in metadata: + del metadata["current_span_data"] + metadata["created_from"] = "litellm" + + metadata.update(standard_logging_object.get("metadata", {})) + if "call_type" in standard_logging_object: + metadata["type"] = standard_logging_object["call_type"] + if "status" in standard_logging_object: + metadata["status"] = standard_logging_object["status"] + if "response_cost" in kwargs: + metadata["cost"] = { + "total_tokens": kwargs["response_cost"], + "currency": "USD" + } + if "response_cost_failure_debug_info" in kwargs: + metadata["response_cost_failure_debug_info"] = kwargs["response_cost_failure_debug_info"] + if "model_map_information" in standard_logging_object: + metadata["model_map_information"] = standard_logging_object["model_map_information"] + if "model" in standard_logging_object: + metadata["model"] = standard_logging_object["model"] + if "model_id" in standard_logging_object: + metadata["model_id"] = standard_logging_object["model_id"] + if "model_group" in standard_logging_object: + metadata["model_group"] = standard_logging_object["model_group"] + if "api_base" in standard_logging_object: + metadata["api_base"] = standard_logging_object["api_base"] + if "cache_hit" in standard_logging_object: + metadata["cache_hit"] = standard_logging_object["cache_hit"] + if "saved_cache_cost" in standard_logging_object: + metadata["saved_cache_cost"] = standard_logging_object["saved_cache_cost"] + if "error_str" in standard_logging_object: + metadata["error_str"] = standard_logging_object["error_str"] + if "model_parameters" in standard_logging_object: + metadata["model_parameters"] = standard_logging_object["model_parameters"] + if "hidden_params" in standard_logging_object: + metadata["hidden_params"] = standard_logging_object["hidden_params"] + + payload = [] + if trace_id is None: + trace_id = create_uuid7() + verbose_logger.debug(f"OpikLogger creating payload for trace with id {trace_id}") + + payload.append({ + "project_name": project_name, + "id": trace_id, + "name": trace_name, + "start_time": start_time.isoformat() + "Z", + "end_time": end_time.isoformat() + "Z", + "input": input_data, + "output": output_data, + "metadata": metadata, + "tags": opik_tags, + }) + + span_id = create_uuid7() + verbose_logger.debug(f"OpikLogger creating payload for trace with id {trace_id} and span with id {span_id}") + payload.append({ + "id": span_id, + "project_name": project_name, + "trace_id": trace_id, + "parent_span_id": parent_span_id, + "name": span_name, + "type": "llm", + "start_time": start_time.isoformat() + "Z", + "end_time": end_time.isoformat() + "Z", + "input": input_data, + "output": output_data, + "metadata": metadata, + "tags": opik_tags, + "usage": usage + }) + verbose_logger.debug(f"Payload: {payload}") + return payload diff --git a/litellm/integrations/opik/utils.py b/litellm/integrations/opik/utils.py new file mode 100644 index 000000000..39810de1f --- /dev/null +++ b/litellm/integrations/opik/utils.py @@ -0,0 +1,106 @@ +import os +import time +from typing import Optional, Final, Dict, List +import configparser +from litellm.types.utils import ModelResponse + +CONFIG_FILE_PATH_DEFAULT: Final[str] = "~/.opik.config" + +def create_uuid7(): + ns = time.time_ns() + last = [0, 0, 0, 0] + + # Simple uuid7 implementation + sixteen_secs = 16_000_000_000 + t1, rest1 = divmod(ns, sixteen_secs) + t2, rest2 = divmod(rest1 << 16, sixteen_secs) + t3, _ = divmod(rest2 << 12, sixteen_secs) + t3 |= 7 << 12 # Put uuid version in top 4 bits, which are 0 in t3 + + # The next two bytes are an int (t4) with two bits for + # the variant 2 and a 14 bit sequence counter which increments + # if the time is unchanged. + if t1 == last[0] and t2 == last[1] and t3 == last[2]: + # Stop the seq counter wrapping past 0x3FFF. + # This won't happen in practice, but if it does, + # uuids after the 16383rd with that same timestamp + # will not longer be correctly ordered but + # are still unique due to the 6 random bytes. + if last[3] < 0x3FFF: + last[3] += 1 + else: + last[:] = (t1, t2, t3, 0) + t4 = (2 << 14) | last[3] # Put variant 0b10 in top two bits + + # Six random bytes for the lower part of the uuid + rand = os.urandom(6) + return f"{t1:>08x}-{t2:>04x}-{t3:>04x}-{t4:>04x}-{rand.hex()}" + +def _read_opik_config_file() -> Dict[str, str]: + config_path = os.path.expanduser(CONFIG_FILE_PATH_DEFAULT) + + config = configparser.ConfigParser() + config.read(config_path) + + config_values = { + section: dict(config.items(section)) for section in config.sections() + } + + if "opik" in config_values: + return config_values["opik"] + + return {} + +def _get_env_variable(key: str) -> str: + env_prefix = "opik_" + return os.getenv((env_prefix + key).upper(), None) + +def get_opik_config_variable( + key: str, + user_value: Optional[str] = None, + default_value: Optional[str] = None + ) -> str: + """ + Get the configuration value of a variable, order priority is: + 1. user provided value + 2. environment variable + 3. Opik configuration file + 4. default value + """ + # Return user provided value if it is not None + if user_value is not None: + return user_value + + # Return environment variable if it is not None + env_value = _get_env_variable(key) + if env_value is not None: + return env_value + + # Return value from Opik configuration file if it is not None + config_values = _read_opik_config_file() + + if key in config_values: + return config_values[key] + + # Return default value if it is not None + return default_value + +def create_usage_object(usage): + usage_dict = {} + + if usage.completion_tokens is not None: + usage_dict["completion_tokens"] = usage.completion_tokens + if usage.prompt_tokens is not None: + usage_dict["prompt_tokens"] = usage.prompt_tokens + if usage.total_tokens is not None: + usage_dict["total_tokens"] = usage.total_tokens + return usage_dict + +def _remove_nulls(x): + x_ = {k:v for k,v in x.items() if v is not None} + return x_ + +def get_traces_and_spans_from_payload(payload: List): + traces = [_remove_nulls(x) for x in payload if "type" not in x] + spans = [_remove_nulls(x) for x in payload if "type" in x] + return traces, spans diff --git a/tests/local_testing/test_opik.py b/tests/local_testing/test_opik.py new file mode 100644 index 000000000..62c17fbb2 --- /dev/null +++ b/tests/local_testing/test_opik.py @@ -0,0 +1,175 @@ +import io +import os +import sys + +sys.path.insert(0, os.path.abspath("../..")) + +import asyncio +import logging + +import pytest + +import litellm +from litellm._logging import verbose_logger +from unittest.mock import AsyncMock, Mock + +verbose_logger.setLevel(logging.DEBUG) + +litellm.set_verbose = True +import time + +@pytest.mark.asyncio +async def test_opik_logging_http_request(): + """ + - Test that HTTP requests are made to Opik + - Traces and spans are batched correctly + """ + try: + from litellm.integrations.opik.opik import OpikLogger + + os.environ["OPIK_URL_OVERRIDE"] = "https://fake.comet.com/opik/api" + os.environ["OPIK_API_KEY"] = "anything" + os.environ["OPIK_WORKSPACE"] = "anything" + + # Initialize OpikLogger + test_opik_logger = OpikLogger() + + litellm.callbacks = [test_opik_logger] + test_opik_logger.batch_size = 12 + litellm.set_verbose = True + + # Create a mock for the async_client's post method + mock_post = AsyncMock() + mock_post.return_value.status_code = 202 + mock_post.return_value.text = "Accepted" + test_opik_logger.async_httpx_client.post = mock_post + + # Make multiple calls to ensure we don't hit the batch size + for _ in range(5): + response = await litellm.acompletion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "Test message"}], + max_tokens=10, + temperature=0.2, + mock_response="This is a mock response", + ) + await asyncio.sleep(1) + + # Check batching of events and that the queue contains 5 trace events and 5 span events + assert mock_post.called == False, "HTTP request was made but events should have been batched" + assert len(test_opik_logger.log_queue) == 10 + + # Now make calls to exceed the batch size + for _ in range(3): + response = await litellm.acompletion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "Test message"}], + max_tokens=10, + temperature=0.2, + mock_response="This is a mock response", + ) + + # Wait a short time for any asynchronous operations to complete + await asyncio.sleep(1) + + # Check that the queue was flushed after exceeding batch size + assert len(test_opik_logger.log_queue) < test_opik_logger.batch_size + + # Check that the data has been sent when it goes above the flush interval + await asyncio.sleep(test_opik_logger.flush_interval) + assert len(test_opik_logger.log_queue) == 0 + + # Clean up + for cb in litellm.callbacks: + if isinstance(cb, OpikLogger): + await cb.async_httpx_client.client.aclose() + + except Exception as e: + pytest.fail(f"Error occurred: {e}") + +def test_sync_opik_logging_http_request(): + """ + - Test that HTTP requests are made to Opik + - Traces and spans are batched correctly + """ + try: + from litellm.integrations.opik.opik import OpikLogger + + os.environ["OPIK_URL_OVERRIDE"] = "https://fake.comet.com/opik/api" + os.environ["OPIK_API_KEY"] = "anything" + os.environ["OPIK_WORKSPACE"] = "anything" + + # Initialize OpikLogger + test_opik_logger = OpikLogger() + + litellm.callbacks = [test_opik_logger] + litellm.set_verbose = True + + # Create a mock for the clients's post method + mock_post = Mock() + mock_post.return_value.status_code = 204 + mock_post.return_value.text = "Accepted" + test_opik_logger.sync_httpx_client.post = mock_post + + # Make multiple calls to ensure we don't hit the batch size + for _ in range(5): + response = litellm.completion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "Test message"}], + max_tokens=10, + temperature=0.2, + mock_response="This is a mock response", + ) + + # Need to wait for a short amount of time as the log_success callback is called in a different thread + time.sleep(1) + + # Check that 5 spans and 5 traces were sent + assert mock_post.call_count == 10, f"Expected 10 HTTP requests, but got {mock_post.call_count}" + + except Exception as e: + pytest.fail(f"Error occurred: {e}") + +@pytest.mark.asyncio +@pytest.mark.skip(reason="local-only test, to test if everything works fine.") +async def test_opik_logging(): + try: + from litellm.integrations.opik.opik import OpikLogger + + # Initialize OpikLogger + test_opik_logger = OpikLogger() + litellm.callbacks = [test_opik_logger] + litellm.set_verbose = True + + # Log a chat completion call + response = await litellm.acompletion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "What LLM are you ?"}], + max_tokens=10, + temperature=0.2, + metadata={"opik": {"custom_field": "custom_value"}} + ) + print("Non-streaming response:", response) + + # Log a streaming completion call + stream_response = await litellm.acompletion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "Stream = True - What llm are you ?"}], + max_tokens=10, + temperature=0.2, + stream=True, + metadata={"opik": {"custom_field": "custom_value"}} + ) + print("Streaming response:") + async for chunk in stream_response: + print(chunk.choices[0].delta.content, end='', flush=True) + print() # New line after streaming response + + await asyncio.sleep(2) + + assert len(test_opik_logger.log_queue) == 4 + + await asyncio.sleep(test_opik_logger.flush_interval + 1) + assert len(test_opik_logger.log_queue) == 0 + except Exception as e: + pytest.fail(f"Error occurred: {e}")