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
@@ -1,178 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from collections.abc import Sequence
4
- from io import FileIO
5
- from typing import cast
6
- from wave import Wave_read
7
-
8
- from pydantic import BaseModel
9
- from typing_extensions import TypeIs
10
-
11
- from ..message_param import (
12
- AudioPart,
13
- AudioURLPart,
14
- BaseMessageParam,
15
- CacheControlPart,
16
- DocumentPart,
17
- DocumentURLPart,
18
- ImagePart,
19
- ImageURLPart,
20
- TextPart,
21
- )
22
- from ..types import AudioSegment, Image, has_pil_module, has_pydub_module
23
- from ._pil_image_to_bytes import pil_image_to_bytes
24
-
25
- SAMPLE_WIDTH = 2
26
- FRAME_RATE = 24000
27
- CHANNELS = 1
28
-
29
-
30
- def _convert_message_sequence_part_to_content_part(
31
- message_sequence_part: str
32
- | TextPart
33
- | CacheControlPart
34
- | ImagePart
35
- | ImageURLPart
36
- | Image.Image
37
- | AudioPart
38
- | AudioURLPart
39
- | AudioSegment
40
- | Wave_read
41
- | DocumentPart
42
- | DocumentURLPart,
43
- ) -> (
44
- TextPart
45
- | ImagePart
46
- | ImageURLPart
47
- | AudioPart
48
- | AudioURLPart
49
- | CacheControlPart
50
- | DocumentURLPart
51
- | DocumentPart
52
- ):
53
- if isinstance(message_sequence_part, str):
54
- return TextPart(text=message_sequence_part, type="text")
55
- elif isinstance(
56
- message_sequence_part,
57
- TextPart
58
- | ImagePart
59
- | ImageURLPart
60
- | AudioPart
61
- | AudioURLPart
62
- | CacheControlPart
63
- | DocumentPart
64
- | DocumentURLPart,
65
- ):
66
- return message_sequence_part
67
- elif has_pil_module and isinstance(message_sequence_part, Image.Image):
68
- media_type = (
69
- Image.MIME[message_sequence_part.format]
70
- if message_sequence_part.format
71
- else "image/unknown"
72
- )
73
- return ImagePart(
74
- type="image",
75
- media_type=media_type,
76
- image=pil_image_to_bytes(message_sequence_part),
77
- detail=None,
78
- )
79
- elif has_pydub_module and isinstance(message_sequence_part, AudioSegment):
80
- return AudioPart(
81
- type="audio",
82
- media_type="audio/wav",
83
- audio=cast(
84
- FileIO,
85
- message_sequence_part.set_frame_rate(FRAME_RATE)
86
- .set_channels(CHANNELS)
87
- .set_sample_width(SAMPLE_WIDTH)
88
- .export(format="wav"),
89
- ).read(),
90
- )
91
- elif isinstance(message_sequence_part, Wave_read):
92
- return AudioPart(
93
- type="audio",
94
- media_type="audio/wav",
95
- audio=message_sequence_part.readframes(-1),
96
- )
97
- else:
98
- raise ValueError(f"Invalid message sequence type: {message_sequence_part}")
99
-
100
-
101
- def convert_message_content_to_message_param_content(
102
- message_sequence: Sequence[
103
- str
104
- | TextPart
105
- | CacheControlPart
106
- | ImagePart
107
- | ImageURLPart
108
- | Image.Image
109
- | AudioPart
110
- | AudioURLPart
111
- | AudioSegment
112
- | Wave_read
113
- | DocumentPart
114
- | DocumentURLPart,
115
- ],
116
- ) -> (
117
- list[
118
- TextPart
119
- | ImagePart
120
- | ImageURLPart
121
- | AudioPart
122
- | AudioURLPart
123
- | CacheControlPart
124
- | DocumentPart
125
- | DocumentURLPart,
126
- ]
127
- | str
128
- ):
129
- if isinstance(message_sequence, str):
130
- return message_sequence
131
- return [
132
- _convert_message_sequence_part_to_content_part(message)
133
- for message in message_sequence
134
- ]
135
-
136
-
137
- def _is_base_message_params(
138
- value: object,
139
- ) -> TypeIs[list[BaseMessageParam]]:
140
- # Note: we also need to catch the original provider message parameters here
141
- return isinstance(value, list) and all(
142
- isinstance(v, BaseMessageParam | dict | BaseModel) for v in value
143
- )
144
-
145
-
146
- def convert_messages_to_message_params(
147
- messages: str
148
- | Sequence[
149
- str
150
- | TextPart
151
- | CacheControlPart
152
- | ImagePart
153
- | ImageURLPart
154
- | Image.Image
155
- | AudioPart
156
- | AudioURLPart
157
- | AudioSegment
158
- | Wave_read
159
- | DocumentPart
160
- | DocumentURLPart,
161
- ]
162
- | list[BaseMessageParam]
163
- | BaseMessageParam,
164
- role: str = "user",
165
- ) -> list[BaseMessageParam]:
166
- if isinstance(messages, BaseMessageParam):
167
- return [messages]
168
- elif _is_base_message_params(messages):
169
- return messages
170
- elif isinstance(messages, str | Sequence):
171
- return [
172
- BaseMessageParam(
173
- content=convert_message_content_to_message_param_content(messages),
174
- role=role,
175
- )
176
- ]
177
- else:
178
- raise ValueError(f"Invalid messages type: {messages}")
@@ -1,20 +0,0 @@
1
- from typing import Literal, TypeAlias, cast
2
-
3
- from mirascope.core.base.types import FinishReason
4
-
5
- FinishReasonMappingValue: TypeAlias = Literal[
6
- "stop", "length", "tool_calls", "content_filter"
7
- ]
8
-
9
-
10
- def _convert_finish_reasons_to_common_finish_reasons_from_mapping(
11
- finish_reasons: list[str] | None, mapping: dict[str, FinishReasonMappingValue]
12
- ) -> list[FinishReason] | None:
13
- """Provider-agnostic finish reasons."""
14
- if not finish_reasons:
15
- return None
16
- return [
17
- cast(FinishReason, mapping[reason])
18
- for reason in finish_reasons
19
- if reason in mapping
20
- ] or None
@@ -1,6 +0,0 @@
1
- """The default docstring to use when tools don't have a docstring."""
2
-
3
- DEFAULT_TOOL_DOCSTRING = """\
4
- Correctly formatted and typed parameters extracted from the completion. \
5
- Must include required parameters and may exclude optional parameters unless present in the text.\
6
- """
@@ -1,42 +0,0 @@
1
- """This module contains the function to extract the return value of a tool."""
2
-
3
- from typing import Any, TypeAlias, TypeVar
4
-
5
- import jiter
6
- from pydantic import BaseModel
7
-
8
- from .._partial import partial
9
- from ._base_type import BaseType, is_base_type
10
- from ._convert_base_type_to_base_tool import convert_base_type_to_base_tool
11
-
12
- _BaseModelT = TypeVar("_BaseModelT", bound=BaseModel)
13
- _BaseTypeT = TypeVar("_BaseTypeT", bound=BaseType)
14
-
15
- _ResponseModelT: TypeAlias = _BaseModelT | _BaseTypeT
16
-
17
-
18
- def extract_tool_return(
19
- response_model: type[_ResponseModelT],
20
- json_output: str | object,
21
- allow_partial: bool,
22
- fields_from_call_args: dict[str, Any],
23
- ) -> _ResponseModelT:
24
- json_obj = (
25
- jiter.from_json(
26
- json_output.encode(),
27
- partial_mode="trailing-strings" if allow_partial else "off",
28
- )
29
- if json_output and isinstance(json_output, str)
30
- else json_output or {}
31
- )
32
- if is_base_type(response_model):
33
- temp_model = convert_base_type_to_base_tool(response_model, BaseModel)
34
- if allow_partial:
35
- return partial(temp_model).model_validate(json_obj).value # pyright: ignore [reportAttributeAccessIssue]
36
- return temp_model.model_validate(json_obj).value # pyright: ignore [reportAttributeAccessIssue]
37
- if fields_from_call_args and isinstance(json_obj, dict):
38
- # Support only top-level dict
39
- json_obj.update(fields_from_call_args)
40
- if allow_partial:
41
- return partial(response_model).model_validate(json_obj)
42
- return response_model.model_validate(json_obj)
@@ -1,24 +0,0 @@
1
- """This module contains the `fn_is_async` function."""
2
-
3
- import inspect
4
- from collections.abc import Awaitable, Callable, Coroutine
5
- from typing import Any, TypeVar
6
-
7
- from typing_extensions import TypeIs
8
-
9
- _R = TypeVar("_R")
10
-
11
-
12
- def fn_is_async(
13
- fn: Callable[..., Awaitable[_R] | Coroutine[Any, Any, _R]] | Callable[..., _R],
14
- ) -> TypeIs[Callable[..., Awaitable[_R]]]:
15
- if inspect.iscoroutinefunction(fn):
16
- return True
17
-
18
- # Check if it's a wrapper around an `async def` function (using functools.wraps).
19
- _fn = fn
20
- while hasattr(_fn, "__wrapped__"):
21
- _fn = _fn.__wrapped__ # pyright: ignore[reportFunctionMemberAccess]
22
- if inspect.iscoroutinefunction(_fn):
23
- return True
24
- return False
@@ -1,32 +0,0 @@
1
- """This module contains the `format_template` function."""
2
-
3
- from textwrap import dedent
4
- from typing import Any
5
-
6
- from ._get_template_values import get_template_values
7
- from ._get_template_variables import get_template_variables
8
-
9
-
10
- def format_template(template: str, attrs: dict[str, Any], strip: bool = True) -> str:
11
- """Formats the given prompt `template`
12
-
13
- Args:
14
- template: The template to format.
15
- attrs: The attributes to use for formatting.
16
- strip: Whether to strip the formatted template.
17
-
18
- Returns:
19
- The formatted template.
20
-
21
- """
22
- dedented_template = dedent(template)
23
- if strip:
24
- dedented_template = dedented_template.strip()
25
- template_vars = get_template_variables(dedented_template, True)
26
-
27
- values = get_template_values(template_vars, attrs)
28
-
29
- # Remove any special format specs that are actually invalid normally
30
- dedented_template = dedented_template.replace(":lists", "").replace(":list", "")
31
- result = dedented_template.format(**values)
32
- return result.strip() if strip else result
@@ -1,18 +0,0 @@
1
- """Utility for determining the type of an audio file from its bytes."""
2
-
3
-
4
- def get_audio_type(audio_data: bytes) -> str:
5
- if audio_data.startswith(b"RIFF") and audio_data[8:12] == b"WAVE":
6
- return "wav"
7
- elif audio_data.startswith(b"ID3") or audio_data.startswith(b"\xff\xfb"):
8
- return "mp3"
9
- elif audio_data.startswith(b"FORM") and audio_data[8:12] == b"AIFF":
10
- return "aiff"
11
- elif audio_data.startswith(b"\xff\xf1") or audio_data.startswith(b"\xff\xf9"):
12
- return "aac"
13
- elif audio_data.startswith(b"OggS"):
14
- return "ogg"
15
- elif audio_data.startswith(b"fLaC"):
16
- return "flac"
17
-
18
- raise ValueError("Unsupported audio type")
@@ -1,20 +0,0 @@
1
- from mirascope.core.base.types import Usage
2
-
3
-
4
- def get_common_usage(
5
- input_tokens: int | float | None,
6
- cached_tokens: int | float | None,
7
- output_tokens: int | float | None,
8
- ) -> Usage | None:
9
- """Get common usage from input and output tokens."""
10
- if input_tokens is None and cached_tokens is None and output_tokens is None:
11
- return None
12
- input_tokens = int(input_tokens or 0)
13
- cached_tokens = int(cached_tokens or 0)
14
- output_tokens = int(output_tokens or 0)
15
- return Usage(
16
- input_tokens=input_tokens,
17
- cached_tokens=cached_tokens,
18
- output_tokens=output_tokens,
19
- total_tokens=input_tokens + output_tokens,
20
- )
@@ -1,137 +0,0 @@
1
- import inspect
2
- from collections.abc import (
3
- AsyncGenerator,
4
- AsyncIterable,
5
- AsyncIterator,
6
- Awaitable,
7
- Callable,
8
- Coroutine,
9
- Generator,
10
- Iterable,
11
- Iterator,
12
- )
13
- from typing import (
14
- Any,
15
- Literal,
16
- TypeAlias,
17
- TypeVar,
18
- cast,
19
- overload,
20
- )
21
-
22
- from typing_extensions import TypeIs
23
-
24
- from ..stream_config import StreamConfig
25
- from ._protocols import AsyncCreateFn, CreateFn
26
-
27
- _StreamedResponse = TypeVar("_StreamedResponse")
28
- _NonStreamedResponse = TypeVar("_NonStreamedResponse")
29
- _T = TypeVar("_T")
30
-
31
-
32
- def is_awaitable(value: _T | Awaitable[_T]) -> TypeIs[Awaitable[_T]]:
33
- return inspect.isawaitable(value)
34
-
35
-
36
- _AsyncFunc: TypeAlias = Callable[..., Awaitable[_NonStreamedResponse]]
37
- _AsyncGeneratorFunc: TypeAlias = (
38
- Callable[..., Awaitable[AsyncGenerator[_StreamedResponse, None]]]
39
- | Callable[..., AsyncGenerator[_StreamedResponse, None]]
40
- | Callable[..., AsyncIterator[_StreamedResponse]]
41
- | Callable[..., AsyncIterable[_StreamedResponse]]
42
- | Callable[..., Coroutine[Any, Any, _StreamedResponse]]
43
- )
44
-
45
- _SyncFunc: TypeAlias = Callable[..., _NonStreamedResponse]
46
- _SyncGeneratorFunc: TypeAlias = Callable[
47
- ..., Iterator[_StreamedResponse] | Iterable[_StreamedResponse]
48
- ]
49
-
50
-
51
- def get_async_create_fn(
52
- async_func: _AsyncFunc[_NonStreamedResponse],
53
- async_generator_func: _AsyncGeneratorFunc[_StreamedResponse] | None = None,
54
- ) -> AsyncCreateFn[_NonStreamedResponse, _StreamedResponse]:
55
- @overload
56
- def create_or_stream( # pyright: ignore[reportOverlappingOverload]
57
- *,
58
- stream: Literal[True] | StreamConfig = True,
59
- **kwargs: Any, # noqa: ANN401
60
- ) -> Awaitable[AsyncGenerator[_StreamedResponse, None]]: ...
61
-
62
- @overload
63
- def create_or_stream(
64
- *,
65
- stream: Literal[False] = False,
66
- **kwargs: Any, # noqa: ANN401
67
- ) -> Awaitable[_NonStreamedResponse]: ...
68
-
69
- def create_or_stream(
70
- *,
71
- stream: bool | StreamConfig = False,
72
- **kwargs: Any, # noqa: ANN401
73
- ) -> (
74
- Awaitable[AsyncGenerator[_StreamedResponse, None]]
75
- | Awaitable[_NonStreamedResponse]
76
- ):
77
- if not stream:
78
- return cast(Awaitable[_NonStreamedResponse], async_func(**kwargs))
79
- else:
80
- if async_generator_func is None:
81
- async_generator = async_func(**kwargs, stream=True)
82
- else:
83
- async_generator = async_generator_func(**kwargs)
84
- if inspect.isasyncgen(async_generator) or not is_awaitable(async_generator):
85
-
86
- async def _stream() -> AsyncGenerator[_StreamedResponse]:
87
- return cast(AsyncGenerator[_StreamedResponse], async_generator)
88
-
89
- return _stream()
90
- else:
91
- return cast(
92
- Awaitable[AsyncGenerator[_StreamedResponse]], async_generator
93
- )
94
-
95
- return create_or_stream
96
-
97
-
98
- def get_create_fn(
99
- sync_func: _SyncFunc[_NonStreamedResponse],
100
- sync_generator_func: _SyncGeneratorFunc[_StreamedResponse] | None = None,
101
- ) -> CreateFn[_NonStreamedResponse, _StreamedResponse]:
102
- @overload
103
- def create_or_stream( # pyright: ignore[reportOverlappingOverload]
104
- *,
105
- stream: Literal[True] | StreamConfig = True,
106
- **kwargs: Any, # noqa: ANN401
107
- ) -> Generator[_StreamedResponse, None, None]: ...
108
-
109
- @overload
110
- def create_or_stream(
111
- *,
112
- stream: Literal[False] = False,
113
- **kwargs: Any, # noqa: ANN401
114
- ) -> _NonStreamedResponse: ...
115
-
116
- def create_or_stream(
117
- *,
118
- stream: bool | StreamConfig = False,
119
- **kwargs: Any, # noqa: ANN401
120
- ) -> Generator[_StreamedResponse, None, None] | _NonStreamedResponse:
121
- if stream:
122
- if sync_generator_func is None:
123
- generator = cast(
124
- Iterator[_StreamedResponse],
125
- sync_func(**kwargs, stream=True),
126
- )
127
- else:
128
- generator = sync_generator_func(**kwargs)
129
-
130
- def _stream() -> Generator[_StreamedResponse, None, None]:
131
- yield from generator
132
-
133
- return _stream()
134
-
135
- return cast(_NonStreamedResponse, sync_func(**kwargs))
136
-
137
- return create_or_stream
@@ -1,7 +0,0 @@
1
- """Utility for determining the type of an document from its bytes."""
2
-
3
-
4
- def get_document_type(document_data: bytes) -> str:
5
- if document_data.startswith(b"%PDF"):
6
- return "pdf"
7
- raise ValueError("Unsupported document type")
@@ -1,69 +0,0 @@
1
- import inspect
2
- from collections.abc import Awaitable, Callable
3
- from typing import Any, TypeVar, cast, overload
4
-
5
- from typing_extensions import TypeIs
6
-
7
- from ..dynamic_config import BaseDynamicConfig
8
- from ..message_param import BaseMessageParam
9
-
10
- _BaseDynamicConfigT = TypeVar(
11
- "_BaseDynamicConfigT", bound=BaseDynamicConfig, covariant=True
12
- )
13
-
14
- _AsyncBaseDynamicConfigT = TypeVar(
15
- "_AsyncBaseDynamicConfigT", bound=BaseDynamicConfig, covariant=True
16
- )
17
-
18
-
19
- def _is_message_param_list(result: object) -> TypeIs[list[BaseMessageParam]]:
20
- return isinstance(result, list)
21
-
22
-
23
- @overload
24
- def get_dynamic_configuration(
25
- fn: Callable[..., _BaseDynamicConfigT | list[BaseMessageParam]],
26
- args: tuple[Any, ...],
27
- kwargs: dict[str, Any],
28
- ) -> _BaseDynamicConfigT: ...
29
-
30
-
31
- @overload
32
- def get_dynamic_configuration(
33
- fn: Callable[
34
- ..., Awaitable[_AsyncBaseDynamicConfigT] | Awaitable[list[BaseMessageParam]]
35
- ],
36
- args: tuple[Any, ...],
37
- kwargs: dict[str, Any],
38
- ) -> Awaitable[_AsyncBaseDynamicConfigT]: ...
39
-
40
-
41
- def get_dynamic_configuration(
42
- fn: Callable[
43
- ...,
44
- _BaseDynamicConfigT
45
- | list[BaseMessageParam]
46
- | Awaitable[_AsyncBaseDynamicConfigT]
47
- | Awaitable[list[BaseMessageParam]],
48
- ],
49
- args: tuple[Any, ...],
50
- kwargs: dict[str, Any],
51
- ) -> _BaseDynamicConfigT | Awaitable[_AsyncBaseDynamicConfigT]:
52
- result = (
53
- fn._original_fn(*args, **kwargs) # pyright: ignore [reportFunctionMemberAccess]
54
- if hasattr(fn, "_original_fn")
55
- else fn(*args, **kwargs)
56
- )
57
- if inspect.isawaitable(result):
58
-
59
- async def inner_async() -> _AsyncBaseDynamicConfigT:
60
- async_result = await result
61
- if _is_message_param_list(async_result):
62
- return cast(_AsyncBaseDynamicConfigT, {"messages": async_result})
63
- return cast(_AsyncBaseDynamicConfigT, async_result)
64
-
65
- return inner_async()
66
-
67
- if _is_message_param_list(result):
68
- return cast(_BaseDynamicConfigT, {"messages": result})
69
- return result
@@ -1,34 +0,0 @@
1
- """Get FromCallArgs() annotated fields from a function call's args/kwargs."""
2
-
3
- import inspect
4
- from collections.abc import Callable
5
- from typing import Any, get_origin
6
-
7
- from pydantic import BaseModel
8
-
9
- from mirascope.core.base._utils import get_fn_args
10
- from mirascope.core.base.from_call_args import is_from_call_args
11
-
12
-
13
- def get_fields_from_call_args(
14
- response_model: object,
15
- fn: Callable,
16
- args: tuple[object, ...],
17
- kwargs: dict[str, Any],
18
- ) -> dict[str, Any]:
19
- if origin := get_origin(response_model):
20
- response_model = origin
21
- if not (inspect.isclass(response_model) and issubclass(response_model, BaseModel)):
22
- return {}
23
- call_args_fields = {
24
- name
25
- for name, field in response_model.model_fields.items()
26
- if is_from_call_args(field)
27
- }
28
-
29
- fn_args = get_fn_args(fn, args, kwargs)
30
- if not call_args_fields.issubset(fn_args.keys()):
31
- raise ValueError(
32
- f"The function arguments do not contain all the fields marked with `FromCallArgs`. {fn_args=}, {call_args_fields=}"
33
- )
34
- return {name: fn_args[name] for name in call_args_fields}
@@ -1,23 +0,0 @@
1
- """Function for binding `args` and `kwargs` as a dictionary to the fn's signature."""
2
-
3
- import inspect
4
- from collections.abc import Callable
5
- from typing import Any
6
-
7
-
8
- def get_fn_args(
9
- fn: Callable, args: tuple[object, ...], kwargs: dict[str, Any]
10
- ) -> dict[str, Any]:
11
- """Returns the `args` and `kwargs` as a dictionary bound by `fn`'s signature."""
12
- signature = inspect.signature(fn)
13
- bound_args = signature.bind_partial(*args, **kwargs)
14
- bound_args.apply_defaults()
15
-
16
- fn_args = {}
17
- for name, value in bound_args.arguments.items():
18
- if signature.parameters[name].kind == inspect.Parameter.VAR_KEYWORD:
19
- fn_args.update(value)
20
- else:
21
- fn_args[name] = value
22
-
23
- return fn_args
@@ -1,39 +0,0 @@
1
- import base64
2
- import io
3
- import re
4
-
5
- from ...base.types import Image, ImageMetadata, has_pil_module
6
- from ._parse_content_template import _load_media
7
-
8
-
9
- def get_image_dimensions(data_url: str) -> ImageMetadata | None:
10
- """
11
- Extract width and height from a base64 encoded image.
12
-
13
- Args:
14
- data_url: The data URL containing base64 encoded image data or External URL
15
-
16
- Returns:
17
- Dictionary with width and height, or None if extraction failed
18
- """
19
- try:
20
- if data_url.startswith("http"):
21
- binary_data = _load_media(data_url)
22
- else:
23
- # Extract the base64 data part from the URL
24
- # Format is: data:[<media type>][;base64],<data>
25
- pattern = r"data:image/[^;]+;base64,"
26
- base64_data = re.sub(pattern, "", data_url)
27
-
28
- # Decode the base64 data
29
- binary_data = base64.b64decode(base64_data)
30
-
31
- # Use PIL to open the image and get dimensions
32
- if not has_pil_module: # pragma: no cover
33
- raise ImportError("PIL module is not available")
34
- with Image.open(io.BytesIO(binary_data)) as image:
35
- width, height = image.size
36
-
37
- return ImageMetadata(width=width, height=height)
38
- except Exception:
39
- return None
@@ -1,26 +0,0 @@
1
- """Utility for determining the type of an image from its bytes."""
2
-
3
-
4
- def get_image_type(image_data: bytes) -> str:
5
- if image_data.startswith(b"\xff\xd8\xff"):
6
- return "jpeg"
7
- elif image_data.startswith(b"\x89PNG\r\n\x1a\n"):
8
- return "png"
9
- elif image_data.startswith(b"GIF87a") or image_data.startswith(b"GIF89a"):
10
- return "gif"
11
- elif image_data.startswith(b"RIFF") and image_data[8:12] == b"WEBP":
12
- return "webp"
13
- elif image_data[4:12] in (
14
- b"ftypmif1",
15
- b"ftypmsf1",
16
- b"ftypheic",
17
- b"ftypheix",
18
- b"ftyphevc",
19
- b"ftyphevx",
20
- ):
21
- subtype = image_data[8:12]
22
- if subtype in (b"heic", b"heix"):
23
- return "heic"
24
- elif subtype in (b"mif1", b"msf1", b"hevc", b"hevx"):
25
- return "heif"
26
- raise ValueError("Unsupported image type")