Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions portkey_ai/api_resources/base_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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={
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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={
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
20 changes: 19 additions & 1 deletion portkey_ai/api_resources/utils.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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()