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,79 +0,0 @@
1
- """Utility for setting up a provider-specific call."""
2
-
3
- import inspect
4
- from collections.abc import (
5
- Awaitable,
6
- Callable,
7
- Sequence,
8
- )
9
- from typing import Any, Protocol, TypeVar, cast
10
-
11
- from ..call_kwargs import BaseCallKwargs
12
- from ..call_params import BaseCallParams, CommonCallParams
13
- from ..dynamic_config import BaseDynamicConfig
14
- from ..message_param import BaseMessageParam
15
- from ..tool import BaseTool
16
- from . import get_prompt_template, parse_prompt_messages
17
- from ._convert_base_model_to_base_tool import convert_base_model_to_base_tool
18
- from ._convert_function_to_base_tool import convert_function_to_base_tool
19
-
20
- _BaseToolT = TypeVar("_BaseToolT", bound=BaseTool)
21
- _BaseDynamicConfigT = TypeVar("_BaseDynamicConfigT", bound=BaseDynamicConfig)
22
- _BaseCallParamsT = TypeVar("_BaseCallParamsT", bound=BaseCallParams, covariant=True)
23
- _CALL_PARAMS_KEYS = set(CommonCallParams.__annotations__)
24
-
25
-
26
- class ConvertCommonParamsFunc(Protocol[_BaseCallParamsT]):
27
- def __call__(self, common_params: CommonCallParams) -> _BaseCallParamsT: ...
28
-
29
-
30
- def setup_call(
31
- fn: Callable[..., _BaseDynamicConfigT | Awaitable[_BaseDynamicConfigT]]
32
- | Callable[..., Sequence[BaseMessageParam]]
33
- | Callable[..., Awaitable[Sequence[BaseMessageParam]]],
34
- fn_args: dict[str, Any],
35
- dynamic_config: _BaseDynamicConfigT,
36
- tools: Sequence[type[BaseTool] | Callable] | None,
37
- tool_type: type[_BaseToolT],
38
- call_params: _BaseCallParamsT | CommonCallParams,
39
- convert_common_call_params: ConvertCommonParamsFunc[_BaseCallParamsT],
40
- ) -> tuple[
41
- str | None,
42
- list[BaseMessageParam | Any],
43
- list[type[_BaseToolT]] | None,
44
- BaseCallKwargs,
45
- ]:
46
- if isinstance(call_params, dict) and call_params.keys() <= _CALL_PARAMS_KEYS:
47
- call_params = convert_common_call_params(cast(CommonCallParams, call_params))
48
- call_kwargs = cast(BaseCallKwargs[_BaseToolT], dict(call_params))
49
- prompt_template, messages = None, None
50
- if dynamic_config is not None:
51
- tools = dynamic_config.get("tools", tools)
52
- messages = dynamic_config.get("messages", None)
53
- if messages is not None and not isinstance(messages, list):
54
- messages = list(messages)
55
- dynamic_call_params = dynamic_config.get("call_params", None)
56
- if dynamic_call_params:
57
- call_kwargs |= dynamic_call_params
58
-
59
- if not messages:
60
- prompt_template = get_prompt_template(fn)
61
- assert prompt_template is not None, "The function must have a prompt template."
62
- messages = parse_prompt_messages(
63
- roles=["system", "user", "assistant"],
64
- template=prompt_template,
65
- attrs=fn_args,
66
- dynamic_config=dynamic_config,
67
- )
68
-
69
- tool_types = None
70
- if tools:
71
- tool_types = [
72
- convert_base_model_to_base_tool(tool, tool_type)
73
- if inspect.isclass(tool)
74
- else convert_function_to_base_tool(tool, tool_type)
75
- for tool in tools
76
- ]
77
- call_kwargs["tools"] = [tool_type.tool_schema() for tool_type in tool_types]
78
-
79
- return prompt_template, messages, tool_types, call_kwargs
@@ -1,30 +0,0 @@
1
- """This module contains the `setup_extract_tool` function."""
2
-
3
- from abc import update_abstractmethods
4
- from typing import TypeVar
5
-
6
- from pydantic import BaseModel
7
-
8
- from ._base_type import BaseType, is_base_type
9
- from ._convert_base_model_to_base_tool import convert_base_model_to_base_tool
10
- from ._convert_base_type_to_base_tool import convert_base_type_to_base_tool
11
-
12
- BaseToolT = TypeVar("BaseToolT", bound=BaseModel)
13
-
14
-
15
- def setup_extract_tool(
16
- response_model: type[BaseModel] | type[BaseType], tool_type: type[BaseToolT]
17
- ) -> type[BaseToolT]:
18
- if is_base_type(response_model):
19
- converted_tool_type = convert_base_type_to_base_tool(response_model, tool_type)
20
- elif issubclass(response_model, BaseModel):
21
- converted_tool_type = convert_base_model_to_base_tool(response_model, tool_type)
22
- else: # pragma: no cover
23
- # pyright should work with IsType for the case of BaseModel | BaseType
24
- # But it doesn't, so we need to cover this
25
- raise ValueError(
26
- f"`response_model` must be a BaseModel or a BaseType, not `{response_model}`."
27
- )
28
- if not hasattr(response_model, "call"):
29
- converted_tool_type.call = lambda self: "" # pyright: ignore [reportAttributeAccessIssue]
30
- return update_abstractmethods(converted_tool_type)
@@ -1,13 +0,0 @@
1
- """This module contains the type definition for the base call keyword arguments."""
2
-
3
- from typing import Generic, TypeVar
4
-
5
- from typing_extensions import NotRequired
6
-
7
- from .call_params import BaseCallParams
8
-
9
- _ToolSchemaT = TypeVar("_ToolSchemaT")
10
-
11
-
12
- class BaseCallKwargs(BaseCallParams, Generic[_ToolSchemaT]):
13
- tools: NotRequired[list[_ToolSchemaT]]
@@ -1,36 +0,0 @@
1
- """This module contains the type definition for the base call parameters."""
2
-
3
- from typing import TypeVar
4
-
5
- from typing_extensions import NotRequired, TypedDict
6
-
7
-
8
- class BaseCallParams(TypedDict, total=False): ... # pragma: no cover
9
-
10
-
11
- _BaseCallParamsT = TypeVar("_BaseCallParamsT", bound=BaseCallParams)
12
-
13
-
14
- class CommonCallParams(TypedDict, total=False):
15
- """Common parameters shared across LLM providers.
16
-
17
- Note: Each provider may handle these parameters differently or not support them at all.
18
- Please check provider-specific documentation for parameter support and behavior.
19
-
20
- Attributes:
21
- temperature: Controls randomness in the output (0.0 to 1.0).
22
- max_tokens: Maximum number of tokens to generate.
23
- top_p: Nucleus sampling parameter (0.0 to 1.0).
24
- frequency_penalty: Penalizes frequent tokens (-2.0 to 2.0).
25
- presence_penalty: Penalizes tokens based on presence (-2.0 to 2.0).
26
- seed: Random seed for reproducibility.
27
- stop: Stop sequence(s) to end generation.
28
- """
29
-
30
- temperature: NotRequired[float | None]
31
- max_tokens: NotRequired[int | None]
32
- top_p: NotRequired[float | None]
33
- frequency_penalty: NotRequired[float | None]
34
- presence_penalty: NotRequired[float | None]
35
- seed: NotRequired[int | None]
36
- stop: NotRequired[str | list[str] | None]
@@ -1,338 +0,0 @@
1
- """This module contains the base call response class."""
2
-
3
- from __future__ import annotations
4
-
5
- import base64
6
- import json
7
- from abc import ABC, abstractmethod
8
- from collections.abc import Callable, Sequence
9
- from functools import cached_property, wraps
10
- from typing import TYPE_CHECKING, Any, ClassVar, Generic, TypeVar, cast
11
-
12
- from pydantic import (
13
- BaseModel,
14
- ConfigDict,
15
- FieldSerializationInfo,
16
- SkipValidation,
17
- computed_field,
18
- field_serializer,
19
- )
20
-
21
- from ..costs import calculate_cost
22
- from ._utils import BaseMessageParamConverter, BaseType, get_common_usage
23
- from .call_kwargs import BaseCallKwargs
24
- from .call_params import BaseCallParams
25
- from .dynamic_config import BaseDynamicConfig
26
- from .metadata import Metadata
27
- from .tool import BaseTool
28
- from .types import CostMetadata, FinishReason, JsonableType, Provider, Usage
29
-
30
- if TYPE_CHECKING:
31
- from ...llm.tool import Tool
32
- from .. import BaseMessageParam
33
-
34
- _ResponseT = TypeVar("_ResponseT", bound=Any)
35
- _BaseToolT = TypeVar("_BaseToolT", bound=BaseTool)
36
- _ToolSchemaT = TypeVar("_ToolSchemaT")
37
- _BaseDynamicConfigT = TypeVar("_BaseDynamicConfigT", bound=BaseDynamicConfig)
38
- _MessageParamT = TypeVar("_MessageParamT", bound=Any)
39
- _ToolMessageParamT = TypeVar("_ToolMessageParamT", bound=Any)
40
- _CallParamsT = TypeVar("_CallParamsT", bound=BaseCallParams)
41
- _UserMessageParamT = TypeVar("_UserMessageParamT", bound=Any)
42
- _BaseCallResponseT = TypeVar("_BaseCallResponseT", bound="BaseCallResponse")
43
- _BaseMessageParamConverterT = TypeVar(
44
- "_BaseMessageParamConverterT", bound=BaseMessageParamConverter
45
- )
46
-
47
-
48
- def transform_tool_outputs(
49
- fn: Callable[
50
- [type[_BaseCallResponseT], Sequence[tuple[_BaseToolT, str]]],
51
- list[_ToolMessageParamT],
52
- ],
53
- ) -> Callable[
54
- [type[_BaseCallResponseT], Sequence[tuple[_BaseToolT, JsonableType]]],
55
- list[_ToolMessageParamT],
56
- ]:
57
- @wraps(fn)
58
- def wrapper(
59
- cls: type[_BaseCallResponseT],
60
- tools_and_outputs: Sequence[tuple[_BaseToolT, JsonableType]],
61
- ) -> list[_ToolMessageParamT]:
62
- def recursive_serializer(value: JsonableType) -> BaseType:
63
- if isinstance(value, str | int | float | bool | None):
64
- return value
65
- if isinstance(value, bytes):
66
- return base64.b64encode(value).decode("utf-8")
67
- if isinstance(value, BaseModel):
68
- return value.model_dump()
69
- if isinstance(value, list | set | tuple):
70
- return [recursive_serializer(item) for item in value]
71
- if isinstance(value, dict):
72
- return {k: recursive_serializer(v) for k, v in value.items()}
73
- raise TypeError(f"Unsupported type for serialization: {type(value)}")
74
-
75
- transformed_tools_and_outputs = [
76
- (
77
- tool,
78
- output.model_dump_json()
79
- if isinstance(output, BaseModel)
80
- else str(recursive_serializer(output))
81
- if isinstance(output, str | bytes)
82
- else json.dumps(recursive_serializer(output)),
83
- )
84
- for tool, output in tools_and_outputs
85
- ]
86
- return fn(cls, transformed_tools_and_outputs)
87
-
88
- return wrapper
89
-
90
-
91
- class BaseCallResponse(
92
- BaseModel,
93
- Generic[
94
- _ResponseT,
95
- _BaseToolT,
96
- _ToolSchemaT,
97
- _BaseDynamicConfigT,
98
- _MessageParamT,
99
- _CallParamsT,
100
- _UserMessageParamT,
101
- _BaseMessageParamConverterT,
102
- ],
103
- ABC,
104
- ):
105
- """A base abstract interface for LLM call responses.
106
-
107
- Attributes:
108
- metadata: The metadata pulled from the call that was made.
109
- response: The original response from whichever model response this wraps.
110
- tool_types: The list of tool types used, if any.
111
- prompt_template: The unformatted prompt template from the call that was made.
112
- fn_args: The input arguments used when making the call.
113
- dynamic_config: Dynamic configuration options, if any.
114
- messages: The list of provider-specific messages used to make the API call.
115
- call_params: The original call params set in the call decorator.
116
- call_kwargs: The keyword arguments used to make the API call.
117
- user_message_param: The most recent provider-specific message if it was a user
118
- message. Otherwise `None`.
119
- start_time: The start time of the completion in ms.
120
- end_time: The end time of the completion in ms.
121
- """
122
-
123
- metadata: Metadata
124
- response: _ResponseT
125
- tool_types: list[type[_BaseToolT]] | None = None
126
- prompt_template: str | None
127
- fn_args: dict[str, Any]
128
- dynamic_config: _BaseDynamicConfigT
129
- messages: SkipValidation[list[_MessageParamT]]
130
- call_params: SkipValidation[_CallParamsT]
131
- call_kwargs: BaseCallKwargs[_ToolSchemaT]
132
- user_message_param: _UserMessageParamT | None = None
133
- start_time: float
134
- end_time: float
135
-
136
- _message_converter: type[_BaseMessageParamConverterT]
137
- _provider: ClassVar[str] = "NO PROVIDER"
138
- _model: str = "NO MODEL"
139
-
140
- model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
141
-
142
- @field_serializer("tool_types", when_used="json")
143
- def serialize_tool_types(
144
- self, tool_types: list[type[_BaseToolT]] | None, info: FieldSerializationInfo
145
- ) -> list[dict[str, str]]:
146
- return [{"type": "function", "name": tool._name()} for tool in tool_types or []]
147
-
148
- def __str__(self) -> str:
149
- """Returns the string content of the response."""
150
- return self.content
151
-
152
- @computed_field
153
- @property
154
- @abstractmethod
155
- def content(self) -> str:
156
- """Should return the string content of the response.
157
-
158
- If there are multiple choices in a response, this method should select the 0th
159
- choice and return it's string content.
160
-
161
- If there is no string content (e.g. when using tools), this method must return
162
- the empty string.
163
- """
164
- ...
165
-
166
- @computed_field
167
- @property
168
- @abstractmethod
169
- def finish_reasons(self) -> list[str] | None:
170
- """Should return the finish reasons of the response.
171
-
172
- If there is no finish reason, this method must return None.
173
- """
174
- ...
175
-
176
- @computed_field
177
- @property
178
- @abstractmethod
179
- def model(self) -> str | None:
180
- """Should return the name of the response model."""
181
- ...
182
-
183
- @computed_field
184
- @property
185
- @abstractmethod
186
- def id(self) -> str | None:
187
- """Should return the id of the response."""
188
- ...
189
-
190
- @property
191
- @abstractmethod
192
- def usage(self) -> Any: # noqa: ANN401
193
- """Should return the usage of the response.
194
-
195
- If there is no usage, this method must return None.
196
- """
197
- ...
198
-
199
- @computed_field
200
- @property
201
- @abstractmethod
202
- def input_tokens(self) -> int | float | None:
203
- """Should return the number of input tokens.
204
-
205
- If there is no input_tokens, this method must return None.
206
- """
207
- ...
208
-
209
- @computed_field
210
- @property
211
- @abstractmethod
212
- def cached_tokens(self) -> int | float | None:
213
- """Should return the number of cached tokens.
214
-
215
- If there is no cached_tokens, this method must return None.
216
- """
217
- ...
218
-
219
- @computed_field
220
- @property
221
- @abstractmethod
222
- def output_tokens(self) -> int | float | None:
223
- """Should return the number of output tokens.
224
-
225
- If there is no output_tokens, this method must return None.
226
- """
227
- ...
228
-
229
- @computed_field
230
- @property
231
- @abstractmethod
232
- def cost_metadata(self) -> CostMetadata:
233
- """Get metadata required for cost calculation.
234
-
235
- Returns:
236
- Metadata relevant to cost calculation
237
- """
238
-
239
- return CostMetadata(
240
- input_tokens=self.input_tokens,
241
- output_tokens=self.output_tokens,
242
- cached_tokens=self.cached_tokens,
243
- )
244
-
245
- @computed_field
246
- @property
247
- def cost(self) -> float | None:
248
- """Calculate the cost of this API call using the unified calculate_cost function."""
249
-
250
- model = self.model
251
- if not model:
252
- return None
253
-
254
- if self.input_tokens is None or self.output_tokens is None:
255
- return None
256
-
257
- return calculate_cost(
258
- provider=self.provider,
259
- model=model,
260
- metadata=self.cost_metadata,
261
- )
262
-
263
- @property
264
- def provider(self) -> Provider:
265
- """Get the provider used for this API call."""
266
- return cast(Provider, self._provider)
267
-
268
- @computed_field
269
- @cached_property
270
- @abstractmethod
271
- def message_param(self) -> Any: # noqa: ANN401
272
- """Returns the assistant's response as a message parameter."""
273
- ...
274
-
275
- @cached_property
276
- @abstractmethod
277
- def tools(self) -> list[_BaseToolT] | None:
278
- """Returns the tools for the 0th choice message."""
279
- ...
280
-
281
- @cached_property
282
- @abstractmethod
283
- def tool(self) -> _BaseToolT | None:
284
- """Returns the 0th tool for the 0th choice message."""
285
- ...
286
-
287
- @classmethod
288
- @abstractmethod
289
- @transform_tool_outputs
290
- def tool_message_params(
291
- cls, tools_and_outputs: Sequence[tuple[_BaseToolT, str]]
292
- ) -> list[Any]:
293
- """Returns the tool message parameters for tool call results.
294
-
295
- Args:
296
- tools_and_outputs: The sequence of tools and their outputs from which the tool
297
- message parameters should be constructed.
298
- """
299
- ...
300
-
301
- @property
302
- @abstractmethod
303
- def common_finish_reasons(self) -> list[FinishReason] | None:
304
- """Provider-agnostic finish reasons."""
305
- ...
306
-
307
- @property
308
- @abstractmethod
309
- def common_message_param(self) -> BaseMessageParam:
310
- """Provider-agnostic assistant message param."""
311
- ...
312
-
313
- @property
314
- @abstractmethod
315
- def common_user_message_param(self) -> BaseMessageParam | None:
316
- """Provider-agnostic user message param."""
317
- ...
318
-
319
- @property
320
- def common_messages(self) -> list[BaseMessageParam]:
321
- """Provider-agnostic list of messages."""
322
- return self._message_converter.from_provider(self.messages)
323
-
324
- @property
325
- def common_tools(self) -> list[Tool] | None:
326
- """Provider-agnostic tools."""
327
- from ...llm.tool import Tool
328
-
329
- if not self.tools:
330
- return None
331
- return [Tool(tool=tool) for tool in self.tools] # pyright: ignore [reportAbstractUsage]
332
-
333
- @property
334
- def common_usage(self) -> Usage | None:
335
- """Provider-agnostic usage info."""
336
- return get_common_usage(
337
- self.input_tokens, self.cached_tokens, self.output_tokens
338
- )
@@ -1,130 +0,0 @@
1
- """This module contains the `BaseCallResponseChunk` class.
2
-
3
- usage docs: learn/streams.md#handling-streamed-responses
4
- """
5
-
6
- from __future__ import annotations
7
-
8
- from abc import ABC, abstractmethod
9
- from typing import Any, Generic, TypeVar
10
-
11
- from pydantic import BaseModel, ConfigDict
12
-
13
- from mirascope.core.base._utils import get_common_usage
14
- from mirascope.core.base.types import CostMetadata, FinishReason, Usage
15
-
16
- _ChunkT = TypeVar("_ChunkT", bound=Any)
17
- _FinishReasonT = TypeVar("_FinishReasonT", bound=Any)
18
-
19
-
20
- class BaseCallResponseChunk(BaseModel, Generic[_ChunkT, _FinishReasonT], ABC):
21
- """A base abstract interface for LLM streaming response chunks.
22
-
23
- Attributes:
24
- chunk: The original response chunk from whichever model response this wraps.
25
- """
26
-
27
- chunk: _ChunkT
28
-
29
- model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
30
-
31
- def __str__(self) -> str:
32
- """Returns the string content of the chunk."""
33
- return self.content
34
-
35
- @property
36
- @abstractmethod
37
- def content(self) -> str:
38
- """Should return the string content of the response chunk.
39
-
40
- If there are multiple choices in a chunk, this method should select the 0th
41
- choice and return it's string content.
42
-
43
- If there is no string content (e.g. when using tools), this method must return
44
- the empty string.
45
- """
46
- ...
47
-
48
- @property
49
- @abstractmethod
50
- def finish_reasons(self) -> list[_FinishReasonT] | None:
51
- """Should return the finish reasons of the response.
52
-
53
- If there is no finish reason, this method must return None.
54
- """
55
- ...
56
-
57
- @property
58
- @abstractmethod
59
- def model(self) -> str | None:
60
- """Should return the name of the response model."""
61
- ...
62
-
63
- @property
64
- @abstractmethod
65
- def id(self) -> str | None:
66
- """Should return the id of the response."""
67
- ...
68
-
69
- @property
70
- @abstractmethod
71
- def usage(self) -> Any: # noqa: ANN401
72
- """Should return the usage of the response.
73
-
74
- If there is no usage, this method must return None.
75
- """
76
- ...
77
-
78
- @property
79
- @abstractmethod
80
- def input_tokens(self) -> int | float | None:
81
- """Should return the number of input tokens.
82
-
83
- If there is no input_tokens, this method must return None.
84
- """
85
- ...
86
-
87
- @property
88
- @abstractmethod
89
- def cached_tokens(self) -> int | float | None:
90
- """Should return the number of cached tokens.
91
-
92
- If there is no cached_tokens, this method must return None.
93
- """
94
- ...
95
-
96
- @property
97
- @abstractmethod
98
- def output_tokens(self) -> int | float | None:
99
- """Should return the number of output tokens.
100
-
101
- If there is no output_tokens, this method must return None.
102
- """
103
- ...
104
-
105
- @property
106
- @abstractmethod
107
- def cost_metadata(self) -> CostMetadata:
108
- """Get metadata required for cost calculation.
109
-
110
- Returns:
111
- A CostMetadata object with information relevant to cost calculation
112
- """
113
- return CostMetadata(
114
- input_tokens=self.input_tokens,
115
- output_tokens=self.output_tokens,
116
- cached_tokens=self.cached_tokens,
117
- )
118
-
119
- @property
120
- @abstractmethod
121
- def common_finish_reasons(self) -> list[FinishReason] | None:
122
- """Provider-agnostic finish reasons."""
123
- ...
124
-
125
- @property
126
- def common_usage(self) -> Usage | None:
127
- """Provider-agnostic usage info."""
128
- return get_common_usage(
129
- self.input_tokens, self.cached_tokens, self.output_tokens
130
- )