mirascope 2.0.0__py3-none-any.whl → 2.0.0a1__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 (443) hide show
  1. mirascope/__init__.py +2 -11
  2. mirascope/graphs/__init__.py +22 -0
  3. mirascope/graphs/finite_state_machine.py +625 -0
  4. mirascope/llm/__init__.py +15 -96
  5. mirascope/llm/agents/__init__.py +15 -0
  6. mirascope/llm/agents/agent.py +97 -0
  7. mirascope/llm/agents/agent_template.py +45 -0
  8. mirascope/llm/agents/decorator.py +176 -0
  9. mirascope/llm/calls/__init__.py +1 -2
  10. mirascope/llm/calls/base_call.py +33 -0
  11. mirascope/llm/calls/calls.py +58 -84
  12. mirascope/llm/calls/decorator.py +120 -140
  13. mirascope/llm/clients/__init__.py +34 -0
  14. mirascope/llm/clients/_missing_import_stubs.py +47 -0
  15. mirascope/llm/clients/anthropic/__init__.py +25 -0
  16. mirascope/llm/{providers/openai/completions → clients/anthropic}/_utils/__init__.py +0 -2
  17. mirascope/llm/{providers → clients}/anthropic/_utils/decode.py +22 -66
  18. mirascope/llm/clients/anthropic/_utils/encode.py +243 -0
  19. mirascope/llm/clients/anthropic/clients.py +819 -0
  20. mirascope/llm/clients/anthropic/model_ids.py +8 -0
  21. mirascope/llm/{providers → clients}/base/__init__.py +5 -4
  22. mirascope/llm/{providers → clients}/base/_utils.py +17 -78
  23. mirascope/llm/{providers/base/base_provider.py → clients/base/client.py} +145 -468
  24. mirascope/llm/{models → clients/base}/params.py +37 -16
  25. mirascope/llm/clients/google/__init__.py +20 -0
  26. mirascope/llm/{providers/openai/responses → clients/google}/_utils/__init__.py +0 -2
  27. mirascope/llm/{providers → clients}/google/_utils/decode.py +22 -98
  28. mirascope/llm/{providers → clients}/google/_utils/encode.py +46 -168
  29. mirascope/llm/clients/google/clients.py +853 -0
  30. mirascope/llm/clients/google/model_ids.py +15 -0
  31. mirascope/llm/clients/openai/__init__.py +25 -0
  32. mirascope/llm/clients/openai/completions/__init__.py +28 -0
  33. mirascope/llm/{providers/google → clients/openai/completions}/_utils/__init__.py +0 -4
  34. mirascope/llm/{providers → clients}/openai/completions/_utils/decode.py +9 -74
  35. mirascope/llm/{providers → clients}/openai/completions/_utils/encode.py +52 -70
  36. mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
  37. mirascope/llm/clients/openai/completions/clients.py +833 -0
  38. mirascope/llm/clients/openai/completions/model_ids.py +8 -0
  39. mirascope/llm/clients/openai/responses/__init__.py +26 -0
  40. mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
  41. mirascope/llm/{providers → clients}/openai/responses/_utils/decode.py +14 -80
  42. mirascope/llm/{providers → clients}/openai/responses/_utils/encode.py +41 -92
  43. mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
  44. mirascope/llm/clients/openai/responses/clients.py +832 -0
  45. mirascope/llm/clients/openai/responses/model_ids.py +8 -0
  46. mirascope/llm/clients/openai/shared/__init__.py +7 -0
  47. mirascope/llm/clients/openai/shared/_utils.py +55 -0
  48. mirascope/llm/clients/providers.py +175 -0
  49. mirascope/llm/content/__init__.py +2 -3
  50. mirascope/llm/content/tool_call.py +0 -6
  51. mirascope/llm/content/tool_output.py +5 -22
  52. mirascope/llm/context/_utils.py +6 -19
  53. mirascope/llm/exceptions.py +43 -298
  54. mirascope/llm/formatting/__init__.py +2 -19
  55. mirascope/llm/formatting/_utils.py +74 -0
  56. mirascope/llm/formatting/format.py +30 -219
  57. mirascope/llm/formatting/from_call_args.py +2 -2
  58. mirascope/llm/formatting/partial.py +7 -80
  59. mirascope/llm/formatting/types.py +64 -21
  60. mirascope/llm/mcp/__init__.py +2 -2
  61. mirascope/llm/mcp/client.py +118 -0
  62. mirascope/llm/messages/__init__.py +0 -3
  63. mirascope/llm/messages/message.py +5 -13
  64. mirascope/llm/models/__init__.py +2 -7
  65. mirascope/llm/models/models.py +139 -315
  66. mirascope/llm/prompts/__init__.py +12 -13
  67. mirascope/llm/prompts/_utils.py +43 -14
  68. mirascope/llm/prompts/decorator.py +204 -144
  69. mirascope/llm/prompts/protocols.py +59 -25
  70. mirascope/llm/responses/__init__.py +1 -9
  71. mirascope/llm/responses/_utils.py +12 -102
  72. mirascope/llm/responses/base_response.py +6 -18
  73. mirascope/llm/responses/base_stream_response.py +50 -173
  74. mirascope/llm/responses/finish_reason.py +0 -1
  75. mirascope/llm/responses/response.py +13 -34
  76. mirascope/llm/responses/root_response.py +29 -100
  77. mirascope/llm/responses/stream_response.py +31 -40
  78. mirascope/llm/tools/__init__.py +2 -9
  79. mirascope/llm/tools/_utils.py +3 -12
  80. mirascope/llm/tools/decorator.py +16 -25
  81. mirascope/llm/tools/protocols.py +4 -4
  82. mirascope/llm/tools/tool_schema.py +19 -87
  83. mirascope/llm/tools/toolkit.py +27 -35
  84. mirascope/llm/tools/tools.py +41 -135
  85. {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/METADATA +13 -90
  86. mirascope-2.0.0a1.dist-info/RECORD +102 -0
  87. {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/WHEEL +1 -1
  88. {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/licenses/LICENSE +1 -1
  89. mirascope/_stubs.py +0 -363
  90. mirascope/api/__init__.py +0 -14
  91. mirascope/api/_generated/README.md +0 -207
  92. mirascope/api/_generated/__init__.py +0 -440
  93. mirascope/api/_generated/annotations/__init__.py +0 -33
  94. mirascope/api/_generated/annotations/client.py +0 -506
  95. mirascope/api/_generated/annotations/raw_client.py +0 -1414
  96. mirascope/api/_generated/annotations/types/__init__.py +0 -31
  97. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +0 -5
  98. mirascope/api/_generated/annotations/types/annotations_create_response.py +0 -48
  99. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +0 -5
  100. mirascope/api/_generated/annotations/types/annotations_get_response.py +0 -48
  101. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +0 -5
  102. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +0 -5
  103. mirascope/api/_generated/annotations/types/annotations_list_response.py +0 -21
  104. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +0 -50
  105. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +0 -5
  106. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +0 -5
  107. mirascope/api/_generated/annotations/types/annotations_update_response.py +0 -48
  108. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +0 -5
  109. mirascope/api/_generated/api_keys/__init__.py +0 -17
  110. mirascope/api/_generated/api_keys/client.py +0 -530
  111. mirascope/api/_generated/api_keys/raw_client.py +0 -1236
  112. mirascope/api/_generated/api_keys/types/__init__.py +0 -15
  113. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +0 -28
  114. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +0 -27
  115. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +0 -40
  116. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +0 -27
  117. mirascope/api/_generated/client.py +0 -211
  118. mirascope/api/_generated/core/__init__.py +0 -52
  119. mirascope/api/_generated/core/api_error.py +0 -23
  120. mirascope/api/_generated/core/client_wrapper.py +0 -46
  121. mirascope/api/_generated/core/datetime_utils.py +0 -28
  122. mirascope/api/_generated/core/file.py +0 -67
  123. mirascope/api/_generated/core/force_multipart.py +0 -16
  124. mirascope/api/_generated/core/http_client.py +0 -543
  125. mirascope/api/_generated/core/http_response.py +0 -55
  126. mirascope/api/_generated/core/jsonable_encoder.py +0 -100
  127. mirascope/api/_generated/core/pydantic_utilities.py +0 -255
  128. mirascope/api/_generated/core/query_encoder.py +0 -58
  129. mirascope/api/_generated/core/remove_none_from_dict.py +0 -11
  130. mirascope/api/_generated/core/request_options.py +0 -35
  131. mirascope/api/_generated/core/serialization.py +0 -276
  132. mirascope/api/_generated/docs/__init__.py +0 -4
  133. mirascope/api/_generated/docs/client.py +0 -91
  134. mirascope/api/_generated/docs/raw_client.py +0 -178
  135. mirascope/api/_generated/environment.py +0 -9
  136. mirascope/api/_generated/environments/__init__.py +0 -23
  137. mirascope/api/_generated/environments/client.py +0 -649
  138. mirascope/api/_generated/environments/raw_client.py +0 -1567
  139. mirascope/api/_generated/environments/types/__init__.py +0 -25
  140. mirascope/api/_generated/environments/types/environments_create_response.py +0 -24
  141. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +0 -60
  142. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +0 -24
  143. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +0 -22
  144. mirascope/api/_generated/environments/types/environments_get_response.py +0 -24
  145. mirascope/api/_generated/environments/types/environments_list_response_item.py +0 -24
  146. mirascope/api/_generated/environments/types/environments_update_response.py +0 -24
  147. mirascope/api/_generated/errors/__init__.py +0 -25
  148. mirascope/api/_generated/errors/bad_request_error.py +0 -14
  149. mirascope/api/_generated/errors/conflict_error.py +0 -14
  150. mirascope/api/_generated/errors/forbidden_error.py +0 -11
  151. mirascope/api/_generated/errors/internal_server_error.py +0 -10
  152. mirascope/api/_generated/errors/not_found_error.py +0 -11
  153. mirascope/api/_generated/errors/payment_required_error.py +0 -15
  154. mirascope/api/_generated/errors/service_unavailable_error.py +0 -14
  155. mirascope/api/_generated/errors/too_many_requests_error.py +0 -15
  156. mirascope/api/_generated/errors/unauthorized_error.py +0 -11
  157. mirascope/api/_generated/functions/__init__.py +0 -39
  158. mirascope/api/_generated/functions/client.py +0 -647
  159. mirascope/api/_generated/functions/raw_client.py +0 -1890
  160. mirascope/api/_generated/functions/types/__init__.py +0 -53
  161. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +0 -20
  162. mirascope/api/_generated/functions/types/functions_create_response.py +0 -37
  163. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +0 -20
  164. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +0 -39
  165. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +0 -20
  166. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +0 -53
  167. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +0 -22
  168. mirascope/api/_generated/functions/types/functions_get_response.py +0 -37
  169. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +0 -20
  170. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +0 -25
  171. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +0 -56
  172. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +0 -22
  173. mirascope/api/_generated/functions/types/functions_list_response.py +0 -21
  174. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +0 -41
  175. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +0 -20
  176. mirascope/api/_generated/health/__init__.py +0 -7
  177. mirascope/api/_generated/health/client.py +0 -92
  178. mirascope/api/_generated/health/raw_client.py +0 -175
  179. mirascope/api/_generated/health/types/__init__.py +0 -8
  180. mirascope/api/_generated/health/types/health_check_response.py +0 -22
  181. mirascope/api/_generated/health/types/health_check_response_status.py +0 -5
  182. mirascope/api/_generated/organization_invitations/__init__.py +0 -33
  183. mirascope/api/_generated/organization_invitations/client.py +0 -546
  184. mirascope/api/_generated/organization_invitations/raw_client.py +0 -1519
  185. mirascope/api/_generated/organization_invitations/types/__init__.py +0 -53
  186. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +0 -34
  187. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +0 -7
  188. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +0 -7
  189. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +0 -48
  190. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +0 -7
  191. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +0 -7
  192. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +0 -48
  193. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +0 -7
  194. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +0 -7
  195. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +0 -48
  196. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +0 -7
  197. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +0 -7
  198. mirascope/api/_generated/organization_memberships/__init__.py +0 -19
  199. mirascope/api/_generated/organization_memberships/client.py +0 -302
  200. mirascope/api/_generated/organization_memberships/raw_client.py +0 -736
  201. mirascope/api/_generated/organization_memberships/types/__init__.py +0 -27
  202. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +0 -33
  203. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +0 -7
  204. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +0 -7
  205. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +0 -31
  206. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +0 -7
  207. mirascope/api/_generated/organizations/__init__.py +0 -51
  208. mirascope/api/_generated/organizations/client.py +0 -869
  209. mirascope/api/_generated/organizations/raw_client.py +0 -2593
  210. mirascope/api/_generated/organizations/types/__init__.py +0 -71
  211. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +0 -24
  212. mirascope/api/_generated/organizations/types/organizations_create_response.py +0 -26
  213. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +0 -5
  214. mirascope/api/_generated/organizations/types/organizations_get_response.py +0 -26
  215. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +0 -5
  216. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +0 -26
  217. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +0 -5
  218. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +0 -7
  219. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +0 -47
  220. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +0 -33
  221. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +0 -7
  222. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +0 -24
  223. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +0 -53
  224. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +0 -7
  225. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +0 -26
  226. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +0 -34
  227. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +0 -7
  228. mirascope/api/_generated/organizations/types/organizations_update_response.py +0 -26
  229. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +0 -5
  230. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +0 -7
  231. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +0 -35
  232. mirascope/api/_generated/project_memberships/__init__.py +0 -25
  233. mirascope/api/_generated/project_memberships/client.py +0 -437
  234. mirascope/api/_generated/project_memberships/raw_client.py +0 -1039
  235. mirascope/api/_generated/project_memberships/types/__init__.py +0 -29
  236. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +0 -7
  237. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +0 -35
  238. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +0 -7
  239. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +0 -33
  240. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +0 -7
  241. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +0 -7
  242. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +0 -35
  243. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +0 -7
  244. mirascope/api/_generated/projects/__init__.py +0 -7
  245. mirascope/api/_generated/projects/client.py +0 -428
  246. mirascope/api/_generated/projects/raw_client.py +0 -1302
  247. mirascope/api/_generated/projects/types/__init__.py +0 -10
  248. mirascope/api/_generated/projects/types/projects_create_response.py +0 -25
  249. mirascope/api/_generated/projects/types/projects_get_response.py +0 -25
  250. mirascope/api/_generated/projects/types/projects_list_response_item.py +0 -25
  251. mirascope/api/_generated/projects/types/projects_update_response.py +0 -25
  252. mirascope/api/_generated/reference.md +0 -4915
  253. mirascope/api/_generated/tags/__init__.py +0 -19
  254. mirascope/api/_generated/tags/client.py +0 -504
  255. mirascope/api/_generated/tags/raw_client.py +0 -1288
  256. mirascope/api/_generated/tags/types/__init__.py +0 -17
  257. mirascope/api/_generated/tags/types/tags_create_response.py +0 -41
  258. mirascope/api/_generated/tags/types/tags_get_response.py +0 -41
  259. mirascope/api/_generated/tags/types/tags_list_response.py +0 -23
  260. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +0 -41
  261. mirascope/api/_generated/tags/types/tags_update_response.py +0 -41
  262. mirascope/api/_generated/token_cost/__init__.py +0 -7
  263. mirascope/api/_generated/token_cost/client.py +0 -160
  264. mirascope/api/_generated/token_cost/raw_client.py +0 -264
  265. mirascope/api/_generated/token_cost/types/__init__.py +0 -8
  266. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +0 -54
  267. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +0 -52
  268. mirascope/api/_generated/traces/__init__.py +0 -97
  269. mirascope/api/_generated/traces/client.py +0 -1103
  270. mirascope/api/_generated/traces/raw_client.py +0 -2322
  271. mirascope/api/_generated/traces/types/__init__.py +0 -155
  272. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +0 -29
  273. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +0 -27
  274. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +0 -23
  275. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +0 -38
  276. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +0 -19
  277. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +0 -22
  278. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +0 -20
  279. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +0 -29
  280. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +0 -31
  281. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +0 -23
  282. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +0 -38
  283. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +0 -19
  284. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +0 -22
  285. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +0 -22
  286. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +0 -48
  287. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +0 -23
  288. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +0 -38
  289. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +0 -19
  290. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +0 -24
  291. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +0 -22
  292. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +0 -20
  293. mirascope/api/_generated/traces/types/traces_create_response.py +0 -24
  294. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +0 -22
  295. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +0 -60
  296. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +0 -24
  297. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +0 -22
  298. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +0 -33
  299. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +0 -88
  300. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +0 -33
  301. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +0 -88
  302. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +0 -25
  303. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +0 -44
  304. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +0 -26
  305. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +0 -7
  306. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +0 -7
  307. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +0 -7
  308. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +0 -26
  309. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +0 -50
  310. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +0 -26
  311. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +0 -7
  312. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +0 -7
  313. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +0 -5
  314. mirascope/api/_generated/traces/types/traces_search_response.py +0 -26
  315. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +0 -50
  316. mirascope/api/_generated/types/__init__.py +0 -85
  317. mirascope/api/_generated/types/already_exists_error.py +0 -22
  318. mirascope/api/_generated/types/already_exists_error_tag.py +0 -5
  319. mirascope/api/_generated/types/bad_request_error_body.py +0 -50
  320. mirascope/api/_generated/types/click_house_error.py +0 -22
  321. mirascope/api/_generated/types/database_error.py +0 -22
  322. mirascope/api/_generated/types/database_error_tag.py +0 -5
  323. mirascope/api/_generated/types/date.py +0 -3
  324. mirascope/api/_generated/types/http_api_decode_error.py +0 -27
  325. mirascope/api/_generated/types/http_api_decode_error_tag.py +0 -5
  326. mirascope/api/_generated/types/immutable_resource_error.py +0 -22
  327. mirascope/api/_generated/types/internal_server_error_body.py +0 -49
  328. mirascope/api/_generated/types/issue.py +0 -38
  329. mirascope/api/_generated/types/issue_tag.py +0 -10
  330. mirascope/api/_generated/types/not_found_error_body.py +0 -22
  331. mirascope/api/_generated/types/not_found_error_tag.py +0 -5
  332. mirascope/api/_generated/types/number_from_string.py +0 -3
  333. mirascope/api/_generated/types/permission_denied_error.py +0 -22
  334. mirascope/api/_generated/types/permission_denied_error_tag.py +0 -5
  335. mirascope/api/_generated/types/plan_limit_exceeded_error.py +0 -32
  336. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +0 -7
  337. mirascope/api/_generated/types/pricing_unavailable_error.py +0 -23
  338. mirascope/api/_generated/types/property_key.py +0 -7
  339. mirascope/api/_generated/types/property_key_key.py +0 -25
  340. mirascope/api/_generated/types/property_key_key_tag.py +0 -5
  341. mirascope/api/_generated/types/rate_limit_error.py +0 -31
  342. mirascope/api/_generated/types/rate_limit_error_tag.py +0 -5
  343. mirascope/api/_generated/types/service_unavailable_error_body.py +0 -24
  344. mirascope/api/_generated/types/service_unavailable_error_tag.py +0 -7
  345. mirascope/api/_generated/types/stripe_error.py +0 -20
  346. mirascope/api/_generated/types/subscription_past_due_error.py +0 -31
  347. mirascope/api/_generated/types/subscription_past_due_error_tag.py +0 -7
  348. mirascope/api/_generated/types/unauthorized_error_body.py +0 -21
  349. mirascope/api/_generated/types/unauthorized_error_tag.py +0 -5
  350. mirascope/api/client.py +0 -255
  351. mirascope/api/settings.py +0 -99
  352. mirascope/llm/formatting/output_parser.py +0 -178
  353. mirascope/llm/formatting/primitives.py +0 -192
  354. mirascope/llm/mcp/mcp_client.py +0 -130
  355. mirascope/llm/messages/_utils.py +0 -34
  356. mirascope/llm/models/thinking_config.py +0 -61
  357. mirascope/llm/prompts/prompts.py +0 -487
  358. mirascope/llm/providers/__init__.py +0 -62
  359. mirascope/llm/providers/anthropic/__init__.py +0 -11
  360. mirascope/llm/providers/anthropic/_utils/__init__.py +0 -27
  361. mirascope/llm/providers/anthropic/_utils/beta_decode.py +0 -282
  362. mirascope/llm/providers/anthropic/_utils/beta_encode.py +0 -266
  363. mirascope/llm/providers/anthropic/_utils/encode.py +0 -418
  364. mirascope/llm/providers/anthropic/_utils/errors.py +0 -46
  365. mirascope/llm/providers/anthropic/beta_provider.py +0 -374
  366. mirascope/llm/providers/anthropic/model_id.py +0 -23
  367. mirascope/llm/providers/anthropic/model_info.py +0 -87
  368. mirascope/llm/providers/anthropic/provider.py +0 -479
  369. mirascope/llm/providers/google/__init__.py +0 -6
  370. mirascope/llm/providers/google/_utils/errors.py +0 -50
  371. mirascope/llm/providers/google/model_id.py +0 -22
  372. mirascope/llm/providers/google/model_info.py +0 -63
  373. mirascope/llm/providers/google/provider.py +0 -492
  374. mirascope/llm/providers/mirascope/__init__.py +0 -5
  375. mirascope/llm/providers/mirascope/_utils.py +0 -73
  376. mirascope/llm/providers/mirascope/provider.py +0 -349
  377. mirascope/llm/providers/mlx/__init__.py +0 -9
  378. mirascope/llm/providers/mlx/_utils.py +0 -141
  379. mirascope/llm/providers/mlx/encoding/__init__.py +0 -8
  380. mirascope/llm/providers/mlx/encoding/base.py +0 -72
  381. mirascope/llm/providers/mlx/encoding/transformers.py +0 -150
  382. mirascope/llm/providers/mlx/mlx.py +0 -254
  383. mirascope/llm/providers/mlx/model_id.py +0 -17
  384. mirascope/llm/providers/mlx/provider.py +0 -452
  385. mirascope/llm/providers/model_id.py +0 -16
  386. mirascope/llm/providers/ollama/__init__.py +0 -7
  387. mirascope/llm/providers/ollama/provider.py +0 -71
  388. mirascope/llm/providers/openai/__init__.py +0 -15
  389. mirascope/llm/providers/openai/_utils/__init__.py +0 -5
  390. mirascope/llm/providers/openai/_utils/errors.py +0 -46
  391. mirascope/llm/providers/openai/completions/__init__.py +0 -7
  392. mirascope/llm/providers/openai/completions/base_provider.py +0 -542
  393. mirascope/llm/providers/openai/completions/provider.py +0 -22
  394. mirascope/llm/providers/openai/model_id.py +0 -31
  395. mirascope/llm/providers/openai/model_info.py +0 -303
  396. mirascope/llm/providers/openai/provider.py +0 -441
  397. mirascope/llm/providers/openai/responses/__init__.py +0 -5
  398. mirascope/llm/providers/openai/responses/provider.py +0 -513
  399. mirascope/llm/providers/provider_id.py +0 -24
  400. mirascope/llm/providers/provider_registry.py +0 -299
  401. mirascope/llm/providers/together/__init__.py +0 -7
  402. mirascope/llm/providers/together/provider.py +0 -40
  403. mirascope/llm/responses/usage.py +0 -95
  404. mirascope/ops/__init__.py +0 -111
  405. mirascope/ops/_internal/__init__.py +0 -5
  406. mirascope/ops/_internal/closure.py +0 -1169
  407. mirascope/ops/_internal/configuration.py +0 -177
  408. mirascope/ops/_internal/context.py +0 -76
  409. mirascope/ops/_internal/exporters/__init__.py +0 -26
  410. mirascope/ops/_internal/exporters/exporters.py +0 -395
  411. mirascope/ops/_internal/exporters/processors.py +0 -104
  412. mirascope/ops/_internal/exporters/types.py +0 -165
  413. mirascope/ops/_internal/exporters/utils.py +0 -29
  414. mirascope/ops/_internal/instrumentation/__init__.py +0 -8
  415. mirascope/ops/_internal/instrumentation/llm/__init__.py +0 -8
  416. mirascope/ops/_internal/instrumentation/llm/common.py +0 -530
  417. mirascope/ops/_internal/instrumentation/llm/cost.py +0 -190
  418. mirascope/ops/_internal/instrumentation/llm/encode.py +0 -238
  419. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +0 -38
  420. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +0 -31
  421. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +0 -38
  422. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +0 -18
  423. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +0 -100
  424. mirascope/ops/_internal/instrumentation/llm/llm.py +0 -161
  425. mirascope/ops/_internal/instrumentation/llm/model.py +0 -1798
  426. mirascope/ops/_internal/instrumentation/llm/response.py +0 -521
  427. mirascope/ops/_internal/instrumentation/llm/serialize.py +0 -300
  428. mirascope/ops/_internal/propagation.py +0 -198
  429. mirascope/ops/_internal/protocols.py +0 -133
  430. mirascope/ops/_internal/session.py +0 -139
  431. mirascope/ops/_internal/spans.py +0 -232
  432. mirascope/ops/_internal/traced_calls.py +0 -375
  433. mirascope/ops/_internal/traced_functions.py +0 -523
  434. mirascope/ops/_internal/tracing.py +0 -353
  435. mirascope/ops/_internal/types.py +0 -13
  436. mirascope/ops/_internal/utils.py +0 -123
  437. mirascope/ops/_internal/versioned_calls.py +0 -512
  438. mirascope/ops/_internal/versioned_functions.py +0 -357
  439. mirascope/ops/_internal/versioning.py +0 -303
  440. mirascope/ops/exceptions.py +0 -21
  441. mirascope-2.0.0.dist-info/RECORD +0 -423
  442. /mirascope/llm/{providers → clients}/base/kwargs.py +0 -0
  443. /mirascope/llm/{providers → clients}/google/message.py +0 -0
@@ -1,357 +0,0 @@
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": 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
@@ -1,303 +0,0 @@
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
- )
@@ -1,21 +0,0 @@
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