mirascope 2.0.0__py3-none-any.whl → 2.0.0a1__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 (443) hide show
  1. mirascope/__init__.py +2 -11
  2. mirascope/graphs/__init__.py +22 -0
  3. mirascope/graphs/finite_state_machine.py +625 -0
  4. mirascope/llm/__init__.py +15 -96
  5. mirascope/llm/agents/__init__.py +15 -0
  6. mirascope/llm/agents/agent.py +97 -0
  7. mirascope/llm/agents/agent_template.py +45 -0
  8. mirascope/llm/agents/decorator.py +176 -0
  9. mirascope/llm/calls/__init__.py +1 -2
  10. mirascope/llm/calls/base_call.py +33 -0
  11. mirascope/llm/calls/calls.py +58 -84
  12. mirascope/llm/calls/decorator.py +120 -140
  13. mirascope/llm/clients/__init__.py +34 -0
  14. mirascope/llm/clients/_missing_import_stubs.py +47 -0
  15. mirascope/llm/clients/anthropic/__init__.py +25 -0
  16. mirascope/llm/{providers/openai/completions → clients/anthropic}/_utils/__init__.py +0 -2
  17. mirascope/llm/{providers → clients}/anthropic/_utils/decode.py +22 -66
  18. mirascope/llm/clients/anthropic/_utils/encode.py +243 -0
  19. mirascope/llm/clients/anthropic/clients.py +819 -0
  20. mirascope/llm/clients/anthropic/model_ids.py +8 -0
  21. mirascope/llm/{providers → clients}/base/__init__.py +5 -4
  22. mirascope/llm/{providers → clients}/base/_utils.py +17 -78
  23. mirascope/llm/{providers/base/base_provider.py → clients/base/client.py} +145 -468
  24. mirascope/llm/{models → clients/base}/params.py +37 -16
  25. mirascope/llm/clients/google/__init__.py +20 -0
  26. mirascope/llm/{providers/openai/responses → clients/google}/_utils/__init__.py +0 -2
  27. mirascope/llm/{providers → clients}/google/_utils/decode.py +22 -98
  28. mirascope/llm/{providers → clients}/google/_utils/encode.py +46 -168
  29. mirascope/llm/clients/google/clients.py +853 -0
  30. mirascope/llm/clients/google/model_ids.py +15 -0
  31. mirascope/llm/clients/openai/__init__.py +25 -0
  32. mirascope/llm/clients/openai/completions/__init__.py +28 -0
  33. mirascope/llm/{providers/google → clients/openai/completions}/_utils/__init__.py +0 -4
  34. mirascope/llm/{providers → clients}/openai/completions/_utils/decode.py +9 -74
  35. mirascope/llm/{providers → clients}/openai/completions/_utils/encode.py +52 -70
  36. mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
  37. mirascope/llm/clients/openai/completions/clients.py +833 -0
  38. mirascope/llm/clients/openai/completions/model_ids.py +8 -0
  39. mirascope/llm/clients/openai/responses/__init__.py +26 -0
  40. mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
  41. mirascope/llm/{providers → clients}/openai/responses/_utils/decode.py +14 -80
  42. mirascope/llm/{providers → clients}/openai/responses/_utils/encode.py +41 -92
  43. mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
  44. mirascope/llm/clients/openai/responses/clients.py +832 -0
  45. mirascope/llm/clients/openai/responses/model_ids.py +8 -0
  46. mirascope/llm/clients/openai/shared/__init__.py +7 -0
  47. mirascope/llm/clients/openai/shared/_utils.py +55 -0
  48. mirascope/llm/clients/providers.py +175 -0
  49. mirascope/llm/content/__init__.py +2 -3
  50. mirascope/llm/content/tool_call.py +0 -6
  51. mirascope/llm/content/tool_output.py +5 -22
  52. mirascope/llm/context/_utils.py +6 -19
  53. mirascope/llm/exceptions.py +43 -298
  54. mirascope/llm/formatting/__init__.py +2 -19
  55. mirascope/llm/formatting/_utils.py +74 -0
  56. mirascope/llm/formatting/format.py +30 -219
  57. mirascope/llm/formatting/from_call_args.py +2 -2
  58. mirascope/llm/formatting/partial.py +7 -80
  59. mirascope/llm/formatting/types.py +64 -21
  60. mirascope/llm/mcp/__init__.py +2 -2
  61. mirascope/llm/mcp/client.py +118 -0
  62. mirascope/llm/messages/__init__.py +0 -3
  63. mirascope/llm/messages/message.py +5 -13
  64. mirascope/llm/models/__init__.py +2 -7
  65. mirascope/llm/models/models.py +139 -315
  66. mirascope/llm/prompts/__init__.py +12 -13
  67. mirascope/llm/prompts/_utils.py +43 -14
  68. mirascope/llm/prompts/decorator.py +204 -144
  69. mirascope/llm/prompts/protocols.py +59 -25
  70. mirascope/llm/responses/__init__.py +1 -9
  71. mirascope/llm/responses/_utils.py +12 -102
  72. mirascope/llm/responses/base_response.py +6 -18
  73. mirascope/llm/responses/base_stream_response.py +50 -173
  74. mirascope/llm/responses/finish_reason.py +0 -1
  75. mirascope/llm/responses/response.py +13 -34
  76. mirascope/llm/responses/root_response.py +29 -100
  77. mirascope/llm/responses/stream_response.py +31 -40
  78. mirascope/llm/tools/__init__.py +2 -9
  79. mirascope/llm/tools/_utils.py +3 -12
  80. mirascope/llm/tools/decorator.py +16 -25
  81. mirascope/llm/tools/protocols.py +4 -4
  82. mirascope/llm/tools/tool_schema.py +19 -87
  83. mirascope/llm/tools/toolkit.py +27 -35
  84. mirascope/llm/tools/tools.py +41 -135
  85. {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/METADATA +13 -90
  86. mirascope-2.0.0a1.dist-info/RECORD +102 -0
  87. {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/WHEEL +1 -1
  88. {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/licenses/LICENSE +1 -1
  89. mirascope/_stubs.py +0 -363
  90. mirascope/api/__init__.py +0 -14
  91. mirascope/api/_generated/README.md +0 -207
  92. mirascope/api/_generated/__init__.py +0 -440
  93. mirascope/api/_generated/annotations/__init__.py +0 -33
  94. mirascope/api/_generated/annotations/client.py +0 -506
  95. mirascope/api/_generated/annotations/raw_client.py +0 -1414
  96. mirascope/api/_generated/annotations/types/__init__.py +0 -31
  97. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +0 -5
  98. mirascope/api/_generated/annotations/types/annotations_create_response.py +0 -48
  99. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +0 -5
  100. mirascope/api/_generated/annotations/types/annotations_get_response.py +0 -48
  101. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +0 -5
  102. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +0 -5
  103. mirascope/api/_generated/annotations/types/annotations_list_response.py +0 -21
  104. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +0 -50
  105. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +0 -5
  106. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +0 -5
  107. mirascope/api/_generated/annotations/types/annotations_update_response.py +0 -48
  108. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +0 -5
  109. mirascope/api/_generated/api_keys/__init__.py +0 -17
  110. mirascope/api/_generated/api_keys/client.py +0 -530
  111. mirascope/api/_generated/api_keys/raw_client.py +0 -1236
  112. mirascope/api/_generated/api_keys/types/__init__.py +0 -15
  113. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +0 -28
  114. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +0 -27
  115. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +0 -40
  116. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +0 -27
  117. mirascope/api/_generated/client.py +0 -211
  118. mirascope/api/_generated/core/__init__.py +0 -52
  119. mirascope/api/_generated/core/api_error.py +0 -23
  120. mirascope/api/_generated/core/client_wrapper.py +0 -46
  121. mirascope/api/_generated/core/datetime_utils.py +0 -28
  122. mirascope/api/_generated/core/file.py +0 -67
  123. mirascope/api/_generated/core/force_multipart.py +0 -16
  124. mirascope/api/_generated/core/http_client.py +0 -543
  125. mirascope/api/_generated/core/http_response.py +0 -55
  126. mirascope/api/_generated/core/jsonable_encoder.py +0 -100
  127. mirascope/api/_generated/core/pydantic_utilities.py +0 -255
  128. mirascope/api/_generated/core/query_encoder.py +0 -58
  129. mirascope/api/_generated/core/remove_none_from_dict.py +0 -11
  130. mirascope/api/_generated/core/request_options.py +0 -35
  131. mirascope/api/_generated/core/serialization.py +0 -276
  132. mirascope/api/_generated/docs/__init__.py +0 -4
  133. mirascope/api/_generated/docs/client.py +0 -91
  134. mirascope/api/_generated/docs/raw_client.py +0 -178
  135. mirascope/api/_generated/environment.py +0 -9
  136. mirascope/api/_generated/environments/__init__.py +0 -23
  137. mirascope/api/_generated/environments/client.py +0 -649
  138. mirascope/api/_generated/environments/raw_client.py +0 -1567
  139. mirascope/api/_generated/environments/types/__init__.py +0 -25
  140. mirascope/api/_generated/environments/types/environments_create_response.py +0 -24
  141. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +0 -60
  142. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +0 -24
  143. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +0 -22
  144. mirascope/api/_generated/environments/types/environments_get_response.py +0 -24
  145. mirascope/api/_generated/environments/types/environments_list_response_item.py +0 -24
  146. mirascope/api/_generated/environments/types/environments_update_response.py +0 -24
  147. mirascope/api/_generated/errors/__init__.py +0 -25
  148. mirascope/api/_generated/errors/bad_request_error.py +0 -14
  149. mirascope/api/_generated/errors/conflict_error.py +0 -14
  150. mirascope/api/_generated/errors/forbidden_error.py +0 -11
  151. mirascope/api/_generated/errors/internal_server_error.py +0 -10
  152. mirascope/api/_generated/errors/not_found_error.py +0 -11
  153. mirascope/api/_generated/errors/payment_required_error.py +0 -15
  154. mirascope/api/_generated/errors/service_unavailable_error.py +0 -14
  155. mirascope/api/_generated/errors/too_many_requests_error.py +0 -15
  156. mirascope/api/_generated/errors/unauthorized_error.py +0 -11
  157. mirascope/api/_generated/functions/__init__.py +0 -39
  158. mirascope/api/_generated/functions/client.py +0 -647
  159. mirascope/api/_generated/functions/raw_client.py +0 -1890
  160. mirascope/api/_generated/functions/types/__init__.py +0 -53
  161. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +0 -20
  162. mirascope/api/_generated/functions/types/functions_create_response.py +0 -37
  163. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +0 -20
  164. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +0 -39
  165. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +0 -20
  166. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +0 -53
  167. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +0 -22
  168. mirascope/api/_generated/functions/types/functions_get_response.py +0 -37
  169. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +0 -20
  170. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +0 -25
  171. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +0 -56
  172. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +0 -22
  173. mirascope/api/_generated/functions/types/functions_list_response.py +0 -21
  174. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +0 -41
  175. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +0 -20
  176. mirascope/api/_generated/health/__init__.py +0 -7
  177. mirascope/api/_generated/health/client.py +0 -92
  178. mirascope/api/_generated/health/raw_client.py +0 -175
  179. mirascope/api/_generated/health/types/__init__.py +0 -8
  180. mirascope/api/_generated/health/types/health_check_response.py +0 -22
  181. mirascope/api/_generated/health/types/health_check_response_status.py +0 -5
  182. mirascope/api/_generated/organization_invitations/__init__.py +0 -33
  183. mirascope/api/_generated/organization_invitations/client.py +0 -546
  184. mirascope/api/_generated/organization_invitations/raw_client.py +0 -1519
  185. mirascope/api/_generated/organization_invitations/types/__init__.py +0 -53
  186. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +0 -34
  187. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +0 -7
  188. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +0 -7
  189. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +0 -48
  190. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +0 -7
  191. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +0 -7
  192. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +0 -48
  193. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +0 -7
  194. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +0 -7
  195. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +0 -48
  196. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +0 -7
  197. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +0 -7
  198. mirascope/api/_generated/organization_memberships/__init__.py +0 -19
  199. mirascope/api/_generated/organization_memberships/client.py +0 -302
  200. mirascope/api/_generated/organization_memberships/raw_client.py +0 -736
  201. mirascope/api/_generated/organization_memberships/types/__init__.py +0 -27
  202. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +0 -33
  203. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +0 -7
  204. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +0 -7
  205. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +0 -31
  206. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +0 -7
  207. mirascope/api/_generated/organizations/__init__.py +0 -51
  208. mirascope/api/_generated/organizations/client.py +0 -869
  209. mirascope/api/_generated/organizations/raw_client.py +0 -2593
  210. mirascope/api/_generated/organizations/types/__init__.py +0 -71
  211. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +0 -24
  212. mirascope/api/_generated/organizations/types/organizations_create_response.py +0 -26
  213. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +0 -5
  214. mirascope/api/_generated/organizations/types/organizations_get_response.py +0 -26
  215. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +0 -5
  216. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +0 -26
  217. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +0 -5
  218. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +0 -7
  219. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +0 -47
  220. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +0 -33
  221. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +0 -7
  222. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +0 -24
  223. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +0 -53
  224. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +0 -7
  225. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +0 -26
  226. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +0 -34
  227. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +0 -7
  228. mirascope/api/_generated/organizations/types/organizations_update_response.py +0 -26
  229. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +0 -5
  230. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +0 -7
  231. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +0 -35
  232. mirascope/api/_generated/project_memberships/__init__.py +0 -25
  233. mirascope/api/_generated/project_memberships/client.py +0 -437
  234. mirascope/api/_generated/project_memberships/raw_client.py +0 -1039
  235. mirascope/api/_generated/project_memberships/types/__init__.py +0 -29
  236. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +0 -7
  237. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +0 -35
  238. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +0 -7
  239. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +0 -33
  240. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +0 -7
  241. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +0 -7
  242. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +0 -35
  243. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +0 -7
  244. mirascope/api/_generated/projects/__init__.py +0 -7
  245. mirascope/api/_generated/projects/client.py +0 -428
  246. mirascope/api/_generated/projects/raw_client.py +0 -1302
  247. mirascope/api/_generated/projects/types/__init__.py +0 -10
  248. mirascope/api/_generated/projects/types/projects_create_response.py +0 -25
  249. mirascope/api/_generated/projects/types/projects_get_response.py +0 -25
  250. mirascope/api/_generated/projects/types/projects_list_response_item.py +0 -25
  251. mirascope/api/_generated/projects/types/projects_update_response.py +0 -25
  252. mirascope/api/_generated/reference.md +0 -4915
  253. mirascope/api/_generated/tags/__init__.py +0 -19
  254. mirascope/api/_generated/tags/client.py +0 -504
  255. mirascope/api/_generated/tags/raw_client.py +0 -1288
  256. mirascope/api/_generated/tags/types/__init__.py +0 -17
  257. mirascope/api/_generated/tags/types/tags_create_response.py +0 -41
  258. mirascope/api/_generated/tags/types/tags_get_response.py +0 -41
  259. mirascope/api/_generated/tags/types/tags_list_response.py +0 -23
  260. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +0 -41
  261. mirascope/api/_generated/tags/types/tags_update_response.py +0 -41
  262. mirascope/api/_generated/token_cost/__init__.py +0 -7
  263. mirascope/api/_generated/token_cost/client.py +0 -160
  264. mirascope/api/_generated/token_cost/raw_client.py +0 -264
  265. mirascope/api/_generated/token_cost/types/__init__.py +0 -8
  266. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +0 -54
  267. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +0 -52
  268. mirascope/api/_generated/traces/__init__.py +0 -97
  269. mirascope/api/_generated/traces/client.py +0 -1103
  270. mirascope/api/_generated/traces/raw_client.py +0 -2322
  271. mirascope/api/_generated/traces/types/__init__.py +0 -155
  272. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +0 -29
  273. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +0 -27
  274. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +0 -23
  275. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +0 -38
  276. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +0 -19
  277. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +0 -22
  278. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +0 -20
  279. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +0 -29
  280. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +0 -31
  281. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +0 -23
  282. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +0 -38
  283. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +0 -19
  284. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +0 -22
  285. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +0 -22
  286. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +0 -48
  287. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +0 -23
  288. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +0 -38
  289. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +0 -19
  290. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +0 -24
  291. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +0 -22
  292. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +0 -20
  293. mirascope/api/_generated/traces/types/traces_create_response.py +0 -24
  294. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +0 -22
  295. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +0 -60
  296. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +0 -24
  297. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +0 -22
  298. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +0 -33
  299. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +0 -88
  300. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +0 -33
  301. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +0 -88
  302. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +0 -25
  303. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +0 -44
  304. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +0 -26
  305. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +0 -7
  306. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +0 -7
  307. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +0 -7
  308. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +0 -26
  309. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +0 -50
  310. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +0 -26
  311. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +0 -7
  312. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +0 -7
  313. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +0 -5
  314. mirascope/api/_generated/traces/types/traces_search_response.py +0 -26
  315. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +0 -50
  316. mirascope/api/_generated/types/__init__.py +0 -85
  317. mirascope/api/_generated/types/already_exists_error.py +0 -22
  318. mirascope/api/_generated/types/already_exists_error_tag.py +0 -5
  319. mirascope/api/_generated/types/bad_request_error_body.py +0 -50
  320. mirascope/api/_generated/types/click_house_error.py +0 -22
  321. mirascope/api/_generated/types/database_error.py +0 -22
  322. mirascope/api/_generated/types/database_error_tag.py +0 -5
  323. mirascope/api/_generated/types/date.py +0 -3
  324. mirascope/api/_generated/types/http_api_decode_error.py +0 -27
  325. mirascope/api/_generated/types/http_api_decode_error_tag.py +0 -5
  326. mirascope/api/_generated/types/immutable_resource_error.py +0 -22
  327. mirascope/api/_generated/types/internal_server_error_body.py +0 -49
  328. mirascope/api/_generated/types/issue.py +0 -38
  329. mirascope/api/_generated/types/issue_tag.py +0 -10
  330. mirascope/api/_generated/types/not_found_error_body.py +0 -22
  331. mirascope/api/_generated/types/not_found_error_tag.py +0 -5
  332. mirascope/api/_generated/types/number_from_string.py +0 -3
  333. mirascope/api/_generated/types/permission_denied_error.py +0 -22
  334. mirascope/api/_generated/types/permission_denied_error_tag.py +0 -5
  335. mirascope/api/_generated/types/plan_limit_exceeded_error.py +0 -32
  336. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +0 -7
  337. mirascope/api/_generated/types/pricing_unavailable_error.py +0 -23
  338. mirascope/api/_generated/types/property_key.py +0 -7
  339. mirascope/api/_generated/types/property_key_key.py +0 -25
  340. mirascope/api/_generated/types/property_key_key_tag.py +0 -5
  341. mirascope/api/_generated/types/rate_limit_error.py +0 -31
  342. mirascope/api/_generated/types/rate_limit_error_tag.py +0 -5
  343. mirascope/api/_generated/types/service_unavailable_error_body.py +0 -24
  344. mirascope/api/_generated/types/service_unavailable_error_tag.py +0 -7
  345. mirascope/api/_generated/types/stripe_error.py +0 -20
  346. mirascope/api/_generated/types/subscription_past_due_error.py +0 -31
  347. mirascope/api/_generated/types/subscription_past_due_error_tag.py +0 -7
  348. mirascope/api/_generated/types/unauthorized_error_body.py +0 -21
  349. mirascope/api/_generated/types/unauthorized_error_tag.py +0 -5
  350. mirascope/api/client.py +0 -255
  351. mirascope/api/settings.py +0 -99
  352. mirascope/llm/formatting/output_parser.py +0 -178
  353. mirascope/llm/formatting/primitives.py +0 -192
  354. mirascope/llm/mcp/mcp_client.py +0 -130
  355. mirascope/llm/messages/_utils.py +0 -34
  356. mirascope/llm/models/thinking_config.py +0 -61
  357. mirascope/llm/prompts/prompts.py +0 -487
  358. mirascope/llm/providers/__init__.py +0 -62
  359. mirascope/llm/providers/anthropic/__init__.py +0 -11
  360. mirascope/llm/providers/anthropic/_utils/__init__.py +0 -27
  361. mirascope/llm/providers/anthropic/_utils/beta_decode.py +0 -282
  362. mirascope/llm/providers/anthropic/_utils/beta_encode.py +0 -266
  363. mirascope/llm/providers/anthropic/_utils/encode.py +0 -418
  364. mirascope/llm/providers/anthropic/_utils/errors.py +0 -46
  365. mirascope/llm/providers/anthropic/beta_provider.py +0 -374
  366. mirascope/llm/providers/anthropic/model_id.py +0 -23
  367. mirascope/llm/providers/anthropic/model_info.py +0 -87
  368. mirascope/llm/providers/anthropic/provider.py +0 -479
  369. mirascope/llm/providers/google/__init__.py +0 -6
  370. mirascope/llm/providers/google/_utils/errors.py +0 -50
  371. mirascope/llm/providers/google/model_id.py +0 -22
  372. mirascope/llm/providers/google/model_info.py +0 -63
  373. mirascope/llm/providers/google/provider.py +0 -492
  374. mirascope/llm/providers/mirascope/__init__.py +0 -5
  375. mirascope/llm/providers/mirascope/_utils.py +0 -73
  376. mirascope/llm/providers/mirascope/provider.py +0 -349
  377. mirascope/llm/providers/mlx/__init__.py +0 -9
  378. mirascope/llm/providers/mlx/_utils.py +0 -141
  379. mirascope/llm/providers/mlx/encoding/__init__.py +0 -8
  380. mirascope/llm/providers/mlx/encoding/base.py +0 -72
  381. mirascope/llm/providers/mlx/encoding/transformers.py +0 -150
  382. mirascope/llm/providers/mlx/mlx.py +0 -254
  383. mirascope/llm/providers/mlx/model_id.py +0 -17
  384. mirascope/llm/providers/mlx/provider.py +0 -452
  385. mirascope/llm/providers/model_id.py +0 -16
  386. mirascope/llm/providers/ollama/__init__.py +0 -7
  387. mirascope/llm/providers/ollama/provider.py +0 -71
  388. mirascope/llm/providers/openai/__init__.py +0 -15
  389. mirascope/llm/providers/openai/_utils/__init__.py +0 -5
  390. mirascope/llm/providers/openai/_utils/errors.py +0 -46
  391. mirascope/llm/providers/openai/completions/__init__.py +0 -7
  392. mirascope/llm/providers/openai/completions/base_provider.py +0 -542
  393. mirascope/llm/providers/openai/completions/provider.py +0 -22
  394. mirascope/llm/providers/openai/model_id.py +0 -31
  395. mirascope/llm/providers/openai/model_info.py +0 -303
  396. mirascope/llm/providers/openai/provider.py +0 -441
  397. mirascope/llm/providers/openai/responses/__init__.py +0 -5
  398. mirascope/llm/providers/openai/responses/provider.py +0 -513
  399. mirascope/llm/providers/provider_id.py +0 -24
  400. mirascope/llm/providers/provider_registry.py +0 -299
  401. mirascope/llm/providers/together/__init__.py +0 -7
  402. mirascope/llm/providers/together/provider.py +0 -40
  403. mirascope/llm/responses/usage.py +0 -95
  404. mirascope/ops/__init__.py +0 -111
  405. mirascope/ops/_internal/__init__.py +0 -5
  406. mirascope/ops/_internal/closure.py +0 -1169
  407. mirascope/ops/_internal/configuration.py +0 -177
  408. mirascope/ops/_internal/context.py +0 -76
  409. mirascope/ops/_internal/exporters/__init__.py +0 -26
  410. mirascope/ops/_internal/exporters/exporters.py +0 -395
  411. mirascope/ops/_internal/exporters/processors.py +0 -104
  412. mirascope/ops/_internal/exporters/types.py +0 -165
  413. mirascope/ops/_internal/exporters/utils.py +0 -29
  414. mirascope/ops/_internal/instrumentation/__init__.py +0 -8
  415. mirascope/ops/_internal/instrumentation/llm/__init__.py +0 -8
  416. mirascope/ops/_internal/instrumentation/llm/common.py +0 -530
  417. mirascope/ops/_internal/instrumentation/llm/cost.py +0 -190
  418. mirascope/ops/_internal/instrumentation/llm/encode.py +0 -238
  419. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +0 -38
  420. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +0 -31
  421. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +0 -38
  422. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +0 -18
  423. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +0 -100
  424. mirascope/ops/_internal/instrumentation/llm/llm.py +0 -161
  425. mirascope/ops/_internal/instrumentation/llm/model.py +0 -1798
  426. mirascope/ops/_internal/instrumentation/llm/response.py +0 -521
  427. mirascope/ops/_internal/instrumentation/llm/serialize.py +0 -300
  428. mirascope/ops/_internal/propagation.py +0 -198
  429. mirascope/ops/_internal/protocols.py +0 -133
  430. mirascope/ops/_internal/session.py +0 -139
  431. mirascope/ops/_internal/spans.py +0 -232
  432. mirascope/ops/_internal/traced_calls.py +0 -375
  433. mirascope/ops/_internal/traced_functions.py +0 -523
  434. mirascope/ops/_internal/tracing.py +0 -353
  435. mirascope/ops/_internal/types.py +0 -13
  436. mirascope/ops/_internal/utils.py +0 -123
  437. mirascope/ops/_internal/versioned_calls.py +0 -512
  438. mirascope/ops/_internal/versioned_functions.py +0 -357
  439. mirascope/ops/_internal/versioning.py +0 -303
  440. mirascope/ops/exceptions.py +0 -21
  441. mirascope-2.0.0.dist-info/RECORD +0 -423
  442. /mirascope/llm/{providers → clients}/base/kwargs.py +0 -0
  443. /mirascope/llm/{providers → clients}/google/message.py +0 -0
@@ -18,14 +18,11 @@ from ..tools import (
18
18
  Tool,
19
19
  Toolkit,
20
20
  )
21
- from ..types import Jsonable
22
21
  from .base_response import BaseResponse
23
22
  from .finish_reason import FinishReason
24
- from .usage import Usage
25
23
 
26
24
  if TYPE_CHECKING:
27
- from ..models import Params
28
- from ..providers import ModelId, ProviderId
25
+ from ..clients import ModelId, Params, Provider
29
26
 
30
27
 
31
28
  class Response(BaseResponse[Toolkit, FormattableT]):
@@ -35,34 +32,30 @@ class Response(BaseResponse[Toolkit, FormattableT]):
35
32
  self,
36
33
  *,
37
34
  raw: Any, # noqa: ANN401
38
- provider_id: "ProviderId",
35
+ provider: "Provider",
39
36
  model_id: "ModelId",
40
- provider_model_name: str,
41
37
  params: "Params",
42
38
  tools: Sequence[Tool] | Toolkit | None = None,
43
39
  format: Format[FormattableT] | None = None,
44
40
  input_messages: Sequence[Message],
45
41
  assistant_message: AssistantMessage,
46
42
  finish_reason: FinishReason | None,
47
- usage: Usage | None,
48
43
  ) -> None:
49
44
  """Initialize a `Response`."""
50
45
  toolkit = tools if isinstance(tools, Toolkit) else Toolkit(tools=tools)
51
46
  super().__init__(
52
47
  raw=raw,
53
- provider_id=provider_id,
48
+ provider=provider,
54
49
  model_id=model_id,
55
- provider_model_name=provider_model_name,
56
50
  params=params,
57
51
  toolkit=toolkit,
58
52
  format=format,
59
53
  input_messages=input_messages,
60
54
  assistant_message=assistant_message,
61
55
  finish_reason=finish_reason,
62
- usage=usage,
63
56
  )
64
57
 
65
- def execute_tools(self) -> Sequence[ToolOutput[Jsonable]]:
58
+ def execute_tools(self) -> Sequence[ToolOutput]:
66
59
  """Execute and return all of the tool calls in the response.
67
60
 
68
61
  Returns:
@@ -108,16 +101,14 @@ class AsyncResponse(BaseResponse[AsyncToolkit, FormattableT]):
108
101
  self,
109
102
  *,
110
103
  raw: Any, # noqa: ANN401
111
- provider_id: "ProviderId",
104
+ provider: "Provider",
112
105
  model_id: "ModelId",
113
- provider_model_name: str,
114
106
  params: "Params",
115
107
  tools: Sequence[AsyncTool] | AsyncToolkit | None = None,
116
108
  format: Format[FormattableT] | None = None,
117
109
  input_messages: Sequence[Message],
118
110
  assistant_message: AssistantMessage,
119
111
  finish_reason: FinishReason | None,
120
- usage: Usage | None,
121
112
  ) -> None:
122
113
  """Initialize an `AsyncResponse`."""
123
114
  toolkit = (
@@ -125,19 +116,17 @@ class AsyncResponse(BaseResponse[AsyncToolkit, FormattableT]):
125
116
  )
126
117
  super().__init__(
127
118
  raw=raw,
128
- provider_id=provider_id,
119
+ provider=provider,
129
120
  model_id=model_id,
130
- provider_model_name=provider_model_name,
131
121
  params=params,
132
122
  toolkit=toolkit,
133
123
  format=format,
134
124
  input_messages=input_messages,
135
125
  assistant_message=assistant_message,
136
126
  finish_reason=finish_reason,
137
- usage=usage,
138
127
  )
139
128
 
140
- async def execute_tools(self) -> Sequence[ToolOutput[Jsonable]]:
129
+ async def execute_tools(self) -> Sequence[ToolOutput]:
141
130
  """Execute and return all of the tool calls in the response.
142
131
 
143
132
  Returns:
@@ -190,9 +179,8 @@ class ContextResponse(
190
179
  self,
191
180
  *,
192
181
  raw: Any, # noqa: ANN401
193
- provider_id: "ProviderId",
182
+ provider: "Provider",
194
183
  model_id: "ModelId",
195
- provider_model_name: str,
196
184
  params: "Params",
197
185
  tools: Sequence[Tool | ContextTool[DepsT]]
198
186
  | ContextToolkit[DepsT]
@@ -201,7 +189,6 @@ class ContextResponse(
201
189
  input_messages: Sequence[Message],
202
190
  assistant_message: AssistantMessage,
203
191
  finish_reason: FinishReason | None,
204
- usage: Usage | None,
205
192
  ) -> None:
206
193
  """Initialize a `ContextResponse`."""
207
194
  toolkit = (
@@ -209,19 +196,17 @@ class ContextResponse(
209
196
  )
210
197
  super().__init__(
211
198
  raw=raw,
212
- provider_id=provider_id,
199
+ provider=provider,
213
200
  model_id=model_id,
214
- provider_model_name=provider_model_name,
215
201
  params=params,
216
202
  toolkit=toolkit,
217
203
  format=format,
218
204
  input_messages=input_messages,
219
205
  assistant_message=assistant_message,
220
206
  finish_reason=finish_reason,
221
- usage=usage,
222
207
  )
223
208
 
224
- def execute_tools(self, ctx: Context[DepsT]) -> Sequence[ToolOutput[Jsonable]]:
209
+ def execute_tools(self, ctx: Context[DepsT]) -> Sequence[ToolOutput]:
225
210
  """Execute and return all of the tool calls in the response.
226
211
 
227
212
  Args:
@@ -280,9 +265,8 @@ class AsyncContextResponse(
280
265
  self,
281
266
  *,
282
267
  raw: Any, # noqa: ANN401
283
- provider_id: "ProviderId",
268
+ provider: "Provider",
284
269
  model_id: "ModelId",
285
- provider_model_name: str,
286
270
  params: "Params",
287
271
  tools: Sequence[AsyncTool | AsyncContextTool[DepsT]]
288
272
  | AsyncContextToolkit[DepsT]
@@ -291,7 +275,6 @@ class AsyncContextResponse(
291
275
  input_messages: Sequence[Message],
292
276
  assistant_message: AssistantMessage,
293
277
  finish_reason: FinishReason | None,
294
- usage: Usage | None,
295
278
  ) -> None:
296
279
  """Initialize an `AsyncContextResponse`."""
297
280
  toolkit = (
@@ -301,21 +284,17 @@ class AsyncContextResponse(
301
284
  )
302
285
  super().__init__(
303
286
  raw=raw,
304
- provider_id=provider_id,
287
+ provider=provider,
305
288
  model_id=model_id,
306
- provider_model_name=provider_model_name,
307
289
  params=params,
308
290
  toolkit=toolkit,
309
291
  format=format,
310
292
  input_messages=input_messages,
311
293
  assistant_message=assistant_message,
312
294
  finish_reason=finish_reason,
313
- usage=usage,
314
295
  )
315
296
 
316
- async def execute_tools(
317
- self, ctx: Context[DepsT]
318
- ) -> Sequence[ToolOutput[Jsonable]]:
297
+ async def execute_tools(self, ctx: Context[DepsT]) -> Sequence[ToolOutput]:
319
298
  """Execute and return all of the tool calls in the response.
320
299
 
321
300
  Args:
@@ -3,29 +3,18 @@
3
3
  from abc import ABC
4
4
  from collections.abc import Sequence
5
5
  from types import NoneType
6
- from typing import TYPE_CHECKING, Any, Generic, Literal, TypeAlias, overload
6
+ from typing import TYPE_CHECKING, Any, Generic, Literal, overload
7
7
 
8
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
- )
9
+ from ..formatting import Format, FormattableT, Partial
18
10
  from ..messages import Message
19
11
  from ..tools import ToolkitT
20
12
  from . import _utils
21
13
  from .finish_reason import FinishReason
22
- from .usage import Usage
23
14
 
24
15
  if TYPE_CHECKING:
25
- from ..models import Model, Params
26
- from ..providers import ModelId, ProviderId
27
-
28
- AnyResponse: TypeAlias = "RootResponse[Any, Any]"
16
+ from ..clients import ModelId, Params, Provider
17
+ from ..models import Model
29
18
 
30
19
 
31
20
  class RootResponse(Generic[ToolkitT, FormattableT], ABC):
@@ -34,7 +23,7 @@ class RootResponse(Generic[ToolkitT, FormattableT], ABC):
34
23
  raw: Any
35
24
  """The raw response from the LLM."""
36
25
 
37
- provider_id: "ProviderId"
26
+ provider: "Provider"
38
27
  """The provider that generated this response."""
39
28
 
40
29
  model_id: "ModelId"
@@ -66,15 +55,12 @@ class RootResponse(Generic[ToolkitT, FormattableT], ABC):
66
55
  """
67
56
  finish_reason: FinishReason | None
68
57
  """The reason why the LLM finished generating a response, if set.
69
-
58
+
70
59
  `finish_reason` is only set if the response did not finish generating normally,
71
60
  e.g. `FinishReason.MAX_TOKENS` if the model ran out of tokens before completing.
72
61
  When the response generates normally, `response.finish_reason` will be `None`.
73
62
  """
74
63
 
75
- usage: Usage | None
76
- """Token usage statistics for this response, if available."""
77
-
78
64
  format: Format[FormattableT] | None
79
65
  """The `Format` describing the structured response format, if available."""
80
66
 
@@ -117,96 +103,29 @@ class RootResponse(Generic[ToolkitT, FormattableT], ABC):
117
103
  ) -> FormattableT | Partial[FormattableT] | None:
118
104
  """Format the response according to the response format parser.
119
105
 
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
106
  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.
107
+ The formatted response object of type FormatT.
136
108
 
137
109
  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).
110
+ json.JSONDecodeError: If the response's textual content can't be parsed as
111
+ JSON.
112
+ pydantic.ValidationError: If the response's content fails validation for the
113
+ format type.
143
114
  """
144
115
  if self.format is None:
145
116
  return None
146
117
 
147
118
  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.
119
+ if formattable is None or formattable is NoneType:
166
120
  return None # pragma: no cover
167
121
 
168
- text = self.text("")
169
-
170
122
  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").
123
+ raise NotImplementedError
196
124
 
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)
125
+ text = "".join(text.text for text in self.texts)
126
+ json_text = _utils.extract_serialized_json(text)
127
+
128
+ return formattable.model_validate_json(json_text)
210
129
 
211
130
  def pretty(self) -> str:
212
131
  """Return a string representation of all response content.
@@ -222,6 +141,9 @@ class RootResponse(Generic[ToolkitT, FormattableT], ABC):
222
141
 
223
142
  I am going to use the calculator and answer your question for you!
224
143
  """
144
+ if not self.content:
145
+ return "**[No Content]**"
146
+
225
147
  pretty_parts: list[str] = []
226
148
  for part in self.content:
227
149
  if isinstance(part, Text):
@@ -243,6 +165,13 @@ class RootResponse(Generic[ToolkitT, FormattableT], ABC):
243
165
  @property
244
166
  def model(self) -> "Model":
245
167
  """A `Model` with parameters matching this response."""
246
- from ..models import use_model # Dynamic import to avoid circular dependency
168
+ from ..models import Model, get_model_from_context
169
+
170
+ if context_model := get_model_from_context():
171
+ return context_model
247
172
 
248
- return use_model(self.model_id, **self.params)
173
+ return Model(
174
+ provider=self.provider,
175
+ model_id=self.model_id,
176
+ **self.params,
177
+ )
@@ -18,7 +18,6 @@ from ..tools import (
18
18
  Tool,
19
19
  Toolkit,
20
20
  )
21
- from ..types import Jsonable
22
21
  from .base_stream_response import (
23
22
  AsyncChunkIterator,
24
23
  BaseAsyncStreamResponse,
@@ -27,8 +26,7 @@ from .base_stream_response import (
27
26
  )
28
27
 
29
28
  if TYPE_CHECKING:
30
- from ..models import Params
31
- from ..providers import ModelId, ProviderId
29
+ from ..clients import ModelId, Params, Provider
32
30
 
33
31
 
34
32
  class StreamResponse(BaseSyncStreamResponse[Toolkit, FormattableT]):
@@ -78,25 +76,25 @@ class StreamResponse(BaseSyncStreamResponse[Toolkit, FormattableT]):
78
76
  from mirascope import llm
79
77
 
80
78
  @llm.call(
81
- provider_id="openai",
82
- model_id="openai/gpt-5-mini",
79
+ provider="openai:completions",
80
+ model_id="gpt-4o-mini",
83
81
  )
84
82
  def answer_question(question: str) -> str:
85
83
  return f"Answer this question: {question}"
86
84
 
87
85
  stream_response = answer_question.stream("What is the capital of France?")
88
86
 
89
- for chunk in stream_response.text_stream():
87
+ for chunk in stream_response.pretty_stream():
90
88
  print(chunk, end="", flush=True)
89
+ print()
91
90
  ```
92
91
  """
93
92
 
94
93
  def __init__(
95
94
  self,
96
95
  *,
97
- provider_id: "ProviderId",
96
+ provider: "Provider",
98
97
  model_id: "ModelId",
99
- provider_model_name: str,
100
98
  params: "Params",
101
99
  tools: Sequence[Tool] | Toolkit | None = None,
102
100
  format: Format[FormattableT] | None = None,
@@ -106,9 +104,8 @@ class StreamResponse(BaseSyncStreamResponse[Toolkit, FormattableT]):
106
104
  """Initialize a `StreamResponse`."""
107
105
  toolkit = tools if isinstance(tools, Toolkit) else Toolkit(tools=tools)
108
106
  super().__init__(
109
- provider_id=provider_id,
107
+ provider=provider,
110
108
  model_id=model_id,
111
- provider_model_name=provider_model_name,
112
109
  params=params,
113
110
  toolkit=toolkit,
114
111
  format=format,
@@ -116,7 +113,7 @@ class StreamResponse(BaseSyncStreamResponse[Toolkit, FormattableT]):
116
113
  chunk_iterator=chunk_iterator,
117
114
  )
118
115
 
119
- def execute_tools(self) -> Sequence[ToolOutput[Jsonable]]:
116
+ def execute_tools(self) -> Sequence[ToolOutput]:
120
117
  """Execute and return all of the tool calls in the response.
121
118
 
122
119
  Returns:
@@ -204,25 +201,25 @@ class AsyncStreamResponse(BaseAsyncStreamResponse[AsyncToolkit, FormattableT]):
204
201
  from mirascope import llm
205
202
 
206
203
  @llm.call(
207
- provider_id="openai",
208
- model_id="openai/gpt-5-mini",
204
+ provider="openai:completions",
205
+ model_id="gpt-4o-mini",
209
206
  )
210
207
  async def answer_question(question: str) -> str:
211
208
  return f"Answer this question: {question}"
212
209
 
213
210
  stream_response = await answer_question.stream("What is the capital of France?")
214
211
 
215
- async for chunk in stream_response.text_stream():
212
+ async for chunk in stream_response.pretty_stream():
216
213
  print(chunk, end="", flush=True)
214
+ print()
217
215
  ```
218
216
  """
219
217
 
220
218
  def __init__(
221
219
  self,
222
220
  *,
223
- provider_id: "ProviderId",
221
+ provider: "Provider",
224
222
  model_id: "ModelId",
225
- provider_model_name: str,
226
223
  params: "Params",
227
224
  tools: Sequence[AsyncTool] | AsyncToolkit | None = None,
228
225
  format: Format[FormattableT] | None = None,
@@ -234,9 +231,8 @@ class AsyncStreamResponse(BaseAsyncStreamResponse[AsyncToolkit, FormattableT]):
234
231
  tools if isinstance(tools, AsyncToolkit) else AsyncToolkit(tools=tools)
235
232
  )
236
233
  super().__init__(
237
- provider_id=provider_id,
234
+ provider=provider,
238
235
  model_id=model_id,
239
- provider_model_name=provider_model_name,
240
236
  params=params,
241
237
  toolkit=toolkit,
242
238
  format=format,
@@ -244,7 +240,7 @@ class AsyncStreamResponse(BaseAsyncStreamResponse[AsyncToolkit, FormattableT]):
244
240
  chunk_iterator=chunk_iterator,
245
241
  )
246
242
 
247
- async def execute_tools(self) -> Sequence[ToolOutput[Jsonable]]:
243
+ async def execute_tools(self) -> Sequence[ToolOutput]:
248
244
  """Execute and return all of the tool calls in the response.
249
245
 
250
246
  Returns:
@@ -289,8 +285,7 @@ class AsyncStreamResponse(BaseAsyncStreamResponse[AsyncToolkit, FormattableT]):
289
285
 
290
286
 
291
287
  class ContextStreamResponse(
292
- BaseSyncStreamResponse[ContextToolkit[DepsT], FormattableT],
293
- Generic[DepsT, FormattableT],
288
+ BaseSyncStreamResponse[ContextToolkit, FormattableT], Generic[DepsT, FormattableT]
294
289
  ):
295
290
  """A `ContextStreamResponse` wraps response content from the LLM with a streaming interface.
296
291
 
@@ -338,8 +333,8 @@ class ContextStreamResponse(
338
333
  from mirascope import llm
339
334
 
340
335
  @llm.call(
341
- provider_id="openai",
342
- model_id="openai/gpt-5-mini",
336
+ provider="openai:completions",
337
+ model_id="gpt-4o-mini",
343
338
  )
344
339
  def answer_question(ctx: llm.Context, question: str) -> str:
345
340
  return f"Answer this question: {question}"
@@ -347,17 +342,17 @@ class ContextStreamResponse(
347
342
  ctx = llm.Context()
348
343
  stream_response = answer_question.stream(ctx, "What is the capital of France?")
349
344
 
350
- for chunk in stream_response.text_stream():
345
+ for chunk in stream_response.pretty_stream():
351
346
  print(chunk, end="", flush=True)
347
+ print()
352
348
  ```
353
349
  """
354
350
 
355
351
  def __init__(
356
352
  self,
357
353
  *,
358
- provider_id: "ProviderId",
354
+ provider: "Provider",
359
355
  model_id: "ModelId",
360
- provider_model_name: str,
361
356
  params: "Params",
362
357
  tools: Sequence[Tool | ContextTool[DepsT]]
363
358
  | ContextToolkit[DepsT]
@@ -371,9 +366,8 @@ class ContextStreamResponse(
371
366
  tools if isinstance(tools, ContextToolkit) else ContextToolkit(tools=tools)
372
367
  )
373
368
  super().__init__(
374
- provider_id=provider_id,
369
+ provider=provider,
375
370
  model_id=model_id,
376
- provider_model_name=provider_model_name,
377
371
  params=params,
378
372
  toolkit=toolkit,
379
373
  format=format,
@@ -381,7 +375,7 @@ class ContextStreamResponse(
381
375
  chunk_iterator=chunk_iterator,
382
376
  )
383
377
 
384
- def execute_tools(self, ctx: Context[DepsT]) -> Sequence[ToolOutput[Jsonable]]:
378
+ def execute_tools(self, ctx: Context[DepsT]) -> Sequence[ToolOutput]:
385
379
  """Execute and return all of the tool calls in the response.
386
380
 
387
381
  Args:
@@ -432,7 +426,7 @@ class ContextStreamResponse(
432
426
 
433
427
 
434
428
  class AsyncContextStreamResponse(
435
- BaseAsyncStreamResponse[AsyncContextToolkit[DepsT], FormattableT],
429
+ BaseAsyncStreamResponse[AsyncContextToolkit, FormattableT],
436
430
  Generic[DepsT, FormattableT],
437
431
  ):
438
432
  """An `AsyncContextStreamResponse` wraps response content from the LLM with a streaming interface.
@@ -481,8 +475,8 @@ class AsyncContextStreamResponse(
481
475
  from mirascope import llm
482
476
 
483
477
  @llm.call(
484
- provider_id="openai",
485
- model_id="openai/gpt-5-mini",
478
+ provider="openai:completions",
479
+ model_id="gpt-4o-mini",
486
480
  )
487
481
  async def answer_question(ctx: llm.Context, question: str) -> str:
488
482
  return f"Answer this question: {question}"
@@ -490,17 +484,17 @@ class AsyncContextStreamResponse(
490
484
  ctx = llm.Context()
491
485
  stream_response = await answer_question.stream(ctx, "What is the capital of France?")
492
486
 
493
- async for chunk in stream_response.text_stream():
487
+ async for chunk in stream_response.pretty_stream():
494
488
  print(chunk, end="", flush=True)
489
+ print()
495
490
  ```
496
491
  """
497
492
 
498
493
  def __init__(
499
494
  self,
500
495
  *,
501
- provider_id: "ProviderId",
496
+ provider: "Provider",
502
497
  model_id: "ModelId",
503
- provider_model_name: str,
504
498
  params: "Params",
505
499
  tools: Sequence[AsyncTool | AsyncContextTool[DepsT]]
506
500
  | AsyncContextToolkit[DepsT]
@@ -516,9 +510,8 @@ class AsyncContextStreamResponse(
516
510
  else AsyncContextToolkit(tools=tools)
517
511
  )
518
512
  super().__init__(
519
- provider_id=provider_id,
513
+ provider=provider,
520
514
  model_id=model_id,
521
- provider_model_name=provider_model_name,
522
515
  params=params,
523
516
  toolkit=toolkit,
524
517
  format=format,
@@ -526,9 +519,7 @@ class AsyncContextStreamResponse(
526
519
  chunk_iterator=chunk_iterator,
527
520
  )
528
521
 
529
- async def execute_tools(
530
- self, ctx: Context[DepsT]
531
- ) -> Sequence[ToolOutput[Jsonable]]:
522
+ async def execute_tools(self, ctx: Context[DepsT]) -> Sequence[ToolOutput]:
532
523
  """Execute and return all of the tool calls in the response.
533
524
 
534
525
  Args:
@@ -1,11 +1,9 @@
1
1
  """The Tools module for LLMs."""
2
2
 
3
+ from . import protocols
3
4
  from .decorator import ToolDecorator, tool
4
- from .protocols import AsyncContextToolFn, AsyncToolFn, ContextToolFn, ToolFn
5
5
  from .tool_schema import (
6
6
  FORMAT_TOOL_NAME,
7
- AnyToolFn,
8
- AnyToolSchema,
9
7
  ToolParameterSchema,
10
8
  ToolSchema,
11
9
  ToolSchemaT,
@@ -22,26 +20,21 @@ from .tools import AsyncContextTool, AsyncTool, ContextTool, Tool, ToolT
22
20
 
23
21
  __all__ = [
24
22
  "FORMAT_TOOL_NAME",
25
- "AnyToolFn",
26
- "AnyToolSchema",
27
23
  "AsyncContextTool",
28
- "AsyncContextToolFn",
29
24
  "AsyncContextToolkit",
30
25
  "AsyncTool",
31
- "AsyncToolFn",
32
26
  "AsyncToolkit",
33
27
  "BaseToolkit",
34
28
  "ContextTool",
35
- "ContextToolFn",
36
29
  "ContextToolkit",
37
30
  "Tool",
38
31
  "ToolDecorator",
39
- "ToolFn",
40
32
  "ToolParameterSchema",
41
33
  "ToolSchema",
42
34
  "ToolSchemaT",
43
35
  "ToolT",
44
36
  "Toolkit",
45
37
  "ToolkitT",
38
+ "protocols",
46
39
  "tool",
47
40
  ]
@@ -9,10 +9,7 @@ from .protocols import AsyncContextToolFn, AsyncToolFn, ContextToolFn, ToolFn
9
9
 
10
10
 
11
11
  def is_context_tool_fn(
12
- fn: ContextToolFn[DepsT, P, JsonableCovariantT]
13
- | AsyncContextToolFn[DepsT, P, JsonableCovariantT]
14
- | ToolFn[P, JsonableCovariantT]
15
- | AsyncToolFn[P, JsonableCovariantT],
12
+ fn: ToolFn | AsyncToolFn | ContextToolFn | AsyncContextToolFn,
16
13
  ) -> TypeIs[
17
14
  ContextToolFn[DepsT, P, JsonableCovariantT]
18
15
  | AsyncContextToolFn[DepsT, P, JsonableCovariantT]
@@ -22,13 +19,7 @@ def is_context_tool_fn(
22
19
 
23
20
 
24
21
  def is_async_tool_fn(
25
- fn: ContextToolFn[DepsT, P, JsonableCovariantT]
26
- | AsyncContextToolFn[DepsT, P, JsonableCovariantT]
27
- | ToolFn[P, JsonableCovariantT]
28
- | AsyncToolFn[P, JsonableCovariantT],
29
- ) -> TypeIs[
30
- AsyncContextToolFn[DepsT, P, JsonableCovariantT]
31
- | AsyncToolFn[P, JsonableCovariantT]
32
- ]:
22
+ fn: ToolFn | AsyncToolFn | ContextToolFn | AsyncContextToolFn,
23
+ ) -> TypeIs[AsyncToolFn | AsyncContextToolFn]:
33
24
  """Type guard to check if a function is an async tool function."""
34
25
  return inspect.iscoroutinefunction(fn)