mirascope 1.25.7__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 (474) hide show
  1. mirascope/__init__.py +3 -59
  2. mirascope/graphs/__init__.py +22 -0
  3. mirascope/{experimental/graphs → graphs}/finite_state_machine.py +70 -159
  4. mirascope/llm/__init__.py +206 -16
  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 +16 -0
  10. mirascope/llm/calls/base_call.py +33 -0
  11. mirascope/llm/calls/calls.py +315 -0
  12. mirascope/llm/calls/decorator.py +255 -0
  13. mirascope/llm/clients/__init__.py +34 -0
  14. mirascope/llm/clients/anthropic/__init__.py +11 -0
  15. mirascope/llm/clients/anthropic/_utils/__init__.py +13 -0
  16. mirascope/llm/clients/anthropic/_utils/decode.py +244 -0
  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/clients/base/__init__.py +15 -0
  21. mirascope/llm/clients/base/_utils.py +192 -0
  22. mirascope/llm/clients/base/client.py +1256 -0
  23. mirascope/llm/clients/base/kwargs.py +12 -0
  24. mirascope/llm/clients/base/params.py +93 -0
  25. mirascope/llm/clients/google/__init__.py +6 -0
  26. mirascope/llm/clients/google/_utils/__init__.py +13 -0
  27. mirascope/llm/clients/google/_utils/decode.py +231 -0
  28. mirascope/llm/clients/google/_utils/encode.py +279 -0
  29. mirascope/llm/clients/google/clients.py +853 -0
  30. mirascope/llm/clients/google/message.py +7 -0
  31. mirascope/llm/clients/google/model_ids.py +15 -0
  32. mirascope/llm/clients/openai/__init__.py +25 -0
  33. mirascope/llm/clients/openai/completions/__init__.py +9 -0
  34. mirascope/llm/clients/openai/completions/_utils/__init__.py +13 -0
  35. mirascope/llm/clients/openai/completions/_utils/decode.py +187 -0
  36. mirascope/llm/clients/openai/completions/_utils/encode.py +358 -0
  37. mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
  38. mirascope/llm/clients/openai/completions/clients.py +833 -0
  39. mirascope/llm/clients/openai/completions/model_ids.py +8 -0
  40. mirascope/llm/clients/openai/responses/__init__.py +9 -0
  41. mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
  42. mirascope/llm/clients/openai/responses/_utils/decode.py +194 -0
  43. mirascope/llm/clients/openai/responses/_utils/encode.py +333 -0
  44. mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
  45. mirascope/llm/clients/openai/responses/clients.py +832 -0
  46. mirascope/llm/clients/openai/responses/model_ids.py +8 -0
  47. mirascope/llm/clients/openai/shared/__init__.py +7 -0
  48. mirascope/llm/clients/openai/shared/_utils.py +55 -0
  49. mirascope/llm/clients/providers.py +175 -0
  50. mirascope/llm/content/__init__.py +70 -0
  51. mirascope/llm/content/audio.py +173 -0
  52. mirascope/llm/content/document.py +94 -0
  53. mirascope/llm/content/image.py +206 -0
  54. mirascope/llm/content/text.py +47 -0
  55. mirascope/llm/content/thought.py +58 -0
  56. mirascope/llm/content/tool_call.py +63 -0
  57. mirascope/llm/content/tool_output.py +26 -0
  58. mirascope/llm/context/__init__.py +6 -0
  59. mirascope/llm/context/_utils.py +28 -0
  60. mirascope/llm/context/context.py +24 -0
  61. mirascope/llm/exceptions.py +105 -0
  62. mirascope/llm/formatting/__init__.py +22 -0
  63. mirascope/llm/formatting/_utils.py +74 -0
  64. mirascope/llm/formatting/format.py +104 -0
  65. mirascope/llm/formatting/from_call_args.py +30 -0
  66. mirascope/llm/formatting/partial.py +58 -0
  67. mirascope/llm/formatting/types.py +109 -0
  68. mirascope/llm/mcp/__init__.py +5 -0
  69. mirascope/llm/mcp/client.py +118 -0
  70. mirascope/llm/messages/__init__.py +32 -0
  71. mirascope/llm/messages/message.py +182 -0
  72. mirascope/llm/models/__init__.py +16 -0
  73. mirascope/llm/models/models.py +1243 -0
  74. mirascope/llm/prompts/__init__.py +33 -0
  75. mirascope/llm/prompts/_utils.py +60 -0
  76. mirascope/llm/prompts/decorator.py +286 -0
  77. mirascope/llm/prompts/protocols.py +99 -0
  78. mirascope/llm/responses/__init__.py +57 -0
  79. mirascope/llm/responses/_utils.py +56 -0
  80. mirascope/llm/responses/base_response.py +91 -0
  81. mirascope/llm/responses/base_stream_response.py +697 -0
  82. mirascope/llm/responses/finish_reason.py +27 -0
  83. mirascope/llm/responses/response.py +345 -0
  84. mirascope/llm/responses/root_response.py +177 -0
  85. mirascope/llm/responses/stream_response.py +572 -0
  86. mirascope/llm/responses/streams.py +363 -0
  87. mirascope/llm/tools/__init__.py +40 -0
  88. mirascope/llm/tools/_utils.py +25 -0
  89. mirascope/llm/tools/decorator.py +175 -0
  90. mirascope/llm/tools/protocols.py +96 -0
  91. mirascope/llm/tools/tool_schema.py +246 -0
  92. mirascope/llm/tools/toolkit.py +152 -0
  93. mirascope/llm/tools/tools.py +169 -0
  94. mirascope/llm/types/__init__.py +22 -0
  95. mirascope/llm/types/dataclass.py +9 -0
  96. mirascope/llm/types/jsonable.py +44 -0
  97. mirascope/llm/types/type_vars.py +19 -0
  98. mirascope-2.0.0a0.dist-info/METADATA +117 -0
  99. mirascope-2.0.0a0.dist-info/RECORD +101 -0
  100. mirascope/beta/__init__.py +0 -3
  101. mirascope/beta/openai/__init__.py +0 -17
  102. mirascope/beta/openai/realtime/__init__.py +0 -13
  103. mirascope/beta/openai/realtime/_utils/__init__.py +0 -3
  104. mirascope/beta/openai/realtime/_utils/_audio.py +0 -74
  105. mirascope/beta/openai/realtime/_utils/_protocols.py +0 -50
  106. mirascope/beta/openai/realtime/realtime.py +0 -500
  107. mirascope/beta/openai/realtime/recording.py +0 -98
  108. mirascope/beta/openai/realtime/tool.py +0 -113
  109. mirascope/beta/rag/__init__.py +0 -24
  110. mirascope/beta/rag/base/__init__.py +0 -22
  111. mirascope/beta/rag/base/chunkers/__init__.py +0 -2
  112. mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
  113. mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
  114. mirascope/beta/rag/base/config.py +0 -8
  115. mirascope/beta/rag/base/document.py +0 -11
  116. mirascope/beta/rag/base/embedders.py +0 -35
  117. mirascope/beta/rag/base/embedding_params.py +0 -18
  118. mirascope/beta/rag/base/embedding_response.py +0 -30
  119. mirascope/beta/rag/base/query_results.py +0 -7
  120. mirascope/beta/rag/base/vectorstore_params.py +0 -18
  121. mirascope/beta/rag/base/vectorstores.py +0 -37
  122. mirascope/beta/rag/chroma/__init__.py +0 -11
  123. mirascope/beta/rag/chroma/types.py +0 -62
  124. mirascope/beta/rag/chroma/vectorstores.py +0 -121
  125. mirascope/beta/rag/cohere/__init__.py +0 -11
  126. mirascope/beta/rag/cohere/embedders.py +0 -87
  127. mirascope/beta/rag/cohere/embedding_params.py +0 -29
  128. mirascope/beta/rag/cohere/embedding_response.py +0 -29
  129. mirascope/beta/rag/cohere/py.typed +0 -0
  130. mirascope/beta/rag/openai/__init__.py +0 -11
  131. mirascope/beta/rag/openai/embedders.py +0 -144
  132. mirascope/beta/rag/openai/embedding_params.py +0 -18
  133. mirascope/beta/rag/openai/embedding_response.py +0 -14
  134. mirascope/beta/rag/openai/py.typed +0 -0
  135. mirascope/beta/rag/pinecone/__init__.py +0 -19
  136. mirascope/beta/rag/pinecone/types.py +0 -143
  137. mirascope/beta/rag/pinecone/vectorstores.py +0 -148
  138. mirascope/beta/rag/weaviate/__init__.py +0 -6
  139. mirascope/beta/rag/weaviate/types.py +0 -92
  140. mirascope/beta/rag/weaviate/vectorstores.py +0 -103
  141. mirascope/core/__init__.py +0 -109
  142. mirascope/core/anthropic/__init__.py +0 -31
  143. mirascope/core/anthropic/_call.py +0 -67
  144. mirascope/core/anthropic/_call_kwargs.py +0 -13
  145. mirascope/core/anthropic/_thinking.py +0 -70
  146. mirascope/core/anthropic/_utils/__init__.py +0 -16
  147. mirascope/core/anthropic/_utils/_convert_common_call_params.py +0 -25
  148. mirascope/core/anthropic/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
  149. mirascope/core/anthropic/_utils/_convert_message_params.py +0 -102
  150. mirascope/core/anthropic/_utils/_get_json_output.py +0 -31
  151. mirascope/core/anthropic/_utils/_handle_stream.py +0 -113
  152. mirascope/core/anthropic/_utils/_message_param_converter.py +0 -154
  153. mirascope/core/anthropic/_utils/_setup_call.py +0 -146
  154. mirascope/core/anthropic/call_params.py +0 -44
  155. mirascope/core/anthropic/call_response.py +0 -226
  156. mirascope/core/anthropic/call_response_chunk.py +0 -152
  157. mirascope/core/anthropic/dynamic_config.py +0 -40
  158. mirascope/core/anthropic/py.typed +0 -0
  159. mirascope/core/anthropic/stream.py +0 -204
  160. mirascope/core/anthropic/tool.py +0 -101
  161. mirascope/core/azure/__init__.py +0 -31
  162. mirascope/core/azure/_call.py +0 -67
  163. mirascope/core/azure/_call_kwargs.py +0 -13
  164. mirascope/core/azure/_utils/__init__.py +0 -14
  165. mirascope/core/azure/_utils/_convert_common_call_params.py +0 -26
  166. mirascope/core/azure/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
  167. mirascope/core/azure/_utils/_convert_message_params.py +0 -121
  168. mirascope/core/azure/_utils/_get_credential.py +0 -33
  169. mirascope/core/azure/_utils/_get_json_output.py +0 -27
  170. mirascope/core/azure/_utils/_handle_stream.py +0 -130
  171. mirascope/core/azure/_utils/_message_param_converter.py +0 -117
  172. mirascope/core/azure/_utils/_setup_call.py +0 -183
  173. mirascope/core/azure/call_params.py +0 -59
  174. mirascope/core/azure/call_response.py +0 -215
  175. mirascope/core/azure/call_response_chunk.py +0 -105
  176. mirascope/core/azure/dynamic_config.py +0 -30
  177. mirascope/core/azure/py.typed +0 -0
  178. mirascope/core/azure/stream.py +0 -147
  179. mirascope/core/azure/tool.py +0 -93
  180. mirascope/core/base/__init__.py +0 -86
  181. mirascope/core/base/_call_factory.py +0 -256
  182. mirascope/core/base/_create.py +0 -253
  183. mirascope/core/base/_extract.py +0 -175
  184. mirascope/core/base/_extract_with_tools.py +0 -189
  185. mirascope/core/base/_partial.py +0 -95
  186. mirascope/core/base/_utils/__init__.py +0 -92
  187. mirascope/core/base/_utils/_base_message_param_converter.py +0 -22
  188. mirascope/core/base/_utils/_base_type.py +0 -26
  189. mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -48
  190. mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
  191. mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -139
  192. mirascope/core/base/_utils/_convert_messages_to_message_params.py +0 -178
  193. mirascope/core/base/_utils/_convert_provider_finish_reason_to_finish_reason.py +0 -20
  194. mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
  195. mirascope/core/base/_utils/_extract_tool_return.py +0 -42
  196. mirascope/core/base/_utils/_fn_is_async.py +0 -24
  197. mirascope/core/base/_utils/_format_template.py +0 -32
  198. mirascope/core/base/_utils/_get_audio_type.py +0 -18
  199. mirascope/core/base/_utils/_get_common_usage.py +0 -20
  200. mirascope/core/base/_utils/_get_create_fn_or_async_create_fn.py +0 -137
  201. mirascope/core/base/_utils/_get_document_type.py +0 -7
  202. mirascope/core/base/_utils/_get_dynamic_configuration.py +0 -69
  203. mirascope/core/base/_utils/_get_fields_from_call_args.py +0 -34
  204. mirascope/core/base/_utils/_get_fn_args.py +0 -23
  205. mirascope/core/base/_utils/_get_image_dimensions.py +0 -39
  206. mirascope/core/base/_utils/_get_image_type.py +0 -26
  207. mirascope/core/base/_utils/_get_metadata.py +0 -17
  208. mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
  209. mirascope/core/base/_utils/_get_prompt_template.py +0 -28
  210. mirascope/core/base/_utils/_get_template_values.py +0 -51
  211. mirascope/core/base/_utils/_get_template_variables.py +0 -38
  212. mirascope/core/base/_utils/_get_unsupported_tool_config_keys.py +0 -10
  213. mirascope/core/base/_utils/_is_prompt_template.py +0 -24
  214. mirascope/core/base/_utils/_json_mode_content.py +0 -17
  215. mirascope/core/base/_utils/_messages_decorator.py +0 -121
  216. mirascope/core/base/_utils/_parse_content_template.py +0 -323
  217. mirascope/core/base/_utils/_parse_prompt_messages.py +0 -63
  218. mirascope/core/base/_utils/_pil_image_to_bytes.py +0 -13
  219. mirascope/core/base/_utils/_protocols.py +0 -901
  220. mirascope/core/base/_utils/_setup_call.py +0 -79
  221. mirascope/core/base/_utils/_setup_extract_tool.py +0 -30
  222. mirascope/core/base/call_kwargs.py +0 -13
  223. mirascope/core/base/call_params.py +0 -36
  224. mirascope/core/base/call_response.py +0 -338
  225. mirascope/core/base/call_response_chunk.py +0 -130
  226. mirascope/core/base/dynamic_config.py +0 -82
  227. mirascope/core/base/from_call_args.py +0 -30
  228. mirascope/core/base/merge_decorators.py +0 -59
  229. mirascope/core/base/message_param.py +0 -175
  230. mirascope/core/base/messages.py +0 -116
  231. mirascope/core/base/metadata.py +0 -13
  232. mirascope/core/base/prompt.py +0 -497
  233. mirascope/core/base/response_model_config_dict.py +0 -9
  234. mirascope/core/base/stream.py +0 -479
  235. mirascope/core/base/stream_config.py +0 -11
  236. mirascope/core/base/structured_stream.py +0 -296
  237. mirascope/core/base/tool.py +0 -214
  238. mirascope/core/base/toolkit.py +0 -176
  239. mirascope/core/base/types.py +0 -344
  240. mirascope/core/bedrock/__init__.py +0 -34
  241. mirascope/core/bedrock/_call.py +0 -68
  242. mirascope/core/bedrock/_call_kwargs.py +0 -12
  243. mirascope/core/bedrock/_types.py +0 -104
  244. mirascope/core/bedrock/_utils/__init__.py +0 -14
  245. mirascope/core/bedrock/_utils/_convert_common_call_params.py +0 -39
  246. mirascope/core/bedrock/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
  247. mirascope/core/bedrock/_utils/_convert_message_params.py +0 -111
  248. mirascope/core/bedrock/_utils/_get_json_output.py +0 -30
  249. mirascope/core/bedrock/_utils/_handle_stream.py +0 -104
  250. mirascope/core/bedrock/_utils/_message_param_converter.py +0 -172
  251. mirascope/core/bedrock/_utils/_setup_call.py +0 -258
  252. mirascope/core/bedrock/call_params.py +0 -38
  253. mirascope/core/bedrock/call_response.py +0 -248
  254. mirascope/core/bedrock/call_response_chunk.py +0 -111
  255. mirascope/core/bedrock/dynamic_config.py +0 -37
  256. mirascope/core/bedrock/py.typed +0 -0
  257. mirascope/core/bedrock/stream.py +0 -154
  258. mirascope/core/bedrock/tool.py +0 -100
  259. mirascope/core/cohere/__init__.py +0 -30
  260. mirascope/core/cohere/_call.py +0 -67
  261. mirascope/core/cohere/_call_kwargs.py +0 -11
  262. mirascope/core/cohere/_types.py +0 -20
  263. mirascope/core/cohere/_utils/__init__.py +0 -14
  264. mirascope/core/cohere/_utils/_convert_common_call_params.py +0 -26
  265. mirascope/core/cohere/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -24
  266. mirascope/core/cohere/_utils/_convert_message_params.py +0 -32
  267. mirascope/core/cohere/_utils/_get_json_output.py +0 -30
  268. mirascope/core/cohere/_utils/_handle_stream.py +0 -35
  269. mirascope/core/cohere/_utils/_message_param_converter.py +0 -54
  270. mirascope/core/cohere/_utils/_setup_call.py +0 -150
  271. mirascope/core/cohere/call_params.py +0 -62
  272. mirascope/core/cohere/call_response.py +0 -205
  273. mirascope/core/cohere/call_response_chunk.py +0 -125
  274. mirascope/core/cohere/dynamic_config.py +0 -32
  275. mirascope/core/cohere/py.typed +0 -0
  276. mirascope/core/cohere/stream.py +0 -113
  277. mirascope/core/cohere/tool.py +0 -93
  278. mirascope/core/costs/__init__.py +0 -5
  279. mirascope/core/costs/_anthropic_calculate_cost.py +0 -219
  280. mirascope/core/costs/_azure_calculate_cost.py +0 -11
  281. mirascope/core/costs/_bedrock_calculate_cost.py +0 -15
  282. mirascope/core/costs/_cohere_calculate_cost.py +0 -44
  283. mirascope/core/costs/_gemini_calculate_cost.py +0 -67
  284. mirascope/core/costs/_google_calculate_cost.py +0 -427
  285. mirascope/core/costs/_groq_calculate_cost.py +0 -156
  286. mirascope/core/costs/_litellm_calculate_cost.py +0 -11
  287. mirascope/core/costs/_mistral_calculate_cost.py +0 -64
  288. mirascope/core/costs/_openai_calculate_cost.py +0 -416
  289. mirascope/core/costs/_vertex_calculate_cost.py +0 -67
  290. mirascope/core/costs/_xai_calculate_cost.py +0 -104
  291. mirascope/core/costs/calculate_cost.py +0 -86
  292. mirascope/core/gemini/__init__.py +0 -40
  293. mirascope/core/gemini/_call.py +0 -67
  294. mirascope/core/gemini/_call_kwargs.py +0 -12
  295. mirascope/core/gemini/_utils/__init__.py +0 -14
  296. mirascope/core/gemini/_utils/_convert_common_call_params.py +0 -39
  297. mirascope/core/gemini/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
  298. mirascope/core/gemini/_utils/_convert_message_params.py +0 -156
  299. mirascope/core/gemini/_utils/_get_json_output.py +0 -35
  300. mirascope/core/gemini/_utils/_handle_stream.py +0 -33
  301. mirascope/core/gemini/_utils/_message_param_converter.py +0 -209
  302. mirascope/core/gemini/_utils/_setup_call.py +0 -149
  303. mirascope/core/gemini/call_params.py +0 -52
  304. mirascope/core/gemini/call_response.py +0 -216
  305. mirascope/core/gemini/call_response_chunk.py +0 -100
  306. mirascope/core/gemini/dynamic_config.py +0 -26
  307. mirascope/core/gemini/stream.py +0 -120
  308. mirascope/core/gemini/tool.py +0 -104
  309. mirascope/core/google/__init__.py +0 -29
  310. mirascope/core/google/_call.py +0 -67
  311. mirascope/core/google/_call_kwargs.py +0 -13
  312. mirascope/core/google/_utils/__init__.py +0 -14
  313. mirascope/core/google/_utils/_convert_common_call_params.py +0 -38
  314. mirascope/core/google/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -27
  315. mirascope/core/google/_utils/_convert_message_params.py +0 -297
  316. mirascope/core/google/_utils/_get_json_output.py +0 -37
  317. mirascope/core/google/_utils/_handle_stream.py +0 -58
  318. mirascope/core/google/_utils/_message_param_converter.py +0 -200
  319. mirascope/core/google/_utils/_setup_call.py +0 -201
  320. mirascope/core/google/_utils/_validate_media_type.py +0 -58
  321. mirascope/core/google/call_params.py +0 -22
  322. mirascope/core/google/call_response.py +0 -255
  323. mirascope/core/google/call_response_chunk.py +0 -135
  324. mirascope/core/google/dynamic_config.py +0 -26
  325. mirascope/core/google/stream.py +0 -199
  326. mirascope/core/google/tool.py +0 -146
  327. mirascope/core/groq/__init__.py +0 -30
  328. mirascope/core/groq/_call.py +0 -67
  329. mirascope/core/groq/_call_kwargs.py +0 -13
  330. mirascope/core/groq/_utils/__init__.py +0 -14
  331. mirascope/core/groq/_utils/_convert_common_call_params.py +0 -26
  332. mirascope/core/groq/_utils/_convert_message_params.py +0 -112
  333. mirascope/core/groq/_utils/_get_json_output.py +0 -27
  334. mirascope/core/groq/_utils/_handle_stream.py +0 -123
  335. mirascope/core/groq/_utils/_message_param_converter.py +0 -89
  336. mirascope/core/groq/_utils/_setup_call.py +0 -132
  337. mirascope/core/groq/call_params.py +0 -52
  338. mirascope/core/groq/call_response.py +0 -213
  339. mirascope/core/groq/call_response_chunk.py +0 -104
  340. mirascope/core/groq/dynamic_config.py +0 -29
  341. mirascope/core/groq/py.typed +0 -0
  342. mirascope/core/groq/stream.py +0 -135
  343. mirascope/core/groq/tool.py +0 -80
  344. mirascope/core/litellm/__init__.py +0 -28
  345. mirascope/core/litellm/_call.py +0 -67
  346. mirascope/core/litellm/_utils/__init__.py +0 -5
  347. mirascope/core/litellm/_utils/_setup_call.py +0 -109
  348. mirascope/core/litellm/call_params.py +0 -10
  349. mirascope/core/litellm/call_response.py +0 -24
  350. mirascope/core/litellm/call_response_chunk.py +0 -14
  351. mirascope/core/litellm/dynamic_config.py +0 -8
  352. mirascope/core/litellm/py.typed +0 -0
  353. mirascope/core/litellm/stream.py +0 -86
  354. mirascope/core/litellm/tool.py +0 -13
  355. mirascope/core/mistral/__init__.py +0 -36
  356. mirascope/core/mistral/_call.py +0 -65
  357. mirascope/core/mistral/_call_kwargs.py +0 -19
  358. mirascope/core/mistral/_utils/__init__.py +0 -14
  359. mirascope/core/mistral/_utils/_convert_common_call_params.py +0 -24
  360. mirascope/core/mistral/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -22
  361. mirascope/core/mistral/_utils/_convert_message_params.py +0 -122
  362. mirascope/core/mistral/_utils/_get_json_output.py +0 -34
  363. mirascope/core/mistral/_utils/_handle_stream.py +0 -139
  364. mirascope/core/mistral/_utils/_message_param_converter.py +0 -176
  365. mirascope/core/mistral/_utils/_setup_call.py +0 -164
  366. mirascope/core/mistral/call_params.py +0 -36
  367. mirascope/core/mistral/call_response.py +0 -205
  368. mirascope/core/mistral/call_response_chunk.py +0 -105
  369. mirascope/core/mistral/dynamic_config.py +0 -33
  370. mirascope/core/mistral/py.typed +0 -0
  371. mirascope/core/mistral/stream.py +0 -120
  372. mirascope/core/mistral/tool.py +0 -81
  373. mirascope/core/openai/__init__.py +0 -31
  374. mirascope/core/openai/_call.py +0 -67
  375. mirascope/core/openai/_call_kwargs.py +0 -13
  376. mirascope/core/openai/_utils/__init__.py +0 -14
  377. mirascope/core/openai/_utils/_convert_common_call_params.py +0 -26
  378. mirascope/core/openai/_utils/_convert_message_params.py +0 -148
  379. mirascope/core/openai/_utils/_get_json_output.py +0 -31
  380. mirascope/core/openai/_utils/_handle_stream.py +0 -138
  381. mirascope/core/openai/_utils/_message_param_converter.py +0 -105
  382. mirascope/core/openai/_utils/_setup_call.py +0 -155
  383. mirascope/core/openai/call_params.py +0 -92
  384. mirascope/core/openai/call_response.py +0 -273
  385. mirascope/core/openai/call_response_chunk.py +0 -139
  386. mirascope/core/openai/dynamic_config.py +0 -34
  387. mirascope/core/openai/py.typed +0 -0
  388. mirascope/core/openai/stream.py +0 -185
  389. mirascope/core/openai/tool.py +0 -101
  390. mirascope/core/py.typed +0 -0
  391. mirascope/core/vertex/__init__.py +0 -45
  392. mirascope/core/vertex/_call.py +0 -62
  393. mirascope/core/vertex/_call_kwargs.py +0 -12
  394. mirascope/core/vertex/_utils/__init__.py +0 -14
  395. mirascope/core/vertex/_utils/_convert_common_call_params.py +0 -37
  396. mirascope/core/vertex/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
  397. mirascope/core/vertex/_utils/_convert_message_params.py +0 -171
  398. mirascope/core/vertex/_utils/_get_json_output.py +0 -36
  399. mirascope/core/vertex/_utils/_handle_stream.py +0 -33
  400. mirascope/core/vertex/_utils/_message_param_converter.py +0 -133
  401. mirascope/core/vertex/_utils/_setup_call.py +0 -160
  402. mirascope/core/vertex/call_params.py +0 -24
  403. mirascope/core/vertex/call_response.py +0 -206
  404. mirascope/core/vertex/call_response_chunk.py +0 -99
  405. mirascope/core/vertex/dynamic_config.py +0 -28
  406. mirascope/core/vertex/stream.py +0 -119
  407. mirascope/core/vertex/tool.py +0 -101
  408. mirascope/core/xai/__init__.py +0 -28
  409. mirascope/core/xai/_call.py +0 -67
  410. mirascope/core/xai/_utils/__init__.py +0 -5
  411. mirascope/core/xai/_utils/_setup_call.py +0 -113
  412. mirascope/core/xai/call_params.py +0 -10
  413. mirascope/core/xai/call_response.py +0 -16
  414. mirascope/core/xai/call_response_chunk.py +0 -14
  415. mirascope/core/xai/dynamic_config.py +0 -8
  416. mirascope/core/xai/py.typed +0 -0
  417. mirascope/core/xai/stream.py +0 -57
  418. mirascope/core/xai/tool.py +0 -13
  419. mirascope/experimental/graphs/__init__.py +0 -5
  420. mirascope/integrations/__init__.py +0 -16
  421. mirascope/integrations/_middleware_factory.py +0 -403
  422. mirascope/integrations/langfuse/__init__.py +0 -3
  423. mirascope/integrations/langfuse/_utils.py +0 -114
  424. mirascope/integrations/langfuse/_with_langfuse.py +0 -70
  425. mirascope/integrations/logfire/__init__.py +0 -3
  426. mirascope/integrations/logfire/_utils.py +0 -225
  427. mirascope/integrations/logfire/_with_logfire.py +0 -63
  428. mirascope/integrations/otel/__init__.py +0 -10
  429. mirascope/integrations/otel/_utils.py +0 -270
  430. mirascope/integrations/otel/_with_hyperdx.py +0 -60
  431. mirascope/integrations/otel/_with_otel.py +0 -59
  432. mirascope/integrations/tenacity.py +0 -14
  433. mirascope/llm/_call.py +0 -401
  434. mirascope/llm/_context.py +0 -384
  435. mirascope/llm/_override.py +0 -3639
  436. mirascope/llm/_protocols.py +0 -500
  437. mirascope/llm/_response_metaclass.py +0 -31
  438. mirascope/llm/call_response.py +0 -158
  439. mirascope/llm/call_response_chunk.py +0 -66
  440. mirascope/llm/stream.py +0 -162
  441. mirascope/llm/tool.py +0 -64
  442. mirascope/mcp/__init__.py +0 -7
  443. mirascope/mcp/_utils.py +0 -288
  444. mirascope/mcp/client.py +0 -167
  445. mirascope/mcp/server.py +0 -356
  446. mirascope/mcp/tools.py +0 -110
  447. mirascope/py.typed +0 -0
  448. mirascope/retries/__init__.py +0 -11
  449. mirascope/retries/fallback.py +0 -131
  450. mirascope/retries/tenacity.py +0 -50
  451. mirascope/tools/__init__.py +0 -37
  452. mirascope/tools/base.py +0 -98
  453. mirascope/tools/system/__init__.py +0 -0
  454. mirascope/tools/system/_docker_operation.py +0 -166
  455. mirascope/tools/system/_file_system.py +0 -267
  456. mirascope/tools/web/__init__.py +0 -0
  457. mirascope/tools/web/_duckduckgo.py +0 -111
  458. mirascope/tools/web/_httpx.py +0 -125
  459. mirascope/tools/web/_parse_url_content.py +0 -94
  460. mirascope/tools/web/_requests.py +0 -54
  461. mirascope/v0/__init__.py +0 -43
  462. mirascope/v0/anthropic.py +0 -54
  463. mirascope/v0/base/__init__.py +0 -12
  464. mirascope/v0/base/calls.py +0 -118
  465. mirascope/v0/base/extractors.py +0 -122
  466. mirascope/v0/base/ops_utils.py +0 -207
  467. mirascope/v0/base/prompts.py +0 -48
  468. mirascope/v0/base/types.py +0 -14
  469. mirascope/v0/base/utils.py +0 -21
  470. mirascope/v0/openai.py +0 -54
  471. mirascope-1.25.7.dist-info/METADATA +0 -169
  472. mirascope-1.25.7.dist-info/RECORD +0 -378
  473. {mirascope-1.25.7.dist-info → mirascope-2.0.0a0.dist-info}/WHEEL +0 -0
  474. {mirascope-1.25.7.dist-info → mirascope-2.0.0a0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,244 @@
1
+ """Anthropic response decoding."""
2
+
3
+ import json
4
+ from typing import Any, TypeAlias, cast
5
+
6
+ from anthropic import types as anthropic_types
7
+ from anthropic.lib.streaming import AsyncMessageStreamManager, MessageStreamManager
8
+
9
+ from ....content import (
10
+ AssistantContentPart,
11
+ Text,
12
+ TextChunk,
13
+ TextEndChunk,
14
+ TextStartChunk,
15
+ Thought,
16
+ ThoughtChunk,
17
+ ThoughtEndChunk,
18
+ ThoughtStartChunk,
19
+ ToolCall,
20
+ ToolCallChunk,
21
+ ToolCallEndChunk,
22
+ ToolCallStartChunk,
23
+ )
24
+ from ....messages import AssistantMessage
25
+ from ....responses import (
26
+ AsyncChunkIterator,
27
+ ChunkIterator,
28
+ FinishReason,
29
+ FinishReasonChunk,
30
+ RawMessageChunk,
31
+ RawStreamEventChunk,
32
+ )
33
+ from ..model_ids import AnthropicModelId
34
+
35
+ ANTHROPIC_FINISH_REASON_MAP = {
36
+ "max_tokens": FinishReason.MAX_TOKENS,
37
+ "refusal": FinishReason.REFUSAL,
38
+ }
39
+
40
+
41
+ def _decode_assistant_content(
42
+ content: anthropic_types.ContentBlock,
43
+ ) -> AssistantContentPart:
44
+ """Convert Anthropic content block to mirascope AssistantContentPart."""
45
+ if content.type == "text":
46
+ return Text(text=content.text)
47
+ elif content.type == "tool_use":
48
+ return ToolCall(
49
+ id=content.id,
50
+ name=content.name,
51
+ args=json.dumps(content.input),
52
+ )
53
+ elif content.type == "thinking":
54
+ return Thought(thought=content.thinking)
55
+ else:
56
+ raise NotImplementedError(
57
+ f"Support for content type `{content.type}` is not yet implemented."
58
+ )
59
+
60
+
61
+ def decode_response(
62
+ response: anthropic_types.Message,
63
+ model_id: AnthropicModelId,
64
+ ) -> tuple[AssistantMessage, FinishReason | None]:
65
+ """Convert Anthropic message to mirascope AssistantMessage."""
66
+ assistant_message = AssistantMessage(
67
+ content=[_decode_assistant_content(part) for part in response.content],
68
+ provider="anthropic",
69
+ model_id=model_id,
70
+ raw_message={
71
+ "role": response.role,
72
+ "content": [part.model_dump() for part in response.content],
73
+ },
74
+ )
75
+ finish_reason = (
76
+ ANTHROPIC_FINISH_REASON_MAP.get(response.stop_reason)
77
+ if response.stop_reason
78
+ else None
79
+ )
80
+ return assistant_message, finish_reason
81
+
82
+
83
+ ContentBlock: TypeAlias = (
84
+ anthropic_types.TextBlockParam
85
+ | anthropic_types.ThinkingBlockParam
86
+ | anthropic_types.ToolUseBlockParam
87
+ | anthropic_types.ThinkingBlockParam
88
+ | anthropic_types.RedactedThinkingBlockParam
89
+ )
90
+
91
+
92
+ class _AnthropicChunkProcessor:
93
+ """Processes Anthropic stream events and maintains state across events."""
94
+
95
+ def __init__(self) -> None:
96
+ self.current_block_param: ContentBlock | None = None
97
+ self.accumulated_tool_json: str = ""
98
+ self.accumulated_blocks: list[ContentBlock] = []
99
+
100
+ def process_event(
101
+ self, event: anthropic_types.RawMessageStreamEvent
102
+ ) -> ChunkIterator:
103
+ """Process a single Anthropic event and yield the appropriate content chunks."""
104
+ yield RawStreamEventChunk(raw_stream_event=event)
105
+
106
+ if event.type == "content_block_start":
107
+ content_block = event.content_block
108
+
109
+ if content_block.type == "text":
110
+ self.current_block_param = {
111
+ "type": "text",
112
+ "text": content_block.text,
113
+ }
114
+ yield TextStartChunk()
115
+ elif content_block.type == "tool_use":
116
+ self.current_block_param = {
117
+ "type": "tool_use",
118
+ "id": content_block.id,
119
+ "name": content_block.name,
120
+ "input": {},
121
+ }
122
+ self.accumulated_tool_json = ""
123
+ yield ToolCallStartChunk(
124
+ id=content_block.id,
125
+ name=content_block.name,
126
+ )
127
+ elif content_block.type == "thinking":
128
+ self.current_block_param = {
129
+ "type": "thinking",
130
+ "thinking": "",
131
+ "signature": "",
132
+ }
133
+ yield ThoughtStartChunk()
134
+ elif content_block.type == "redacted_thinking": # pragma: no cover
135
+ self.current_block_param = {
136
+ "type": "redacted_thinking",
137
+ "data": content_block.data,
138
+ }
139
+ else:
140
+ raise NotImplementedError
141
+
142
+ elif event.type == "content_block_delta":
143
+ if self.current_block_param is None: # pragma: no cover
144
+ raise RuntimeError("Received delta without a current block")
145
+
146
+ delta = event.delta
147
+ if delta.type == "text_delta":
148
+ if self.current_block_param["type"] != "text": # pragma: no cover
149
+ raise RuntimeError(
150
+ f"Received text_delta for {self.current_block_param['type']} block"
151
+ )
152
+ self.current_block_param["text"] += delta.text
153
+ yield TextChunk(delta=delta.text)
154
+ elif delta.type == "input_json_delta":
155
+ if self.current_block_param["type"] != "tool_use": # pragma: no cover
156
+ raise RuntimeError(
157
+ f"Received input_json_delta for {self.current_block_param['type']} block"
158
+ )
159
+ self.accumulated_tool_json += delta.partial_json
160
+ yield ToolCallChunk(delta=delta.partial_json)
161
+ elif delta.type == "thinking_delta":
162
+ if self.current_block_param["type"] != "thinking": # pragma: no cover
163
+ raise RuntimeError(
164
+ f"Received thinking_delta for {self.current_block_param['type']} block"
165
+ )
166
+ self.current_block_param["thinking"] += delta.thinking
167
+ yield ThoughtChunk(delta=delta.thinking)
168
+ elif delta.type == "signature_delta":
169
+ if self.current_block_param["type"] != "thinking": # pragma: no cover
170
+ raise RuntimeError(
171
+ f"Received signature_delta for {self.current_block_param['type']} block"
172
+ )
173
+ self.current_block_param["signature"] += delta.signature
174
+ else:
175
+ raise RuntimeError(
176
+ f"Received unsupported delta type: {delta.type}"
177
+ ) # pragma: no cover
178
+
179
+ elif event.type == "content_block_stop":
180
+ if self.current_block_param is None: # pragma: no cover
181
+ raise RuntimeError("Received stop without a current block")
182
+
183
+ block_type = self.current_block_param["type"]
184
+
185
+ if block_type == "text":
186
+ yield TextEndChunk()
187
+ elif block_type == "tool_use":
188
+ if self.current_block_param["type"] != "tool_use": # pragma: no cover
189
+ raise RuntimeError(
190
+ f"Block type mismatch: stored {self.current_block_param['type']}, expected tool_use"
191
+ )
192
+ self.current_block_param["input"] = (
193
+ json.loads(self.accumulated_tool_json)
194
+ if self.accumulated_tool_json
195
+ else {}
196
+ )
197
+ yield ToolCallEndChunk()
198
+ elif block_type == "thinking":
199
+ yield ThoughtEndChunk()
200
+ else:
201
+ raise NotImplementedError
202
+
203
+ self.accumulated_blocks.append(self.current_block_param)
204
+ self.current_block_param = None
205
+
206
+ elif event.type == "message_delta":
207
+ if event.delta.stop_reason:
208
+ finish_reason = ANTHROPIC_FINISH_REASON_MAP.get(event.delta.stop_reason)
209
+ if finish_reason is not None:
210
+ yield FinishReasonChunk(finish_reason=finish_reason)
211
+
212
+ def raw_message_chunk(self) -> RawMessageChunk:
213
+ return RawMessageChunk(
214
+ raw_message=cast(
215
+ dict[str, Any],
216
+ {
217
+ "role": "assistant",
218
+ "content": self.accumulated_blocks,
219
+ },
220
+ )
221
+ )
222
+
223
+
224
+ def decode_stream(
225
+ anthropic_stream_manager: MessageStreamManager,
226
+ ) -> ChunkIterator:
227
+ """Returns a ChunkIterator converted from an Anthropic MessageStreamManager"""
228
+ processor = _AnthropicChunkProcessor()
229
+ with anthropic_stream_manager as stream:
230
+ for event in stream._raw_stream:
231
+ yield from processor.process_event(event)
232
+ yield processor.raw_message_chunk()
233
+
234
+
235
+ async def decode_async_stream(
236
+ anthropic_stream_manager: AsyncMessageStreamManager,
237
+ ) -> AsyncChunkIterator:
238
+ """Returns an AsyncChunkIterator converted from an Anthropic MessageStreamManager"""
239
+ processor = _AnthropicChunkProcessor()
240
+ async with anthropic_stream_manager as stream:
241
+ async for event in stream._raw_stream:
242
+ for item in processor.process_event(event):
243
+ yield item
244
+ yield processor.raw_message_chunk()
@@ -0,0 +1,243 @@
1
+ """Anthropic message encoding and request preparation."""
2
+
3
+ import json
4
+ from collections.abc import Sequence
5
+ from functools import lru_cache
6
+ from typing import Literal, TypedDict, cast
7
+ from typing_extensions import Required
8
+
9
+ from anthropic import Omit, types as anthropic_types
10
+
11
+ from ....content import ContentPart, ImageMimeType
12
+ from ....exceptions import FeatureNotSupportedError, FormattingModeNotSupportedError
13
+ from ....formatting import (
14
+ Format,
15
+ FormattableT,
16
+ _utils as _formatting_utils,
17
+ resolve_format,
18
+ )
19
+ from ....messages import AssistantMessage, Message, UserMessage
20
+ from ....tools import FORMAT_TOOL_NAME, BaseToolkit, ToolSchema
21
+ from ...base import Params, _utils as _base_utils
22
+ from ..model_ids import AnthropicModelId
23
+
24
+ DEFAULT_MAX_TOKENS = 16000
25
+
26
+ AnthropicImageMimeType = Literal["image/jpeg", "image/png", "image/gif", "image/webp"]
27
+
28
+
29
+ def encode_image_mime_type(
30
+ mime_type: ImageMimeType,
31
+ ) -> AnthropicImageMimeType:
32
+ """Convert an ImageMimeType into anthropic supported mime type"""
33
+ if mime_type in ("image/jpeg", "image/png", "image/gif", "image/webp"):
34
+ return mime_type
35
+ raise FeatureNotSupportedError(
36
+ feature=f"Image with mime_type: {mime_type}", provider="anthropic"
37
+ ) # pragma: no cover
38
+
39
+
40
+ class MessageCreateKwargs(TypedDict, total=False):
41
+ """Kwargs for Anthropic Message.create method."""
42
+
43
+ model: Required[str]
44
+ max_tokens: Required[int]
45
+ messages: Sequence[anthropic_types.MessageParam]
46
+ system: str | Omit
47
+ tools: Sequence[anthropic_types.ToolParam] | Omit
48
+ tool_choice: anthropic_types.ToolChoiceParam | Omit
49
+ temperature: float | Omit
50
+ top_p: float | Omit
51
+ top_k: int | Omit
52
+ stop_sequences: list[str] | Omit
53
+ thinking: anthropic_types.ThinkingConfigParam | Omit
54
+
55
+
56
+ def _encode_content(
57
+ content: Sequence[ContentPart], encode_thoughts: bool
58
+ ) -> str | Sequence[anthropic_types.ContentBlockParam]:
59
+ """Convert mirascope content to Anthropic content format."""
60
+
61
+ if len(content) == 1 and content[0].type == "text":
62
+ return content[0].text
63
+
64
+ blocks: list[anthropic_types.ContentBlockParam] = []
65
+
66
+ for part in content:
67
+ if part.type == "text":
68
+ blocks.append(anthropic_types.TextBlockParam(type="text", text=part.text))
69
+ elif part.type == "image":
70
+ source: (
71
+ anthropic_types.Base64ImageSourceParam
72
+ | anthropic_types.URLImageSourceParam
73
+ )
74
+ if part.source.type == "base64_image_source":
75
+ source = anthropic_types.Base64ImageSourceParam(
76
+ type="base64",
77
+ media_type=encode_image_mime_type(part.source.mime_type),
78
+ data=part.source.data,
79
+ )
80
+ else: # url_image_source
81
+ source = anthropic_types.URLImageSourceParam(
82
+ type="url",
83
+ url=part.source.url,
84
+ )
85
+ blocks.append(anthropic_types.ImageBlockParam(type="image", source=source))
86
+ elif part.type == "audio":
87
+ raise FeatureNotSupportedError(
88
+ "audio input",
89
+ "anthropic",
90
+ message="Anthropic does not support audio inputs.",
91
+ )
92
+ elif part.type == "tool_output":
93
+ blocks.append(
94
+ anthropic_types.ToolResultBlockParam(
95
+ type="tool_result",
96
+ tool_use_id=part.id,
97
+ content=str(part.value),
98
+ )
99
+ )
100
+ elif part.type == "tool_call":
101
+ blocks.append(
102
+ anthropic_types.ToolUseBlockParam(
103
+ type="tool_use",
104
+ id=part.id,
105
+ name=part.name,
106
+ input=json.loads(part.args),
107
+ )
108
+ )
109
+ elif part.type == "thought":
110
+ if encode_thoughts:
111
+ blocks.append(
112
+ anthropic_types.TextBlockParam(
113
+ type="text", text="**Thinking:** " + part.thought
114
+ )
115
+ )
116
+ else:
117
+ raise NotImplementedError(f"Unsupported content type: {part.type}")
118
+
119
+ return blocks
120
+
121
+
122
+ def _encode_message(
123
+ message: UserMessage | AssistantMessage,
124
+ model_id: AnthropicModelId,
125
+ encode_thoughts: bool,
126
+ ) -> anthropic_types.MessageParam:
127
+ """Convert user or assistant `Message`s to Anthropic `MessageParam` format.
128
+
129
+ Args:
130
+ messages: A Sequence containing `UserMessage`s or `AssistantMessage`s
131
+ model_id: The Anthropic model ID being used
132
+
133
+ Returns:
134
+ A Sequence of converted Anthropic `MessageParam`
135
+ """
136
+
137
+ if (
138
+ message.role == "assistant"
139
+ and message.provider == "anthropic"
140
+ and message.model_id == model_id
141
+ and message.raw_message
142
+ and not encode_thoughts
143
+ ):
144
+ return cast(anthropic_types.MessageParam, message.raw_message)
145
+ return {
146
+ "role": message.role,
147
+ "content": _encode_content(message.content, encode_thoughts),
148
+ }
149
+
150
+
151
+ @lru_cache(maxsize=128)
152
+ def _convert_tool_to_tool_param(tool: ToolSchema) -> anthropic_types.ToolParam:
153
+ """Convert a single Mirascope tool to Anthropic tool format with caching."""
154
+ schema_dict = tool.parameters.model_dump(by_alias=True, exclude_none=True)
155
+ schema_dict["type"] = "object"
156
+ return anthropic_types.ToolParam(
157
+ name=tool.name,
158
+ description=tool.description,
159
+ input_schema=schema_dict,
160
+ )
161
+
162
+
163
+ def encode_request(
164
+ *,
165
+ model_id: AnthropicModelId,
166
+ messages: Sequence[Message],
167
+ tools: Sequence[ToolSchema] | BaseToolkit | None,
168
+ format: type[FormattableT] | Format[FormattableT] | None,
169
+ params: Params,
170
+ ) -> tuple[Sequence[Message], Format[FormattableT] | None, MessageCreateKwargs]:
171
+ """Prepares a request for the `Anthropic.messages.create` method."""
172
+ kwargs: MessageCreateKwargs = MessageCreateKwargs(
173
+ {
174
+ "model": model_id,
175
+ "max_tokens": DEFAULT_MAX_TOKENS,
176
+ }
177
+ )
178
+ encode_thoughts = False
179
+
180
+ with _base_utils.ensure_all_params_accessed(
181
+ params=params, provider="anthropic", unsupported_params=["seed"]
182
+ ) as param_accessor:
183
+ if param_accessor.temperature is not None:
184
+ kwargs["temperature"] = param_accessor.temperature
185
+ if param_accessor.max_tokens is not None:
186
+ kwargs["max_tokens"] = param_accessor.max_tokens
187
+ if param_accessor.top_p is not None:
188
+ kwargs["top_p"] = param_accessor.top_p
189
+ if param_accessor.top_k is not None:
190
+ kwargs["top_k"] = param_accessor.top_k
191
+ if param_accessor.stop_sequences is not None:
192
+ kwargs["stop_sequences"] = param_accessor.stop_sequences
193
+ if param_accessor.thinking is not None:
194
+ if param_accessor.thinking:
195
+ # Set budget to 50% of max_tokens with minimum of 1024
196
+ budget_tokens = max(1024, kwargs["max_tokens"] // 2)
197
+ kwargs["thinking"] = {"type": "enabled", "budget_tokens": budget_tokens}
198
+ else:
199
+ kwargs["thinking"] = {"type": "disabled"}
200
+ if param_accessor.encode_thoughts_as_text:
201
+ encode_thoughts = True
202
+
203
+ tools = tools.tools if isinstance(tools, BaseToolkit) else tools or []
204
+ anthropic_tools = [_convert_tool_to_tool_param(tool) for tool in tools]
205
+ format = resolve_format(format, default_mode="tool")
206
+ if format is not None:
207
+ if format.mode == "strict":
208
+ raise FormattingModeNotSupportedError(
209
+ formatting_mode="strict", provider="anthropic"
210
+ )
211
+ elif format.mode == "tool":
212
+ format_tool_schema = _formatting_utils.create_tool_schema(format)
213
+ anthropic_tools.append(_convert_tool_to_tool_param(format_tool_schema))
214
+ if tools:
215
+ kwargs["tool_choice"] = {"type": "any"}
216
+ else:
217
+ kwargs["tool_choice"] = {
218
+ "type": "tool",
219
+ "name": FORMAT_TOOL_NAME,
220
+ "disable_parallel_tool_use": True,
221
+ }
222
+
223
+ if format.formatting_instructions:
224
+ messages = _base_utils.add_system_instructions(
225
+ messages, format.formatting_instructions
226
+ )
227
+
228
+ if anthropic_tools:
229
+ kwargs["tools"] = anthropic_tools
230
+
231
+ system_message_content, remaining_messages = _base_utils.extract_system_message(
232
+ messages
233
+ )
234
+
235
+ kwargs["messages"] = [
236
+ _encode_message(remaining_message, model_id, encode_thoughts)
237
+ for remaining_message in remaining_messages
238
+ ]
239
+
240
+ if system_message_content:
241
+ kwargs["system"] = system_message_content
242
+
243
+ return messages, format, kwargs