44"""
55from __future__ import annotations
66
7- import typing_extensions
8- from openai import BaseModel , NOT_GIVEN
9- from openai ._types import NotGiven
10- from typing import Any , Optional , Type , Generic , TypeVar , Required
11-
12- from pydantic import TypeAdapter , RootModel
13- import pydantic
147import json
8+ from typing import Any , Optional , Type , TypeVar
159
1610import temporalio .api .common .v1
11+ from openai import BaseModel , NOT_GIVEN
12+ from pydantic import TypeAdapter , RootModel
1713from temporalio .converter import (
1814 CompositePayloadConverter ,
1915 DataConverter ,
2420
2521T = TypeVar ("T" , bound = BaseModel )
2622
27- class WrapperModel (RootModel [T ]):
23+ class _WrapperModel (RootModel [T ]):
2824 model_config = {
2925 "arbitrary_types_allowed" : True ,
3026 }
3127
3228
33- def strip_not_given (obj : Any ) -> Any :
34- if isinstance (obj , dict ):
35- return {
36- k : strip_not_given (v )
37- for k , v in obj .items ()
38- if v != NOT_GIVEN and v is not None
39- }
40- elif isinstance (obj , list ):
41- return [strip_not_given (v ) for v in obj if v != NOT_GIVEN and v is not None ]
42- else :
43- return obj
44-
45-
46- class OpenAIJSONPlainPayloadConverter (EncodingPayloadConverter ):
29+ class _OpenAIJSONPlainPayloadConverter (EncodingPayloadConverter ):
4730 """Pydantic JSON payload converter.
4831
4932 Supports conversion of all types supported by Pydantic to and from JSON.
@@ -70,8 +53,19 @@ def to_payload(self, value: Any) -> Optional[temporalio.api.common.v1.Payload]:
7053 https://docs.pydantic.dev/latest/api/pydantic_core/#pydantic_core.to_json.
7154 """
7255
73- # json = Wrapper(value=value).model_dump_json().encode()
74- wrapper = WrapperModel [type (value )](root = value )
56+ def strip_not_given (obj : Any ) -> Any :
57+ if isinstance (obj , dict ):
58+ return {
59+ k : strip_not_given (v )
60+ for k , v in obj .items ()
61+ if v != NOT_GIVEN and v is not None
62+ }
63+ elif isinstance (obj , list ):
64+ return [strip_not_given (v ) for v in obj if v != NOT_GIVEN and v is not None ]
65+ else :
66+ return obj
67+
68+ wrapper = _WrapperModel [type (value )](root = value )
7569 dump = wrapper .model_dump (mode = "python" , by_alias = True )
7670 # NotGiven values are not JSON serializable, so we need to strip them out
7771 dump = strip_not_given (dump )
@@ -87,7 +81,7 @@ def from_payload(
8781 type_hint : Optional [Type ] = None ,
8882 ) -> Any :
8983 _type_hint = type_hint if type_hint is not None else Any
90- wrapper = WrapperModel [_type_hint ]
84+ wrapper = _WrapperModel [_type_hint ]
9185 return TypeAdapter (wrapper ).validate_json (payload .data .decode ()).root
9286
9387
@@ -100,7 +94,7 @@ class OpenAIPayloadConverter(CompositePayloadConverter):
10094
10195 def __init__ (self ) -> None :
10296 """Initialize object"""
103- json_payload_converter = OpenAIJSONPlainPayloadConverter ()
97+ json_payload_converter = _OpenAIJSONPlainPayloadConverter ()
10498 super ().__init__ (
10599 * (
106100 c
0 commit comments