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,178 @@
1
+ from collections.abc import Sequence
2
+ from dataclasses import dataclass
3
+ from typing import Any, Generic, TypeVar
4
+
5
+ from ..content import ToolCall, ToolOutput
6
+ from ..context import Context, DepsT
7
+ from ..exceptions import ToolNotFoundError
8
+ from ..types import Jsonable
9
+ from .provider_tools import ProviderTool
10
+ from .tool_schema import ToolSchemaT
11
+ from .tools import AsyncContextTool, AsyncTool, ContextTool, Tool
12
+
13
+ ToolkitT = TypeVar(
14
+ "ToolkitT",
15
+ bound="Toolkit | AsyncToolkit | ContextToolkit[Any] | AsyncContextToolkit[Any]",
16
+ covariant=True,
17
+ )
18
+
19
+
20
+ @dataclass
21
+ class BaseToolkit(Generic[ToolSchemaT]):
22
+ """Base class for tool collections.
23
+
24
+ Provides common functionality for managing collections of tools,
25
+ including name validation and tool lookup.
26
+ """
27
+
28
+ tools: Sequence[ToolSchemaT | ProviderTool]
29
+ """The tools included in the toolkit."""
30
+
31
+ tools_dict: dict[str, ToolSchemaT]
32
+ """A mapping from tool names to tools in the toolkit.
33
+
34
+ This dict does not include any `ProviderTool`s, since they do not correspond
35
+ to tool calls that your code executes.
36
+ """
37
+
38
+ provider_tools_dict: dict[str, ProviderTool]
39
+ """A mapping from provider tool names to provider tools in the toolkit.
40
+
41
+ Provider tools are capabilities built into the provider's API (like web search)
42
+ that are executed server-side, not by your code.
43
+ """
44
+
45
+ def __init__(self, tools: Sequence[ToolSchemaT | ProviderTool] | None) -> None:
46
+ """Initialize the toolkit with a collection of tools.
47
+
48
+ Args:
49
+ tools: Sequence of tools to include in the toolkit.
50
+
51
+ Raises:
52
+ ValueError: If multiple tools have the same name.
53
+ """
54
+ self.tools = tools or []
55
+ self.tools_dict = {}
56
+ self.provider_tools_dict = {}
57
+ for tool in self.tools:
58
+ if isinstance(tool, ProviderTool):
59
+ if tool.name in self.provider_tools_dict:
60
+ raise ValueError(f"Multiple provider tools with name: {tool.name}")
61
+ self.provider_tools_dict[tool.name] = tool
62
+ else:
63
+ if tool.name in self.tools_dict:
64
+ raise ValueError(f"Multiple tools with name: {tool.name}")
65
+ self.tools_dict[tool.name] = tool
66
+
67
+ def get(self, tool_call: ToolCall) -> ToolSchemaT:
68
+ """Get a tool that can execute a specific tool call.
69
+
70
+ Args:
71
+ tool_call: The tool call containing the tool name to lookup.
72
+
73
+ Returns:
74
+ The tool whose name matches the tool call.
75
+
76
+ Raises:
77
+ ToolNotFoundError: If no tool with the given name exists.
78
+ """
79
+ tool = self.tools_dict.get(tool_call.name, None)
80
+ if not tool:
81
+ raise ToolNotFoundError(tool_call.name)
82
+ return tool
83
+
84
+
85
+ class Toolkit(BaseToolkit[Tool]):
86
+ """A collection of `Tool`s, with helpers for getting and executing specific tools."""
87
+
88
+ def execute(self, tool_call: ToolCall) -> ToolOutput[Jsonable]:
89
+ """Execute a `Tool` using the provided tool call.
90
+
91
+ Args:
92
+ tool_call: The tool call to execute.
93
+
94
+ Returns:
95
+ The output from executing the `Tool`.
96
+ """
97
+ try:
98
+ tool = self.get(tool_call)
99
+ return tool.execute(tool_call)
100
+ except ToolNotFoundError as e:
101
+ return ToolOutput(
102
+ id=tool_call.id, result=str(e), error=e, name=tool_call.name
103
+ )
104
+
105
+
106
+ class AsyncToolkit(BaseToolkit[AsyncTool]):
107
+ """A collection of `AsyncTool`s, with helpers for getting and executing specific tools."""
108
+
109
+ async def execute(self, tool_call: ToolCall) -> ToolOutput[Jsonable]:
110
+ """Execute an `AsyncTool` using the provided tool call.
111
+
112
+ Args:
113
+ tool_call: The tool call to execute.
114
+
115
+ Returns:
116
+ The output from executing the `AsyncTool`.
117
+ """
118
+ try:
119
+ tool = self.get(tool_call)
120
+ return await tool.execute(tool_call)
121
+ except ToolNotFoundError as e:
122
+ return ToolOutput(
123
+ id=tool_call.id, result=str(e), error=e, name=tool_call.name
124
+ )
125
+
126
+
127
+ class ContextToolkit(BaseToolkit[Tool | ContextTool[DepsT]], Generic[DepsT]):
128
+ """A collection of `ContextTool`s, with helpers for getting and executing specific tools."""
129
+
130
+ def execute(self, ctx: Context[DepsT], tool_call: ToolCall) -> ToolOutput[Jsonable]:
131
+ """Execute a `ContextTool` using the provided tool call.
132
+
133
+ Args:
134
+ ctx: The context containing dependencies that match the tool.
135
+ tool_call: The tool call to execute.
136
+
137
+ Returns:
138
+ The output from executing the `ContextTool`.
139
+ """
140
+ try:
141
+ tool = self.get(tool_call)
142
+ if isinstance(tool, ContextTool):
143
+ return tool.execute(ctx, tool_call)
144
+ else:
145
+ return tool.execute(tool_call)
146
+ except ToolNotFoundError as e:
147
+ return ToolOutput(
148
+ id=tool_call.id, result=str(e), error=e, name=tool_call.name
149
+ )
150
+
151
+
152
+ class AsyncContextToolkit(
153
+ BaseToolkit[AsyncTool | AsyncContextTool[DepsT]], Generic[DepsT]
154
+ ):
155
+ """A collection of `AsyncContextTool`s, with helpers for getting and executing specific tools."""
156
+
157
+ async def execute(
158
+ self, ctx: Context[DepsT], tool_call: ToolCall
159
+ ) -> ToolOutput[Jsonable]:
160
+ """Execute an `AsyncContextTool` using the provided tool call.
161
+
162
+ Args:
163
+ ctx: The context containing dependencies that match the tool.
164
+ tool_call: The tool call to execute.
165
+
166
+ Returns:
167
+ The output from executing the `AsyncContextTool`.
168
+ """
169
+ try:
170
+ tool = self.get(tool_call)
171
+ if isinstance(tool, AsyncContextTool):
172
+ return await tool.execute(ctx, tool_call)
173
+ else:
174
+ return await tool.execute(tool_call)
175
+ except ToolNotFoundError as e:
176
+ return ToolOutput(
177
+ id=tool_call.id, result=str(e), error=e, name=tool_call.name
178
+ )
@@ -0,0 +1,263 @@
1
+ """The `Tool` class for defining tools that LLMs can request be called."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from collections.abc import Awaitable
7
+ from typing import Any, Generic, cast
8
+ from typing_extensions import TypeVar
9
+
10
+ from ..content import ToolCall, ToolOutput
11
+ from ..context import Context, DepsT
12
+ from ..exceptions import ToolError, ToolExecutionError
13
+ from ..types import AnyP, JsonableCovariantT
14
+ from .protocols import (
15
+ AsyncContextToolFn,
16
+ AsyncJsonKwargsCallable,
17
+ AsyncKwargsCallable,
18
+ AsyncToolFn,
19
+ ContextKwargsCallable,
20
+ ContextToolFn,
21
+ KwargsCallable,
22
+ ToolFn,
23
+ )
24
+ from .tool_schema import ToolSchema
25
+
26
+ ToolT = TypeVar(
27
+ "ToolT",
28
+ bound="Tool | AsyncTool | ContextTool[Any] | AsyncContextTool[Any]",
29
+ covariant=True,
30
+ )
31
+
32
+
33
+ class Tool(
34
+ ToolSchema[ToolFn[AnyP, JsonableCovariantT]], Generic[AnyP, JsonableCovariantT]
35
+ ):
36
+ """A tool that can be used by LLMs.
37
+
38
+ A `Tool` represents a function that can be called by an LLM during a call.
39
+ It includes metadata like name, description, and parameter schema.
40
+
41
+ This class is not instantiated directly but created by the `@tool()` decorator.
42
+ """
43
+
44
+ @classmethod
45
+ def from_function( # pyright: ignore[reportIncompatibleMethodOverride]
46
+ cls, fn: ToolFn[AnyP, JsonableCovariantT], *, strict: bool | None = None
47
+ ) -> Tool[AnyP, JsonableCovariantT]:
48
+ """Create a `Tool` by inspecting a function and its docstring.
49
+
50
+ Args:
51
+ fn: The function to extract schema from
52
+ strict: Whether the tool should use strict mode when supported.
53
+ If None, uses provider's default (usually as strict as possible).
54
+
55
+ Returns:
56
+ a `Tool` representing the function
57
+ """
58
+ schema = ToolSchema.from_function(fn, strict=strict, is_context_tool=False)
59
+ return cls(
60
+ fn=cast(ToolFn[AnyP, JsonableCovariantT], schema.fn),
61
+ name=schema.name,
62
+ description=schema.description,
63
+ parameters=schema.parameters,
64
+ strict=schema.strict,
65
+ )
66
+
67
+ def __call__(self, *args: AnyP.args, **kwargs: AnyP.kwargs) -> JsonableCovariantT:
68
+ """Call the underlying function directly."""
69
+ return self.fn(*args, **kwargs)
70
+
71
+ def execute(self, tool_call: ToolCall) -> ToolOutput[JsonableCovariantT]:
72
+ """Execute the tool using an LLM-provided `ToolCall`."""
73
+ kwargs_callable = cast(KwargsCallable[JsonableCovariantT], self.fn)
74
+ error: ToolError | None = None
75
+ try:
76
+ kwargs_from_json = json.loads(tool_call.args)
77
+ result = kwargs_callable(**kwargs_from_json)
78
+ except Exception as e:
79
+ result = str(e)
80
+ error = ToolExecutionError(e)
81
+ return ToolOutput(id=tool_call.id, result=result, error=error, name=self.name)
82
+
83
+
84
+ class AsyncTool(
85
+ ToolSchema[AsyncToolFn[AnyP, JsonableCovariantT]],
86
+ Generic[AnyP, JsonableCovariantT],
87
+ ):
88
+ """An async tool that can be used by LLMs.
89
+
90
+ An `AsyncTool` represents an async function that can be called by an LLM during a call.
91
+ It includes metadata like name, description, and parameter schema.
92
+
93
+ This class is not instantiated directly but created by the `@tool()` decorator.
94
+ """
95
+
96
+ @classmethod
97
+ def from_function( # pyright: ignore[reportIncompatibleMethodOverride]
98
+ cls, fn: AsyncToolFn[AnyP, JsonableCovariantT], *, strict: bool | None = None
99
+ ) -> AsyncTool[AnyP, JsonableCovariantT]:
100
+ """Create an `AsyncTool` by inspecting a function and its docstring.
101
+
102
+ Args:
103
+ fn: The function to extract schema from
104
+ strict: Whether the tool should use strict mode when supported.
105
+ If None, uses provider's default (usually as strict as possible).
106
+
107
+ Returns:
108
+ an `AsyncTool` representing the function
109
+ """
110
+ schema = ToolSchema.from_function(fn, strict=strict, is_context_tool=False)
111
+ return cls(
112
+ fn=cast(AsyncToolFn[AnyP, JsonableCovariantT], schema.fn),
113
+ name=schema.name,
114
+ description=schema.description,
115
+ parameters=schema.parameters,
116
+ strict=schema.strict,
117
+ )
118
+
119
+ def __call__(
120
+ self, *args: AnyP.args, **kwargs: AnyP.kwargs
121
+ ) -> Awaitable[JsonableCovariantT]:
122
+ """Call the underlying async function directly."""
123
+ return self.fn(*args, **kwargs)
124
+
125
+ async def execute(self, tool_call: ToolCall) -> ToolOutput[JsonableCovariantT]:
126
+ """Execute the async tool using an LLM-provided `ToolCall`."""
127
+ kwargs_callable = cast(AsyncKwargsCallable[JsonableCovariantT], self.fn)
128
+ error: ToolError | None = None
129
+ try:
130
+ kwargs_from_json = json.loads(tool_call.args)
131
+ result = await kwargs_callable(**kwargs_from_json)
132
+ except Exception as e:
133
+ result = str(e)
134
+ error = ToolExecutionError(e)
135
+ return ToolOutput(id=tool_call.id, result=result, error=error, name=self.name)
136
+
137
+
138
+ class ContextTool(
139
+ ToolSchema[ContextToolFn[DepsT, AnyP, JsonableCovariantT]],
140
+ Generic[DepsT, JsonableCovariantT, AnyP],
141
+ ):
142
+ """Protocol defining a tool that can be used by LLMs.
143
+
144
+ A `ContextTool` represents a function that can be called by an LLM during a call.
145
+ It includes metadata like name, description, and parameter schema.
146
+
147
+ This class is not instantiated directly but created by the `@tool()` decorator.
148
+ """
149
+
150
+ @classmethod
151
+ def from_function( # pyright: ignore[reportIncompatibleMethodOverride]
152
+ cls,
153
+ fn: ContextToolFn[DepsT, AnyP, JsonableCovariantT],
154
+ *,
155
+ strict: bool | None = None,
156
+ ) -> ContextTool[DepsT, JsonableCovariantT, AnyP]:
157
+ """Create a `ContextTool` by inspecting a function and its docstring.
158
+
159
+ Args:
160
+ fn: The function to extract schema from
161
+ strict: Whether the tool should use strict mode when supported.
162
+ If None, uses provider's default (usually as strict as possible).
163
+
164
+ Returns:
165
+ a `ContextTool` representing the function
166
+ """
167
+ schema = ToolSchema.from_function(fn, strict=strict, is_context_tool=True)
168
+ return cls(
169
+ fn=cast(ContextToolFn[DepsT, AnyP, JsonableCovariantT], schema.fn),
170
+ name=schema.name,
171
+ description=schema.description,
172
+ parameters=schema.parameters,
173
+ strict=schema.strict,
174
+ )
175
+
176
+ def __call__(
177
+ self,
178
+ ctx: Context[DepsT],
179
+ *args: AnyP.args,
180
+ **kwargs: AnyP.kwargs,
181
+ ) -> JsonableCovariantT:
182
+ """Call the underlying function directly with context."""
183
+ return self.fn(ctx, *args, **kwargs)
184
+
185
+ def execute(
186
+ self, ctx: Context[DepsT], tool_call: ToolCall
187
+ ) -> ToolOutput[JsonableCovariantT]:
188
+ """Execute the context tool using an LLM-provided `ToolCall`."""
189
+ kwargs_callable = cast(
190
+ ContextKwargsCallable[DepsT, JsonableCovariantT], self.fn
191
+ )
192
+ error: ToolError | None = None
193
+ try:
194
+ kwargs_from_json = json.loads(tool_call.args)
195
+ result = kwargs_callable(ctx, **kwargs_from_json)
196
+ except Exception as e:
197
+ result = str(e)
198
+ error = ToolExecutionError(e)
199
+ return ToolOutput(id=tool_call.id, result=result, error=error, name=self.name)
200
+
201
+
202
+ class AsyncContextTool(
203
+ ToolSchema[AsyncContextToolFn[DepsT, AnyP, JsonableCovariantT]],
204
+ Generic[DepsT, JsonableCovariantT, AnyP],
205
+ ):
206
+ """Protocol defining an async tool that can be used by LLMs with context.
207
+
208
+ An `AsyncContextTool` represents an async function that can be called by an LLM during a call.
209
+ It includes metadata like name, description, and parameter schema.
210
+
211
+ This class is not instantiated directly but created by the `@tool()` decorator.
212
+ """
213
+
214
+ @classmethod
215
+ def from_function( # pyright: ignore[reportIncompatibleMethodOverride]
216
+ cls,
217
+ fn: AsyncContextToolFn[DepsT, AnyP, JsonableCovariantT],
218
+ *,
219
+ strict: bool | None = None,
220
+ ) -> AsyncContextTool[DepsT, JsonableCovariantT, AnyP]:
221
+ """Create an `AsyncContextTool` by inspecting a function and its docstring.
222
+
223
+ Args:
224
+ fn: The function to extract schema from
225
+ strict: Whether the tool should use strict mode when supported.
226
+ If None, uses provider's default (usually as strict as possible).
227
+
228
+ Returns:
229
+ an `AsyncContextTool` representing the function
230
+ """
231
+ schema = ToolSchema.from_function(fn, strict=strict, is_context_tool=True)
232
+ return cls(
233
+ fn=cast(AsyncContextToolFn[DepsT, AnyP, JsonableCovariantT], schema.fn),
234
+ name=schema.name,
235
+ description=schema.description,
236
+ parameters=schema.parameters,
237
+ strict=schema.strict,
238
+ )
239
+
240
+ def __call__(
241
+ self,
242
+ ctx: Context[DepsT],
243
+ *args: AnyP.args,
244
+ **kwargs: AnyP.kwargs,
245
+ ) -> Awaitable[JsonableCovariantT]:
246
+ """Call the underlying async function directly with context."""
247
+ return self.fn(ctx, *args, **kwargs)
248
+
249
+ async def execute(
250
+ self, ctx: Context[DepsT], tool_call: ToolCall
251
+ ) -> ToolOutput[JsonableCovariantT]:
252
+ """Execute the async context tool using an LLM-provided `ToolCall`."""
253
+ kwargs_callable = cast(
254
+ AsyncJsonKwargsCallable[DepsT, JsonableCovariantT], self.fn
255
+ )
256
+ error: ToolError | None = None
257
+ try:
258
+ kwargs_from_json = json.loads(tool_call.args)
259
+ result = await kwargs_callable(ctx, **kwargs_from_json)
260
+ except Exception as e:
261
+ result = str(e)
262
+ error = ToolExecutionError(e)
263
+ return ToolOutput(id=tool_call.id, result=result, error=error, name=self.name)
@@ -0,0 +1,112 @@
1
+ """Type aliases for tool parameter types used in provider signatures."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Sequence
6
+ from typing import TypeAlias
7
+ from typing_extensions import TypeAliasType
8
+
9
+ from ..context import DepsT
10
+ from .provider_tools import ProviderTool
11
+ from .tool_schema import AnyToolSchema
12
+ from .toolkit import (
13
+ AsyncContextToolkit,
14
+ AsyncToolkit,
15
+ BaseToolkit,
16
+ ContextToolkit,
17
+ Toolkit,
18
+ )
19
+ from .tools import AsyncContextTool, AsyncTool, ContextTool, Tool
20
+
21
+ AnyTools: TypeAlias = (
22
+ Sequence[AnyToolSchema | ProviderTool] | BaseToolkit[AnyToolSchema]
23
+ )
24
+
25
+ Tools: TypeAlias = Sequence[Tool | ProviderTool] | Toolkit
26
+ """Type alias for sync tool parameters: a sequence of Tools or a Toolkit."""
27
+
28
+ AsyncTools: TypeAlias = Sequence[AsyncTool | ProviderTool] | AsyncToolkit
29
+ """Type alias for async tool parameters: a sequence of AsyncTools or an AsyncToolkit."""
30
+
31
+ ContextTools = TypeAliasType(
32
+ "ContextTools",
33
+ Sequence[Tool | ContextTool[DepsT] | ProviderTool] | ContextToolkit[DepsT],
34
+ type_params=(DepsT,),
35
+ )
36
+ """Type alias for sync context tool parameters: a sequence of Tools/ContextTools or a ContextToolkit."""
37
+
38
+ AsyncContextTools = TypeAliasType(
39
+ "AsyncContextTools",
40
+ Sequence[AsyncTool | AsyncContextTool[DepsT] | ProviderTool]
41
+ | AsyncContextToolkit[DepsT],
42
+ type_params=(DepsT,),
43
+ )
44
+ """Type alias for async context tool parameters: a sequence of AsyncTools/AsyncContextTools or an AsyncContextToolkit."""
45
+
46
+
47
+ def normalize_tools(tools: Tools | None) -> Toolkit:
48
+ """Normalize tools input to a Toolkit.
49
+
50
+ Args:
51
+ tools: A sequence of Tools, a Toolkit, or None.
52
+
53
+ Returns:
54
+ A Toolkit containing the tools (or an empty Toolkit if None).
55
+ """
56
+ if tools is None:
57
+ return Toolkit(None)
58
+ if isinstance(tools, Toolkit):
59
+ return tools
60
+ return Toolkit(tools)
61
+
62
+
63
+ def normalize_async_tools(tools: AsyncTools | None) -> AsyncToolkit:
64
+ """Normalize async tools input to an AsyncToolkit.
65
+
66
+ Args:
67
+ tools: A sequence of AsyncTools, an AsyncToolkit, or None.
68
+
69
+ Returns:
70
+ An AsyncToolkit containing the tools (or an empty AsyncToolkit if None).
71
+ """
72
+ if tools is None:
73
+ return AsyncToolkit(None)
74
+ if isinstance(tools, AsyncToolkit):
75
+ return tools
76
+ return AsyncToolkit(tools)
77
+
78
+
79
+ def normalize_context_tools(
80
+ tools: ContextTools[DepsT] | None,
81
+ ) -> ContextToolkit[DepsT]:
82
+ """Normalize context tools input to a ContextToolkit.
83
+
84
+ Args:
85
+ tools: A sequence of Tools/ContextTools, a ContextToolkit, or None.
86
+
87
+ Returns:
88
+ A ContextToolkit containing the tools (or an empty ContextToolkit if None).
89
+ """
90
+ if tools is None:
91
+ return ContextToolkit(None)
92
+ if isinstance(tools, ContextToolkit):
93
+ return tools
94
+ return ContextToolkit(tools)
95
+
96
+
97
+ def normalize_async_context_tools(
98
+ tools: AsyncContextTools[DepsT] | None,
99
+ ) -> AsyncContextToolkit[DepsT]:
100
+ """Normalize async context tools input to an AsyncContextToolkit.
101
+
102
+ Args:
103
+ tools: A sequence of AsyncTools/AsyncContextTools, an AsyncContextToolkit, or None.
104
+
105
+ Returns:
106
+ An AsyncContextToolkit containing the tools (or an empty AsyncContextToolkit if None).
107
+ """
108
+ if tools is None:
109
+ return AsyncContextToolkit(None)
110
+ if isinstance(tools, AsyncContextToolkit):
111
+ return tools
112
+ return AsyncContextToolkit(tools)
@@ -0,0 +1,32 @@
1
+ """Web search tool for provider-native web search capabilities."""
2
+
3
+ from dataclasses import dataclass, field
4
+
5
+ from .provider_tools import ProviderTool
6
+
7
+
8
+ @dataclass(frozen=True)
9
+ class WebSearchTool(ProviderTool):
10
+ """Web search tool that allows the model to search the internet.
11
+
12
+ This is a provider tool - the search is executed server-side by the provider,
13
+ not by your code. The model decides when to search based on the prompt,
14
+ and the provider returns search results with citations.
15
+
16
+ Supported providers include Anthropic, Google, and OpenAI (when using the Responses API).
17
+
18
+ Example:
19
+ ```python
20
+ from mirascope import llm
21
+
22
+ @llm.call("anthropic/claude-sonnet-4-5", tools=[llm.WebSearchTool()])
23
+ def search_web(query: str) -> str:
24
+ return f"Search the web for: {query}"
25
+
26
+ response = search_web("Who won the 2024 Super Bowl?")
27
+ print(response.text()) # Response includes citations from web search
28
+ ```
29
+ """
30
+
31
+ name: str = field(default="web_search", init=False)
32
+ """The tool name. Always "web_search" for this tool type."""
@@ -0,0 +1,22 @@
1
+ """Types for the LLM module."""
2
+
3
+ from .dataclass import Dataclass
4
+ from .jsonable import (
5
+ Jsonable,
6
+ JsonableCovariantT,
7
+ JsonableT,
8
+ )
9
+ from .type_vars import AnyP, CovariantT, P
10
+
11
+ NoneType = type(None)
12
+
13
+ __all__ = [
14
+ "AnyP",
15
+ "CovariantT",
16
+ "Dataclass",
17
+ "Jsonable",
18
+ "JsonableCovariantT",
19
+ "JsonableT",
20
+ "NoneType",
21
+ "P",
22
+ ]
@@ -0,0 +1,9 @@
1
+ """A protocol for defining a dataclass type."""
2
+
3
+ from dataclasses import Field
4
+ from typing import Any, ClassVar, Protocol, runtime_checkable
5
+
6
+
7
+ @runtime_checkable
8
+ class Dataclass(Protocol):
9
+ __dataclass_fields__: ClassVar[dict[str, Field[Any]]]
@@ -0,0 +1,44 @@
1
+ """Typing for JSON serializable objects."""
2
+
3
+ from collections.abc import Mapping, Sequence
4
+ from typing import Protocol, TypeAlias
5
+ from typing_extensions import TypeVar
6
+
7
+
8
+ class JsonableObject(Protocol):
9
+ """Protocol for JSON-serializable objects.
10
+
11
+ This protocol defines the interface for objects that can be serialized to
12
+ JSON. It is used to annotate the `JsonableType` type alias.
13
+ """
14
+
15
+ def json(self) -> str:
16
+ """Serialize the object as a JSON string."""
17
+ ...
18
+
19
+
20
+ Jsonable: TypeAlias = (
21
+ None
22
+ | str
23
+ | int
24
+ | float
25
+ | bool
26
+ | Sequence["Jsonable"]
27
+ | Mapping[str, "Jsonable"]
28
+ | JsonableObject
29
+ )
30
+ """Simple type alias for JSON-serializable types."""
31
+
32
+
33
+ JsonableT = TypeVar("JsonableT", bound=Jsonable)
34
+ """Type variable for tool output types.
35
+
36
+ This TypeVar represents the return type of tool functions, which must be
37
+ serializable to JSON (bound to Jsonable) for LLM consumption.
38
+ """
39
+
40
+
41
+ JsonableCovariantT = TypeVar(
42
+ "JsonableCovariantT", covariant=True, bound=Jsonable, default=Jsonable
43
+ )
44
+ """Type variable for covariant types that are Jsonable."""
@@ -0,0 +1,19 @@
1
+ """Common TypeVar definitions for the LLM module."""
2
+
3
+ from typing import TypeVar
4
+ from typing_extensions import ParamSpec
5
+
6
+ P = ParamSpec("P")
7
+ """Parameter specification for function signatures.
8
+
9
+ This ParamSpec is used to preserve function parameter types and signatures
10
+ when wrapping functions with decorators or creating generic callable types.
11
+ It captures both positional and keyword arguments (*args, **kwargs) while
12
+ maintaining their original types.
13
+ """
14
+
15
+ AnyP = ParamSpec("AnyP", default=...)
16
+ """A parameter specification that defaults to ..."""
17
+
18
+ CovariantT = TypeVar("CovariantT", covariant=True)
19
+ """Type variable for covariant types."""