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,36 +0,0 @@
1
- """Get JSON output from a Vertex response."""
2
-
3
- import json
4
-
5
- from proto.marshal.collections import RepeatedComposite
6
-
7
- from ..call_response import VertexCallResponse
8
- from ..call_response_chunk import VertexCallResponseChunk
9
-
10
-
11
- def get_json_output(
12
- response: VertexCallResponse | VertexCallResponseChunk, json_mode: bool
13
- ) -> str:
14
- """Extracts the JSON output from a Vertex response."""
15
- if isinstance(response, VertexCallResponse):
16
- if json_mode and (content := response.content):
17
- json_start = content.index("{")
18
- json_end = content.rfind("}")
19
- return content[json_start : json_end + 1]
20
- elif tool_calls := [
21
- part.function_call
22
- for candidate in response.response.candidates
23
- for part in candidate.content.parts
24
- if part.function_call.args
25
- ]:
26
- return json.dumps(
27
- {
28
- k: v if not isinstance(v, RepeatedComposite) else list(v)
29
- for k, v in tool_calls[0].args.items()
30
- }
31
- )
32
- else:
33
- raise ValueError("No tool call or JSON object found in response.")
34
- elif not json_mode:
35
- raise ValueError("Vertex only supports structured streaming in json mode.")
36
- return response.content
@@ -1,33 +0,0 @@
1
- """Handles streaming content and tools from the Vertex API."""
2
-
3
- from collections.abc import AsyncGenerator, Generator
4
-
5
- from vertexai.generative_models import GenerationResponse
6
-
7
- from ..call_response_chunk import VertexCallResponseChunk
8
- from ..tool import VertexTool
9
-
10
-
11
- def handle_stream(
12
- stream: Generator[GenerationResponse, None, None],
13
- tool_types: list[type[VertexTool]] | None = None,
14
- ) -> Generator[tuple[VertexCallResponseChunk, None], None, None]:
15
- """Iterator over the stream and constructs tools as they are streamed.
16
-
17
- Note: vertex does not currently support streaming tools.
18
- """
19
- for chunk in stream:
20
- yield VertexCallResponseChunk(chunk=chunk), None
21
-
22
-
23
- async def handle_stream_async(
24
- stream: AsyncGenerator[GenerationResponse, None],
25
- tool_types: list[type[VertexTool]] | None = None,
26
- ) -> AsyncGenerator[tuple[VertexCallResponseChunk, None], None]:
27
- """
28
- Async iterator over the stream and constructs tools as they are streamed.
29
-
30
- Note: vertex does not currently support streaming tools.
31
- """
32
- async for chunk in stream:
33
- yield VertexCallResponseChunk(chunk=chunk), None
@@ -1,133 +0,0 @@
1
- from typing import cast
2
-
3
- from vertexai.generative_models import Content
4
-
5
- from mirascope.core import BaseMessageParam
6
- from mirascope.core.base import DocumentPart, ImagePart, TextPart
7
- from mirascope.core.base._utils._base_message_param_converter import (
8
- BaseMessageParamConverter,
9
- )
10
- from mirascope.core.base.message_param import ImageURLPart, ToolCallPart, ToolResultPart
11
- from mirascope.core.vertex._utils import convert_message_params
12
-
13
-
14
- def _is_image_mime(mime_type: str) -> bool:
15
- return mime_type in ["image/jpeg", "image/png", "image/gif", "image/webp"]
16
-
17
-
18
- def _to_image_part(mime_type: str, data: bytes) -> ImagePart:
19
- if not _is_image_mime(mime_type):
20
- raise ValueError(
21
- f"Unsupported image media type: {mime_type}. "
22
- "Expected one of: image/jpeg, image/png, image/gif, image/webp."
23
- )
24
- return ImagePart(type="image", media_type=mime_type, image=data, detail=None)
25
-
26
-
27
- def _to_document_part(mime_type: str, data: bytes) -> DocumentPart:
28
- if mime_type != "application/pdf":
29
- raise ValueError(
30
- f"Unsupported document media type: {mime_type}. "
31
- "Only application/pdf is supported."
32
- )
33
- return DocumentPart(type="document", media_type=mime_type, document=data)
34
-
35
-
36
- class VertexMessageParamConverter(BaseMessageParamConverter):
37
- """Converts between Vertex `Content` and Mirascope `BaseMessageParam`."""
38
-
39
- @staticmethod
40
- def to_provider(message_params: list[BaseMessageParam]) -> list[Content]:
41
- """
42
- Convert from Mirascope `BaseMessageParam` to Vertex `Content`.
43
- """
44
- return convert_message_params(
45
- cast(list[BaseMessageParam | Content], message_params)
46
- )
47
-
48
- @staticmethod
49
- def from_provider(message_params: list[Content]) -> list[BaseMessageParam]:
50
- """
51
- Convert from Vertex's `Content` to Mirascope `BaseMessageParam`.
52
- """
53
- converted = []
54
- for message_param in message_params:
55
- role: str = (
56
- "assistant" if message_param.role == "model" else message_param.role
57
- )
58
- contents = []
59
- has_tool_call = False
60
- for part in message_param.parts:
61
- if part.function_response:
62
- converted.append(
63
- BaseMessageParam(
64
- role=message_param.role,
65
- content=[
66
- ToolResultPart(
67
- type="tool_result",
68
- name=part.function_response.name,
69
- content=part.function_response.response["result"], # pyright: ignore [reportReturnType, reportArgumentType]
70
- id=None,
71
- is_error=False,
72
- )
73
- ],
74
- )
75
- )
76
- elif part.inline_data:
77
- blob = part.inline_data
78
- mime = blob.mime_type
79
- data = blob.data
80
- if _is_image_mime(mime):
81
- contents.append(_to_image_part(mime, data))
82
- elif mime == "application/pdf":
83
- contents.append(_to_document_part(mime, data))
84
- else:
85
- raise ValueError(
86
- f"Unsupported inline_data mime type: {mime}. Cannot convert to BaseMessageParam."
87
- )
88
-
89
- elif part.file_data:
90
- if _is_image_mime(part.file_data.mime_type):
91
- contents.append(
92
- ImageURLPart(
93
- type="image_url",
94
- url=part.file_data.file_uri,
95
- detail=None,
96
- )
97
- )
98
- else:
99
- raise ValueError(
100
- f"FileData.file_uri is not support: {part.file_data}. Cannot convert to BaseMessageParam."
101
- )
102
- elif part.function_call:
103
- converted.append(
104
- BaseMessageParam(
105
- role=role,
106
- content=[
107
- ToolCallPart(
108
- type="tool_call",
109
- name=part.function_call.name,
110
- args=dict(part.function_call.args),
111
- )
112
- ],
113
- )
114
- )
115
- elif part.text:
116
- contents.append(TextPart(type="text", text=part.text))
117
-
118
- else: # pragma: no cover
119
- raise ValueError(
120
- "Part does not contain any supported content (text, image, or document)."
121
- )
122
-
123
- if len(contents) == 1 and isinstance(contents[0], TextPart):
124
- converted.append(BaseMessageParam(role=role, content=contents[0].text))
125
- else:
126
- if contents:
127
- converted.append(
128
- BaseMessageParam(
129
- role="tool" if has_tool_call else role, content=contents
130
- )
131
- )
132
-
133
- return converted
@@ -1,160 +0,0 @@
1
- """This module contains the setup_call function, which is used to set up the"""
2
-
3
- from collections.abc import AsyncIterable, Awaitable, Callable, Iterable
4
- from typing import Any, cast, overload
5
-
6
- from google.cloud.aiplatform_v1beta1.types import FunctionCallingConfig
7
- from pydantic import BaseModel
8
- from vertexai.generative_models import (
9
- Content,
10
- GenerationConfig,
11
- GenerationResponse,
12
- GenerativeModel,
13
- Part,
14
- ToolConfig,
15
- )
16
-
17
- from ...base import BaseMessageParam, BaseTool, _utils
18
- from ...base._utils import (
19
- AsyncCreateFn,
20
- CreateFn,
21
- fn_is_async,
22
- get_async_create_fn,
23
- get_create_fn,
24
- )
25
- from ...base.call_params import CommonCallParams
26
- from ...base.stream_config import StreamConfig
27
- from .._call_kwargs import VertexCallKwargs
28
- from ..call_params import VertexCallParams
29
- from ..dynamic_config import VertexDynamicConfig
30
- from ..tool import VertexTool
31
- from ._convert_common_call_params import convert_common_call_params
32
- from ._convert_message_params import convert_message_params
33
-
34
-
35
- @overload
36
- def setup_call(
37
- *,
38
- model: str,
39
- client: GenerativeModel | None,
40
- fn: Callable[..., Awaitable[VertexDynamicConfig]],
41
- fn_args: dict[str, Any],
42
- dynamic_config: VertexDynamicConfig,
43
- tools: list[type[BaseTool] | Callable] | None,
44
- json_mode: bool,
45
- call_params: VertexCallParams | CommonCallParams,
46
- response_model: type[BaseModel] | None,
47
- stream: bool | StreamConfig,
48
- ) -> tuple[
49
- AsyncCreateFn[GenerationResponse, AsyncIterable[GenerationResponse]],
50
- str | None,
51
- list[Content],
52
- list[type[VertexTool]] | None,
53
- VertexCallKwargs,
54
- ]: ...
55
-
56
-
57
- @overload
58
- def setup_call(
59
- *,
60
- model: str,
61
- client: GenerativeModel | None,
62
- fn: Callable[..., VertexDynamicConfig],
63
- fn_args: dict[str, Any],
64
- dynamic_config: VertexDynamicConfig,
65
- tools: list[type[BaseTool] | Callable] | None,
66
- json_mode: bool,
67
- call_params: VertexCallParams | CommonCallParams,
68
- response_model: type[BaseModel] | None,
69
- stream: bool | StreamConfig,
70
- ) -> tuple[
71
- CreateFn[GenerationResponse, Iterable[GenerationResponse]],
72
- str | None,
73
- list[Content],
74
- list[type[VertexTool]] | None,
75
- VertexCallKwargs,
76
- ]: ...
77
-
78
-
79
- def setup_call(
80
- *,
81
- model: str,
82
- client: GenerativeModel | None,
83
- fn: Callable[..., VertexDynamicConfig | Awaitable[VertexDynamicConfig]],
84
- fn_args: dict[str, Any],
85
- dynamic_config: VertexDynamicConfig,
86
- tools: list[type[BaseTool] | Callable] | None,
87
- json_mode: bool,
88
- call_params: VertexCallParams | CommonCallParams,
89
- response_model: type[BaseModel] | None,
90
- stream: bool | StreamConfig,
91
- ) -> tuple[
92
- CreateFn[GenerationResponse, Iterable[GenerationResponse]]
93
- | AsyncCreateFn[GenerationResponse, AsyncIterable[GenerationResponse]],
94
- str | None,
95
- list[Content],
96
- list[type[VertexTool]] | None,
97
- VertexCallKwargs,
98
- ]:
99
- prompt_template, messages, tool_types, base_call_kwargs = _utils.setup_call(
100
- fn,
101
- fn_args,
102
- dynamic_config,
103
- tools,
104
- VertexTool,
105
- call_params,
106
- convert_common_call_params,
107
- )
108
- call_kwargs = cast(VertexCallKwargs, base_call_kwargs)
109
- messages = cast(list[BaseMessageParam | Content], messages)
110
- messages = convert_message_params(messages)
111
-
112
- if json_mode:
113
- generation_config = call_kwargs.get(
114
- "generation_config",
115
- GenerationConfig(response_mime_type="application/json")
116
- if not tools
117
- else GenerationConfig(),
118
- )
119
- call_kwargs["generation_config"] = generation_config
120
- messages[-1] = Content(
121
- role="user",
122
- parts=messages[-1].parts
123
- + [Part.from_text(_utils.json_mode_content(response_model))],
124
- )
125
- elif response_model:
126
- assert tool_types, "At least one tool must be provided for extraction."
127
- call_kwargs.pop("tool_config", None)
128
- tool_config = ToolConfig(
129
- function_calling_config=ToolConfig.FunctionCallingConfig(
130
- mode=FunctionCallingConfig.Mode.ANY,
131
- allowed_function_names=[tool_types[0]._name()],
132
- )
133
- )
134
- call_kwargs["tool_config"] = tool_config
135
-
136
- if client is None:
137
- client = GenerativeModel(model_name=model)
138
-
139
- if messages and messages[0].role == "system":
140
- system_instruction = client._system_instruction
141
- if not isinstance(system_instruction, list):
142
- system_instruction = [system_instruction] if system_instruction else []
143
- system_instruction.extend(messages.pop(0).parts)
144
- client._system_instruction = system_instruction
145
-
146
- call_kwargs |= {"contents": messages}
147
-
148
- create = (
149
- cast(
150
- AsyncCreateFn[GenerationResponse, AsyncIterable[GenerationResponse]],
151
- get_async_create_fn(client.generate_content_async),
152
- )
153
- if fn_is_async(fn)
154
- else cast(
155
- CreateFn[GenerationResponse, Iterable[GenerationResponse]],
156
- get_create_fn(client.generate_content),
157
- )
158
- )
159
-
160
- return create, prompt_template, messages, tool_types, call_kwargs
@@ -1,24 +0,0 @@
1
- """usage docs: learn/calls.md#provider-specific-parameters"""
2
-
3
- from __future__ import annotations
4
-
5
- from typing_extensions import NotRequired
6
- from vertexai.generative_models import GenerationConfig, SafetySetting, ToolConfig
7
-
8
- from ..base import BaseCallParams
9
-
10
-
11
- class VertexCallParams(BaseCallParams):
12
- """The parameters to use when calling the Vertex API.
13
-
14
- [Vertex API Reference](https://cloud.google.com/python/docs/reference/aiplatform/latest)
15
-
16
- Attributes:
17
- generation_config: ...
18
- safety_settings: ...
19
- tool_config: ...
20
- """
21
-
22
- generation_config: NotRequired[GenerationConfig]
23
- safety_settings: NotRequired[SafetySetting]
24
- tool_config: NotRequired[ToolConfig]
@@ -1,206 +0,0 @@
1
- """This module contains the `VertexCallResponse` class.
2
-
3
- usage docs: learn/calls.md#handling-responses
4
- """
5
-
6
- from collections.abc import Sequence
7
- from functools import cached_property
8
-
9
- from google.cloud.aiplatform_v1beta1.types import GenerateContentResponse
10
- from pydantic import computed_field
11
- from vertexai.generative_models import Content, GenerationResponse, Part, Tool
12
-
13
- from .. import BaseMessageParam
14
- from ..base import BaseCallResponse, transform_tool_outputs
15
- from ..base.types import CostMetadata, FinishReason
16
- from ._utils._convert_finish_reason_to_common_finish_reasons import (
17
- _convert_finish_reasons_to_common_finish_reasons,
18
- )
19
- from ._utils._message_param_converter import VertexMessageParamConverter
20
- from .call_params import VertexCallParams
21
- from .dynamic_config import VertexDynamicConfig
22
- from .tool import VertexTool
23
-
24
-
25
- class VertexCallResponse(
26
- BaseCallResponse[
27
- GenerationResponse,
28
- VertexTool,
29
- Tool,
30
- VertexDynamicConfig,
31
- Content,
32
- VertexCallParams,
33
- Content,
34
- VertexMessageParamConverter,
35
- ]
36
- ):
37
- """A convenience wrapper around the Vertex AI `GenerateContentResponse`.
38
-
39
- When calling the Vertex AI API using a function decorated with `vertex_call`, the
40
- response will be a `VertexCallResponse` instance with properties that allow for
41
- more convenient access to commonly used attributes.
42
-
43
- Example:
44
-
45
- ```python
46
- from mirascope.core import prompt_template
47
- from mirascope.core.vertex import vertex_call
48
-
49
-
50
- @vertex_call("gemini-1.5-flash")
51
- def recommend_book(genre: str) -> str:
52
- return f"Recommend a {genre} book"
53
-
54
-
55
- response = recommend_book("fantasy") # response is an `VertexCallResponse` instance
56
- print(response.content)
57
- ```
58
- """
59
-
60
- _message_converter: type[VertexMessageParamConverter] = VertexMessageParamConverter
61
-
62
- _provider = "vertex"
63
-
64
- @computed_field
65
- @property
66
- def content(self) -> str:
67
- """Returns the contained string content for the 0th choice."""
68
- return self.response.candidates[0].content.parts[0].text
69
-
70
- @computed_field
71
- @property
72
- def finish_reasons(self) -> list[str]:
73
- """Returns the finish reasons of the response."""
74
- finish_reasons = [
75
- "FINISH_REASON_UNSPECIFIED",
76
- "STOP",
77
- "MAX_TOKENS",
78
- "SAFETY",
79
- "RECITATION",
80
- "OTHER",
81
- ]
82
-
83
- return [
84
- finish_reasons[candidate.finish_reason]
85
- for candidate in self.response.candidates
86
- ]
87
-
88
- @computed_field
89
- @property
90
- def model(self) -> str:
91
- """Returns the model name.
92
-
93
- vertex does not return model, so we return the model provided by
94
- the user.
95
- """
96
- return self._model
97
-
98
- @computed_field
99
- @property
100
- def id(self) -> str | None:
101
- """Returns the id of the response.
102
-
103
- vertex does not return an id
104
- """
105
- return None
106
-
107
- @property
108
- def usage(self) -> GenerateContentResponse.UsageMetadata:
109
- """Returns the usage of the chat completion."""
110
- return self.response.usage_metadata
111
-
112
- @computed_field
113
- @property
114
- def input_tokens(self) -> int:
115
- """Returns the number of input tokens."""
116
- return self.usage.prompt_token_count
117
-
118
- @computed_field
119
- @property
120
- def cached_tokens(self) -> int:
121
- """Returns the number of cached tokens."""
122
- return 0
123
-
124
- @computed_field
125
- @property
126
- def output_tokens(self) -> int:
127
- """Returns the number of output tokens."""
128
- return self.usage.candidates_token_count
129
-
130
- @computed_field
131
- @cached_property
132
- def message_param(self) -> Content:
133
- """Returns the models's response as a message parameter."""
134
- return Content(role="model", parts=self.response.candidates[0].content.parts)
135
-
136
- @cached_property
137
- def tools(self) -> list[VertexTool] | None:
138
- """Returns the list of tools for the 0th candidate's 0th content part."""
139
- if self.tool_types is None:
140
- return None
141
-
142
- extracted_tools = []
143
- for part in self.response.candidates[0].content.parts:
144
- tool_call = part.function_call
145
- for tool_type in self.tool_types:
146
- if tool_call.name == tool_type._name():
147
- extracted_tools.append(tool_type.from_tool_call(tool_call))
148
- break
149
-
150
- return extracted_tools
151
-
152
- @cached_property
153
- def tool(self) -> VertexTool | None:
154
- """Returns the 0th tool for the 0th candidate's 0th content part.
155
-
156
- Raises:
157
- ValidationError: if the tool call doesn't match the tool's schema.
158
- """
159
- tools = self.tools
160
- if tools:
161
- return tools[0]
162
- return None
163
-
164
- @classmethod
165
- @transform_tool_outputs
166
- def tool_message_params(
167
- cls, tools_and_outputs: Sequence[tuple[VertexTool, str]]
168
- ) -> list[Content]:
169
- """Returns the tool message parameters for tool call results.
170
-
171
- Args:
172
- tools_and_outputs: The sequence of tools and their outputs from which the tool
173
- message parameters should be constructed.
174
-
175
- Returns:
176
- The list of constructed `Content` from the tool responses.
177
- """
178
- return [
179
- Content(
180
- role="user",
181
- parts=[
182
- Part.from_function_response(
183
- name=tool._name(), response={"result": output}
184
- )
185
- for tool, output in tools_and_outputs
186
- ],
187
- )
188
- ]
189
-
190
- @property
191
- def common_finish_reasons(self) -> list[FinishReason] | None:
192
- return _convert_finish_reasons_to_common_finish_reasons(self.finish_reasons)
193
-
194
- @property
195
- def common_message_param(self) -> BaseMessageParam:
196
- return VertexMessageParamConverter.from_provider([self.message_param])[0]
197
-
198
- @property
199
- def common_user_message_param(self) -> BaseMessageParam | None:
200
- if not self.user_message_param:
201
- return None
202
- return VertexMessageParamConverter.from_provider([self.user_message_param])[0]
203
-
204
- @property
205
- def cost_metadata(self) -> CostMetadata:
206
- return super().cost_metadata
@@ -1,99 +0,0 @@
1
- """This module contains the `VertexCallResponseChunk` class.
2
-
3
- usage docs: learn/streams.md#handling-streamed-responses
4
- """
5
-
6
- from vertexai.generative_models import FinishReason, GenerationResponse
7
-
8
- from ..base import BaseCallResponseChunk, types
9
- from ..base.types import CostMetadata
10
- from ._utils._convert_finish_reason_to_common_finish_reasons import (
11
- _convert_finish_reasons_to_common_finish_reasons,
12
- )
13
-
14
-
15
- class VertexCallResponseChunk(
16
- BaseCallResponseChunk[GenerationResponse, FinishReason] # , Candidate.FinishReason]
17
- ):
18
- """A convenience wrapper around the Vertex AI streamed response chunks.
19
-
20
- When calling the Vertex AI API using a function decorated with `vertex_call` and
21
- `stream` set to `True`, the stream will contain `VertexCallResponseChunk` instances
22
- with properties that allow for more convenient access to commonly used attributes.
23
-
24
- Example:
25
-
26
- ```python
27
- from mirascope.core import prompt_template
28
- from mirascope.core.vertex import vertex_call
29
-
30
-
31
- @vertex_call("gemini-1.5-flash", stream=True)
32
- def recommend_book(genre: str) -> str:
33
- return f"Recommend a {genre} book"
34
-
35
- stream = recommend_book("fantasy") # response is an `VertexStream`
36
- for chunk, _ in stream:
37
- print(chunk.content, end="", flush=True)
38
- ```
39
- """
40
-
41
- @property
42
- def content(self) -> str:
43
- """Returns the chunk content for the 0th choice."""
44
- return self.chunk.candidates[0].content.parts[0].text
45
-
46
- @property
47
- def finish_reasons(self) -> list[FinishReason]:
48
- """Returns the finish reasons of the response."""
49
- return [candidate.finish_reason for candidate in self.chunk.candidates]
50
-
51
- @property
52
- def model(self) -> None:
53
- """Returns the model name.
54
-
55
- vertex does not return model, so we return None
56
- """
57
- return None
58
-
59
- @property
60
- def id(self) -> str | None:
61
- """Returns the id of the response.
62
-
63
- vertex does not return an id
64
- """
65
- return None
66
-
67
- @property
68
- def usage(self) -> None:
69
- """Returns the usage of the chat completion.
70
-
71
- vertex does not have Usage, so we return None
72
- """
73
- return None
74
-
75
- @property
76
- def input_tokens(self) -> None:
77
- """Returns the number of input tokens."""
78
- return None
79
-
80
- @property
81
- def cached_tokens(self) -> None:
82
- """Returns the number of cached tokens."""
83
- return None
84
-
85
- @property
86
- def output_tokens(self) -> None:
87
- """Returns the number of output tokens."""
88
- return None
89
-
90
- @property
91
- def cost_metadata(self) -> CostMetadata:
92
- """Returns the cost metadata."""
93
- return super().cost_metadata
94
-
95
- @property
96
- def common_finish_reasons(self) -> list[types.FinishReason] | None:
97
- return _convert_finish_reasons_to_common_finish_reasons(
98
- [finish_reason.name for finish_reason in self.finish_reasons]
99
- )