mirascope 2.0.0__py3-none-any.whl → 2.0.0a0__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 (442) 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 +16 -101
  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/anthropic/__init__.py +11 -0
  15. mirascope/llm/{providers/openai/completions → clients/anthropic}/_utils/__init__.py +0 -2
  16. mirascope/llm/{providers → clients}/anthropic/_utils/decode.py +22 -66
  17. mirascope/llm/clients/anthropic/_utils/encode.py +243 -0
  18. mirascope/llm/clients/anthropic/clients.py +819 -0
  19. mirascope/llm/clients/anthropic/model_ids.py +8 -0
  20. mirascope/llm/{providers → clients}/base/__init__.py +5 -4
  21. mirascope/llm/{providers → clients}/base/_utils.py +17 -78
  22. mirascope/llm/{providers/base/base_provider.py → clients/base/client.py} +145 -468
  23. mirascope/llm/{models → clients/base}/params.py +37 -16
  24. mirascope/llm/clients/google/__init__.py +6 -0
  25. mirascope/llm/{providers/openai/responses → clients/google}/_utils/__init__.py +0 -2
  26. mirascope/llm/{providers → clients}/google/_utils/decode.py +22 -98
  27. mirascope/llm/{providers → clients}/google/_utils/encode.py +46 -168
  28. mirascope/llm/clients/google/clients.py +853 -0
  29. mirascope/llm/clients/google/model_ids.py +15 -0
  30. mirascope/llm/clients/openai/__init__.py +25 -0
  31. mirascope/llm/clients/openai/completions/__init__.py +9 -0
  32. mirascope/llm/{providers/google → clients/openai/completions}/_utils/__init__.py +0 -4
  33. mirascope/llm/{providers → clients}/openai/completions/_utils/decode.py +9 -74
  34. mirascope/llm/{providers → clients}/openai/completions/_utils/encode.py +52 -70
  35. mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
  36. mirascope/llm/clients/openai/completions/clients.py +833 -0
  37. mirascope/llm/clients/openai/completions/model_ids.py +8 -0
  38. mirascope/llm/clients/openai/responses/__init__.py +9 -0
  39. mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
  40. mirascope/llm/{providers → clients}/openai/responses/_utils/decode.py +14 -80
  41. mirascope/llm/{providers → clients}/openai/responses/_utils/encode.py +41 -92
  42. mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
  43. mirascope/llm/clients/openai/responses/clients.py +832 -0
  44. mirascope/llm/clients/openai/responses/model_ids.py +8 -0
  45. mirascope/llm/clients/openai/shared/__init__.py +7 -0
  46. mirascope/llm/clients/openai/shared/_utils.py +55 -0
  47. mirascope/llm/clients/providers.py +175 -0
  48. mirascope/llm/content/__init__.py +2 -3
  49. mirascope/llm/content/tool_call.py +0 -6
  50. mirascope/llm/content/tool_output.py +5 -22
  51. mirascope/llm/context/_utils.py +6 -19
  52. mirascope/llm/exceptions.py +43 -298
  53. mirascope/llm/formatting/__init__.py +2 -19
  54. mirascope/llm/formatting/_utils.py +74 -0
  55. mirascope/llm/formatting/format.py +30 -219
  56. mirascope/llm/formatting/from_call_args.py +2 -2
  57. mirascope/llm/formatting/partial.py +7 -80
  58. mirascope/llm/formatting/types.py +64 -21
  59. mirascope/llm/mcp/__init__.py +2 -2
  60. mirascope/llm/mcp/client.py +118 -0
  61. mirascope/llm/messages/__init__.py +0 -3
  62. mirascope/llm/messages/message.py +5 -13
  63. mirascope/llm/models/__init__.py +2 -7
  64. mirascope/llm/models/models.py +139 -315
  65. mirascope/llm/prompts/__init__.py +12 -13
  66. mirascope/llm/prompts/_utils.py +43 -14
  67. mirascope/llm/prompts/decorator.py +204 -144
  68. mirascope/llm/prompts/protocols.py +59 -25
  69. mirascope/llm/responses/__init__.py +1 -9
  70. mirascope/llm/responses/_utils.py +12 -102
  71. mirascope/llm/responses/base_response.py +6 -18
  72. mirascope/llm/responses/base_stream_response.py +50 -173
  73. mirascope/llm/responses/finish_reason.py +0 -1
  74. mirascope/llm/responses/response.py +13 -34
  75. mirascope/llm/responses/root_response.py +29 -100
  76. mirascope/llm/responses/stream_response.py +31 -40
  77. mirascope/llm/tools/__init__.py +2 -9
  78. mirascope/llm/tools/_utils.py +3 -12
  79. mirascope/llm/tools/decorator.py +16 -25
  80. mirascope/llm/tools/protocols.py +4 -4
  81. mirascope/llm/tools/tool_schema.py +19 -87
  82. mirascope/llm/tools/toolkit.py +27 -35
  83. mirascope/llm/tools/tools.py +41 -135
  84. {mirascope-2.0.0.dist-info → mirascope-2.0.0a0.dist-info}/METADATA +9 -95
  85. mirascope-2.0.0a0.dist-info/RECORD +101 -0
  86. {mirascope-2.0.0.dist-info → mirascope-2.0.0a0.dist-info}/WHEEL +1 -1
  87. {mirascope-2.0.0.dist-info → mirascope-2.0.0a0.dist-info}/licenses/LICENSE +1 -1
  88. mirascope/_stubs.py +0 -363
  89. mirascope/api/__init__.py +0 -14
  90. mirascope/api/_generated/README.md +0 -207
  91. mirascope/api/_generated/__init__.py +0 -440
  92. mirascope/api/_generated/annotations/__init__.py +0 -33
  93. mirascope/api/_generated/annotations/client.py +0 -506
  94. mirascope/api/_generated/annotations/raw_client.py +0 -1414
  95. mirascope/api/_generated/annotations/types/__init__.py +0 -31
  96. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +0 -5
  97. mirascope/api/_generated/annotations/types/annotations_create_response.py +0 -48
  98. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +0 -5
  99. mirascope/api/_generated/annotations/types/annotations_get_response.py +0 -48
  100. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +0 -5
  101. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +0 -5
  102. mirascope/api/_generated/annotations/types/annotations_list_response.py +0 -21
  103. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +0 -50
  104. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +0 -5
  105. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +0 -5
  106. mirascope/api/_generated/annotations/types/annotations_update_response.py +0 -48
  107. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +0 -5
  108. mirascope/api/_generated/api_keys/__init__.py +0 -17
  109. mirascope/api/_generated/api_keys/client.py +0 -530
  110. mirascope/api/_generated/api_keys/raw_client.py +0 -1236
  111. mirascope/api/_generated/api_keys/types/__init__.py +0 -15
  112. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +0 -28
  113. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +0 -27
  114. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +0 -40
  115. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +0 -27
  116. mirascope/api/_generated/client.py +0 -211
  117. mirascope/api/_generated/core/__init__.py +0 -52
  118. mirascope/api/_generated/core/api_error.py +0 -23
  119. mirascope/api/_generated/core/client_wrapper.py +0 -46
  120. mirascope/api/_generated/core/datetime_utils.py +0 -28
  121. mirascope/api/_generated/core/file.py +0 -67
  122. mirascope/api/_generated/core/force_multipart.py +0 -16
  123. mirascope/api/_generated/core/http_client.py +0 -543
  124. mirascope/api/_generated/core/http_response.py +0 -55
  125. mirascope/api/_generated/core/jsonable_encoder.py +0 -100
  126. mirascope/api/_generated/core/pydantic_utilities.py +0 -255
  127. mirascope/api/_generated/core/query_encoder.py +0 -58
  128. mirascope/api/_generated/core/remove_none_from_dict.py +0 -11
  129. mirascope/api/_generated/core/request_options.py +0 -35
  130. mirascope/api/_generated/core/serialization.py +0 -276
  131. mirascope/api/_generated/docs/__init__.py +0 -4
  132. mirascope/api/_generated/docs/client.py +0 -91
  133. mirascope/api/_generated/docs/raw_client.py +0 -178
  134. mirascope/api/_generated/environment.py +0 -9
  135. mirascope/api/_generated/environments/__init__.py +0 -23
  136. mirascope/api/_generated/environments/client.py +0 -649
  137. mirascope/api/_generated/environments/raw_client.py +0 -1567
  138. mirascope/api/_generated/environments/types/__init__.py +0 -25
  139. mirascope/api/_generated/environments/types/environments_create_response.py +0 -24
  140. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +0 -60
  141. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +0 -24
  142. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +0 -22
  143. mirascope/api/_generated/environments/types/environments_get_response.py +0 -24
  144. mirascope/api/_generated/environments/types/environments_list_response_item.py +0 -24
  145. mirascope/api/_generated/environments/types/environments_update_response.py +0 -24
  146. mirascope/api/_generated/errors/__init__.py +0 -25
  147. mirascope/api/_generated/errors/bad_request_error.py +0 -14
  148. mirascope/api/_generated/errors/conflict_error.py +0 -14
  149. mirascope/api/_generated/errors/forbidden_error.py +0 -11
  150. mirascope/api/_generated/errors/internal_server_error.py +0 -10
  151. mirascope/api/_generated/errors/not_found_error.py +0 -11
  152. mirascope/api/_generated/errors/payment_required_error.py +0 -15
  153. mirascope/api/_generated/errors/service_unavailable_error.py +0 -14
  154. mirascope/api/_generated/errors/too_many_requests_error.py +0 -15
  155. mirascope/api/_generated/errors/unauthorized_error.py +0 -11
  156. mirascope/api/_generated/functions/__init__.py +0 -39
  157. mirascope/api/_generated/functions/client.py +0 -647
  158. mirascope/api/_generated/functions/raw_client.py +0 -1890
  159. mirascope/api/_generated/functions/types/__init__.py +0 -53
  160. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +0 -20
  161. mirascope/api/_generated/functions/types/functions_create_response.py +0 -37
  162. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +0 -20
  163. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +0 -39
  164. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +0 -20
  165. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +0 -53
  166. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +0 -22
  167. mirascope/api/_generated/functions/types/functions_get_response.py +0 -37
  168. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +0 -20
  169. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +0 -25
  170. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +0 -56
  171. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +0 -22
  172. mirascope/api/_generated/functions/types/functions_list_response.py +0 -21
  173. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +0 -41
  174. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +0 -20
  175. mirascope/api/_generated/health/__init__.py +0 -7
  176. mirascope/api/_generated/health/client.py +0 -92
  177. mirascope/api/_generated/health/raw_client.py +0 -175
  178. mirascope/api/_generated/health/types/__init__.py +0 -8
  179. mirascope/api/_generated/health/types/health_check_response.py +0 -22
  180. mirascope/api/_generated/health/types/health_check_response_status.py +0 -5
  181. mirascope/api/_generated/organization_invitations/__init__.py +0 -33
  182. mirascope/api/_generated/organization_invitations/client.py +0 -546
  183. mirascope/api/_generated/organization_invitations/raw_client.py +0 -1519
  184. mirascope/api/_generated/organization_invitations/types/__init__.py +0 -53
  185. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +0 -34
  186. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +0 -7
  187. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +0 -7
  188. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +0 -48
  189. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +0 -7
  190. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +0 -7
  191. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +0 -48
  192. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +0 -7
  193. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +0 -7
  194. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +0 -48
  195. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +0 -7
  196. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +0 -7
  197. mirascope/api/_generated/organization_memberships/__init__.py +0 -19
  198. mirascope/api/_generated/organization_memberships/client.py +0 -302
  199. mirascope/api/_generated/organization_memberships/raw_client.py +0 -736
  200. mirascope/api/_generated/organization_memberships/types/__init__.py +0 -27
  201. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +0 -33
  202. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +0 -7
  203. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +0 -7
  204. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +0 -31
  205. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +0 -7
  206. mirascope/api/_generated/organizations/__init__.py +0 -51
  207. mirascope/api/_generated/organizations/client.py +0 -869
  208. mirascope/api/_generated/organizations/raw_client.py +0 -2593
  209. mirascope/api/_generated/organizations/types/__init__.py +0 -71
  210. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +0 -24
  211. mirascope/api/_generated/organizations/types/organizations_create_response.py +0 -26
  212. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +0 -5
  213. mirascope/api/_generated/organizations/types/organizations_get_response.py +0 -26
  214. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +0 -5
  215. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +0 -26
  216. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +0 -5
  217. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +0 -7
  218. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +0 -47
  219. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +0 -33
  220. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +0 -7
  221. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +0 -24
  222. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +0 -53
  223. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +0 -7
  224. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +0 -26
  225. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +0 -34
  226. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +0 -7
  227. mirascope/api/_generated/organizations/types/organizations_update_response.py +0 -26
  228. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +0 -5
  229. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +0 -7
  230. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +0 -35
  231. mirascope/api/_generated/project_memberships/__init__.py +0 -25
  232. mirascope/api/_generated/project_memberships/client.py +0 -437
  233. mirascope/api/_generated/project_memberships/raw_client.py +0 -1039
  234. mirascope/api/_generated/project_memberships/types/__init__.py +0 -29
  235. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +0 -7
  236. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +0 -35
  237. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +0 -7
  238. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +0 -33
  239. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +0 -7
  240. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +0 -7
  241. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +0 -35
  242. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +0 -7
  243. mirascope/api/_generated/projects/__init__.py +0 -7
  244. mirascope/api/_generated/projects/client.py +0 -428
  245. mirascope/api/_generated/projects/raw_client.py +0 -1302
  246. mirascope/api/_generated/projects/types/__init__.py +0 -10
  247. mirascope/api/_generated/projects/types/projects_create_response.py +0 -25
  248. mirascope/api/_generated/projects/types/projects_get_response.py +0 -25
  249. mirascope/api/_generated/projects/types/projects_list_response_item.py +0 -25
  250. mirascope/api/_generated/projects/types/projects_update_response.py +0 -25
  251. mirascope/api/_generated/reference.md +0 -4915
  252. mirascope/api/_generated/tags/__init__.py +0 -19
  253. mirascope/api/_generated/tags/client.py +0 -504
  254. mirascope/api/_generated/tags/raw_client.py +0 -1288
  255. mirascope/api/_generated/tags/types/__init__.py +0 -17
  256. mirascope/api/_generated/tags/types/tags_create_response.py +0 -41
  257. mirascope/api/_generated/tags/types/tags_get_response.py +0 -41
  258. mirascope/api/_generated/tags/types/tags_list_response.py +0 -23
  259. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +0 -41
  260. mirascope/api/_generated/tags/types/tags_update_response.py +0 -41
  261. mirascope/api/_generated/token_cost/__init__.py +0 -7
  262. mirascope/api/_generated/token_cost/client.py +0 -160
  263. mirascope/api/_generated/token_cost/raw_client.py +0 -264
  264. mirascope/api/_generated/token_cost/types/__init__.py +0 -8
  265. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +0 -54
  266. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +0 -52
  267. mirascope/api/_generated/traces/__init__.py +0 -97
  268. mirascope/api/_generated/traces/client.py +0 -1103
  269. mirascope/api/_generated/traces/raw_client.py +0 -2322
  270. mirascope/api/_generated/traces/types/__init__.py +0 -155
  271. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +0 -29
  272. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +0 -27
  273. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +0 -23
  274. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +0 -38
  275. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +0 -19
  276. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +0 -22
  277. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +0 -20
  278. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +0 -29
  279. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +0 -31
  280. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +0 -23
  281. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +0 -38
  282. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +0 -19
  283. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +0 -22
  284. 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
  285. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +0 -48
  286. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +0 -23
  287. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +0 -38
  288. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +0 -19
  289. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +0 -24
  290. 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
  291. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +0 -20
  292. mirascope/api/_generated/traces/types/traces_create_response.py +0 -24
  293. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +0 -22
  294. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +0 -60
  295. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +0 -24
  296. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +0 -22
  297. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +0 -33
  298. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +0 -88
  299. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +0 -33
  300. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +0 -88
  301. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +0 -25
  302. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +0 -44
  303. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +0 -26
  304. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +0 -7
  305. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +0 -7
  306. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +0 -7
  307. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +0 -26
  308. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +0 -50
  309. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +0 -26
  310. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +0 -7
  311. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +0 -7
  312. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +0 -5
  313. mirascope/api/_generated/traces/types/traces_search_response.py +0 -26
  314. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +0 -50
  315. mirascope/api/_generated/types/__init__.py +0 -85
  316. mirascope/api/_generated/types/already_exists_error.py +0 -22
  317. mirascope/api/_generated/types/already_exists_error_tag.py +0 -5
  318. mirascope/api/_generated/types/bad_request_error_body.py +0 -50
  319. mirascope/api/_generated/types/click_house_error.py +0 -22
  320. mirascope/api/_generated/types/database_error.py +0 -22
  321. mirascope/api/_generated/types/database_error_tag.py +0 -5
  322. mirascope/api/_generated/types/date.py +0 -3
  323. mirascope/api/_generated/types/http_api_decode_error.py +0 -27
  324. mirascope/api/_generated/types/http_api_decode_error_tag.py +0 -5
  325. mirascope/api/_generated/types/immutable_resource_error.py +0 -22
  326. mirascope/api/_generated/types/internal_server_error_body.py +0 -49
  327. mirascope/api/_generated/types/issue.py +0 -38
  328. mirascope/api/_generated/types/issue_tag.py +0 -10
  329. mirascope/api/_generated/types/not_found_error_body.py +0 -22
  330. mirascope/api/_generated/types/not_found_error_tag.py +0 -5
  331. mirascope/api/_generated/types/number_from_string.py +0 -3
  332. mirascope/api/_generated/types/permission_denied_error.py +0 -22
  333. mirascope/api/_generated/types/permission_denied_error_tag.py +0 -5
  334. mirascope/api/_generated/types/plan_limit_exceeded_error.py +0 -32
  335. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +0 -7
  336. mirascope/api/_generated/types/pricing_unavailable_error.py +0 -23
  337. mirascope/api/_generated/types/property_key.py +0 -7
  338. mirascope/api/_generated/types/property_key_key.py +0 -25
  339. mirascope/api/_generated/types/property_key_key_tag.py +0 -5
  340. mirascope/api/_generated/types/rate_limit_error.py +0 -31
  341. mirascope/api/_generated/types/rate_limit_error_tag.py +0 -5
  342. mirascope/api/_generated/types/service_unavailable_error_body.py +0 -24
  343. mirascope/api/_generated/types/service_unavailable_error_tag.py +0 -7
  344. mirascope/api/_generated/types/stripe_error.py +0 -20
  345. mirascope/api/_generated/types/subscription_past_due_error.py +0 -31
  346. mirascope/api/_generated/types/subscription_past_due_error_tag.py +0 -7
  347. mirascope/api/_generated/types/unauthorized_error_body.py +0 -21
  348. mirascope/api/_generated/types/unauthorized_error_tag.py +0 -5
  349. mirascope/api/client.py +0 -255
  350. mirascope/api/settings.py +0 -99
  351. mirascope/llm/formatting/output_parser.py +0 -178
  352. mirascope/llm/formatting/primitives.py +0 -192
  353. mirascope/llm/mcp/mcp_client.py +0 -130
  354. mirascope/llm/messages/_utils.py +0 -34
  355. mirascope/llm/models/thinking_config.py +0 -61
  356. mirascope/llm/prompts/prompts.py +0 -487
  357. mirascope/llm/providers/__init__.py +0 -62
  358. mirascope/llm/providers/anthropic/__init__.py +0 -11
  359. mirascope/llm/providers/anthropic/_utils/__init__.py +0 -27
  360. mirascope/llm/providers/anthropic/_utils/beta_decode.py +0 -282
  361. mirascope/llm/providers/anthropic/_utils/beta_encode.py +0 -266
  362. mirascope/llm/providers/anthropic/_utils/encode.py +0 -418
  363. mirascope/llm/providers/anthropic/_utils/errors.py +0 -46
  364. mirascope/llm/providers/anthropic/beta_provider.py +0 -374
  365. mirascope/llm/providers/anthropic/model_id.py +0 -23
  366. mirascope/llm/providers/anthropic/model_info.py +0 -87
  367. mirascope/llm/providers/anthropic/provider.py +0 -479
  368. mirascope/llm/providers/google/__init__.py +0 -6
  369. mirascope/llm/providers/google/_utils/errors.py +0 -50
  370. mirascope/llm/providers/google/model_id.py +0 -22
  371. mirascope/llm/providers/google/model_info.py +0 -63
  372. mirascope/llm/providers/google/provider.py +0 -492
  373. mirascope/llm/providers/mirascope/__init__.py +0 -5
  374. mirascope/llm/providers/mirascope/_utils.py +0 -73
  375. mirascope/llm/providers/mirascope/provider.py +0 -349
  376. mirascope/llm/providers/mlx/__init__.py +0 -9
  377. mirascope/llm/providers/mlx/_utils.py +0 -141
  378. mirascope/llm/providers/mlx/encoding/__init__.py +0 -8
  379. mirascope/llm/providers/mlx/encoding/base.py +0 -72
  380. mirascope/llm/providers/mlx/encoding/transformers.py +0 -150
  381. mirascope/llm/providers/mlx/mlx.py +0 -254
  382. mirascope/llm/providers/mlx/model_id.py +0 -17
  383. mirascope/llm/providers/mlx/provider.py +0 -452
  384. mirascope/llm/providers/model_id.py +0 -16
  385. mirascope/llm/providers/ollama/__init__.py +0 -7
  386. mirascope/llm/providers/ollama/provider.py +0 -71
  387. mirascope/llm/providers/openai/__init__.py +0 -15
  388. mirascope/llm/providers/openai/_utils/__init__.py +0 -5
  389. mirascope/llm/providers/openai/_utils/errors.py +0 -46
  390. mirascope/llm/providers/openai/completions/__init__.py +0 -7
  391. mirascope/llm/providers/openai/completions/base_provider.py +0 -542
  392. mirascope/llm/providers/openai/completions/provider.py +0 -22
  393. mirascope/llm/providers/openai/model_id.py +0 -31
  394. mirascope/llm/providers/openai/model_info.py +0 -303
  395. mirascope/llm/providers/openai/provider.py +0 -441
  396. mirascope/llm/providers/openai/responses/__init__.py +0 -5
  397. mirascope/llm/providers/openai/responses/provider.py +0 -513
  398. mirascope/llm/providers/provider_id.py +0 -24
  399. mirascope/llm/providers/provider_registry.py +0 -299
  400. mirascope/llm/providers/together/__init__.py +0 -7
  401. mirascope/llm/providers/together/provider.py +0 -40
  402. mirascope/llm/responses/usage.py +0 -95
  403. mirascope/ops/__init__.py +0 -111
  404. mirascope/ops/_internal/__init__.py +0 -5
  405. mirascope/ops/_internal/closure.py +0 -1169
  406. mirascope/ops/_internal/configuration.py +0 -177
  407. mirascope/ops/_internal/context.py +0 -76
  408. mirascope/ops/_internal/exporters/__init__.py +0 -26
  409. mirascope/ops/_internal/exporters/exporters.py +0 -395
  410. mirascope/ops/_internal/exporters/processors.py +0 -104
  411. mirascope/ops/_internal/exporters/types.py +0 -165
  412. mirascope/ops/_internal/exporters/utils.py +0 -29
  413. mirascope/ops/_internal/instrumentation/__init__.py +0 -8
  414. mirascope/ops/_internal/instrumentation/llm/__init__.py +0 -8
  415. mirascope/ops/_internal/instrumentation/llm/common.py +0 -530
  416. mirascope/ops/_internal/instrumentation/llm/cost.py +0 -190
  417. mirascope/ops/_internal/instrumentation/llm/encode.py +0 -238
  418. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +0 -38
  419. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +0 -31
  420. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +0 -38
  421. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +0 -18
  422. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +0 -100
  423. mirascope/ops/_internal/instrumentation/llm/llm.py +0 -161
  424. mirascope/ops/_internal/instrumentation/llm/model.py +0 -1798
  425. mirascope/ops/_internal/instrumentation/llm/response.py +0 -521
  426. mirascope/ops/_internal/instrumentation/llm/serialize.py +0 -300
  427. mirascope/ops/_internal/propagation.py +0 -198
  428. mirascope/ops/_internal/protocols.py +0 -133
  429. mirascope/ops/_internal/session.py +0 -139
  430. mirascope/ops/_internal/spans.py +0 -232
  431. mirascope/ops/_internal/traced_calls.py +0 -375
  432. mirascope/ops/_internal/traced_functions.py +0 -523
  433. mirascope/ops/_internal/tracing.py +0 -353
  434. mirascope/ops/_internal/types.py +0 -13
  435. mirascope/ops/_internal/utils.py +0 -123
  436. mirascope/ops/_internal/versioned_calls.py +0 -512
  437. mirascope/ops/_internal/versioned_functions.py +0 -357
  438. mirascope/ops/_internal/versioning.py +0 -303
  439. mirascope/ops/exceptions.py +0 -21
  440. mirascope-2.0.0.dist-info/RECORD +0 -423
  441. /mirascope/llm/{providers → clients}/base/kwargs.py +0 -0
  442. /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)