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,305 @@
1
+ """Provider registry for managing provider instances and scopes."""
2
+
3
+ import os
4
+ from collections.abc import Sequence
5
+ from dataclasses import dataclass
6
+ from functools import lru_cache
7
+ from typing import overload
8
+
9
+ from ..exceptions import MissingAPIKeyError, NoRegisteredProviderError
10
+ from .anthropic import AnthropicProvider
11
+ from .base import Provider
12
+ from .google import GoogleProvider
13
+ from .mirascope import MirascopeProvider
14
+ from .mlx import MLXProvider
15
+ from .ollama import OllamaProvider
16
+ from .openai import OpenAIProvider
17
+ from .openai.completions.provider import OpenAICompletionsProvider
18
+ from .openai.responses.provider import OpenAIResponsesProvider
19
+ from .openrouter import OpenRouterProvider
20
+ from .provider_id import ProviderId
21
+ from .together import TogetherProvider
22
+
23
+ # Global registry mapping scopes to providers
24
+ # Scopes are matched by prefix (longest match wins)
25
+ PROVIDER_REGISTRY: dict[str, Provider] = {}
26
+
27
+
28
+ def reset_provider_registry() -> None:
29
+ """Resets the provider registry, clearing all registered providers."""
30
+ PROVIDER_REGISTRY.clear()
31
+ provider_singleton.cache_clear()
32
+
33
+
34
+ @dataclass(frozen=True)
35
+ class ProviderDefault:
36
+ """Configuration for a provider in the auto-registration fallback chain.
37
+
38
+ When auto-registering a provider for a scope, the fallback chain is tried
39
+ in order. The first provider whose API key is available will be used.
40
+ """
41
+
42
+ provider_id: ProviderId
43
+ """The provider identifier."""
44
+
45
+ api_key_env_var: str | None
46
+ """Environment variable for the API key, or None if no key is required."""
47
+
48
+
49
+ # Fallback chain for auto-registration: try providers in order until one has
50
+ # its API key available. This enables automatic fallback to Mirascope Router
51
+ # when direct provider keys are not set.
52
+ DEFAULT_AUTO_REGISTER_SCOPES: dict[str, Sequence[ProviderDefault]] = {
53
+ "anthropic/": [
54
+ ProviderDefault("anthropic", "ANTHROPIC_API_KEY"),
55
+ ProviderDefault("mirascope", "MIRASCOPE_API_KEY"),
56
+ ],
57
+ "google/": [
58
+ ProviderDefault("google", "GOOGLE_API_KEY"),
59
+ ProviderDefault("mirascope", "MIRASCOPE_API_KEY"),
60
+ ],
61
+ "openai/": [
62
+ ProviderDefault("openai", "OPENAI_API_KEY"),
63
+ ProviderDefault("mirascope", "MIRASCOPE_API_KEY"),
64
+ ],
65
+ "together/": [
66
+ ProviderDefault("together", "TOGETHER_API_KEY"),
67
+ # No Mirascope fallback for together
68
+ ],
69
+ "ollama/": [
70
+ ProviderDefault("ollama", None), # No API key required
71
+ ],
72
+ "mlx-community/": [
73
+ ProviderDefault("mlx", None), # No API key required
74
+ ],
75
+ "openrouter/": [
76
+ ProviderDefault("openrouter", "OPENROUTER_API_KEY"),
77
+ ],
78
+ }
79
+
80
+
81
+ def _has_api_key(default: ProviderDefault) -> bool:
82
+ """Check if the API key for a provider default is available.
83
+
84
+ Args:
85
+ default: The provider default configuration to check.
86
+
87
+ Returns:
88
+ True if the API key is available or not required, False otherwise.
89
+ """
90
+ if default.api_key_env_var is None:
91
+ return True # Provider doesn't require API key
92
+ return os.environ.get(default.api_key_env_var) is not None
93
+
94
+
95
+ @lru_cache(maxsize=256)
96
+ def provider_singleton(
97
+ provider_id: ProviderId, *, api_key: str | None = None, base_url: str | None = None
98
+ ) -> Provider:
99
+ """Create a cached provider instance for the specified provider id.
100
+
101
+ Args:
102
+ provider_id: The provider name ("openai", "anthropic", or "google").
103
+ api_key: API key for authentication. If None, uses provider-specific env var.
104
+ base_url: Base URL for the API. If None, uses provider-specific env var.
105
+
106
+ Returns:
107
+ A cached provider instance for the specified provider with the given parameters.
108
+
109
+ Raises:
110
+ ValueError: If the provider_id is not supported.
111
+ """
112
+ match provider_id:
113
+ case "anthropic":
114
+ return AnthropicProvider(api_key=api_key, base_url=base_url)
115
+ case "google":
116
+ return GoogleProvider(api_key=api_key, base_url=base_url)
117
+ case "mirascope":
118
+ return MirascopeProvider(api_key=api_key, base_url=base_url)
119
+ case "mlx": # pragma: no cover (MLX is only available on macOS)
120
+ return MLXProvider()
121
+ case "ollama":
122
+ return OllamaProvider(api_key=api_key, base_url=base_url)
123
+ case "openai":
124
+ return OpenAIProvider(api_key=api_key, base_url=base_url)
125
+ case "openai:completions":
126
+ return OpenAICompletionsProvider(api_key=api_key, base_url=base_url)
127
+ case "openai:responses":
128
+ return OpenAIResponsesProvider(api_key=api_key, base_url=base_url)
129
+ case "openrouter":
130
+ return OpenRouterProvider(api_key=api_key, base_url=base_url)
131
+ case "together":
132
+ return TogetherProvider(api_key=api_key, base_url=base_url)
133
+ case _: # pragma: no cover
134
+ raise ValueError(f"Unknown provider: '{provider_id}'")
135
+
136
+
137
+ @overload
138
+ def register_provider(
139
+ provider: Provider,
140
+ scope: str | list[str] | None = None,
141
+ ) -> Provider:
142
+ """Register a provider instance with scope(s).
143
+
144
+ Args:
145
+ provider: Provider instance to register.
146
+ scope: Scope string or list of scopes (e.g., "anthropic/", ["anthropic/", "openai/"]).
147
+ If None, uses the provider's default_scope.
148
+ """
149
+ ...
150
+
151
+
152
+ @overload
153
+ def register_provider(
154
+ provider: ProviderId,
155
+ scope: str | list[str] | None = None,
156
+ *,
157
+ api_key: str | None = None,
158
+ base_url: str | None = None,
159
+ ) -> Provider:
160
+ """Register a provider by ID with scope(s).
161
+
162
+ Args:
163
+ provider: Provider ID string (e.g., "anthropic", "openai").
164
+ scope: Scope string or list of scopes (e.g., "anthropic/", ["anthropic/", "openai/"]).
165
+ If None, uses the provider's default_scope.
166
+ api_key: API key for authentication.
167
+ base_url: Base URL for the API.
168
+ """
169
+ ...
170
+
171
+
172
+ def register_provider(
173
+ provider: ProviderId | Provider,
174
+ scope: str | list[str] | None = None,
175
+ *,
176
+ api_key: str | None = None,
177
+ base_url: str | None = None,
178
+ ) -> Provider:
179
+ """Register a provider with scope(s) in the global registry.
180
+
181
+ Scopes use prefix matching on model IDs:
182
+ - "anthropic/" matches "anthropic/*"
183
+ - "anthropic/claude-4-5" matches "anthropic/claude-4-5*"
184
+ - "anthropic/claude-4-5-sonnet" matches exactly "anthropic/claude-4-5-sonnet"
185
+
186
+ When multiple scopes match a model_id, the longest match wins.
187
+
188
+ Args:
189
+ provider: Either a provider ID string or a provider instance.
190
+ scope: Scope string or list of scopes for prefix matching on model IDs.
191
+ If None, uses the provider's default_scope attribute.
192
+ Can be a single string or a list of strings.
193
+ api_key: API key for authentication (only used if provider is a string).
194
+ base_url: Base URL for the API (only used if provider is a string).
195
+
196
+ Example:
197
+ ```python
198
+ # Register with default scope
199
+ llm.register_provider("anthropic", api_key="key")
200
+
201
+ # Register for specific models
202
+ llm.register_provider("openai", scope="openai/gpt-4")
203
+
204
+ # Register for multiple scopes
205
+ llm.register_provider("aws-bedrock", scope=["anthropic/", "openai/"])
206
+
207
+ # Register a custom instance
208
+ custom = llm.providers.AnthropicProvider(api_key="team-key")
209
+ llm.register_provider(custom, scope="anthropic/claude-4-5-sonnet")
210
+ ```
211
+ """
212
+
213
+ if isinstance(provider, str):
214
+ provider = provider_singleton(provider, api_key=api_key, base_url=base_url)
215
+
216
+ if scope is None:
217
+ scope = provider.default_scope
218
+
219
+ scopes = [scope] if isinstance(scope, str) else scope
220
+ for s in scopes:
221
+ PROVIDER_REGISTRY[s] = provider
222
+
223
+ return provider
224
+
225
+
226
+ def get_provider_for_model(model_id: str) -> Provider:
227
+ """Get the provider for a model_id based on the registry.
228
+
229
+ Uses longest prefix matching to find the most specific provider for the model.
230
+ If no explicit registration is found, checks for auto-registration defaults
231
+ and automatically registers the provider on first use.
232
+
233
+ When auto-registering, providers are tried in fallback order. For example,
234
+ if ANTHROPIC_API_KEY is not set but MIRASCOPE_API_KEY is, the Mirascope
235
+ Router will be used as a fallback for anthropic/ models.
236
+
237
+ Args:
238
+ model_id: The full model ID (e.g., "anthropic/claude-4-5-sonnet").
239
+
240
+ Returns:
241
+ The provider instance registered for this model.
242
+
243
+ Raises:
244
+ NoRegisteredProviderError: If no provider scope matches the model_id.
245
+ MissingAPIKeyError: If no provider in the fallback chain has its API key set.
246
+
247
+ Example:
248
+ ```python
249
+ # Assuming providers are registered:
250
+ # - "anthropic/" -> AnthropicProvider()
251
+ # - "anthropic/claude-4-5-sonnet" -> CustomProvider()
252
+
253
+ provider = get_provider_for_model("anthropic/claude-4-5-sonnet")
254
+ # Returns CustomProvider (longest match)
255
+
256
+ provider = get_provider_for_model("anthropic/claude-3-opus")
257
+ # Returns AnthropicProvider (matches "anthropic/" prefix)
258
+
259
+ # Auto-registration on first use:
260
+ provider = get_provider_for_model("openai/gpt-4")
261
+ # Automatically loads and registers OpenAIProvider() for "openai/"
262
+
263
+ # Fallback to Mirascope Router if direct key missing:
264
+ # (with MIRASCOPE_API_KEY set but not ANTHROPIC_API_KEY)
265
+ provider = get_provider_for_model("anthropic/claude-4-5-sonnet")
266
+ # Returns MirascopeProvider registered for "anthropic/" scope
267
+ ```
268
+ """
269
+ # Try explicit registry first (longest match wins)
270
+ matching_scopes = [
271
+ scope for scope in PROVIDER_REGISTRY if model_id.startswith(scope)
272
+ ]
273
+ if matching_scopes:
274
+ best_scope = max(matching_scopes, key=len)
275
+ return PROVIDER_REGISTRY[best_scope]
276
+
277
+ # Fall back to auto-registration with fallback chain
278
+ matching_defaults = [
279
+ scope for scope in DEFAULT_AUTO_REGISTER_SCOPES if model_id.startswith(scope)
280
+ ]
281
+ if matching_defaults:
282
+ best_scope = max(matching_defaults, key=len)
283
+ fallback_chain = DEFAULT_AUTO_REGISTER_SCOPES[best_scope]
284
+
285
+ # Try each provider in the fallback chain
286
+ for default in fallback_chain:
287
+ if _has_api_key(default):
288
+ provider = provider_singleton(default.provider_id)
289
+ # Register for just this scope (not all provider's default scopes)
290
+ PROVIDER_REGISTRY[best_scope] = provider
291
+ return provider
292
+
293
+ # No provider in chain has API key - raise helpful error
294
+ primary = fallback_chain[0]
295
+ has_mirascope_fallback = any(
296
+ d.provider_id == "mirascope" for d in fallback_chain
297
+ )
298
+ raise MissingAPIKeyError(
299
+ provider_id=primary.provider_id,
300
+ env_var=primary.api_key_env_var or "",
301
+ has_mirascope_fallback=has_mirascope_fallback,
302
+ )
303
+
304
+ # No matching scope at all
305
+ raise NoRegisteredProviderError(model_id)
@@ -0,0 +1,7 @@
1
+ """Together AI provider implementation."""
2
+
3
+ from .provider import TogetherProvider
4
+
5
+ __all__ = [
6
+ "TogetherProvider",
7
+ ]
@@ -0,0 +1,40 @@
1
+ """Together AI provider implementation."""
2
+
3
+ from typing import ClassVar
4
+
5
+ from ..openai.completions.base_provider import BaseOpenAICompletionsProvider
6
+
7
+
8
+ class TogetherProvider(BaseOpenAICompletionsProvider):
9
+ """Provider for Together AI's OpenAI-compatible API.
10
+
11
+ Inherits from BaseOpenAICompletionsProvider with Together-specific configuration:
12
+ - Uses Together AI's API endpoint
13
+ - Requires TOGETHER_API_KEY
14
+
15
+ Usage:
16
+ Register the provider with model ID prefixes you want to use:
17
+
18
+ ```python
19
+ import llm
20
+
21
+ # Register for meta-llama models
22
+ llm.register_provider("together", "meta-llama/")
23
+
24
+ # Now you can use meta-llama models directly
25
+ @llm.call("meta-llama/Llama-3.3-70B-Instruct-Turbo")
26
+ def my_prompt():
27
+ return [llm.messages.user("Hello!")]
28
+ ```
29
+ """
30
+
31
+ id: ClassVar[str] = "together"
32
+ default_scope: ClassVar[str | list[str]] = []
33
+ default_base_url: ClassVar[str | None] = "https://api.together.xyz/v1"
34
+ api_key_env_var: ClassVar[str] = "TOGETHER_API_KEY"
35
+ api_key_required: ClassVar[bool] = True
36
+ provider_name: ClassVar[str | None] = "Together"
37
+
38
+ def _model_name(self, model_id: str) -> str:
39
+ """Return the model ID as-is for Together API."""
40
+ return model_id
@@ -0,0 +1,66 @@
1
+ """The Responses module for LLM responses."""
2
+
3
+ from . import _utils
4
+ from .base_response import ResponseT
5
+ from .base_stream_response import (
6
+ AsyncChunkIterator,
7
+ ChunkIterator,
8
+ RawMessageChunk,
9
+ RawStreamEventChunk,
10
+ StreamResponseChunk,
11
+ StreamResponseT,
12
+ )
13
+ from .finish_reason import FinishReason, FinishReasonChunk
14
+ from .response import AsyncContextResponse, AsyncResponse, ContextResponse, Response
15
+ from .root_response import AnyResponse, RootResponse
16
+ from .stream_response import (
17
+ AsyncContextStreamResponse,
18
+ AsyncStreamResponse,
19
+ ContextStreamResponse,
20
+ StreamResponse,
21
+ )
22
+ from .streams import (
23
+ AsyncStream,
24
+ AsyncTextStream,
25
+ AsyncThoughtStream,
26
+ AsyncToolCallStream,
27
+ Stream,
28
+ TextStream,
29
+ ThoughtStream,
30
+ ToolCallStream,
31
+ )
32
+ from .usage import ProviderToolUsage, Usage, UsageDeltaChunk
33
+
34
+ __all__ = [
35
+ "AnyResponse",
36
+ "AsyncChunkIterator",
37
+ "AsyncContextResponse",
38
+ "AsyncContextStreamResponse",
39
+ "AsyncResponse",
40
+ "AsyncStream",
41
+ "AsyncStreamResponse",
42
+ "AsyncTextStream",
43
+ "AsyncThoughtStream",
44
+ "AsyncToolCallStream",
45
+ "ChunkIterator",
46
+ "ContextResponse",
47
+ "ContextStreamResponse",
48
+ "FinishReason",
49
+ "FinishReasonChunk",
50
+ "ProviderToolUsage",
51
+ "RawMessageChunk",
52
+ "RawStreamEventChunk",
53
+ "Response",
54
+ "ResponseT",
55
+ "RootResponse",
56
+ "Stream",
57
+ "StreamResponse",
58
+ "StreamResponseChunk",
59
+ "StreamResponseT",
60
+ "TextStream",
61
+ "ThoughtStream",
62
+ "ToolCallStream",
63
+ "Usage",
64
+ "UsageDeltaChunk",
65
+ "_utils",
66
+ ]
@@ -0,0 +1,146 @@
1
+ """Utilities for response classes."""
2
+
3
+ import json
4
+ from typing import cast
5
+
6
+ import jiter
7
+ from pydantic import BaseModel
8
+
9
+ from ..formatting import (
10
+ FormattableT,
11
+ Partial,
12
+ PrimitiveWrapperModel,
13
+ create_wrapper_model,
14
+ is_primitive_type,
15
+ )
16
+
17
+
18
+ def _strip_json_preamble(text: str) -> str | None:
19
+ """Strip preamble text before JSON content.
20
+
21
+ Handles cases where models output text before JSON like:
22
+ "Sure thing! Here's the JSON:\n{..."
23
+
24
+ Or cases where the model wraps the JSON in code blocks like:
25
+ "```json\n{..."
26
+
27
+ Args:
28
+ text: The raw text that may contain a JSON object
29
+
30
+ Returns:
31
+ Text starting from the opening `{`, or None if no `{` found.
32
+ """
33
+ code_block_start_marker = "```json"
34
+ code_block_start = text.find(code_block_start_marker)
35
+ if code_block_start > -1:
36
+ # Discard text prior to code block; it takes precedence over brackets that
37
+ # may be found before it.
38
+ text = text[code_block_start:]
39
+
40
+ json_start = text.find("{")
41
+ if json_start == -1:
42
+ return None
43
+
44
+ return text[json_start:]
45
+
46
+
47
+ def extract_serialized_json(text: str) -> str:
48
+ """Extract the serialized JSON string from text that may contain extra content.
49
+
50
+ Handles cases where models output text before JSON like:
51
+ "Sure thing! Here's the JSON:\n{...}"
52
+
53
+ Or cases where the model wraps the JSON in code blocks like:
54
+ "```json\n{...}\n```"
55
+
56
+ Args:
57
+ text: The raw text that may contain a JSON object
58
+
59
+ Raises:
60
+ json.JSONDecodeError: If no valid JSON object could be extracted.
61
+
62
+ Returns:
63
+ The extracted serialized JSON string
64
+ """
65
+ stripped = _strip_json_preamble(text)
66
+ if stripped is None:
67
+ raise json.JSONDecodeError("No JSON object found: missing '{'", text, 0)
68
+
69
+ # Find the matching closing brace
70
+ brace_count = 0
71
+ in_string = False
72
+ escaped = False
73
+
74
+ for i, char in enumerate(stripped):
75
+ if escaped:
76
+ escaped = False
77
+ continue
78
+
79
+ if char == "\\":
80
+ escaped = True
81
+ continue
82
+
83
+ if char == '"' and not escaped:
84
+ in_string = not in_string
85
+ continue
86
+
87
+ if not in_string:
88
+ if char == "{":
89
+ brace_count += 1
90
+ elif char == "}":
91
+ brace_count -= 1
92
+ if brace_count == 0:
93
+ return stripped[: i + 1]
94
+
95
+ raise json.JSONDecodeError("No JSON object found: missing '}'", text, len(text))
96
+
97
+
98
+ def parse_partial_json(
99
+ json_text: str, formattable: type[FormattableT]
100
+ ) -> FormattableT | Partial[FormattableT] | None:
101
+ """Parse incomplete JSON into a Partial model for structured streaming.
102
+
103
+ Uses jiter's partial mode to handle incomplete JSON gracefully.
104
+ Returns None if JSON cannot be parsed yet.
105
+
106
+ Handles cases where models output text before JSON like:
107
+ "Sure thing! Here's the JSON:\n{..."
108
+
109
+ Args:
110
+ json_text: The incomplete JSON string to parse
111
+ formattable: The target format type (BaseModel or PrimitiveType)
112
+
113
+ Returns:
114
+ Parsed partial object, or None if unparsable
115
+
116
+ Example:
117
+ >>> from pydantic import BaseModel
118
+ >>> class Book(BaseModel):
119
+ ... title: str
120
+ ... author: str
121
+ >>> parse_partial_json('{"title": "The Name"', Book)
122
+ PartialBook(title='The Name', author=None)
123
+ """
124
+ # Strip preamble text before JSON
125
+ stripped = _strip_json_preamble(json_text)
126
+ if stripped is None:
127
+ return None
128
+
129
+ try:
130
+ parsed = jiter.from_json(stripped.encode(), partial_mode="trailing-strings")
131
+ except Exception:
132
+ return None
133
+
134
+ target_model = formattable
135
+ if is_primitive_type(target_model):
136
+ target_model = cast(BaseModel, create_wrapper_model(target_model))
137
+
138
+ try:
139
+ instance = cast(BaseModel, Partial[target_model]).model_validate(parsed)
140
+ except Exception:
141
+ return None
142
+
143
+ if is_primitive_type(formattable):
144
+ return cast(PrimitiveWrapperModel, instance).output
145
+
146
+ return cast(Partial[FormattableT], instance)
@@ -0,0 +1,103 @@
1
+ """Shared base of Response and AsyncResponse."""
2
+
3
+ from collections.abc import Sequence
4
+ from typing import TYPE_CHECKING, Any, TypeVar
5
+
6
+ from ..content import Text, Thought, ToolCall
7
+ from ..formatting import Format, FormattableT
8
+ from ..messages import AssistantMessage, Message
9
+ from ..tools import FORMAT_TOOL_NAME, ToolkitT
10
+ from .finish_reason import FinishReason
11
+ from .root_response import RootResponse
12
+ from .usage import Usage
13
+
14
+ if TYPE_CHECKING:
15
+ from ..models import Params
16
+ from ..providers import ModelId, ProviderId
17
+
18
+ ResponseT = TypeVar("ResponseT", bound="BaseResponse[Any, Any]")
19
+
20
+
21
+ class BaseResponse(RootResponse[ToolkitT, FormattableT]):
22
+ """The response generated by an LLM."""
23
+
24
+ def __init__(
25
+ self,
26
+ *,
27
+ raw: Any, # noqa: ANN401
28
+ provider_id: "ProviderId",
29
+ model_id: "ModelId",
30
+ provider_model_name: str,
31
+ params: "Params",
32
+ toolkit: ToolkitT,
33
+ format: Format[FormattableT] | None = None,
34
+ input_messages: Sequence[Message],
35
+ assistant_message: AssistantMessage,
36
+ finish_reason: FinishReason | None,
37
+ usage: Usage | None,
38
+ ) -> None:
39
+ """Initialize a Response.
40
+
41
+ Args:
42
+ raw: The raw response from the LLM.
43
+ provider: The provider name (e.g. "anthropic", "openai").
44
+ model_id: The model identifier that generated the response.
45
+ provider_model_name: Optional provider-specific model name. May include
46
+ provider-specific additional info (like api mode in "gpt-5:responses").
47
+ params: The params used to generate the response (or None).
48
+ toolkit: Toolkit containing all the tools used to generate the response.
49
+ format: The `Format` for the expected structured output format (or None).
50
+ input_messages: The message history before the final assistant message.
51
+ assistant_message: The final assistant message containing the response content.
52
+ finish_reason: The reason why the LLM finished generating a response.
53
+ usage: Token usage statistics for the response.
54
+ """
55
+ self.raw = raw
56
+ self.provider_id = provider_id
57
+ self.model_id = model_id
58
+ self.provider_model_name = provider_model_name
59
+ self.params = params
60
+ self.toolkit = toolkit
61
+ self.finish_reason = finish_reason
62
+ self.usage = usage
63
+ self.format = format
64
+
65
+ # Process content in the assistant message, organizing it by type and
66
+ # transforming ToolCalls to the special format tool into text (as calls to the
67
+ # formatting tool are not "real" tool calls, and response.parse() expects to
68
+ # operate on text content).
69
+ self.texts = []
70
+ self.tool_calls = []
71
+ self.thoughts = []
72
+ self.content = []
73
+ found_format_tool = False
74
+
75
+ for part in assistant_message.content:
76
+ if isinstance(part, ToolCall) and part.name.startswith(FORMAT_TOOL_NAME):
77
+ part = Text(text=part.args)
78
+ found_format_tool = True
79
+
80
+ self.content.append(part)
81
+ if isinstance(part, Text):
82
+ self.texts.append(part)
83
+ elif isinstance(part, ToolCall):
84
+ self.tool_calls.append(part)
85
+ elif isinstance(part, Thought):
86
+ self.thoughts.append(part)
87
+ else:
88
+ raise NotImplementedError
89
+
90
+ if found_format_tool:
91
+ # We create a new assistant message if we found a formatting ToolCall
92
+ # since this indicates we've transformed the content from the original
93
+ # NOTE: we copy over the assistant message `name` field, although in
94
+ # practice we don't know of any providers that set the name themselves.
95
+ assistant_message = AssistantMessage(
96
+ content=self.content,
97
+ name=assistant_message.name,
98
+ provider_id=assistant_message.provider_id,
99
+ model_id=assistant_message.model_id,
100
+ provider_model_name=assistant_message.provider_model_name,
101
+ raw_message=assistant_message.raw_message,
102
+ )
103
+ self.messages = list(input_messages) + [assistant_message]