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,33 +0,0 @@
1
- """Get JSON output from a Gemini response."""
2
-
3
- import json
4
-
5
- from proto.marshal.collections import RepeatedComposite
6
-
7
- from ..call_response import GeminiCallResponse
8
- from ..call_response_chunk import GeminiCallResponseChunk
9
-
10
-
11
- def get_json_output(
12
- response: GeminiCallResponse | GeminiCallResponseChunk, json_mode: bool
13
- ) -> str:
14
- """Extracts the JSON output from a Gemini response."""
15
- if isinstance(response, GeminiCallResponse):
16
- if json_mode and response.content:
17
- return response.content
18
- elif tool_calls := [
19
- part.function_call
20
- for part in response.response.parts
21
- if part.function_call.args
22
- ]:
23
- return json.dumps(
24
- {
25
- k: v if not isinstance(v, RepeatedComposite) else list(v)
26
- for k, v in tool_calls[0].args.items()
27
- }
28
- )
29
- else:
30
- raise ValueError("No tool call or JSON object found in response.")
31
- elif not json_mode:
32
- raise ValueError("Gemini only supports structured streaming in json mode.")
33
- return response.content
@@ -1,33 +0,0 @@
1
- """Handles streaming content and tools from the Gemini API."""
2
-
3
- from collections.abc import AsyncGenerator, Generator
4
-
5
- from google.generativeai.types import GenerateContentResponse # type: ignore
6
-
7
- from ..call_response_chunk import GeminiCallResponseChunk
8
- from ..tool import GeminiTool
9
-
10
-
11
- def handle_stream(
12
- stream: Generator[GenerateContentResponse, None, None],
13
- tool_types: list[type[GeminiTool]] | None = None,
14
- ) -> Generator[tuple[GeminiCallResponseChunk, None], None, None]:
15
- """Iterator over the stream and constructs tools as they are streamed.
16
-
17
- Note: gemini does not currently support streaming tools.
18
- """
19
- for chunk in stream:
20
- yield GeminiCallResponseChunk(chunk=chunk), None
21
-
22
-
23
- async def handle_stream_async(
24
- stream: AsyncGenerator[GenerateContentResponse, None],
25
- tool_types: list[type[GeminiTool]] | None = None,
26
- ) -> AsyncGenerator[tuple[GeminiCallResponseChunk, None], None]:
27
- """
28
- Async iterator over the stream and constructs tools as they are streamed.
29
-
30
- Note: gemini does not currently support streaming tools.
31
- """
32
- async for chunk in stream:
33
- yield GeminiCallResponseChunk(chunk=chunk), None
@@ -1,68 +0,0 @@
1
- """This module contains the setup_call function, which is used to set up the"""
2
-
3
- import inspect
4
- from collections.abc import Awaitable, Callable
5
- from typing import Any, cast
6
-
7
- from google.generativeai import GenerativeModel # type: ignore
8
- from google.generativeai.types import ( # type: ignore
9
- AsyncGenerateContentResponse,
10
- ContentDict,
11
- GenerateContentResponse,
12
- )
13
-
14
- from ...base import BaseMessageParam, BaseTool, _utils
15
- from ..call_params import GeminiCallParams
16
- from ..dynamic_config import GeminiDynamicConfig
17
- from ..tool import GeminiTool
18
- from ._convert_message_params import convert_message_params
19
-
20
-
21
- def setup_call(
22
- *,
23
- model: str,
24
- client: GenerativeModel | None,
25
- fn: Callable[..., GeminiDynamicConfig | Awaitable[GeminiDynamicConfig]],
26
- fn_args: dict[str, Any],
27
- dynamic_config: GeminiDynamicConfig,
28
- tools: list[type[BaseTool] | Callable] | None,
29
- json_mode: bool,
30
- call_params: GeminiCallParams,
31
- extract: bool = False,
32
- ) -> tuple[
33
- Callable[..., GenerateContentResponse]
34
- | Callable[..., Awaitable[AsyncGenerateContentResponse]],
35
- str,
36
- list[ContentDict],
37
- list[type[GeminiTool]] | None,
38
- dict[str, Any],
39
- ]:
40
- prompt_template, messages, tool_types, call_kwargs = _utils.setup_call(
41
- fn, fn_args, dynamic_config, tools, GeminiTool, call_params
42
- )
43
- messages = cast(list[BaseMessageParam | ContentDict], messages)
44
- messages = convert_message_params(messages)
45
- if json_mode:
46
- generation_config = call_kwargs.get("generation_config", {})
47
- generation_config["response_mime_type"] = "application/json"
48
- call_kwargs["generation_config"] = generation_config
49
- messages[-1]["parts"].append(
50
- _utils.json_mode_content(tool_types[0] if tool_types else None)
51
- )
52
- call_kwargs.pop("tools", None)
53
- elif extract:
54
- assert tool_types, "At least one tool must be provided for extraction."
55
- tool_config = call_kwargs.get("tool_config", {})
56
- tool_config["function_calling_config"] = {"mode": "auto"}
57
- call_kwargs["tool_config"] = tool_config
58
- call_kwargs |= {"contents": messages}
59
-
60
- if client is None:
61
- client = GenerativeModel(model_name=model)
62
- create = (
63
- client.generate_content_async
64
- if inspect.iscoroutinefunction(fn)
65
- else client.generate_content
66
- )
67
-
68
- return create, prompt_template, messages, tool_types, call_kwargs
@@ -1,28 +0,0 @@
1
- """usage docs: learn/calls.md#provider-specific-parameters"""
2
-
3
- from __future__ import annotations
4
-
5
- from google.generativeai.types import GenerationConfig, RequestOptions
6
- from google.generativeai.types.content_types import ToolConfigType
7
- from google.generativeai.types.safety_types import SafetySettingOptions
8
- from typing_extensions import NotRequired
9
-
10
- from ..base import BaseCallParams
11
-
12
-
13
- class GeminiCallParams(BaseCallParams):
14
- """The parameters to use when calling the Gemini API.
15
-
16
- [Gemini API Reference](https://ai.google.dev/gemini-api/docs/text-generation?lang=python)
17
-
18
- Attributes:
19
- generation_config: ...
20
- safety_settings: ...
21
- request_options: ...
22
- tool_config: ...
23
- """
24
-
25
- generation_config: NotRequired[GenerationConfig]
26
- safety_settings: NotRequired[SafetySettingOptions]
27
- request_options: NotRequired[RequestOptions]
28
- tool_config: NotRequired[ToolConfigType]
@@ -1,173 +0,0 @@
1
- """This module contains the `GeminiCallResponse` class.
2
-
3
- usage docs: learn/calls.md#handling-responses
4
- """
5
-
6
- from google.generativeai.protos import FunctionResponse # type: ignore
7
- from google.generativeai.types import ( # type: ignore
8
- AsyncGenerateContentResponse,
9
- ContentDict,
10
- ContentsType, # type: ignore
11
- GenerateContentResponse,
12
- )
13
- from pydantic import computed_field
14
-
15
- from ..base import BaseCallResponse
16
- from ._utils import calculate_cost
17
- from .call_params import GeminiCallParams
18
- from .dynamic_config import GeminiDynamicConfig
19
- from .tool import GeminiTool
20
-
21
-
22
- class GeminiCallResponse(
23
- BaseCallResponse[
24
- GenerateContentResponse | AsyncGenerateContentResponse,
25
- GeminiTool,
26
- GeminiDynamicConfig,
27
- ContentsType,
28
- GeminiCallParams,
29
- ContentDict,
30
- ]
31
- ):
32
- """Convenience wrapper around Gemini's `GenerateContentResponse`.
33
-
34
- When using Mirascope's convenience wrappers to interact with Gemini models via
35
- `GeminiCall`, responses using `GeminiCall.call()` will return a
36
- `GeminiCallResponse`, whereby the implemented properties allow for simpler syntax
37
- and a convenient developer experience.
38
-
39
- Example:
40
-
41
- ```python
42
- from mirascope.core import prompt_template
43
- from mirascope.core.gemini import gemini_call
44
-
45
-
46
- @gemini_call("gemini-1.5-flash")
47
- @prompt_template("Recommend a {genre} book")
48
- def recommend_book(genre: str):
49
- ...
50
-
51
-
52
- response = recommend_book("fantasy") # response is an `GeminiCallResponse` instance
53
- print(response.content)
54
- ```
55
- """
56
-
57
- _provider = "gemini"
58
-
59
- @property
60
- def content(self) -> str:
61
- """Returns the contained string content for the 0th choice."""
62
- return self.response.candidates[0].content.parts[0].text
63
-
64
- @property
65
- def finish_reasons(self) -> list[str]:
66
- """Returns the finish reasons of the response."""
67
- finish_reasons = [
68
- "FINISH_REASON_UNSPECIFIED",
69
- "STOP",
70
- "MAX_TOKENS",
71
- "SAFETY",
72
- "RECITATION",
73
- "OTHER",
74
- ]
75
-
76
- return [
77
- finish_reasons[candidate.finish_reason]
78
- for candidate in self.response.candidates
79
- ]
80
-
81
- @property
82
- def model(self) -> str:
83
- """Returns the model name.
84
-
85
- google.generativeai does not return model, so we return the model provided by
86
- the user.
87
- """
88
- return self._model
89
-
90
- @property
91
- def id(self) -> str | None:
92
- """Returns the id of the response.
93
-
94
- google.generativeai does not return an id
95
- """
96
- return None
97
-
98
- @property
99
- def usage(self) -> None:
100
- """Returns the usage of the chat completion.
101
-
102
- google.generativeai does not have Usage, so we return None
103
- """
104
- return None
105
-
106
- @property
107
- def input_tokens(self) -> None:
108
- """Returns the number of input tokens."""
109
- return None
110
-
111
- @property
112
- def output_tokens(self) -> None:
113
- """Returns the number of output tokens."""
114
- return None
115
-
116
- @property
117
- def cost(self) -> float | None:
118
- """Returns the cost of the call."""
119
- return calculate_cost(self.input_tokens, self.output_tokens, self.model)
120
-
121
- @computed_field
122
- @property
123
- def message_param(self) -> ContentDict:
124
- """Returns the models's response as a message parameter."""
125
- return {"role": "model", "parts": self.response.parts} # type: ignore
126
-
127
- @computed_field
128
- @property
129
- def tools(self) -> list[GeminiTool] | None:
130
- """Returns the list of tools for the 0th candidate's 0th content part."""
131
- if self.tool_types is None:
132
- return None
133
-
134
- extracted_tools = []
135
- for part in self.response.candidates[0].content.parts:
136
- tool_call = part.function_call
137
- for tool_type in self.tool_types:
138
- if tool_call.name == tool_type._name():
139
- extracted_tools.append(tool_type.from_tool_call(tool_call))
140
- break
141
-
142
- return extracted_tools
143
-
144
- @computed_field
145
- @property
146
- def tool(self) -> GeminiTool | None:
147
- """Returns the 0th tool for the 0th candidate's 0th content part.
148
-
149
- Raises:
150
- ValidationError: if the tool call doesn't match the tool's schema.
151
- """
152
- tools = self.tools
153
- if tools:
154
- return tools[0]
155
- return None
156
-
157
- @classmethod
158
- def tool_message_params(
159
- cls, tools_and_outputs: list[tuple[GeminiTool, object]]
160
- ) -> list[FunctionResponse]:
161
- """Returns the tool message parameters for tool call results.
162
-
163
- Args:
164
- tools_and_outputs: The list of tools and their outputs from which the tool
165
- message parameters should be constructed.
166
-
167
- Returns:
168
- The list of constructed `FunctionResponse` parameters.
169
- """
170
- return [
171
- FunctionResponse(name=tool._name(), response={"result": output})
172
- for tool, output in tools_and_outputs
173
- ]
@@ -1,85 +0,0 @@
1
- """This module contains the `GeminiCallResponseChunk` class.
2
-
3
- usage docs: learn/streams.md#handling-streamed-responses
4
- """
5
-
6
- from google.ai.generativelanguage import Candidate
7
- from google.generativeai.types import ( # type: ignore
8
- GenerateContentResponse,
9
- )
10
-
11
- from ..base import BaseCallResponseChunk
12
-
13
-
14
- class GeminiCallResponseChunk(
15
- BaseCallResponseChunk[GenerateContentResponse, Candidate.FinishReason]
16
- ):
17
- """Convenience wrapper around chat completion streaming chunks.
18
-
19
- When using Mirascope's convenience wrappers to interact with Gemini models via
20
- `GeminiCall`, responses using `GeminiCall.stream()` will return a
21
- `GeminiCallResponseChunk`, whereby the implemented properties allow for simpler
22
- syntax and a convenient developer experience.
23
-
24
- Example:
25
-
26
- ```python
27
- from mirascope.core import prompt_template
28
- from mirascope.core.gemini import gemini_call
29
-
30
-
31
- @gemini_call("gemini-1.5-flash", stream=True)
32
- @prompt_template("Recommend a {genre} book")
33
- def recommend_book(genre: str):
34
- ...
35
-
36
-
37
- stream = recommend_book("fantasy") # response is an `GeminiStream`
38
- for chunk, _ in stream:
39
- print(chunk.content, end="", flush=True)
40
- ```
41
- """
42
-
43
- @property
44
- def content(self) -> str:
45
- """Returns the chunk content for the 0th choice."""
46
- return self.chunk.candidates[0].content.parts[0].text
47
-
48
- @property
49
- def finish_reasons(self) -> list[Candidate.FinishReason]:
50
- """Returns the finish reasons of the response."""
51
- return [candidate.finish_reason for candidate in self.chunk.candidates]
52
-
53
- @property
54
- def model(self) -> None:
55
- """Returns the model name.
56
-
57
- google.generativeai does not return model, so we return None
58
- """
59
- return None
60
-
61
- @property
62
- def id(self) -> str | None:
63
- """Returns the id of the response.
64
-
65
- google.generativeai does not return an id
66
- """
67
- return None
68
-
69
- @property
70
- def usage(self) -> None:
71
- """Returns the usage of the chat completion.
72
-
73
- google.generativeai does not have Usage, so we return None
74
- """
75
- return None
76
-
77
- @property
78
- def input_tokens(self) -> None:
79
- """Returns the number of input tokens."""
80
- return None
81
-
82
- @property
83
- def output_tokens(self) -> None:
84
- """Returns the number of output tokens."""
85
- return None
@@ -1,26 +0,0 @@
1
- """This module defines the function return type for functions as LLM calls.
2
-
3
- usage docs: learn/dynamic_configuration.md#dynamic-configuration-options
4
- """
5
-
6
- from google.generativeai.types import ContentsType # type: ignore
7
-
8
- from ..base import BaseDynamicConfig
9
- from .call_params import GeminiCallParams
10
-
11
- GeminiDynamicConfig = BaseDynamicConfig[ContentsType, GeminiCallParams]
12
- """The function return type for functions wrapped with the `gemini_call` decorator.
13
-
14
- Example:
15
-
16
- ```python
17
- from mirascope.core import prompt_template
18
- from mirascope.core.gemini import GeminiDynamicConfig, gemini_call
19
-
20
-
21
- @gemini_call("gemini-flash-1.5")
22
- @prompt_template("Recommend a {capitalized_genre} book")
23
- def recommend_book(genre: str) -> GeminiDynamicConfig:
24
- return {"computed_fields": {"capitalized_genre": genre.capitalize()}}
25
- ```
26
- """
@@ -1,121 +0,0 @@
1
- """The `GeminiStream` class for convenience around streaming LLM calls.
2
-
3
- usage docs: learn/streams.md
4
- """
5
-
6
- from typing import cast
7
-
8
- from google.ai.generativelanguage import (
9
- Candidate,
10
- Content,
11
- FunctionCall,
12
- GenerateContentResponse,
13
- )
14
- from google.generativeai.types import (
15
- ContentDict,
16
- ContentsType, # type: ignore
17
- )
18
- from google.generativeai.types import ( # type: ignore
19
- GenerateContentResponse as GenerateContentResponseType,
20
- )
21
- from google.generativeai.types.content_types import PartType
22
-
23
- from ..base.stream import BaseStream
24
- from ._utils import calculate_cost
25
- from .call_params import GeminiCallParams
26
- from .call_response import GeminiCallResponse
27
- from .call_response_chunk import GeminiCallResponseChunk
28
- from .dynamic_config import GeminiDynamicConfig
29
- from .tool import GeminiTool
30
-
31
-
32
- class GeminiStream(
33
- BaseStream[
34
- GeminiCallResponse,
35
- GeminiCallResponseChunk,
36
- ContentDict,
37
- ContentDict,
38
- ContentDict,
39
- ContentsType,
40
- GeminiTool,
41
- GeminiDynamicConfig,
42
- GeminiCallParams,
43
- Candidate.FinishReason,
44
- ]
45
- ):
46
- """A class for convenience around streaming Gemini LLM calls.
47
-
48
- Example:
49
-
50
- ```python
51
- from mirascope.core import prompt_template
52
- from mirascope.core.gemini import gemini_call
53
-
54
-
55
- @gemini_call("gemini-1.5-flash", stream=True)
56
- @prompt_template("Recommend a {genre} book")
57
- def recommend_book(genre: str):
58
- ...
59
-
60
-
61
- stream = recommend_book("fantasy") # returns `GeminiStream` instance
62
- for chunk, _ in stream:
63
- print(chunk.content, end="", flush=True)
64
- ```
65
- """
66
-
67
- _provider = "gemini"
68
-
69
- @property
70
- def cost(self) -> float | None:
71
- """Returns the cost of the call."""
72
- return calculate_cost(self.input_tokens, self.output_tokens, self.model)
73
-
74
- def _construct_message_param(
75
- self, tool_calls: list[FunctionCall] | None = None, content: str | None = None
76
- ) -> ContentDict:
77
- """Constructs the message parameter for the assistant."""
78
- return {
79
- "role": "model",
80
- "parts": cast(list[PartType], [{"text": content}] + (tool_calls or [])),
81
- }
82
-
83
- def construct_call_response(self) -> GeminiCallResponse:
84
- """Constructs the call response from a consumed GeminiStream.
85
-
86
- Raises:
87
- ValueError: if the stream has not yet been consumed.
88
- """
89
- if not hasattr(self, "message_param"):
90
- raise ValueError(
91
- "No stream response, check if the stream has been consumed."
92
- )
93
- response = GenerateContentResponseType.from_response(
94
- GenerateContentResponse(
95
- candidates=[
96
- Candidate(
97
- finish_reason=self.finish_reasons[0]
98
- if self.finish_reasons
99
- else Candidate.FinishReason.STOP,
100
- content=Content(
101
- role=self.message_param["role"],
102
- parts=self.message_param["parts"],
103
- ),
104
- )
105
- ]
106
- )
107
- )
108
- return GeminiCallResponse(
109
- metadata=self.metadata,
110
- response=response,
111
- tool_types=self.tool_types,
112
- prompt_template=self.prompt_template,
113
- fn_args=self.fn_args if self.fn_args else {},
114
- dynamic_config=self.dynamic_config,
115
- messages=self.messages,
116
- call_params=self.call_params,
117
- call_kwargs=self.call_kwargs,
118
- user_message_param=self.user_message_param,
119
- start_time=self.start_time,
120
- end_time=self.end_time,
121
- )
@@ -1,104 +0,0 @@
1
- """The `GeminiTool` class for easy tool usage with Google's Gemini LLM calls.
2
-
3
- usage docs: learn/tools.md#using-tools-with-standard-calls
4
- """
5
-
6
- from __future__ import annotations
7
-
8
- from typing import Any
9
-
10
- from google.ai.generativelanguage import FunctionCall
11
- from google.generativeai.types import ( # type: ignore
12
- FunctionDeclaration,
13
- Tool,
14
- )
15
- from pydantic.json_schema import SkipJsonSchema
16
-
17
- from ..base import BaseTool
18
-
19
-
20
- class GeminiTool(BaseTool):
21
- """A class for defining tools for Gemini LLM calls.
22
-
23
- Example:
24
-
25
- ```python
26
- from mirascope.core import prompt_template
27
- from mirascope.core.gemini import gemini_call
28
-
29
-
30
- def format_book(title: str, author: str) -> str:
31
- return f"{title} by {author}"
32
-
33
-
34
- @gemini_call("gemini-1.5-flash", tools=[format_book])
35
- @prompt_template("Recommend a {genre} book")
36
- def recommend_book(genre: str):
37
- ...
38
-
39
-
40
- response = recommend_book("fantasy")
41
- if tool := response.tool: # returns an `GeminiTool` instance
42
- print(tool.call())
43
- ```
44
- """
45
-
46
- tool_call: SkipJsonSchema[FunctionCall]
47
-
48
- @classmethod
49
- def tool_schema(cls) -> Tool:
50
- """Constructs a JSON Schema tool schema from the `BaseModel` schema defined.
51
-
52
- Example:
53
- ```python
54
- from mirascope.core.gemini import GeminiTool
55
-
56
-
57
- def format_book(title: str, author: str) -> str:
58
- return f"{title} by {author}"
59
-
60
-
61
- tool_type = GeminiTool.type_from_fn(format_book)
62
- print(tool_type.tool_schema()) # prints the Gemini-specific tool schema
63
- ```
64
- """
65
- model_schema = cls.model_tool_schema()
66
- fn: dict[str, Any] = {"name": cls._name(), "description": cls._description()}
67
- if model_schema["properties"]:
68
- fn["parameters"] = model_schema # type: ignore
69
- if model_schema["required"]:
70
- fn["parameters"]["required"] = model_schema["required"]
71
- if "parameters" in fn:
72
- if "$defs" in fn["parameters"]:
73
- raise ValueError(
74
- "Unfortunately Google's Gemini API cannot handle nested structures "
75
- "with $defs."
76
- )
77
-
78
- def handle_enum_schema(prop_schema: dict[str, Any]) -> dict[str, Any]:
79
- if "enum" in prop_schema:
80
- prop_schema["format"] = "enum"
81
- return prop_schema
82
-
83
- fn["parameters"]["properties"] = {
84
- prop: {
85
- key: value
86
- for key, value in handle_enum_schema(prop_schema).items()
87
- if key != "default"
88
- }
89
- for prop, prop_schema in fn["parameters"]["properties"].items()
90
- }
91
- return Tool(function_declarations=[FunctionDeclaration(**fn)])
92
-
93
- @classmethod
94
- def from_tool_call(cls, tool_call: FunctionCall) -> GeminiTool:
95
- """Constructs an `GeminiTool` instance from a `tool_call`.
96
-
97
- Args:
98
- tool_call: The Gemini tool call from which to construct this tool instance.
99
- """
100
- if not tool_call.args:
101
- raise ValueError("Tool call doesn't have any arguments.")
102
- model_json: dict[str, Any] = dict(tool_call.args.items())
103
- model_json["tool_call"] = tool_call
104
- return cls.model_validate(model_json)
@@ -1,21 +0,0 @@
1
- """The Mirascope Groq Module."""
2
-
3
- from ._call import groq_call
4
- from ._call import groq_call as call
5
- from .call_params import GroqCallParams
6
- from .call_response import GroqCallResponse
7
- from .call_response_chunk import GroqCallResponseChunk
8
- from .dynamic_config import GroqDynamicConfig
9
- from .stream import GroqStream
10
- from .tool import GroqTool
11
-
12
- __all__ = [
13
- "call",
14
- "GroqDynamicConfig",
15
- "GroqCallParams",
16
- "GroqCallResponse",
17
- "GroqCallResponseChunk",
18
- "GroqStream",
19
- "GroqTool",
20
- "groq_call",
21
- ]