Spaces:
Paused
Paused
| # duplicate -> https://github.com/confident-ai/deepeval/blob/main/deepeval/confident/api.py | |
| import logging | |
| import httpx | |
| from enum import Enum | |
| from litellm._logging import verbose_logger | |
| DEEPEVAL_BASE_URL = "https://deepeval.confident-ai.com" | |
| DEEPEVAL_BASE_URL_EU = "https://eu.deepeval.confident-ai.com" | |
| API_BASE_URL = "https://api.confident-ai.com" | |
| API_BASE_URL_EU = "https://eu.api.confident-ai.com" | |
| retryable_exceptions = httpx.HTTPError | |
| from litellm.llms.custom_httpx.http_handler import ( | |
| HTTPHandler, | |
| get_async_httpx_client, | |
| httpxSpecialProvider, | |
| ) | |
| def log_retry_error(details): | |
| exception = details.get("exception") | |
| tries = details.get("tries") | |
| if exception: | |
| logging.error(f"Confident AI Error: {exception}. Retrying: {tries} time(s)...") | |
| else: | |
| logging.error(f"Retrying: {tries} time(s)...") | |
| class HttpMethods(Enum): | |
| GET = "GET" | |
| POST = "POST" | |
| DELETE = "DELETE" | |
| PUT = "PUT" | |
| class Endpoints(Enum): | |
| DATASET_ENDPOINT = "/v1/dataset" | |
| TEST_RUN_ENDPOINT = "/v1/test-run" | |
| TRACING_ENDPOINT = "/v1/tracing" | |
| EVENT_ENDPOINT = "/v1/event" | |
| FEEDBACK_ENDPOINT = "/v1/feedback" | |
| PROMPT_ENDPOINT = "/v1/prompt" | |
| RECOMMEND_ENDPOINT = "/v1/recommend-metrics" | |
| EVALUATE_ENDPOINT = "/evaluate" | |
| GUARD_ENDPOINT = "/guard" | |
| GUARDRAILS_ENDPOINT = "/guardrails" | |
| BASELINE_ATTACKS_ENDPOINT = "/generate-baseline-attacks" | |
| class Api: | |
| def __init__(self, api_key: str, base_url=None): | |
| self.api_key = api_key | |
| self._headers = { | |
| "Content-Type": "application/json", | |
| # "User-Agent": "Python/Requests", | |
| "CONFIDENT_API_KEY": api_key, | |
| } | |
| # using the global non-eu variable for base url | |
| self.base_api_url = base_url or API_BASE_URL | |
| self.sync_http_handler = HTTPHandler() | |
| self.async_http_handler = get_async_httpx_client( | |
| llm_provider=httpxSpecialProvider.LoggingCallback | |
| ) | |
| def _http_request( | |
| self, method: str, url: str, headers=None, json=None, params=None | |
| ): | |
| if method != "POST": | |
| raise Exception("Only POST requests are supported") | |
| try: | |
| self.sync_http_handler.post( | |
| url=url, | |
| headers=headers, | |
| json=json, | |
| params=params, | |
| ) | |
| except httpx.HTTPStatusError as e: | |
| raise Exception(f"DeepEval logging error: {e.response.text}") | |
| except Exception as e: | |
| raise e | |
| def send_request( | |
| self, method: HttpMethods, endpoint: Endpoints, body=None, params=None | |
| ): | |
| url = f"{self.base_api_url}{endpoint.value}" | |
| res = self._http_request( | |
| method=method.value, | |
| url=url, | |
| headers=self._headers, | |
| json=body, | |
| params=params, | |
| ) | |
| if res.status_code == 200: | |
| try: | |
| return res.json() | |
| except ValueError: | |
| return res.text | |
| else: | |
| verbose_logger.debug(res.json()) | |
| raise Exception(res.json().get("error", res.text)) | |
| async def a_send_request( | |
| self, method: HttpMethods, endpoint: Endpoints, body=None, params=None | |
| ): | |
| if method != HttpMethods.POST: | |
| raise Exception("Only POST requests are supported") | |
| url = f"{self.base_api_url}{endpoint.value}" | |
| try: | |
| await self.async_http_handler.post( | |
| url=url, | |
| headers=self._headers, | |
| json=body, | |
| params=params, | |
| ) | |
| except httpx.HTTPStatusError as e: | |
| raise Exception(f"DeepEval logging error: {e.response.text}") | |
| except Exception as e: | |
| raise e | |