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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (632) hide show
  1. mirascope/__init__.py +6 -6
  2. mirascope/_stubs.py +384 -0
  3. mirascope/_utils.py +34 -0
  4. mirascope/api/__init__.py +14 -0
  5. mirascope/api/_generated/README.md +207 -0
  6. mirascope/api/_generated/__init__.py +444 -0
  7. mirascope/api/_generated/annotations/__init__.py +33 -0
  8. mirascope/api/_generated/annotations/client.py +506 -0
  9. mirascope/api/_generated/annotations/raw_client.py +1414 -0
  10. mirascope/api/_generated/annotations/types/__init__.py +31 -0
  11. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +5 -0
  12. mirascope/api/_generated/annotations/types/annotations_create_response.py +48 -0
  13. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +5 -0
  14. mirascope/api/_generated/annotations/types/annotations_get_response.py +48 -0
  15. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +5 -0
  16. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +5 -0
  17. mirascope/api/_generated/annotations/types/annotations_list_response.py +21 -0
  18. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +50 -0
  19. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +5 -0
  20. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +5 -0
  21. mirascope/api/_generated/annotations/types/annotations_update_response.py +48 -0
  22. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +5 -0
  23. mirascope/api/_generated/api_keys/__init__.py +17 -0
  24. mirascope/api/_generated/api_keys/client.py +530 -0
  25. mirascope/api/_generated/api_keys/raw_client.py +1236 -0
  26. mirascope/api/_generated/api_keys/types/__init__.py +15 -0
  27. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +28 -0
  28. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +27 -0
  29. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +40 -0
  30. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +27 -0
  31. mirascope/api/_generated/client.py +211 -0
  32. mirascope/api/_generated/core/__init__.py +52 -0
  33. mirascope/api/_generated/core/api_error.py +23 -0
  34. mirascope/api/_generated/core/client_wrapper.py +46 -0
  35. mirascope/api/_generated/core/datetime_utils.py +28 -0
  36. mirascope/api/_generated/core/file.py +67 -0
  37. mirascope/api/_generated/core/force_multipart.py +16 -0
  38. mirascope/api/_generated/core/http_client.py +543 -0
  39. mirascope/api/_generated/core/http_response.py +55 -0
  40. mirascope/api/_generated/core/jsonable_encoder.py +100 -0
  41. mirascope/api/_generated/core/pydantic_utilities.py +255 -0
  42. mirascope/api/_generated/core/query_encoder.py +58 -0
  43. mirascope/api/_generated/core/remove_none_from_dict.py +11 -0
  44. mirascope/api/_generated/core/request_options.py +35 -0
  45. mirascope/api/_generated/core/serialization.py +276 -0
  46. mirascope/api/_generated/docs/__init__.py +4 -0
  47. mirascope/api/_generated/docs/client.py +91 -0
  48. mirascope/api/_generated/docs/raw_client.py +178 -0
  49. mirascope/api/_generated/environment.py +9 -0
  50. mirascope/api/_generated/environments/__init__.py +23 -0
  51. mirascope/api/_generated/environments/client.py +649 -0
  52. mirascope/api/_generated/environments/raw_client.py +1567 -0
  53. mirascope/api/_generated/environments/types/__init__.py +25 -0
  54. mirascope/api/_generated/environments/types/environments_create_response.py +24 -0
  55. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +60 -0
  56. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +24 -0
  57. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +22 -0
  58. mirascope/api/_generated/environments/types/environments_get_response.py +24 -0
  59. mirascope/api/_generated/environments/types/environments_list_response_item.py +24 -0
  60. mirascope/api/_generated/environments/types/environments_update_response.py +24 -0
  61. mirascope/api/_generated/errors/__init__.py +25 -0
  62. mirascope/api/_generated/errors/bad_request_error.py +14 -0
  63. mirascope/api/_generated/errors/conflict_error.py +14 -0
  64. mirascope/api/_generated/errors/forbidden_error.py +11 -0
  65. mirascope/api/_generated/errors/internal_server_error.py +10 -0
  66. mirascope/api/_generated/errors/not_found_error.py +11 -0
  67. mirascope/api/_generated/errors/payment_required_error.py +15 -0
  68. mirascope/api/_generated/errors/service_unavailable_error.py +14 -0
  69. mirascope/api/_generated/errors/too_many_requests_error.py +15 -0
  70. mirascope/api/_generated/errors/unauthorized_error.py +11 -0
  71. mirascope/api/_generated/functions/__init__.py +39 -0
  72. mirascope/api/_generated/functions/client.py +647 -0
  73. mirascope/api/_generated/functions/raw_client.py +1890 -0
  74. mirascope/api/_generated/functions/types/__init__.py +53 -0
  75. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +20 -0
  76. mirascope/api/_generated/functions/types/functions_create_response.py +37 -0
  77. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +20 -0
  78. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +39 -0
  79. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +20 -0
  80. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +53 -0
  81. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +22 -0
  82. mirascope/api/_generated/functions/types/functions_get_response.py +37 -0
  83. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +20 -0
  84. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +25 -0
  85. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +56 -0
  86. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +22 -0
  87. mirascope/api/_generated/functions/types/functions_list_response.py +21 -0
  88. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +41 -0
  89. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +20 -0
  90. mirascope/api/_generated/health/__init__.py +7 -0
  91. mirascope/api/_generated/health/client.py +92 -0
  92. mirascope/api/_generated/health/raw_client.py +175 -0
  93. mirascope/api/_generated/health/types/__init__.py +8 -0
  94. mirascope/api/_generated/health/types/health_check_response.py +22 -0
  95. mirascope/api/_generated/health/types/health_check_response_status.py +5 -0
  96. mirascope/api/_generated/organization_invitations/__init__.py +33 -0
  97. mirascope/api/_generated/organization_invitations/client.py +546 -0
  98. mirascope/api/_generated/organization_invitations/raw_client.py +1519 -0
  99. mirascope/api/_generated/organization_invitations/types/__init__.py +53 -0
  100. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +34 -0
  101. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +7 -0
  102. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +7 -0
  103. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +48 -0
  104. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +7 -0
  105. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +7 -0
  106. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +48 -0
  107. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +7 -0
  108. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +7 -0
  109. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +48 -0
  110. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +7 -0
  111. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +7 -0
  112. mirascope/api/_generated/organization_memberships/__init__.py +19 -0
  113. mirascope/api/_generated/organization_memberships/client.py +302 -0
  114. mirascope/api/_generated/organization_memberships/raw_client.py +736 -0
  115. mirascope/api/_generated/organization_memberships/types/__init__.py +27 -0
  116. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +33 -0
  117. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +7 -0
  118. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +7 -0
  119. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +31 -0
  120. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +7 -0
  121. mirascope/api/_generated/organizations/__init__.py +51 -0
  122. mirascope/api/_generated/organizations/client.py +869 -0
  123. mirascope/api/_generated/organizations/raw_client.py +2593 -0
  124. mirascope/api/_generated/organizations/types/__init__.py +71 -0
  125. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +24 -0
  126. mirascope/api/_generated/organizations/types/organizations_create_response.py +26 -0
  127. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +5 -0
  128. mirascope/api/_generated/organizations/types/organizations_get_response.py +26 -0
  129. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +5 -0
  130. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +26 -0
  131. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +5 -0
  132. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +7 -0
  133. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +47 -0
  134. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +33 -0
  135. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +7 -0
  136. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +24 -0
  137. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +53 -0
  138. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +7 -0
  139. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +26 -0
  140. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +34 -0
  141. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +7 -0
  142. mirascope/api/_generated/organizations/types/organizations_update_response.py +26 -0
  143. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +5 -0
  144. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +7 -0
  145. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +35 -0
  146. mirascope/api/_generated/project_memberships/__init__.py +29 -0
  147. mirascope/api/_generated/project_memberships/client.py +528 -0
  148. mirascope/api/_generated/project_memberships/raw_client.py +1278 -0
  149. mirascope/api/_generated/project_memberships/types/__init__.py +33 -0
  150. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +7 -0
  151. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +35 -0
  152. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +7 -0
  153. mirascope/api/_generated/project_memberships/types/project_memberships_get_response.py +33 -0
  154. mirascope/api/_generated/project_memberships/types/project_memberships_get_response_role.py +7 -0
  155. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +33 -0
  156. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +7 -0
  157. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +7 -0
  158. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +35 -0
  159. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +7 -0
  160. mirascope/api/_generated/projects/__init__.py +7 -0
  161. mirascope/api/_generated/projects/client.py +428 -0
  162. mirascope/api/_generated/projects/raw_client.py +1302 -0
  163. mirascope/api/_generated/projects/types/__init__.py +10 -0
  164. mirascope/api/_generated/projects/types/projects_create_response.py +25 -0
  165. mirascope/api/_generated/projects/types/projects_get_response.py +25 -0
  166. mirascope/api/_generated/projects/types/projects_list_response_item.py +25 -0
  167. mirascope/api/_generated/projects/types/projects_update_response.py +25 -0
  168. mirascope/api/_generated/reference.md +4987 -0
  169. mirascope/api/_generated/tags/__init__.py +19 -0
  170. mirascope/api/_generated/tags/client.py +504 -0
  171. mirascope/api/_generated/tags/raw_client.py +1288 -0
  172. mirascope/api/_generated/tags/types/__init__.py +17 -0
  173. mirascope/api/_generated/tags/types/tags_create_response.py +41 -0
  174. mirascope/api/_generated/tags/types/tags_get_response.py +41 -0
  175. mirascope/api/_generated/tags/types/tags_list_response.py +23 -0
  176. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +41 -0
  177. mirascope/api/_generated/tags/types/tags_update_response.py +41 -0
  178. mirascope/api/_generated/token_cost/__init__.py +7 -0
  179. mirascope/api/_generated/token_cost/client.py +160 -0
  180. mirascope/api/_generated/token_cost/raw_client.py +264 -0
  181. mirascope/api/_generated/token_cost/types/__init__.py +8 -0
  182. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +54 -0
  183. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +52 -0
  184. mirascope/api/_generated/traces/__init__.py +97 -0
  185. mirascope/api/_generated/traces/client.py +1103 -0
  186. mirascope/api/_generated/traces/raw_client.py +2322 -0
  187. mirascope/api/_generated/traces/types/__init__.py +155 -0
  188. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +29 -0
  189. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +27 -0
  190. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +23 -0
  191. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +38 -0
  192. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +19 -0
  193. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +22 -0
  194. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +20 -0
  195. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +29 -0
  196. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +31 -0
  197. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +23 -0
  198. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +38 -0
  199. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +19 -0
  200. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +22 -0
  201. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +22 -0
  202. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +48 -0
  203. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +23 -0
  204. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +38 -0
  205. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +19 -0
  206. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +24 -0
  207. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +22 -0
  208. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +20 -0
  209. mirascope/api/_generated/traces/types/traces_create_response.py +24 -0
  210. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +22 -0
  211. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +60 -0
  212. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +24 -0
  213. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +22 -0
  214. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +33 -0
  215. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +88 -0
  216. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +33 -0
  217. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +88 -0
  218. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +25 -0
  219. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +44 -0
  220. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +26 -0
  221. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +7 -0
  222. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +7 -0
  223. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +7 -0
  224. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +26 -0
  225. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +50 -0
  226. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +26 -0
  227. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +7 -0
  228. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +7 -0
  229. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +5 -0
  230. mirascope/api/_generated/traces/types/traces_search_response.py +26 -0
  231. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +50 -0
  232. mirascope/api/_generated/types/__init__.py +85 -0
  233. mirascope/api/_generated/types/already_exists_error.py +22 -0
  234. mirascope/api/_generated/types/already_exists_error_tag.py +5 -0
  235. mirascope/api/_generated/types/bad_request_error_body.py +50 -0
  236. mirascope/api/_generated/types/click_house_error.py +22 -0
  237. mirascope/api/_generated/types/database_error.py +22 -0
  238. mirascope/api/_generated/types/database_error_tag.py +5 -0
  239. mirascope/api/_generated/types/date.py +3 -0
  240. mirascope/api/_generated/types/http_api_decode_error.py +27 -0
  241. mirascope/api/_generated/types/http_api_decode_error_tag.py +5 -0
  242. mirascope/api/_generated/types/immutable_resource_error.py +22 -0
  243. mirascope/api/_generated/types/internal_server_error_body.py +49 -0
  244. mirascope/api/_generated/types/issue.py +38 -0
  245. mirascope/api/_generated/types/issue_tag.py +10 -0
  246. mirascope/api/_generated/types/not_found_error_body.py +22 -0
  247. mirascope/api/_generated/types/not_found_error_tag.py +5 -0
  248. mirascope/api/_generated/types/number_from_string.py +3 -0
  249. mirascope/api/_generated/types/permission_denied_error.py +22 -0
  250. mirascope/api/_generated/types/permission_denied_error_tag.py +5 -0
  251. mirascope/api/_generated/types/plan_limit_exceeded_error.py +32 -0
  252. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +7 -0
  253. mirascope/api/_generated/types/pricing_unavailable_error.py +23 -0
  254. mirascope/api/_generated/types/property_key.py +7 -0
  255. mirascope/api/_generated/types/property_key_key.py +25 -0
  256. mirascope/api/_generated/types/property_key_key_tag.py +5 -0
  257. mirascope/api/_generated/types/rate_limit_error.py +31 -0
  258. mirascope/api/_generated/types/rate_limit_error_tag.py +5 -0
  259. mirascope/api/_generated/types/service_unavailable_error_body.py +24 -0
  260. mirascope/api/_generated/types/service_unavailable_error_tag.py +7 -0
  261. mirascope/api/_generated/types/stripe_error.py +20 -0
  262. mirascope/api/_generated/types/subscription_past_due_error.py +31 -0
  263. mirascope/api/_generated/types/subscription_past_due_error_tag.py +7 -0
  264. mirascope/api/_generated/types/unauthorized_error_body.py +21 -0
  265. mirascope/api/_generated/types/unauthorized_error_tag.py +5 -0
  266. mirascope/api/client.py +255 -0
  267. mirascope/api/settings.py +99 -0
  268. mirascope/llm/__init__.py +316 -0
  269. mirascope/llm/calls/__init__.py +17 -0
  270. mirascope/llm/calls/calls.py +348 -0
  271. mirascope/llm/calls/decorator.py +268 -0
  272. mirascope/llm/content/__init__.py +71 -0
  273. mirascope/llm/content/audio.py +173 -0
  274. mirascope/llm/content/document.py +94 -0
  275. mirascope/llm/content/image.py +206 -0
  276. mirascope/llm/content/text.py +47 -0
  277. mirascope/llm/content/thought.py +58 -0
  278. mirascope/llm/content/tool_call.py +69 -0
  279. mirascope/llm/content/tool_output.py +43 -0
  280. mirascope/llm/context/__init__.py +6 -0
  281. mirascope/llm/context/_utils.py +41 -0
  282. mirascope/llm/context/context.py +24 -0
  283. mirascope/llm/exceptions.py +360 -0
  284. mirascope/llm/formatting/__init__.py +39 -0
  285. mirascope/llm/formatting/format.py +291 -0
  286. mirascope/llm/formatting/from_call_args.py +30 -0
  287. mirascope/llm/formatting/output_parser.py +178 -0
  288. mirascope/llm/formatting/partial.py +131 -0
  289. mirascope/llm/formatting/primitives.py +192 -0
  290. mirascope/llm/formatting/types.py +83 -0
  291. mirascope/llm/mcp/__init__.py +5 -0
  292. mirascope/llm/mcp/mcp_client.py +130 -0
  293. mirascope/llm/messages/__init__.py +35 -0
  294. mirascope/llm/messages/_utils.py +34 -0
  295. mirascope/llm/messages/message.py +190 -0
  296. mirascope/llm/models/__init__.py +21 -0
  297. mirascope/llm/models/models.py +1339 -0
  298. mirascope/llm/models/params.py +72 -0
  299. mirascope/llm/models/thinking_config.py +61 -0
  300. mirascope/llm/prompts/__init__.py +34 -0
  301. mirascope/llm/prompts/_utils.py +31 -0
  302. mirascope/llm/prompts/decorator.py +215 -0
  303. mirascope/llm/prompts/prompts.py +484 -0
  304. mirascope/llm/prompts/protocols.py +65 -0
  305. mirascope/llm/providers/__init__.py +65 -0
  306. mirascope/llm/providers/anthropic/__init__.py +11 -0
  307. mirascope/llm/providers/anthropic/_utils/__init__.py +27 -0
  308. mirascope/llm/providers/anthropic/_utils/beta_decode.py +297 -0
  309. mirascope/llm/providers/anthropic/_utils/beta_encode.py +272 -0
  310. mirascope/llm/providers/anthropic/_utils/decode.py +326 -0
  311. mirascope/llm/providers/anthropic/_utils/encode.py +431 -0
  312. mirascope/llm/providers/anthropic/_utils/errors.py +46 -0
  313. mirascope/llm/providers/anthropic/beta_provider.py +338 -0
  314. mirascope/llm/providers/anthropic/model_id.py +23 -0
  315. mirascope/llm/providers/anthropic/model_info.py +87 -0
  316. mirascope/llm/providers/anthropic/provider.py +440 -0
  317. mirascope/llm/providers/base/__init__.py +14 -0
  318. mirascope/llm/providers/base/_utils.py +248 -0
  319. mirascope/llm/providers/base/base_provider.py +1463 -0
  320. mirascope/llm/providers/base/kwargs.py +12 -0
  321. mirascope/llm/providers/google/__init__.py +6 -0
  322. mirascope/llm/providers/google/_utils/__init__.py +17 -0
  323. mirascope/llm/providers/google/_utils/decode.py +357 -0
  324. mirascope/llm/providers/google/_utils/encode.py +418 -0
  325. mirascope/llm/providers/google/_utils/errors.py +50 -0
  326. mirascope/llm/providers/google/message.py +7 -0
  327. mirascope/llm/providers/google/model_id.py +22 -0
  328. mirascope/llm/providers/google/model_info.py +63 -0
  329. mirascope/llm/providers/google/provider.py +456 -0
  330. mirascope/llm/providers/mirascope/__init__.py +5 -0
  331. mirascope/llm/providers/mirascope/_utils.py +73 -0
  332. mirascope/llm/providers/mirascope/provider.py +313 -0
  333. mirascope/llm/providers/mlx/__init__.py +9 -0
  334. mirascope/llm/providers/mlx/_utils.py +141 -0
  335. mirascope/llm/providers/mlx/encoding/__init__.py +8 -0
  336. mirascope/llm/providers/mlx/encoding/base.py +69 -0
  337. mirascope/llm/providers/mlx/encoding/transformers.py +146 -0
  338. mirascope/llm/providers/mlx/mlx.py +242 -0
  339. mirascope/llm/providers/mlx/model_id.py +17 -0
  340. mirascope/llm/providers/mlx/provider.py +416 -0
  341. mirascope/llm/providers/model_id.py +16 -0
  342. mirascope/llm/providers/ollama/__init__.py +7 -0
  343. mirascope/llm/providers/ollama/provider.py +71 -0
  344. mirascope/llm/providers/openai/__init__.py +15 -0
  345. mirascope/llm/providers/openai/_utils/__init__.py +5 -0
  346. mirascope/llm/providers/openai/_utils/errors.py +46 -0
  347. mirascope/llm/providers/openai/completions/__init__.py +7 -0
  348. mirascope/llm/providers/openai/completions/_utils/__init__.py +18 -0
  349. mirascope/llm/providers/openai/completions/_utils/decode.py +252 -0
  350. mirascope/llm/providers/openai/completions/_utils/encode.py +390 -0
  351. mirascope/llm/providers/openai/completions/_utils/feature_info.py +50 -0
  352. mirascope/llm/providers/openai/completions/base_provider.py +522 -0
  353. mirascope/llm/providers/openai/completions/provider.py +28 -0
  354. mirascope/llm/providers/openai/model_id.py +31 -0
  355. mirascope/llm/providers/openai/model_info.py +303 -0
  356. mirascope/llm/providers/openai/provider.py +405 -0
  357. mirascope/llm/providers/openai/responses/__init__.py +5 -0
  358. mirascope/llm/providers/openai/responses/_utils/__init__.py +15 -0
  359. mirascope/llm/providers/openai/responses/_utils/decode.py +289 -0
  360. mirascope/llm/providers/openai/responses/_utils/encode.py +399 -0
  361. mirascope/llm/providers/openai/responses/provider.py +472 -0
  362. mirascope/llm/providers/openrouter/__init__.py +5 -0
  363. mirascope/llm/providers/openrouter/provider.py +67 -0
  364. mirascope/llm/providers/provider_id.py +26 -0
  365. mirascope/llm/providers/provider_registry.py +305 -0
  366. mirascope/llm/providers/together/__init__.py +7 -0
  367. mirascope/llm/providers/together/provider.py +40 -0
  368. mirascope/llm/responses/__init__.py +66 -0
  369. mirascope/llm/responses/_utils.py +146 -0
  370. mirascope/llm/responses/base_response.py +103 -0
  371. mirascope/llm/responses/base_stream_response.py +824 -0
  372. mirascope/llm/responses/finish_reason.py +28 -0
  373. mirascope/llm/responses/response.py +362 -0
  374. mirascope/llm/responses/root_response.py +248 -0
  375. mirascope/llm/responses/stream_response.py +577 -0
  376. mirascope/llm/responses/streams.py +363 -0
  377. mirascope/llm/responses/usage.py +139 -0
  378. mirascope/llm/tools/__init__.py +71 -0
  379. mirascope/llm/tools/_utils.py +34 -0
  380. mirascope/llm/tools/decorator.py +184 -0
  381. mirascope/llm/tools/protocols.py +96 -0
  382. mirascope/llm/tools/provider_tools.py +18 -0
  383. mirascope/llm/tools/tool_schema.py +321 -0
  384. mirascope/llm/tools/toolkit.py +178 -0
  385. mirascope/llm/tools/tools.py +263 -0
  386. mirascope/llm/tools/types.py +112 -0
  387. mirascope/llm/tools/web_search_tool.py +32 -0
  388. mirascope/llm/types/__init__.py +22 -0
  389. mirascope/llm/types/dataclass.py +9 -0
  390. mirascope/llm/types/jsonable.py +44 -0
  391. mirascope/llm/types/type_vars.py +19 -0
  392. mirascope/ops/__init__.py +129 -0
  393. mirascope/ops/_internal/__init__.py +5 -0
  394. mirascope/ops/_internal/closure.py +1172 -0
  395. mirascope/ops/_internal/configuration.py +177 -0
  396. mirascope/ops/_internal/context.py +76 -0
  397. mirascope/ops/_internal/exporters/__init__.py +26 -0
  398. mirascope/ops/_internal/exporters/exporters.py +362 -0
  399. mirascope/ops/_internal/exporters/processors.py +104 -0
  400. mirascope/ops/_internal/exporters/types.py +165 -0
  401. mirascope/ops/_internal/exporters/utils.py +66 -0
  402. mirascope/ops/_internal/instrumentation/__init__.py +28 -0
  403. mirascope/ops/_internal/instrumentation/llm/__init__.py +8 -0
  404. mirascope/ops/_internal/instrumentation/llm/common.py +500 -0
  405. mirascope/ops/_internal/instrumentation/llm/cost.py +190 -0
  406. mirascope/ops/_internal/instrumentation/llm/encode.py +238 -0
  407. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +38 -0
  408. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +31 -0
  409. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +38 -0
  410. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +18 -0
  411. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +100 -0
  412. mirascope/ops/_internal/instrumentation/llm/llm.py +161 -0
  413. mirascope/ops/_internal/instrumentation/llm/model.py +1777 -0
  414. mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
  415. mirascope/ops/_internal/instrumentation/llm/serialize.py +324 -0
  416. mirascope/ops/_internal/instrumentation/providers/__init__.py +29 -0
  417. mirascope/ops/_internal/instrumentation/providers/anthropic.py +78 -0
  418. mirascope/ops/_internal/instrumentation/providers/base.py +179 -0
  419. mirascope/ops/_internal/instrumentation/providers/google_genai.py +85 -0
  420. mirascope/ops/_internal/instrumentation/providers/openai.py +82 -0
  421. mirascope/ops/_internal/propagation.py +198 -0
  422. mirascope/ops/_internal/protocols.py +133 -0
  423. mirascope/ops/_internal/session.py +139 -0
  424. mirascope/ops/_internal/spans.py +232 -0
  425. mirascope/ops/_internal/traced_calls.py +389 -0
  426. mirascope/ops/_internal/traced_functions.py +528 -0
  427. mirascope/ops/_internal/tracing.py +353 -0
  428. mirascope/ops/_internal/types.py +13 -0
  429. mirascope/ops/_internal/utils.py +131 -0
  430. mirascope/ops/_internal/versioned_calls.py +512 -0
  431. mirascope/ops/_internal/versioned_functions.py +357 -0
  432. mirascope/ops/_internal/versioning.py +303 -0
  433. mirascope/ops/exceptions.py +21 -0
  434. mirascope-2.1.1.dist-info/METADATA +231 -0
  435. mirascope-2.1.1.dist-info/RECORD +437 -0
  436. {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/WHEEL +1 -1
  437. {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/licenses/LICENSE +1 -1
  438. mirascope/beta/__init__.py +0 -0
  439. mirascope/beta/openai/__init__.py +0 -5
  440. mirascope/beta/openai/parse.py +0 -129
  441. mirascope/beta/rag/__init__.py +0 -24
  442. mirascope/beta/rag/base/__init__.py +0 -22
  443. mirascope/beta/rag/base/chunkers/__init__.py +0 -2
  444. mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
  445. mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
  446. mirascope/beta/rag/base/config.py +0 -8
  447. mirascope/beta/rag/base/document.py +0 -11
  448. mirascope/beta/rag/base/embedders.py +0 -35
  449. mirascope/beta/rag/base/embedding_params.py +0 -18
  450. mirascope/beta/rag/base/embedding_response.py +0 -30
  451. mirascope/beta/rag/base/query_results.py +0 -7
  452. mirascope/beta/rag/base/vectorstore_params.py +0 -18
  453. mirascope/beta/rag/base/vectorstores.py +0 -37
  454. mirascope/beta/rag/chroma/__init__.py +0 -11
  455. mirascope/beta/rag/chroma/types.py +0 -57
  456. mirascope/beta/rag/chroma/vectorstores.py +0 -97
  457. mirascope/beta/rag/cohere/__init__.py +0 -11
  458. mirascope/beta/rag/cohere/embedders.py +0 -87
  459. mirascope/beta/rag/cohere/embedding_params.py +0 -29
  460. mirascope/beta/rag/cohere/embedding_response.py +0 -29
  461. mirascope/beta/rag/cohere/py.typed +0 -0
  462. mirascope/beta/rag/openai/__init__.py +0 -11
  463. mirascope/beta/rag/openai/embedders.py +0 -144
  464. mirascope/beta/rag/openai/embedding_params.py +0 -18
  465. mirascope/beta/rag/openai/embedding_response.py +0 -14
  466. mirascope/beta/rag/openai/py.typed +0 -0
  467. mirascope/beta/rag/pinecone/__init__.py +0 -19
  468. mirascope/beta/rag/pinecone/types.py +0 -143
  469. mirascope/beta/rag/pinecone/vectorstores.py +0 -148
  470. mirascope/beta/rag/weaviate/__init__.py +0 -6
  471. mirascope/beta/rag/weaviate/types.py +0 -92
  472. mirascope/beta/rag/weaviate/vectorstores.py +0 -103
  473. mirascope/core/__init__.py +0 -55
  474. mirascope/core/anthropic/__init__.py +0 -21
  475. mirascope/core/anthropic/_call.py +0 -71
  476. mirascope/core/anthropic/_utils/__init__.py +0 -16
  477. mirascope/core/anthropic/_utils/_calculate_cost.py +0 -63
  478. mirascope/core/anthropic/_utils/_convert_message_params.py +0 -54
  479. mirascope/core/anthropic/_utils/_get_json_output.py +0 -34
  480. mirascope/core/anthropic/_utils/_handle_stream.py +0 -89
  481. mirascope/core/anthropic/_utils/_setup_call.py +0 -76
  482. mirascope/core/anthropic/call_params.py +0 -36
  483. mirascope/core/anthropic/call_response.py +0 -158
  484. mirascope/core/anthropic/call_response_chunk.py +0 -104
  485. mirascope/core/anthropic/dynamic_config.py +0 -26
  486. mirascope/core/anthropic/py.typed +0 -0
  487. mirascope/core/anthropic/stream.py +0 -140
  488. mirascope/core/anthropic/tool.py +0 -77
  489. mirascope/core/base/__init__.py +0 -40
  490. mirascope/core/base/_call_factory.py +0 -323
  491. mirascope/core/base/_create.py +0 -167
  492. mirascope/core/base/_extract.py +0 -139
  493. mirascope/core/base/_partial.py +0 -63
  494. mirascope/core/base/_utils/__init__.py +0 -64
  495. mirascope/core/base/_utils/_base_type.py +0 -17
  496. mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -45
  497. mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
  498. mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -126
  499. mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
  500. mirascope/core/base/_utils/_extract_tool_return.py +0 -36
  501. mirascope/core/base/_utils/_format_template.py +0 -29
  502. mirascope/core/base/_utils/_get_audio_type.py +0 -18
  503. mirascope/core/base/_utils/_get_fn_args.py +0 -14
  504. mirascope/core/base/_utils/_get_image_type.py +0 -26
  505. mirascope/core/base/_utils/_get_metadata.py +0 -17
  506. mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
  507. mirascope/core/base/_utils/_get_prompt_template.py +0 -25
  508. mirascope/core/base/_utils/_get_template_values.py +0 -52
  509. mirascope/core/base/_utils/_get_template_variables.py +0 -38
  510. mirascope/core/base/_utils/_json_mode_content.py +0 -15
  511. mirascope/core/base/_utils/_parse_content_template.py +0 -157
  512. mirascope/core/base/_utils/_parse_prompt_messages.py +0 -51
  513. mirascope/core/base/_utils/_protocols.py +0 -215
  514. mirascope/core/base/_utils/_setup_call.py +0 -64
  515. mirascope/core/base/_utils/_setup_extract_tool.py +0 -24
  516. mirascope/core/base/call_params.py +0 -6
  517. mirascope/core/base/call_response.py +0 -189
  518. mirascope/core/base/call_response_chunk.py +0 -91
  519. mirascope/core/base/dynamic_config.py +0 -55
  520. mirascope/core/base/message_param.py +0 -61
  521. mirascope/core/base/metadata.py +0 -13
  522. mirascope/core/base/prompt.py +0 -415
  523. mirascope/core/base/stream.py +0 -365
  524. mirascope/core/base/structured_stream.py +0 -251
  525. mirascope/core/base/tool.py +0 -126
  526. mirascope/core/base/toolkit.py +0 -146
  527. mirascope/core/cohere/__init__.py +0 -21
  528. mirascope/core/cohere/_call.py +0 -71
  529. mirascope/core/cohere/_utils/__init__.py +0 -16
  530. mirascope/core/cohere/_utils/_calculate_cost.py +0 -39
  531. mirascope/core/cohere/_utils/_convert_message_params.py +0 -31
  532. mirascope/core/cohere/_utils/_get_json_output.py +0 -31
  533. mirascope/core/cohere/_utils/_handle_stream.py +0 -33
  534. mirascope/core/cohere/_utils/_setup_call.py +0 -89
  535. mirascope/core/cohere/call_params.py +0 -57
  536. mirascope/core/cohere/call_response.py +0 -167
  537. mirascope/core/cohere/call_response_chunk.py +0 -101
  538. mirascope/core/cohere/dynamic_config.py +0 -24
  539. mirascope/core/cohere/py.typed +0 -0
  540. mirascope/core/cohere/stream.py +0 -113
  541. mirascope/core/cohere/tool.py +0 -92
  542. mirascope/core/gemini/__init__.py +0 -21
  543. mirascope/core/gemini/_call.py +0 -71
  544. mirascope/core/gemini/_utils/__init__.py +0 -16
  545. mirascope/core/gemini/_utils/_calculate_cost.py +0 -8
  546. mirascope/core/gemini/_utils/_convert_message_params.py +0 -74
  547. mirascope/core/gemini/_utils/_get_json_output.py +0 -33
  548. mirascope/core/gemini/_utils/_handle_stream.py +0 -33
  549. mirascope/core/gemini/_utils/_setup_call.py +0 -68
  550. mirascope/core/gemini/call_params.py +0 -28
  551. mirascope/core/gemini/call_response.py +0 -173
  552. mirascope/core/gemini/call_response_chunk.py +0 -85
  553. mirascope/core/gemini/dynamic_config.py +0 -26
  554. mirascope/core/gemini/stream.py +0 -121
  555. mirascope/core/gemini/tool.py +0 -104
  556. mirascope/core/groq/__init__.py +0 -21
  557. mirascope/core/groq/_call.py +0 -71
  558. mirascope/core/groq/_utils/__init__.py +0 -16
  559. mirascope/core/groq/_utils/_calculate_cost.py +0 -68
  560. mirascope/core/groq/_utils/_convert_message_params.py +0 -23
  561. mirascope/core/groq/_utils/_get_json_output.py +0 -27
  562. mirascope/core/groq/_utils/_handle_stream.py +0 -121
  563. mirascope/core/groq/_utils/_setup_call.py +0 -67
  564. mirascope/core/groq/call_params.py +0 -51
  565. mirascope/core/groq/call_response.py +0 -160
  566. mirascope/core/groq/call_response_chunk.py +0 -89
  567. mirascope/core/groq/dynamic_config.py +0 -26
  568. mirascope/core/groq/py.typed +0 -0
  569. mirascope/core/groq/stream.py +0 -136
  570. mirascope/core/groq/tool.py +0 -79
  571. mirascope/core/litellm/__init__.py +0 -6
  572. mirascope/core/litellm/_call.py +0 -73
  573. mirascope/core/litellm/_utils/__init__.py +0 -5
  574. mirascope/core/litellm/_utils/_setup_call.py +0 -46
  575. mirascope/core/litellm/py.typed +0 -0
  576. mirascope/core/mistral/__init__.py +0 -21
  577. mirascope/core/mistral/_call.py +0 -69
  578. mirascope/core/mistral/_utils/__init__.py +0 -16
  579. mirascope/core/mistral/_utils/_calculate_cost.py +0 -47
  580. mirascope/core/mistral/_utils/_convert_message_params.py +0 -23
  581. mirascope/core/mistral/_utils/_get_json_output.py +0 -28
  582. mirascope/core/mistral/_utils/_handle_stream.py +0 -121
  583. mirascope/core/mistral/_utils/_setup_call.py +0 -86
  584. mirascope/core/mistral/call_params.py +0 -36
  585. mirascope/core/mistral/call_response.py +0 -156
  586. mirascope/core/mistral/call_response_chunk.py +0 -84
  587. mirascope/core/mistral/dynamic_config.py +0 -24
  588. mirascope/core/mistral/py.typed +0 -0
  589. mirascope/core/mistral/stream.py +0 -117
  590. mirascope/core/mistral/tool.py +0 -77
  591. mirascope/core/openai/__init__.py +0 -21
  592. mirascope/core/openai/_call.py +0 -71
  593. mirascope/core/openai/_utils/__init__.py +0 -16
  594. mirascope/core/openai/_utils/_calculate_cost.py +0 -110
  595. mirascope/core/openai/_utils/_convert_message_params.py +0 -53
  596. mirascope/core/openai/_utils/_get_json_output.py +0 -27
  597. mirascope/core/openai/_utils/_handle_stream.py +0 -125
  598. mirascope/core/openai/_utils/_setup_call.py +0 -62
  599. mirascope/core/openai/call_params.py +0 -54
  600. mirascope/core/openai/call_response.py +0 -162
  601. mirascope/core/openai/call_response_chunk.py +0 -90
  602. mirascope/core/openai/dynamic_config.py +0 -26
  603. mirascope/core/openai/py.typed +0 -0
  604. mirascope/core/openai/stream.py +0 -148
  605. mirascope/core/openai/tool.py +0 -79
  606. mirascope/core/py.typed +0 -0
  607. mirascope/integrations/__init__.py +0 -20
  608. mirascope/integrations/_middleware_factory.py +0 -277
  609. mirascope/integrations/langfuse/__init__.py +0 -3
  610. mirascope/integrations/langfuse/_utils.py +0 -114
  611. mirascope/integrations/langfuse/_with_langfuse.py +0 -71
  612. mirascope/integrations/logfire/__init__.py +0 -3
  613. mirascope/integrations/logfire/_utils.py +0 -188
  614. mirascope/integrations/logfire/_with_logfire.py +0 -60
  615. mirascope/integrations/otel/__init__.py +0 -5
  616. mirascope/integrations/otel/_utils.py +0 -268
  617. mirascope/integrations/otel/_with_hyperdx.py +0 -61
  618. mirascope/integrations/otel/_with_otel.py +0 -60
  619. mirascope/integrations/tenacity.py +0 -50
  620. mirascope/py.typed +0 -0
  621. mirascope/v0/__init__.py +0 -43
  622. mirascope/v0/anthropic.py +0 -54
  623. mirascope/v0/base/__init__.py +0 -12
  624. mirascope/v0/base/calls.py +0 -118
  625. mirascope/v0/base/extractors.py +0 -122
  626. mirascope/v0/base/ops_utils.py +0 -207
  627. mirascope/v0/base/prompts.py +0 -48
  628. mirascope/v0/base/types.py +0 -14
  629. mirascope/v0/base/utils.py +0 -21
  630. mirascope/v0/openai.py +0 -54
  631. mirascope-1.0.5.dist-info/METADATA +0 -519
  632. mirascope-1.0.5.dist-info/RECORD +0 -198
@@ -1,277 +0,0 @@
1
- """The `middleware_factory` method for handling the call response."""
2
-
3
- import inspect
4
- from collections.abc import AsyncGenerator, Awaitable, Callable, Generator
5
- from contextlib import AbstractContextManager, contextmanager
6
- from functools import wraps
7
- from typing import (
8
- Any,
9
- ParamSpec,
10
- TypeVar,
11
- cast,
12
- overload,
13
- )
14
-
15
- from pydantic import BaseModel
16
-
17
- from mirascope.core.base._utils._base_type import BaseType
18
-
19
- from ..core.base.call_response import BaseCallResponse
20
- from ..core.base.stream import BaseStream
21
- from ..core.base.structured_stream import BaseStructuredStream
22
-
23
- _BaseCallResponseT = TypeVar("_BaseCallResponseT", bound=BaseCallResponse)
24
- _BaseStructuredStreamT = TypeVar("_BaseStructuredStreamT", bound=BaseStructuredStream)
25
- _BaseStreamT = TypeVar("_BaseStreamT", bound=BaseStream)
26
- _ResponseModelT = TypeVar("_ResponseModelT", bound=BaseModel | BaseType)
27
- ResponseModel = BaseModel | BaseType
28
- _P = ParamSpec("_P")
29
- SyncFunc = Callable[
30
- _P, _BaseCallResponseT | _BaseStreamT | _ResponseModelT | _BaseStructuredStreamT
31
- ]
32
- AsyncFunc = Callable[
33
- _P,
34
- Awaitable[
35
- _BaseCallResponseT | _BaseStreamT | _ResponseModelT | _BaseStructuredStreamT
36
- ],
37
- ]
38
- _T = TypeVar("_T")
39
- _R = TypeVar("_R")
40
-
41
-
42
- @contextmanager
43
- def default_context_manager(
44
- fn: SyncFunc | AsyncFunc,
45
- ) -> Generator[None, None, None]:
46
- yield None
47
-
48
-
49
- def middleware_factory(
50
- custom_context_manager: Callable[
51
- [SyncFunc | AsyncFunc], AbstractContextManager[_T]
52
- ] = default_context_manager,
53
- custom_decorator: Callable | None = None,
54
- handle_call_response: Callable[
55
- [BaseCallResponse, SyncFunc | AsyncFunc, _T | None], None
56
- ]
57
- | None = None,
58
- handle_call_response_async: Callable[
59
- [BaseCallResponse, SyncFunc | AsyncFunc, _T | None], Awaitable[None]
60
- ]
61
- | None = None,
62
- handle_stream: Callable[[BaseStream, SyncFunc | AsyncFunc, _T | None], None]
63
- | None = None,
64
- handle_stream_async: Callable[
65
- [BaseStream, SyncFunc | AsyncFunc, _T | None], Awaitable[None]
66
- ]
67
- | None = None,
68
- handle_response_model: Callable[
69
- [ResponseModel, SyncFunc | AsyncFunc, _T | None], None
70
- ]
71
- | None = None,
72
- handle_response_model_async: Callable[
73
- [ResponseModel, SyncFunc | AsyncFunc, _T | None], Awaitable[None]
74
- ]
75
- | None = None,
76
- handle_structured_stream: Callable[
77
- [BaseStructuredStream, SyncFunc | AsyncFunc, _T | None], None
78
- ]
79
- | None = None,
80
- handle_structured_stream_async: Callable[
81
- [BaseStructuredStream, SyncFunc | AsyncFunc, _T | None], Awaitable[None]
82
- ]
83
- | None = None,
84
- ) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]:
85
- '''A factory method for creating middleware decorators.
86
-
87
- Example:
88
-
89
- ```python
90
- from mirascope.core import openai, prompt_template
91
- from mirascope.integrations import middleware_factory
92
-
93
- def with_saving():
94
- """Saves some data after a Mirascope call."""
95
-
96
- return middleware_factory(
97
- custom_context_manager=custom_context_manager,
98
- custom_decorator=custom_decorator,
99
- handle_call_response=handle_call_response,
100
- handle_call_response_async=handle_call_response_async,
101
- handle_stream=handle_stream,
102
- handle_stream_async=handle_stream_async,
103
- handle_response_model=handle_response_model,
104
- handle_response_model_async=handle_response_model_async,
105
- handle_structured_stream=handle_structured_stream,
106
- handle_structured_stream_async=handle_structured_stream_async,
107
- )
108
-
109
-
110
- @with_saving()
111
- @openai.call("gpt-4o-mini")
112
- @prompt_template("Recommend a {genre} book")
113
- def recommend_book(genre: str):
114
- ...
115
-
116
-
117
- response = recommend_book("fantasy") # `with_saving` automatically run
118
- print(response.content)
119
- ```
120
- '''
121
-
122
- @overload
123
- def decorator(fn: Callable[_P, _R]) -> Callable[_P, _R]: ...
124
-
125
- @overload
126
- def decorator(fn: Callable[_P, Awaitable[_R]]) -> Callable[_P, Awaitable[_R]]: ...
127
-
128
- def decorator(
129
- fn: Callable[_P, _R | Awaitable[_R]],
130
- ) -> Callable[_P, _R | Awaitable[_R]]:
131
- if inspect.iscoroutinefunction(fn):
132
-
133
- @wraps(fn)
134
- async def wrapper_async(*args: _P.args, **kwargs: _P.kwargs) -> _R:
135
- result = await fn(*args, **kwargs)
136
- if (
137
- isinstance(result, BaseCallResponse)
138
- and handle_call_response_async is not None
139
- ):
140
- with custom_context_manager(fn) as context:
141
- await handle_call_response_async(result, fn, context)
142
- elif isinstance(result, BaseStream):
143
- original_class = type(result)
144
- original_aiter = result.__aiter__
145
-
146
- def new_stream_aiter(
147
- self: Any, # noqa: ANN401
148
- ) -> AsyncGenerator[tuple[Any, Any | None], Any]: # noqa: ANN401
149
- async def generator() -> (
150
- AsyncGenerator[tuple[Any, Any | None], Any]
151
- ):
152
- with custom_context_manager(fn) as context:
153
- async for chunk, tool in original_aiter():
154
- yield chunk, tool
155
- if handle_stream_async is not None:
156
- await handle_stream_async(result, fn, context)
157
-
158
- return generator()
159
-
160
- class MiddlewareAsyncStream(original_class):
161
- __aiter__ = (
162
- custom_decorator(fn)(new_stream_aiter)
163
- if custom_decorator
164
- else new_stream_aiter
165
- )
166
-
167
- result.__class__ = MiddlewareAsyncStream
168
- elif (
169
- isinstance(result, ResponseModel)
170
- and handle_response_model_async is not None
171
- ):
172
- with custom_context_manager(fn) as context:
173
- await handle_response_model_async(result, fn, context)
174
- elif isinstance(result, BaseStructuredStream):
175
- original_class = type(result)
176
- original_aiter = result.__aiter__
177
-
178
- def new_aiter(
179
- self: Any, # noqa: ANN401
180
- ) -> AsyncGenerator[tuple[Any, Any | None], Any]: # noqa: ANN401
181
- async def generator() -> (
182
- AsyncGenerator[tuple[Any, Any | None], Any]
183
- ):
184
- with custom_context_manager(fn) as context:
185
- async for chunk in original_aiter():
186
- yield chunk
187
- if handle_structured_stream_async is not None:
188
- await handle_structured_stream_async(
189
- result, fn, context
190
- )
191
-
192
- return generator()
193
-
194
- class MiddlewareAsyncStructuredStream(original_class):
195
- __aiter__ = (
196
- custom_decorator(fn)(new_aiter)
197
- if custom_decorator
198
- else new_aiter
199
- )
200
-
201
- result.__class__ = MiddlewareAsyncStructuredStream
202
- return cast(_R, result)
203
-
204
- return (
205
- custom_decorator(fn)(wrapper_async)
206
- if custom_decorator
207
- else wrapper_async
208
- )
209
- else:
210
-
211
- @wraps(fn)
212
- def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _R:
213
- result = fn(*args, **kwargs)
214
- if (
215
- isinstance(result, BaseCallResponse)
216
- and handle_call_response is not None
217
- ):
218
- with custom_context_manager(fn) as context:
219
- handle_call_response(result, fn, context)
220
- elif isinstance(result, BaseStream):
221
- original_class = type(result)
222
- original_iter = result.__iter__
223
-
224
- def new_stream_iter(
225
- self: Any, # noqa: ANN401
226
- ) -> Generator[tuple[Any, Any | None], None, None]: # noqa: ANN401
227
- # Create the context manager when user iterates over the stream
228
- with custom_context_manager(fn) as context:
229
- yield from original_iter()
230
- if handle_stream is not None:
231
- handle_stream(result, fn, context)
232
-
233
- class MiddlewareStream(original_class):
234
- __iter__ = (
235
- custom_decorator(fn)(new_stream_iter)
236
- if custom_decorator
237
- else new_stream_iter
238
- )
239
-
240
- result.__class__ = MiddlewareStream
241
- elif (
242
- isinstance(result, ResponseModel)
243
- and handle_response_model is not None
244
- ):
245
- with custom_context_manager(fn) as context:
246
- handle_response_model(result, fn, context)
247
- elif isinstance(result, BaseStructuredStream):
248
- original_class = type(result)
249
- original_iter = result.__iter__
250
-
251
- def new_iter(
252
- self: Any, # noqa: ANN401
253
- ) -> Generator[
254
- Generator[tuple[Any, Any | None], None, None]
255
- | Generator[Any, None, None],
256
- Any,
257
- None,
258
- ]: # noqa: ANN401
259
- # Create the context manager when user iterates over the stream
260
- with custom_context_manager(fn) as context:
261
- yield from original_iter()
262
- if handle_structured_stream is not None:
263
- handle_structured_stream(result, fn, context)
264
-
265
- class MiddlewareStructuredStream(original_class):
266
- __iter__ = (
267
- custom_decorator(fn)(new_iter)
268
- if custom_decorator
269
- else new_iter
270
- )
271
-
272
- result.__class__ = MiddlewareStructuredStream
273
- return cast(_R, result)
274
-
275
- return custom_decorator(fn)(wrapper) if custom_decorator else wrapper
276
-
277
- return decorator
@@ -1,3 +0,0 @@
1
- from ._with_langfuse import with_langfuse
2
-
3
- __all__ = ["with_langfuse"]
@@ -1,114 +0,0 @@
1
- from collections.abc import Callable
2
- from typing import Any
3
-
4
- from langfuse.decorators import langfuse_context
5
- from pydantic import BaseModel
6
-
7
- from mirascope.core.base._utils._base_type import BaseType
8
-
9
- from ...core.base import BaseCallResponse
10
- from ...core.base._utils import get_metadata
11
- from ...core.base.stream import BaseStream
12
- from ...core.base.structured_stream import BaseStructuredStream
13
-
14
-
15
- class ModelUsage(BaseModel):
16
- input: int | float | None
17
- output: int | float | None
18
- unit: str
19
-
20
-
21
- def get_call_response_observation(
22
- result: BaseCallResponse, fn: Callable
23
- ) -> dict[str, Any]:
24
- metadata = get_metadata(fn, {})
25
- tags = metadata.get("tags", [])
26
- return {
27
- "name": f"{fn.__name__} with {result.model}",
28
- "input": result.prompt_template,
29
- "metadata": result.response,
30
- "tags": tags,
31
- "model": result.model,
32
- "output": result.message_param.get("content", None),
33
- }
34
-
35
-
36
- def handle_call_response(result: BaseCallResponse, fn: Callable, context: None) -> None:
37
- langfuse_context.update_current_observation(
38
- **get_call_response_observation(result, fn),
39
- usage=ModelUsage(
40
- input=result.input_tokens, output=result.output_tokens, unit="TOKENS"
41
- ),
42
- )
43
-
44
-
45
- def handle_stream(stream: BaseStream, fn: Callable, context: None) -> None:
46
- usage = ModelUsage(
47
- input=stream.input_tokens,
48
- output=stream.output_tokens,
49
- unit="TOKENS",
50
- )
51
- langfuse_context.update_current_observation(
52
- **get_call_response_observation(stream.construct_call_response(), fn),
53
- usage=usage,
54
- )
55
-
56
-
57
- def handle_response_model(
58
- result: BaseModel | BaseType, fn: Callable, context: None
59
- ) -> None:
60
- if isinstance(result, BaseModel):
61
- response: BaseCallResponse = result._response # type: ignore
62
- call_response_observation = get_call_response_observation(response, fn)
63
- call_response_observation.pop("output")
64
- langfuse_context.update_current_observation(
65
- **call_response_observation,
66
- usage=ModelUsage(
67
- input=response.input_tokens,
68
- output=response.output_tokens,
69
- unit="TOKENS",
70
- ),
71
- output=result,
72
- )
73
- else:
74
- langfuse_context.update_current_observation(
75
- output=result,
76
- )
77
-
78
-
79
- def handle_structured_stream(
80
- result: BaseStructuredStream, fn: Callable, context: None
81
- ) -> None:
82
- stream: BaseStream = result.stream
83
- usage = ModelUsage(
84
- input=stream.input_tokens,
85
- output=stream.output_tokens,
86
- unit="TOKENS",
87
- )
88
- langfuse_context.update_current_observation(
89
- **get_call_response_observation(stream.construct_call_response(), fn),
90
- usage=usage,
91
- output=result.constructed_response_model,
92
- )
93
-
94
-
95
- async def handle_call_response_async(
96
- result: BaseCallResponse, fn: Callable, context: None
97
- ) -> None:
98
- handle_call_response(result, fn, None)
99
-
100
-
101
- async def handle_stream_async(stream: BaseStream, fn: Callable, context: None) -> None:
102
- handle_stream(stream, fn, None)
103
-
104
-
105
- async def handle_response_model_async(
106
- result: BaseModel | BaseType, fn: Callable, context: None
107
- ) -> None:
108
- handle_response_model(result, fn, None)
109
-
110
-
111
- async def handle_structured_stream_async(
112
- result: BaseStructuredStream, fn: Callable, context: None
113
- ) -> None:
114
- handle_structured_stream(result, fn, None)
@@ -1,71 +0,0 @@
1
- """Mirascope x Langfuse Integration."""
2
-
3
- from collections.abc import Callable
4
- from typing import Any, ParamSpec, TypeVar
5
-
6
- from langfuse.decorators import observe
7
-
8
- from .._middleware_factory import middleware_factory
9
- from ._utils import (
10
- handle_call_response,
11
- handle_call_response_async,
12
- handle_response_model,
13
- handle_response_model_async,
14
- handle_stream,
15
- handle_stream_async,
16
- handle_structured_stream,
17
- handle_structured_stream_async,
18
- )
19
-
20
- F = TypeVar("F", bound=Callable[..., Any])
21
-
22
-
23
- def custom_decorator(fn: Callable) -> Callable[[F], F]:
24
- return observe(
25
- name=fn.__name__,
26
- as_type="generation",
27
- capture_input=False,
28
- capture_output=False,
29
- )
30
-
31
-
32
- _P = ParamSpec("_P")
33
- _R = TypeVar("_R")
34
-
35
-
36
- def with_langfuse() -> Callable[[Callable[_P, _R]], Callable[_P, _R]]:
37
- """Wraps a Mirascope function with Langfuse.
38
-
39
- Example:
40
-
41
- ```python
42
- from mirascope.core import anthropic, prompt_template
43
- from mirascope.integrations.langfuse import with_langfuse
44
-
45
-
46
- def format_book(title: str, author: str):
47
- return f"{title} by {author}"
48
-
49
-
50
- @with_langfuse()
51
- @anthropic.call(model="claude-3-5-sonnet-20240620", tools=[format_book])
52
- @prompt_template("Recommend a {genre} book.")
53
- def recommend_book(genre: str):
54
- ...
55
-
56
-
57
- print(recommend_book("fantasy"))
58
- ```
59
- """
60
-
61
- return middleware_factory(
62
- custom_decorator=custom_decorator,
63
- handle_call_response=handle_call_response,
64
- handle_call_response_async=handle_call_response_async,
65
- handle_stream=handle_stream,
66
- handle_stream_async=handle_stream_async,
67
- handle_response_model=handle_response_model,
68
- handle_response_model_async=handle_response_model_async,
69
- handle_structured_stream=handle_structured_stream,
70
- handle_structured_stream_async=handle_structured_stream_async,
71
- )
@@ -1,3 +0,0 @@
1
- from ._with_logfire import with_logfire
2
-
3
- __all__ = ["with_logfire"]
@@ -1,188 +0,0 @@
1
- """Mirascope x Logfire Integration utils"""
2
-
3
- from collections.abc import Callable, Generator
4
- from contextlib import contextmanager
5
- from typing import (
6
- Any,
7
- )
8
-
9
- import logfire
10
- from pydantic import BaseModel
11
-
12
- from mirascope.core.base._utils._base_type import BaseType
13
-
14
- from ...core.base import BaseCallResponse, _utils
15
- from ...core.base.metadata import Metadata
16
- from ...core.base.stream import BaseStream
17
- from ...core.base.structured_stream import BaseStructuredStream
18
-
19
-
20
- @contextmanager
21
- def custom_context_manager(
22
- fn: Callable,
23
- ) -> Generator[logfire.LogfireSpan, Any, None]:
24
- metadata: Metadata = _utils.get_metadata(fn, None)
25
- tags = metadata.get("tags", [])
26
- with logfire.with_settings(custom_scope_suffix="mirascope", tags=list(tags)).span(
27
- fn.__name__
28
- ) as logfire_span:
29
- yield logfire_span
30
-
31
-
32
- def get_call_response_span_data(result: BaseCallResponse) -> dict:
33
- output: dict[str, Any] = {}
34
- if cost := result.cost:
35
- output["cost"] = cost
36
- if input_tokens := result.input_tokens:
37
- output["input_tokens"] = input_tokens
38
- if output_tokens := result.output_tokens:
39
- output["output_tokens"] = output_tokens
40
- if content := result.content:
41
- output["content"] = content
42
- return {
43
- "async": False,
44
- "call_params": result.call_params,
45
- "call_kwargs": result.call_kwargs,
46
- "model": result.model,
47
- "provider": result._provider,
48
- "prompt_template": result.prompt_template,
49
- "template_variables": result.fn_args,
50
- "messages": result.messages,
51
- "response_data": result.response,
52
- "output": output,
53
- }
54
-
55
-
56
- def get_tool_calls(result: BaseCallResponse) -> list[dict] | None:
57
- if tools := result.tools:
58
- tool_calls = [
59
- {
60
- "function": {
61
- "arguments": tool.args,
62
- "name": tool._name(),
63
- }
64
- }
65
- for tool in tools
66
- ]
67
- return tool_calls
68
- return None
69
-
70
-
71
- def handle_call_response(
72
- result: BaseCallResponse, fn: Callable, logfire_span: logfire.LogfireSpan | None
73
- ) -> None:
74
- if logfire_span is None:
75
- return
76
- span_data = get_call_response_span_data(result)
77
- span_data["async"] = False
78
- tool_calls = get_tool_calls(result)
79
- if tool_calls:
80
- span_data["output"]["tool_calls"] = tool_calls
81
- logfire_span.set_attributes(span_data)
82
-
83
-
84
- def handle_stream(
85
- stream: BaseStream,
86
- fn: Callable,
87
- logfire_span: logfire.LogfireSpan | None,
88
- ) -> None:
89
- handle_call_response(stream.construct_call_response(), fn, logfire_span)
90
-
91
-
92
- def set_response_model_output(
93
- result: BaseModel | BaseType, output: dict[str, Any]
94
- ) -> None:
95
- if isinstance(result, BaseModel):
96
- output["response_model"] = {
97
- "name": result.__class__.__name__,
98
- "arguments": result.model_dump(),
99
- }
100
- else:
101
- output["content"] = result
102
-
103
-
104
- def handle_response_model(
105
- result: BaseModel | BaseType, fn: Callable, logfire_span: logfire.LogfireSpan | None
106
- ) -> None:
107
- if logfire_span is None:
108
- return
109
- span_data: dict[str, Any] = {"output": {}, "async": False}
110
- if isinstance(result, BaseModel): # type: ignore
111
- response: BaseCallResponse = result._response # type: ignore
112
- span_data |= get_call_response_span_data(response)
113
- set_response_model_output(result, span_data["output"])
114
- logfire_span.set_attributes(span_data)
115
-
116
-
117
- def get_structured_stream_span_data(result: BaseStructuredStream) -> dict:
118
- span_data = get_call_response_span_data(result.stream.construct_call_response())
119
- output = span_data.get("output", {})
120
- response_model = result.constructed_response_model
121
- if isinstance(response_model, BaseModel):
122
- output["response_model"] = {
123
- "name": response_model.__class__.__name__,
124
- "arguments": response_model.model_dump(),
125
- }
126
- else:
127
- output["content"] = response_model
128
- span_data["output"] = output
129
-
130
- return span_data
131
-
132
-
133
- def handle_structured_stream(
134
- result: BaseStructuredStream, fn: Callable, logfire_span: logfire.LogfireSpan | None
135
- ) -> None:
136
- if logfire_span is None:
137
- return
138
- span_data = get_structured_stream_span_data(result)
139
- span_data["async"] = False
140
- logfire_span.set_attributes(span_data)
141
-
142
-
143
- async def handle_call_response_async(
144
- result: BaseCallResponse, fn: Callable, logfire_span: logfire.LogfireSpan | None
145
- ) -> None:
146
- if logfire_span is None:
147
- return
148
- span_data = get_call_response_span_data(result)
149
- span_data["async"] = True
150
- tool_calls = get_tool_calls(result)
151
- if tool_calls:
152
- span_data["output"]["tool_calls"] = tool_calls
153
- logfire_span.set_attributes(span_data)
154
-
155
-
156
- async def handle_stream_async(
157
- stream: BaseStream,
158
- fn: Callable,
159
- logfire_span: logfire.LogfireSpan | None,
160
- ) -> None:
161
- await handle_call_response_async(stream.construct_call_response(), fn, logfire_span)
162
-
163
-
164
- async def handle_response_model_async(
165
- result: BaseModel | BaseType,
166
- fn: Callable,
167
- logfire_span: logfire.LogfireSpan | None,
168
- ) -> None:
169
- if logfire_span is None:
170
- return
171
- span_data: dict[str, Any] = {"output": {}, "async": True}
172
- if isinstance(result, BaseModel): # type: ignore
173
- response: BaseCallResponse = result._response # type: ignore
174
- span_data |= get_call_response_span_data(response)
175
- set_response_model_output(result, span_data["output"])
176
- logfire_span.set_attributes(span_data)
177
-
178
-
179
- async def handle_structured_stream_async(
180
- result: BaseStructuredStream,
181
- fn: Callable,
182
- logfire_span: logfire.LogfireSpan | None,
183
- ) -> None:
184
- if logfire_span is None:
185
- return
186
- span_data = get_structured_stream_span_data(result)
187
- span_data["async"] = True
188
- logfire_span.set_attributes(span_data)