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