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
@@ -1,282 +0,0 @@
1
- """Beta Anthropic response decoding."""
2
-
3
- import json
4
- from typing import Any, TypeAlias, cast
5
-
6
- from anthropic.lib.streaming._beta_messages import (
7
- BetaAsyncMessageStreamManager,
8
- BetaMessageStreamManager,
9
- )
10
- from anthropic.types.beta import (
11
- BetaContentBlock,
12
- BetaRawMessageStreamEvent,
13
- BetaRedactedThinkingBlockParam,
14
- BetaTextBlockParam,
15
- BetaThinkingBlockParam,
16
- BetaToolUseBlockParam,
17
- )
18
- from anthropic.types.beta.parsed_beta_message import ParsedBetaMessage
19
-
20
- from ....content import (
21
- AssistantContentPart,
22
- Text,
23
- TextChunk,
24
- TextEndChunk,
25
- TextStartChunk,
26
- Thought,
27
- ThoughtChunk,
28
- ThoughtEndChunk,
29
- ThoughtStartChunk,
30
- ToolCall,
31
- ToolCallChunk,
32
- ToolCallEndChunk,
33
- ToolCallStartChunk,
34
- )
35
- from ....messages import AssistantMessage
36
- from ....responses import (
37
- AsyncChunkIterator,
38
- ChunkIterator,
39
- FinishReason,
40
- FinishReasonChunk,
41
- RawMessageChunk,
42
- RawStreamEventChunk,
43
- Usage,
44
- UsageDeltaChunk,
45
- )
46
- from ..model_id import model_name
47
- from .decode import decode_usage
48
-
49
- BETA_FINISH_REASON_MAP = {
50
- "max_tokens": FinishReason.MAX_TOKENS,
51
- "refusal": FinishReason.REFUSAL,
52
- "model_context_window_exceeded": FinishReason.CONTEXT_LENGTH_EXCEEDED,
53
- }
54
-
55
-
56
- def _decode_beta_assistant_content(content: BetaContentBlock) -> AssistantContentPart:
57
- """Convert Beta content block to mirascope AssistantContentPart."""
58
- if content.type == "text":
59
- return Text(text=content.text)
60
- elif content.type == "tool_use":
61
- return ToolCall(
62
- id=content.id,
63
- name=content.name,
64
- args=json.dumps(content.input),
65
- )
66
- elif content.type == "thinking":
67
- return Thought(thought=content.thinking)
68
- else:
69
- raise NotImplementedError(
70
- f"Support for beta content type `{content.type}` is not yet implemented."
71
- )
72
-
73
-
74
- def beta_decode_response(
75
- response: ParsedBetaMessage[Any],
76
- model_id: str,
77
- *,
78
- include_thoughts: bool,
79
- ) -> tuple[AssistantMessage, FinishReason | None, Usage]:
80
- """Convert Beta message to mirascope AssistantMessage and usage."""
81
- content = [_decode_beta_assistant_content(part) for part in response.content]
82
- if not include_thoughts:
83
- content = [part for part in content if part.type != "thought"]
84
- assistant_message = AssistantMessage(
85
- content=content,
86
- provider_id="anthropic",
87
- model_id=model_id,
88
- provider_model_name=model_name(model_id),
89
- raw_message={
90
- "role": response.role,
91
- "content": [
92
- part.model_dump(exclude_none=True) for part in response.content
93
- ],
94
- },
95
- )
96
- finish_reason = (
97
- BETA_FINISH_REASON_MAP.get(response.stop_reason)
98
- if response.stop_reason
99
- else None
100
- )
101
- usage = decode_usage(response.usage)
102
- return assistant_message, finish_reason, usage
103
-
104
-
105
- BetaContentBlockParam: TypeAlias = (
106
- BetaTextBlockParam
107
- | BetaThinkingBlockParam
108
- | BetaToolUseBlockParam
109
- | BetaRedactedThinkingBlockParam
110
- )
111
-
112
-
113
- class _BetaChunkProcessor:
114
- """Processes Beta stream events and maintains state across events."""
115
-
116
- def __init__(self, *, include_thoughts: bool) -> None:
117
- self.current_block_param: BetaContentBlockParam | None = None
118
- self.accumulated_tool_json: str = ""
119
- self.accumulated_blocks: list[BetaContentBlockParam] = []
120
- self.include_thoughts = include_thoughts
121
-
122
- def process_event(self, event: BetaRawMessageStreamEvent) -> ChunkIterator:
123
- """Process a single Beta event and yield the appropriate content chunks."""
124
- yield RawStreamEventChunk(raw_stream_event=event)
125
-
126
- if event.type == "content_block_start":
127
- content_block = event.content_block
128
-
129
- if content_block.type == "text":
130
- self.current_block_param = {
131
- "type": "text",
132
- "text": content_block.text,
133
- }
134
- yield TextStartChunk()
135
- elif content_block.type == "tool_use":
136
- self.current_block_param = {
137
- "type": "tool_use",
138
- "id": content_block.id,
139
- "name": content_block.name,
140
- "input": {},
141
- }
142
- self.accumulated_tool_json = ""
143
- yield ToolCallStartChunk(
144
- id=content_block.id,
145
- name=content_block.name,
146
- )
147
- elif content_block.type == "thinking":
148
- self.current_block_param = {
149
- "type": "thinking",
150
- "thinking": "",
151
- "signature": "",
152
- }
153
- if self.include_thoughts:
154
- yield ThoughtStartChunk()
155
- elif content_block.type == "redacted_thinking": # pragma: no cover
156
- self.current_block_param = {
157
- "type": "redacted_thinking",
158
- "data": content_block.data,
159
- }
160
- else:
161
- raise NotImplementedError(
162
- f"Support for beta content block type `{content_block.type}` "
163
- "is not yet implemented."
164
- )
165
-
166
- elif event.type == "content_block_delta":
167
- if self.current_block_param is None: # pragma: no cover
168
- raise RuntimeError("Received delta without a current block")
169
-
170
- delta = event.delta
171
- if delta.type == "text_delta":
172
- if self.current_block_param["type"] != "text": # pragma: no cover
173
- raise RuntimeError(
174
- f"Received text_delta for {self.current_block_param['type']} block"
175
- )
176
- self.current_block_param["text"] += delta.text
177
- yield TextChunk(delta=delta.text)
178
- elif delta.type == "input_json_delta":
179
- if self.current_block_param["type"] != "tool_use": # pragma: no cover
180
- raise RuntimeError(
181
- f"Received input_json_delta for {self.current_block_param['type']} block"
182
- )
183
- self.accumulated_tool_json += delta.partial_json
184
- yield ToolCallChunk(
185
- id=self.current_block_param["id"], delta=delta.partial_json
186
- )
187
- elif delta.type == "thinking_delta":
188
- if self.current_block_param["type"] != "thinking": # pragma: no cover
189
- raise RuntimeError(
190
- f"Received thinking_delta for {self.current_block_param['type']} block"
191
- )
192
- self.current_block_param["thinking"] += delta.thinking
193
- if self.include_thoughts:
194
- yield ThoughtChunk(delta=delta.thinking)
195
- elif delta.type == "signature_delta":
196
- if self.current_block_param["type"] != "thinking": # pragma: no cover
197
- raise RuntimeError(
198
- f"Received signature_delta for {self.current_block_param['type']} block"
199
- )
200
- self.current_block_param["signature"] += delta.signature
201
- else:
202
- raise RuntimeError(
203
- f"Received unsupported delta type: {delta.type}"
204
- ) # pragma: no cover
205
-
206
- elif event.type == "content_block_stop":
207
- if self.current_block_param is None: # pragma: no cover
208
- raise RuntimeError("Received stop without a current block")
209
-
210
- block_type = self.current_block_param["type"]
211
-
212
- if block_type == "text":
213
- yield TextEndChunk()
214
- elif block_type == "tool_use":
215
- if self.current_block_param["type"] != "tool_use": # pragma: no cover
216
- raise RuntimeError(
217
- f"Block type mismatch: stored {self.current_block_param['type']}, expected tool_use"
218
- )
219
- self.current_block_param["input"] = (
220
- json.loads(self.accumulated_tool_json)
221
- if self.accumulated_tool_json
222
- else {}
223
- )
224
- yield ToolCallEndChunk(id=self.current_block_param["id"])
225
- elif block_type == "thinking":
226
- if self.include_thoughts:
227
- yield ThoughtEndChunk()
228
- else:
229
- raise NotImplementedError
230
-
231
- self.accumulated_blocks.append(self.current_block_param)
232
- self.current_block_param = None
233
-
234
- elif event.type == "message_delta":
235
- if event.delta.stop_reason:
236
- finish_reason = BETA_FINISH_REASON_MAP.get(event.delta.stop_reason)
237
- if finish_reason is not None:
238
- yield FinishReasonChunk(finish_reason=finish_reason)
239
-
240
- # Emit usage delta
241
- usage = event.usage
242
- yield UsageDeltaChunk(
243
- input_tokens=usage.input_tokens or 0,
244
- output_tokens=usage.output_tokens,
245
- cache_read_tokens=usage.cache_read_input_tokens or 0,
246
- cache_write_tokens=usage.cache_creation_input_tokens or 0,
247
- reasoning_tokens=0,
248
- )
249
-
250
- def raw_message_chunk(self) -> RawMessageChunk:
251
- return RawMessageChunk(
252
- raw_message=cast(
253
- dict[str, Any],
254
- {
255
- "role": "assistant",
256
- "content": self.accumulated_blocks,
257
- },
258
- )
259
- )
260
-
261
-
262
- def beta_decode_stream(
263
- beta_stream_manager: BetaMessageStreamManager[Any], *, include_thoughts: bool
264
- ) -> ChunkIterator:
265
- """Returns a ChunkIterator converted from a Beta MessageStreamManager."""
266
- processor = _BetaChunkProcessor(include_thoughts=include_thoughts)
267
- with beta_stream_manager as stream:
268
- for event in stream._raw_stream: # pyright: ignore[reportPrivateUsage]
269
- yield from processor.process_event(event)
270
- yield processor.raw_message_chunk()
271
-
272
-
273
- async def beta_decode_async_stream(
274
- beta_stream_manager: BetaAsyncMessageStreamManager[Any], *, include_thoughts: bool
275
- ) -> AsyncChunkIterator:
276
- """Returns an AsyncChunkIterator converted from a Beta MessageStreamManager."""
277
- processor = _BetaChunkProcessor(include_thoughts=include_thoughts)
278
- async with beta_stream_manager as stream:
279
- async for event in stream._raw_stream: # pyright: ignore[reportPrivateUsage]
280
- for item in processor.process_event(event):
281
- yield item
282
- yield processor.raw_message_chunk()
@@ -1,266 +0,0 @@
1
- """Beta Anthropic message encoding and request preparation."""
2
-
3
- from collections.abc import Sequence
4
- from typing import TYPE_CHECKING, Any, TypedDict, cast
5
- from typing_extensions import Required
6
-
7
- from anthropic import Omit
8
- from anthropic.types.anthropic_beta_param import AnthropicBetaParam
9
- from anthropic.types.beta import (
10
- BetaContentBlockParam,
11
- BetaMessageParam,
12
- BetaTextBlockParam,
13
- BetaThinkingConfigParam,
14
- BetaToolChoiceParam,
15
- BetaToolParam,
16
- )
17
- from pydantic import BaseModel
18
-
19
- from ....content import ContentPart
20
- from ....exceptions import FeatureNotSupportedError
21
- from ....formatting import (
22
- Format,
23
- FormattableT,
24
- OutputParser,
25
- resolve_format,
26
- )
27
- from ....messages import AssistantMessage, Message, UserMessage
28
- from ....tools import AnyToolSchema, BaseToolkit
29
- from ...base import _utils as _base_utils
30
- from ..model_id import model_name
31
- from ..model_info import MODELS_WITHOUT_STRICT_STRUCTURED_OUTPUTS
32
- from .encode import (
33
- DEFAULT_MAX_TOKENS,
34
- FORMAT_TOOL_NAME,
35
- encode_content,
36
- process_params,
37
- )
38
-
39
- if TYPE_CHECKING:
40
- from ....models import Params
41
-
42
- DEFAULT_FORMAT_MODE = "strict"
43
-
44
-
45
- class BetaParseKwargs(TypedDict, total=False):
46
- """Kwargs for Anthropic beta.messages.parse method."""
47
-
48
- model: Required[str]
49
- max_tokens: Required[int]
50
- messages: Sequence[BetaMessageParam]
51
- system: Sequence[BetaTextBlockParam] | Omit
52
- tools: Sequence[BetaToolParam] | Omit
53
- tool_choice: BetaToolChoiceParam | Omit
54
- temperature: float | Omit
55
- top_p: float | Omit
56
- top_k: int | Omit
57
- stop_sequences: list[str] | Omit
58
- thinking: BetaThinkingConfigParam | Omit
59
- betas: list[AnthropicBetaParam]
60
- output_format: type[BaseModel]
61
-
62
-
63
- def _beta_encode_content(
64
- content: Sequence[ContentPart],
65
- encode_thoughts_as_text: bool,
66
- add_cache_control: bool = False,
67
- ) -> str | Sequence[BetaContentBlockParam]:
68
- """Convert mirascope content to Beta Anthropic content format."""
69
- result = encode_content(content, encode_thoughts_as_text, add_cache_control)
70
- if isinstance(result, str):
71
- return result
72
- return cast(Sequence[BetaContentBlockParam], result)
73
-
74
-
75
- def _beta_encode_message(
76
- message: UserMessage | AssistantMessage,
77
- model_id: str,
78
- encode_thoughts_as_text: bool,
79
- add_cache_control: bool = False,
80
- ) -> BetaMessageParam:
81
- """Convert user or assistant Message to Beta MessageParam format.
82
-
83
- Args:
84
- message: The message to encode
85
- model_id: The Anthropic model ID
86
- encode_thoughts_as_text: Whether to encode thought blocks as text
87
- add_cache_control: Whether to add cache_control to the last content block
88
- """
89
- if (
90
- message.role == "assistant"
91
- and message.provider_id == "anthropic"
92
- and message.model_id == model_id
93
- and message.raw_message
94
- and not encode_thoughts_as_text
95
- and not add_cache_control
96
- ):
97
- raw = cast(dict[str, Any], message.raw_message)
98
- return BetaMessageParam(
99
- role=raw["role"],
100
- content=raw["content"],
101
- )
102
-
103
- content = _beta_encode_content(
104
- message.content, encode_thoughts_as_text, add_cache_control
105
- )
106
-
107
- return BetaMessageParam(
108
- role=message.role,
109
- content=content,
110
- )
111
-
112
-
113
- def _beta_encode_messages(
114
- messages: Sequence[UserMessage | AssistantMessage],
115
- model_id: str,
116
- encode_thoughts_as_text: bool,
117
- ) -> Sequence[BetaMessageParam]:
118
- """Encode messages and add cache control for multi-turn conversations.
119
-
120
- If the conversation contains assistant messages (indicating multi-turn),
121
- adds cache_control to the last content block of the last message.
122
- """
123
- # Detect multi-turn conversations by checking for assistant messages
124
- has_assistant_message = any(msg.role == "assistant" for msg in messages)
125
-
126
- # Encode messages, adding cache_control to the last message if multi-turn
127
- encoded_messages: list[BetaMessageParam] = []
128
- for i, message in enumerate(messages):
129
- is_last = i == len(messages) - 1
130
- add_cache = has_assistant_message and is_last
131
- encoded_messages.append(
132
- _beta_encode_message(message, model_id, encode_thoughts_as_text, add_cache)
133
- )
134
- return encoded_messages
135
-
136
-
137
- def _beta_convert_tool_to_tool_param(
138
- tool: AnyToolSchema, model_supports_strict: bool
139
- ) -> BetaToolParam:
140
- """Convert a single Mirascope tool to Beta Anthropic tool format.
141
-
142
- If the tool has strict=True (or None, and the model supports strict), the schema
143
- is modified to be compatible with Anthropic's strict structured outputs beta
144
- by adding additionalProperties: false to all object schemas, and strict=True
145
- is passed to the API.
146
- """
147
- schema_dict = tool.parameters.model_dump(by_alias=True, exclude_none=True)
148
- schema_dict["type"] = "object"
149
-
150
- strict = model_supports_strict if tool.strict is None else tool.strict
151
- if strict:
152
- _base_utils.ensure_additional_properties_false(schema_dict)
153
-
154
- return BetaToolParam(
155
- name=tool.name,
156
- description=tool.description,
157
- input_schema=schema_dict,
158
- strict=strict,
159
- )
160
-
161
-
162
- def beta_encode_request(
163
- *,
164
- model_id: str,
165
- messages: Sequence[Message],
166
- tools: Sequence[AnyToolSchema] | BaseToolkit[AnyToolSchema] | None,
167
- format: type[FormattableT]
168
- | Format[FormattableT]
169
- | OutputParser[FormattableT]
170
- | None,
171
- params: "Params",
172
- ) -> tuple[Sequence[Message], Format[FormattableT] | None, BetaParseKwargs]:
173
- """Prepares a request for the Anthropic beta.messages.parse method."""
174
-
175
- processed = process_params(params, DEFAULT_MAX_TOKENS)
176
- encode_thoughts_as_text = processed.pop("encode_thoughts_as_text", False)
177
- max_tokens = processed.pop("max_tokens", DEFAULT_MAX_TOKENS)
178
-
179
- kwargs: BetaParseKwargs = BetaParseKwargs(
180
- {
181
- "model": model_name(model_id),
182
- "max_tokens": max_tokens,
183
- "betas": ["structured-outputs-2025-11-13"],
184
- **processed,
185
- }
186
- )
187
-
188
- tools = tools.tools if isinstance(tools, BaseToolkit) else tools or []
189
-
190
- model_supports_strict = (
191
- model_name(model_id) not in MODELS_WITHOUT_STRICT_STRUCTURED_OUTPUTS
192
- )
193
- # Check for strict tools on models that don't support them
194
- if _base_utils.has_strict_tools(tools) and not model_supports_strict:
195
- raise FeatureNotSupportedError(
196
- feature="strict tools",
197
- provider_id="anthropic",
198
- model_id=model_id,
199
- message="Strict tools require a model that supports structured outputs. "
200
- "Use a newer model like claude-sonnet-4-5 or set strict=False on your tools.",
201
- )
202
-
203
- anthropic_tools = [
204
- _beta_convert_tool_to_tool_param(
205
- tool, model_supports_strict=model_supports_strict
206
- )
207
- for tool in tools
208
- ]
209
- format = resolve_format(format, default_mode=DEFAULT_FORMAT_MODE)
210
-
211
- if format is not None:
212
- if format.mode == "strict":
213
- if model_name(model_id) in MODELS_WITHOUT_STRICT_STRUCTURED_OUTPUTS:
214
- raise FeatureNotSupportedError(
215
- feature=f"formatting_mode:{format.mode}",
216
- provider_id="anthropic",
217
- model_id=model_id,
218
- )
219
- else:
220
- kwargs["output_format"] = cast(type[BaseModel], format.formattable)
221
-
222
- if format.mode == "tool":
223
- format_tool_schema = format.create_tool_schema()
224
- anthropic_tools.append(
225
- _beta_convert_tool_to_tool_param(
226
- format_tool_schema, model_supports_strict=model_supports_strict
227
- )
228
- )
229
- if tools:
230
- kwargs["tool_choice"] = {"type": "any"}
231
- else:
232
- kwargs["tool_choice"] = {
233
- "type": "tool",
234
- "name": FORMAT_TOOL_NAME,
235
- "disable_parallel_tool_use": True,
236
- }
237
-
238
- if format.formatting_instructions:
239
- messages = _base_utils.add_system_instructions(
240
- messages, format.formatting_instructions
241
- )
242
-
243
- if anthropic_tools:
244
- # Add cache control to the last tool for prompt caching
245
- last_tool = anthropic_tools[-1]
246
- last_tool["cache_control"] = {"type": "ephemeral"}
247
- kwargs["tools"] = anthropic_tools
248
-
249
- system_message_content, remaining_messages = _base_utils.extract_system_message(
250
- messages
251
- )
252
-
253
- kwargs["messages"] = _beta_encode_messages(
254
- remaining_messages, model_id, encode_thoughts_as_text
255
- )
256
-
257
- if system_message_content:
258
- kwargs["system"] = [
259
- BetaTextBlockParam(
260
- type="text",
261
- text=system_message_content,
262
- cache_control={"type": "ephemeral"},
263
- )
264
- ]
265
-
266
- return messages, format, kwargs