syllable-sdk 0.44.17__py3-none-any.whl → 0.44.24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. syllable_sdk/_version.py +3 -3
  2. syllable_sdk/basesdk.py +20 -6
  3. syllable_sdk/models/__init__.py +5 -0
  4. syllable_sdk/models/agent_listop.py +35 -36
  5. syllable_sdk/models/agentcreate.py +38 -39
  6. syllable_sdk/models/agentresponse.py +49 -50
  7. syllable_sdk/models/agentupdate.py +38 -39
  8. syllable_sdk/models/available_targetsop.py +35 -36
  9. syllable_sdk/models/availabletarget.py +1 -17
  10. syllable_sdk/models/batchdetails.py +38 -39
  11. syllable_sdk/models/body_directory_member_bulk_load.py +18 -1
  12. syllable_sdk/models/body_insights_folder_upload_file.py +34 -1
  13. syllable_sdk/models/body_organizations_create.py +30 -19
  14. syllable_sdk/models/body_organizations_delete.py +14 -19
  15. syllable_sdk/models/body_organizations_update.py +34 -30
  16. syllable_sdk/models/body_outbound_batch_upload.py +34 -1
  17. syllable_sdk/models/body_pronunciations_upload_csv.py +18 -1
  18. syllable_sdk/models/bridgephrasesconfig.py +20 -1
  19. syllable_sdk/models/callaction.py +14 -19
  20. syllable_sdk/models/celexpression.py +18 -1
  21. syllable_sdk/models/channel.py +14 -19
  22. syllable_sdk/models/channel_targets_listop.py +35 -36
  23. syllable_sdk/models/channelconfigview.py +20 -19
  24. syllable_sdk/models/channels_listop.py +35 -36
  25. syllable_sdk/models/channeltargetcreaterequest.py +14 -19
  26. syllable_sdk/models/channeltargetresponse.py +14 -19
  27. syllable_sdk/models/channeltargetupdaterequest.py +14 -19
  28. syllable_sdk/models/communicationbatch.py +36 -37
  29. syllable_sdk/models/communicationbatchinput.py +14 -19
  30. syllable_sdk/models/communicationbatchupdate.py +14 -19
  31. syllable_sdk/models/communicationrequestresult.py +37 -38
  32. syllable_sdk/models/conditionaltext.py +14 -19
  33. syllable_sdk/models/conditionalvalue.py +14 -19
  34. syllable_sdk/models/context.py +14 -19
  35. syllable_sdk/models/contexttaskmetadata.py +14 -19
  36. syllable_sdk/models/contexttoolinfo.py +14 -19
  37. syllable_sdk/models/conversation.py +44 -45
  38. syllable_sdk/models/conversations_listop.py +35 -36
  39. syllable_sdk/models/custom_messages_listop.py +35 -36
  40. syllable_sdk/models/custommessagecreaterequest.py +14 -19
  41. syllable_sdk/models/custommessageresponse.py +14 -19
  42. syllable_sdk/models/custommessagerule.py +18 -19
  43. syllable_sdk/models/custommessageupdaterequest.py +14 -19
  44. syllable_sdk/models/daotoolresponse.py +18 -29
  45. syllable_sdk/models/data_sources_listop.py +35 -36
  46. syllable_sdk/models/datasourcecreaterequest.py +14 -19
  47. syllable_sdk/models/datasourcedetailresponse.py +18 -24
  48. syllable_sdk/models/datasourcemetadataresponse.py +18 -24
  49. syllable_sdk/models/datasourceupdaterequest.py +16 -19
  50. syllable_sdk/models/dialogtoolcall.py +1 -17
  51. syllable_sdk/models/dictionarymetadata.py +18 -1
  52. syllable_sdk/models/directory_member_createop.py +18 -1
  53. syllable_sdk/models/directory_member_downloadop.py +18 -1
  54. syllable_sdk/models/directory_member_get_by_idop.py +18 -1
  55. syllable_sdk/models/directory_member_listop.py +36 -37
  56. syllable_sdk/models/directory_member_test_extensionop.py +13 -18
  57. syllable_sdk/models/directory_member_updateop.py +18 -1
  58. syllable_sdk/models/directoryextension.py +14 -19
  59. syllable_sdk/models/directoryextensionnumber.py +14 -19
  60. syllable_sdk/models/directorymember.py +14 -19
  61. syllable_sdk/models/directorymembercreate.py +14 -19
  62. syllable_sdk/models/directorymembertestresponse.py +14 -19
  63. syllable_sdk/models/directorymemberupdate.py +14 -19
  64. syllable_sdk/models/emailconfigurations.py +19 -0
  65. syllable_sdk/models/event.py +38 -39
  66. syllable_sdk/models/events_listop.py +35 -36
  67. syllable_sdk/models/eventtask.py +16 -28
  68. syllable_sdk/models/eventtaskevents.py +14 -19
  69. syllable_sdk/models/expressiontask.py +30 -39
  70. syllable_sdk/models/expressiontaskevents.py +14 -19
  71. syllable_sdk/models/folderdetails.py +14 -19
  72. syllable_sdk/models/get_bridge_phrases_configop.py +14 -19
  73. syllable_sdk/models/getvalueaction.py +16 -19
  74. syllable_sdk/models/incident_listop.py +35 -36
  75. syllable_sdk/models/incidentcreaterequest.py +18 -19
  76. syllable_sdk/models/incidentresponse.py +31 -32
  77. syllable_sdk/models/incidentupdaterequest.py +18 -19
  78. syllable_sdk/models/incrementaction.py +14 -19
  79. syllable_sdk/models/inputparameter.py +27 -36
  80. syllable_sdk/models/insight_tool_listop.py +35 -36
  81. syllable_sdk/models/insights_folder_listop.py +35 -36
  82. syllable_sdk/models/insights_folder_upload_fileop.py +33 -34
  83. syllable_sdk/models/insights_listop.py +35 -36
  84. syllable_sdk/models/insights_upload_list_filesop.py +35 -36
  85. syllable_sdk/models/insights_workflow_listop.py +35 -36
  86. syllable_sdk/models/insightsfolder.py +14 -19
  87. syllable_sdk/models/insightsfolderinput.py +14 -19
  88. syllable_sdk/models/insightsoutput.py +26 -32
  89. syllable_sdk/models/insightsuploadfile.py +37 -38
  90. syllable_sdk/models/insightsworkflowqueuesession.py +14 -19
  91. syllable_sdk/models/insighttooloutput.py +14 -19
  92. syllable_sdk/models/insighttooltestinput.py +14 -19
  93. syllable_sdk/models/insightworkflowcondition.py +34 -35
  94. syllable_sdk/models/insightworkflowinput.py +14 -19
  95. syllable_sdk/models/insightworkflowoutput.py +22 -25
  96. syllable_sdk/models/inspectlatencyresponse.py +18 -1
  97. syllable_sdk/models/internaltool.py +18 -1
  98. syllable_sdk/models/jmespathexpression.py +18 -1
  99. syllable_sdk/models/language_groups_listop.py +35 -36
  100. syllable_sdk/models/languageconfig.py +14 -19
  101. syllable_sdk/models/languagegroupcreaterequest.py +14 -19
  102. syllable_sdk/models/languagegroupresponse.py +14 -19
  103. syllable_sdk/models/languagegroupupdaterequest.py +14 -19
  104. syllable_sdk/models/languagesamplecreaterequest.py +16 -24
  105. syllable_sdk/models/latencyentry.py +14 -19
  106. syllable_sdk/models/listresponse_agentresponse_.py +14 -19
  107. syllable_sdk/models/listresponse_availabletarget_.py +14 -19
  108. syllable_sdk/models/listresponse_channel_.py +14 -19
  109. syllable_sdk/models/listresponse_channeltargetresponse_.py +14 -19
  110. syllable_sdk/models/listresponse_communicationbatch_.py +14 -19
  111. syllable_sdk/models/listresponse_conversation_.py +14 -19
  112. syllable_sdk/models/listresponse_custommessageresponse_.py +14 -19
  113. syllable_sdk/models/listresponse_dashboardresponse_.py +14 -19
  114. syllable_sdk/models/listresponse_datasourcemetadataresponse_.py +14 -19
  115. syllable_sdk/models/listresponse_directorymember_.py +14 -19
  116. syllable_sdk/models/listresponse_event_.py +14 -19
  117. syllable_sdk/models/listresponse_incidentresponse_.py +14 -19
  118. syllable_sdk/models/listresponse_insightsfolder_.py +14 -19
  119. syllable_sdk/models/listresponse_insightsoutput_.py +14 -19
  120. syllable_sdk/models/listresponse_insightsuploadfile_.py +14 -19
  121. syllable_sdk/models/listresponse_insighttooloutput_.py +14 -19
  122. syllable_sdk/models/listresponse_insightworkflowoutput_.py +14 -19
  123. syllable_sdk/models/listresponse_languagegroupresponse_.py +14 -19
  124. syllable_sdk/models/listresponse_outboundcampaign_.py +14 -19
  125. syllable_sdk/models/listresponse_promptresponse_.py +14 -19
  126. syllable_sdk/models/listresponse_roleresponse_.py +14 -19
  127. syllable_sdk/models/listresponse_serviceresponse_.py +14 -19
  128. syllable_sdk/models/listresponse_session_.py +14 -19
  129. syllable_sdk/models/listresponse_sessionlabel_.py +14 -19
  130. syllable_sdk/models/listresponse_toolresponse_.py +14 -19
  131. syllable_sdk/models/listresponse_userresponse_.py +14 -19
  132. syllable_sdk/models/listresponse_voicegroupresponse_.py +14 -19
  133. syllable_sdk/models/loadtoolfromfiletask.py +16 -27
  134. syllable_sdk/models/nextstep.py +14 -19
  135. syllable_sdk/models/organizationchannelconfig.py +24 -29
  136. syllable_sdk/models/organizationchannelcreaterequest.py +14 -19
  137. syllable_sdk/models/organizationchannelupdaterequest.py +14 -19
  138. syllable_sdk/models/organizationresponse.py +32 -33
  139. syllable_sdk/models/outbound_batch_listop.py +35 -36
  140. syllable_sdk/models/outbound_batch_resultsop.py +13 -18
  141. syllable_sdk/models/outbound_batch_uploadop.py +18 -1
  142. syllable_sdk/models/outbound_campaign_listop.py +35 -36
  143. syllable_sdk/models/outboundcampaign.py +47 -48
  144. syllable_sdk/models/outboundcampaigninput.py +43 -44
  145. syllable_sdk/models/permissionresponse.py +14 -19
  146. syllable_sdk/models/post_list_dashboardop.py +35 -36
  147. syllable_sdk/models/promptcreaterequest.py +26 -32
  148. syllable_sdk/models/prompthistory.py +24 -30
  149. syllable_sdk/models/promptllmconfig.py +16 -26
  150. syllable_sdk/models/promptresponse.py +41 -42
  151. syllable_sdk/models/prompts_listop.py +35 -36
  152. syllable_sdk/models/promptupdaterequest.py +26 -32
  153. syllable_sdk/models/pronunciationoverride.py +28 -1
  154. syllable_sdk/models/pronunciationoverridesdictionary.py +18 -1
  155. syllable_sdk/models/pronunciationscsvuploadresponse.py +18 -1
  156. syllable_sdk/models/rolecreaterequest.py +14 -19
  157. syllable_sdk/models/roleresponse.py +14 -19
  158. syllable_sdk/models/roles_deleteop.py +13 -18
  159. syllable_sdk/models/roles_listop.py +35 -36
  160. syllable_sdk/models/roleupdaterequest.py +14 -19
  161. syllable_sdk/models/saveaction.py +14 -19
  162. syllable_sdk/models/sayaction.py +14 -19
  163. syllable_sdk/models/security.py +18 -1
  164. syllable_sdk/models/service_listop.py +35 -36
  165. syllable_sdk/models/servicecreaterequest.py +14 -19
  166. syllable_sdk/models/serviceresponse.py +14 -19
  167. syllable_sdk/models/serviceupdaterequest.py +14 -19
  168. syllable_sdk/models/session.py +60 -61
  169. syllable_sdk/models/session_labels_listop.py +35 -36
  170. syllable_sdk/models/sessionaction.py +18 -19
  171. syllable_sdk/models/sessionlabel.py +14 -19
  172. syllable_sdk/models/sessionlabelcreate.py +14 -19
  173. syllable_sdk/models/sessionrecordingresponse.py +14 -19
  174. syllable_sdk/models/sessions_listop.py +35 -36
  175. syllable_sdk/models/sessionsummaryresponse.py +14 -19
  176. syllable_sdk/models/sessiontext.py +14 -19
  177. syllable_sdk/models/setvalueaction.py +14 -19
  178. syllable_sdk/models/statictoolparameter.py +14 -19
  179. syllable_sdk/models/step.py +18 -1
  180. syllable_sdk/models/stepeventactions.py +14 -19
  181. syllable_sdk/models/stepstask.py +25 -28
  182. syllable_sdk/models/steptools.py +14 -19
  183. syllable_sdk/models/summaryentry.py +14 -19
  184. syllable_sdk/models/supportedllm.py +14 -19
  185. syllable_sdk/models/takeoutstatusresponse.py +14 -19
  186. syllable_sdk/models/telephonyconfigurations.py +38 -39
  187. syllable_sdk/models/testmessage.py +16 -19
  188. syllable_sdk/models/testmessageresponse.py +14 -19
  189. syllable_sdk/models/tool_listop.py +35 -36
  190. syllable_sdk/models/tooldefinition.py +34 -35
  191. syllable_sdk/models/tooldetailresponse.py +18 -29
  192. syllable_sdk/models/tooloptions.py +18 -1
  193. syllable_sdk/models/toolparametertransform.py +14 -19
  194. syllable_sdk/models/toolparametertransformcondition.py +14 -19
  195. syllable_sdk/models/toolresponse.py +18 -29
  196. syllable_sdk/models/toolupdaterequest.py +14 -19
  197. syllable_sdk/models/twiliochannelconfigupdate.py +14 -19
  198. syllable_sdk/models/twiliochannelupdaterequest.py +14 -19
  199. syllable_sdk/models/update_bridge_phrases_configop.py +13 -18
  200. syllable_sdk/models/usercreaterequest.py +14 -19
  201. syllable_sdk/models/userresponse.py +30 -31
  202. syllable_sdk/models/users_listop.py +35 -36
  203. syllable_sdk/models/users_send_emailop.py +18 -1
  204. syllable_sdk/models/userupdaterequest.py +14 -19
  205. syllable_sdk/models/variable.py +38 -39
  206. syllable_sdk/models/voice_groups_listop.py +35 -36
  207. syllable_sdk/models/voicegroupcreaterequest.py +14 -19
  208. syllable_sdk/models/voicegroupresponse.py +14 -19
  209. syllable_sdk/models/voicegroupupdaterequest.py +14 -19
  210. syllable_sdk/models/voicesamplecreaterequest.py +16 -24
  211. syllable_sdk/utils/__init__.py +13 -4
  212. syllable_sdk/utils/enums.py +60 -0
  213. syllable_sdk/utils/requestbodies.py +3 -3
  214. syllable_sdk/utils/serializers.py +0 -20
  215. {syllable_sdk-0.44.17.dist-info → syllable_sdk-0.44.24.dist-info}/METADATA +1 -1
  216. {syllable_sdk-0.44.17.dist-info → syllable_sdk-0.44.24.dist-info}/RECORD +217 -216
  217. {syllable_sdk-0.44.17.dist-info → syllable_sdk-0.44.24.dist-info}/WHEEL +0 -0
@@ -94,47 +94,46 @@ class UsersListRequest(BaseModel):
94
94
 
95
95
  @model_serializer(mode="wrap")
96
96
  def serialize_model(self, handler):
97
- optional_fields = [
98
- "page",
99
- "limit",
100
- "search_fields",
101
- "search_field_values",
102
- "order_by",
103
- "order_by_direction",
104
- "fields",
105
- "start_datetime",
106
- "end_datetime",
107
- ]
108
- nullable_fields = [
109
- "page",
110
- "order_by",
111
- "order_by_direction",
112
- "fields",
113
- "start_datetime",
114
- "end_datetime",
115
- ]
116
- null_default_fields = []
117
-
97
+ optional_fields = set(
98
+ [
99
+ "page",
100
+ "limit",
101
+ "search_fields",
102
+ "search_field_values",
103
+ "order_by",
104
+ "order_by_direction",
105
+ "fields",
106
+ "start_datetime",
107
+ "end_datetime",
108
+ ]
109
+ )
110
+ nullable_fields = set(
111
+ [
112
+ "page",
113
+ "order_by",
114
+ "order_by_direction",
115
+ "fields",
116
+ "start_datetime",
117
+ "end_datetime",
118
+ ]
119
+ )
118
120
  serialized = handler(self)
119
-
120
121
  m = {}
121
122
 
122
123
  for n, f in type(self).model_fields.items():
123
124
  k = f.alias or n
124
125
  val = serialized.get(k)
125
- serialized.pop(k, None)
126
-
127
- optional_nullable = k in optional_fields and k in nullable_fields
128
- is_set = (
129
- self.__pydantic_fields_set__.intersection({n})
130
- or k in null_default_fields
131
- ) # pylint: disable=no-member
132
-
133
- if val is not None and val != UNSET_SENTINEL:
134
- m[k] = val
135
- elif val != UNSET_SENTINEL and (
136
- not k in optional_fields or (optional_nullable and is_set)
137
- ):
138
- m[k] = val
126
+ is_nullable_and_explicitly_set = (
127
+ k in nullable_fields
128
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
129
+ )
130
+
131
+ if val != UNSET_SENTINEL:
132
+ if (
133
+ val is not None
134
+ or k not in optional_fields
135
+ or is_nullable_and_explicitly_set
136
+ ):
137
+ m[k] = val
139
138
 
140
139
  return m
@@ -1,7 +1,8 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
- from syllable_sdk.types import BaseModel
4
+ from pydantic import model_serializer
5
+ from syllable_sdk.types import BaseModel, UNSET_SENTINEL
5
6
  from syllable_sdk.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata
6
7
  from typing import Optional
7
8
  from typing_extensions import Annotated, NotRequired, TypedDict
@@ -21,3 +22,19 @@ class UsersSendEmailRequest(BaseModel):
21
22
  Optional[bool],
22
23
  FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
23
24
  ] = False
25
+
26
+ @model_serializer(mode="wrap")
27
+ def serialize_model(self, handler):
28
+ optional_fields = set(["skip_auth"])
29
+ serialized = handler(self)
30
+ m = {}
31
+
32
+ for n, f in type(self).model_fields.items():
33
+ k = f.alias or n
34
+ val = serialized.get(k)
35
+
36
+ if val != UNSET_SENTINEL:
37
+ if val is not None or k not in optional_fields:
38
+ m[k] = val
39
+
40
+ return m
@@ -47,30 +47,25 @@ class UserUpdateRequest(BaseModel):
47
47
 
48
48
  @model_serializer(mode="wrap")
49
49
  def serialize_model(self, handler):
50
- optional_fields = ["first_name", "last_name", "last_updated_comments"]
51
- nullable_fields = ["first_name", "last_name", "last_updated_comments"]
52
- null_default_fields = []
53
-
50
+ optional_fields = set(["first_name", "last_name", "last_updated_comments"])
51
+ nullable_fields = set(["first_name", "last_name", "last_updated_comments"])
54
52
  serialized = handler(self)
55
-
56
53
  m = {}
57
54
 
58
55
  for n, f in type(self).model_fields.items():
59
56
  k = f.alias or n
60
57
  val = serialized.get(k)
61
- serialized.pop(k, None)
62
-
63
- optional_nullable = k in optional_fields and k in nullable_fields
64
- is_set = (
65
- self.__pydantic_fields_set__.intersection({n})
66
- or k in null_default_fields
67
- ) # pylint: disable=no-member
68
-
69
- if val is not None and val != UNSET_SENTINEL:
70
- m[k] = val
71
- elif val != UNSET_SENTINEL and (
72
- not k in optional_fields or (optional_nullable and is_set)
73
- ):
74
- m[k] = val
58
+ is_nullable_and_explicitly_set = (
59
+ k in nullable_fields
60
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
61
+ )
62
+
63
+ if val != UNSET_SENTINEL:
64
+ if (
65
+ val is not None
66
+ or k not in optional_fields
67
+ or is_nullable_and_explicitly_set
68
+ ):
69
+ m[k] = val
75
70
 
76
71
  return m
@@ -100,50 +100,49 @@ class Variable(BaseModel):
100
100
 
101
101
  @model_serializer(mode="wrap")
102
102
  def serialize_model(self, handler):
103
- optional_fields = [
104
- "value",
105
- "value_from",
106
- "type",
107
- "description",
108
- "title",
109
- "format",
110
- "pattern",
111
- "enum",
112
- "examples",
113
- ]
114
- nullable_fields = [
115
- "value",
116
- "value_from",
117
- "type",
118
- "description",
119
- "title",
120
- "format",
121
- "pattern",
122
- "enum",
123
- "examples",
124
- ]
125
- null_default_fields = []
126
-
103
+ optional_fields = set(
104
+ [
105
+ "value",
106
+ "value_from",
107
+ "type",
108
+ "description",
109
+ "title",
110
+ "format",
111
+ "pattern",
112
+ "enum",
113
+ "examples",
114
+ ]
115
+ )
116
+ nullable_fields = set(
117
+ [
118
+ "value",
119
+ "value_from",
120
+ "type",
121
+ "description",
122
+ "title",
123
+ "format",
124
+ "pattern",
125
+ "enum",
126
+ "examples",
127
+ ]
128
+ )
127
129
  serialized = handler(self)
128
-
129
130
  m = {}
130
131
 
131
132
  for n, f in type(self).model_fields.items():
132
133
  k = f.alias or n
133
134
  val = serialized.get(k)
134
- serialized.pop(k, None)
135
-
136
- optional_nullable = k in optional_fields and k in nullable_fields
137
- is_set = (
138
- self.__pydantic_fields_set__.intersection({n})
139
- or k in null_default_fields
140
- ) # pylint: disable=no-member
141
-
142
- if val is not None and val != UNSET_SENTINEL:
143
- m[k] = val
144
- elif val != UNSET_SENTINEL and (
145
- not k in optional_fields or (optional_nullable and is_set)
146
- ):
147
- m[k] = val
135
+ is_nullable_and_explicitly_set = (
136
+ k in nullable_fields
137
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
138
+ )
139
+
140
+ if val != UNSET_SENTINEL:
141
+ if (
142
+ val is not None
143
+ or k not in optional_fields
144
+ or is_nullable_and_explicitly_set
145
+ ):
146
+ m[k] = val
148
147
 
149
148
  return m
@@ -94,47 +94,46 @@ class VoiceGroupsListRequest(BaseModel):
94
94
 
95
95
  @model_serializer(mode="wrap")
96
96
  def serialize_model(self, handler):
97
- optional_fields = [
98
- "page",
99
- "limit",
100
- "search_fields",
101
- "search_field_values",
102
- "order_by",
103
- "order_by_direction",
104
- "fields",
105
- "start_datetime",
106
- "end_datetime",
107
- ]
108
- nullable_fields = [
109
- "page",
110
- "order_by",
111
- "order_by_direction",
112
- "fields",
113
- "start_datetime",
114
- "end_datetime",
115
- ]
116
- null_default_fields = []
117
-
97
+ optional_fields = set(
98
+ [
99
+ "page",
100
+ "limit",
101
+ "search_fields",
102
+ "search_field_values",
103
+ "order_by",
104
+ "order_by_direction",
105
+ "fields",
106
+ "start_datetime",
107
+ "end_datetime",
108
+ ]
109
+ )
110
+ nullable_fields = set(
111
+ [
112
+ "page",
113
+ "order_by",
114
+ "order_by_direction",
115
+ "fields",
116
+ "start_datetime",
117
+ "end_datetime",
118
+ ]
119
+ )
118
120
  serialized = handler(self)
119
-
120
121
  m = {}
121
122
 
122
123
  for n, f in type(self).model_fields.items():
123
124
  k = f.alias or n
124
125
  val = serialized.get(k)
125
- serialized.pop(k, None)
126
-
127
- optional_nullable = k in optional_fields and k in nullable_fields
128
- is_set = (
129
- self.__pydantic_fields_set__.intersection({n})
130
- or k in null_default_fields
131
- ) # pylint: disable=no-member
132
-
133
- if val is not None and val != UNSET_SENTINEL:
134
- m[k] = val
135
- elif val != UNSET_SENTINEL and (
136
- not k in optional_fields or (optional_nullable and is_set)
137
- ):
138
- m[k] = val
126
+ is_nullable_and_explicitly_set = (
127
+ k in nullable_fields
128
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
129
+ )
130
+
131
+ if val != UNSET_SENTINEL:
132
+ if (
133
+ val is not None
134
+ or k not in optional_fields
135
+ or is_nullable_and_explicitly_set
136
+ ):
137
+ m[k] = val
139
138
 
140
139
  return m
@@ -44,30 +44,25 @@ class VoiceGroupCreateRequest(BaseModel):
44
44
 
45
45
  @model_serializer(mode="wrap")
46
46
  def serialize_model(self, handler):
47
- optional_fields = ["description"]
48
- nullable_fields = ["description"]
49
- null_default_fields = []
50
-
47
+ optional_fields = set(["description"])
48
+ nullable_fields = set(["description"])
51
49
  serialized = handler(self)
52
-
53
50
  m = {}
54
51
 
55
52
  for n, f in type(self).model_fields.items():
56
53
  k = f.alias or n
57
54
  val = serialized.get(k)
58
- serialized.pop(k, None)
59
-
60
- optional_nullable = k in optional_fields and k in nullable_fields
61
- is_set = (
62
- self.__pydantic_fields_set__.intersection({n})
63
- or k in null_default_fields
64
- ) # pylint: disable=no-member
65
-
66
- if val is not None and val != UNSET_SENTINEL:
67
- m[k] = val
68
- elif val != UNSET_SENTINEL and (
69
- not k in optional_fields or (optional_nullable and is_set)
70
- ):
71
- m[k] = val
55
+ is_nullable_and_explicitly_set = (
56
+ k in nullable_fields
57
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
58
+ )
59
+
60
+ if val != UNSET_SENTINEL:
61
+ if (
62
+ val is not None
63
+ or k not in optional_fields
64
+ or is_nullable_and_explicitly_set
65
+ ):
66
+ m[k] = val
72
67
 
73
68
  return m
@@ -82,30 +82,25 @@ class VoiceGroupResponse(BaseModel):
82
82
 
83
83
  @model_serializer(mode="wrap")
84
84
  def serialize_model(self, handler):
85
- optional_fields = ["description", "edit_comments", "agents_info"]
86
- nullable_fields = ["description", "edit_comments", "agents_info"]
87
- null_default_fields = []
88
-
85
+ optional_fields = set(["description", "edit_comments", "agents_info"])
86
+ nullable_fields = set(["description", "edit_comments", "agents_info"])
89
87
  serialized = handler(self)
90
-
91
88
  m = {}
92
89
 
93
90
  for n, f in type(self).model_fields.items():
94
91
  k = f.alias or n
95
92
  val = serialized.get(k)
96
- serialized.pop(k, None)
97
-
98
- optional_nullable = k in optional_fields and k in nullable_fields
99
- is_set = (
100
- self.__pydantic_fields_set__.intersection({n})
101
- or k in null_default_fields
102
- ) # pylint: disable=no-member
103
-
104
- if val is not None and val != UNSET_SENTINEL:
105
- m[k] = val
106
- elif val != UNSET_SENTINEL and (
107
- not k in optional_fields or (optional_nullable and is_set)
108
- ):
109
- m[k] = val
93
+ is_nullable_and_explicitly_set = (
94
+ k in nullable_fields
95
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
96
+ )
97
+
98
+ if val != UNSET_SENTINEL:
99
+ if (
100
+ val is not None
101
+ or k not in optional_fields
102
+ or is_nullable_and_explicitly_set
103
+ ):
104
+ m[k] = val
110
105
 
111
106
  return m
@@ -54,30 +54,25 @@ class VoiceGroupUpdateRequest(BaseModel):
54
54
 
55
55
  @model_serializer(mode="wrap")
56
56
  def serialize_model(self, handler):
57
- optional_fields = ["description", "edit_comments"]
58
- nullable_fields = ["description", "edit_comments"]
59
- null_default_fields = []
60
-
57
+ optional_fields = set(["description", "edit_comments"])
58
+ nullable_fields = set(["description", "edit_comments"])
61
59
  serialized = handler(self)
62
-
63
60
  m = {}
64
61
 
65
62
  for n, f in type(self).model_fields.items():
66
63
  k = f.alias or n
67
64
  val = serialized.get(k)
68
- serialized.pop(k, None)
69
-
70
- optional_nullable = k in optional_fields and k in nullable_fields
71
- is_set = (
72
- self.__pydantic_fields_set__.intersection({n})
73
- or k in null_default_fields
74
- ) # pylint: disable=no-member
75
-
76
- if val is not None and val != UNSET_SENTINEL:
77
- m[k] = val
78
- elif val != UNSET_SENTINEL and (
79
- not k in optional_fields or (optional_nullable and is_set)
80
- ):
81
- m[k] = val
65
+ is_nullable_and_explicitly_set = (
66
+ k in nullable_fields
67
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
68
+ )
69
+
70
+ if val != UNSET_SENTINEL:
71
+ if (
72
+ val is not None
73
+ or k not in optional_fields
74
+ or is_nullable_and_explicitly_set
75
+ ):
76
+ m[k] = val
82
77
 
83
78
  return m
@@ -61,35 +61,27 @@ class VoiceSampleCreateRequest(BaseModel):
61
61
 
62
62
  @model_serializer(mode="wrap")
63
63
  def serialize_model(self, handler):
64
- optional_fields = [
65
- "voice_speed",
66
- "voice_pitch",
67
- "text",
68
- "apply_pronunciation_overrides",
69
- ]
70
- nullable_fields = ["voice_speed", "voice_pitch"]
71
- null_default_fields = []
72
-
64
+ optional_fields = set(
65
+ ["voice_speed", "voice_pitch", "text", "apply_pronunciation_overrides"]
66
+ )
67
+ nullable_fields = set(["voice_speed", "voice_pitch"])
73
68
  serialized = handler(self)
74
-
75
69
  m = {}
76
70
 
77
71
  for n, f in type(self).model_fields.items():
78
72
  k = f.alias or n
79
73
  val = serialized.get(k)
80
- serialized.pop(k, None)
81
-
82
- optional_nullable = k in optional_fields and k in nullable_fields
83
- is_set = (
84
- self.__pydantic_fields_set__.intersection({n})
85
- or k in null_default_fields
86
- ) # pylint: disable=no-member
87
-
88
- if val is not None and val != UNSET_SENTINEL:
89
- m[k] = val
90
- elif val != UNSET_SENTINEL and (
91
- not k in optional_fields or (optional_nullable and is_set)
92
- ):
93
- m[k] = val
74
+ is_nullable_and_explicitly_set = (
75
+ k in nullable_fields
76
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
77
+ )
78
+
79
+ if val != UNSET_SENTINEL:
80
+ if (
81
+ val is not None
82
+ or k not in optional_fields
83
+ or is_nullable_and_explicitly_set
84
+ ):
85
+ m[k] = val
94
86
 
95
87
  return m
@@ -1,10 +1,22 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
- from typing import TYPE_CHECKING
3
+ from typing import TYPE_CHECKING, Callable, TypeVar
4
4
  from importlib import import_module
5
+ import asyncio
5
6
  import builtins
6
7
  import sys
7
8
 
9
+ _T = TypeVar("_T")
10
+
11
+
12
+ async def run_sync_in_thread(func: Callable[..., _T], *args) -> _T:
13
+ """Run a synchronous function in a thread pool to avoid blocking the event loop."""
14
+ if sys.version_info >= (3, 9):
15
+ return await asyncio.to_thread(func, *args)
16
+ loop = asyncio.get_event_loop()
17
+ return await loop.run_in_executor(None, func, *args)
18
+
19
+
8
20
  if TYPE_CHECKING:
9
21
  from .annotations import get_discriminator
10
22
  from .datetimes import parse_datetime
@@ -42,7 +54,6 @@ if TYPE_CHECKING:
42
54
  validate_decimal,
43
55
  validate_float,
44
56
  validate_int,
45
- validate_open_enum,
46
57
  )
47
58
  from .url import generate_url, template_url, remove_suffix
48
59
  from .values import (
@@ -104,7 +115,6 @@ __all__ = [
104
115
  "validate_const",
105
116
  "validate_float",
106
117
  "validate_int",
107
- "validate_open_enum",
108
118
  "cast_partial",
109
119
  ]
110
120
 
@@ -158,7 +168,6 @@ _dynamic_imports: dict[str, str] = {
158
168
  "validate_const": ".serializers",
159
169
  "validate_float": ".serializers",
160
170
  "validate_int": ".serializers",
161
- "validate_open_enum": ".serializers",
162
171
  "cast_partial": ".values",
163
172
  }
164
173
 
@@ -2,6 +2,10 @@
2
2
 
3
3
  import enum
4
4
  import sys
5
+ from typing import Any
6
+
7
+ from pydantic_core import core_schema
8
+
5
9
 
6
10
  class OpenEnumMeta(enum.EnumMeta):
7
11
  # The __call__ method `boundary` kwarg was added in 3.11 and must be present
@@ -72,3 +76,59 @@ class OpenEnumMeta(enum.EnumMeta):
72
76
  )
73
77
  except ValueError:
74
78
  return value
79
+
80
+ def __new__(mcs, name, bases, namespace, **kwargs):
81
+ cls = super().__new__(mcs, name, bases, namespace, **kwargs)
82
+
83
+ # Add __get_pydantic_core_schema__ to make open enums work correctly
84
+ # in union discrimination. In strict mode (used by Pydantic for unions),
85
+ # only known enum values match. In lax mode, unknown values are accepted.
86
+ def __get_pydantic_core_schema__(
87
+ cls_inner: Any, _source_type: Any, _handler: Any
88
+ ) -> core_schema.CoreSchema:
89
+ # Create a validator that only accepts known enum values (for strict mode)
90
+ def validate_strict(v: Any) -> Any:
91
+ if isinstance(v, cls_inner):
92
+ return v
93
+ # Use the parent EnumMeta's __call__ which raises ValueError for unknown values
94
+ return enum.EnumMeta.__call__(cls_inner, v)
95
+
96
+ # Create a lax validator that accepts unknown values
97
+ def validate_lax(v: Any) -> Any:
98
+ if isinstance(v, cls_inner):
99
+ return v
100
+ try:
101
+ return enum.EnumMeta.__call__(cls_inner, v)
102
+ except ValueError:
103
+ # Return the raw value for unknown enum values
104
+ return v
105
+
106
+ # Determine the base type schema (str or int)
107
+ is_int_enum = False
108
+ for base in cls_inner.__mro__:
109
+ if base is int:
110
+ is_int_enum = True
111
+ break
112
+ if base is str:
113
+ break
114
+
115
+ base_schema = (
116
+ core_schema.int_schema()
117
+ if is_int_enum
118
+ else core_schema.str_schema()
119
+ )
120
+
121
+ # Use lax_or_strict_schema:
122
+ # - strict mode: only known enum values match (raises ValueError for unknown)
123
+ # - lax mode: accept any value, return enum member or raw value
124
+ return core_schema.lax_or_strict_schema(
125
+ lax_schema=core_schema.chain_schema(
126
+ [base_schema, core_schema.no_info_plain_validator_function(validate_lax)]
127
+ ),
128
+ strict_schema=core_schema.chain_schema(
129
+ [base_schema, core_schema.no_info_plain_validator_function(validate_strict)]
130
+ ),
131
+ )
132
+
133
+ setattr(cls, "__get_pydantic_core_schema__", classmethod(__get_pydantic_core_schema__))
134
+ return cls