From 8bf27f8177241e3bd27b53740584134ce65260e0 Mon Sep 17 00:00:00 2001
From: Peanut <vvanglro@gmail.com>
Date: Thu, 1 Feb 2024 17:07:03 +0800
Subject: [PATCH 1/4] perf: TypeAdapter instantiated once

---
 src/openai/_models.py | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/openai/_models.py b/src/openai/_models.py
index 48d5624f64..ee5de9265c 100644
--- a/src/openai/_models.py
+++ b/src/openai/_models.py
@@ -363,7 +363,12 @@ class GenericModel(BaseGenericModel, BaseModel):
 
 
 if PYDANTIC_V2:
-    from pydantic import TypeAdapter
+    from functools import lru_cache
+    from pydantic import TypeAdapter as PyTypeAdapter
+
+    @lru_cache
+    def TypeAdapter(type_: type[_T]) -> PyTypeAdapter:
+        return PyTypeAdapter(type_)
 
     def _validate_non_model_type(*, type_: type[_T], value: object) -> _T:
         return TypeAdapter(type_).validate_python(value)

From 54829aff6c68be16e47180716eea457e6104e040 Mon Sep 17 00:00:00 2001
From: Peanut <vvanglro@gmail.com>
Date: Fri, 2 Feb 2024 03:09:05 +0000
Subject: [PATCH 2/4] style: check ruff

---
 src/openai/_models.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/openai/_models.py b/src/openai/_models.py
index ee5de9265c..f705f62b4f 100644
--- a/src/openai/_models.py
+++ b/src/openai/_models.py
@@ -364,6 +364,7 @@ class GenericModel(BaseGenericModel, BaseModel):
 
 if PYDANTIC_V2:
     from functools import lru_cache
+
     from pydantic import TypeAdapter as PyTypeAdapter
 
     @lru_cache

From 9070ce2a01198c383320b7000003fcfcfcb6b410 Mon Sep 17 00:00:00 2001
From: Peanut <vvanglro@gmail.com>
Date: Fri, 23 Feb 2024 03:31:01 +0000
Subject: [PATCH 3/4] style: typecheck

---
 src/openai/_models.py | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/openai/_models.py b/src/openai/_models.py
index f705f62b4f..dafea4e71e 100644
--- a/src/openai/_models.py
+++ b/src/openai/_models.py
@@ -367,9 +367,11 @@ class GenericModel(BaseGenericModel, BaseModel):
 
     from pydantic import TypeAdapter as PyTypeAdapter
 
-    @lru_cache
-    def TypeAdapter(type_: type[_T]) -> PyTypeAdapter:
+    def TypeAdapter(type_: type[_T]) -> PyTypeAdapter[_T]:
         return PyTypeAdapter(type_)
+    
+    if not TYPE_CHECKING:
+        TypeAdapter = lru_cache(TypeAdapter)
 
     def _validate_non_model_type(*, type_: type[_T], value: object) -> _T:
         return TypeAdapter(type_).validate_python(value)

From 6de9041ea50aa85f80445447a2dd850148ae0639 Mon Sep 17 00:00:00 2001
From: Peanut <vvanglro@gmail.com>
Date: Mon, 18 Mar 2024 15:18:02 +0000
Subject: [PATCH 4/4] fix: import, type check

---
 src/openai/_models.py | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/src/openai/_models.py b/src/openai/_models.py
index 51beabdc94..12eda7bbfd 100644
--- a/src/openai/_models.py
+++ b/src/openai/_models.py
@@ -3,6 +3,7 @@
 import inspect
 from typing import TYPE_CHECKING, Any, Type, Union, Generic, TypeVar, Callable, cast
 from datetime import date, datetime
+from functools import lru_cache
 from typing_extensions import (
     Unpack,
     Literal,
@@ -363,15 +364,12 @@ class GenericModel(BaseGenericModel, BaseModel):
 
 
 if PYDANTIC_V2:
-    from functools import lru_cache
 
-    from pydantic import TypeAdapter as PyTypeAdapter
-
-    def TypeAdapter(type_: type[_T]) -> PyTypeAdapter[_T]:
-        return PyTypeAdapter(type_)
-    
-    if not TYPE_CHECKING:
-        TypeAdapter = lru_cache(TypeAdapter)
+    if TYPE_CHECKING:
+      from pydantic import TypeAdapter
+    else:
+      from pydantic import TypeAdapter as _TypeAdapter
+      TypeAdapter = lru_cache(_TypeAdapter)   
 
     def _validate_non_model_type(*, type_: type[_T], value: object) -> _T:
         return TypeAdapter(type_).validate_python(value)