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,184 @@
1
+ """The `llm.tool` decorator for turning functions into tools."""
2
+
3
+ from dataclasses import dataclass
4
+ from typing import overload
5
+
6
+ from ..context import DepsT
7
+ from ..types import JsonableCovariantT, P
8
+ from . import _utils as _tool_utils
9
+ from .protocols import AsyncContextToolFn, AsyncToolFn, ContextToolFn, ToolFn
10
+ from .tools import AsyncContextTool, AsyncTool, ContextTool, Tool
11
+
12
+
13
+ @dataclass(kw_only=True)
14
+ class ToolDecorator:
15
+ """Protocol for the tool decorator."""
16
+
17
+ strict: bool | None = None
18
+ """Whether to use strict tool calling, if supported by the provider.
19
+
20
+ If set to None, then it will use the provider's default setting (usually the
21
+ strictest possible).
22
+ """
23
+
24
+ @overload
25
+ def __call__( # pyright:ignore[reportOverlappingOverload]
26
+ self, fn: ContextToolFn[DepsT, P, JsonableCovariantT]
27
+ ) -> ContextTool[DepsT, JsonableCovariantT, P]:
28
+ """Call the decorator with a context function."""
29
+ ...
30
+
31
+ @overload
32
+ def __call__( # pyright:ignore[reportOverlappingOverload]
33
+ self, fn: AsyncContextToolFn[DepsT, P, JsonableCovariantT]
34
+ ) -> AsyncContextTool[DepsT, JsonableCovariantT, P]:
35
+ """Call the decorator with an async context function."""
36
+ ...
37
+
38
+ @overload
39
+ def __call__(
40
+ self, fn: ToolFn[P, JsonableCovariantT]
41
+ ) -> Tool[P, JsonableCovariantT]:
42
+ """Call the decorator with a sync function."""
43
+ ...
44
+
45
+ @overload
46
+ def __call__(
47
+ self, fn: AsyncToolFn[P, JsonableCovariantT]
48
+ ) -> AsyncTool[P, JsonableCovariantT]:
49
+ """Call the decorator with an async function."""
50
+ ...
51
+
52
+ def __call__(
53
+ self,
54
+ fn: ContextToolFn[DepsT, P, JsonableCovariantT]
55
+ | AsyncContextToolFn[DepsT, P, JsonableCovariantT]
56
+ | ToolFn[P, JsonableCovariantT]
57
+ | AsyncToolFn[P, JsonableCovariantT],
58
+ ) -> (
59
+ ContextTool[DepsT, JsonableCovariantT, P]
60
+ | AsyncContextTool[DepsT, JsonableCovariantT, P]
61
+ | Tool[P, JsonableCovariantT]
62
+ | AsyncTool[P, JsonableCovariantT]
63
+ ):
64
+ """Call the decorator with a function."""
65
+ is_context = _tool_utils.is_context_tool_fn(fn)
66
+ is_async = _tool_utils.is_async_tool_fn(fn)
67
+
68
+ if is_context and is_async:
69
+ return AsyncContextTool[DepsT, JsonableCovariantT, P].from_function(
70
+ fn, strict=self.strict
71
+ )
72
+ elif is_context:
73
+ return ContextTool[DepsT, JsonableCovariantT, P].from_function(
74
+ fn, strict=self.strict
75
+ )
76
+ elif is_async:
77
+ return AsyncTool[P, JsonableCovariantT].from_function(
78
+ fn, strict=self.strict
79
+ )
80
+ else:
81
+ return Tool[P, JsonableCovariantT].from_function(fn, strict=self.strict)
82
+
83
+
84
+ @overload
85
+ def tool( # pyright:ignore[reportOverlappingOverload]
86
+ __fn: AsyncContextToolFn[DepsT, P, JsonableCovariantT],
87
+ ) -> AsyncContextTool[DepsT, JsonableCovariantT, P]:
88
+ """Overload for async context tool functions."""
89
+ ...
90
+
91
+
92
+ @overload
93
+ def tool( # pyright:ignore[reportOverlappingOverload]
94
+ __fn: ContextToolFn[DepsT, P, JsonableCovariantT],
95
+ ) -> ContextTool[DepsT, JsonableCovariantT, P]:
96
+ """Overload for context tool functions."""
97
+ ...
98
+
99
+
100
+ @overload
101
+ def tool(__fn: AsyncToolFn[P, JsonableCovariantT]) -> AsyncTool[P, JsonableCovariantT]:
102
+ """Overload for regular async tool functions."""
103
+ ...
104
+
105
+
106
+ @overload
107
+ def tool(__fn: ToolFn[P, JsonableCovariantT]) -> Tool[P, JsonableCovariantT]:
108
+ """Overload for regular sync tool functions."""
109
+ ...
110
+
111
+
112
+ @overload
113
+ def tool(*, strict: bool | None = None) -> ToolDecorator:
114
+ """Overload for setting non-default arguments."""
115
+ ...
116
+
117
+
118
+ def tool(
119
+ __fn: ContextToolFn[DepsT, P, JsonableCovariantT]
120
+ | AsyncContextToolFn[DepsT, P, JsonableCovariantT]
121
+ | ToolFn[P, JsonableCovariantT]
122
+ | AsyncToolFn[P, JsonableCovariantT]
123
+ | None = None,
124
+ *,
125
+ strict: bool | None = None,
126
+ ) -> (
127
+ ContextTool[DepsT, JsonableCovariantT, P]
128
+ | AsyncContextTool[DepsT, JsonableCovariantT, P]
129
+ | Tool[P, JsonableCovariantT]
130
+ | AsyncTool[P, JsonableCovariantT]
131
+ | ToolDecorator
132
+ ):
133
+ '''Decorator that turns a function into a tool definition.
134
+
135
+ This decorator creates a `Tool` or `ContextTool` that can be used with `llm.call`.
136
+ The function's name, docstring, and type hints are used to generate the
137
+ tool's metadata.
138
+
139
+ If the first parameter is named 'ctx' or typed as `llm.Context[T]`, it creates
140
+ a ContextTool. Otherwise, it creates a regular Tool.
141
+
142
+ Args:
143
+ strict: Whether the tool should use strict mode when supported by the model.
144
+ If None, uses provider's default (usually as strict as possible).
145
+
146
+ Returns:
147
+ A decorator function that converts the function into a Tool or ContextTool.
148
+
149
+ Examples:
150
+
151
+ Regular tool:
152
+ ```python
153
+ from mirascope import llm
154
+
155
+ @llm.tool
156
+ def available_books() -> list[str]:
157
+ """Returns the list of available books."""
158
+ return ["The Name of the Wind"]
159
+ ```
160
+
161
+ Context tool:
162
+ ```python
163
+ from dataclasses import dataclass
164
+
165
+ from mirascope import llm
166
+
167
+
168
+ @dataclass
169
+ class Library:
170
+ books: list[str]
171
+
172
+
173
+ library = Library(books=["Mistborn", "Gödel, Escher, Bach", "Dune"])
174
+
175
+ @llm.tool
176
+ def available_books(ctx: llm.Context[Library]) -> list[str]:
177
+ """Returns the list of available books."""
178
+ return ctx.deps.books
179
+ ```
180
+ '''
181
+ decorator = ToolDecorator(strict=strict)
182
+ if __fn is None:
183
+ return decorator
184
+ return decorator(__fn)
@@ -0,0 +1,96 @@
1
+ from typing import Any, Protocol
2
+
3
+ from ..context import Context, DepsT
4
+ from ..types import JsonableCovariantT, P
5
+
6
+
7
+ class ToolFn(Protocol[P, JsonableCovariantT]):
8
+ """Protocol for the tool function."""
9
+
10
+ __name__: str
11
+ """The name of the tool."""
12
+
13
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> JsonableCovariantT:
14
+ """Call the function with the given arguments."""
15
+ raise NotImplementedError()
16
+
17
+
18
+ class AsyncToolFn(Protocol[P, JsonableCovariantT]):
19
+ """Protocol for the async tool function."""
20
+
21
+ __name__: str
22
+ """The name of the tool."""
23
+
24
+ async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> JsonableCovariantT:
25
+ """Call the function with the given arguments."""
26
+ raise NotImplementedError()
27
+
28
+
29
+ class ContextToolFn(Protocol[DepsT, P, JsonableCovariantT]):
30
+ """Protocol for the context tool function."""
31
+
32
+ __name__: str
33
+ """The name of the tool."""
34
+
35
+ def __call__(
36
+ self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
37
+ ) -> JsonableCovariantT:
38
+ """Call the function with the given arguments."""
39
+ raise NotImplementedError()
40
+
41
+
42
+ class AsyncContextToolFn(Protocol[DepsT, P, JsonableCovariantT]):
43
+ """Protocol for the async context tool function."""
44
+
45
+ __name__: str
46
+ """The name of the tool."""
47
+
48
+ async def __call__(
49
+ self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
50
+ ) -> JsonableCovariantT:
51
+ """Call the function with the given arguments."""
52
+ raise NotImplementedError()
53
+
54
+
55
+ class KwargsCallable(Protocol[JsonableCovariantT]):
56
+ """Protocol for functions that can be called with `Any`-typed kwargs.
57
+
58
+ Used internally to type-cast tool functions for compatibility with
59
+ json.loads() output when executing tool calls.
60
+ """
61
+
62
+ def __call__(self, **kwargs: dict[str, Any]) -> JsonableCovariantT: ...
63
+
64
+
65
+ class AsyncKwargsCallable(Protocol[JsonableCovariantT]):
66
+ """Protocol for async functions that can be called with `Any`-typed kwargs.
67
+
68
+ Used internally to type-cast async tool functions for compatibility with
69
+ json.loads() output when executing tool calls.
70
+ """
71
+
72
+ async def __call__(self, **kwargs: dict[str, Any]) -> JsonableCovariantT: ...
73
+
74
+
75
+ class ContextKwargsCallable(Protocol[DepsT, JsonableCovariantT]):
76
+ """Protocol for context functions that can be called with `Any`-typed kwargs.
77
+
78
+ Used internally to type-cast context tool functions for compatibility with
79
+ json.loads() output when executing tool calls.
80
+ """
81
+
82
+ def __call__(
83
+ self, ctx: Context[DepsT], **kwargs: dict[str, Any]
84
+ ) -> JsonableCovariantT: ...
85
+
86
+
87
+ class AsyncJsonKwargsCallable(Protocol[DepsT, JsonableCovariantT]):
88
+ """Protocol for async context functions that can be called with `Any`-typed kwargs.
89
+
90
+ Used internally to type-cast async context tool functions for compatibility with
91
+ json.loads() output when executing tool calls.
92
+ """
93
+
94
+ async def __call__(
95
+ self, ctx: Context[DepsT], **kwargs: dict[str, Any]
96
+ ) -> JsonableCovariantT: ...
@@ -0,0 +1,18 @@
1
+ """Base class for provider-native tools."""
2
+
3
+ from dataclasses import dataclass
4
+
5
+
6
+ @dataclass(frozen=True)
7
+ class ProviderTool:
8
+ """Base class for tools executed natively by providers.
9
+
10
+ Unlike regular tools which define functions that you execute locally,
11
+ provider tools are capabilities built into the provider's API.
12
+ The provider handles execution entirely server-side.
13
+
14
+ Provider tools have no sync/async distinction since they are not
15
+ executed by your code - they are configuration passed to the provider.
16
+ """
17
+
18
+ name: str
@@ -0,0 +1,321 @@
1
+ """The `ToolSchema` class for defining tools that LLMs can request be called."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import inspect
6
+ from dataclasses import dataclass
7
+ from typing import (
8
+ Annotated,
9
+ Any,
10
+ Generic,
11
+ NamedTuple,
12
+ TypeAlias,
13
+ TypedDict,
14
+ TypeVar,
15
+ cast,
16
+ get_args,
17
+ get_origin,
18
+ get_type_hints,
19
+ )
20
+
21
+ from docstring_parser import parse
22
+ from pydantic import BaseModel, Field, create_model
23
+ from pydantic.fields import FieldInfo
24
+
25
+ from ..._utils import copy_function_metadata
26
+ from ..content import ToolCall
27
+ from ..types import Jsonable
28
+ from .protocols import AsyncContextToolFn, AsyncToolFn, ContextToolFn, ToolFn
29
+
30
+ AnyToolFn: TypeAlias = (
31
+ ToolFn[..., Jsonable]
32
+ | AsyncToolFn[..., Jsonable]
33
+ | ContextToolFn[Any, ..., Jsonable]
34
+ | AsyncContextToolFn[Any, ..., Jsonable]
35
+ )
36
+
37
+ ToolFnT = TypeVar(
38
+ "ToolFnT",
39
+ bound=AnyToolFn,
40
+ covariant=True,
41
+ )
42
+
43
+ ToolSchemaT = TypeVar("ToolSchemaT", bound="ToolSchema[AnyToolFn]", covariant=True)
44
+
45
+
46
+ ModelJsonSchema = TypedDict(
47
+ "ModelJsonSchema",
48
+ {
49
+ "properties": dict[str, dict[str, Any]],
50
+ "required": list[str],
51
+ "$defs": dict[str, dict[str, Any]],
52
+ },
53
+ total=False,
54
+ )
55
+ """Type for Pydantic's model_json_schema() output.
56
+
57
+ This TypedDict defines the structure of JSON schemas returned by Pydantic models,
58
+ allowing us to avoid type casts when extracting schema components.
59
+ """
60
+
61
+
62
+ class DocstringArg(NamedTuple):
63
+ """A parameter from a docstring."""
64
+
65
+ name: str
66
+ description: str
67
+
68
+
69
+ FORMAT_TOOL_NAME = "__mirascope_formatted_output_tool__"
70
+ """Reserved name of the formatted output tool.
71
+
72
+ Any call to a tool with this name is NOT considered a regular tool call, but will instead
73
+ be converted into textual output containing the arguments to the tool call.
74
+ """
75
+ # TODO: Investigate whether using this hardcoded tool name has any adverse impact
76
+ # on model performance, compared to a tool name that references the name of the formatted
77
+ # class.
78
+
79
+
80
+ @dataclass
81
+ class ParsedDocstring:
82
+ args: list[DocstringArg]
83
+
84
+
85
+ def _parse_docstring_params(docstring: str | None) -> ParsedDocstring:
86
+ """Parse parameter descriptions from a docstring.
87
+
88
+ Uses docstring-parser library which supports ReST, Google, Numpydoc-style and
89
+ Epydoc docstrings
90
+
91
+ Args:
92
+ docstring: The function's docstring
93
+
94
+ Returns:
95
+ ParsedDocstring containing parameter descriptions
96
+ """
97
+ if not docstring:
98
+ return ParsedDocstring(args=[])
99
+
100
+ parsed = parse(docstring)
101
+ args: list[DocstringArg] = []
102
+
103
+ for param in parsed.params:
104
+ if param.description:
105
+ args.append(
106
+ DocstringArg(name=param.arg_name, description=param.description)
107
+ )
108
+
109
+ return ParsedDocstring(args=args)
110
+
111
+
112
+ class ToolParameterSchema(BaseModel):
113
+ """JSON Schema for tool parameters (always an object with properties).
114
+
115
+ This contains real JSON Schema as generated by Pydantic, with full support
116
+ for complex schemas like anyOf, nested objects, validation constraints, etc.
117
+ Including $defs for complex type references.
118
+ """
119
+
120
+ properties: dict[str, dict[str, Any]] = Field(default_factory=dict)
121
+ """Dictionary mapping parameter names to their JSON Schema definitions."""
122
+
123
+ required: list[str] = Field(default_factory=list)
124
+ """List of required parameter names."""
125
+
126
+ additionalProperties: bool = False
127
+ """Whether additional properties beyond those defined are allowed."""
128
+
129
+ defs: dict[str, dict[str, Any]] | None = Field(default=None, alias="$defs")
130
+ """JSON Schema definitions for complex types referenced via $ref."""
131
+
132
+
133
+ @dataclass
134
+ class ToolSchema(Generic[ToolFnT]):
135
+ """Underlying schema defining a tool that can be used by LLMs.
136
+
137
+ A ToolSchema represents a function that can be called by an LLM during a call.
138
+ It includes metadata like name, description, and parameter schema.
139
+
140
+ This class is not instantiated directly but created by the `@tool()` decorator.
141
+ """
142
+
143
+ fn: ToolFnT
144
+ """The function that implements the tool's functionality."""
145
+
146
+ name: str
147
+ """The name of the tool, used by the LLM to identify which tool to call."""
148
+
149
+ description: str
150
+ """Description of what the tool does, extracted from the function's docstring."""
151
+
152
+ parameters: ToolParameterSchema
153
+ """JSON Schema describing the parameters accepted by the tool.
154
+
155
+ The serialized parameters table is cached for efficient hash lookups (e.g. when
156
+ caching provider-encoded tool representations in a LRU cache). Therefore,
157
+ it should **not be modified** after the ToolSchema is created.
158
+ """
159
+
160
+ strict: bool | None
161
+ """Whether the tool should use strict mode when supported by the model.
162
+
163
+ If set to None, will use the provider's default setting (usually as strict as
164
+ possible).
165
+ """
166
+
167
+ __name__: str
168
+ """The name of the underlying function (preserved for decorator stacking)."""
169
+
170
+ def __hash__(self) -> int:
171
+ if not hasattr(self, "_hash"):
172
+ self._hash = hash(
173
+ (
174
+ self.name,
175
+ self.description,
176
+ self.strict,
177
+ self.parameters.model_dump_json(),
178
+ )
179
+ )
180
+ return self._hash
181
+
182
+ def __init__(
183
+ self,
184
+ fn: ToolFnT,
185
+ name: str,
186
+ description: str,
187
+ parameters: ToolParameterSchema,
188
+ *,
189
+ strict: bool | None = None,
190
+ ) -> None:
191
+ """Create a `ToolSchema` with the provided values.
192
+
193
+ Args:
194
+ fn: The function that implements the tool's functionality
195
+ name: The name of the tool
196
+ description: Description of what the tool does
197
+ parameters: JSON Schema describing the parameters accepted by the tool
198
+ strict: Whether the tool should use strict mode when supported.
199
+ If None, uses provider's default (usually as strict as possible).
200
+ """
201
+ self.fn = fn
202
+ self.name = name
203
+ self.description = description
204
+ self.parameters = parameters
205
+ self.strict = strict
206
+ copy_function_metadata(self, fn)
207
+
208
+ @classmethod
209
+ def from_function(
210
+ cls,
211
+ fn: AnyToolFn,
212
+ *,
213
+ strict: bool | None = None,
214
+ is_context_tool: bool = False,
215
+ ) -> ToolSchema[AnyToolFn]:
216
+ """Create a `ToolSchema` by inspecting a function and its docstring.
217
+
218
+ Uses Pydantic's create_model to dynamically build a model from the function
219
+ signature, then extracts the JSON schema from it. This leverages Pydantic's
220
+ robust type conversion and union handling.
221
+
222
+ Args:
223
+ fn: The function to extract schema from
224
+ strict: Whether the tool should use strict mode when supported.
225
+ If None, uses provider's default (usually as strict as possible).
226
+ is_context_tool: Whether this is a context tool (skips the context parameter)
227
+
228
+ Returns:
229
+ a `ToolSchema` representing the function
230
+
231
+ Raises:
232
+ ValueError: If the tool has a reserved name.
233
+ """
234
+ name = fn.__name__
235
+ if name.startswith(FORMAT_TOOL_NAME):
236
+ raise ValueError(
237
+ f"Cannot use reserved name {FORMAT_TOOL_NAME} as tool name."
238
+ )
239
+ description = inspect.cleandoc(fn.__doc__) if fn.__doc__ else name
240
+
241
+ param_descriptions = _parse_docstring_params(fn.__doc__)
242
+
243
+ field_definitions: dict[str, tuple[Any, Any]] = {}
244
+ hints = get_type_hints(fn, include_extras=True)
245
+
246
+ context_param_skipped = False
247
+ for param in inspect.signature(fn).parameters.values():
248
+ # Skip args that are provided by Python or Mirascope, not LLM-generated.
249
+ # TODO: Handling of FromCallArgs
250
+ if param.name in ("self", "cls"):
251
+ continue
252
+
253
+ # For context tools, skip the first non-self/cls parameter (the context parameter)
254
+ if is_context_tool and not context_param_skipped:
255
+ context_param_skipped = True
256
+ continue
257
+
258
+ param_type = hints.get(param.name, Any)
259
+ default = ... if param.default is inspect.Parameter.empty else param.default
260
+ field_info = None
261
+
262
+ if get_origin(param_type) is Annotated:
263
+ args = get_args(param_type)
264
+ param_type = args[0]
265
+ for annotation in args[1:]:
266
+ if isinstance(annotation, FieldInfo):
267
+ field_info = annotation
268
+ break
269
+
270
+ if field_info is not None:
271
+ field_value = Field(
272
+ default=default,
273
+ description=field_info.description,
274
+ )
275
+ else:
276
+ docstring_description: str | None = None
277
+ for arg in param_descriptions.args:
278
+ if arg.name == param.name:
279
+ docstring_description = arg.description
280
+ break
281
+ if docstring_description:
282
+ field_value = Field(
283
+ default=default, description=docstring_description
284
+ )
285
+ else:
286
+ field_value = default
287
+
288
+ field_definitions[param.name] = (param_type, field_value)
289
+
290
+ TempModel = create_model("TempModel", **cast(dict[str, Any], field_definitions))
291
+
292
+ schema = cast(ModelJsonSchema, TempModel.model_json_schema())
293
+
294
+ parameters = ToolParameterSchema(
295
+ properties=schema.get("properties", {}),
296
+ required=schema.get("required", []),
297
+ additionalProperties=False,
298
+ )
299
+ if "$defs" in schema:
300
+ parameters.defs = schema["$defs"]
301
+
302
+ return cls(
303
+ fn=cast(ToolFnT, fn),
304
+ name=name,
305
+ description=description,
306
+ parameters=parameters,
307
+ strict=strict,
308
+ )
309
+
310
+ def can_execute(self, tool_call: ToolCall) -> bool:
311
+ """Check if a `ToolCall` can be executed by tools with this `ToolSchema`.
312
+
313
+ This method is a convenient way to determine if a `ToolCall` is likely intended
314
+ to be executed by a tool with this `ToolSchema`. It does so by checking
315
+ whether the name on the call matches the name on the schema. No other validation
316
+ is performed.
317
+ """
318
+ return tool_call.name == self.name
319
+
320
+
321
+ AnyToolSchema: TypeAlias = ToolSchema[AnyToolFn]