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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (632) hide show
  1. mirascope/__init__.py +6 -6
  2. mirascope/_stubs.py +384 -0
  3. mirascope/_utils.py +34 -0
  4. mirascope/api/__init__.py +14 -0
  5. mirascope/api/_generated/README.md +207 -0
  6. mirascope/api/_generated/__init__.py +444 -0
  7. mirascope/api/_generated/annotations/__init__.py +33 -0
  8. mirascope/api/_generated/annotations/client.py +506 -0
  9. mirascope/api/_generated/annotations/raw_client.py +1414 -0
  10. mirascope/api/_generated/annotations/types/__init__.py +31 -0
  11. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +5 -0
  12. mirascope/api/_generated/annotations/types/annotations_create_response.py +48 -0
  13. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +5 -0
  14. mirascope/api/_generated/annotations/types/annotations_get_response.py +48 -0
  15. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +5 -0
  16. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +5 -0
  17. mirascope/api/_generated/annotations/types/annotations_list_response.py +21 -0
  18. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +50 -0
  19. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +5 -0
  20. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +5 -0
  21. mirascope/api/_generated/annotations/types/annotations_update_response.py +48 -0
  22. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +5 -0
  23. mirascope/api/_generated/api_keys/__init__.py +17 -0
  24. mirascope/api/_generated/api_keys/client.py +530 -0
  25. mirascope/api/_generated/api_keys/raw_client.py +1236 -0
  26. mirascope/api/_generated/api_keys/types/__init__.py +15 -0
  27. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +28 -0
  28. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +27 -0
  29. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +40 -0
  30. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +27 -0
  31. mirascope/api/_generated/client.py +211 -0
  32. mirascope/api/_generated/core/__init__.py +52 -0
  33. mirascope/api/_generated/core/api_error.py +23 -0
  34. mirascope/api/_generated/core/client_wrapper.py +46 -0
  35. mirascope/api/_generated/core/datetime_utils.py +28 -0
  36. mirascope/api/_generated/core/file.py +67 -0
  37. mirascope/api/_generated/core/force_multipart.py +16 -0
  38. mirascope/api/_generated/core/http_client.py +543 -0
  39. mirascope/api/_generated/core/http_response.py +55 -0
  40. mirascope/api/_generated/core/jsonable_encoder.py +100 -0
  41. mirascope/api/_generated/core/pydantic_utilities.py +255 -0
  42. mirascope/api/_generated/core/query_encoder.py +58 -0
  43. mirascope/api/_generated/core/remove_none_from_dict.py +11 -0
  44. mirascope/api/_generated/core/request_options.py +35 -0
  45. mirascope/api/_generated/core/serialization.py +276 -0
  46. mirascope/api/_generated/docs/__init__.py +4 -0
  47. mirascope/api/_generated/docs/client.py +91 -0
  48. mirascope/api/_generated/docs/raw_client.py +178 -0
  49. mirascope/api/_generated/environment.py +9 -0
  50. mirascope/api/_generated/environments/__init__.py +23 -0
  51. mirascope/api/_generated/environments/client.py +649 -0
  52. mirascope/api/_generated/environments/raw_client.py +1567 -0
  53. mirascope/api/_generated/environments/types/__init__.py +25 -0
  54. mirascope/api/_generated/environments/types/environments_create_response.py +24 -0
  55. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +60 -0
  56. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +24 -0
  57. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +22 -0
  58. mirascope/api/_generated/environments/types/environments_get_response.py +24 -0
  59. mirascope/api/_generated/environments/types/environments_list_response_item.py +24 -0
  60. mirascope/api/_generated/environments/types/environments_update_response.py +24 -0
  61. mirascope/api/_generated/errors/__init__.py +25 -0
  62. mirascope/api/_generated/errors/bad_request_error.py +14 -0
  63. mirascope/api/_generated/errors/conflict_error.py +14 -0
  64. mirascope/api/_generated/errors/forbidden_error.py +11 -0
  65. mirascope/api/_generated/errors/internal_server_error.py +10 -0
  66. mirascope/api/_generated/errors/not_found_error.py +11 -0
  67. mirascope/api/_generated/errors/payment_required_error.py +15 -0
  68. mirascope/api/_generated/errors/service_unavailable_error.py +14 -0
  69. mirascope/api/_generated/errors/too_many_requests_error.py +15 -0
  70. mirascope/api/_generated/errors/unauthorized_error.py +11 -0
  71. mirascope/api/_generated/functions/__init__.py +39 -0
  72. mirascope/api/_generated/functions/client.py +647 -0
  73. mirascope/api/_generated/functions/raw_client.py +1890 -0
  74. mirascope/api/_generated/functions/types/__init__.py +53 -0
  75. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +20 -0
  76. mirascope/api/_generated/functions/types/functions_create_response.py +37 -0
  77. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +20 -0
  78. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +39 -0
  79. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +20 -0
  80. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +53 -0
  81. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +22 -0
  82. mirascope/api/_generated/functions/types/functions_get_response.py +37 -0
  83. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +20 -0
  84. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +25 -0
  85. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +56 -0
  86. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +22 -0
  87. mirascope/api/_generated/functions/types/functions_list_response.py +21 -0
  88. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +41 -0
  89. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +20 -0
  90. mirascope/api/_generated/health/__init__.py +7 -0
  91. mirascope/api/_generated/health/client.py +92 -0
  92. mirascope/api/_generated/health/raw_client.py +175 -0
  93. mirascope/api/_generated/health/types/__init__.py +8 -0
  94. mirascope/api/_generated/health/types/health_check_response.py +22 -0
  95. mirascope/api/_generated/health/types/health_check_response_status.py +5 -0
  96. mirascope/api/_generated/organization_invitations/__init__.py +33 -0
  97. mirascope/api/_generated/organization_invitations/client.py +546 -0
  98. mirascope/api/_generated/organization_invitations/raw_client.py +1519 -0
  99. mirascope/api/_generated/organization_invitations/types/__init__.py +53 -0
  100. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +34 -0
  101. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +7 -0
  102. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +7 -0
  103. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +48 -0
  104. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +7 -0
  105. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +7 -0
  106. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +48 -0
  107. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +7 -0
  108. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +7 -0
  109. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +48 -0
  110. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +7 -0
  111. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +7 -0
  112. mirascope/api/_generated/organization_memberships/__init__.py +19 -0
  113. mirascope/api/_generated/organization_memberships/client.py +302 -0
  114. mirascope/api/_generated/organization_memberships/raw_client.py +736 -0
  115. mirascope/api/_generated/organization_memberships/types/__init__.py +27 -0
  116. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +33 -0
  117. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +7 -0
  118. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +7 -0
  119. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +31 -0
  120. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +7 -0
  121. mirascope/api/_generated/organizations/__init__.py +51 -0
  122. mirascope/api/_generated/organizations/client.py +869 -0
  123. mirascope/api/_generated/organizations/raw_client.py +2593 -0
  124. mirascope/api/_generated/organizations/types/__init__.py +71 -0
  125. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +24 -0
  126. mirascope/api/_generated/organizations/types/organizations_create_response.py +26 -0
  127. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +5 -0
  128. mirascope/api/_generated/organizations/types/organizations_get_response.py +26 -0
  129. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +5 -0
  130. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +26 -0
  131. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +5 -0
  132. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +7 -0
  133. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +47 -0
  134. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +33 -0
  135. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +7 -0
  136. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +24 -0
  137. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +53 -0
  138. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +7 -0
  139. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +26 -0
  140. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +34 -0
  141. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +7 -0
  142. mirascope/api/_generated/organizations/types/organizations_update_response.py +26 -0
  143. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +5 -0
  144. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +7 -0
  145. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +35 -0
  146. mirascope/api/_generated/project_memberships/__init__.py +29 -0
  147. mirascope/api/_generated/project_memberships/client.py +528 -0
  148. mirascope/api/_generated/project_memberships/raw_client.py +1278 -0
  149. mirascope/api/_generated/project_memberships/types/__init__.py +33 -0
  150. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +7 -0
  151. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +35 -0
  152. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +7 -0
  153. mirascope/api/_generated/project_memberships/types/project_memberships_get_response.py +33 -0
  154. mirascope/api/_generated/project_memberships/types/project_memberships_get_response_role.py +7 -0
  155. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +33 -0
  156. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +7 -0
  157. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +7 -0
  158. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +35 -0
  159. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +7 -0
  160. mirascope/api/_generated/projects/__init__.py +7 -0
  161. mirascope/api/_generated/projects/client.py +428 -0
  162. mirascope/api/_generated/projects/raw_client.py +1302 -0
  163. mirascope/api/_generated/projects/types/__init__.py +10 -0
  164. mirascope/api/_generated/projects/types/projects_create_response.py +25 -0
  165. mirascope/api/_generated/projects/types/projects_get_response.py +25 -0
  166. mirascope/api/_generated/projects/types/projects_list_response_item.py +25 -0
  167. mirascope/api/_generated/projects/types/projects_update_response.py +25 -0
  168. mirascope/api/_generated/reference.md +4987 -0
  169. mirascope/api/_generated/tags/__init__.py +19 -0
  170. mirascope/api/_generated/tags/client.py +504 -0
  171. mirascope/api/_generated/tags/raw_client.py +1288 -0
  172. mirascope/api/_generated/tags/types/__init__.py +17 -0
  173. mirascope/api/_generated/tags/types/tags_create_response.py +41 -0
  174. mirascope/api/_generated/tags/types/tags_get_response.py +41 -0
  175. mirascope/api/_generated/tags/types/tags_list_response.py +23 -0
  176. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +41 -0
  177. mirascope/api/_generated/tags/types/tags_update_response.py +41 -0
  178. mirascope/api/_generated/token_cost/__init__.py +7 -0
  179. mirascope/api/_generated/token_cost/client.py +160 -0
  180. mirascope/api/_generated/token_cost/raw_client.py +264 -0
  181. mirascope/api/_generated/token_cost/types/__init__.py +8 -0
  182. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +54 -0
  183. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +52 -0
  184. mirascope/api/_generated/traces/__init__.py +97 -0
  185. mirascope/api/_generated/traces/client.py +1103 -0
  186. mirascope/api/_generated/traces/raw_client.py +2322 -0
  187. mirascope/api/_generated/traces/types/__init__.py +155 -0
  188. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +29 -0
  189. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +27 -0
  190. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +23 -0
  191. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +38 -0
  192. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +19 -0
  193. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +22 -0
  194. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +20 -0
  195. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +29 -0
  196. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +31 -0
  197. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +23 -0
  198. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +38 -0
  199. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +19 -0
  200. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +22 -0
  201. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +22 -0
  202. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +48 -0
  203. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +23 -0
  204. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +38 -0
  205. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +19 -0
  206. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +24 -0
  207. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +22 -0
  208. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +20 -0
  209. mirascope/api/_generated/traces/types/traces_create_response.py +24 -0
  210. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +22 -0
  211. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +60 -0
  212. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +24 -0
  213. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +22 -0
  214. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +33 -0
  215. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +88 -0
  216. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +33 -0
  217. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +88 -0
  218. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +25 -0
  219. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +44 -0
  220. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +26 -0
  221. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +7 -0
  222. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +7 -0
  223. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +7 -0
  224. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +26 -0
  225. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +50 -0
  226. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +26 -0
  227. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +7 -0
  228. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +7 -0
  229. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +5 -0
  230. mirascope/api/_generated/traces/types/traces_search_response.py +26 -0
  231. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +50 -0
  232. mirascope/api/_generated/types/__init__.py +85 -0
  233. mirascope/api/_generated/types/already_exists_error.py +22 -0
  234. mirascope/api/_generated/types/already_exists_error_tag.py +5 -0
  235. mirascope/api/_generated/types/bad_request_error_body.py +50 -0
  236. mirascope/api/_generated/types/click_house_error.py +22 -0
  237. mirascope/api/_generated/types/database_error.py +22 -0
  238. mirascope/api/_generated/types/database_error_tag.py +5 -0
  239. mirascope/api/_generated/types/date.py +3 -0
  240. mirascope/api/_generated/types/http_api_decode_error.py +27 -0
  241. mirascope/api/_generated/types/http_api_decode_error_tag.py +5 -0
  242. mirascope/api/_generated/types/immutable_resource_error.py +22 -0
  243. mirascope/api/_generated/types/internal_server_error_body.py +49 -0
  244. mirascope/api/_generated/types/issue.py +38 -0
  245. mirascope/api/_generated/types/issue_tag.py +10 -0
  246. mirascope/api/_generated/types/not_found_error_body.py +22 -0
  247. mirascope/api/_generated/types/not_found_error_tag.py +5 -0
  248. mirascope/api/_generated/types/number_from_string.py +3 -0
  249. mirascope/api/_generated/types/permission_denied_error.py +22 -0
  250. mirascope/api/_generated/types/permission_denied_error_tag.py +5 -0
  251. mirascope/api/_generated/types/plan_limit_exceeded_error.py +32 -0
  252. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +7 -0
  253. mirascope/api/_generated/types/pricing_unavailable_error.py +23 -0
  254. mirascope/api/_generated/types/property_key.py +7 -0
  255. mirascope/api/_generated/types/property_key_key.py +25 -0
  256. mirascope/api/_generated/types/property_key_key_tag.py +5 -0
  257. mirascope/api/_generated/types/rate_limit_error.py +31 -0
  258. mirascope/api/_generated/types/rate_limit_error_tag.py +5 -0
  259. mirascope/api/_generated/types/service_unavailable_error_body.py +24 -0
  260. mirascope/api/_generated/types/service_unavailable_error_tag.py +7 -0
  261. mirascope/api/_generated/types/stripe_error.py +20 -0
  262. mirascope/api/_generated/types/subscription_past_due_error.py +31 -0
  263. mirascope/api/_generated/types/subscription_past_due_error_tag.py +7 -0
  264. mirascope/api/_generated/types/unauthorized_error_body.py +21 -0
  265. mirascope/api/_generated/types/unauthorized_error_tag.py +5 -0
  266. mirascope/api/client.py +255 -0
  267. mirascope/api/settings.py +99 -0
  268. mirascope/llm/__init__.py +316 -0
  269. mirascope/llm/calls/__init__.py +17 -0
  270. mirascope/llm/calls/calls.py +348 -0
  271. mirascope/llm/calls/decorator.py +268 -0
  272. mirascope/llm/content/__init__.py +71 -0
  273. mirascope/llm/content/audio.py +173 -0
  274. mirascope/llm/content/document.py +94 -0
  275. mirascope/llm/content/image.py +206 -0
  276. mirascope/llm/content/text.py +47 -0
  277. mirascope/llm/content/thought.py +58 -0
  278. mirascope/llm/content/tool_call.py +69 -0
  279. mirascope/llm/content/tool_output.py +43 -0
  280. mirascope/llm/context/__init__.py +6 -0
  281. mirascope/llm/context/_utils.py +41 -0
  282. mirascope/llm/context/context.py +24 -0
  283. mirascope/llm/exceptions.py +360 -0
  284. mirascope/llm/formatting/__init__.py +39 -0
  285. mirascope/llm/formatting/format.py +291 -0
  286. mirascope/llm/formatting/from_call_args.py +30 -0
  287. mirascope/llm/formatting/output_parser.py +178 -0
  288. mirascope/llm/formatting/partial.py +131 -0
  289. mirascope/llm/formatting/primitives.py +192 -0
  290. mirascope/llm/formatting/types.py +83 -0
  291. mirascope/llm/mcp/__init__.py +5 -0
  292. mirascope/llm/mcp/mcp_client.py +130 -0
  293. mirascope/llm/messages/__init__.py +35 -0
  294. mirascope/llm/messages/_utils.py +34 -0
  295. mirascope/llm/messages/message.py +190 -0
  296. mirascope/llm/models/__init__.py +21 -0
  297. mirascope/llm/models/models.py +1339 -0
  298. mirascope/llm/models/params.py +72 -0
  299. mirascope/llm/models/thinking_config.py +61 -0
  300. mirascope/llm/prompts/__init__.py +34 -0
  301. mirascope/llm/prompts/_utils.py +31 -0
  302. mirascope/llm/prompts/decorator.py +215 -0
  303. mirascope/llm/prompts/prompts.py +484 -0
  304. mirascope/llm/prompts/protocols.py +65 -0
  305. mirascope/llm/providers/__init__.py +65 -0
  306. mirascope/llm/providers/anthropic/__init__.py +11 -0
  307. mirascope/llm/providers/anthropic/_utils/__init__.py +27 -0
  308. mirascope/llm/providers/anthropic/_utils/beta_decode.py +297 -0
  309. mirascope/llm/providers/anthropic/_utils/beta_encode.py +272 -0
  310. mirascope/llm/providers/anthropic/_utils/decode.py +326 -0
  311. mirascope/llm/providers/anthropic/_utils/encode.py +431 -0
  312. mirascope/llm/providers/anthropic/_utils/errors.py +46 -0
  313. mirascope/llm/providers/anthropic/beta_provider.py +338 -0
  314. mirascope/llm/providers/anthropic/model_id.py +23 -0
  315. mirascope/llm/providers/anthropic/model_info.py +87 -0
  316. mirascope/llm/providers/anthropic/provider.py +440 -0
  317. mirascope/llm/providers/base/__init__.py +14 -0
  318. mirascope/llm/providers/base/_utils.py +248 -0
  319. mirascope/llm/providers/base/base_provider.py +1463 -0
  320. mirascope/llm/providers/base/kwargs.py +12 -0
  321. mirascope/llm/providers/google/__init__.py +6 -0
  322. mirascope/llm/providers/google/_utils/__init__.py +17 -0
  323. mirascope/llm/providers/google/_utils/decode.py +357 -0
  324. mirascope/llm/providers/google/_utils/encode.py +418 -0
  325. mirascope/llm/providers/google/_utils/errors.py +50 -0
  326. mirascope/llm/providers/google/message.py +7 -0
  327. mirascope/llm/providers/google/model_id.py +22 -0
  328. mirascope/llm/providers/google/model_info.py +63 -0
  329. mirascope/llm/providers/google/provider.py +456 -0
  330. mirascope/llm/providers/mirascope/__init__.py +5 -0
  331. mirascope/llm/providers/mirascope/_utils.py +73 -0
  332. mirascope/llm/providers/mirascope/provider.py +313 -0
  333. mirascope/llm/providers/mlx/__init__.py +9 -0
  334. mirascope/llm/providers/mlx/_utils.py +141 -0
  335. mirascope/llm/providers/mlx/encoding/__init__.py +8 -0
  336. mirascope/llm/providers/mlx/encoding/base.py +69 -0
  337. mirascope/llm/providers/mlx/encoding/transformers.py +146 -0
  338. mirascope/llm/providers/mlx/mlx.py +242 -0
  339. mirascope/llm/providers/mlx/model_id.py +17 -0
  340. mirascope/llm/providers/mlx/provider.py +416 -0
  341. mirascope/llm/providers/model_id.py +16 -0
  342. mirascope/llm/providers/ollama/__init__.py +7 -0
  343. mirascope/llm/providers/ollama/provider.py +71 -0
  344. mirascope/llm/providers/openai/__init__.py +15 -0
  345. mirascope/llm/providers/openai/_utils/__init__.py +5 -0
  346. mirascope/llm/providers/openai/_utils/errors.py +46 -0
  347. mirascope/llm/providers/openai/completions/__init__.py +7 -0
  348. mirascope/llm/providers/openai/completions/_utils/__init__.py +18 -0
  349. mirascope/llm/providers/openai/completions/_utils/decode.py +252 -0
  350. mirascope/llm/providers/openai/completions/_utils/encode.py +390 -0
  351. mirascope/llm/providers/openai/completions/_utils/feature_info.py +50 -0
  352. mirascope/llm/providers/openai/completions/base_provider.py +522 -0
  353. mirascope/llm/providers/openai/completions/provider.py +28 -0
  354. mirascope/llm/providers/openai/model_id.py +31 -0
  355. mirascope/llm/providers/openai/model_info.py +303 -0
  356. mirascope/llm/providers/openai/provider.py +405 -0
  357. mirascope/llm/providers/openai/responses/__init__.py +5 -0
  358. mirascope/llm/providers/openai/responses/_utils/__init__.py +15 -0
  359. mirascope/llm/providers/openai/responses/_utils/decode.py +289 -0
  360. mirascope/llm/providers/openai/responses/_utils/encode.py +399 -0
  361. mirascope/llm/providers/openai/responses/provider.py +472 -0
  362. mirascope/llm/providers/openrouter/__init__.py +5 -0
  363. mirascope/llm/providers/openrouter/provider.py +67 -0
  364. mirascope/llm/providers/provider_id.py +26 -0
  365. mirascope/llm/providers/provider_registry.py +305 -0
  366. mirascope/llm/providers/together/__init__.py +7 -0
  367. mirascope/llm/providers/together/provider.py +40 -0
  368. mirascope/llm/responses/__init__.py +66 -0
  369. mirascope/llm/responses/_utils.py +146 -0
  370. mirascope/llm/responses/base_response.py +103 -0
  371. mirascope/llm/responses/base_stream_response.py +824 -0
  372. mirascope/llm/responses/finish_reason.py +28 -0
  373. mirascope/llm/responses/response.py +362 -0
  374. mirascope/llm/responses/root_response.py +248 -0
  375. mirascope/llm/responses/stream_response.py +577 -0
  376. mirascope/llm/responses/streams.py +363 -0
  377. mirascope/llm/responses/usage.py +139 -0
  378. mirascope/llm/tools/__init__.py +71 -0
  379. mirascope/llm/tools/_utils.py +34 -0
  380. mirascope/llm/tools/decorator.py +184 -0
  381. mirascope/llm/tools/protocols.py +96 -0
  382. mirascope/llm/tools/provider_tools.py +18 -0
  383. mirascope/llm/tools/tool_schema.py +321 -0
  384. mirascope/llm/tools/toolkit.py +178 -0
  385. mirascope/llm/tools/tools.py +263 -0
  386. mirascope/llm/tools/types.py +112 -0
  387. mirascope/llm/tools/web_search_tool.py +32 -0
  388. mirascope/llm/types/__init__.py +22 -0
  389. mirascope/llm/types/dataclass.py +9 -0
  390. mirascope/llm/types/jsonable.py +44 -0
  391. mirascope/llm/types/type_vars.py +19 -0
  392. mirascope/ops/__init__.py +129 -0
  393. mirascope/ops/_internal/__init__.py +5 -0
  394. mirascope/ops/_internal/closure.py +1172 -0
  395. mirascope/ops/_internal/configuration.py +177 -0
  396. mirascope/ops/_internal/context.py +76 -0
  397. mirascope/ops/_internal/exporters/__init__.py +26 -0
  398. mirascope/ops/_internal/exporters/exporters.py +362 -0
  399. mirascope/ops/_internal/exporters/processors.py +104 -0
  400. mirascope/ops/_internal/exporters/types.py +165 -0
  401. mirascope/ops/_internal/exporters/utils.py +66 -0
  402. mirascope/ops/_internal/instrumentation/__init__.py +28 -0
  403. mirascope/ops/_internal/instrumentation/llm/__init__.py +8 -0
  404. mirascope/ops/_internal/instrumentation/llm/common.py +500 -0
  405. mirascope/ops/_internal/instrumentation/llm/cost.py +190 -0
  406. mirascope/ops/_internal/instrumentation/llm/encode.py +238 -0
  407. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +38 -0
  408. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +31 -0
  409. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +38 -0
  410. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +18 -0
  411. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +100 -0
  412. mirascope/ops/_internal/instrumentation/llm/llm.py +161 -0
  413. mirascope/ops/_internal/instrumentation/llm/model.py +1777 -0
  414. mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
  415. mirascope/ops/_internal/instrumentation/llm/serialize.py +324 -0
  416. mirascope/ops/_internal/instrumentation/providers/__init__.py +29 -0
  417. mirascope/ops/_internal/instrumentation/providers/anthropic.py +78 -0
  418. mirascope/ops/_internal/instrumentation/providers/base.py +179 -0
  419. mirascope/ops/_internal/instrumentation/providers/google_genai.py +85 -0
  420. mirascope/ops/_internal/instrumentation/providers/openai.py +82 -0
  421. mirascope/ops/_internal/propagation.py +198 -0
  422. mirascope/ops/_internal/protocols.py +133 -0
  423. mirascope/ops/_internal/session.py +139 -0
  424. mirascope/ops/_internal/spans.py +232 -0
  425. mirascope/ops/_internal/traced_calls.py +389 -0
  426. mirascope/ops/_internal/traced_functions.py +528 -0
  427. mirascope/ops/_internal/tracing.py +353 -0
  428. mirascope/ops/_internal/types.py +13 -0
  429. mirascope/ops/_internal/utils.py +131 -0
  430. mirascope/ops/_internal/versioned_calls.py +512 -0
  431. mirascope/ops/_internal/versioned_functions.py +357 -0
  432. mirascope/ops/_internal/versioning.py +303 -0
  433. mirascope/ops/exceptions.py +21 -0
  434. mirascope-2.1.1.dist-info/METADATA +231 -0
  435. mirascope-2.1.1.dist-info/RECORD +437 -0
  436. {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/WHEEL +1 -1
  437. {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/licenses/LICENSE +1 -1
  438. mirascope/beta/__init__.py +0 -0
  439. mirascope/beta/openai/__init__.py +0 -5
  440. mirascope/beta/openai/parse.py +0 -129
  441. mirascope/beta/rag/__init__.py +0 -24
  442. mirascope/beta/rag/base/__init__.py +0 -22
  443. mirascope/beta/rag/base/chunkers/__init__.py +0 -2
  444. mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
  445. mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
  446. mirascope/beta/rag/base/config.py +0 -8
  447. mirascope/beta/rag/base/document.py +0 -11
  448. mirascope/beta/rag/base/embedders.py +0 -35
  449. mirascope/beta/rag/base/embedding_params.py +0 -18
  450. mirascope/beta/rag/base/embedding_response.py +0 -30
  451. mirascope/beta/rag/base/query_results.py +0 -7
  452. mirascope/beta/rag/base/vectorstore_params.py +0 -18
  453. mirascope/beta/rag/base/vectorstores.py +0 -37
  454. mirascope/beta/rag/chroma/__init__.py +0 -11
  455. mirascope/beta/rag/chroma/types.py +0 -57
  456. mirascope/beta/rag/chroma/vectorstores.py +0 -97
  457. mirascope/beta/rag/cohere/__init__.py +0 -11
  458. mirascope/beta/rag/cohere/embedders.py +0 -87
  459. mirascope/beta/rag/cohere/embedding_params.py +0 -29
  460. mirascope/beta/rag/cohere/embedding_response.py +0 -29
  461. mirascope/beta/rag/cohere/py.typed +0 -0
  462. mirascope/beta/rag/openai/__init__.py +0 -11
  463. mirascope/beta/rag/openai/embedders.py +0 -144
  464. mirascope/beta/rag/openai/embedding_params.py +0 -18
  465. mirascope/beta/rag/openai/embedding_response.py +0 -14
  466. mirascope/beta/rag/openai/py.typed +0 -0
  467. mirascope/beta/rag/pinecone/__init__.py +0 -19
  468. mirascope/beta/rag/pinecone/types.py +0 -143
  469. mirascope/beta/rag/pinecone/vectorstores.py +0 -148
  470. mirascope/beta/rag/weaviate/__init__.py +0 -6
  471. mirascope/beta/rag/weaviate/types.py +0 -92
  472. mirascope/beta/rag/weaviate/vectorstores.py +0 -103
  473. mirascope/core/__init__.py +0 -55
  474. mirascope/core/anthropic/__init__.py +0 -21
  475. mirascope/core/anthropic/_call.py +0 -71
  476. mirascope/core/anthropic/_utils/__init__.py +0 -16
  477. mirascope/core/anthropic/_utils/_calculate_cost.py +0 -63
  478. mirascope/core/anthropic/_utils/_convert_message_params.py +0 -54
  479. mirascope/core/anthropic/_utils/_get_json_output.py +0 -34
  480. mirascope/core/anthropic/_utils/_handle_stream.py +0 -89
  481. mirascope/core/anthropic/_utils/_setup_call.py +0 -76
  482. mirascope/core/anthropic/call_params.py +0 -36
  483. mirascope/core/anthropic/call_response.py +0 -158
  484. mirascope/core/anthropic/call_response_chunk.py +0 -104
  485. mirascope/core/anthropic/dynamic_config.py +0 -26
  486. mirascope/core/anthropic/py.typed +0 -0
  487. mirascope/core/anthropic/stream.py +0 -140
  488. mirascope/core/anthropic/tool.py +0 -77
  489. mirascope/core/base/__init__.py +0 -40
  490. mirascope/core/base/_call_factory.py +0 -323
  491. mirascope/core/base/_create.py +0 -167
  492. mirascope/core/base/_extract.py +0 -139
  493. mirascope/core/base/_partial.py +0 -63
  494. mirascope/core/base/_utils/__init__.py +0 -64
  495. mirascope/core/base/_utils/_base_type.py +0 -17
  496. mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -45
  497. mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
  498. mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -126
  499. mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
  500. mirascope/core/base/_utils/_extract_tool_return.py +0 -36
  501. mirascope/core/base/_utils/_format_template.py +0 -29
  502. mirascope/core/base/_utils/_get_audio_type.py +0 -18
  503. mirascope/core/base/_utils/_get_fn_args.py +0 -14
  504. mirascope/core/base/_utils/_get_image_type.py +0 -26
  505. mirascope/core/base/_utils/_get_metadata.py +0 -17
  506. mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
  507. mirascope/core/base/_utils/_get_prompt_template.py +0 -25
  508. mirascope/core/base/_utils/_get_template_values.py +0 -52
  509. mirascope/core/base/_utils/_get_template_variables.py +0 -38
  510. mirascope/core/base/_utils/_json_mode_content.py +0 -15
  511. mirascope/core/base/_utils/_parse_content_template.py +0 -157
  512. mirascope/core/base/_utils/_parse_prompt_messages.py +0 -51
  513. mirascope/core/base/_utils/_protocols.py +0 -215
  514. mirascope/core/base/_utils/_setup_call.py +0 -64
  515. mirascope/core/base/_utils/_setup_extract_tool.py +0 -24
  516. mirascope/core/base/call_params.py +0 -6
  517. mirascope/core/base/call_response.py +0 -189
  518. mirascope/core/base/call_response_chunk.py +0 -91
  519. mirascope/core/base/dynamic_config.py +0 -55
  520. mirascope/core/base/message_param.py +0 -61
  521. mirascope/core/base/metadata.py +0 -13
  522. mirascope/core/base/prompt.py +0 -415
  523. mirascope/core/base/stream.py +0 -365
  524. mirascope/core/base/structured_stream.py +0 -251
  525. mirascope/core/base/tool.py +0 -126
  526. mirascope/core/base/toolkit.py +0 -146
  527. mirascope/core/cohere/__init__.py +0 -21
  528. mirascope/core/cohere/_call.py +0 -71
  529. mirascope/core/cohere/_utils/__init__.py +0 -16
  530. mirascope/core/cohere/_utils/_calculate_cost.py +0 -39
  531. mirascope/core/cohere/_utils/_convert_message_params.py +0 -31
  532. mirascope/core/cohere/_utils/_get_json_output.py +0 -31
  533. mirascope/core/cohere/_utils/_handle_stream.py +0 -33
  534. mirascope/core/cohere/_utils/_setup_call.py +0 -89
  535. mirascope/core/cohere/call_params.py +0 -57
  536. mirascope/core/cohere/call_response.py +0 -167
  537. mirascope/core/cohere/call_response_chunk.py +0 -101
  538. mirascope/core/cohere/dynamic_config.py +0 -24
  539. mirascope/core/cohere/py.typed +0 -0
  540. mirascope/core/cohere/stream.py +0 -113
  541. mirascope/core/cohere/tool.py +0 -92
  542. mirascope/core/gemini/__init__.py +0 -21
  543. mirascope/core/gemini/_call.py +0 -71
  544. mirascope/core/gemini/_utils/__init__.py +0 -16
  545. mirascope/core/gemini/_utils/_calculate_cost.py +0 -8
  546. mirascope/core/gemini/_utils/_convert_message_params.py +0 -74
  547. mirascope/core/gemini/_utils/_get_json_output.py +0 -33
  548. mirascope/core/gemini/_utils/_handle_stream.py +0 -33
  549. mirascope/core/gemini/_utils/_setup_call.py +0 -68
  550. mirascope/core/gemini/call_params.py +0 -28
  551. mirascope/core/gemini/call_response.py +0 -173
  552. mirascope/core/gemini/call_response_chunk.py +0 -85
  553. mirascope/core/gemini/dynamic_config.py +0 -26
  554. mirascope/core/gemini/stream.py +0 -121
  555. mirascope/core/gemini/tool.py +0 -104
  556. mirascope/core/groq/__init__.py +0 -21
  557. mirascope/core/groq/_call.py +0 -71
  558. mirascope/core/groq/_utils/__init__.py +0 -16
  559. mirascope/core/groq/_utils/_calculate_cost.py +0 -68
  560. mirascope/core/groq/_utils/_convert_message_params.py +0 -23
  561. mirascope/core/groq/_utils/_get_json_output.py +0 -27
  562. mirascope/core/groq/_utils/_handle_stream.py +0 -121
  563. mirascope/core/groq/_utils/_setup_call.py +0 -67
  564. mirascope/core/groq/call_params.py +0 -51
  565. mirascope/core/groq/call_response.py +0 -160
  566. mirascope/core/groq/call_response_chunk.py +0 -89
  567. mirascope/core/groq/dynamic_config.py +0 -26
  568. mirascope/core/groq/py.typed +0 -0
  569. mirascope/core/groq/stream.py +0 -136
  570. mirascope/core/groq/tool.py +0 -79
  571. mirascope/core/litellm/__init__.py +0 -6
  572. mirascope/core/litellm/_call.py +0 -73
  573. mirascope/core/litellm/_utils/__init__.py +0 -5
  574. mirascope/core/litellm/_utils/_setup_call.py +0 -46
  575. mirascope/core/litellm/py.typed +0 -0
  576. mirascope/core/mistral/__init__.py +0 -21
  577. mirascope/core/mistral/_call.py +0 -69
  578. mirascope/core/mistral/_utils/__init__.py +0 -16
  579. mirascope/core/mistral/_utils/_calculate_cost.py +0 -47
  580. mirascope/core/mistral/_utils/_convert_message_params.py +0 -23
  581. mirascope/core/mistral/_utils/_get_json_output.py +0 -28
  582. mirascope/core/mistral/_utils/_handle_stream.py +0 -121
  583. mirascope/core/mistral/_utils/_setup_call.py +0 -86
  584. mirascope/core/mistral/call_params.py +0 -36
  585. mirascope/core/mistral/call_response.py +0 -156
  586. mirascope/core/mistral/call_response_chunk.py +0 -84
  587. mirascope/core/mistral/dynamic_config.py +0 -24
  588. mirascope/core/mistral/py.typed +0 -0
  589. mirascope/core/mistral/stream.py +0 -117
  590. mirascope/core/mistral/tool.py +0 -77
  591. mirascope/core/openai/__init__.py +0 -21
  592. mirascope/core/openai/_call.py +0 -71
  593. mirascope/core/openai/_utils/__init__.py +0 -16
  594. mirascope/core/openai/_utils/_calculate_cost.py +0 -110
  595. mirascope/core/openai/_utils/_convert_message_params.py +0 -53
  596. mirascope/core/openai/_utils/_get_json_output.py +0 -27
  597. mirascope/core/openai/_utils/_handle_stream.py +0 -125
  598. mirascope/core/openai/_utils/_setup_call.py +0 -62
  599. mirascope/core/openai/call_params.py +0 -54
  600. mirascope/core/openai/call_response.py +0 -162
  601. mirascope/core/openai/call_response_chunk.py +0 -90
  602. mirascope/core/openai/dynamic_config.py +0 -26
  603. mirascope/core/openai/py.typed +0 -0
  604. mirascope/core/openai/stream.py +0 -148
  605. mirascope/core/openai/tool.py +0 -79
  606. mirascope/core/py.typed +0 -0
  607. mirascope/integrations/__init__.py +0 -20
  608. mirascope/integrations/_middleware_factory.py +0 -277
  609. mirascope/integrations/langfuse/__init__.py +0 -3
  610. mirascope/integrations/langfuse/_utils.py +0 -114
  611. mirascope/integrations/langfuse/_with_langfuse.py +0 -71
  612. mirascope/integrations/logfire/__init__.py +0 -3
  613. mirascope/integrations/logfire/_utils.py +0 -188
  614. mirascope/integrations/logfire/_with_logfire.py +0 -60
  615. mirascope/integrations/otel/__init__.py +0 -5
  616. mirascope/integrations/otel/_utils.py +0 -268
  617. mirascope/integrations/otel/_with_hyperdx.py +0 -61
  618. mirascope/integrations/otel/_with_otel.py +0 -60
  619. mirascope/integrations/tenacity.py +0 -50
  620. mirascope/py.typed +0 -0
  621. mirascope/v0/__init__.py +0 -43
  622. mirascope/v0/anthropic.py +0 -54
  623. mirascope/v0/base/__init__.py +0 -12
  624. mirascope/v0/base/calls.py +0 -118
  625. mirascope/v0/base/extractors.py +0 -122
  626. mirascope/v0/base/ops_utils.py +0 -207
  627. mirascope/v0/base/prompts.py +0 -48
  628. mirascope/v0/base/types.py +0 -14
  629. mirascope/v0/base/utils.py +0 -21
  630. mirascope/v0/openai.py +0 -54
  631. mirascope-1.0.5.dist-info/METADATA +0 -519
  632. mirascope-1.0.5.dist-info/RECORD +0 -198
@@ -1,126 +0,0 @@
1
- """This module defines the base class for tools used in LLM calls.
2
-
3
- usage-docs: learn/tools.md#the-basetool-class
4
- """
5
-
6
- from __future__ import annotations
7
-
8
- import inspect
9
- from abc import abstractmethod
10
- from collections.abc import Callable
11
- from typing import Any, ClassVar, TypeVar, cast
12
-
13
- from pydantic import BaseModel, ConfigDict
14
-
15
- from . import _utils
16
-
17
- _BaseToolT = TypeVar("_BaseToolT")
18
-
19
-
20
- class BaseTool(BaseModel):
21
- '''A class for defining tools for LLM calls.
22
-
23
- Example:
24
-
25
- ```python
26
- from mirascope.core import BaseTool
27
- from pydantic import Field
28
-
29
-
30
- class FormatBook(BaseTool):
31
- """Returns a nicely formatted book recommendation."""
32
-
33
- title: str = Field(..., description="The title of the book.")
34
- author: str = Field(..., description="The author of the book.")
35
-
36
- def call(self) -> str:
37
- return f"{self.title} by {self.author}"
38
- ```
39
- '''
40
-
41
- __custom_name__: ClassVar[str] = ""
42
- model_config = ConfigDict(arbitrary_types_allowed=True)
43
-
44
- @classmethod
45
- def _name(cls) -> str:
46
- """Returns the name of the tool."""
47
- return cls.__custom_name__ if cls.__custom_name__ else cls.__name__
48
-
49
- @classmethod
50
- def _description(cls) -> str:
51
- """Returns the description of the tool."""
52
- return (
53
- inspect.cleandoc(cls.__doc__)
54
- if cls.__doc__
55
- else _utils.DEFAULT_TOOL_DOCSTRING
56
- )
57
-
58
- @property
59
- def args(self) -> dict[str, Any]:
60
- """The arguments of the tool as a dictionary."""
61
- return {
62
- field: getattr(self, field)
63
- for field in self.model_fields
64
- if field != "tool_call"
65
- }
66
-
67
- @abstractmethod
68
- def call(self) -> Any: # noqa: ANN401
69
- """The method to call the tool."""
70
- ...
71
-
72
- @classmethod
73
- def model_tool_schema(cls) -> dict[str, Any]:
74
- """Returns the model_json_schema modified for reduced token usage."""
75
- model_schema = cls.model_json_schema()
76
- model_schema.pop("title", None)
77
- model_schema.pop("description", None)
78
-
79
- def remove_schema_titles(obj: Any) -> Any: # noqa: ANN401
80
- if isinstance(obj, dict):
81
- # Remove the 'title' key only if it's a direct child of a schema object
82
- if "type" in obj or "$ref" in obj or "properties" in obj:
83
- obj.pop("title", None)
84
-
85
- # Recursively process nested objects
86
- for key, value in list(obj.items()):
87
- obj[key] = remove_schema_titles(value)
88
- elif isinstance(obj, list):
89
- # Recursively process list items
90
- return [remove_schema_titles(item) for item in obj]
91
-
92
- return obj
93
-
94
- return cast(dict[str, Any], remove_schema_titles(model_schema))
95
-
96
- @classmethod
97
- def type_from_fn(cls: _BaseToolT, fn: Callable) -> _BaseToolT:
98
- """Returns this tool type converted from a function.
99
-
100
- Args:
101
- fn: The function to convert into this tool type.
102
- """
103
- return _utils.convert_function_to_base_tool(fn, cls) # type: ignore
104
-
105
- @classmethod
106
- def type_from_base_model_type(
107
- cls: _BaseToolT, tool_type: type[BaseModel]
108
- ) -> _BaseToolT:
109
- """Returns this tool type converted from a given base tool type.
110
-
111
- Args:
112
- tool_type: The tool type to convert into this tool type. This can be a
113
- custom `BaseTool` or `BaseModel` definition.
114
- """
115
- return _utils.convert_base_model_to_base_tool(tool_type, cls) # type: ignore
116
-
117
- @classmethod
118
- def type_from_base_type(
119
- cls: _BaseToolT, base_type: type[_utils.BaseType]
120
- ) -> _BaseToolT:
121
- """Returns this tool type converted from a base type.
122
-
123
- Args:
124
- base_type: The base type (e.g. `int`) to convert into this tool type.
125
- """
126
- return _utils.convert_base_type_to_base_tool(base_type, cls) # type: ignore
@@ -1,146 +0,0 @@
1
- """The module for defining the toolkit class for LLM call tools.
2
-
3
- usage docs: learn/tools.md#basetoolkit
4
- """
5
-
6
- from __future__ import annotations
7
-
8
- import inspect
9
- from abc import ABC
10
- from collections.abc import Callable
11
- from typing import Any, ClassVar, Concatenate, NamedTuple, TypeVar
12
-
13
- from pydantic import BaseModel, ConfigDict
14
- from typing_extensions import ParamSpec
15
-
16
- from . import BaseTool
17
- from ._utils import convert_function_to_base_tool, get_template_variables
18
-
19
- _TOOLKIT_TOOL_METHOD_MARKER: str = "__toolkit_tool_method__"
20
-
21
- _namespaces: set[str] = set()
22
-
23
- P = ParamSpec("P")
24
-
25
-
26
- class ToolKitToolMethod(NamedTuple):
27
- method: Callable[..., str]
28
- template_vars: list[str]
29
- template: str
30
-
31
-
32
- class BaseToolKit(BaseModel, ABC):
33
- """A class for defining tools for LLM call tools.
34
-
35
- The class should have methods decorated with `@toolkit_tool` to create tools.
36
-
37
- Example:
38
- ```python
39
- from mirascope.core.base import BaseToolKit, toolkit_tool
40
- from mirascope.core import openai
41
-
42
- class BookRecommendationToolKit(BaseToolKit):
43
- '''A toolkit for recommending books.'''
44
-
45
- __namespace__: ClassVar[str | None] = 'book_tools'
46
- reading_level: Literal["beginner", "advanced"]
47
-
48
- @toolkit_tool
49
- def format_book(self, title: str, author: str) -> str:
50
- '''Returns the title and author of a book nicely formatted.
51
-
52
- Reading level: {self.reading_level}
53
- '''
54
- return f"{title} by {author}"
55
-
56
- @openai.call(model="gpt-4o")
57
- def recommend_book(genre: str, reading_level: Literal["beginner", "advanced"]):
58
- '''Recommend a {genre} book.'''
59
- toolkit = BookRecommendationToolKit(reading_level=reading_level)
60
- return {"tools": toolkit.create_tools()}
61
-
62
- response = recommend_book("fantasy", "beginner")
63
- if tool := response.tool:
64
- output = tool.call()
65
- print(output)
66
- #> The Name of the Wind by Patrick Rothfuss
67
- else:
68
- print(response.content)
69
- #> Sure! I would recommend...
70
- ```
71
- """
72
-
73
- model_config = ConfigDict(arbitrary_types_allowed=True)
74
- _toolkit_tool_methods: ClassVar[list[ToolKitToolMethod]]
75
- __namespace__: ClassVar[str | None] = None
76
-
77
- def create_tools(self) -> list[type[BaseTool]]:
78
- """The method to create the tools."""
79
- tools = []
80
- for method, template_vars, template in self._toolkit_tool_methods:
81
- for var in template_vars:
82
- if var.startswith("self."):
83
- continue
84
- # Replace non-self template variables with escaped double brackets so
85
- # that templating `self` results in a future templateable string.
86
- template = template.replace(f"{{{var}}}", f"{{{{{var}}}}}")
87
- converted_method = convert_function_to_base_tool(
88
- method, BaseTool, template.format(self=self), self.__namespace__
89
- )
90
- for key, value in self:
91
- setattr(converted_method, key, value)
92
- tools.append(converted_method)
93
- return tools
94
-
95
- @classmethod
96
- def __pydantic_init_subclass__(cls, **kwargs: Any) -> None: # noqa: ANN401
97
- # validate the namespace
98
- if cls.__namespace__:
99
- if cls.__namespace__ in _namespaces:
100
- raise ValueError(f"The namespace {cls.__namespace__} is already used")
101
- _namespaces.add(cls.__namespace__)
102
-
103
- cls._toolkit_tool_methods = []
104
- for attr in cls.__dict__.values():
105
- if not getattr(attr, _TOOLKIT_TOOL_METHOD_MARKER, False):
106
- continue
107
- # Validate the toolkit_tool_method
108
- if (template := attr.__doc__) is None:
109
- raise ValueError("The toolkit_tool method must have a docstring")
110
-
111
- dedented_template = inspect.cleandoc(template)
112
- template_vars = get_template_variables(dedented_template, False)
113
-
114
- for var in template_vars:
115
- if not var.startswith("self."):
116
- # Skip template variables that do not start with self as they may
117
- # be later templated e.g. if using a call as a tool.
118
- continue
119
-
120
- self_var = var[5:]
121
-
122
- # Expecting pydantic model fields or class attribute and property
123
- if self_var in cls.model_fields or hasattr(cls, self_var):
124
- continue
125
- raise ValueError(
126
- f"The toolkit_tool method template variable {var} is not found in "
127
- "the class"
128
- )
129
-
130
- cls._toolkit_tool_methods.append(
131
- ToolKitToolMethod(attr, template_vars, dedented_template)
132
- )
133
- if not cls._toolkit_tool_methods:
134
- raise ValueError("No toolkit_tool method found")
135
-
136
-
137
- _BaseToolKitT = TypeVar("_BaseToolKitT", bound=BaseToolKit)
138
-
139
-
140
- def toolkit_tool(
141
- method: Callable[Concatenate[_BaseToolKitT, P], str],
142
- ) -> Callable[Concatenate[_BaseToolKitT, P], str]:
143
- # Mark the method as a toolkit tool
144
- setattr(method, _TOOLKIT_TOOL_METHOD_MARKER, True)
145
-
146
- return method
@@ -1,21 +0,0 @@
1
- """The Mirascope Cohere Module."""
2
-
3
- from ._call import cohere_call
4
- from ._call import cohere_call as call
5
- from .call_params import CohereCallParams
6
- from .call_response import CohereCallResponse
7
- from .call_response_chunk import CohereCallResponseChunk
8
- from .dynamic_config import CohereDynamicConfig
9
- from .stream import CohereStream
10
- from .tool import CohereTool
11
-
12
- __all__ = [
13
- "call",
14
- "CohereDynamicConfig",
15
- "CohereCallParams",
16
- "CohereCallResponse",
17
- "CohereCallResponseChunk",
18
- "CohereStream",
19
- "CohereTool",
20
- "cohere_call",
21
- ]
@@ -1,71 +0,0 @@
1
- """The `cohere_call` decorator for functions as LLM calls."""
2
-
3
- from ..base import call_factory
4
- from ._utils import (
5
- get_json_output,
6
- handle_stream,
7
- handle_stream_async,
8
- setup_call,
9
- )
10
- from .call_params import CohereCallParams
11
- from .call_response import CohereCallResponse
12
- from .call_response_chunk import CohereCallResponseChunk
13
- from .dynamic_config import CohereDynamicConfig
14
- from .stream import CohereStream
15
- from .tool import CohereTool
16
-
17
- cohere_call = call_factory(
18
- TCallResponse=CohereCallResponse,
19
- TCallResponseChunk=CohereCallResponseChunk,
20
- TDynamicConfig=CohereDynamicConfig,
21
- TToolType=CohereTool,
22
- TStream=CohereStream,
23
- TCallParams=CohereCallParams,
24
- default_call_params=CohereCallParams(),
25
- setup_call=setup_call, # type: ignore
26
- get_json_output=get_json_output,
27
- handle_stream=handle_stream,
28
- handle_stream_async=handle_stream_async,
29
- )
30
- """A decorator for calling the Cohere API with a typed function.
31
-
32
- usage docs: learn/calls.md
33
-
34
- This decorator is used to wrap a typed function that calls the Cohere API. It parses
35
- the docstring of the wrapped function as the messages array and templates the input
36
- arguments for the function into each message's template.
37
-
38
- Example:
39
-
40
- ```python
41
- from mirascope.core import prompt_template
42
- from mirascope.core.cohere import cohere_call
43
-
44
-
45
- @cohere_call("command-r-plus")
46
- @prompt_template("Recommend a {genre} book")
47
- def recommend_book(genre: str):
48
- ...
49
-
50
- response = recommend_book("fantasy")
51
- print(response.content)
52
- ```
53
-
54
- Args:
55
- model (str): The Cohere model to use in the API call.
56
- stream (bool): Whether to stream the response from the API call.
57
- tools (list[BaseTool | Callable]): The tools to use in the Cohere API call.
58
- response_model (BaseModel | BaseType): The response model into which the response
59
- should be structured.
60
- output_parser (Callable[[CohereCallResponse | ResponseModelT], Any]): A function for
61
- parsing the call response whose value will be returned in place of the original
62
- call response.
63
- json_mode (bool): Whether to use JSON Mode.
64
- client (object): An optional custom client to use in place of the default client.
65
- call_params (CohereCallParams): The `CohereCallParams` call parameters to use in the
66
- API call.
67
-
68
- Returns:
69
- decorator (Callable): The decorator for turning a typed function into a Cohere API
70
- call.
71
- """
@@ -1,16 +0,0 @@
1
- """Cohere utilities for decorator factories."""
2
-
3
- from ._calculate_cost import calculate_cost
4
- from ._convert_message_params import convert_message_params
5
- from ._get_json_output import get_json_output
6
- from ._handle_stream import handle_stream, handle_stream_async
7
- from ._setup_call import setup_call
8
-
9
- __all__ = [
10
- "calculate_cost",
11
- "convert_message_params",
12
- "get_json_output",
13
- "handle_stream",
14
- "handle_stream_async",
15
- "setup_call",
16
- ]
@@ -1,39 +0,0 @@
1
- """Calculate the cost of a completion using the Cohere API."""
2
-
3
-
4
- def calculate_cost(
5
- input_tokens: int | float | None,
6
- output_tokens: int | float | None,
7
- model: str = "command-r-plus",
8
- ) -> float | None:
9
- """Calculate the cost of a completion using the Cohere API.
10
-
11
- https://cohere.com/pricing
12
-
13
- Model Input Output
14
- command-r $0.5 / 1M tokens $1.5 / 1M tokens
15
- command-r-plus $3 / 1M tokens $15 / 1M tokens
16
- """
17
- pricing = {
18
- "command-r": {
19
- "prompt": 0.000_000_5,
20
- "completion": 0.000_001_5,
21
- },
22
- "command-r-plus": {
23
- "prompt": 0.000_003,
24
- "completion": 0.000_015,
25
- },
26
- }
27
- if input_tokens is None or output_tokens is None:
28
- return None
29
-
30
- try:
31
- model_pricing = pricing[model]
32
- except KeyError:
33
- return None
34
-
35
- prompt_cost = input_tokens * model_pricing["prompt"]
36
- completion_cost = output_tokens * model_pricing["completion"]
37
- total_cost = prompt_cost + completion_cost
38
-
39
- return total_cost
@@ -1,31 +0,0 @@
1
- """Utility for converting `BaseMessageParam` to `ChatCompletionMessageParam`"""
2
-
3
- from cohere.types import ChatMessage
4
-
5
- from ...base import BaseMessageParam
6
-
7
-
8
- def convert_message_params(
9
- message_params: list[BaseMessageParam | ChatMessage],
10
- ) -> list[ChatMessage]:
11
- converted_message_params = []
12
- for message_param in message_params:
13
- if isinstance(message_param, ChatMessage):
14
- converted_message_params.append(message_param)
15
- elif isinstance(content := message_param.content, str):
16
- converted_message_params.append(
17
- ChatMessage(
18
- role=message_param.role.upper(), # type: ignore
19
- message=content,
20
- )
21
- )
22
- else:
23
- if len(content) != 1 or content[0].type != "text":
24
- raise ValueError("Cohere does not currently support multimodalities.")
25
- converted_message_params.append(
26
- ChatMessage(
27
- role=message_param.role.upper(), # type: ignore
28
- message=content[0].text,
29
- )
30
- )
31
- return converted_message_params
@@ -1,31 +0,0 @@
1
- """Get the JSON output from a completion response."""
2
-
3
- import json
4
-
5
- from cohere.types import StreamedChatResponse_ToolCallsGeneration
6
-
7
- from ..call_response import CohereCallResponse
8
- from ..call_response_chunk import CohereCallResponseChunk
9
-
10
-
11
- def get_json_output(
12
- response: CohereCallResponse | CohereCallResponseChunk, json_mode: bool
13
- ) -> str:
14
- """Get the JSON output from a completion response."""
15
- if isinstance(response, CohereCallResponse):
16
- if json_mode and response.content:
17
- return response.content
18
- elif response.response.tool_calls:
19
- return json.dumps(response.response.tool_calls[0].parameters)
20
- raise ValueError("No tool call or JSON object found in response.")
21
- else:
22
- # raise ValueError("Cohere does not support structured streaming... :(")
23
- if json_mode:
24
- return response.content
25
- elif (
26
- isinstance(response.chunk, StreamedChatResponse_ToolCallsGeneration)
27
- and (tool_calls := response.chunk.tool_calls)
28
- and (parameters := tool_calls[0].parameters)
29
- ):
30
- return json.dumps(parameters)
31
- return ""
@@ -1,33 +0,0 @@
1
- """Handles the stream of completion chunks."""
2
-
3
- from collections.abc import AsyncGenerator, Generator
4
-
5
- from cohere.types import StreamedChatResponse
6
-
7
- from ..call_response_chunk import CohereCallResponseChunk
8
- from ..tool import CohereTool
9
-
10
-
11
- def handle_stream(
12
- stream: Generator[StreamedChatResponse, None, None],
13
- tool_types: list[type[CohereTool]] | None = None,
14
- ) -> Generator[tuple[CohereCallResponseChunk, None], None, None]:
15
- """Iterator over the stream and constructs tools as they are streamed.
16
-
17
- Note: cohere does not currently support streaming tools.
18
- """
19
- for chunk in stream:
20
- yield CohereCallResponseChunk(chunk=chunk), None
21
-
22
-
23
- async def handle_stream_async(
24
- stream: AsyncGenerator[StreamedChatResponse, None],
25
- tool_types: list[type[CohereTool]] | None = None,
26
- ) -> AsyncGenerator[tuple[CohereCallResponseChunk, None], None]:
27
- """
28
- Async iterator over the stream and constructs tools as they are streamed.
29
-
30
- Note: cohere does not currently support streaming tools.
31
- """
32
- async for chunk in stream:
33
- yield CohereCallResponseChunk(chunk=chunk), None
@@ -1,89 +0,0 @@
1
- """This module contains the setup_call function for Cohere tools."""
2
-
3
- import inspect
4
- from collections.abc import AsyncIterator, Awaitable, Callable, Coroutine, Iterator
5
- from typing import Any, cast
6
-
7
- from cohere import (
8
- AsyncClient,
9
- Client,
10
- NonStreamedChatResponse,
11
- )
12
- from cohere.types import ChatMessage
13
-
14
- from ...base import BaseMessageParam, BaseTool, _utils
15
- from ..call_params import CohereCallParams
16
- from ..dynamic_config import CohereDynamicConfig
17
- from ..tool import CohereTool
18
- from ._convert_message_params import convert_message_params
19
-
20
-
21
- def setup_call(
22
- *,
23
- model: str,
24
- client: Client | AsyncClient | None,
25
- fn: Callable[..., CohereDynamicConfig | Awaitable[CohereDynamicConfig]],
26
- fn_args: dict[str, Any],
27
- dynamic_config: CohereDynamicConfig,
28
- tools: list[type[BaseTool] | Callable] | None,
29
- json_mode: bool,
30
- call_params: CohereCallParams,
31
- extract: bool,
32
- ) -> tuple[
33
- Callable[..., NonStreamedChatResponse]
34
- | Callable[..., Awaitable[NonStreamedChatResponse]],
35
- str,
36
- list[ChatMessage],
37
- list[type[CohereTool]] | None,
38
- dict[str, Any],
39
- ]:
40
- prompt_template, messages, tool_types, call_kwargs = _utils.setup_call(
41
- fn, fn_args, dynamic_config, tools, CohereTool, call_params
42
- )
43
- messages = cast(list[BaseMessageParam | ChatMessage], messages)
44
- messages = convert_message_params(messages)
45
-
46
- preamble = ""
47
- if "preamble" in call_kwargs and call_kwargs["preamble"] is not None:
48
- preamble += call_kwargs.pop("preamble")
49
- if messages[0].role == "SYSTEM": # type: ignore
50
- if preamble:
51
- preamble += "\n\n"
52
- preamble += messages.pop(0).message
53
- if preamble:
54
- call_kwargs["preamble"] = preamble
55
- if len(messages) > 1:
56
- call_kwargs["chat_history"] = messages[:-1]
57
- if json_mode:
58
- # Cannot mutate ChatMessage in place
59
- messages[-1] = ChatMessage(
60
- role=messages[-1].role, # type: ignore
61
- message=messages[-1].message
62
- + _utils.json_mode_content(tool_types[0] if tool_types else None),
63
- tool_calls=messages[-1].tool_calls,
64
- )
65
- call_kwargs.pop("tools", None)
66
- elif extract:
67
- assert tool_types, "At least one tool must be provided for extraction."
68
- call_kwargs |= {
69
- "model": model,
70
- "message": messages[-1].message,
71
- }
72
-
73
- if client is None:
74
- client = AsyncClient() if inspect.iscoroutinefunction(fn) else Client()
75
-
76
- def create_or_stream(
77
- stream: bool,
78
- **kwargs: Any, # noqa: ANN401
79
- ) -> (
80
- Iterator[Any]
81
- | AsyncIterator[Any]
82
- | NonStreamedChatResponse
83
- | Coroutine[Any, Any, NonStreamedChatResponse]
84
- ):
85
- if stream:
86
- return client.chat_stream(**kwargs)
87
- return client.chat(**kwargs)
88
-
89
- return create_or_stream, prompt_template, messages, tool_types, call_kwargs # type: ignore
@@ -1,57 +0,0 @@
1
- """usage docs: learn/calls.md#provider-specific-parameters"""
2
-
3
- from __future__ import annotations
4
-
5
- from collections.abc import Sequence
6
-
7
- from cohere.types import (
8
- ChatConnector,
9
- ChatDocument,
10
- ChatRequestPromptTruncation,
11
- ToolResult,
12
- )
13
- from typing_extensions import NotRequired
14
-
15
- from ..base import BaseCallParams
16
-
17
-
18
- class CohereCallParams(BaseCallParams):
19
- """The parameters to use when calling the Cohere API.
20
-
21
- [Cohere API Reference](https://docs.cohere.com/reference/chat)
22
-
23
- Attributes:
24
- conversation_id: ...
25
- prompt_truncation: ...
26
- connectors: ...
27
- search_queries_only: ...
28
- documents: ...
29
- temperature: ...
30
- max_tokens: ...
31
- max_input_tokens: ...
32
- k: ...
33
- p: ...
34
- seed: ...
35
- stop_sequences: ...
36
- frequency_penalty: ...
37
- presence_penalty: ...
38
- raw_prompting: ...
39
- tool_results: ...
40
- """
41
-
42
- conversation_id: NotRequired[str | None]
43
- prompt_truncation: NotRequired[ChatRequestPromptTruncation | None]
44
- connectors: NotRequired[Sequence[ChatConnector] | None]
45
- search_queries_only: NotRequired[bool | None]
46
- documents: NotRequired[Sequence[ChatDocument] | None]
47
- temperature: NotRequired[float | None]
48
- max_tokens: NotRequired[int | None]
49
- max_input_tokens: NotRequired[int | None]
50
- k: NotRequired[int | None]
51
- p: NotRequired[float | None]
52
- seed: NotRequired[int | None]
53
- stop_sequences: NotRequired[Sequence[str] | None]
54
- frequency_penalty: NotRequired[float | None]
55
- presence_penalty: NotRequired[float | None]
56
- raw_prompting: NotRequired[bool | None]
57
- tool_results: NotRequired[Sequence[ToolResult] | None]