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
@@ -0,0 +1,357 @@
1
+ """Versioned function implementations for Mirascope ops."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from collections.abc import Generator, Mapping
7
+ from contextlib import contextmanager
8
+ from dataclasses import dataclass, field
9
+ from functools import cached_property, lru_cache
10
+ from typing import Any, NewType, cast
11
+
12
+ from ...api._generated.errors.not_found_error import NotFoundError
13
+ from ...api._generated.functions.types.functions_create_request_dependencies_value import (
14
+ FunctionsCreateRequestDependenciesValue,
15
+ )
16
+ from ...api.client import get_async_client, get_sync_client
17
+ from ..exceptions import ClosureComputationError
18
+ from .closure import Closure
19
+ from .spans import Span
20
+ from .traced_functions import (
21
+ AsyncTrace,
22
+ BaseAsyncTracedFunction,
23
+ BaseSyncTracedFunction,
24
+ Trace,
25
+ _BaseTracedFunction,
26
+ record_result_to_span,
27
+ )
28
+ from .types import P, R
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+
33
+ VersionId = NewType("VersionId", str)
34
+ """Unique identifier for a specific version."""
35
+
36
+ VersionRef = NewType("VersionRef", str)
37
+ """Reference to a version (can be tag, hash, or semantic version)."""
38
+
39
+
40
+ # NOTE: the `.get_version` methods will need to do some type-hint magic to get the
41
+ # correct type-hints for the desired version (i.e. the input args and return type) since
42
+ # those are not necessarily the same as the current version. This is what we did in v0,
43
+ # so we'll just need to replicate that functionality here when we get there.
44
+
45
+
46
+ @dataclass(kw_only=True, frozen=True)
47
+ class VersionedResult(Trace[R]):
48
+ """Per-call handle returned by `.wrapped()` methods for versioned functions.
49
+
50
+ Provides access to the result and per-call operations for annotation,
51
+ tagging, and assignment within a specific trace span context.
52
+ """
53
+
54
+ function_uuid: str | None = None
55
+
56
+
57
+ @dataclass(kw_only=True, frozen=True)
58
+ class AsyncVersionedResult(AsyncTrace[R]):
59
+ """Per-call handle returned by async `.wrapped()` methods for versioned functions.
60
+
61
+ Provides access to the result and per-call operations for annotation,
62
+ tagging, and assignment within a specific trace span context.
63
+ """
64
+
65
+ function_uuid: str | None = None
66
+
67
+
68
+ @dataclass(kw_only=True, frozen=True)
69
+ class VersionInfo:
70
+ """Static version metadata for a versioned function.
71
+
72
+ Contains all information needed to identify and describe a specific version
73
+ of a function, including its computed version number and hashes.
74
+ """
75
+
76
+ uuid: str | None
77
+ """Server-assigned unique identifier for this version (None if not registered)."""
78
+
79
+ hash: str
80
+ """SHA256 hash of the complete closure code."""
81
+
82
+ signature_hash: str
83
+ """SHA256 hash of the function signature."""
84
+
85
+ name: str
86
+ """Display name for the versioned function."""
87
+
88
+ description: str | None
89
+ """Human-readable description of the versioned function."""
90
+
91
+ version: str
92
+ """Auto-computed semantic version in X.Y format."""
93
+
94
+ tags: tuple[str, ...]
95
+ """Tags associated with this version for filtering/classification."""
96
+
97
+ metadata: Mapping[str, str]
98
+ """Arbitrary key-value pairs for additional metadata."""
99
+
100
+ def __post_init__(self) -> None:
101
+ """Clean up tags and initialize frozen metadata after dataclass init."""
102
+ object.__setattr__(self, "tags", tuple(sorted(set(self.tags or []))))
103
+ object.__setattr__(self, "metadata", dict(self.metadata))
104
+
105
+
106
+ @dataclass(kw_only=True)
107
+ class _BaseVersionedFunction(_BaseTracedFunction[P, R, Any]):
108
+ """Base class for versioned functions."""
109
+
110
+ name: str | None = None
111
+ """Optional custom name for the versioned function (overrides function name)."""
112
+
113
+ metadata: dict[str, str] = field(default_factory=dict)
114
+ """Arbitrary key-value pairs for additional metadata."""
115
+
116
+ closure: Closure | None = field(init=False, default=None)
117
+
118
+ def __post_init__(self) -> None:
119
+ super().__post_init__()
120
+ try:
121
+ self.closure = Closure.from_fn(self.fn)
122
+ except ClosureComputationError as e:
123
+ logger.warning(
124
+ "Failed to build closure for %s; continuing without version registration: %s",
125
+ e.qualified_name,
126
+ e,
127
+ )
128
+
129
+ @classmethod
130
+ @lru_cache(maxsize=128)
131
+ def _compute_version(cls, hash: str) -> str:
132
+ """Computes the version string from the closure hash.
133
+
134
+ For new functions without server history, returns "1.0" as the initial version.
135
+
136
+ TODO: When API client is available, query the server for existing versions:
137
+ 1. Check if a function with matching hash exists -> use its version
138
+ 2. If no matches, return "1.0" as initial version
139
+
140
+ Args:
141
+ hash: SHA256 hash of the complete closure code.
142
+
143
+ Returns:
144
+ A version string.
145
+ """
146
+ return "1.0"
147
+
148
+ @cached_property
149
+ def version_info(self) -> VersionInfo | None:
150
+ """Returns static version metadata for this versioned function.
151
+
152
+ Lazily constructs and caches the VersionInfo from the closure and
153
+ decorator arguments. Returns None if the closure could not be computed.
154
+
155
+ Returns:
156
+ VersionInfo containing hashes, version string, and metadata,
157
+ or None if closure computation failed.
158
+ """
159
+ if self.closure is None:
160
+ return None
161
+
162
+ return VersionInfo(
163
+ uuid=None,
164
+ hash=self.closure.hash,
165
+ signature_hash=self.closure.signature_hash,
166
+ name=self.name or self.closure.name,
167
+ description=self.closure.docstring,
168
+ version=self._compute_version(self.closure.hash),
169
+ tags=self.tags,
170
+ metadata=self.metadata,
171
+ )
172
+
173
+ @contextmanager
174
+ def _versioned_span(
175
+ self, function_uuid: str | None, *args: P.args, **kwargs: P.kwargs
176
+ ) -> Generator[Span, None, None]:
177
+ with super()._span(*args, **kwargs) as span:
178
+ if self.closure is not None:
179
+ span.set(
180
+ **{
181
+ "mirascope.version.hash": self.closure.hash,
182
+ "mirascope.version.signature_hash": self.closure.signature_hash,
183
+ }
184
+ )
185
+ if self.closure.docstring:
186
+ span.set(
187
+ **{"mirascope.version.description": self.closure.docstring}
188
+ )
189
+
190
+ if function_uuid:
191
+ span.set(**{"mirascope.version.uuid": function_uuid})
192
+
193
+ version_info = self.version_info
194
+ if version_info is not None:
195
+ span.set(**{"mirascope.version.version": version_info.version})
196
+ if self.name:
197
+ span.set(**{"mirascope.version.name": self.name})
198
+ if self.tags:
199
+ span.set(**{"mirascope.version.tags": list(self.tags)})
200
+ if self.metadata:
201
+ for key, value in self.metadata.items():
202
+ span.set(**{f"mirascope.version.meta.{key}": value})
203
+ yield span
204
+
205
+
206
+ @dataclass(kw_only=True)
207
+ class VersionedFunction(_BaseVersionedFunction[P, R], BaseSyncTracedFunction[P, R]):
208
+ """Wrapper for synchronous functions with versioning capabilities."""
209
+
210
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
211
+ """Returns the result of the versioned function directly.
212
+
213
+ A new version will be created if none yet exists for the specific version of
214
+ this function that's being run.
215
+ """
216
+ function_uuid = self._ensure_registration()
217
+ with self._versioned_span(function_uuid, *args, **kwargs) as span:
218
+ result = self.fn(*args, **kwargs)
219
+ record_result_to_span(span, result)
220
+ return result
221
+
222
+ def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> VersionedResult[R]:
223
+ """Return a wrapper around the executed function's result for trace utilities.
224
+
225
+ Args:
226
+ *args: Positional arguments for the wrapped function.
227
+ **kwargs: Keyword arguments including 'version' for version reference.
228
+
229
+ Returns:
230
+ A VersionedResult containing the function result and trace context.
231
+ """
232
+ function_uuid = self._ensure_registration()
233
+ with self._versioned_span(function_uuid, *args, **kwargs) as span:
234
+ result = self.fn(*args, **kwargs)
235
+ record_result_to_span(span, result)
236
+ return VersionedResult(
237
+ result=result,
238
+ span=span,
239
+ function_uuid=function_uuid,
240
+ )
241
+
242
+ def get_version(self, version: VersionId) -> VersionedFunction[P, R]:
243
+ """Returns the specific version of this function requested."""
244
+ raise NotImplementedError("VersionedFunction.get_version not yet implemented")
245
+
246
+ def _ensure_registration(self) -> str | None:
247
+ """Returns function UUID after ensuring registration with API."""
248
+ if self.closure is None:
249
+ return None
250
+ try:
251
+ client = get_sync_client()
252
+ except Exception as e:
253
+ logger.warning("Failed to get client for function registration: %s", e)
254
+ return None
255
+
256
+ try:
257
+ existing = client.functions.findbyhash(self.closure.hash)
258
+ return existing.id
259
+ except NotFoundError:
260
+ dependencies: dict[str, FunctionsCreateRequestDependenciesValue | None] = {
261
+ name: FunctionsCreateRequestDependenciesValue(
262
+ version=dep_info["version"],
263
+ extras=dep_info.get("extras"),
264
+ )
265
+ for name, dep_info in self.closure.dependencies.items()
266
+ }
267
+ response = client.functions.create(
268
+ code=self.closure.code,
269
+ hash=self.closure.hash,
270
+ signature=self.closure.signature,
271
+ signature_hash=self.closure.signature_hash,
272
+ name=self.name or self.closure.name,
273
+ description=self.closure.docstring,
274
+ tags=list(self.tags) if self.tags else None,
275
+ metadata=cast(dict[str, str | None], self.metadata)
276
+ if self.metadata
277
+ else None,
278
+ dependencies=dependencies if dependencies else None,
279
+ )
280
+ return response.id
281
+ except Exception as e:
282
+ logger.warning("Failed to register function: %s", e)
283
+ return None
284
+
285
+
286
+ @dataclass(kw_only=True)
287
+ class AsyncVersionedFunction(
288
+ _BaseVersionedFunction[P, R], BaseAsyncTracedFunction[P, R]
289
+ ):
290
+ """Wrapper for asynchronous functions with versioning capabilities."""
291
+
292
+ async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
293
+ """Returns the result of the versioned function directly."""
294
+ function_uuid = await self._ensure_registration()
295
+ with self._versioned_span(function_uuid, *args, **kwargs) as span:
296
+ result = await self.fn(*args, **kwargs)
297
+ record_result_to_span(span, result)
298
+ return result
299
+
300
+ async def wrapped(
301
+ self, *args: P.args, **kwargs: P.kwargs
302
+ ) -> AsyncVersionedResult[R]:
303
+ """Returns a wrapper around the traced function's result for trace utilities."""
304
+ function_uuid = await self._ensure_registration()
305
+ with self._versioned_span(function_uuid, *args, **kwargs) as span:
306
+ result = await self.fn(*args, **kwargs)
307
+ record_result_to_span(span, result)
308
+ return AsyncVersionedResult(
309
+ result=result,
310
+ span=span,
311
+ function_uuid=function_uuid,
312
+ )
313
+
314
+ async def get_version(self, version: VersionId) -> VersionedFunction[P, R]:
315
+ """Returns the specific version of this function using an `AsyncLilypad` client."""
316
+ raise NotImplementedError(
317
+ "AsyncVersionedFunction.get_version not yet implemented"
318
+ )
319
+
320
+ async def _ensure_registration(self) -> str | None:
321
+ """Returns function UUID after ensuring registration with API."""
322
+ if self.closure is None:
323
+ return None
324
+ try:
325
+ client = get_async_client()
326
+ except Exception as e:
327
+ logger.warning("Failed to get client for function registration: %s", e)
328
+ return None
329
+
330
+ try:
331
+ existing = await client.functions.findbyhash(self.closure.hash)
332
+ return existing.id
333
+ except NotFoundError:
334
+ dependencies: dict[str, FunctionsCreateRequestDependenciesValue | None] = {
335
+ name: FunctionsCreateRequestDependenciesValue(
336
+ version=dep_info["version"],
337
+ extras=dep_info.get("extras"),
338
+ )
339
+ for name, dep_info in self.closure.dependencies.items()
340
+ }
341
+ response = await client.functions.create(
342
+ code=self.closure.code,
343
+ hash=self.closure.hash,
344
+ signature=self.closure.signature,
345
+ signature_hash=self.closure.signature_hash,
346
+ name=self.name or self.closure.name,
347
+ description=self.closure.docstring,
348
+ tags=list(self.tags) if self.tags else None,
349
+ metadata=cast(dict[str, str | None], self.metadata)
350
+ if self.metadata
351
+ else None,
352
+ dependencies=dependencies if dependencies else None,
353
+ )
354
+ return response.id
355
+ except Exception as e:
356
+ logger.warning("Failed to register function: %s", e)
357
+ return None
@@ -0,0 +1,303 @@
1
+ """Version decorator for Mirascope ops."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Sequence
6
+ from dataclasses import dataclass, field
7
+ from typing import TYPE_CHECKING, overload
8
+
9
+ from ...llm.calls import AsyncCall, AsyncContextCall, Call, ContextCall
10
+ from ...llm.context import DepsT
11
+ from .protocols import AsyncFunction, SyncFunction, fn_is_async
12
+ from .types import P, R
13
+ from .versioned_calls import (
14
+ VersionedAsyncCall,
15
+ VersionedAsyncContextCall,
16
+ VersionedCall,
17
+ VersionedContextCall,
18
+ is_version_call_type,
19
+ wrap_version_call,
20
+ )
21
+ from .versioned_functions import AsyncVersionedFunction, VersionedFunction
22
+
23
+ if TYPE_CHECKING:
24
+ from ...llm.formatting import FormattableT
25
+
26
+
27
+ @dataclass(kw_only=True)
28
+ class VersionDecorator:
29
+ """Decorator implementation for adding versioning capabilities to functions."""
30
+
31
+ tags: tuple[str, ...] = ()
32
+ """Tags to be associated with versioned function calls."""
33
+
34
+ name: str | None = None
35
+ """Optional custom name for the versioned function."""
36
+
37
+ metadata: dict[str, str] = field(default_factory=dict)
38
+ """Arbitrary key-value pairs for additional metadata."""
39
+
40
+ @overload
41
+ def __call__( # pyright: ignore[reportOverlappingOverload]
42
+ self,
43
+ fn: AsyncContextCall[P, DepsT, FormattableT],
44
+ ) -> VersionedAsyncContextCall[P, DepsT, FormattableT]:
45
+ """Overload for applying decorator to an AsyncContextCall."""
46
+ ...
47
+
48
+ @overload
49
+ def __call__(
50
+ self,
51
+ fn: ContextCall[P, DepsT, FormattableT],
52
+ ) -> VersionedContextCall[P, DepsT, FormattableT]:
53
+ """Overload for applying decorator to a ContextCall."""
54
+ ...
55
+
56
+ @overload
57
+ def __call__(
58
+ self,
59
+ fn: AsyncCall[P, FormattableT],
60
+ ) -> VersionedAsyncCall[P, FormattableT]:
61
+ """Overload for applying decorator to an AsyncCall."""
62
+ ...
63
+
64
+ @overload
65
+ def __call__(
66
+ self,
67
+ fn: Call[P, FormattableT],
68
+ ) -> VersionedCall[P, FormattableT]:
69
+ """Overload for applying decorator to a Call."""
70
+ ...
71
+
72
+ @overload
73
+ def __call__(
74
+ self,
75
+ fn: AsyncFunction[P, R],
76
+ ) -> AsyncVersionedFunction[P, R]:
77
+ """Overload for applying decorator to an async function."""
78
+ ...
79
+
80
+ @overload
81
+ def __call__(
82
+ self,
83
+ fn: SyncFunction[P, R],
84
+ ) -> VersionedFunction[P, R]:
85
+ """Overload for applying decorator to a sync function."""
86
+ ...
87
+
88
+ def __call__( # pyright: ignore[reportGeneralTypeIssues]
89
+ self,
90
+ fn: (
91
+ AsyncContextCall[P, DepsT, FormattableT]
92
+ | ContextCall[P, DepsT, FormattableT]
93
+ | AsyncCall[P, FormattableT]
94
+ | Call[P, FormattableT]
95
+ | AsyncFunction[P, R]
96
+ | SyncFunction[P, R]
97
+ ),
98
+ ) -> (
99
+ VersionedAsyncContextCall[P, DepsT, FormattableT]
100
+ | VersionedContextCall[P, DepsT, FormattableT]
101
+ | VersionedAsyncCall[P, FormattableT]
102
+ | VersionedCall[P, FormattableT]
103
+ | AsyncVersionedFunction[P, R]
104
+ | VersionedFunction[P, R]
105
+ ):
106
+ """Applies the decorator to the given function or Call object."""
107
+ if is_version_call_type(fn):
108
+ return wrap_version_call(
109
+ fn=fn,
110
+ tags=self.tags,
111
+ name=self.name,
112
+ metadata=self.metadata or {},
113
+ )
114
+ elif fn_is_async(fn):
115
+ return AsyncVersionedFunction(
116
+ fn=fn,
117
+ tags=self.tags,
118
+ name=self.name,
119
+ metadata=self.metadata,
120
+ )
121
+ else:
122
+ return VersionedFunction(
123
+ fn=fn,
124
+ tags=self.tags,
125
+ name=self.name,
126
+ metadata=self.metadata,
127
+ )
128
+
129
+
130
+ @overload
131
+ def version(
132
+ __fn: None = None,
133
+ *,
134
+ tags: Sequence[str] | None = None,
135
+ name: str | None = None,
136
+ metadata: dict[str, str] | None = None,
137
+ ) -> VersionDecorator:
138
+ """Overload for providing kwargs before decorating (e.g. tags)."""
139
+ ...
140
+
141
+
142
+ @overload
143
+ def version( # pyright: ignore[reportOverlappingOverload]
144
+ __fn: AsyncContextCall[P, DepsT, FormattableT],
145
+ *,
146
+ tags: None = None,
147
+ name: None = None,
148
+ metadata: None = None,
149
+ ) -> VersionedAsyncContextCall[P, DepsT, FormattableT]:
150
+ """Overload for directly (no argument) decorating an AsyncContextCall."""
151
+ ...
152
+
153
+
154
+ @overload
155
+ def version(
156
+ __fn: ContextCall[P, DepsT, FormattableT],
157
+ *,
158
+ tags: None = None,
159
+ name: None = None,
160
+ metadata: None = None,
161
+ ) -> VersionedContextCall[P, DepsT, FormattableT]:
162
+ """Overload for directly (no argument) decorating a ContextCall."""
163
+ ...
164
+
165
+
166
+ @overload
167
+ def version(
168
+ __fn: AsyncCall[P, FormattableT],
169
+ *,
170
+ tags: None = None,
171
+ name: None = None,
172
+ metadata: None = None,
173
+ ) -> VersionedAsyncCall[P, FormattableT]:
174
+ """Overload for directly (no argument) decorating an AsyncCall."""
175
+ ...
176
+
177
+
178
+ @overload
179
+ def version(
180
+ __fn: Call[P, FormattableT],
181
+ *,
182
+ tags: None = None,
183
+ name: None = None,
184
+ metadata: None = None,
185
+ ) -> VersionedCall[P, FormattableT]:
186
+ """Overload for directly (no argument) decorating a Call."""
187
+ ...
188
+
189
+
190
+ @overload
191
+ def version(
192
+ __fn: AsyncFunction[P, R],
193
+ *,
194
+ tags: None = None,
195
+ name: None = None,
196
+ metadata: None = None,
197
+ ) -> AsyncVersionedFunction[P, R]:
198
+ """Overload for directly (no argument) decorating an asynchronous function"""
199
+ ...
200
+
201
+
202
+ @overload
203
+ def version(
204
+ __fn: SyncFunction[P, R],
205
+ *,
206
+ tags: None = None,
207
+ name: None = None,
208
+ metadata: None = None,
209
+ ) -> VersionedFunction[P, R]:
210
+ """Overload for directly (no argument) decorating a synchronous function"""
211
+ ...
212
+
213
+
214
+ def version( # pyright: ignore[reportGeneralTypeIssues]
215
+ __fn: (
216
+ AsyncContextCall[P, DepsT, FormattableT]
217
+ | ContextCall[P, DepsT, FormattableT]
218
+ | AsyncCall[P, FormattableT]
219
+ | Call[P, FormattableT]
220
+ | AsyncFunction[P, R]
221
+ | SyncFunction[P, R]
222
+ | None
223
+ ) = None,
224
+ *,
225
+ tags: Sequence[str] | None = None,
226
+ name: str | None = None,
227
+ metadata: dict[str, str] | None = None,
228
+ ) -> (
229
+ VersionDecorator
230
+ | VersionedAsyncContextCall[P, DepsT, FormattableT]
231
+ | VersionedContextCall[P, DepsT, FormattableT]
232
+ | VersionedAsyncCall[P, FormattableT]
233
+ | VersionedCall[P, FormattableT]
234
+ | AsyncVersionedFunction[P, R]
235
+ | VersionedFunction[P, R]
236
+ ):
237
+ """Add versioning capability to a callable function.
238
+
239
+ Enables version management for functions, allowing execution of specific
240
+ versions and version introspection. Can be composed with @trace and @remote.
241
+
242
+ Args:
243
+ __fn: The function to version (when used without parentheses).
244
+ tags: Optional version tags for this function.
245
+ name: Optional custom name for display (overrides function name).
246
+ metadata: Arbitrary key-value pairs for additional metadata.
247
+
248
+ Returns:
249
+ A versioned callable or a decorator function.
250
+
251
+ Examples:
252
+ ```python
253
+ @version()
254
+ def compute(x: int) -> int:
255
+ return x * 2
256
+ ```
257
+
258
+ ```python
259
+ @version(tags=["v1.0"])
260
+ async def process() -> str:
261
+ return "processed"
262
+ ```
263
+
264
+ ```python
265
+ @version(
266
+ name="book_recommender",
267
+ tags=["production"],
268
+ metadata={"owner": "team-ml", "ticket": "ENG-1234"},
269
+ )
270
+ def recommend_book(genre: str) -> str:
271
+ return f"Recommend a {genre} book"
272
+ ```
273
+ """
274
+ tags = tuple(sorted(set(tags or [])))
275
+ metadata = metadata or {}
276
+ if __fn is None:
277
+ return VersionDecorator(
278
+ tags=tags,
279
+ name=name,
280
+ metadata=metadata,
281
+ )
282
+
283
+ if is_version_call_type(__fn):
284
+ return wrap_version_call(
285
+ fn=__fn,
286
+ tags=tags,
287
+ name=name,
288
+ metadata=metadata,
289
+ )
290
+ elif fn_is_async(__fn):
291
+ return AsyncVersionedFunction(
292
+ fn=__fn,
293
+ tags=tags,
294
+ name=name,
295
+ metadata=metadata,
296
+ )
297
+ else:
298
+ return VersionedFunction(
299
+ fn=__fn,
300
+ tags=tags,
301
+ name=name,
302
+ metadata=metadata,
303
+ )
@@ -0,0 +1,21 @@
1
+ """Mirascope Ops exception hierarchy for unified error handling across providers."""
2
+
3
+
4
+ class MirascopeOpsError(Exception):
5
+ """Base exception for all Mirascope Ops errors."""
6
+
7
+ original_exception: Exception | None
8
+
9
+
10
+ class ConfigurationError(MirascopeOpsError):
11
+ """Raised when Ops configuration is invalid."""
12
+
13
+
14
+ class ClosureComputationError(MirascopeOpsError):
15
+ """Raised when the closure for a function cannot be computed properly."""
16
+
17
+ qualified_name: str
18
+
19
+ def __init__(self, qualified_name: str) -> None:
20
+ """Initializes an instance of `ClosureComputationError`."""
21
+ self.qualified_name = qualified_name