mirascope 1.0.5__py3-none-any.whl → 2.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (632) hide show
  1. mirascope/__init__.py +6 -6
  2. mirascope/_stubs.py +384 -0
  3. mirascope/_utils.py +34 -0
  4. mirascope/api/__init__.py +14 -0
  5. mirascope/api/_generated/README.md +207 -0
  6. mirascope/api/_generated/__init__.py +444 -0
  7. mirascope/api/_generated/annotations/__init__.py +33 -0
  8. mirascope/api/_generated/annotations/client.py +506 -0
  9. mirascope/api/_generated/annotations/raw_client.py +1414 -0
  10. mirascope/api/_generated/annotations/types/__init__.py +31 -0
  11. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +5 -0
  12. mirascope/api/_generated/annotations/types/annotations_create_response.py +48 -0
  13. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +5 -0
  14. mirascope/api/_generated/annotations/types/annotations_get_response.py +48 -0
  15. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +5 -0
  16. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +5 -0
  17. mirascope/api/_generated/annotations/types/annotations_list_response.py +21 -0
  18. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +50 -0
  19. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +5 -0
  20. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +5 -0
  21. mirascope/api/_generated/annotations/types/annotations_update_response.py +48 -0
  22. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +5 -0
  23. mirascope/api/_generated/api_keys/__init__.py +17 -0
  24. mirascope/api/_generated/api_keys/client.py +530 -0
  25. mirascope/api/_generated/api_keys/raw_client.py +1236 -0
  26. mirascope/api/_generated/api_keys/types/__init__.py +15 -0
  27. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +28 -0
  28. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +27 -0
  29. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +40 -0
  30. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +27 -0
  31. mirascope/api/_generated/client.py +211 -0
  32. mirascope/api/_generated/core/__init__.py +52 -0
  33. mirascope/api/_generated/core/api_error.py +23 -0
  34. mirascope/api/_generated/core/client_wrapper.py +46 -0
  35. mirascope/api/_generated/core/datetime_utils.py +28 -0
  36. mirascope/api/_generated/core/file.py +67 -0
  37. mirascope/api/_generated/core/force_multipart.py +16 -0
  38. mirascope/api/_generated/core/http_client.py +543 -0
  39. mirascope/api/_generated/core/http_response.py +55 -0
  40. mirascope/api/_generated/core/jsonable_encoder.py +100 -0
  41. mirascope/api/_generated/core/pydantic_utilities.py +255 -0
  42. mirascope/api/_generated/core/query_encoder.py +58 -0
  43. mirascope/api/_generated/core/remove_none_from_dict.py +11 -0
  44. mirascope/api/_generated/core/request_options.py +35 -0
  45. mirascope/api/_generated/core/serialization.py +276 -0
  46. mirascope/api/_generated/docs/__init__.py +4 -0
  47. mirascope/api/_generated/docs/client.py +91 -0
  48. mirascope/api/_generated/docs/raw_client.py +178 -0
  49. mirascope/api/_generated/environment.py +9 -0
  50. mirascope/api/_generated/environments/__init__.py +23 -0
  51. mirascope/api/_generated/environments/client.py +649 -0
  52. mirascope/api/_generated/environments/raw_client.py +1567 -0
  53. mirascope/api/_generated/environments/types/__init__.py +25 -0
  54. mirascope/api/_generated/environments/types/environments_create_response.py +24 -0
  55. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +60 -0
  56. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +24 -0
  57. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +22 -0
  58. mirascope/api/_generated/environments/types/environments_get_response.py +24 -0
  59. mirascope/api/_generated/environments/types/environments_list_response_item.py +24 -0
  60. mirascope/api/_generated/environments/types/environments_update_response.py +24 -0
  61. mirascope/api/_generated/errors/__init__.py +25 -0
  62. mirascope/api/_generated/errors/bad_request_error.py +14 -0
  63. mirascope/api/_generated/errors/conflict_error.py +14 -0
  64. mirascope/api/_generated/errors/forbidden_error.py +11 -0
  65. mirascope/api/_generated/errors/internal_server_error.py +10 -0
  66. mirascope/api/_generated/errors/not_found_error.py +11 -0
  67. mirascope/api/_generated/errors/payment_required_error.py +15 -0
  68. mirascope/api/_generated/errors/service_unavailable_error.py +14 -0
  69. mirascope/api/_generated/errors/too_many_requests_error.py +15 -0
  70. mirascope/api/_generated/errors/unauthorized_error.py +11 -0
  71. mirascope/api/_generated/functions/__init__.py +39 -0
  72. mirascope/api/_generated/functions/client.py +647 -0
  73. mirascope/api/_generated/functions/raw_client.py +1890 -0
  74. mirascope/api/_generated/functions/types/__init__.py +53 -0
  75. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +20 -0
  76. mirascope/api/_generated/functions/types/functions_create_response.py +37 -0
  77. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +20 -0
  78. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +39 -0
  79. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +20 -0
  80. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +53 -0
  81. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +22 -0
  82. mirascope/api/_generated/functions/types/functions_get_response.py +37 -0
  83. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +20 -0
  84. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +25 -0
  85. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +56 -0
  86. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +22 -0
  87. mirascope/api/_generated/functions/types/functions_list_response.py +21 -0
  88. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +41 -0
  89. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +20 -0
  90. mirascope/api/_generated/health/__init__.py +7 -0
  91. mirascope/api/_generated/health/client.py +92 -0
  92. mirascope/api/_generated/health/raw_client.py +175 -0
  93. mirascope/api/_generated/health/types/__init__.py +8 -0
  94. mirascope/api/_generated/health/types/health_check_response.py +22 -0
  95. mirascope/api/_generated/health/types/health_check_response_status.py +5 -0
  96. mirascope/api/_generated/organization_invitations/__init__.py +33 -0
  97. mirascope/api/_generated/organization_invitations/client.py +546 -0
  98. mirascope/api/_generated/organization_invitations/raw_client.py +1519 -0
  99. mirascope/api/_generated/organization_invitations/types/__init__.py +53 -0
  100. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +34 -0
  101. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +7 -0
  102. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +7 -0
  103. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +48 -0
  104. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +7 -0
  105. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +7 -0
  106. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +48 -0
  107. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +7 -0
  108. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +7 -0
  109. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +48 -0
  110. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +7 -0
  111. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +7 -0
  112. mirascope/api/_generated/organization_memberships/__init__.py +19 -0
  113. mirascope/api/_generated/organization_memberships/client.py +302 -0
  114. mirascope/api/_generated/organization_memberships/raw_client.py +736 -0
  115. mirascope/api/_generated/organization_memberships/types/__init__.py +27 -0
  116. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +33 -0
  117. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +7 -0
  118. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +7 -0
  119. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +31 -0
  120. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +7 -0
  121. mirascope/api/_generated/organizations/__init__.py +51 -0
  122. mirascope/api/_generated/organizations/client.py +869 -0
  123. mirascope/api/_generated/organizations/raw_client.py +2593 -0
  124. mirascope/api/_generated/organizations/types/__init__.py +71 -0
  125. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +24 -0
  126. mirascope/api/_generated/organizations/types/organizations_create_response.py +26 -0
  127. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +5 -0
  128. mirascope/api/_generated/organizations/types/organizations_get_response.py +26 -0
  129. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +5 -0
  130. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +26 -0
  131. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +5 -0
  132. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +7 -0
  133. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +47 -0
  134. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +33 -0
  135. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +7 -0
  136. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +24 -0
  137. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +53 -0
  138. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +7 -0
  139. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +26 -0
  140. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +34 -0
  141. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +7 -0
  142. mirascope/api/_generated/organizations/types/organizations_update_response.py +26 -0
  143. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +5 -0
  144. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +7 -0
  145. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +35 -0
  146. mirascope/api/_generated/project_memberships/__init__.py +29 -0
  147. mirascope/api/_generated/project_memberships/client.py +528 -0
  148. mirascope/api/_generated/project_memberships/raw_client.py +1278 -0
  149. mirascope/api/_generated/project_memberships/types/__init__.py +33 -0
  150. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +7 -0
  151. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +35 -0
  152. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +7 -0
  153. mirascope/api/_generated/project_memberships/types/project_memberships_get_response.py +33 -0
  154. mirascope/api/_generated/project_memberships/types/project_memberships_get_response_role.py +7 -0
  155. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +33 -0
  156. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +7 -0
  157. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +7 -0
  158. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +35 -0
  159. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +7 -0
  160. mirascope/api/_generated/projects/__init__.py +7 -0
  161. mirascope/api/_generated/projects/client.py +428 -0
  162. mirascope/api/_generated/projects/raw_client.py +1302 -0
  163. mirascope/api/_generated/projects/types/__init__.py +10 -0
  164. mirascope/api/_generated/projects/types/projects_create_response.py +25 -0
  165. mirascope/api/_generated/projects/types/projects_get_response.py +25 -0
  166. mirascope/api/_generated/projects/types/projects_list_response_item.py +25 -0
  167. mirascope/api/_generated/projects/types/projects_update_response.py +25 -0
  168. mirascope/api/_generated/reference.md +4987 -0
  169. mirascope/api/_generated/tags/__init__.py +19 -0
  170. mirascope/api/_generated/tags/client.py +504 -0
  171. mirascope/api/_generated/tags/raw_client.py +1288 -0
  172. mirascope/api/_generated/tags/types/__init__.py +17 -0
  173. mirascope/api/_generated/tags/types/tags_create_response.py +41 -0
  174. mirascope/api/_generated/tags/types/tags_get_response.py +41 -0
  175. mirascope/api/_generated/tags/types/tags_list_response.py +23 -0
  176. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +41 -0
  177. mirascope/api/_generated/tags/types/tags_update_response.py +41 -0
  178. mirascope/api/_generated/token_cost/__init__.py +7 -0
  179. mirascope/api/_generated/token_cost/client.py +160 -0
  180. mirascope/api/_generated/token_cost/raw_client.py +264 -0
  181. mirascope/api/_generated/token_cost/types/__init__.py +8 -0
  182. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +54 -0
  183. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +52 -0
  184. mirascope/api/_generated/traces/__init__.py +97 -0
  185. mirascope/api/_generated/traces/client.py +1103 -0
  186. mirascope/api/_generated/traces/raw_client.py +2322 -0
  187. mirascope/api/_generated/traces/types/__init__.py +155 -0
  188. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +29 -0
  189. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +27 -0
  190. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +23 -0
  191. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +38 -0
  192. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +19 -0
  193. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +22 -0
  194. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +20 -0
  195. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +29 -0
  196. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +31 -0
  197. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +23 -0
  198. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +38 -0
  199. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +19 -0
  200. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +22 -0
  201. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +22 -0
  202. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +48 -0
  203. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +23 -0
  204. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +38 -0
  205. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +19 -0
  206. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +24 -0
  207. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +22 -0
  208. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +20 -0
  209. mirascope/api/_generated/traces/types/traces_create_response.py +24 -0
  210. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +22 -0
  211. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +60 -0
  212. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +24 -0
  213. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +22 -0
  214. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +33 -0
  215. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +88 -0
  216. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +33 -0
  217. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +88 -0
  218. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +25 -0
  219. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +44 -0
  220. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +26 -0
  221. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +7 -0
  222. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +7 -0
  223. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +7 -0
  224. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +26 -0
  225. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +50 -0
  226. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +26 -0
  227. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +7 -0
  228. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +7 -0
  229. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +5 -0
  230. mirascope/api/_generated/traces/types/traces_search_response.py +26 -0
  231. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +50 -0
  232. mirascope/api/_generated/types/__init__.py +85 -0
  233. mirascope/api/_generated/types/already_exists_error.py +22 -0
  234. mirascope/api/_generated/types/already_exists_error_tag.py +5 -0
  235. mirascope/api/_generated/types/bad_request_error_body.py +50 -0
  236. mirascope/api/_generated/types/click_house_error.py +22 -0
  237. mirascope/api/_generated/types/database_error.py +22 -0
  238. mirascope/api/_generated/types/database_error_tag.py +5 -0
  239. mirascope/api/_generated/types/date.py +3 -0
  240. mirascope/api/_generated/types/http_api_decode_error.py +27 -0
  241. mirascope/api/_generated/types/http_api_decode_error_tag.py +5 -0
  242. mirascope/api/_generated/types/immutable_resource_error.py +22 -0
  243. mirascope/api/_generated/types/internal_server_error_body.py +49 -0
  244. mirascope/api/_generated/types/issue.py +38 -0
  245. mirascope/api/_generated/types/issue_tag.py +10 -0
  246. mirascope/api/_generated/types/not_found_error_body.py +22 -0
  247. mirascope/api/_generated/types/not_found_error_tag.py +5 -0
  248. mirascope/api/_generated/types/number_from_string.py +3 -0
  249. mirascope/api/_generated/types/permission_denied_error.py +22 -0
  250. mirascope/api/_generated/types/permission_denied_error_tag.py +5 -0
  251. mirascope/api/_generated/types/plan_limit_exceeded_error.py +32 -0
  252. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +7 -0
  253. mirascope/api/_generated/types/pricing_unavailable_error.py +23 -0
  254. mirascope/api/_generated/types/property_key.py +7 -0
  255. mirascope/api/_generated/types/property_key_key.py +25 -0
  256. mirascope/api/_generated/types/property_key_key_tag.py +5 -0
  257. mirascope/api/_generated/types/rate_limit_error.py +31 -0
  258. mirascope/api/_generated/types/rate_limit_error_tag.py +5 -0
  259. mirascope/api/_generated/types/service_unavailable_error_body.py +24 -0
  260. mirascope/api/_generated/types/service_unavailable_error_tag.py +7 -0
  261. mirascope/api/_generated/types/stripe_error.py +20 -0
  262. mirascope/api/_generated/types/subscription_past_due_error.py +31 -0
  263. mirascope/api/_generated/types/subscription_past_due_error_tag.py +7 -0
  264. mirascope/api/_generated/types/unauthorized_error_body.py +21 -0
  265. mirascope/api/_generated/types/unauthorized_error_tag.py +5 -0
  266. mirascope/api/client.py +255 -0
  267. mirascope/api/settings.py +99 -0
  268. mirascope/llm/__init__.py +316 -0
  269. mirascope/llm/calls/__init__.py +17 -0
  270. mirascope/llm/calls/calls.py +348 -0
  271. mirascope/llm/calls/decorator.py +268 -0
  272. mirascope/llm/content/__init__.py +71 -0
  273. mirascope/llm/content/audio.py +173 -0
  274. mirascope/llm/content/document.py +94 -0
  275. mirascope/llm/content/image.py +206 -0
  276. mirascope/llm/content/text.py +47 -0
  277. mirascope/llm/content/thought.py +58 -0
  278. mirascope/llm/content/tool_call.py +69 -0
  279. mirascope/llm/content/tool_output.py +43 -0
  280. mirascope/llm/context/__init__.py +6 -0
  281. mirascope/llm/context/_utils.py +41 -0
  282. mirascope/llm/context/context.py +24 -0
  283. mirascope/llm/exceptions.py +360 -0
  284. mirascope/llm/formatting/__init__.py +39 -0
  285. mirascope/llm/formatting/format.py +291 -0
  286. mirascope/llm/formatting/from_call_args.py +30 -0
  287. mirascope/llm/formatting/output_parser.py +178 -0
  288. mirascope/llm/formatting/partial.py +131 -0
  289. mirascope/llm/formatting/primitives.py +192 -0
  290. mirascope/llm/formatting/types.py +83 -0
  291. mirascope/llm/mcp/__init__.py +5 -0
  292. mirascope/llm/mcp/mcp_client.py +130 -0
  293. mirascope/llm/messages/__init__.py +35 -0
  294. mirascope/llm/messages/_utils.py +34 -0
  295. mirascope/llm/messages/message.py +190 -0
  296. mirascope/llm/models/__init__.py +21 -0
  297. mirascope/llm/models/models.py +1339 -0
  298. mirascope/llm/models/params.py +72 -0
  299. mirascope/llm/models/thinking_config.py +61 -0
  300. mirascope/llm/prompts/__init__.py +34 -0
  301. mirascope/llm/prompts/_utils.py +31 -0
  302. mirascope/llm/prompts/decorator.py +215 -0
  303. mirascope/llm/prompts/prompts.py +484 -0
  304. mirascope/llm/prompts/protocols.py +65 -0
  305. mirascope/llm/providers/__init__.py +65 -0
  306. mirascope/llm/providers/anthropic/__init__.py +11 -0
  307. mirascope/llm/providers/anthropic/_utils/__init__.py +27 -0
  308. mirascope/llm/providers/anthropic/_utils/beta_decode.py +297 -0
  309. mirascope/llm/providers/anthropic/_utils/beta_encode.py +272 -0
  310. mirascope/llm/providers/anthropic/_utils/decode.py +326 -0
  311. mirascope/llm/providers/anthropic/_utils/encode.py +431 -0
  312. mirascope/llm/providers/anthropic/_utils/errors.py +46 -0
  313. mirascope/llm/providers/anthropic/beta_provider.py +338 -0
  314. mirascope/llm/providers/anthropic/model_id.py +23 -0
  315. mirascope/llm/providers/anthropic/model_info.py +87 -0
  316. mirascope/llm/providers/anthropic/provider.py +440 -0
  317. mirascope/llm/providers/base/__init__.py +14 -0
  318. mirascope/llm/providers/base/_utils.py +248 -0
  319. mirascope/llm/providers/base/base_provider.py +1463 -0
  320. mirascope/llm/providers/base/kwargs.py +12 -0
  321. mirascope/llm/providers/google/__init__.py +6 -0
  322. mirascope/llm/providers/google/_utils/__init__.py +17 -0
  323. mirascope/llm/providers/google/_utils/decode.py +357 -0
  324. mirascope/llm/providers/google/_utils/encode.py +418 -0
  325. mirascope/llm/providers/google/_utils/errors.py +50 -0
  326. mirascope/llm/providers/google/message.py +7 -0
  327. mirascope/llm/providers/google/model_id.py +22 -0
  328. mirascope/llm/providers/google/model_info.py +63 -0
  329. mirascope/llm/providers/google/provider.py +456 -0
  330. mirascope/llm/providers/mirascope/__init__.py +5 -0
  331. mirascope/llm/providers/mirascope/_utils.py +73 -0
  332. mirascope/llm/providers/mirascope/provider.py +313 -0
  333. mirascope/llm/providers/mlx/__init__.py +9 -0
  334. mirascope/llm/providers/mlx/_utils.py +141 -0
  335. mirascope/llm/providers/mlx/encoding/__init__.py +8 -0
  336. mirascope/llm/providers/mlx/encoding/base.py +69 -0
  337. mirascope/llm/providers/mlx/encoding/transformers.py +146 -0
  338. mirascope/llm/providers/mlx/mlx.py +242 -0
  339. mirascope/llm/providers/mlx/model_id.py +17 -0
  340. mirascope/llm/providers/mlx/provider.py +416 -0
  341. mirascope/llm/providers/model_id.py +16 -0
  342. mirascope/llm/providers/ollama/__init__.py +7 -0
  343. mirascope/llm/providers/ollama/provider.py +71 -0
  344. mirascope/llm/providers/openai/__init__.py +15 -0
  345. mirascope/llm/providers/openai/_utils/__init__.py +5 -0
  346. mirascope/llm/providers/openai/_utils/errors.py +46 -0
  347. mirascope/llm/providers/openai/completions/__init__.py +7 -0
  348. mirascope/llm/providers/openai/completions/_utils/__init__.py +18 -0
  349. mirascope/llm/providers/openai/completions/_utils/decode.py +252 -0
  350. mirascope/llm/providers/openai/completions/_utils/encode.py +390 -0
  351. mirascope/llm/providers/openai/completions/_utils/feature_info.py +50 -0
  352. mirascope/llm/providers/openai/completions/base_provider.py +522 -0
  353. mirascope/llm/providers/openai/completions/provider.py +28 -0
  354. mirascope/llm/providers/openai/model_id.py +31 -0
  355. mirascope/llm/providers/openai/model_info.py +303 -0
  356. mirascope/llm/providers/openai/provider.py +405 -0
  357. mirascope/llm/providers/openai/responses/__init__.py +5 -0
  358. mirascope/llm/providers/openai/responses/_utils/__init__.py +15 -0
  359. mirascope/llm/providers/openai/responses/_utils/decode.py +289 -0
  360. mirascope/llm/providers/openai/responses/_utils/encode.py +399 -0
  361. mirascope/llm/providers/openai/responses/provider.py +472 -0
  362. mirascope/llm/providers/openrouter/__init__.py +5 -0
  363. mirascope/llm/providers/openrouter/provider.py +67 -0
  364. mirascope/llm/providers/provider_id.py +26 -0
  365. mirascope/llm/providers/provider_registry.py +305 -0
  366. mirascope/llm/providers/together/__init__.py +7 -0
  367. mirascope/llm/providers/together/provider.py +40 -0
  368. mirascope/llm/responses/__init__.py +66 -0
  369. mirascope/llm/responses/_utils.py +146 -0
  370. mirascope/llm/responses/base_response.py +103 -0
  371. mirascope/llm/responses/base_stream_response.py +824 -0
  372. mirascope/llm/responses/finish_reason.py +28 -0
  373. mirascope/llm/responses/response.py +362 -0
  374. mirascope/llm/responses/root_response.py +248 -0
  375. mirascope/llm/responses/stream_response.py +577 -0
  376. mirascope/llm/responses/streams.py +363 -0
  377. mirascope/llm/responses/usage.py +139 -0
  378. mirascope/llm/tools/__init__.py +71 -0
  379. mirascope/llm/tools/_utils.py +34 -0
  380. mirascope/llm/tools/decorator.py +184 -0
  381. mirascope/llm/tools/protocols.py +96 -0
  382. mirascope/llm/tools/provider_tools.py +18 -0
  383. mirascope/llm/tools/tool_schema.py +321 -0
  384. mirascope/llm/tools/toolkit.py +178 -0
  385. mirascope/llm/tools/tools.py +263 -0
  386. mirascope/llm/tools/types.py +112 -0
  387. mirascope/llm/tools/web_search_tool.py +32 -0
  388. mirascope/llm/types/__init__.py +22 -0
  389. mirascope/llm/types/dataclass.py +9 -0
  390. mirascope/llm/types/jsonable.py +44 -0
  391. mirascope/llm/types/type_vars.py +19 -0
  392. mirascope/ops/__init__.py +129 -0
  393. mirascope/ops/_internal/__init__.py +5 -0
  394. mirascope/ops/_internal/closure.py +1172 -0
  395. mirascope/ops/_internal/configuration.py +177 -0
  396. mirascope/ops/_internal/context.py +76 -0
  397. mirascope/ops/_internal/exporters/__init__.py +26 -0
  398. mirascope/ops/_internal/exporters/exporters.py +362 -0
  399. mirascope/ops/_internal/exporters/processors.py +104 -0
  400. mirascope/ops/_internal/exporters/types.py +165 -0
  401. mirascope/ops/_internal/exporters/utils.py +66 -0
  402. mirascope/ops/_internal/instrumentation/__init__.py +28 -0
  403. mirascope/ops/_internal/instrumentation/llm/__init__.py +8 -0
  404. mirascope/ops/_internal/instrumentation/llm/common.py +500 -0
  405. mirascope/ops/_internal/instrumentation/llm/cost.py +190 -0
  406. mirascope/ops/_internal/instrumentation/llm/encode.py +238 -0
  407. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +38 -0
  408. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +31 -0
  409. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +38 -0
  410. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +18 -0
  411. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +100 -0
  412. mirascope/ops/_internal/instrumentation/llm/llm.py +161 -0
  413. mirascope/ops/_internal/instrumentation/llm/model.py +1777 -0
  414. mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
  415. mirascope/ops/_internal/instrumentation/llm/serialize.py +324 -0
  416. mirascope/ops/_internal/instrumentation/providers/__init__.py +29 -0
  417. mirascope/ops/_internal/instrumentation/providers/anthropic.py +78 -0
  418. mirascope/ops/_internal/instrumentation/providers/base.py +179 -0
  419. mirascope/ops/_internal/instrumentation/providers/google_genai.py +85 -0
  420. mirascope/ops/_internal/instrumentation/providers/openai.py +82 -0
  421. mirascope/ops/_internal/propagation.py +198 -0
  422. mirascope/ops/_internal/protocols.py +133 -0
  423. mirascope/ops/_internal/session.py +139 -0
  424. mirascope/ops/_internal/spans.py +232 -0
  425. mirascope/ops/_internal/traced_calls.py +389 -0
  426. mirascope/ops/_internal/traced_functions.py +528 -0
  427. mirascope/ops/_internal/tracing.py +353 -0
  428. mirascope/ops/_internal/types.py +13 -0
  429. mirascope/ops/_internal/utils.py +131 -0
  430. mirascope/ops/_internal/versioned_calls.py +512 -0
  431. mirascope/ops/_internal/versioned_functions.py +357 -0
  432. mirascope/ops/_internal/versioning.py +303 -0
  433. mirascope/ops/exceptions.py +21 -0
  434. mirascope-2.1.1.dist-info/METADATA +231 -0
  435. mirascope-2.1.1.dist-info/RECORD +437 -0
  436. {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/WHEEL +1 -1
  437. {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/licenses/LICENSE +1 -1
  438. mirascope/beta/__init__.py +0 -0
  439. mirascope/beta/openai/__init__.py +0 -5
  440. mirascope/beta/openai/parse.py +0 -129
  441. mirascope/beta/rag/__init__.py +0 -24
  442. mirascope/beta/rag/base/__init__.py +0 -22
  443. mirascope/beta/rag/base/chunkers/__init__.py +0 -2
  444. mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
  445. mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
  446. mirascope/beta/rag/base/config.py +0 -8
  447. mirascope/beta/rag/base/document.py +0 -11
  448. mirascope/beta/rag/base/embedders.py +0 -35
  449. mirascope/beta/rag/base/embedding_params.py +0 -18
  450. mirascope/beta/rag/base/embedding_response.py +0 -30
  451. mirascope/beta/rag/base/query_results.py +0 -7
  452. mirascope/beta/rag/base/vectorstore_params.py +0 -18
  453. mirascope/beta/rag/base/vectorstores.py +0 -37
  454. mirascope/beta/rag/chroma/__init__.py +0 -11
  455. mirascope/beta/rag/chroma/types.py +0 -57
  456. mirascope/beta/rag/chroma/vectorstores.py +0 -97
  457. mirascope/beta/rag/cohere/__init__.py +0 -11
  458. mirascope/beta/rag/cohere/embedders.py +0 -87
  459. mirascope/beta/rag/cohere/embedding_params.py +0 -29
  460. mirascope/beta/rag/cohere/embedding_response.py +0 -29
  461. mirascope/beta/rag/cohere/py.typed +0 -0
  462. mirascope/beta/rag/openai/__init__.py +0 -11
  463. mirascope/beta/rag/openai/embedders.py +0 -144
  464. mirascope/beta/rag/openai/embedding_params.py +0 -18
  465. mirascope/beta/rag/openai/embedding_response.py +0 -14
  466. mirascope/beta/rag/openai/py.typed +0 -0
  467. mirascope/beta/rag/pinecone/__init__.py +0 -19
  468. mirascope/beta/rag/pinecone/types.py +0 -143
  469. mirascope/beta/rag/pinecone/vectorstores.py +0 -148
  470. mirascope/beta/rag/weaviate/__init__.py +0 -6
  471. mirascope/beta/rag/weaviate/types.py +0 -92
  472. mirascope/beta/rag/weaviate/vectorstores.py +0 -103
  473. mirascope/core/__init__.py +0 -55
  474. mirascope/core/anthropic/__init__.py +0 -21
  475. mirascope/core/anthropic/_call.py +0 -71
  476. mirascope/core/anthropic/_utils/__init__.py +0 -16
  477. mirascope/core/anthropic/_utils/_calculate_cost.py +0 -63
  478. mirascope/core/anthropic/_utils/_convert_message_params.py +0 -54
  479. mirascope/core/anthropic/_utils/_get_json_output.py +0 -34
  480. mirascope/core/anthropic/_utils/_handle_stream.py +0 -89
  481. mirascope/core/anthropic/_utils/_setup_call.py +0 -76
  482. mirascope/core/anthropic/call_params.py +0 -36
  483. mirascope/core/anthropic/call_response.py +0 -158
  484. mirascope/core/anthropic/call_response_chunk.py +0 -104
  485. mirascope/core/anthropic/dynamic_config.py +0 -26
  486. mirascope/core/anthropic/py.typed +0 -0
  487. mirascope/core/anthropic/stream.py +0 -140
  488. mirascope/core/anthropic/tool.py +0 -77
  489. mirascope/core/base/__init__.py +0 -40
  490. mirascope/core/base/_call_factory.py +0 -323
  491. mirascope/core/base/_create.py +0 -167
  492. mirascope/core/base/_extract.py +0 -139
  493. mirascope/core/base/_partial.py +0 -63
  494. mirascope/core/base/_utils/__init__.py +0 -64
  495. mirascope/core/base/_utils/_base_type.py +0 -17
  496. mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -45
  497. mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
  498. mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -126
  499. mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
  500. mirascope/core/base/_utils/_extract_tool_return.py +0 -36
  501. mirascope/core/base/_utils/_format_template.py +0 -29
  502. mirascope/core/base/_utils/_get_audio_type.py +0 -18
  503. mirascope/core/base/_utils/_get_fn_args.py +0 -14
  504. mirascope/core/base/_utils/_get_image_type.py +0 -26
  505. mirascope/core/base/_utils/_get_metadata.py +0 -17
  506. mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
  507. mirascope/core/base/_utils/_get_prompt_template.py +0 -25
  508. mirascope/core/base/_utils/_get_template_values.py +0 -52
  509. mirascope/core/base/_utils/_get_template_variables.py +0 -38
  510. mirascope/core/base/_utils/_json_mode_content.py +0 -15
  511. mirascope/core/base/_utils/_parse_content_template.py +0 -157
  512. mirascope/core/base/_utils/_parse_prompt_messages.py +0 -51
  513. mirascope/core/base/_utils/_protocols.py +0 -215
  514. mirascope/core/base/_utils/_setup_call.py +0 -64
  515. mirascope/core/base/_utils/_setup_extract_tool.py +0 -24
  516. mirascope/core/base/call_params.py +0 -6
  517. mirascope/core/base/call_response.py +0 -189
  518. mirascope/core/base/call_response_chunk.py +0 -91
  519. mirascope/core/base/dynamic_config.py +0 -55
  520. mirascope/core/base/message_param.py +0 -61
  521. mirascope/core/base/metadata.py +0 -13
  522. mirascope/core/base/prompt.py +0 -415
  523. mirascope/core/base/stream.py +0 -365
  524. mirascope/core/base/structured_stream.py +0 -251
  525. mirascope/core/base/tool.py +0 -126
  526. mirascope/core/base/toolkit.py +0 -146
  527. mirascope/core/cohere/__init__.py +0 -21
  528. mirascope/core/cohere/_call.py +0 -71
  529. mirascope/core/cohere/_utils/__init__.py +0 -16
  530. mirascope/core/cohere/_utils/_calculate_cost.py +0 -39
  531. mirascope/core/cohere/_utils/_convert_message_params.py +0 -31
  532. mirascope/core/cohere/_utils/_get_json_output.py +0 -31
  533. mirascope/core/cohere/_utils/_handle_stream.py +0 -33
  534. mirascope/core/cohere/_utils/_setup_call.py +0 -89
  535. mirascope/core/cohere/call_params.py +0 -57
  536. mirascope/core/cohere/call_response.py +0 -167
  537. mirascope/core/cohere/call_response_chunk.py +0 -101
  538. mirascope/core/cohere/dynamic_config.py +0 -24
  539. mirascope/core/cohere/py.typed +0 -0
  540. mirascope/core/cohere/stream.py +0 -113
  541. mirascope/core/cohere/tool.py +0 -92
  542. mirascope/core/gemini/__init__.py +0 -21
  543. mirascope/core/gemini/_call.py +0 -71
  544. mirascope/core/gemini/_utils/__init__.py +0 -16
  545. mirascope/core/gemini/_utils/_calculate_cost.py +0 -8
  546. mirascope/core/gemini/_utils/_convert_message_params.py +0 -74
  547. mirascope/core/gemini/_utils/_get_json_output.py +0 -33
  548. mirascope/core/gemini/_utils/_handle_stream.py +0 -33
  549. mirascope/core/gemini/_utils/_setup_call.py +0 -68
  550. mirascope/core/gemini/call_params.py +0 -28
  551. mirascope/core/gemini/call_response.py +0 -173
  552. mirascope/core/gemini/call_response_chunk.py +0 -85
  553. mirascope/core/gemini/dynamic_config.py +0 -26
  554. mirascope/core/gemini/stream.py +0 -121
  555. mirascope/core/gemini/tool.py +0 -104
  556. mirascope/core/groq/__init__.py +0 -21
  557. mirascope/core/groq/_call.py +0 -71
  558. mirascope/core/groq/_utils/__init__.py +0 -16
  559. mirascope/core/groq/_utils/_calculate_cost.py +0 -68
  560. mirascope/core/groq/_utils/_convert_message_params.py +0 -23
  561. mirascope/core/groq/_utils/_get_json_output.py +0 -27
  562. mirascope/core/groq/_utils/_handle_stream.py +0 -121
  563. mirascope/core/groq/_utils/_setup_call.py +0 -67
  564. mirascope/core/groq/call_params.py +0 -51
  565. mirascope/core/groq/call_response.py +0 -160
  566. mirascope/core/groq/call_response_chunk.py +0 -89
  567. mirascope/core/groq/dynamic_config.py +0 -26
  568. mirascope/core/groq/py.typed +0 -0
  569. mirascope/core/groq/stream.py +0 -136
  570. mirascope/core/groq/tool.py +0 -79
  571. mirascope/core/litellm/__init__.py +0 -6
  572. mirascope/core/litellm/_call.py +0 -73
  573. mirascope/core/litellm/_utils/__init__.py +0 -5
  574. mirascope/core/litellm/_utils/_setup_call.py +0 -46
  575. mirascope/core/litellm/py.typed +0 -0
  576. mirascope/core/mistral/__init__.py +0 -21
  577. mirascope/core/mistral/_call.py +0 -69
  578. mirascope/core/mistral/_utils/__init__.py +0 -16
  579. mirascope/core/mistral/_utils/_calculate_cost.py +0 -47
  580. mirascope/core/mistral/_utils/_convert_message_params.py +0 -23
  581. mirascope/core/mistral/_utils/_get_json_output.py +0 -28
  582. mirascope/core/mistral/_utils/_handle_stream.py +0 -121
  583. mirascope/core/mistral/_utils/_setup_call.py +0 -86
  584. mirascope/core/mistral/call_params.py +0 -36
  585. mirascope/core/mistral/call_response.py +0 -156
  586. mirascope/core/mistral/call_response_chunk.py +0 -84
  587. mirascope/core/mistral/dynamic_config.py +0 -24
  588. mirascope/core/mistral/py.typed +0 -0
  589. mirascope/core/mistral/stream.py +0 -117
  590. mirascope/core/mistral/tool.py +0 -77
  591. mirascope/core/openai/__init__.py +0 -21
  592. mirascope/core/openai/_call.py +0 -71
  593. mirascope/core/openai/_utils/__init__.py +0 -16
  594. mirascope/core/openai/_utils/_calculate_cost.py +0 -110
  595. mirascope/core/openai/_utils/_convert_message_params.py +0 -53
  596. mirascope/core/openai/_utils/_get_json_output.py +0 -27
  597. mirascope/core/openai/_utils/_handle_stream.py +0 -125
  598. mirascope/core/openai/_utils/_setup_call.py +0 -62
  599. mirascope/core/openai/call_params.py +0 -54
  600. mirascope/core/openai/call_response.py +0 -162
  601. mirascope/core/openai/call_response_chunk.py +0 -90
  602. mirascope/core/openai/dynamic_config.py +0 -26
  603. mirascope/core/openai/py.typed +0 -0
  604. mirascope/core/openai/stream.py +0 -148
  605. mirascope/core/openai/tool.py +0 -79
  606. mirascope/core/py.typed +0 -0
  607. mirascope/integrations/__init__.py +0 -20
  608. mirascope/integrations/_middleware_factory.py +0 -277
  609. mirascope/integrations/langfuse/__init__.py +0 -3
  610. mirascope/integrations/langfuse/_utils.py +0 -114
  611. mirascope/integrations/langfuse/_with_langfuse.py +0 -71
  612. mirascope/integrations/logfire/__init__.py +0 -3
  613. mirascope/integrations/logfire/_utils.py +0 -188
  614. mirascope/integrations/logfire/_with_logfire.py +0 -60
  615. mirascope/integrations/otel/__init__.py +0 -5
  616. mirascope/integrations/otel/_utils.py +0 -268
  617. mirascope/integrations/otel/_with_hyperdx.py +0 -61
  618. mirascope/integrations/otel/_with_otel.py +0 -60
  619. mirascope/integrations/tenacity.py +0 -50
  620. mirascope/py.typed +0 -0
  621. mirascope/v0/__init__.py +0 -43
  622. mirascope/v0/anthropic.py +0 -54
  623. mirascope/v0/base/__init__.py +0 -12
  624. mirascope/v0/base/calls.py +0 -118
  625. mirascope/v0/base/extractors.py +0 -122
  626. mirascope/v0/base/ops_utils.py +0 -207
  627. mirascope/v0/base/prompts.py +0 -48
  628. mirascope/v0/base/types.py +0 -14
  629. mirascope/v0/base/utils.py +0 -21
  630. mirascope/v0/openai.py +0 -54
  631. mirascope-1.0.5.dist-info/METADATA +0 -519
  632. mirascope-1.0.5.dist-info/RECORD +0 -198
@@ -0,0 +1,177 @@
1
+ """Configuration utilities for Mirascope ops module initialization and setup."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from collections.abc import Iterator
7
+ from contextlib import contextmanager
8
+ from typing import TYPE_CHECKING
9
+
10
+ from opentelemetry import trace as otel_trace
11
+ from opentelemetry.sdk.trace import TracerProvider
12
+ from opentelemetry.sdk.trace.export import BatchSpanProcessor
13
+
14
+ from ...api.client import Mirascope
15
+ from ...api.settings import update_settings
16
+ from .exporters import MirascopeOTLPExporter
17
+
18
+ if TYPE_CHECKING:
19
+ from opentelemetry.trace import Tracer
20
+
21
+ DEFAULT_TRACER_NAME = "mirascope.llm"
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+ _tracer_provider: TracerProvider | None = None
26
+ _tracer_name: str = DEFAULT_TRACER_NAME
27
+ _tracer_version: str | None = None
28
+ _tracer: Tracer | None = None
29
+
30
+
31
+ def _create_mirascope_cloud_provider(
32
+ api_key: str | None = None, base_url: str | None = None
33
+ ) -> TracerProvider:
34
+ """Create a TracerProvider configured for Mirascope Cloud.
35
+
36
+ Args:
37
+ api_key: Optional API key. If not provided, uses MIRASCOPE_API_KEY env var.
38
+
39
+ Returns:
40
+ Configured TracerProvider with MirascopeOTLPExporter.
41
+
42
+ Raises:
43
+ RuntimeError: If API key is not available.
44
+ """
45
+ try:
46
+ client = Mirascope(api_key=api_key, base_url=base_url)
47
+ except (ValueError, RuntimeError) as e:
48
+ raise RuntimeError(
49
+ "Failed to create Mirascope Cloud client. "
50
+ "Set MIRASCOPE_API_KEY environment variable or pass api_key parameter."
51
+ ) from e
52
+
53
+ exporter = MirascopeOTLPExporter(client=client)
54
+ provider = TracerProvider()
55
+ provider.add_span_processor(BatchSpanProcessor(exporter))
56
+
57
+ return provider
58
+
59
+
60
+ def configure(
61
+ *,
62
+ api_key: str | None = None,
63
+ base_url: str | None = None,
64
+ tracer_provider: TracerProvider | None = None,
65
+ tracer_name: str = DEFAULT_TRACER_NAME,
66
+ tracer_version: str | None = None,
67
+ ) -> None:
68
+ """Configure the ops module for tracing.
69
+
70
+ When called without arguments, automatically configures Mirascope Cloud
71
+ using the MIRASCOPE_API_KEY environment variable.
72
+
73
+ Args:
74
+ tracer_provider: Optional custom TracerProvider. If provided, this takes
75
+ precedence over automatic Mirascope Cloud configuration.
76
+ api_key: Optional Mirascope Cloud API key. If not provided, uses
77
+ MIRASCOPE_API_KEY environment variable.
78
+ tracer_name: Tracer name to use when creating a tracer.
79
+ Defaults to "mirascope.llm".
80
+ tracer_version: Optional tracer version.
81
+
82
+ Raises:
83
+ RuntimeError: If no tracer_provider is given and Mirascope Cloud
84
+ cannot be configured (missing API key).
85
+
86
+ Example:
87
+ Simple Mirascope Cloud configuration (recommended):
88
+ ```python
89
+ import os
90
+ os.environ["MIRASCOPE_API_KEY"] = "your-api-key"
91
+
92
+ from mirascope import ops
93
+
94
+ ops.configure() # Automatically uses Mirascope Cloud
95
+ ```
96
+
97
+ With explicit API key:
98
+ ```python
99
+ from mirascope import ops
100
+
101
+ ops.configure(api_key="your-api-key")
102
+ ```
103
+
104
+ With custom tracer provider:
105
+ ```python
106
+ from mirascope import ops
107
+ from opentelemetry.sdk.trace import TracerProvider
108
+
109
+ provider = TracerProvider()
110
+ ops.configure(tracer_provider=provider)
111
+ ```
112
+ """
113
+ global _tracer_provider, _tracer_name, _tracer_version, _tracer
114
+
115
+ # Update settings so get_sync_client/get_async_client can use these values
116
+ if api_key is not None or base_url is not None:
117
+ update_settings(api_key=api_key, base_url=base_url)
118
+
119
+ # If no tracer_provider given, auto-configure Mirascope Cloud
120
+ if tracer_provider is None:
121
+ tracer_provider = _create_mirascope_cloud_provider(
122
+ api_key=api_key, base_url=base_url
123
+ )
124
+
125
+ _tracer_provider = tracer_provider
126
+ otel_trace.set_tracer_provider(tracer_provider)
127
+
128
+ _tracer_name = tracer_name
129
+ _tracer_version = tracer_version
130
+
131
+ _tracer = tracer_provider.get_tracer(_tracer_name, _tracer_version)
132
+
133
+
134
+ def set_tracer(tracer: Tracer | None) -> None:
135
+ """Set the configured tracer instance."""
136
+ global _tracer
137
+ _tracer = tracer
138
+
139
+
140
+ def get_tracer() -> Tracer | None:
141
+ """Return the configured tracer instance."""
142
+ return _tracer
143
+
144
+
145
+ @contextmanager
146
+ def tracer_context(tracer: Tracer | None) -> Iterator[Tracer | None]:
147
+ """Context manager for temporarily setting a tracer.
148
+
149
+ Temporarily sets the tracer for the duration of the context and restores
150
+ the previous tracer when the context exits.
151
+
152
+ Args:
153
+ tracer: The tracer to use within the context.
154
+
155
+ Yields:
156
+ The tracer that was set.
157
+
158
+ Example:
159
+ ```python
160
+ from mirascope import ops
161
+ from opentelemetry.sdk.trace import TracerProvider
162
+
163
+ provider = TracerProvider()
164
+ tracer = provider.get_tracer("my-tracer")
165
+
166
+ with ops.tracer_context(tracer):
167
+ # Use the tracer within this context
168
+ ...
169
+ # Previous tracer is restored here
170
+ ```
171
+ """
172
+ previous_tracer = get_tracer()
173
+ set_tracer(tracer)
174
+ try:
175
+ yield tracer
176
+ finally:
177
+ set_tracer(previous_tracer)
@@ -0,0 +1,76 @@
1
+ """Context management utilities for distributed tracing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Iterator, Mapping
6
+ from contextlib import ExitStack, contextmanager
7
+ from typing import Any
8
+
9
+ from opentelemetry import context as otel_context
10
+ from opentelemetry.context import Context
11
+
12
+ from .propagation import extract_context
13
+ from .session import extract_session_id, session
14
+
15
+
16
+ @contextmanager
17
+ def propagated_context(
18
+ *,
19
+ parent: Context | None = None,
20
+ extract_from: Mapping[str, Any] | None = None,
21
+ ) -> Iterator[None]:
22
+ """Attach a parent context or extract context from carrier headers.
23
+
24
+ This context manager is used to establish trace context continuity,
25
+ typically on the server side when receiving requests. It either extracts
26
+ context from incoming headers or attaches a pre-existing context.
27
+
28
+ Args:
29
+ parent: Pre-existing OTEL context to attach. Mutually exclusive with extract_from.
30
+ extract_from: Dictionary of headers to extract context from (e.g., request.headers).
31
+ Mutually exclusive with parent.
32
+
33
+ Raises:
34
+ ValueError: If both parent and extract_from are provided, or if neither is provided.
35
+
36
+ Example:
37
+ Server-side context extraction from FastAPI request:
38
+
39
+ ```python
40
+ @app.post("/endpoint")
41
+ async def endpoint(request: Request):
42
+ with propagated_context(extract_from=dict(request.headers)):
43
+ result = process_request()
44
+ return result
45
+ ```
46
+
47
+ Using a pre-existing context:
48
+
49
+ ```python
50
+ with propagated_context(parent=existing_context):
51
+ do_work()
52
+ ```
53
+ """
54
+ if parent is not None and extract_from is not None:
55
+ raise ValueError("Cannot specify both 'parent' and 'extract_from' parameters")
56
+
57
+ if parent is None and extract_from is None:
58
+ raise ValueError("Must specify either 'parent' or 'extract_from' parameter")
59
+
60
+ if extract_from is not None:
61
+ with ExitStack() as stack:
62
+ session_id = extract_session_id(extract_from)
63
+ if session_id:
64
+ stack.enter_context(session(id=session_id))
65
+
66
+ extracted_context = extract_context(extract_from)
67
+ token = otel_context.attach(extracted_context)
68
+ stack.callback(otel_context.detach, token)
69
+
70
+ yield
71
+ elif parent is not None:
72
+ token = otel_context.attach(parent)
73
+ try:
74
+ yield
75
+ finally:
76
+ otel_context.detach(token)
@@ -0,0 +1,26 @@
1
+ """Mirascope OpenTelemetry exporters for two-phase telemetry.
2
+
3
+ This package provides a two-phase export system for OpenTelemetry tracing:
4
+ 1. Immediate start event transmission for real-time visibility
5
+ 2. Batched end event transmission for efficiency
6
+ """
7
+
8
+ from .exporters import MirascopeOTLPExporter
9
+ from .processors import MirascopeSpanProcessor
10
+ from .types import (
11
+ Link,
12
+ SpanContextDict,
13
+ SpanEvent,
14
+ SpanEventType,
15
+ Status,
16
+ )
17
+
18
+ __all__ = [
19
+ "Link",
20
+ "MirascopeOTLPExporter",
21
+ "MirascopeSpanProcessor",
22
+ "SpanContextDict",
23
+ "SpanEvent",
24
+ "SpanEventType",
25
+ "Status",
26
+ ]
@@ -0,0 +1,362 @@
1
+ """Exporter implementation for OpenTelemetry exporters.
2
+
3
+ This module provides the export layer for sending OpenTelemetry span
4
+ events to the Mirascope ingestion endpoint. It wraps the Fern-generated
5
+ Mirascope client to provide the interface needed by OpenTelemetry exporters.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import logging
11
+ import time
12
+ from collections.abc import Sequence
13
+
14
+ from opentelemetry.sdk.trace import ReadableSpan
15
+ from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult
16
+ from opentelemetry.util.types import AttributeValue
17
+
18
+ from ....api._generated.traces.types import (
19
+ TracesCreateRequestResourceSpansItem,
20
+ TracesCreateRequestResourceSpansItemResource,
21
+ TracesCreateRequestResourceSpansItemResourceAttributesItem,
22
+ TracesCreateRequestResourceSpansItemResourceAttributesItemValue,
23
+ TracesCreateRequestResourceSpansItemResourceAttributesItemValueArrayValue,
24
+ TracesCreateRequestResourceSpansItemScopeSpansItem,
25
+ TracesCreateRequestResourceSpansItemScopeSpansItemScope,
26
+ TracesCreateRequestResourceSpansItemScopeSpansItemSpansItem,
27
+ TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItem,
28
+ TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue,
29
+ TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValueArrayValue,
30
+ TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemStatus,
31
+ )
32
+ from ....api.client import Mirascope
33
+ from .utils import to_otlp_any_value
34
+
35
+ logger = logging.getLogger(__name__)
36
+
37
+
38
+ class MirascopeOTLPExporter(SpanExporter):
39
+ """OTLP/HTTP exporter for completed spans.
40
+
41
+ This exporter implements the OpenTelemetry SpanExporter interface
42
+ for exporting completed spans in OTLP format over HTTP. It's
43
+ designed to work with BatchSpanProcessor for efficient batching.
44
+
45
+ This uses the Fern auto-generated client for sending converted spans.
46
+
47
+ Attributes:
48
+ exporter: Export client for sending events.
49
+ timeout: Request timeout in seconds.
50
+ """
51
+
52
+ def __init__(
53
+ self,
54
+ client: Mirascope,
55
+ timeout: float = 30.0,
56
+ max_retry_attempts: int = 3,
57
+ ) -> None:
58
+ """Initialize the telemetry exporter.
59
+
60
+ Args:
61
+ client: The Fern-generated Mirascope client instance.
62
+ In the future, this will accept the enhanced client from
63
+ mirascope.api.client that provides error handling and caching
64
+ capabilities.
65
+ timeout: Request timeout in seconds for telemetry operations.
66
+ max_retry_attempts: Maximum number of retry attempts for failed exports.
67
+ """
68
+ self.client = client
69
+ self.timeout = timeout
70
+ self.max_retry_attempts = max_retry_attempts
71
+ self._shutdown = False
72
+
73
+ def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult:
74
+ """Export a batch of spans to the telemetry endpoint.
75
+
76
+ This is the standard OpenTelemetry export interface.
77
+
78
+ Args:
79
+ spans: Sequence of ReadableSpan objects to export.
80
+
81
+ Returns:
82
+ SpanExportResult indicating success or failure.
83
+ """
84
+ if self._shutdown:
85
+ return SpanExportResult.FAILURE
86
+
87
+ if not spans:
88
+ return SpanExportResult.SUCCESS
89
+
90
+ exceptions: list[Exception] = []
91
+ delay = 0.1
92
+
93
+ for i in range(self.max_retry_attempts):
94
+ if i > 0:
95
+ time.sleep(delay)
96
+ delay = min(delay * 2, 5.0)
97
+
98
+ try:
99
+ otlp_data = self._convert_spans_to_otlp(spans)
100
+ response = self.client.traces.create(resource_spans=otlp_data)
101
+
102
+ if (
103
+ response
104
+ and hasattr(response, "partial_success")
105
+ and response.partial_success
106
+ ):
107
+ partial_success = response.partial_success
108
+ if hasattr(partial_success, "rejected_spans"):
109
+ rejected = partial_success.rejected_spans
110
+ if rejected is not None and rejected > 0:
111
+ return SpanExportResult.FAILURE
112
+
113
+ return SpanExportResult.SUCCESS
114
+
115
+ except Exception as e:
116
+ exceptions.append(e)
117
+ logger.warning(
118
+ f"Export attempt {i + 1} failed, retrying in {delay}s: {e}"
119
+ )
120
+
121
+ logger.error(
122
+ f"Failed to export spans after {self.max_retry_attempts} attempts: {exceptions}"
123
+ )
124
+
125
+ return SpanExportResult.FAILURE
126
+
127
+ def _convert_spans_to_otlp(
128
+ self, spans: Sequence[ReadableSpan]
129
+ ) -> list[TracesCreateRequestResourceSpansItem]:
130
+ """Convert OpenTelemetry spans to OTLP format.
131
+
132
+ Args:
133
+ spans: Sequence of ReadableSpan objects.
134
+
135
+ Returns:
136
+ List of ResourceSpans in OTLP format.
137
+ """
138
+ resource_spans_map = {}
139
+
140
+ for span in spans:
141
+ try:
142
+ otlp_span = self._convert_span(span)
143
+ except ValueError as e:
144
+ logger.warning(f"Skipping span due to error: {e}")
145
+ continue
146
+
147
+ resource_key = id(span.resource) if span.resource else "default"
148
+
149
+ if resource_key not in resource_spans_map:
150
+ resource = None
151
+ if span.resource:
152
+ resource_attrs = []
153
+ for key, value in span.resource.attributes.items():
154
+ attr_value = self._convert_resource_attribute_value(value)
155
+ resource_attrs.append(
156
+ TracesCreateRequestResourceSpansItemResourceAttributesItem(
157
+ key=key,
158
+ value=attr_value,
159
+ )
160
+ )
161
+ resource = TracesCreateRequestResourceSpansItemResource(
162
+ attributes=resource_attrs
163
+ )
164
+
165
+ resource_spans_map[resource_key] = {
166
+ "resource": resource,
167
+ "scope_spans": {},
168
+ }
169
+
170
+ scope_key = (
171
+ span.instrumentation_scope.name
172
+ if span.instrumentation_scope
173
+ else "unknown"
174
+ )
175
+
176
+ if scope_key not in resource_spans_map[resource_key]["scope_spans"]:
177
+ scope = None
178
+ if span.instrumentation_scope:
179
+ scope = TracesCreateRequestResourceSpansItemScopeSpansItemScope(
180
+ name=span.instrumentation_scope.name,
181
+ version=span.instrumentation_scope.version,
182
+ )
183
+
184
+ resource_spans_map[resource_key]["scope_spans"][scope_key] = {
185
+ "scope": scope,
186
+ "spans": [],
187
+ }
188
+
189
+ resource_spans_map[resource_key]["scope_spans"][scope_key]["spans"].append(
190
+ otlp_span
191
+ )
192
+
193
+ result = []
194
+ for resource_data in resource_spans_map.values():
195
+ scope_spans = []
196
+ for scope_data in resource_data["scope_spans"].values():
197
+ scope_spans.append(
198
+ TracesCreateRequestResourceSpansItemScopeSpansItem(
199
+ scope=scope_data["scope"],
200
+ spans=scope_data["spans"],
201
+ )
202
+ )
203
+
204
+ result.append(
205
+ TracesCreateRequestResourceSpansItem(
206
+ resource=resource_data["resource"],
207
+ scope_spans=scope_spans,
208
+ )
209
+ )
210
+
211
+ return result
212
+
213
+ def _convert_span(
214
+ self, span: ReadableSpan
215
+ ) -> TracesCreateRequestResourceSpansItemScopeSpansItemSpansItem:
216
+ """Convert a single ReadableSpan to OTLP format."""
217
+ context = span.get_span_context()
218
+ if not context or not context.is_valid:
219
+ raise ValueError(f"Cannot export span without valid context: {span.name}")
220
+
221
+ attributes = []
222
+ if span.attributes:
223
+ for key, value in span.attributes.items():
224
+ attr_value = self._convert_attribute_value(value)
225
+ attributes.append(
226
+ TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItem(
227
+ key=key,
228
+ value=attr_value,
229
+ )
230
+ )
231
+
232
+ status = None
233
+ if span.status:
234
+ status = TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemStatus(
235
+ code=span.status.status_code.value,
236
+ message=span.status.description or "",
237
+ )
238
+
239
+ # Convert events
240
+ events = None
241
+ if span.events:
242
+ events = []
243
+ for event in span.events:
244
+ event_attrs: list[dict[str, object]] = []
245
+ if event.attributes:
246
+ for key, value in event.attributes.items():
247
+ # Convert to OTLP attribute format with typed values
248
+ attr_value = self._convert_event_attribute_value(value)
249
+ event_attrs.append({"key": key, "value": attr_value})
250
+ events.append(
251
+ {
252
+ "name": event.name,
253
+ "timeUnixNano": str(event.timestamp)
254
+ if event.timestamp
255
+ else None,
256
+ "attributes": event_attrs if event_attrs else None,
257
+ }
258
+ )
259
+
260
+ trace_id = format(context.trace_id, "032x")
261
+ span_id = format(context.span_id, "016x")
262
+
263
+ # Build kwargs, only including events if present (to avoid sending null)
264
+ kwargs: dict[str, object] = {
265
+ "trace_id": trace_id,
266
+ "span_id": span_id,
267
+ "parent_span_id": (
268
+ format(span.parent.span_id, "016x")
269
+ if span.parent and span.parent.span_id
270
+ else None
271
+ ),
272
+ "name": span.name,
273
+ "kind": span.kind.value if span.kind else 0,
274
+ "start_time_unix_nano": str(span.start_time) if span.start_time else "0",
275
+ "end_time_unix_nano": str(span.end_time) if span.end_time else "0",
276
+ "attributes": attributes or None,
277
+ "status": status,
278
+ }
279
+ # Only include events if present (omit entirely to avoid sending null)
280
+ if events:
281
+ kwargs["events"] = events
282
+
283
+ return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItem(**kwargs) # type: ignore[arg-type]
284
+
285
+ def _convert_attribute_value(
286
+ self, value: AttributeValue
287
+ ) -> TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue:
288
+ """Convert OpenTelemetry AttributeValue to Mirascope API's KeyValueValue."""
289
+ match value:
290
+ case str():
291
+ return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue(
292
+ string_value=value
293
+ )
294
+ case bool():
295
+ return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue(
296
+ bool_value=value
297
+ )
298
+ case int():
299
+ return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue(
300
+ int_value=str(value)
301
+ )
302
+ case float():
303
+ return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue(
304
+ double_value=value
305
+ )
306
+ case _:
307
+ return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue(
308
+ array_value=TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValueArrayValue(
309
+ values=[to_otlp_any_value(v) for v in value]
310
+ )
311
+ )
312
+
313
+ def _convert_event_attribute_value(
314
+ self, value: AttributeValue
315
+ ) -> dict[str, object]:
316
+ """Convert OpenTelemetry AttributeValue to OTLP event attribute value format."""
317
+ return to_otlp_any_value(value)
318
+
319
+ def _convert_resource_attribute_value(
320
+ self, value: AttributeValue
321
+ ) -> TracesCreateRequestResourceSpansItemResourceAttributesItemValue:
322
+ """Convert OpenTelemetry AttributeValue to Mirascope API's resource KeyValueValue."""
323
+ match value:
324
+ case str():
325
+ return TracesCreateRequestResourceSpansItemResourceAttributesItemValue(
326
+ string_value=value
327
+ )
328
+ case bool():
329
+ return TracesCreateRequestResourceSpansItemResourceAttributesItemValue(
330
+ bool_value=value
331
+ )
332
+ case int():
333
+ return TracesCreateRequestResourceSpansItemResourceAttributesItemValue(
334
+ int_value=str(value)
335
+ )
336
+ case float():
337
+ return TracesCreateRequestResourceSpansItemResourceAttributesItemValue(
338
+ double_value=value
339
+ )
340
+ case _:
341
+ return TracesCreateRequestResourceSpansItemResourceAttributesItemValue(
342
+ array_value=TracesCreateRequestResourceSpansItemResourceAttributesItemValueArrayValue(
343
+ values=[to_otlp_any_value(v) for v in value]
344
+ )
345
+ )
346
+
347
+ def shutdown(self) -> None:
348
+ """Shutdown the exporter. Subsequent exports will return FAILURE."""
349
+ self._shutdown = True
350
+
351
+ def force_flush(self, timeout_millis: int = 30000) -> bool:
352
+ """Force flush any pending data.
353
+
354
+ No-op since this exporter does not buffer data internally.
355
+
356
+ Args:
357
+ timeout_millis: Maximum time to wait in milliseconds (unused).
358
+
359
+ Returns:
360
+ Always True since there is no internal buffer to flush.
361
+ """
362
+ return True