mirascope 1.0.5__py3-none-any.whl → 2.1.1__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 (632) hide show
  1. mirascope/__init__.py +6 -6
  2. mirascope/_stubs.py +384 -0
  3. mirascope/_utils.py +34 -0
  4. mirascope/api/__init__.py +14 -0
  5. mirascope/api/_generated/README.md +207 -0
  6. mirascope/api/_generated/__init__.py +444 -0
  7. mirascope/api/_generated/annotations/__init__.py +33 -0
  8. mirascope/api/_generated/annotations/client.py +506 -0
  9. mirascope/api/_generated/annotations/raw_client.py +1414 -0
  10. mirascope/api/_generated/annotations/types/__init__.py +31 -0
  11. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +5 -0
  12. mirascope/api/_generated/annotations/types/annotations_create_response.py +48 -0
  13. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +5 -0
  14. mirascope/api/_generated/annotations/types/annotations_get_response.py +48 -0
  15. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +5 -0
  16. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +5 -0
  17. mirascope/api/_generated/annotations/types/annotations_list_response.py +21 -0
  18. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +50 -0
  19. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +5 -0
  20. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +5 -0
  21. mirascope/api/_generated/annotations/types/annotations_update_response.py +48 -0
  22. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +5 -0
  23. mirascope/api/_generated/api_keys/__init__.py +17 -0
  24. mirascope/api/_generated/api_keys/client.py +530 -0
  25. mirascope/api/_generated/api_keys/raw_client.py +1236 -0
  26. mirascope/api/_generated/api_keys/types/__init__.py +15 -0
  27. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +28 -0
  28. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +27 -0
  29. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +40 -0
  30. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +27 -0
  31. mirascope/api/_generated/client.py +211 -0
  32. mirascope/api/_generated/core/__init__.py +52 -0
  33. mirascope/api/_generated/core/api_error.py +23 -0
  34. mirascope/api/_generated/core/client_wrapper.py +46 -0
  35. mirascope/api/_generated/core/datetime_utils.py +28 -0
  36. mirascope/api/_generated/core/file.py +67 -0
  37. mirascope/api/_generated/core/force_multipart.py +16 -0
  38. mirascope/api/_generated/core/http_client.py +543 -0
  39. mirascope/api/_generated/core/http_response.py +55 -0
  40. mirascope/api/_generated/core/jsonable_encoder.py +100 -0
  41. mirascope/api/_generated/core/pydantic_utilities.py +255 -0
  42. mirascope/api/_generated/core/query_encoder.py +58 -0
  43. mirascope/api/_generated/core/remove_none_from_dict.py +11 -0
  44. mirascope/api/_generated/core/request_options.py +35 -0
  45. mirascope/api/_generated/core/serialization.py +276 -0
  46. mirascope/api/_generated/docs/__init__.py +4 -0
  47. mirascope/api/_generated/docs/client.py +91 -0
  48. mirascope/api/_generated/docs/raw_client.py +178 -0
  49. mirascope/api/_generated/environment.py +9 -0
  50. mirascope/api/_generated/environments/__init__.py +23 -0
  51. mirascope/api/_generated/environments/client.py +649 -0
  52. mirascope/api/_generated/environments/raw_client.py +1567 -0
  53. mirascope/api/_generated/environments/types/__init__.py +25 -0
  54. mirascope/api/_generated/environments/types/environments_create_response.py +24 -0
  55. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +60 -0
  56. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +24 -0
  57. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +22 -0
  58. mirascope/api/_generated/environments/types/environments_get_response.py +24 -0
  59. mirascope/api/_generated/environments/types/environments_list_response_item.py +24 -0
  60. mirascope/api/_generated/environments/types/environments_update_response.py +24 -0
  61. mirascope/api/_generated/errors/__init__.py +25 -0
  62. mirascope/api/_generated/errors/bad_request_error.py +14 -0
  63. mirascope/api/_generated/errors/conflict_error.py +14 -0
  64. mirascope/api/_generated/errors/forbidden_error.py +11 -0
  65. mirascope/api/_generated/errors/internal_server_error.py +10 -0
  66. mirascope/api/_generated/errors/not_found_error.py +11 -0
  67. mirascope/api/_generated/errors/payment_required_error.py +15 -0
  68. mirascope/api/_generated/errors/service_unavailable_error.py +14 -0
  69. mirascope/api/_generated/errors/too_many_requests_error.py +15 -0
  70. mirascope/api/_generated/errors/unauthorized_error.py +11 -0
  71. mirascope/api/_generated/functions/__init__.py +39 -0
  72. mirascope/api/_generated/functions/client.py +647 -0
  73. mirascope/api/_generated/functions/raw_client.py +1890 -0
  74. mirascope/api/_generated/functions/types/__init__.py +53 -0
  75. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +20 -0
  76. mirascope/api/_generated/functions/types/functions_create_response.py +37 -0
  77. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +20 -0
  78. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +39 -0
  79. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +20 -0
  80. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +53 -0
  81. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +22 -0
  82. mirascope/api/_generated/functions/types/functions_get_response.py +37 -0
  83. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +20 -0
  84. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +25 -0
  85. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +56 -0
  86. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +22 -0
  87. mirascope/api/_generated/functions/types/functions_list_response.py +21 -0
  88. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +41 -0
  89. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +20 -0
  90. mirascope/api/_generated/health/__init__.py +7 -0
  91. mirascope/api/_generated/health/client.py +92 -0
  92. mirascope/api/_generated/health/raw_client.py +175 -0
  93. mirascope/api/_generated/health/types/__init__.py +8 -0
  94. mirascope/api/_generated/health/types/health_check_response.py +22 -0
  95. mirascope/api/_generated/health/types/health_check_response_status.py +5 -0
  96. mirascope/api/_generated/organization_invitations/__init__.py +33 -0
  97. mirascope/api/_generated/organization_invitations/client.py +546 -0
  98. mirascope/api/_generated/organization_invitations/raw_client.py +1519 -0
  99. mirascope/api/_generated/organization_invitations/types/__init__.py +53 -0
  100. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +34 -0
  101. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +7 -0
  102. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +7 -0
  103. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +48 -0
  104. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +7 -0
  105. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +7 -0
  106. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +48 -0
  107. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +7 -0
  108. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +7 -0
  109. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +48 -0
  110. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +7 -0
  111. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +7 -0
  112. mirascope/api/_generated/organization_memberships/__init__.py +19 -0
  113. mirascope/api/_generated/organization_memberships/client.py +302 -0
  114. mirascope/api/_generated/organization_memberships/raw_client.py +736 -0
  115. mirascope/api/_generated/organization_memberships/types/__init__.py +27 -0
  116. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +33 -0
  117. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +7 -0
  118. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +7 -0
  119. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +31 -0
  120. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +7 -0
  121. mirascope/api/_generated/organizations/__init__.py +51 -0
  122. mirascope/api/_generated/organizations/client.py +869 -0
  123. mirascope/api/_generated/organizations/raw_client.py +2593 -0
  124. mirascope/api/_generated/organizations/types/__init__.py +71 -0
  125. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +24 -0
  126. mirascope/api/_generated/organizations/types/organizations_create_response.py +26 -0
  127. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +5 -0
  128. mirascope/api/_generated/organizations/types/organizations_get_response.py +26 -0
  129. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +5 -0
  130. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +26 -0
  131. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +5 -0
  132. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +7 -0
  133. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +47 -0
  134. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +33 -0
  135. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +7 -0
  136. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +24 -0
  137. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +53 -0
  138. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +7 -0
  139. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +26 -0
  140. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +34 -0
  141. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +7 -0
  142. mirascope/api/_generated/organizations/types/organizations_update_response.py +26 -0
  143. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +5 -0
  144. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +7 -0
  145. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +35 -0
  146. mirascope/api/_generated/project_memberships/__init__.py +29 -0
  147. mirascope/api/_generated/project_memberships/client.py +528 -0
  148. mirascope/api/_generated/project_memberships/raw_client.py +1278 -0
  149. mirascope/api/_generated/project_memberships/types/__init__.py +33 -0
  150. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +7 -0
  151. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +35 -0
  152. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +7 -0
  153. mirascope/api/_generated/project_memberships/types/project_memberships_get_response.py +33 -0
  154. mirascope/api/_generated/project_memberships/types/project_memberships_get_response_role.py +7 -0
  155. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +33 -0
  156. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +7 -0
  157. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +7 -0
  158. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +35 -0
  159. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +7 -0
  160. mirascope/api/_generated/projects/__init__.py +7 -0
  161. mirascope/api/_generated/projects/client.py +428 -0
  162. mirascope/api/_generated/projects/raw_client.py +1302 -0
  163. mirascope/api/_generated/projects/types/__init__.py +10 -0
  164. mirascope/api/_generated/projects/types/projects_create_response.py +25 -0
  165. mirascope/api/_generated/projects/types/projects_get_response.py +25 -0
  166. mirascope/api/_generated/projects/types/projects_list_response_item.py +25 -0
  167. mirascope/api/_generated/projects/types/projects_update_response.py +25 -0
  168. mirascope/api/_generated/reference.md +4987 -0
  169. mirascope/api/_generated/tags/__init__.py +19 -0
  170. mirascope/api/_generated/tags/client.py +504 -0
  171. mirascope/api/_generated/tags/raw_client.py +1288 -0
  172. mirascope/api/_generated/tags/types/__init__.py +17 -0
  173. mirascope/api/_generated/tags/types/tags_create_response.py +41 -0
  174. mirascope/api/_generated/tags/types/tags_get_response.py +41 -0
  175. mirascope/api/_generated/tags/types/tags_list_response.py +23 -0
  176. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +41 -0
  177. mirascope/api/_generated/tags/types/tags_update_response.py +41 -0
  178. mirascope/api/_generated/token_cost/__init__.py +7 -0
  179. mirascope/api/_generated/token_cost/client.py +160 -0
  180. mirascope/api/_generated/token_cost/raw_client.py +264 -0
  181. mirascope/api/_generated/token_cost/types/__init__.py +8 -0
  182. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +54 -0
  183. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +52 -0
  184. mirascope/api/_generated/traces/__init__.py +97 -0
  185. mirascope/api/_generated/traces/client.py +1103 -0
  186. mirascope/api/_generated/traces/raw_client.py +2322 -0
  187. mirascope/api/_generated/traces/types/__init__.py +155 -0
  188. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +29 -0
  189. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +27 -0
  190. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +23 -0
  191. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +38 -0
  192. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +19 -0
  193. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +22 -0
  194. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +20 -0
  195. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +29 -0
  196. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +31 -0
  197. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +23 -0
  198. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +38 -0
  199. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +19 -0
  200. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +22 -0
  201. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +22 -0
  202. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +48 -0
  203. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +23 -0
  204. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +38 -0
  205. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +19 -0
  206. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +24 -0
  207. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +22 -0
  208. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +20 -0
  209. mirascope/api/_generated/traces/types/traces_create_response.py +24 -0
  210. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +22 -0
  211. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +60 -0
  212. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +24 -0
  213. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +22 -0
  214. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +33 -0
  215. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +88 -0
  216. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +33 -0
  217. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +88 -0
  218. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +25 -0
  219. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +44 -0
  220. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +26 -0
  221. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +7 -0
  222. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +7 -0
  223. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +7 -0
  224. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +26 -0
  225. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +50 -0
  226. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +26 -0
  227. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +7 -0
  228. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +7 -0
  229. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +5 -0
  230. mirascope/api/_generated/traces/types/traces_search_response.py +26 -0
  231. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +50 -0
  232. mirascope/api/_generated/types/__init__.py +85 -0
  233. mirascope/api/_generated/types/already_exists_error.py +22 -0
  234. mirascope/api/_generated/types/already_exists_error_tag.py +5 -0
  235. mirascope/api/_generated/types/bad_request_error_body.py +50 -0
  236. mirascope/api/_generated/types/click_house_error.py +22 -0
  237. mirascope/api/_generated/types/database_error.py +22 -0
  238. mirascope/api/_generated/types/database_error_tag.py +5 -0
  239. mirascope/api/_generated/types/date.py +3 -0
  240. mirascope/api/_generated/types/http_api_decode_error.py +27 -0
  241. mirascope/api/_generated/types/http_api_decode_error_tag.py +5 -0
  242. mirascope/api/_generated/types/immutable_resource_error.py +22 -0
  243. mirascope/api/_generated/types/internal_server_error_body.py +49 -0
  244. mirascope/api/_generated/types/issue.py +38 -0
  245. mirascope/api/_generated/types/issue_tag.py +10 -0
  246. mirascope/api/_generated/types/not_found_error_body.py +22 -0
  247. mirascope/api/_generated/types/not_found_error_tag.py +5 -0
  248. mirascope/api/_generated/types/number_from_string.py +3 -0
  249. mirascope/api/_generated/types/permission_denied_error.py +22 -0
  250. mirascope/api/_generated/types/permission_denied_error_tag.py +5 -0
  251. mirascope/api/_generated/types/plan_limit_exceeded_error.py +32 -0
  252. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +7 -0
  253. mirascope/api/_generated/types/pricing_unavailable_error.py +23 -0
  254. mirascope/api/_generated/types/property_key.py +7 -0
  255. mirascope/api/_generated/types/property_key_key.py +25 -0
  256. mirascope/api/_generated/types/property_key_key_tag.py +5 -0
  257. mirascope/api/_generated/types/rate_limit_error.py +31 -0
  258. mirascope/api/_generated/types/rate_limit_error_tag.py +5 -0
  259. mirascope/api/_generated/types/service_unavailable_error_body.py +24 -0
  260. mirascope/api/_generated/types/service_unavailable_error_tag.py +7 -0
  261. mirascope/api/_generated/types/stripe_error.py +20 -0
  262. mirascope/api/_generated/types/subscription_past_due_error.py +31 -0
  263. mirascope/api/_generated/types/subscription_past_due_error_tag.py +7 -0
  264. mirascope/api/_generated/types/unauthorized_error_body.py +21 -0
  265. mirascope/api/_generated/types/unauthorized_error_tag.py +5 -0
  266. mirascope/api/client.py +255 -0
  267. mirascope/api/settings.py +99 -0
  268. mirascope/llm/__init__.py +316 -0
  269. mirascope/llm/calls/__init__.py +17 -0
  270. mirascope/llm/calls/calls.py +348 -0
  271. mirascope/llm/calls/decorator.py +268 -0
  272. mirascope/llm/content/__init__.py +71 -0
  273. mirascope/llm/content/audio.py +173 -0
  274. mirascope/llm/content/document.py +94 -0
  275. mirascope/llm/content/image.py +206 -0
  276. mirascope/llm/content/text.py +47 -0
  277. mirascope/llm/content/thought.py +58 -0
  278. mirascope/llm/content/tool_call.py +69 -0
  279. mirascope/llm/content/tool_output.py +43 -0
  280. mirascope/llm/context/__init__.py +6 -0
  281. mirascope/llm/context/_utils.py +41 -0
  282. mirascope/llm/context/context.py +24 -0
  283. mirascope/llm/exceptions.py +360 -0
  284. mirascope/llm/formatting/__init__.py +39 -0
  285. mirascope/llm/formatting/format.py +291 -0
  286. mirascope/llm/formatting/from_call_args.py +30 -0
  287. mirascope/llm/formatting/output_parser.py +178 -0
  288. mirascope/llm/formatting/partial.py +131 -0
  289. mirascope/llm/formatting/primitives.py +192 -0
  290. mirascope/llm/formatting/types.py +83 -0
  291. mirascope/llm/mcp/__init__.py +5 -0
  292. mirascope/llm/mcp/mcp_client.py +130 -0
  293. mirascope/llm/messages/__init__.py +35 -0
  294. mirascope/llm/messages/_utils.py +34 -0
  295. mirascope/llm/messages/message.py +190 -0
  296. mirascope/llm/models/__init__.py +21 -0
  297. mirascope/llm/models/models.py +1339 -0
  298. mirascope/llm/models/params.py +72 -0
  299. mirascope/llm/models/thinking_config.py +61 -0
  300. mirascope/llm/prompts/__init__.py +34 -0
  301. mirascope/llm/prompts/_utils.py +31 -0
  302. mirascope/llm/prompts/decorator.py +215 -0
  303. mirascope/llm/prompts/prompts.py +484 -0
  304. mirascope/llm/prompts/protocols.py +65 -0
  305. mirascope/llm/providers/__init__.py +65 -0
  306. mirascope/llm/providers/anthropic/__init__.py +11 -0
  307. mirascope/llm/providers/anthropic/_utils/__init__.py +27 -0
  308. mirascope/llm/providers/anthropic/_utils/beta_decode.py +297 -0
  309. mirascope/llm/providers/anthropic/_utils/beta_encode.py +272 -0
  310. mirascope/llm/providers/anthropic/_utils/decode.py +326 -0
  311. mirascope/llm/providers/anthropic/_utils/encode.py +431 -0
  312. mirascope/llm/providers/anthropic/_utils/errors.py +46 -0
  313. mirascope/llm/providers/anthropic/beta_provider.py +338 -0
  314. mirascope/llm/providers/anthropic/model_id.py +23 -0
  315. mirascope/llm/providers/anthropic/model_info.py +87 -0
  316. mirascope/llm/providers/anthropic/provider.py +440 -0
  317. mirascope/llm/providers/base/__init__.py +14 -0
  318. mirascope/llm/providers/base/_utils.py +248 -0
  319. mirascope/llm/providers/base/base_provider.py +1463 -0
  320. mirascope/llm/providers/base/kwargs.py +12 -0
  321. mirascope/llm/providers/google/__init__.py +6 -0
  322. mirascope/llm/providers/google/_utils/__init__.py +17 -0
  323. mirascope/llm/providers/google/_utils/decode.py +357 -0
  324. mirascope/llm/providers/google/_utils/encode.py +418 -0
  325. mirascope/llm/providers/google/_utils/errors.py +50 -0
  326. mirascope/llm/providers/google/message.py +7 -0
  327. mirascope/llm/providers/google/model_id.py +22 -0
  328. mirascope/llm/providers/google/model_info.py +63 -0
  329. mirascope/llm/providers/google/provider.py +456 -0
  330. mirascope/llm/providers/mirascope/__init__.py +5 -0
  331. mirascope/llm/providers/mirascope/_utils.py +73 -0
  332. mirascope/llm/providers/mirascope/provider.py +313 -0
  333. mirascope/llm/providers/mlx/__init__.py +9 -0
  334. mirascope/llm/providers/mlx/_utils.py +141 -0
  335. mirascope/llm/providers/mlx/encoding/__init__.py +8 -0
  336. mirascope/llm/providers/mlx/encoding/base.py +69 -0
  337. mirascope/llm/providers/mlx/encoding/transformers.py +146 -0
  338. mirascope/llm/providers/mlx/mlx.py +242 -0
  339. mirascope/llm/providers/mlx/model_id.py +17 -0
  340. mirascope/llm/providers/mlx/provider.py +416 -0
  341. mirascope/llm/providers/model_id.py +16 -0
  342. mirascope/llm/providers/ollama/__init__.py +7 -0
  343. mirascope/llm/providers/ollama/provider.py +71 -0
  344. mirascope/llm/providers/openai/__init__.py +15 -0
  345. mirascope/llm/providers/openai/_utils/__init__.py +5 -0
  346. mirascope/llm/providers/openai/_utils/errors.py +46 -0
  347. mirascope/llm/providers/openai/completions/__init__.py +7 -0
  348. mirascope/llm/providers/openai/completions/_utils/__init__.py +18 -0
  349. mirascope/llm/providers/openai/completions/_utils/decode.py +252 -0
  350. mirascope/llm/providers/openai/completions/_utils/encode.py +390 -0
  351. mirascope/llm/providers/openai/completions/_utils/feature_info.py +50 -0
  352. mirascope/llm/providers/openai/completions/base_provider.py +522 -0
  353. mirascope/llm/providers/openai/completions/provider.py +28 -0
  354. mirascope/llm/providers/openai/model_id.py +31 -0
  355. mirascope/llm/providers/openai/model_info.py +303 -0
  356. mirascope/llm/providers/openai/provider.py +405 -0
  357. mirascope/llm/providers/openai/responses/__init__.py +5 -0
  358. mirascope/llm/providers/openai/responses/_utils/__init__.py +15 -0
  359. mirascope/llm/providers/openai/responses/_utils/decode.py +289 -0
  360. mirascope/llm/providers/openai/responses/_utils/encode.py +399 -0
  361. mirascope/llm/providers/openai/responses/provider.py +472 -0
  362. mirascope/llm/providers/openrouter/__init__.py +5 -0
  363. mirascope/llm/providers/openrouter/provider.py +67 -0
  364. mirascope/llm/providers/provider_id.py +26 -0
  365. mirascope/llm/providers/provider_registry.py +305 -0
  366. mirascope/llm/providers/together/__init__.py +7 -0
  367. mirascope/llm/providers/together/provider.py +40 -0
  368. mirascope/llm/responses/__init__.py +66 -0
  369. mirascope/llm/responses/_utils.py +146 -0
  370. mirascope/llm/responses/base_response.py +103 -0
  371. mirascope/llm/responses/base_stream_response.py +824 -0
  372. mirascope/llm/responses/finish_reason.py +28 -0
  373. mirascope/llm/responses/response.py +362 -0
  374. mirascope/llm/responses/root_response.py +248 -0
  375. mirascope/llm/responses/stream_response.py +577 -0
  376. mirascope/llm/responses/streams.py +363 -0
  377. mirascope/llm/responses/usage.py +139 -0
  378. mirascope/llm/tools/__init__.py +71 -0
  379. mirascope/llm/tools/_utils.py +34 -0
  380. mirascope/llm/tools/decorator.py +184 -0
  381. mirascope/llm/tools/protocols.py +96 -0
  382. mirascope/llm/tools/provider_tools.py +18 -0
  383. mirascope/llm/tools/tool_schema.py +321 -0
  384. mirascope/llm/tools/toolkit.py +178 -0
  385. mirascope/llm/tools/tools.py +263 -0
  386. mirascope/llm/tools/types.py +112 -0
  387. mirascope/llm/tools/web_search_tool.py +32 -0
  388. mirascope/llm/types/__init__.py +22 -0
  389. mirascope/llm/types/dataclass.py +9 -0
  390. mirascope/llm/types/jsonable.py +44 -0
  391. mirascope/llm/types/type_vars.py +19 -0
  392. mirascope/ops/__init__.py +129 -0
  393. mirascope/ops/_internal/__init__.py +5 -0
  394. mirascope/ops/_internal/closure.py +1172 -0
  395. mirascope/ops/_internal/configuration.py +177 -0
  396. mirascope/ops/_internal/context.py +76 -0
  397. mirascope/ops/_internal/exporters/__init__.py +26 -0
  398. mirascope/ops/_internal/exporters/exporters.py +362 -0
  399. mirascope/ops/_internal/exporters/processors.py +104 -0
  400. mirascope/ops/_internal/exporters/types.py +165 -0
  401. mirascope/ops/_internal/exporters/utils.py +66 -0
  402. mirascope/ops/_internal/instrumentation/__init__.py +28 -0
  403. mirascope/ops/_internal/instrumentation/llm/__init__.py +8 -0
  404. mirascope/ops/_internal/instrumentation/llm/common.py +500 -0
  405. mirascope/ops/_internal/instrumentation/llm/cost.py +190 -0
  406. mirascope/ops/_internal/instrumentation/llm/encode.py +238 -0
  407. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +38 -0
  408. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +31 -0
  409. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +38 -0
  410. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +18 -0
  411. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +100 -0
  412. mirascope/ops/_internal/instrumentation/llm/llm.py +161 -0
  413. mirascope/ops/_internal/instrumentation/llm/model.py +1777 -0
  414. mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
  415. mirascope/ops/_internal/instrumentation/llm/serialize.py +324 -0
  416. mirascope/ops/_internal/instrumentation/providers/__init__.py +29 -0
  417. mirascope/ops/_internal/instrumentation/providers/anthropic.py +78 -0
  418. mirascope/ops/_internal/instrumentation/providers/base.py +179 -0
  419. mirascope/ops/_internal/instrumentation/providers/google_genai.py +85 -0
  420. mirascope/ops/_internal/instrumentation/providers/openai.py +82 -0
  421. mirascope/ops/_internal/propagation.py +198 -0
  422. mirascope/ops/_internal/protocols.py +133 -0
  423. mirascope/ops/_internal/session.py +139 -0
  424. mirascope/ops/_internal/spans.py +232 -0
  425. mirascope/ops/_internal/traced_calls.py +389 -0
  426. mirascope/ops/_internal/traced_functions.py +528 -0
  427. mirascope/ops/_internal/tracing.py +353 -0
  428. mirascope/ops/_internal/types.py +13 -0
  429. mirascope/ops/_internal/utils.py +131 -0
  430. mirascope/ops/_internal/versioned_calls.py +512 -0
  431. mirascope/ops/_internal/versioned_functions.py +357 -0
  432. mirascope/ops/_internal/versioning.py +303 -0
  433. mirascope/ops/exceptions.py +21 -0
  434. mirascope-2.1.1.dist-info/METADATA +231 -0
  435. mirascope-2.1.1.dist-info/RECORD +437 -0
  436. {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/WHEEL +1 -1
  437. {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/licenses/LICENSE +1 -1
  438. mirascope/beta/__init__.py +0 -0
  439. mirascope/beta/openai/__init__.py +0 -5
  440. mirascope/beta/openai/parse.py +0 -129
  441. mirascope/beta/rag/__init__.py +0 -24
  442. mirascope/beta/rag/base/__init__.py +0 -22
  443. mirascope/beta/rag/base/chunkers/__init__.py +0 -2
  444. mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
  445. mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
  446. mirascope/beta/rag/base/config.py +0 -8
  447. mirascope/beta/rag/base/document.py +0 -11
  448. mirascope/beta/rag/base/embedders.py +0 -35
  449. mirascope/beta/rag/base/embedding_params.py +0 -18
  450. mirascope/beta/rag/base/embedding_response.py +0 -30
  451. mirascope/beta/rag/base/query_results.py +0 -7
  452. mirascope/beta/rag/base/vectorstore_params.py +0 -18
  453. mirascope/beta/rag/base/vectorstores.py +0 -37
  454. mirascope/beta/rag/chroma/__init__.py +0 -11
  455. mirascope/beta/rag/chroma/types.py +0 -57
  456. mirascope/beta/rag/chroma/vectorstores.py +0 -97
  457. mirascope/beta/rag/cohere/__init__.py +0 -11
  458. mirascope/beta/rag/cohere/embedders.py +0 -87
  459. mirascope/beta/rag/cohere/embedding_params.py +0 -29
  460. mirascope/beta/rag/cohere/embedding_response.py +0 -29
  461. mirascope/beta/rag/cohere/py.typed +0 -0
  462. mirascope/beta/rag/openai/__init__.py +0 -11
  463. mirascope/beta/rag/openai/embedders.py +0 -144
  464. mirascope/beta/rag/openai/embedding_params.py +0 -18
  465. mirascope/beta/rag/openai/embedding_response.py +0 -14
  466. mirascope/beta/rag/openai/py.typed +0 -0
  467. mirascope/beta/rag/pinecone/__init__.py +0 -19
  468. mirascope/beta/rag/pinecone/types.py +0 -143
  469. mirascope/beta/rag/pinecone/vectorstores.py +0 -148
  470. mirascope/beta/rag/weaviate/__init__.py +0 -6
  471. mirascope/beta/rag/weaviate/types.py +0 -92
  472. mirascope/beta/rag/weaviate/vectorstores.py +0 -103
  473. mirascope/core/__init__.py +0 -55
  474. mirascope/core/anthropic/__init__.py +0 -21
  475. mirascope/core/anthropic/_call.py +0 -71
  476. mirascope/core/anthropic/_utils/__init__.py +0 -16
  477. mirascope/core/anthropic/_utils/_calculate_cost.py +0 -63
  478. mirascope/core/anthropic/_utils/_convert_message_params.py +0 -54
  479. mirascope/core/anthropic/_utils/_get_json_output.py +0 -34
  480. mirascope/core/anthropic/_utils/_handle_stream.py +0 -89
  481. mirascope/core/anthropic/_utils/_setup_call.py +0 -76
  482. mirascope/core/anthropic/call_params.py +0 -36
  483. mirascope/core/anthropic/call_response.py +0 -158
  484. mirascope/core/anthropic/call_response_chunk.py +0 -104
  485. mirascope/core/anthropic/dynamic_config.py +0 -26
  486. mirascope/core/anthropic/py.typed +0 -0
  487. mirascope/core/anthropic/stream.py +0 -140
  488. mirascope/core/anthropic/tool.py +0 -77
  489. mirascope/core/base/__init__.py +0 -40
  490. mirascope/core/base/_call_factory.py +0 -323
  491. mirascope/core/base/_create.py +0 -167
  492. mirascope/core/base/_extract.py +0 -139
  493. mirascope/core/base/_partial.py +0 -63
  494. mirascope/core/base/_utils/__init__.py +0 -64
  495. mirascope/core/base/_utils/_base_type.py +0 -17
  496. mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -45
  497. mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
  498. mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -126
  499. mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
  500. mirascope/core/base/_utils/_extract_tool_return.py +0 -36
  501. mirascope/core/base/_utils/_format_template.py +0 -29
  502. mirascope/core/base/_utils/_get_audio_type.py +0 -18
  503. mirascope/core/base/_utils/_get_fn_args.py +0 -14
  504. mirascope/core/base/_utils/_get_image_type.py +0 -26
  505. mirascope/core/base/_utils/_get_metadata.py +0 -17
  506. mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
  507. mirascope/core/base/_utils/_get_prompt_template.py +0 -25
  508. mirascope/core/base/_utils/_get_template_values.py +0 -52
  509. mirascope/core/base/_utils/_get_template_variables.py +0 -38
  510. mirascope/core/base/_utils/_json_mode_content.py +0 -15
  511. mirascope/core/base/_utils/_parse_content_template.py +0 -157
  512. mirascope/core/base/_utils/_parse_prompt_messages.py +0 -51
  513. mirascope/core/base/_utils/_protocols.py +0 -215
  514. mirascope/core/base/_utils/_setup_call.py +0 -64
  515. mirascope/core/base/_utils/_setup_extract_tool.py +0 -24
  516. mirascope/core/base/call_params.py +0 -6
  517. mirascope/core/base/call_response.py +0 -189
  518. mirascope/core/base/call_response_chunk.py +0 -91
  519. mirascope/core/base/dynamic_config.py +0 -55
  520. mirascope/core/base/message_param.py +0 -61
  521. mirascope/core/base/metadata.py +0 -13
  522. mirascope/core/base/prompt.py +0 -415
  523. mirascope/core/base/stream.py +0 -365
  524. mirascope/core/base/structured_stream.py +0 -251
  525. mirascope/core/base/tool.py +0 -126
  526. mirascope/core/base/toolkit.py +0 -146
  527. mirascope/core/cohere/__init__.py +0 -21
  528. mirascope/core/cohere/_call.py +0 -71
  529. mirascope/core/cohere/_utils/__init__.py +0 -16
  530. mirascope/core/cohere/_utils/_calculate_cost.py +0 -39
  531. mirascope/core/cohere/_utils/_convert_message_params.py +0 -31
  532. mirascope/core/cohere/_utils/_get_json_output.py +0 -31
  533. mirascope/core/cohere/_utils/_handle_stream.py +0 -33
  534. mirascope/core/cohere/_utils/_setup_call.py +0 -89
  535. mirascope/core/cohere/call_params.py +0 -57
  536. mirascope/core/cohere/call_response.py +0 -167
  537. mirascope/core/cohere/call_response_chunk.py +0 -101
  538. mirascope/core/cohere/dynamic_config.py +0 -24
  539. mirascope/core/cohere/py.typed +0 -0
  540. mirascope/core/cohere/stream.py +0 -113
  541. mirascope/core/cohere/tool.py +0 -92
  542. mirascope/core/gemini/__init__.py +0 -21
  543. mirascope/core/gemini/_call.py +0 -71
  544. mirascope/core/gemini/_utils/__init__.py +0 -16
  545. mirascope/core/gemini/_utils/_calculate_cost.py +0 -8
  546. mirascope/core/gemini/_utils/_convert_message_params.py +0 -74
  547. mirascope/core/gemini/_utils/_get_json_output.py +0 -33
  548. mirascope/core/gemini/_utils/_handle_stream.py +0 -33
  549. mirascope/core/gemini/_utils/_setup_call.py +0 -68
  550. mirascope/core/gemini/call_params.py +0 -28
  551. mirascope/core/gemini/call_response.py +0 -173
  552. mirascope/core/gemini/call_response_chunk.py +0 -85
  553. mirascope/core/gemini/dynamic_config.py +0 -26
  554. mirascope/core/gemini/stream.py +0 -121
  555. mirascope/core/gemini/tool.py +0 -104
  556. mirascope/core/groq/__init__.py +0 -21
  557. mirascope/core/groq/_call.py +0 -71
  558. mirascope/core/groq/_utils/__init__.py +0 -16
  559. mirascope/core/groq/_utils/_calculate_cost.py +0 -68
  560. mirascope/core/groq/_utils/_convert_message_params.py +0 -23
  561. mirascope/core/groq/_utils/_get_json_output.py +0 -27
  562. mirascope/core/groq/_utils/_handle_stream.py +0 -121
  563. mirascope/core/groq/_utils/_setup_call.py +0 -67
  564. mirascope/core/groq/call_params.py +0 -51
  565. mirascope/core/groq/call_response.py +0 -160
  566. mirascope/core/groq/call_response_chunk.py +0 -89
  567. mirascope/core/groq/dynamic_config.py +0 -26
  568. mirascope/core/groq/py.typed +0 -0
  569. mirascope/core/groq/stream.py +0 -136
  570. mirascope/core/groq/tool.py +0 -79
  571. mirascope/core/litellm/__init__.py +0 -6
  572. mirascope/core/litellm/_call.py +0 -73
  573. mirascope/core/litellm/_utils/__init__.py +0 -5
  574. mirascope/core/litellm/_utils/_setup_call.py +0 -46
  575. mirascope/core/litellm/py.typed +0 -0
  576. mirascope/core/mistral/__init__.py +0 -21
  577. mirascope/core/mistral/_call.py +0 -69
  578. mirascope/core/mistral/_utils/__init__.py +0 -16
  579. mirascope/core/mistral/_utils/_calculate_cost.py +0 -47
  580. mirascope/core/mistral/_utils/_convert_message_params.py +0 -23
  581. mirascope/core/mistral/_utils/_get_json_output.py +0 -28
  582. mirascope/core/mistral/_utils/_handle_stream.py +0 -121
  583. mirascope/core/mistral/_utils/_setup_call.py +0 -86
  584. mirascope/core/mistral/call_params.py +0 -36
  585. mirascope/core/mistral/call_response.py +0 -156
  586. mirascope/core/mistral/call_response_chunk.py +0 -84
  587. mirascope/core/mistral/dynamic_config.py +0 -24
  588. mirascope/core/mistral/py.typed +0 -0
  589. mirascope/core/mistral/stream.py +0 -117
  590. mirascope/core/mistral/tool.py +0 -77
  591. mirascope/core/openai/__init__.py +0 -21
  592. mirascope/core/openai/_call.py +0 -71
  593. mirascope/core/openai/_utils/__init__.py +0 -16
  594. mirascope/core/openai/_utils/_calculate_cost.py +0 -110
  595. mirascope/core/openai/_utils/_convert_message_params.py +0 -53
  596. mirascope/core/openai/_utils/_get_json_output.py +0 -27
  597. mirascope/core/openai/_utils/_handle_stream.py +0 -125
  598. mirascope/core/openai/_utils/_setup_call.py +0 -62
  599. mirascope/core/openai/call_params.py +0 -54
  600. mirascope/core/openai/call_response.py +0 -162
  601. mirascope/core/openai/call_response_chunk.py +0 -90
  602. mirascope/core/openai/dynamic_config.py +0 -26
  603. mirascope/core/openai/py.typed +0 -0
  604. mirascope/core/openai/stream.py +0 -148
  605. mirascope/core/openai/tool.py +0 -79
  606. mirascope/core/py.typed +0 -0
  607. mirascope/integrations/__init__.py +0 -20
  608. mirascope/integrations/_middleware_factory.py +0 -277
  609. mirascope/integrations/langfuse/__init__.py +0 -3
  610. mirascope/integrations/langfuse/_utils.py +0 -114
  611. mirascope/integrations/langfuse/_with_langfuse.py +0 -71
  612. mirascope/integrations/logfire/__init__.py +0 -3
  613. mirascope/integrations/logfire/_utils.py +0 -188
  614. mirascope/integrations/logfire/_with_logfire.py +0 -60
  615. mirascope/integrations/otel/__init__.py +0 -5
  616. mirascope/integrations/otel/_utils.py +0 -268
  617. mirascope/integrations/otel/_with_hyperdx.py +0 -61
  618. mirascope/integrations/otel/_with_otel.py +0 -60
  619. mirascope/integrations/tenacity.py +0 -50
  620. mirascope/py.typed +0 -0
  621. mirascope/v0/__init__.py +0 -43
  622. mirascope/v0/anthropic.py +0 -54
  623. mirascope/v0/base/__init__.py +0 -12
  624. mirascope/v0/base/calls.py +0 -118
  625. mirascope/v0/base/extractors.py +0 -122
  626. mirascope/v0/base/ops_utils.py +0 -207
  627. mirascope/v0/base/prompts.py +0 -48
  628. mirascope/v0/base/types.py +0 -14
  629. mirascope/v0/base/utils.py +0 -21
  630. mirascope/v0/openai.py +0 -54
  631. mirascope-1.0.5.dist-info/METADATA +0 -519
  632. mirascope-1.0.5.dist-info/RECORD +0 -198
@@ -1,323 +0,0 @@
1
- """The `call_factory` method for generating provider specific call decorators."""
2
-
3
- from collections.abc import AsyncIterable, Callable, Iterable
4
- from enum import Enum
5
- from functools import partial
6
- from typing import (
7
- Annotated,
8
- Literal,
9
- NoReturn,
10
- TypeVar,
11
- overload,
12
- )
13
-
14
- from pydantic import BaseModel
15
-
16
- from ._create import create_factory
17
- from ._extract import extract_factory
18
- from ._utils import (
19
- BaseType,
20
- GetJsonOutput,
21
- HandleStream,
22
- HandleStreamAsync,
23
- LLMFunctionDecorator,
24
- SetupCall,
25
- )
26
- from .call_params import BaseCallParams
27
- from .call_response import BaseCallResponse
28
- from .call_response_chunk import BaseCallResponseChunk
29
- from .dynamic_config import BaseDynamicConfig
30
- from .stream import BaseStream, stream_factory
31
- from .structured_stream import structured_stream_factory
32
- from .tool import BaseTool
33
-
34
- _BaseCallResponseT = TypeVar("_BaseCallResponseT", bound=BaseCallResponse)
35
- _BaseCallResponseChunkT = TypeVar(
36
- "_BaseCallResponseChunkT", bound=BaseCallResponseChunk
37
- )
38
- _ResponseModelT = TypeVar(
39
- "_ResponseModelT", bound=BaseModel | BaseType | Enum | Annotated
40
- )
41
- _ParsedOutputT = TypeVar("_ParsedOutputT")
42
- _BaseCallParamsT = TypeVar("_BaseCallParamsT", bound=BaseCallParams)
43
- _BaseDynamicConfigT = TypeVar("_BaseDynamicConfigT", bound=BaseDynamicConfig)
44
- _BaseStreamT = TypeVar("_BaseStreamT", bound=BaseStream)
45
- _BaseClientT = TypeVar("_BaseClientT", bound=object)
46
- _BaseToolT = TypeVar("_BaseToolT", bound=BaseTool)
47
- _ResponseT = TypeVar("_ResponseT")
48
- _ResponseChunkT = TypeVar("_ResponseChunkT")
49
-
50
-
51
- def call_factory( # noqa: ANN202
52
- *,
53
- TCallResponse: type[_BaseCallResponseT],
54
- TCallResponseChunk: type[_BaseCallResponseChunkT],
55
- TDynamicConfig: type[_BaseDynamicConfigT],
56
- TToolType: type[_BaseToolT],
57
- TStream: type[_BaseStreamT],
58
- TCallParams: type[_BaseCallParamsT],
59
- default_call_params: _BaseCallParamsT,
60
- setup_call: SetupCall[
61
- _BaseClientT,
62
- _BaseDynamicConfigT,
63
- _BaseCallParamsT,
64
- _ResponseT,
65
- _ResponseChunkT,
66
- _BaseToolT,
67
- ],
68
- get_json_output: GetJsonOutput[_BaseCallResponseT | _BaseCallResponseChunkT],
69
- handle_stream: HandleStream[_ResponseChunkT, _BaseCallResponseChunkT, _BaseToolT],
70
- handle_stream_async: HandleStreamAsync[
71
- _ResponseChunkT, _BaseCallResponseChunkT, _BaseToolT
72
- ],
73
- ):
74
- """A factory method for creating provider-specific call decorators.
75
-
76
- Args:
77
- TCallResponse: The provider-specific `BaseCallResponse` type.
78
- TCallResponseChunk: The provider-specific `BaseCallResponseChunk` type.
79
- TDynamicConfig: The provider-specific `BaseDynamicConfig` type.
80
- TToolType: The provider-specific `BaseTool` type.
81
- TStream: The provider-specific `BaseStream` type.
82
- TCallParams: The provider-specific `BaseCallParams` type.
83
- default_call_params: The default call parameters to use, which must match the
84
- `TCallParams` type if provided.
85
- setup_call: The helper method for setting up a call, which returns the
86
- configured create function, the prompt template, the list of
87
- provider-specific messages, the list of provider-specific tool types, and
88
- the finalized `call_kwargs` with which to make the API call with the create
89
- function.
90
- get_json_output: The helper method for getting JSON output from a call response.
91
- handle_stream: The helper method for converting a provider's original stream
92
- generator into a generator that returns tuples of `(chunk, tool)` where
93
- `chunk` and `tool` are provider-specific `BaseCallResponseChunk` and
94
- `BaseTool` instances, respectively.
95
- handle_stream_async: The same helper method as `handle_stream` except for
96
- handling asynchronous streaming.
97
- """
98
-
99
- @overload
100
- def base_call(
101
- model: str,
102
- *,
103
- stream: Literal[False] = False,
104
- tools: list[type[BaseTool] | Callable] | None = None,
105
- response_model: None = None,
106
- output_parser: None = None,
107
- json_mode: bool = False,
108
- client: _BaseClientT | None = None,
109
- call_params: TCallParams | None = None,
110
- ) -> LLMFunctionDecorator[TDynamicConfig, TCallResponse, TCallResponse]: ...
111
-
112
- @overload
113
- def base_call(
114
- model: str,
115
- *,
116
- stream: Literal[False] = False,
117
- tools: list[type[BaseTool] | Callable] | None = None,
118
- response_model: None = None,
119
- output_parser: Callable[[TCallResponse], _ParsedOutputT],
120
- json_mode: bool = False,
121
- client: _BaseClientT | None = None,
122
- call_params: TCallParams | None = None,
123
- ) -> LLMFunctionDecorator[TDynamicConfig, _ParsedOutputT, _ParsedOutputT]: ...
124
-
125
- @overload
126
- def base_call(
127
- model: str,
128
- *,
129
- stream: Literal[False] = False,
130
- tools: list[type[BaseTool] | Callable] | None = None,
131
- response_model: None = None,
132
- output_parser: Callable[[TCallResponseChunk], _ParsedOutputT],
133
- json_mode: bool = False,
134
- client: _BaseClientT | None = None,
135
- call_params: TCallParams | None = None,
136
- ) -> NoReturn: ...
137
-
138
- @overload
139
- def base_call(
140
- model: str,
141
- *,
142
- stream: Literal[True] = True,
143
- tools: list[type[BaseTool] | Callable] | None = None,
144
- response_model: None = None,
145
- output_parser: None = None,
146
- json_mode: bool = False,
147
- client: _BaseClientT | None = None,
148
- call_params: TCallParams | None = None,
149
- ) -> LLMFunctionDecorator[TDynamicConfig, TStream, TStream]: ...
150
-
151
- @overload
152
- def base_call(
153
- model: str,
154
- *,
155
- stream: Literal[True] = True,
156
- tools: list[type[BaseTool] | Callable] | None = None,
157
- response_model: None = None,
158
- output_parser: Callable[[TCallResponseChunk], _ParsedOutputT],
159
- json_mode: bool = False,
160
- client: _BaseClientT | None = None,
161
- call_params: TCallParams | None = None,
162
- ) -> NoReturn: ...
163
-
164
- @overload
165
- def base_call(
166
- model: str,
167
- *,
168
- stream: Literal[True] = True,
169
- tools: list[type[BaseTool] | Callable] | None = None,
170
- response_model: None = None,
171
- output_parser: Callable[[TCallResponse], _ParsedOutputT],
172
- json_mode: bool = False,
173
- client: _BaseClientT | None = None,
174
- call_params: TCallParams | None = None,
175
- ) -> NoReturn: ...
176
-
177
- @overload
178
- def base_call(
179
- model: str,
180
- *,
181
- stream: Literal[False] = False,
182
- tools: list[type[BaseTool] | Callable] | None = None,
183
- response_model: type[_ResponseModelT],
184
- output_parser: None = None,
185
- json_mode: bool = False,
186
- client: _BaseClientT | None = None,
187
- call_params: TCallParams | None = None,
188
- ) -> LLMFunctionDecorator[TDynamicConfig, _ResponseModelT, _ResponseModelT]: ...
189
-
190
- @overload
191
- def base_call(
192
- model: str,
193
- *,
194
- stream: Literal[False] = False,
195
- tools: list[type[BaseTool] | Callable] | None = None,
196
- response_model: type[_ResponseModelT],
197
- output_parser: Callable[[_ResponseModelT], _ParsedOutputT],
198
- json_mode: bool = False,
199
- client: _BaseClientT | None = None,
200
- call_params: TCallParams | None = None,
201
- ) -> LLMFunctionDecorator[TDynamicConfig, _ParsedOutputT, _ParsedOutputT]: ...
202
-
203
- @overload
204
- def base_call(
205
- model: str,
206
- *,
207
- stream: Literal[True],
208
- tools: list[type[BaseTool] | Callable] | None = None,
209
- response_model: type[_ResponseModelT],
210
- output_parser: None = None,
211
- json_mode: bool = False,
212
- client: _BaseClientT | None = None,
213
- call_params: TCallParams | None = None,
214
- ) -> LLMFunctionDecorator[
215
- TDynamicConfig, Iterable[_ResponseModelT], AsyncIterable[_ResponseModelT]
216
- ]: ...
217
-
218
- @overload
219
- def base_call(
220
- model: str,
221
- *,
222
- stream: Literal[True],
223
- tools: list[type[BaseTool] | Callable] | None = None,
224
- response_model: type[_ResponseModelT],
225
- output_parser: Callable[[TCallResponse], _ParsedOutputT]
226
- | Callable[[TCallResponseChunk], _ParsedOutputT]
227
- | Callable[[_ResponseModelT], _ParsedOutputT]
228
- | None,
229
- json_mode: bool = False,
230
- client: _BaseClientT | None = None,
231
- call_params: TCallParams | None = None,
232
- ) -> NoReturn: ...
233
-
234
- def base_call(
235
- model: str,
236
- *,
237
- stream: bool = False,
238
- tools: list[type[BaseTool] | Callable] | None = None,
239
- response_model: type[_ResponseModelT] | None = None,
240
- output_parser: Callable[[TCallResponse], _ParsedOutputT]
241
- | Callable[[TCallResponseChunk], _ParsedOutputT]
242
- | Callable[[_ResponseModelT], _ParsedOutputT]
243
- | None = None,
244
- json_mode: bool = False,
245
- client: _BaseClientT | None = None,
246
- call_params: TCallParams | None = None,
247
- ) -> LLMFunctionDecorator[
248
- TDynamicConfig,
249
- TCallResponse
250
- | _ParsedOutputT
251
- | TStream
252
- | _ResponseModelT
253
- | Iterable[_ResponseModelT],
254
- TCallResponse
255
- | _ParsedOutputT
256
- | TStream
257
- | _ResponseModelT
258
- | AsyncIterable[_ResponseModelT],
259
- ]:
260
- if stream and output_parser:
261
- raise ValueError("Cannot use `output_parser` with `stream=True`.")
262
-
263
- if call_params is None:
264
- call_params = default_call_params
265
-
266
- if response_model:
267
- if stream:
268
- return partial(
269
- structured_stream_factory(
270
- TCallResponse=TCallResponse,
271
- TCallResponseChunk=TCallResponseChunk,
272
- TStream=TStream,
273
- TToolType=TToolType,
274
- setup_call=setup_call,
275
- get_json_output=get_json_output,
276
- ),
277
- model=model,
278
- response_model=response_model,
279
- json_mode=json_mode,
280
- client=client,
281
- call_params=call_params,
282
- ) # type: ignore
283
- else:
284
- return partial(
285
- extract_factory(
286
- TCallResponse=TCallResponse,
287
- TToolType=TToolType,
288
- setup_call=setup_call,
289
- get_json_output=get_json_output,
290
- ),
291
- model=model,
292
- response_model=response_model,
293
- output_parser=output_parser,
294
- json_mode=json_mode,
295
- client=client,
296
- call_params=call_params,
297
- ) # type: ignore
298
- if stream:
299
- return partial(
300
- stream_factory(
301
- TCallResponse=TCallResponse,
302
- TStream=TStream,
303
- setup_call=setup_call,
304
- handle_stream=handle_stream,
305
- handle_stream_async=handle_stream_async,
306
- ),
307
- model=model,
308
- tools=tools,
309
- json_mode=json_mode,
310
- client=client,
311
- call_params=call_params,
312
- ) # type: ignore
313
- return partial(
314
- create_factory(TCallResponse=TCallResponse, setup_call=setup_call),
315
- model=model,
316
- tools=tools,
317
- output_parser=output_parser,
318
- json_mode=json_mode,
319
- client=client,
320
- call_params=call_params,
321
- ) # type: ignore
322
-
323
- return base_call
@@ -1,167 +0,0 @@
1
- """The `create_factory` method for generating provider specific create decorators."""
2
-
3
- import datetime
4
- import inspect
5
- from collections.abc import Awaitable, Callable
6
- from functools import wraps
7
- from typing import ParamSpec, TypeVar, overload
8
-
9
- from ._utils import (
10
- SetupCall,
11
- get_fn_args,
12
- get_metadata,
13
- get_possible_user_message_param,
14
- )
15
- from .call_params import BaseCallParams
16
- from .call_response import BaseCallResponse
17
- from .dynamic_config import BaseDynamicConfig
18
- from .tool import BaseTool
19
-
20
- _BaseCallResponseT = TypeVar("_BaseCallResponseT", bound=BaseCallResponse)
21
- _BaseClientT = TypeVar("_BaseClientT", bound=object)
22
- _BaseDynamicConfigT = TypeVar("_BaseDynamicConfigT", bound=BaseDynamicConfig)
23
- _ParsedOutputT = TypeVar("_ParsedOutputT")
24
- _BaseCallParamsT = TypeVar("_BaseCallParamsT", bound=BaseCallParams)
25
- _ResponseT = TypeVar("_ResponseT")
26
- _ResponseChunkT = TypeVar("_ResponseChunkT")
27
- _BaseToolT = TypeVar("_BaseToolT", bound=BaseTool)
28
- _P = ParamSpec("_P")
29
-
30
-
31
- def create_factory( # noqa: ANN202
32
- *,
33
- TCallResponse: type[_BaseCallResponseT],
34
- setup_call: SetupCall[
35
- _BaseClientT,
36
- _BaseDynamicConfigT,
37
- _BaseCallParamsT,
38
- _ResponseT,
39
- _ResponseChunkT,
40
- _BaseToolT,
41
- ],
42
- ):
43
- """Returns the wrapped function with the provider specific interfaces."""
44
-
45
- @overload
46
- def decorator(
47
- fn: Callable[_P, _BaseDynamicConfigT],
48
- model: str,
49
- tools: list[type[BaseTool] | Callable] | None,
50
- output_parser: Callable[[_BaseCallResponseT], _ParsedOutputT] | None,
51
- json_mode: bool,
52
- client: _BaseClientT | None,
53
- call_params: _BaseCallParamsT,
54
- ) -> Callable[_P, _BaseCallResponseT | _ParsedOutputT]: ...
55
-
56
- @overload
57
- def decorator(
58
- fn: Callable[_P, Awaitable[_BaseDynamicConfigT]],
59
- model: str,
60
- tools: list[type[BaseTool] | Callable] | None,
61
- output_parser: Callable[[_BaseCallResponseT], _ParsedOutputT] | None,
62
- json_mode: bool,
63
- client: _BaseClientT | None,
64
- call_params: _BaseCallParamsT,
65
- ) -> Callable[
66
- _P,
67
- Awaitable[_BaseCallResponseT | _ParsedOutputT],
68
- ]: ...
69
-
70
- def decorator(
71
- fn: Callable[_P, _BaseDynamicConfigT | Awaitable[_BaseDynamicConfigT]],
72
- model: str,
73
- tools: list[type[BaseTool] | Callable] | None,
74
- output_parser: Callable[[_BaseCallResponseT], _ParsedOutputT] | None,
75
- json_mode: bool,
76
- client: _BaseClientT | None,
77
- call_params: _BaseCallParamsT,
78
- ) -> Callable[
79
- _P,
80
- _BaseCallResponseT
81
- | _ParsedOutputT
82
- | Awaitable[_BaseCallResponseT | _ParsedOutputT],
83
- ]:
84
- if inspect.iscoroutinefunction(fn):
85
-
86
- @wraps(fn)
87
- async def inner_async(
88
- *args: _P.args, **kwargs: _P.kwargs
89
- ) -> TCallResponse | _ParsedOutputT:
90
- assert SetupCall.fn_is_async(fn)
91
- fn_args = get_fn_args(fn, args, kwargs)
92
- dynamic_config = await fn(*args, **kwargs)
93
- create, prompt_template, messages, tool_types, call_kwargs = setup_call(
94
- model=model,
95
- client=client,
96
- fn=fn,
97
- fn_args=fn_args,
98
- dynamic_config=dynamic_config,
99
- tools=tools,
100
- json_mode=json_mode,
101
- call_params=call_params,
102
- extract=False,
103
- )
104
- start_time = datetime.datetime.now().timestamp() * 1000
105
- response = await create(stream=False, **call_kwargs)
106
- end_time = datetime.datetime.now().timestamp() * 1000
107
- output = TCallResponse(
108
- metadata=get_metadata(fn, dynamic_config),
109
- response=response,
110
- tool_types=tool_types, # type: ignore
111
- prompt_template=prompt_template,
112
- fn_args=fn_args,
113
- dynamic_config=dynamic_config,
114
- messages=messages,
115
- call_params=call_params,
116
- call_kwargs=call_kwargs,
117
- user_message_param=get_possible_user_message_param(messages),
118
- start_time=start_time,
119
- end_time=end_time,
120
- )
121
- output._model = model
122
- return output if not output_parser else output_parser(output)
123
-
124
- return inner_async
125
- else:
126
-
127
- @wraps(fn)
128
- def inner(
129
- *args: _P.args, **kwargs: _P.kwargs
130
- ) -> TCallResponse | _ParsedOutputT:
131
- assert SetupCall.fn_is_sync(fn)
132
- fn_args = get_fn_args(fn, args, kwargs)
133
- dynamic_config = fn(*args, **kwargs)
134
- create, prompt_template, messages, tool_types, call_kwargs = setup_call(
135
- model=model,
136
- client=client,
137
- fn=fn,
138
- fn_args=fn_args,
139
- dynamic_config=dynamic_config,
140
- tools=tools,
141
- json_mode=json_mode,
142
- call_params=call_params,
143
- extract=False,
144
- )
145
- start_time = datetime.datetime.now().timestamp() * 1000
146
- response = create(stream=False, **call_kwargs)
147
- end_time = datetime.datetime.now().timestamp() * 1000
148
- output = TCallResponse(
149
- metadata=get_metadata(fn, dynamic_config),
150
- response=response,
151
- tool_types=tool_types, # type: ignore
152
- prompt_template=prompt_template,
153
- fn_args=fn_args,
154
- dynamic_config=dynamic_config,
155
- messages=messages,
156
- call_params=call_params,
157
- call_kwargs=call_kwargs,
158
- user_message_param=get_possible_user_message_param(messages),
159
- start_time=start_time,
160
- end_time=end_time,
161
- )
162
- output._model = model
163
- return output if not output_parser else output_parser(output)
164
-
165
- return inner
166
-
167
- return decorator
@@ -1,139 +0,0 @@
1
- """The `extract_factory` method for generating provider specific create decorators."""
2
-
3
- import inspect
4
- from collections.abc import Awaitable, Callable
5
- from functools import wraps
6
- from typing import ParamSpec, TypeVar, overload
7
-
8
- from pydantic import BaseModel, ValidationError
9
-
10
- from ._create import create_factory
11
- from ._utils import (
12
- BaseType,
13
- GetJsonOutput,
14
- SetupCall,
15
- extract_tool_return,
16
- setup_extract_tool,
17
- )
18
- from .call_params import BaseCallParams
19
- from .call_response import BaseCallResponse
20
- from .dynamic_config import BaseDynamicConfig
21
- from .tool import BaseTool
22
-
23
- _BaseCallResponseT = TypeVar("_BaseCallResponseT", bound=BaseCallResponse)
24
- _BaseClientT = TypeVar("_BaseClientT", bound=object)
25
- _BaseDynamicConfigT = TypeVar("_BaseDynamicConfigT", bound=BaseDynamicConfig)
26
- _ParsedOutputT = TypeVar("_ParsedOutputT")
27
- _BaseCallParamsT = TypeVar("_BaseCallParamsT", bound=BaseCallParams)
28
- _ResponseT = TypeVar("_ResponseT")
29
- _ResponseChunkT = TypeVar("_ResponseChunkT")
30
- _BaseToolT = TypeVar("_BaseToolT", bound=BaseTool)
31
- _ResponseModelT = TypeVar("_ResponseModelT", bound=BaseModel | BaseType)
32
- _P = ParamSpec("_P")
33
-
34
-
35
- def extract_factory( # noqa: ANN202
36
- *,
37
- TCallResponse: type[_BaseCallResponseT],
38
- TToolType: type[BaseTool],
39
- setup_call: SetupCall[
40
- _BaseClientT,
41
- _BaseDynamicConfigT,
42
- _BaseCallParamsT,
43
- _ResponseT,
44
- _ResponseChunkT,
45
- _BaseToolT,
46
- ],
47
- get_json_output: GetJsonOutput[_BaseCallResponseT],
48
- ):
49
- """Returns the wrapped function with the provider specific interfaces."""
50
- create_decorator = create_factory(
51
- TCallResponse=TCallResponse, setup_call=setup_call
52
- )
53
-
54
- @overload
55
- def decorator(
56
- fn: Callable[_P, _BaseDynamicConfigT],
57
- model: str,
58
- response_model: type[_ResponseModelT],
59
- output_parser: Callable[[_ResponseModelT], _ParsedOutputT] | None,
60
- json_mode: bool,
61
- client: _BaseClientT | None,
62
- call_params: _BaseCallParamsT,
63
- ) -> Callable[_P, _ResponseModelT | _ParsedOutputT]: ...
64
-
65
- @overload
66
- def decorator(
67
- fn: Callable[_P, Awaitable[_BaseDynamicConfigT]],
68
- model: str,
69
- response_model: type[_ResponseModelT],
70
- output_parser: Callable[[_ResponseModelT], _ParsedOutputT] | None,
71
- json_mode: bool,
72
- client: _BaseClientT | None,
73
- call_params: _BaseCallParamsT,
74
- ) -> Callable[_P, Awaitable[_ResponseModelT | _ParsedOutputT]]: ...
75
-
76
- def decorator(
77
- fn: Callable[_P, _BaseDynamicConfigT | Awaitable[_BaseDynamicConfigT]],
78
- model: str,
79
- response_model: type[_ResponseModelT],
80
- output_parser: Callable[[_ResponseModelT], _ParsedOutputT] | None,
81
- json_mode: bool,
82
- client: _BaseClientT | None,
83
- call_params: _BaseCallParamsT,
84
- ) -> Callable[
85
- _P,
86
- _ResponseModelT | _ParsedOutputT | Awaitable[_ResponseModelT | _ParsedOutputT],
87
- ]:
88
- tool = setup_extract_tool(response_model, TToolType)
89
- create_decorator_kwargs = {
90
- "model": model,
91
- "tools": [tool],
92
- "output_parser": None,
93
- "json_mode": json_mode,
94
- "client": client,
95
- "call_params": call_params,
96
- }
97
-
98
- if inspect.iscoroutinefunction(fn):
99
-
100
- @wraps(fn)
101
- async def inner_async(
102
- *args: _P.args, **kwargs: _P.kwargs
103
- ) -> _ResponseModelT:
104
- assert SetupCall.fn_is_async(fn)
105
- call_response = await create_decorator(
106
- fn=fn, **create_decorator_kwargs
107
- )(*args, **kwargs)
108
- json_output = get_json_output(call_response, json_mode)
109
- try:
110
- output = extract_tool_return(response_model, json_output, False)
111
- except ValidationError as e:
112
- e._response = call_response # type: ignore
113
- raise e
114
- if isinstance(output, BaseModel):
115
- output._response = call_response # type: ignore
116
- return output if not output_parser else output_parser(output) # type: ignore
117
-
118
- return inner_async
119
- else:
120
-
121
- @wraps(fn)
122
- def inner(*args: _P.args, **kwargs: _P.kwargs) -> _ResponseModelT:
123
- assert SetupCall.fn_is_sync(fn)
124
- call_response = create_decorator(fn=fn, **create_decorator_kwargs)(
125
- *args, **kwargs
126
- )
127
- json_output = get_json_output(call_response, json_mode)
128
- try:
129
- output = extract_tool_return(response_model, json_output, False)
130
- except ValidationError as e:
131
- e._response = call_response # type: ignore
132
- raise e
133
- if isinstance(output, BaseModel):
134
- output._response = call_response # type: ignore
135
- return output if not output_parser else output_parser(output) # type: ignore
136
-
137
- return inner
138
-
139
- return decorator
@@ -1,63 +0,0 @@
1
- """
2
- --------------------------------------------------------------------------------
3
- Source: https://github.com/pydantic/pydantic/issues/6381#issuecomment-1831607091
4
- By: silviumarcu
5
-
6
- This code is used in accordance with the repository's license, and this reference
7
- serves as an acknowledgment of the original author's contribution to this project.
8
- --------------------------------------------------------------------------------
9
- """
10
-
11
- from copy import deepcopy
12
- from typing import TypeVar
13
-
14
- from pydantic import BaseModel, create_model
15
- from pydantic.fields import FieldInfo
16
-
17
- Model = TypeVar("Model", bound=BaseModel)
18
-
19
-
20
- def partial(wrapped_class: type[Model]) -> type[Model]:
21
- """Generate a new class with all attributes optionals.
22
-
23
- Notes:
24
- This will wrap a class inheriting form BaseModel and will recursively
25
- convert all its attributes and its children's attributes to optionals.
26
-
27
- Example:
28
-
29
- ```python
30
- @partial
31
- class User(BaseModel):
32
- name: str
33
-
34
- user = User(name="None")
35
- ```
36
- """
37
-
38
- def _make_field_optional(
39
- field: FieldInfo,
40
- ) -> tuple[object, FieldInfo]:
41
- tmp_field = deepcopy(field)
42
-
43
- annotation = field.annotation
44
- # If the field is a BaseModel, then recursively convert it's
45
- # attributes to optionals.
46
- if type(annotation) is type(BaseModel):
47
- tmp_field.annotation = partial(annotation) | None # pyright: ignore [reportAttributeAccessIssue,reportArgumentType]
48
- tmp_field.default = {}
49
- else:
50
- tmp_field.annotation = field.annotation | None # pyright: ignore [reportOptionalOperand,reportAttributeAccessIssue]
51
- tmp_field.default = None
52
- return tmp_field.annotation, tmp_field
53
-
54
- return create_model( # type: ignore[no-any-return, call-overload]
55
- f"Partial{wrapped_class.__name__}",
56
- __base__=wrapped_class,
57
- __module__=wrapped_class.__module__,
58
- __doc__=wrapped_class.__doc__,
59
- **{
60
- field_name: _make_field_optional(field_info)
61
- for field_name, field_info in wrapped_class.model_fields.items()
62
- }, # type: ignore
63
- )