diff --git a/portkey_ai/api_resources/base_client.py b/portkey_ai/api_resources/base_client.py index 19d370e8..cd25194c 100644 --- a/portkey_ai/api_resources/base_client.py +++ b/portkey_ai/api_resources/base_client.py @@ -21,7 +21,7 @@ from portkey_ai.api_resources.apis.create_headers import createHeaders from .global_constants import PORTKEY_HEADER_PREFIX, DEFAULT_CONNECTION_LIMITS -from .utils import remove_empty_values, Options, set_base_url +from .utils import remove_empty_values, Options, set_base_url, create_model_instance from .exceptions import ( APIStatusError, APITimeoutError, @@ -177,7 +177,7 @@ def __init__( **kwargs, ) - self.allHeaders = self._build_headers(Options.construct()) + self.allHeaders = self._build_headers(create_model_instance(Options)) self._client = http_client or httpx.Client( base_url=self.base_url, headers={ @@ -508,7 +508,7 @@ def _construct_generate_options( params: Mapping[str, str], headers: Mapping[str, str], ) -> Options: - opts = Options.construct() + opts = create_model_instance(Options) opts.method = method opts.url = url json_body = body @@ -528,7 +528,7 @@ def _construct( params: Mapping[str, str], headers: Mapping[str, str], ) -> Options: - opts = Options.construct() + opts = create_model_instance(Options) opts.method = method opts.url = url opts.files = files @@ -890,7 +890,7 @@ def __init__( **kwargs, ) - self.allHeaders = self._build_headers(Options.construct()) + self.allHeaders = self._build_headers(create_model_instance(Options)) self._client = http_client or AsyncHttpxClientWrapper( base_url=self.base_url, headers={ @@ -1221,7 +1221,7 @@ async def _construct_generate_options( params: Mapping[str, str], headers: Mapping[str, str], ) -> Options: - opts = Options.construct() + opts = create_model_instance(Options) opts.method = method opts.url = url json_body = body @@ -1241,7 +1241,7 @@ async def _construct( params: Mapping[str, str], headers: Mapping[str, str], ) -> Options: - opts = Options.construct() + opts = create_model_instance(Options) opts.method = method opts.url = url opts.files = files diff --git a/portkey_ai/api_resources/utils.py b/portkey_ai/api_resources/utils.py index 776c96d5..40967730 100644 --- a/portkey_ai/api_resources/utils.py +++ b/portkey_ai/api_resources/utils.py @@ -1,5 +1,7 @@ -import os +from __future__ import annotations + import json +import os from typing import List, Dict, Any, Optional, Union, Mapping, Literal, TypeVar, cast from enum import Enum, EnumMeta from typing_extensions import TypedDict, NotRequired @@ -509,3 +511,19 @@ def set_base_url(base_url, api_key): return env_base_url api_key = api_key or os.environ.get(PORTKEY_API_KEY_ENV) return PORTKEY_BASE_URL if api_key else LOCAL_BASE_URL + + +def create_model_instance(model_class): + """ + Create a model instance that's compatible with both Pydantic v1 and v2. + + This function provides backward compatibility for the transition from Pydantic v1 + to Pydantic v2. In Pydantic v1, the method was called `construct()`, while in + Pydantic v2, it was renamed to `model_construct()`. + """ + try: + # Try Pydantic v2 method first + return model_class.model_construct() + except AttributeError: + # Fall back to Pydantic v1 method + return model_class.construct()