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,28 @@
1
+ """The reason the LLM finished generating a response."""
2
+
3
+ from dataclasses import dataclass
4
+ from enum import Enum
5
+ from typing import Literal
6
+
7
+
8
+ class FinishReason(str, Enum):
9
+ """The reason why the LLM finished generating a response.
10
+
11
+ `FinishReason` is only set when the response did not have a normal finish (e.g. it
12
+ ran out of tokens). When a response finishes generating normally, no finish reason
13
+ is set.
14
+ """
15
+
16
+ MAX_TOKENS = "max_tokens"
17
+ REFUSAL = "refusal"
18
+ CONTEXT_LENGTH_EXCEEDED = "context_length_exceeded"
19
+
20
+
21
+ @dataclass(kw_only=True)
22
+ class FinishReasonChunk:
23
+ """Represents the finish reason for a completed stream."""
24
+
25
+ type: Literal["finish_reason_chunk"] = "finish_reason_chunk"
26
+
27
+ finish_reason: FinishReason
28
+ """The reason the stream finished."""
@@ -0,0 +1,362 @@
1
+ """Implements Response and AsyncResponse."""
2
+
3
+ import asyncio
4
+ from collections.abc import Sequence
5
+ from typing import TYPE_CHECKING, Any, Generic, overload
6
+
7
+ from ..content import ToolOutput
8
+ from ..context import Context, DepsT
9
+ from ..formatting import Format, FormattableT
10
+ from ..messages import AssistantMessage, Message, UserContent
11
+ from ..tools import (
12
+ AsyncContextToolkit,
13
+ AsyncContextTools,
14
+ AsyncToolkit,
15
+ AsyncTools,
16
+ ContextToolkit,
17
+ ContextTools,
18
+ Toolkit,
19
+ Tools,
20
+ )
21
+ from ..types import Jsonable
22
+ from .base_response import BaseResponse
23
+ from .finish_reason import FinishReason
24
+ from .usage import Usage
25
+
26
+ if TYPE_CHECKING:
27
+ from ..models import Params
28
+ from ..providers import ModelId, ProviderId
29
+
30
+
31
+ class Response(BaseResponse[Toolkit, FormattableT]):
32
+ """The response generated by an LLM."""
33
+
34
+ def __init__(
35
+ self,
36
+ *,
37
+ raw: Any, # noqa: ANN401
38
+ provider_id: "ProviderId",
39
+ model_id: "ModelId",
40
+ provider_model_name: str,
41
+ params: "Params",
42
+ tools: Tools | None = None,
43
+ format: Format[FormattableT] | None = None,
44
+ input_messages: Sequence[Message],
45
+ assistant_message: AssistantMessage,
46
+ finish_reason: FinishReason | None,
47
+ usage: Usage | None,
48
+ ) -> None:
49
+ """Initialize a `Response`."""
50
+ toolkit = tools if isinstance(tools, Toolkit) else Toolkit(tools=tools)
51
+ super().__init__(
52
+ raw=raw,
53
+ provider_id=provider_id,
54
+ model_id=model_id,
55
+ provider_model_name=provider_model_name,
56
+ params=params,
57
+ toolkit=toolkit,
58
+ format=format,
59
+ input_messages=input_messages,
60
+ assistant_message=assistant_message,
61
+ finish_reason=finish_reason,
62
+ usage=usage,
63
+ )
64
+
65
+ def execute_tools(self) -> Sequence[ToolOutput[Jsonable]]:
66
+ """Execute and return all of the tool calls in the response.
67
+
68
+ Returns:
69
+ A sequence containing a `ToolOutput` for every tool call in the order they appeared.
70
+
71
+ Raises:
72
+ ToolNotFoundError: If one of the response's tool calls has no matching tool.
73
+ Exception: If one of the tools throws an exception.
74
+ """
75
+ return [self.toolkit.execute(tool_call) for tool_call in self.tool_calls]
76
+
77
+ @overload
78
+ def resume(self: "Response", content: UserContent) -> "Response": ...
79
+
80
+ @overload
81
+ def resume(
82
+ self: "Response[FormattableT]", content: UserContent
83
+ ) -> "Response[FormattableT]": ...
84
+
85
+ def resume(self, content: UserContent) -> "Response | Response[FormattableT]":
86
+ """Generate a new `Response` using this response's messages with additional user content.
87
+
88
+ Uses this response's tools and format type. Also uses this response's provider,
89
+ model, client, and params, unless the model context manager is being used to
90
+ provide a new LLM as an override.
91
+
92
+ Args:
93
+ content: The new user message content to append to the message history.
94
+
95
+ Returns:
96
+ A new `Response` instance generated from the extended message history.
97
+ """
98
+ return self.model.resume(
99
+ response=self,
100
+ content=content,
101
+ )
102
+
103
+
104
+ class AsyncResponse(BaseResponse[AsyncToolkit, FormattableT]):
105
+ """The response generated by an LLM in async mode."""
106
+
107
+ def __init__(
108
+ self,
109
+ *,
110
+ raw: Any, # noqa: ANN401
111
+ provider_id: "ProviderId",
112
+ model_id: "ModelId",
113
+ provider_model_name: str,
114
+ params: "Params",
115
+ tools: AsyncTools | None = None,
116
+ format: Format[FormattableT] | None = None,
117
+ input_messages: Sequence[Message],
118
+ assistant_message: AssistantMessage,
119
+ finish_reason: FinishReason | None,
120
+ usage: Usage | None,
121
+ ) -> None:
122
+ """Initialize an `AsyncResponse`."""
123
+ toolkit = (
124
+ tools if isinstance(tools, AsyncToolkit) else AsyncToolkit(tools=tools)
125
+ )
126
+ super().__init__(
127
+ raw=raw,
128
+ provider_id=provider_id,
129
+ model_id=model_id,
130
+ provider_model_name=provider_model_name,
131
+ params=params,
132
+ toolkit=toolkit,
133
+ format=format,
134
+ input_messages=input_messages,
135
+ assistant_message=assistant_message,
136
+ finish_reason=finish_reason,
137
+ usage=usage,
138
+ )
139
+
140
+ async def execute_tools(self) -> Sequence[ToolOutput[Jsonable]]:
141
+ """Execute and return all of the tool calls in the response.
142
+
143
+ Returns:
144
+ A sequence containing a `ToolOutput` for every tool call in the order they appeared.
145
+
146
+ Raises:
147
+ ToolNotFoundError: If one of the response's tool calls has no matching tool.
148
+ Exception: If one of the tools throws an exception.
149
+ """
150
+ tasks = [self.toolkit.execute(tool_call) for tool_call in self.tool_calls]
151
+ return await asyncio.gather(*tasks)
152
+
153
+ @overload
154
+ async def resume(
155
+ self: "AsyncResponse", content: UserContent
156
+ ) -> "AsyncResponse": ...
157
+
158
+ @overload
159
+ async def resume(
160
+ self: "AsyncResponse[FormattableT]", content: UserContent
161
+ ) -> "AsyncResponse[FormattableT]": ...
162
+
163
+ async def resume(
164
+ self, content: UserContent
165
+ ) -> "AsyncResponse | AsyncResponse[FormattableT]":
166
+ """Generate a new `AsyncResponse` using this response's messages with additional user content.
167
+
168
+ Uses this response's tools and format type. Also uses this response's provider,
169
+ model, client, and params, unless the model context manager is being used to
170
+ provide a new LLM as an override.
171
+
172
+ Args:
173
+ content: The new user message content to append to the message history.
174
+
175
+ Returns:
176
+ A new `AsyncResponse` instance generated from the extended message history.
177
+ """
178
+ return await self.model.resume_async(
179
+ response=self,
180
+ content=content,
181
+ )
182
+
183
+
184
+ class ContextResponse(
185
+ BaseResponse[ContextToolkit[DepsT], FormattableT], Generic[DepsT, FormattableT]
186
+ ):
187
+ """The response generated by an LLM from a context call."""
188
+
189
+ def __init__(
190
+ self,
191
+ *,
192
+ raw: Any, # noqa: ANN401
193
+ provider_id: "ProviderId",
194
+ model_id: "ModelId",
195
+ provider_model_name: str,
196
+ params: "Params",
197
+ tools: ContextTools[DepsT] | None = None,
198
+ format: Format[FormattableT] | None = None,
199
+ input_messages: Sequence[Message],
200
+ assistant_message: AssistantMessage,
201
+ finish_reason: FinishReason | None,
202
+ usage: Usage | None,
203
+ ) -> None:
204
+ """Initialize a `ContextResponse`."""
205
+ toolkit = (
206
+ tools if isinstance(tools, ContextToolkit) else ContextToolkit(tools=tools)
207
+ )
208
+ super().__init__(
209
+ raw=raw,
210
+ provider_id=provider_id,
211
+ model_id=model_id,
212
+ provider_model_name=provider_model_name,
213
+ params=params,
214
+ toolkit=toolkit,
215
+ format=format,
216
+ input_messages=input_messages,
217
+ assistant_message=assistant_message,
218
+ finish_reason=finish_reason,
219
+ usage=usage,
220
+ )
221
+
222
+ def execute_tools(self, ctx: Context[DepsT]) -> Sequence[ToolOutput[Jsonable]]:
223
+ """Execute and return all of the tool calls in the response.
224
+
225
+ Args:
226
+ ctx: A `Context` with the required deps type.
227
+
228
+ Returns:
229
+ A sequence containing a `ToolOutput` for every tool call.
230
+
231
+ Raises:
232
+ ToolNotFoundError: If one of the response's tool calls has no matching tool.
233
+ Exception: If one of the tools throws an exception.
234
+ """
235
+ return [self.toolkit.execute(ctx, tool_call) for tool_call in self.tool_calls]
236
+
237
+ @overload
238
+ def resume(
239
+ self: "ContextResponse[DepsT]", ctx: Context[DepsT], content: UserContent
240
+ ) -> "ContextResponse[DepsT]": ...
241
+
242
+ @overload
243
+ def resume(
244
+ self: "ContextResponse[DepsT, FormattableT]",
245
+ ctx: Context[DepsT],
246
+ content: UserContent,
247
+ ) -> "ContextResponse[DepsT, FormattableT]": ...
248
+
249
+ def resume(
250
+ self, ctx: Context[DepsT], content: UserContent
251
+ ) -> "ContextResponse[DepsT] | ContextResponse[DepsT, FormattableT]":
252
+ """Generate a new `ContextResponse` using this response's messages with additional user content.
253
+
254
+ Uses this response's tools and format type. Also uses this response's provider,
255
+ model, client, and params, unless the model context manager is being used to
256
+ provide a new LLM as an override.
257
+
258
+ Args:
259
+ ctx: A `Context` with the required deps type.
260
+ content: The new user message content to append to the message history.
261
+
262
+ Returns:
263
+ A new `ContextResponse` instance generated from the extended message history.
264
+ """
265
+ return self.model.context_resume(
266
+ ctx=ctx,
267
+ response=self,
268
+ content=content,
269
+ )
270
+
271
+
272
+ class AsyncContextResponse(
273
+ BaseResponse[AsyncContextToolkit[DepsT], FormattableT], Generic[DepsT, FormattableT]
274
+ ):
275
+ """The response generated by an LLM from an async context call."""
276
+
277
+ def __init__(
278
+ self,
279
+ *,
280
+ raw: Any, # noqa: ANN401
281
+ provider_id: "ProviderId",
282
+ model_id: "ModelId",
283
+ provider_model_name: str,
284
+ params: "Params",
285
+ tools: AsyncContextTools[DepsT] | None = None,
286
+ format: Format[FormattableT] | None = None,
287
+ input_messages: Sequence[Message],
288
+ assistant_message: AssistantMessage,
289
+ finish_reason: FinishReason | None,
290
+ usage: Usage | None,
291
+ ) -> None:
292
+ """Initialize an `AsyncContextResponse`."""
293
+ toolkit = (
294
+ tools
295
+ if isinstance(tools, AsyncContextToolkit)
296
+ else AsyncContextToolkit(tools=tools)
297
+ )
298
+ super().__init__(
299
+ raw=raw,
300
+ provider_id=provider_id,
301
+ model_id=model_id,
302
+ provider_model_name=provider_model_name,
303
+ params=params,
304
+ toolkit=toolkit,
305
+ format=format,
306
+ input_messages=input_messages,
307
+ assistant_message=assistant_message,
308
+ finish_reason=finish_reason,
309
+ usage=usage,
310
+ )
311
+
312
+ async def execute_tools(
313
+ self, ctx: Context[DepsT]
314
+ ) -> Sequence[ToolOutput[Jsonable]]:
315
+ """Execute and return all of the tool calls in the response.
316
+
317
+ Args:
318
+ ctx: A `Context` with the required deps type.
319
+
320
+ Returns:
321
+ A sequence containing a `ToolOutput` for every tool call in the order they appeared.
322
+
323
+ Raises:
324
+ ToolNotFoundError: If one of the response's tool calls has no matching tool.
325
+ Exception: If one of the tools throws an exception.
326
+ """
327
+ tasks = [self.toolkit.execute(ctx, tool_call) for tool_call in self.tool_calls]
328
+ return await asyncio.gather(*tasks)
329
+
330
+ @overload
331
+ async def resume(
332
+ self: "AsyncContextResponse[DepsT]", ctx: Context[DepsT], content: UserContent
333
+ ) -> "AsyncContextResponse[DepsT]": ...
334
+
335
+ @overload
336
+ async def resume(
337
+ self: "AsyncContextResponse[DepsT, FormattableT]",
338
+ ctx: Context[DepsT],
339
+ content: UserContent,
340
+ ) -> "AsyncContextResponse[DepsT, FormattableT]": ...
341
+
342
+ async def resume(
343
+ self, ctx: Context[DepsT], content: UserContent
344
+ ) -> "AsyncContextResponse[DepsT] | AsyncContextResponse[DepsT, FormattableT]":
345
+ """Generate a new `AsyncContextResponse` using this response's messages with additional user content.
346
+
347
+ Uses this response's tools and format type. Also uses this response's provider,
348
+ model, client, and params, unless the model context manager is being used to
349
+ provide a new LLM as an override.
350
+
351
+ Args:
352
+ ctx: A Context with the required deps type.
353
+ content: The new user message content to append to the message history.
354
+
355
+ Returns:
356
+ A new `AsyncContextResponse` instance generated from the extended message history.
357
+ """
358
+ return await self.model.context_resume_async(
359
+ ctx=ctx,
360
+ response=self,
361
+ content=content,
362
+ )
@@ -0,0 +1,248 @@
1
+ """Base interface for all LLM responses."""
2
+
3
+ from abc import ABC
4
+ from collections.abc import Sequence
5
+ from types import NoneType
6
+ from typing import TYPE_CHECKING, Any, Generic, Literal, TypeAlias, overload
7
+
8
+ from ..content import AssistantContentPart, Text, Thought, ToolCall
9
+ from ..exceptions import ParseError
10
+ from ..formatting import (
11
+ Format,
12
+ FormattableT,
13
+ Partial,
14
+ create_wrapper_model,
15
+ is_output_parser,
16
+ is_primitive_type,
17
+ )
18
+ from ..messages import Message
19
+ from ..tools import ToolkitT
20
+ from . import _utils
21
+ from .finish_reason import FinishReason
22
+ from .usage import Usage
23
+
24
+ if TYPE_CHECKING:
25
+ from ..models import Model, Params
26
+ from ..providers import ModelId, ProviderId
27
+
28
+ AnyResponse: TypeAlias = "RootResponse[Any, Any]"
29
+
30
+
31
+ class RootResponse(Generic[ToolkitT, FormattableT], ABC):
32
+ """Base class for LLM responses."""
33
+
34
+ raw: Any
35
+ """The raw response from the LLM."""
36
+
37
+ provider_id: "ProviderId"
38
+ """The provider that generated this response."""
39
+
40
+ model_id: "ModelId"
41
+ """The model id that generated this response."""
42
+
43
+ params: "Params"
44
+ """The params that were used to generate this response (or None)."""
45
+
46
+ toolkit: ToolkitT
47
+ """The toolkit containing the tools used when generating this response."""
48
+
49
+ messages: list[Message]
50
+ """The message history, including the most recent assistant message."""
51
+
52
+ content: Sequence[AssistantContentPart]
53
+ """The content generated by the LLM."""
54
+
55
+ texts: Sequence[Text]
56
+ """The text content in the generated response, if any."""
57
+
58
+ tool_calls: Sequence[ToolCall]
59
+ """The tools the LLM wants called on its behalf, if any."""
60
+
61
+ thoughts: Sequence[Thought]
62
+ """The readable thoughts from the model's thinking process, if any.
63
+
64
+ The thoughts may be direct output from the model thinking process, or may be a
65
+ generated summary. (This depends on the provider; newer models tend to summarize.)
66
+ """
67
+ finish_reason: FinishReason | None
68
+ """The reason why the LLM finished generating a response, if set.
69
+
70
+ `finish_reason` is only set if the response did not finish generating normally,
71
+ e.g. `FinishReason.MAX_TOKENS` if the model ran out of tokens before completing.
72
+ When the response generates normally, `response.finish_reason` will be `None`.
73
+ """
74
+
75
+ usage: Usage | None
76
+ """Token usage statistics for this response, if available."""
77
+
78
+ format: Format[FormattableT] | None
79
+ """The `Format` describing the structured response format, if available."""
80
+
81
+ @overload
82
+ def parse(self: "RootResponse[ToolkitT, None]", partial: Literal[True]) -> None:
83
+ """Format the response into a `Partial[BaseModel]` (with optional fields).
84
+
85
+ This is useful for when the stream is only partially consumed, in which case the
86
+ structured output may only be partially available.
87
+ """
88
+ ...
89
+
90
+ @overload
91
+ def parse(
92
+ self: "RootResponse[ToolkitT, FormattableT]", partial: Literal[True]
93
+ ) -> Partial[FormattableT]:
94
+ """Format the response into a `Partial[BaseModel]` (with optional fields).
95
+
96
+ This is useful for when the stream is only partially consumed, in which case the
97
+ structured output may only be partially available.
98
+ """
99
+ ...
100
+
101
+ @overload
102
+ def parse(
103
+ self: "RootResponse[ToolkitT, None]", partial: Literal[False] = False
104
+ ) -> None:
105
+ """Overload when the format type is `None`."""
106
+ ...
107
+
108
+ @overload
109
+ def parse(
110
+ self: "RootResponse[ToolkitT, FormattableT]", partial: Literal[False] = False
111
+ ) -> FormattableT:
112
+ """Overload when the format type is not `None`."""
113
+ ...
114
+
115
+ def parse(
116
+ self, partial: bool = False
117
+ ) -> FormattableT | Partial[FormattableT] | None:
118
+ """Format the response according to the response format parser.
119
+
120
+ Args:
121
+ partial: If True, parse incomplete JSON as Partial model. Only works with
122
+ streaming responses that have accumulated JSON. Returns None if JSON
123
+ is not yet available or cannot be parsed.
124
+
125
+ Supports:
126
+ - Pydantic BaseModel types (JSON schema validation)
127
+ - Primitive types (automatically unwrapped from wrapper model)
128
+ - Custom OutputParsers (custom parsing logic)
129
+ - Partial parsing during streaming (when partial=True)
130
+
131
+ Returns:
132
+ The formatted response object of type FormatT. For BaseModel types, returns
133
+ the model instance. For primitive types, returns the unwrapped value (e.g.,
134
+ a string, list, dict, etc.). For OutputParsers, returns whatever the parser
135
+ returns. When partial=True, returns None if JSON is incomplete or unparsable.
136
+
137
+ Raises:
138
+ NotImplementedError: If partial=True with OutputParser.
139
+ ParseError: If parsing fails. The `original_exception` attribute contains the
140
+ underlying error (ValueError for JSON extraction, json.JSONDecodeError
141
+ for invalid JSON, pydantic.ValidationError for schema validation, or
142
+ any exception from a custom OutputParser).
143
+ """
144
+ if self.format is None:
145
+ return None
146
+
147
+ formattable = self.format.formattable
148
+
149
+ if is_output_parser(formattable):
150
+ if partial:
151
+ raise NotImplementedError(
152
+ "parse(partial=True) not supported with OutputParser. "
153
+ "Use BaseModel or primitive types."
154
+ )
155
+ try:
156
+ return formattable(self)
157
+ except Exception as e:
158
+ raise ParseError(
159
+ f"OutputParser failed: {e}",
160
+ original_exception=e,
161
+ ) from e
162
+
163
+ if formattable is None or formattable is NoneType: # pyright: ignore[reportUnnecessaryComparison]
164
+ # note: pyright claims the None comparison is unnecessary, but removing it
165
+ # introduces type errors.
166
+ return None # pragma: no cover
167
+
168
+ text = self.text("")
169
+
170
+ if partial:
171
+ return _utils.parse_partial_json(text, formattable)
172
+ else:
173
+ try:
174
+ json_text = _utils.extract_serialized_json(text)
175
+ if is_primitive_type(formattable):
176
+ wrapper_model = create_wrapper_model(formattable)
177
+ wrapper_instance = wrapper_model.model_validate_json(json_text)
178
+ return wrapper_instance.output
179
+
180
+ return formattable.model_validate_json(json_text)
181
+ except Exception as e:
182
+ raise ParseError(
183
+ f"Failed to parse response: {e}",
184
+ original_exception=e,
185
+ ) from e
186
+
187
+ def text(self, sep: str = "\n") -> str:
188
+ """Return all text content from this response as a single string.
189
+
190
+ Joins the text from all `Text` parts in the response content using the
191
+ specified separator.
192
+
193
+ Args:
194
+ sep: The separator to use when joining multiple text parts.
195
+ Defaults to newline ("\\n").
196
+
197
+ Returns:
198
+ A string containing all text content joined by the separator.
199
+ Returns an empty string if the response contains no text parts.
200
+
201
+ Example:
202
+ >>> response.text() # Join with newlines (default)
203
+ 'Hello\\nWorld'
204
+ >>> response.text(sep=" ") # Join with spaces
205
+ 'Hello World'
206
+ >>> response.text(sep="") # Concatenate directly
207
+ 'HelloWorld'
208
+ """
209
+ return sep.join(text.text for text in self.texts)
210
+
211
+ def pretty(self) -> str:
212
+ """Return a string representation of all response content.
213
+
214
+ The response content will be represented in a way that emphasies clarity and
215
+ readability, but may not include all metadata (like thinking signatures or tool
216
+ call ids), and thus cannot be used to reconstruct the response. For example:
217
+
218
+ **Thinking:**
219
+ The user is asking a math problem. I should use the calculator tool.
220
+
221
+ **Tool Call (calculator)** {'operation': 'mult', 'a': 1337, 'b': 4242}
222
+
223
+ I am going to use the calculator and answer your question for you!
224
+ """
225
+ pretty_parts: list[str] = []
226
+ for part in self.content:
227
+ if isinstance(part, Text):
228
+ pretty_parts.append(part.text)
229
+ elif isinstance(part, ToolCall):
230
+ pretty_parts.append(f"**ToolCall ({part.name}):** {part.args}")
231
+ elif isinstance(part, Thought):
232
+ indented_thinking = "\n".join(
233
+ f" {line}" for line in part.thought.split("\n")
234
+ )
235
+ pretty_parts.append(f"**Thinking:**\n{indented_thinking}")
236
+ else:
237
+ pretty_parts.append(
238
+ f"[{type(part).__name__}: {str(part)}]"
239
+ ) # pragma: no cover
240
+
241
+ return "\n\n".join(pretty_parts)
242
+
243
+ @property
244
+ def model(self) -> "Model":
245
+ """A `Model` with parameters matching this response."""
246
+ from ..models import use_model # Dynamic import to avoid circular dependency
247
+
248
+ return use_model(self.model_id, **self.params)