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.
- mirascope/__init__.py +3 -59
- mirascope/graphs/__init__.py +22 -0
- mirascope/{experimental/graphs → graphs}/finite_state_machine.py +70 -159
- mirascope/llm/__init__.py +206 -16
- mirascope/llm/agents/__init__.py +15 -0
- mirascope/llm/agents/agent.py +97 -0
- mirascope/llm/agents/agent_template.py +45 -0
- mirascope/llm/agents/decorator.py +176 -0
- mirascope/llm/calls/__init__.py +16 -0
- mirascope/llm/calls/base_call.py +33 -0
- mirascope/llm/calls/calls.py +315 -0
- mirascope/llm/calls/decorator.py +255 -0
- mirascope/llm/clients/__init__.py +34 -0
- mirascope/llm/clients/anthropic/__init__.py +11 -0
- mirascope/llm/clients/anthropic/_utils/__init__.py +13 -0
- mirascope/llm/clients/anthropic/_utils/decode.py +244 -0
- mirascope/llm/clients/anthropic/_utils/encode.py +243 -0
- mirascope/llm/clients/anthropic/clients.py +819 -0
- mirascope/llm/clients/anthropic/model_ids.py +8 -0
- mirascope/llm/clients/base/__init__.py +15 -0
- mirascope/llm/clients/base/_utils.py +192 -0
- mirascope/llm/clients/base/client.py +1256 -0
- mirascope/llm/clients/base/kwargs.py +12 -0
- mirascope/llm/clients/base/params.py +93 -0
- mirascope/llm/clients/google/__init__.py +6 -0
- mirascope/llm/clients/google/_utils/__init__.py +13 -0
- mirascope/llm/clients/google/_utils/decode.py +231 -0
- mirascope/llm/clients/google/_utils/encode.py +279 -0
- mirascope/llm/clients/google/clients.py +853 -0
- mirascope/llm/clients/google/message.py +7 -0
- mirascope/llm/clients/google/model_ids.py +15 -0
- mirascope/llm/clients/openai/__init__.py +25 -0
- mirascope/llm/clients/openai/completions/__init__.py +9 -0
- mirascope/llm/clients/openai/completions/_utils/__init__.py +13 -0
- mirascope/llm/clients/openai/completions/_utils/decode.py +187 -0
- mirascope/llm/clients/openai/completions/_utils/encode.py +358 -0
- mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
- mirascope/llm/clients/openai/completions/clients.py +833 -0
- mirascope/llm/clients/openai/completions/model_ids.py +8 -0
- mirascope/llm/clients/openai/responses/__init__.py +9 -0
- mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
- mirascope/llm/clients/openai/responses/_utils/decode.py +194 -0
- mirascope/llm/clients/openai/responses/_utils/encode.py +333 -0
- mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
- mirascope/llm/clients/openai/responses/clients.py +832 -0
- mirascope/llm/clients/openai/responses/model_ids.py +8 -0
- mirascope/llm/clients/openai/shared/__init__.py +7 -0
- mirascope/llm/clients/openai/shared/_utils.py +55 -0
- mirascope/llm/clients/providers.py +175 -0
- mirascope/llm/content/__init__.py +70 -0
- mirascope/llm/content/audio.py +173 -0
- mirascope/llm/content/document.py +94 -0
- mirascope/llm/content/image.py +206 -0
- mirascope/llm/content/text.py +47 -0
- mirascope/llm/content/thought.py +58 -0
- mirascope/llm/content/tool_call.py +63 -0
- mirascope/llm/content/tool_output.py +26 -0
- mirascope/llm/context/__init__.py +6 -0
- mirascope/llm/context/_utils.py +28 -0
- mirascope/llm/context/context.py +24 -0
- mirascope/llm/exceptions.py +105 -0
- mirascope/llm/formatting/__init__.py +22 -0
- mirascope/llm/formatting/_utils.py +74 -0
- mirascope/llm/formatting/format.py +104 -0
- mirascope/llm/formatting/from_call_args.py +30 -0
- mirascope/llm/formatting/partial.py +58 -0
- mirascope/llm/formatting/types.py +109 -0
- mirascope/llm/mcp/__init__.py +5 -0
- mirascope/llm/mcp/client.py +118 -0
- mirascope/llm/messages/__init__.py +32 -0
- mirascope/llm/messages/message.py +182 -0
- mirascope/llm/models/__init__.py +16 -0
- mirascope/llm/models/models.py +1243 -0
- mirascope/llm/prompts/__init__.py +33 -0
- mirascope/llm/prompts/_utils.py +60 -0
- mirascope/llm/prompts/decorator.py +286 -0
- mirascope/llm/prompts/protocols.py +99 -0
- mirascope/llm/responses/__init__.py +57 -0
- mirascope/llm/responses/_utils.py +56 -0
- mirascope/llm/responses/base_response.py +91 -0
- mirascope/llm/responses/base_stream_response.py +697 -0
- mirascope/llm/responses/finish_reason.py +27 -0
- mirascope/llm/responses/response.py +345 -0
- mirascope/llm/responses/root_response.py +177 -0
- mirascope/llm/responses/stream_response.py +572 -0
- mirascope/llm/responses/streams.py +363 -0
- mirascope/llm/tools/__init__.py +40 -0
- mirascope/llm/tools/_utils.py +25 -0
- mirascope/llm/tools/decorator.py +175 -0
- mirascope/llm/tools/protocols.py +96 -0
- mirascope/llm/tools/tool_schema.py +246 -0
- mirascope/llm/tools/toolkit.py +152 -0
- mirascope/llm/tools/tools.py +169 -0
- mirascope/llm/types/__init__.py +22 -0
- mirascope/llm/types/dataclass.py +9 -0
- mirascope/llm/types/jsonable.py +44 -0
- mirascope/llm/types/type_vars.py +19 -0
- mirascope-2.0.0a0.dist-info/METADATA +117 -0
- mirascope-2.0.0a0.dist-info/RECORD +101 -0
- mirascope/beta/__init__.py +0 -3
- mirascope/beta/openai/__init__.py +0 -17
- mirascope/beta/openai/realtime/__init__.py +0 -13
- mirascope/beta/openai/realtime/_utils/__init__.py +0 -3
- mirascope/beta/openai/realtime/_utils/_audio.py +0 -74
- mirascope/beta/openai/realtime/_utils/_protocols.py +0 -50
- mirascope/beta/openai/realtime/realtime.py +0 -500
- mirascope/beta/openai/realtime/recording.py +0 -98
- mirascope/beta/openai/realtime/tool.py +0 -113
- mirascope/beta/rag/__init__.py +0 -24
- mirascope/beta/rag/base/__init__.py +0 -22
- mirascope/beta/rag/base/chunkers/__init__.py +0 -2
- mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
- mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
- mirascope/beta/rag/base/config.py +0 -8
- mirascope/beta/rag/base/document.py +0 -11
- mirascope/beta/rag/base/embedders.py +0 -35
- mirascope/beta/rag/base/embedding_params.py +0 -18
- mirascope/beta/rag/base/embedding_response.py +0 -30
- mirascope/beta/rag/base/query_results.py +0 -7
- mirascope/beta/rag/base/vectorstore_params.py +0 -18
- mirascope/beta/rag/base/vectorstores.py +0 -37
- mirascope/beta/rag/chroma/__init__.py +0 -11
- mirascope/beta/rag/chroma/types.py +0 -62
- mirascope/beta/rag/chroma/vectorstores.py +0 -121
- mirascope/beta/rag/cohere/__init__.py +0 -11
- mirascope/beta/rag/cohere/embedders.py +0 -87
- mirascope/beta/rag/cohere/embedding_params.py +0 -29
- mirascope/beta/rag/cohere/embedding_response.py +0 -29
- mirascope/beta/rag/cohere/py.typed +0 -0
- mirascope/beta/rag/openai/__init__.py +0 -11
- mirascope/beta/rag/openai/embedders.py +0 -144
- mirascope/beta/rag/openai/embedding_params.py +0 -18
- mirascope/beta/rag/openai/embedding_response.py +0 -14
- mirascope/beta/rag/openai/py.typed +0 -0
- mirascope/beta/rag/pinecone/__init__.py +0 -19
- mirascope/beta/rag/pinecone/types.py +0 -143
- mirascope/beta/rag/pinecone/vectorstores.py +0 -148
- mirascope/beta/rag/weaviate/__init__.py +0 -6
- mirascope/beta/rag/weaviate/types.py +0 -92
- mirascope/beta/rag/weaviate/vectorstores.py +0 -103
- mirascope/core/__init__.py +0 -109
- mirascope/core/anthropic/__init__.py +0 -31
- mirascope/core/anthropic/_call.py +0 -67
- mirascope/core/anthropic/_call_kwargs.py +0 -13
- mirascope/core/anthropic/_thinking.py +0 -70
- mirascope/core/anthropic/_utils/__init__.py +0 -16
- mirascope/core/anthropic/_utils/_convert_common_call_params.py +0 -25
- mirascope/core/anthropic/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/anthropic/_utils/_convert_message_params.py +0 -102
- mirascope/core/anthropic/_utils/_get_json_output.py +0 -31
- mirascope/core/anthropic/_utils/_handle_stream.py +0 -113
- mirascope/core/anthropic/_utils/_message_param_converter.py +0 -154
- mirascope/core/anthropic/_utils/_setup_call.py +0 -146
- mirascope/core/anthropic/call_params.py +0 -44
- mirascope/core/anthropic/call_response.py +0 -226
- mirascope/core/anthropic/call_response_chunk.py +0 -152
- mirascope/core/anthropic/dynamic_config.py +0 -40
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -204
- mirascope/core/anthropic/tool.py +0 -101
- mirascope/core/azure/__init__.py +0 -31
- mirascope/core/azure/_call.py +0 -67
- mirascope/core/azure/_call_kwargs.py +0 -13
- mirascope/core/azure/_utils/__init__.py +0 -14
- mirascope/core/azure/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/azure/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/azure/_utils/_convert_message_params.py +0 -121
- mirascope/core/azure/_utils/_get_credential.py +0 -33
- mirascope/core/azure/_utils/_get_json_output.py +0 -27
- mirascope/core/azure/_utils/_handle_stream.py +0 -130
- mirascope/core/azure/_utils/_message_param_converter.py +0 -117
- mirascope/core/azure/_utils/_setup_call.py +0 -183
- mirascope/core/azure/call_params.py +0 -59
- mirascope/core/azure/call_response.py +0 -215
- mirascope/core/azure/call_response_chunk.py +0 -105
- mirascope/core/azure/dynamic_config.py +0 -30
- mirascope/core/azure/py.typed +0 -0
- mirascope/core/azure/stream.py +0 -147
- mirascope/core/azure/tool.py +0 -93
- mirascope/core/base/__init__.py +0 -86
- mirascope/core/base/_call_factory.py +0 -256
- mirascope/core/base/_create.py +0 -253
- mirascope/core/base/_extract.py +0 -175
- mirascope/core/base/_extract_with_tools.py +0 -189
- mirascope/core/base/_partial.py +0 -95
- mirascope/core/base/_utils/__init__.py +0 -92
- mirascope/core/base/_utils/_base_message_param_converter.py +0 -22
- mirascope/core/base/_utils/_base_type.py +0 -26
- mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -48
- mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
- mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -139
- mirascope/core/base/_utils/_convert_messages_to_message_params.py +0 -178
- mirascope/core/base/_utils/_convert_provider_finish_reason_to_finish_reason.py +0 -20
- mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
- mirascope/core/base/_utils/_extract_tool_return.py +0 -42
- mirascope/core/base/_utils/_fn_is_async.py +0 -24
- mirascope/core/base/_utils/_format_template.py +0 -32
- mirascope/core/base/_utils/_get_audio_type.py +0 -18
- mirascope/core/base/_utils/_get_common_usage.py +0 -20
- mirascope/core/base/_utils/_get_create_fn_or_async_create_fn.py +0 -137
- mirascope/core/base/_utils/_get_document_type.py +0 -7
- mirascope/core/base/_utils/_get_dynamic_configuration.py +0 -69
- mirascope/core/base/_utils/_get_fields_from_call_args.py +0 -34
- mirascope/core/base/_utils/_get_fn_args.py +0 -23
- mirascope/core/base/_utils/_get_image_dimensions.py +0 -39
- mirascope/core/base/_utils/_get_image_type.py +0 -26
- mirascope/core/base/_utils/_get_metadata.py +0 -17
- mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
- mirascope/core/base/_utils/_get_prompt_template.py +0 -28
- mirascope/core/base/_utils/_get_template_values.py +0 -51
- mirascope/core/base/_utils/_get_template_variables.py +0 -38
- mirascope/core/base/_utils/_get_unsupported_tool_config_keys.py +0 -10
- mirascope/core/base/_utils/_is_prompt_template.py +0 -24
- mirascope/core/base/_utils/_json_mode_content.py +0 -17
- mirascope/core/base/_utils/_messages_decorator.py +0 -121
- mirascope/core/base/_utils/_parse_content_template.py +0 -323
- mirascope/core/base/_utils/_parse_prompt_messages.py +0 -63
- mirascope/core/base/_utils/_pil_image_to_bytes.py +0 -13
- mirascope/core/base/_utils/_protocols.py +0 -901
- mirascope/core/base/_utils/_setup_call.py +0 -79
- mirascope/core/base/_utils/_setup_extract_tool.py +0 -30
- mirascope/core/base/call_kwargs.py +0 -13
- mirascope/core/base/call_params.py +0 -36
- mirascope/core/base/call_response.py +0 -338
- mirascope/core/base/call_response_chunk.py +0 -130
- mirascope/core/base/dynamic_config.py +0 -82
- mirascope/core/base/from_call_args.py +0 -30
- mirascope/core/base/merge_decorators.py +0 -59
- mirascope/core/base/message_param.py +0 -175
- mirascope/core/base/messages.py +0 -116
- mirascope/core/base/metadata.py +0 -13
- mirascope/core/base/prompt.py +0 -497
- mirascope/core/base/response_model_config_dict.py +0 -9
- mirascope/core/base/stream.py +0 -479
- mirascope/core/base/stream_config.py +0 -11
- mirascope/core/base/structured_stream.py +0 -296
- mirascope/core/base/tool.py +0 -214
- mirascope/core/base/toolkit.py +0 -176
- mirascope/core/base/types.py +0 -344
- mirascope/core/bedrock/__init__.py +0 -34
- mirascope/core/bedrock/_call.py +0 -68
- mirascope/core/bedrock/_call_kwargs.py +0 -12
- mirascope/core/bedrock/_types.py +0 -104
- mirascope/core/bedrock/_utils/__init__.py +0 -14
- mirascope/core/bedrock/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/bedrock/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/bedrock/_utils/_convert_message_params.py +0 -111
- mirascope/core/bedrock/_utils/_get_json_output.py +0 -30
- mirascope/core/bedrock/_utils/_handle_stream.py +0 -104
- mirascope/core/bedrock/_utils/_message_param_converter.py +0 -172
- mirascope/core/bedrock/_utils/_setup_call.py +0 -258
- mirascope/core/bedrock/call_params.py +0 -38
- mirascope/core/bedrock/call_response.py +0 -248
- mirascope/core/bedrock/call_response_chunk.py +0 -111
- mirascope/core/bedrock/dynamic_config.py +0 -37
- mirascope/core/bedrock/py.typed +0 -0
- mirascope/core/bedrock/stream.py +0 -154
- mirascope/core/bedrock/tool.py +0 -100
- mirascope/core/cohere/__init__.py +0 -30
- mirascope/core/cohere/_call.py +0 -67
- mirascope/core/cohere/_call_kwargs.py +0 -11
- mirascope/core/cohere/_types.py +0 -20
- mirascope/core/cohere/_utils/__init__.py +0 -14
- mirascope/core/cohere/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/cohere/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -24
- mirascope/core/cohere/_utils/_convert_message_params.py +0 -32
- mirascope/core/cohere/_utils/_get_json_output.py +0 -30
- mirascope/core/cohere/_utils/_handle_stream.py +0 -35
- mirascope/core/cohere/_utils/_message_param_converter.py +0 -54
- mirascope/core/cohere/_utils/_setup_call.py +0 -150
- mirascope/core/cohere/call_params.py +0 -62
- mirascope/core/cohere/call_response.py +0 -205
- mirascope/core/cohere/call_response_chunk.py +0 -125
- mirascope/core/cohere/dynamic_config.py +0 -32
- mirascope/core/cohere/py.typed +0 -0
- mirascope/core/cohere/stream.py +0 -113
- mirascope/core/cohere/tool.py +0 -93
- mirascope/core/costs/__init__.py +0 -5
- mirascope/core/costs/_anthropic_calculate_cost.py +0 -219
- mirascope/core/costs/_azure_calculate_cost.py +0 -11
- mirascope/core/costs/_bedrock_calculate_cost.py +0 -15
- mirascope/core/costs/_cohere_calculate_cost.py +0 -44
- mirascope/core/costs/_gemini_calculate_cost.py +0 -67
- mirascope/core/costs/_google_calculate_cost.py +0 -427
- mirascope/core/costs/_groq_calculate_cost.py +0 -156
- mirascope/core/costs/_litellm_calculate_cost.py +0 -11
- mirascope/core/costs/_mistral_calculate_cost.py +0 -64
- mirascope/core/costs/_openai_calculate_cost.py +0 -416
- mirascope/core/costs/_vertex_calculate_cost.py +0 -67
- mirascope/core/costs/_xai_calculate_cost.py +0 -104
- mirascope/core/costs/calculate_cost.py +0 -86
- mirascope/core/gemini/__init__.py +0 -40
- mirascope/core/gemini/_call.py +0 -67
- mirascope/core/gemini/_call_kwargs.py +0 -12
- mirascope/core/gemini/_utils/__init__.py +0 -14
- mirascope/core/gemini/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/gemini/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/gemini/_utils/_convert_message_params.py +0 -156
- mirascope/core/gemini/_utils/_get_json_output.py +0 -35
- mirascope/core/gemini/_utils/_handle_stream.py +0 -33
- mirascope/core/gemini/_utils/_message_param_converter.py +0 -209
- mirascope/core/gemini/_utils/_setup_call.py +0 -149
- mirascope/core/gemini/call_params.py +0 -52
- mirascope/core/gemini/call_response.py +0 -216
- mirascope/core/gemini/call_response_chunk.py +0 -100
- mirascope/core/gemini/dynamic_config.py +0 -26
- mirascope/core/gemini/stream.py +0 -120
- mirascope/core/gemini/tool.py +0 -104
- mirascope/core/google/__init__.py +0 -29
- mirascope/core/google/_call.py +0 -67
- mirascope/core/google/_call_kwargs.py +0 -13
- mirascope/core/google/_utils/__init__.py +0 -14
- mirascope/core/google/_utils/_convert_common_call_params.py +0 -38
- mirascope/core/google/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -27
- mirascope/core/google/_utils/_convert_message_params.py +0 -297
- mirascope/core/google/_utils/_get_json_output.py +0 -37
- mirascope/core/google/_utils/_handle_stream.py +0 -58
- mirascope/core/google/_utils/_message_param_converter.py +0 -200
- mirascope/core/google/_utils/_setup_call.py +0 -201
- mirascope/core/google/_utils/_validate_media_type.py +0 -58
- mirascope/core/google/call_params.py +0 -22
- mirascope/core/google/call_response.py +0 -255
- mirascope/core/google/call_response_chunk.py +0 -135
- mirascope/core/google/dynamic_config.py +0 -26
- mirascope/core/google/stream.py +0 -199
- mirascope/core/google/tool.py +0 -146
- mirascope/core/groq/__init__.py +0 -30
- mirascope/core/groq/_call.py +0 -67
- mirascope/core/groq/_call_kwargs.py +0 -13
- mirascope/core/groq/_utils/__init__.py +0 -14
- mirascope/core/groq/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/groq/_utils/_convert_message_params.py +0 -112
- mirascope/core/groq/_utils/_get_json_output.py +0 -27
- mirascope/core/groq/_utils/_handle_stream.py +0 -123
- mirascope/core/groq/_utils/_message_param_converter.py +0 -89
- mirascope/core/groq/_utils/_setup_call.py +0 -132
- mirascope/core/groq/call_params.py +0 -52
- mirascope/core/groq/call_response.py +0 -213
- mirascope/core/groq/call_response_chunk.py +0 -104
- mirascope/core/groq/dynamic_config.py +0 -29
- mirascope/core/groq/py.typed +0 -0
- mirascope/core/groq/stream.py +0 -135
- mirascope/core/groq/tool.py +0 -80
- mirascope/core/litellm/__init__.py +0 -28
- mirascope/core/litellm/_call.py +0 -67
- mirascope/core/litellm/_utils/__init__.py +0 -5
- mirascope/core/litellm/_utils/_setup_call.py +0 -109
- mirascope/core/litellm/call_params.py +0 -10
- mirascope/core/litellm/call_response.py +0 -24
- mirascope/core/litellm/call_response_chunk.py +0 -14
- mirascope/core/litellm/dynamic_config.py +0 -8
- mirascope/core/litellm/py.typed +0 -0
- mirascope/core/litellm/stream.py +0 -86
- mirascope/core/litellm/tool.py +0 -13
- mirascope/core/mistral/__init__.py +0 -36
- mirascope/core/mistral/_call.py +0 -65
- mirascope/core/mistral/_call_kwargs.py +0 -19
- mirascope/core/mistral/_utils/__init__.py +0 -14
- mirascope/core/mistral/_utils/_convert_common_call_params.py +0 -24
- mirascope/core/mistral/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -22
- mirascope/core/mistral/_utils/_convert_message_params.py +0 -122
- mirascope/core/mistral/_utils/_get_json_output.py +0 -34
- mirascope/core/mistral/_utils/_handle_stream.py +0 -139
- mirascope/core/mistral/_utils/_message_param_converter.py +0 -176
- mirascope/core/mistral/_utils/_setup_call.py +0 -164
- mirascope/core/mistral/call_params.py +0 -36
- mirascope/core/mistral/call_response.py +0 -205
- mirascope/core/mistral/call_response_chunk.py +0 -105
- mirascope/core/mistral/dynamic_config.py +0 -33
- mirascope/core/mistral/py.typed +0 -0
- mirascope/core/mistral/stream.py +0 -120
- mirascope/core/mistral/tool.py +0 -81
- mirascope/core/openai/__init__.py +0 -31
- mirascope/core/openai/_call.py +0 -67
- mirascope/core/openai/_call_kwargs.py +0 -13
- mirascope/core/openai/_utils/__init__.py +0 -14
- mirascope/core/openai/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/openai/_utils/_convert_message_params.py +0 -148
- mirascope/core/openai/_utils/_get_json_output.py +0 -31
- mirascope/core/openai/_utils/_handle_stream.py +0 -138
- mirascope/core/openai/_utils/_message_param_converter.py +0 -105
- mirascope/core/openai/_utils/_setup_call.py +0 -155
- mirascope/core/openai/call_params.py +0 -92
- mirascope/core/openai/call_response.py +0 -273
- mirascope/core/openai/call_response_chunk.py +0 -139
- mirascope/core/openai/dynamic_config.py +0 -34
- mirascope/core/openai/py.typed +0 -0
- mirascope/core/openai/stream.py +0 -185
- mirascope/core/openai/tool.py +0 -101
- mirascope/core/py.typed +0 -0
- mirascope/core/vertex/__init__.py +0 -45
- mirascope/core/vertex/_call.py +0 -62
- mirascope/core/vertex/_call_kwargs.py +0 -12
- mirascope/core/vertex/_utils/__init__.py +0 -14
- mirascope/core/vertex/_utils/_convert_common_call_params.py +0 -37
- mirascope/core/vertex/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/vertex/_utils/_convert_message_params.py +0 -171
- mirascope/core/vertex/_utils/_get_json_output.py +0 -36
- mirascope/core/vertex/_utils/_handle_stream.py +0 -33
- mirascope/core/vertex/_utils/_message_param_converter.py +0 -133
- mirascope/core/vertex/_utils/_setup_call.py +0 -160
- mirascope/core/vertex/call_params.py +0 -24
- mirascope/core/vertex/call_response.py +0 -206
- mirascope/core/vertex/call_response_chunk.py +0 -99
- mirascope/core/vertex/dynamic_config.py +0 -28
- mirascope/core/vertex/stream.py +0 -119
- mirascope/core/vertex/tool.py +0 -101
- mirascope/core/xai/__init__.py +0 -28
- mirascope/core/xai/_call.py +0 -67
- mirascope/core/xai/_utils/__init__.py +0 -5
- mirascope/core/xai/_utils/_setup_call.py +0 -113
- mirascope/core/xai/call_params.py +0 -10
- mirascope/core/xai/call_response.py +0 -16
- mirascope/core/xai/call_response_chunk.py +0 -14
- mirascope/core/xai/dynamic_config.py +0 -8
- mirascope/core/xai/py.typed +0 -0
- mirascope/core/xai/stream.py +0 -57
- mirascope/core/xai/tool.py +0 -13
- mirascope/experimental/graphs/__init__.py +0 -5
- mirascope/integrations/__init__.py +0 -16
- mirascope/integrations/_middleware_factory.py +0 -403
- mirascope/integrations/langfuse/__init__.py +0 -3
- mirascope/integrations/langfuse/_utils.py +0 -114
- mirascope/integrations/langfuse/_with_langfuse.py +0 -70
- mirascope/integrations/logfire/__init__.py +0 -3
- mirascope/integrations/logfire/_utils.py +0 -225
- mirascope/integrations/logfire/_with_logfire.py +0 -63
- mirascope/integrations/otel/__init__.py +0 -10
- mirascope/integrations/otel/_utils.py +0 -270
- mirascope/integrations/otel/_with_hyperdx.py +0 -60
- mirascope/integrations/otel/_with_otel.py +0 -59
- mirascope/integrations/tenacity.py +0 -14
- mirascope/llm/_call.py +0 -401
- mirascope/llm/_context.py +0 -384
- mirascope/llm/_override.py +0 -3639
- mirascope/llm/_protocols.py +0 -500
- mirascope/llm/_response_metaclass.py +0 -31
- mirascope/llm/call_response.py +0 -158
- mirascope/llm/call_response_chunk.py +0 -66
- mirascope/llm/stream.py +0 -162
- mirascope/llm/tool.py +0 -64
- mirascope/mcp/__init__.py +0 -7
- mirascope/mcp/_utils.py +0 -288
- mirascope/mcp/client.py +0 -167
- mirascope/mcp/server.py +0 -356
- mirascope/mcp/tools.py +0 -110
- mirascope/py.typed +0 -0
- mirascope/retries/__init__.py +0 -11
- mirascope/retries/fallback.py +0 -131
- mirascope/retries/tenacity.py +0 -50
- mirascope/tools/__init__.py +0 -37
- mirascope/tools/base.py +0 -98
- mirascope/tools/system/__init__.py +0 -0
- mirascope/tools/system/_docker_operation.py +0 -166
- mirascope/tools/system/_file_system.py +0 -267
- mirascope/tools/web/__init__.py +0 -0
- mirascope/tools/web/_duckduckgo.py +0 -111
- mirascope/tools/web/_httpx.py +0 -125
- mirascope/tools/web/_parse_url_content.py +0 -94
- mirascope/tools/web/_requests.py +0 -54
- mirascope/v0/__init__.py +0 -43
- mirascope/v0/anthropic.py +0 -54
- mirascope/v0/base/__init__.py +0 -12
- mirascope/v0/base/calls.py +0 -118
- mirascope/v0/base/extractors.py +0 -122
- mirascope/v0/base/ops_utils.py +0 -207
- mirascope/v0/base/prompts.py +0 -48
- mirascope/v0/base/types.py +0 -14
- mirascope/v0/base/utils.py +0 -21
- mirascope/v0/openai.py +0 -54
- mirascope-1.25.7.dist-info/METADATA +0 -169
- mirascope-1.25.7.dist-info/RECORD +0 -378
- {mirascope-1.25.7.dist-info → mirascope-2.0.0a0.dist-info}/WHEEL +0 -0
- {mirascope-1.25.7.dist-info → mirascope-2.0.0a0.dist-info}/licenses/LICENSE +0 -0
mirascope/v0/__init__.py
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import warnings
|
|
2
|
-
from contextlib import suppress
|
|
3
|
-
|
|
4
|
-
from . import base
|
|
5
|
-
|
|
6
|
-
with suppress(ImportError):
|
|
7
|
-
from . import anthropic
|
|
8
|
-
|
|
9
|
-
with suppress(ImportError):
|
|
10
|
-
from . import openai
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
warnings.warn("""MIRASCOPE LOOK-ALIKE V0 INTERFACE USAGE
|
|
14
|
-
You are using the `mirascope.v0` module, which implements look-alike interfaces.
|
|
15
|
-
It is extremely important to note the following about these interfaces:
|
|
16
|
-
- We provide no guarantee that we will support these interfaces. This includes any additional features or bugfixes.
|
|
17
|
-
- We reserve the right to remove these interfaces from the library entirely.
|
|
18
|
-
- These interfaces are an attempt at replicating the v0 interfaces, but they are built using v1 under the hood.
|
|
19
|
-
- This means that you can access certain v1 features through these interfaces (such as multimodal prompt templates).
|
|
20
|
-
- However, this also means that there are inevitable differences (e.g. `OpenAICallResponse` returned from `call` is the `v1` implementation).
|
|
21
|
-
|
|
22
|
-
The goal of these interfaces is to make it possible to migrate from v0 to v1 without requiring a full migration.
|
|
23
|
-
HOWEVER, there are a few key differences to note:
|
|
24
|
-
- STREAMING:
|
|
25
|
-
- Was annoying to replicate, so we have instead opted to support streaming with the v1 return typing.
|
|
26
|
-
- The return type is a tuple[Chunk, Tool], so if you're not using tools, simply ignore the second item (e.g. `for chunk, _ in stream: ...`)
|
|
27
|
-
- If you're using tools, simply access tools as they are streamed through the second tuple item (i.e. no more `OpenAIToolStream`)
|
|
28
|
-
- BASE CONFIG:
|
|
29
|
-
- Was also annoying to replicate, so we've opted not to replicate this.
|
|
30
|
-
- To provide a custom client (e.g. `AzureOpenAI`), simply pass that client into your function (e.g. `book_recommender.call(client=AzureOpenAI(...))`) and we'll use it.
|
|
31
|
-
- This means there is no longer a `BaseConfig` object on anything.
|
|
32
|
-
- We currently only support the v0 look-alike interfaces for Anthropic and OpenAI.
|
|
33
|
-
- The import structure may differ slightly. In particular, there are no submodules for `anthropic` or `openai`, so you should be importing directly from those modules (e.g. `from mirascope.v0.openai import OpenAICall`)
|
|
34
|
-
|
|
35
|
-
Next steps:
|
|
36
|
-
- We encourage you to try out the new v1 interface and mirgrate over. We think it's a big improvement, and we hope you will come to feel this way too.
|
|
37
|
-
- We've written a migration guide to help with this process: https://mirascope.com/MIGRATE
|
|
38
|
-
- We greatly appreciate any and all questions/comments/feedback, so if you have anything, send it our way!
|
|
39
|
-
- We understand that some people may prefer the class approach from v0 interface design. You can achieve a very similar interface using v1, see https://mirascope.com/MIGRATE/#baseprompt
|
|
40
|
-
- If there turns out to be sufficient desire for the class-based interfaces to be included in v1 as fully supported interfaces, we will potentially consider this.
|
|
41
|
-
""")
|
|
42
|
-
|
|
43
|
-
__all__ = ["anthropic", "base", "openai"]
|
mirascope/v0/anthropic.py
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"""OpenAI modules for the v0 look-alike implementation."""
|
|
2
|
-
|
|
3
|
-
from typing import ClassVar, Generic, Literal, TypeVar
|
|
4
|
-
|
|
5
|
-
from anthropic.types.completion_create_params import Metadata
|
|
6
|
-
from pydantic import ConfigDict
|
|
7
|
-
|
|
8
|
-
from ..core.anthropic import (
|
|
9
|
-
AnthropicCallResponse,
|
|
10
|
-
AnthropicCallResponseChunk,
|
|
11
|
-
AnthropicTool,
|
|
12
|
-
anthropic_call,
|
|
13
|
-
)
|
|
14
|
-
from .base import BaseCall, BaseCallParams, BaseExtractor, ExtractedType
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class AnthropicCallParams(BaseCallParams):
|
|
18
|
-
"""The parameters to use when calling d Claud API with a prompt."""
|
|
19
|
-
|
|
20
|
-
max_tokens: int = 1000
|
|
21
|
-
model: str = "claude-3-haiku-20240307"
|
|
22
|
-
metadata: Metadata | None = None
|
|
23
|
-
stop_sequences: list[str] | None = None
|
|
24
|
-
system: str | None = None
|
|
25
|
-
temperature: float | None = None
|
|
26
|
-
top_k: int | None = None
|
|
27
|
-
top_p: float | None = None
|
|
28
|
-
|
|
29
|
-
response_format: Literal["json"] | None = None
|
|
30
|
-
|
|
31
|
-
model_config = ConfigDict(arbitrary_types_allowed=True, extra="allow")
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class AnthropicCall(
|
|
35
|
-
BaseCall[AnthropicCallResponse, AnthropicCallResponseChunk, AnthropicTool]
|
|
36
|
-
):
|
|
37
|
-
call_params: ClassVar[BaseCallParams] = AnthropicCallParams(
|
|
38
|
-
model="claude-3-5-sonnet-20240620"
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
_decorator = anthropic_call
|
|
42
|
-
_provider = "anthropic"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
T = TypeVar("T", bound=ExtractedType)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
class AnthropicExtractor(BaseExtractor[T], Generic[T]):
|
|
49
|
-
call_params: ClassVar[BaseCallParams] = AnthropicCallParams(
|
|
50
|
-
model="claude-3-5-sonnet-20240620"
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
_decorator = anthropic_call
|
|
54
|
-
_provider = "anthropic"
|
mirascope/v0/base/__init__.py
DELETED
mirascope/v0/base/calls.py
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
from collections.abc import AsyncGenerator, Callable, Generator
|
|
2
|
-
from typing import Any, ClassVar, Generic, TypeVar
|
|
3
|
-
|
|
4
|
-
from pydantic import model_validator
|
|
5
|
-
from tenacity import AsyncRetrying, Retrying
|
|
6
|
-
from typing_extensions import Self
|
|
7
|
-
|
|
8
|
-
from ...core.base import (
|
|
9
|
-
BaseCallResponse,
|
|
10
|
-
BaseCallResponseChunk,
|
|
11
|
-
BasePrompt,
|
|
12
|
-
BaseTool,
|
|
13
|
-
_utils,
|
|
14
|
-
)
|
|
15
|
-
from ...core.base.dynamic_config import DynamicConfigFull
|
|
16
|
-
from .types import BaseCallParams
|
|
17
|
-
from .utils import retry_decorator
|
|
18
|
-
|
|
19
|
-
_BaseCallResponseT = TypeVar("_BaseCallResponseT", bound=BaseCallResponse)
|
|
20
|
-
_BaseCallResponseChunkT = TypeVar(
|
|
21
|
-
"_BaseCallResponseChunkT", bound=BaseCallResponseChunk
|
|
22
|
-
)
|
|
23
|
-
_BaseToolT = TypeVar("_BaseToolT", bound=BaseTool)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class BaseCall(
|
|
27
|
-
BasePrompt, Generic[_BaseCallResponseT, _BaseCallResponseChunkT, _BaseToolT]
|
|
28
|
-
):
|
|
29
|
-
tags: ClassVar[list[str]] = []
|
|
30
|
-
prompt_template: ClassVar[str] = ""
|
|
31
|
-
|
|
32
|
-
call_params: ClassVar[BaseCallParams] = BaseCallParams(model="")
|
|
33
|
-
|
|
34
|
-
_decorator: ClassVar[Callable] = lambda self: None
|
|
35
|
-
_provider: ClassVar[str] = "NO PROVIDER"
|
|
36
|
-
|
|
37
|
-
@model_validator(mode="after")
|
|
38
|
-
def set_prompt_template(self) -> Self:
|
|
39
|
-
self._prompt_template = self.prompt_template
|
|
40
|
-
return self
|
|
41
|
-
|
|
42
|
-
def dynamic_config(self) -> DynamicConfigFull:
|
|
43
|
-
"""Returns the dynamic configuration set from user provided information."""
|
|
44
|
-
config: DynamicConfigFull = {
|
|
45
|
-
"call_params": self.call_params.model_dump(exclude={"model", "tools"}),
|
|
46
|
-
"tools": [
|
|
47
|
-
tool
|
|
48
|
-
if isinstance(tool, type)
|
|
49
|
-
else _utils.convert_function_to_base_tool(tool, BaseTool)
|
|
50
|
-
for tool in self.call_params.tools or []
|
|
51
|
-
],
|
|
52
|
-
}
|
|
53
|
-
if hasattr(self, "messages"):
|
|
54
|
-
config["messages"] = self.messages() # pyright: ignore [reportAttributeAccessIssue]
|
|
55
|
-
return config
|
|
56
|
-
|
|
57
|
-
def dump(
|
|
58
|
-
self,
|
|
59
|
-
) -> dict[str, Any]:
|
|
60
|
-
"""Dumps the contents of the prompt into a dictionary."""
|
|
61
|
-
return {
|
|
62
|
-
"tags": self.tags,
|
|
63
|
-
"template": _utils.get_prompt_template(self),
|
|
64
|
-
"inputs": self.model_dump(),
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
def call(
|
|
68
|
-
self,
|
|
69
|
-
retries: int | Retrying = 0,
|
|
70
|
-
client: Any | None = None, # noqa: ANN401
|
|
71
|
-
**kwargs: Any, # noqa: ANN401
|
|
72
|
-
) -> _BaseCallResponseT:
|
|
73
|
-
"""A call to an LLM."""
|
|
74
|
-
return self.run(
|
|
75
|
-
self.__class__._decorator(self.call_params.model, client=client),
|
|
76
|
-
retry_decorator(retries),
|
|
77
|
-
) # pyright: ignore [reportReturnType]
|
|
78
|
-
|
|
79
|
-
async def call_async(
|
|
80
|
-
self,
|
|
81
|
-
retries: int | AsyncRetrying = 0,
|
|
82
|
-
client: Any | None = None, # noqa: ANN401
|
|
83
|
-
**kwargs: Any, # noqa: ANN401
|
|
84
|
-
) -> _BaseCallResponseT:
|
|
85
|
-
"""An asynchronous call to an LLM."""
|
|
86
|
-
return await self.run_async(
|
|
87
|
-
self.__class__._decorator(self.call_params.model, client=client),
|
|
88
|
-
retry_decorator(retries),
|
|
89
|
-
) # pyright: ignore [reportReturnType]
|
|
90
|
-
|
|
91
|
-
def stream(
|
|
92
|
-
self,
|
|
93
|
-
retries: int | Retrying = 0,
|
|
94
|
-
client: Any | None = None, # noqa: ANN401
|
|
95
|
-
**kwargs: Any, # noqa: ANN401
|
|
96
|
-
) -> Generator[tuple[_BaseCallResponseChunkT, _BaseToolT], None, None]:
|
|
97
|
-
"""A call to an LLM that streams the response in chunks."""
|
|
98
|
-
yield from self.run(
|
|
99
|
-
self.__class__._decorator(
|
|
100
|
-
self.call_params.model, stream=True, client=client
|
|
101
|
-
),
|
|
102
|
-
retry_decorator(retries),
|
|
103
|
-
) # pyright: ignore [reportReturnType]
|
|
104
|
-
|
|
105
|
-
async def stream_async(
|
|
106
|
-
self,
|
|
107
|
-
retries: int | AsyncRetrying = 0,
|
|
108
|
-
client: Any | None = None, # noqa: ANN401
|
|
109
|
-
**kwargs: Any, # noqa: ANN401
|
|
110
|
-
) -> AsyncGenerator[tuple[_BaseCallResponseChunkT, _BaseToolT], None]:
|
|
111
|
-
"""A asynchronous call to an LLM that streams the response in chunks."""
|
|
112
|
-
async for chunk, tool in self.run_async( # pyright: ignore [reportGeneralTypeIssues]
|
|
113
|
-
self.__class__._decorator(
|
|
114
|
-
self.call_params.model, stream=True, client=client
|
|
115
|
-
),
|
|
116
|
-
retry_decorator(retries),
|
|
117
|
-
):
|
|
118
|
-
yield chunk, tool
|
mirascope/v0/base/extractors.py
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
from collections.abc import AsyncGenerator, Callable, Generator
|
|
2
|
-
from typing import Any, ClassVar, Generic, TypeVar
|
|
3
|
-
|
|
4
|
-
from pydantic import BaseModel, model_validator
|
|
5
|
-
from tenacity import AsyncRetrying, Retrying
|
|
6
|
-
from typing_extensions import Self
|
|
7
|
-
|
|
8
|
-
from ...core.base import BasePrompt, BaseTool, _utils
|
|
9
|
-
from ...core.base.dynamic_config import DynamicConfigFull
|
|
10
|
-
from .types import BaseCallParams
|
|
11
|
-
from .utils import retry_decorator
|
|
12
|
-
|
|
13
|
-
ExtractedType = _utils.BaseType | BaseModel
|
|
14
|
-
_ExtractedTypeT = TypeVar("_ExtractedTypeT", bound=ExtractedType)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class BaseExtractor(BasePrompt, Generic[_ExtractedTypeT]):
|
|
18
|
-
extract_schema: type[_utils.BaseType] | type[BaseModel] | Callable
|
|
19
|
-
tags: ClassVar[list[str]] = []
|
|
20
|
-
prompt_template: ClassVar[str] = ""
|
|
21
|
-
|
|
22
|
-
call_params: ClassVar[BaseCallParams] = BaseCallParams(model="")
|
|
23
|
-
|
|
24
|
-
_decorator: ClassVar[Callable] = lambda self: None
|
|
25
|
-
_provider: ClassVar[str] = "NO PROVIDER"
|
|
26
|
-
|
|
27
|
-
@model_validator(mode="after")
|
|
28
|
-
def set_prompt_template(self) -> Self:
|
|
29
|
-
self._prompt_template = self.prompt_template
|
|
30
|
-
return self
|
|
31
|
-
|
|
32
|
-
def dynamic_config(self) -> DynamicConfigFull:
|
|
33
|
-
"""Returns the dynamic configuration set from user provided information."""
|
|
34
|
-
config: DynamicConfigFull = {
|
|
35
|
-
"call_params": self.call_params.model_dump(exclude={"model", "tools"}),
|
|
36
|
-
"tools": [
|
|
37
|
-
tool
|
|
38
|
-
if isinstance(tool, type)
|
|
39
|
-
else _utils.convert_function_to_base_tool(tool, BaseTool)
|
|
40
|
-
for tool in self.call_params.tools or []
|
|
41
|
-
],
|
|
42
|
-
}
|
|
43
|
-
if hasattr(self, "messages"):
|
|
44
|
-
config["messages"] = self.messages() # pyright: ignore [reportAttributeAccessIssue]
|
|
45
|
-
return config
|
|
46
|
-
|
|
47
|
-
def dump(
|
|
48
|
-
self,
|
|
49
|
-
) -> dict[str, Any]:
|
|
50
|
-
"""Dumps the contents of the prompt into a dictionary."""
|
|
51
|
-
return {
|
|
52
|
-
"tags": self.tags,
|
|
53
|
-
"template": _utils.get_prompt_template(self),
|
|
54
|
-
"inputs": self.model_dump(),
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
def extract(
|
|
58
|
-
self,
|
|
59
|
-
retries: int | Retrying = 0,
|
|
60
|
-
client: Any | None = None, # noqa: ANN401
|
|
61
|
-
**kwargs: Any, # noqa: ANN401
|
|
62
|
-
) -> _ExtractedTypeT:
|
|
63
|
-
"""Extracts the `extract_schema` format from the response."""
|
|
64
|
-
return self.run(
|
|
65
|
-
self.__class__._decorator(
|
|
66
|
-
self.call_params.model,
|
|
67
|
-
response_model=self.extract_schema,
|
|
68
|
-
client=client,
|
|
69
|
-
),
|
|
70
|
-
retry_decorator(retries),
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
async def extract_async(
|
|
74
|
-
self,
|
|
75
|
-
retries: int | Retrying = 0,
|
|
76
|
-
client: Any | None = None, # noqa: ANN401
|
|
77
|
-
**kwargs: Any, # noqa: ANN401
|
|
78
|
-
) -> _ExtractedTypeT:
|
|
79
|
-
"""Asynchronously extracts the `extract_schema` format from the response."""
|
|
80
|
-
return await self.run_async(
|
|
81
|
-
self.__class__._decorator(
|
|
82
|
-
self.call_params.model,
|
|
83
|
-
response_model=self.extract_schema,
|
|
84
|
-
client=client,
|
|
85
|
-
),
|
|
86
|
-
retry_decorator(retries),
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
def stream(
|
|
90
|
-
self,
|
|
91
|
-
retries: int | Retrying = 0,
|
|
92
|
-
client: Any | None = None, # noqa: ANN401
|
|
93
|
-
**kwargs: Any, # noqa: ANN401
|
|
94
|
-
) -> Generator[_ExtractedTypeT, None, None]:
|
|
95
|
-
"""Streams the desired structured output from the response."""
|
|
96
|
-
yield from self.run(
|
|
97
|
-
self.__class__._decorator(
|
|
98
|
-
self.call_params.model,
|
|
99
|
-
response_model=self.extract_schema,
|
|
100
|
-
stream=True,
|
|
101
|
-
client=client,
|
|
102
|
-
),
|
|
103
|
-
retry_decorator(retries),
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
async def stream_async(
|
|
107
|
-
self,
|
|
108
|
-
retries: int | AsyncRetrying = 0,
|
|
109
|
-
client: Any | None = None, # noqa: ANN401
|
|
110
|
-
**kwargs: Any, # noqa: ANN401
|
|
111
|
-
) -> AsyncGenerator[_ExtractedTypeT, None]:
|
|
112
|
-
"""Asynchronously streams the desired structured output from the response."""
|
|
113
|
-
async for item in await self.run_async(
|
|
114
|
-
self.__class__._decorator(
|
|
115
|
-
self.call_params.model,
|
|
116
|
-
response_model=self.extract_schema,
|
|
117
|
-
stream=True,
|
|
118
|
-
client=client,
|
|
119
|
-
),
|
|
120
|
-
retry_decorator(retries),
|
|
121
|
-
):
|
|
122
|
-
yield item
|
mirascope/v0/base/ops_utils.py
DELETED
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import inspect
|
|
2
|
-
from collections.abc import Awaitable, Callable, Generator
|
|
3
|
-
from contextlib import AbstractContextManager
|
|
4
|
-
from functools import wraps
|
|
5
|
-
from typing import Any, TypeVar
|
|
6
|
-
|
|
7
|
-
from pydantic import BaseModel
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def get_class_vars(self: BaseModel) -> dict[str, Any]:
|
|
11
|
-
"""Get the class variables of a `BaseModel` removing any dangerous variables."""
|
|
12
|
-
class_vars = {}
|
|
13
|
-
for classvars in self.__class_vars__:
|
|
14
|
-
if classvars != "api_key":
|
|
15
|
-
class_vars[classvars] = getattr(self.__class__, classvars)
|
|
16
|
-
return class_vars
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
F = TypeVar("F", bound=Callable[..., Any])
|
|
20
|
-
DecoratorType = Callable[[F], F]
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def mirascope_span( # noqa: ANN201
|
|
24
|
-
fn: Callable,
|
|
25
|
-
*,
|
|
26
|
-
handle_before_call: Callable[..., Any] | None = None,
|
|
27
|
-
handle_before_call_async: Callable[..., Awaitable[Any]] | None = None,
|
|
28
|
-
handle_after_call: Callable[..., Any] | None = None,
|
|
29
|
-
handle_after_call_async: Callable[..., Awaitable[Any]] | None = None,
|
|
30
|
-
decorator: DecoratorType | None = None,
|
|
31
|
-
**custom_kwargs: Any, # noqa: ANN401
|
|
32
|
-
):
|
|
33
|
-
"""Wraps a pydantic class method."""
|
|
34
|
-
|
|
35
|
-
async def run_after_call_handler(self, result, result_before_call, joined_kwargs): # noqa: ANN001, ANN202
|
|
36
|
-
if handle_after_call_async is not None:
|
|
37
|
-
await handle_after_call_async(
|
|
38
|
-
self, fn, result, result_before_call, **joined_kwargs
|
|
39
|
-
)
|
|
40
|
-
elif handle_after_call is not None:
|
|
41
|
-
handle_after_call(self, fn, result, result_before_call, **joined_kwargs)
|
|
42
|
-
|
|
43
|
-
@wraps(fn)
|
|
44
|
-
def wrapper(self: BaseModel, *args: Any, **kwargs: Any): # noqa: ANN202, ANN401
|
|
45
|
-
"""Wraps a pydantic class method that returns a value."""
|
|
46
|
-
joined_kwargs = {**kwargs, **custom_kwargs}
|
|
47
|
-
before_call = (
|
|
48
|
-
handle_before_call(self, fn, **joined_kwargs)
|
|
49
|
-
if handle_before_call is not None
|
|
50
|
-
else None
|
|
51
|
-
)
|
|
52
|
-
if isinstance(before_call, AbstractContextManager):
|
|
53
|
-
with before_call as result_before_call:
|
|
54
|
-
result = fn(self, *args, **kwargs)
|
|
55
|
-
if handle_after_call is not None:
|
|
56
|
-
handle_after_call(
|
|
57
|
-
self, fn, result, result_before_call, **joined_kwargs
|
|
58
|
-
)
|
|
59
|
-
return result
|
|
60
|
-
else:
|
|
61
|
-
result = fn(self, *args, **kwargs)
|
|
62
|
-
if handle_after_call is not None:
|
|
63
|
-
handle_after_call(self, fn, result, before_call, **joined_kwargs)
|
|
64
|
-
return result
|
|
65
|
-
|
|
66
|
-
@wraps(fn)
|
|
67
|
-
async def wrapper_async(self: BaseModel, *args: Any, **kwargs: Any): # noqa: ANN202, ANN401
|
|
68
|
-
"""Wraps a pydantic async class method that returns a value."""
|
|
69
|
-
joined_kwargs = {**kwargs, **custom_kwargs}
|
|
70
|
-
before_call = None
|
|
71
|
-
if handle_before_call_async is not None:
|
|
72
|
-
before_call = await handle_before_call_async(self, fn, **joined_kwargs)
|
|
73
|
-
elif handle_before_call is not None:
|
|
74
|
-
before_call = handle_before_call(self, fn, **joined_kwargs)
|
|
75
|
-
|
|
76
|
-
if isinstance(before_call, AbstractContextManager):
|
|
77
|
-
with before_call as result_before_call:
|
|
78
|
-
result = await fn(self, *args, **kwargs)
|
|
79
|
-
await run_after_call_handler(
|
|
80
|
-
self, result, result_before_call, joined_kwargs
|
|
81
|
-
)
|
|
82
|
-
return result
|
|
83
|
-
else:
|
|
84
|
-
result = await fn(self, *args, **kwargs)
|
|
85
|
-
await run_after_call_handler(self, result, before_call, joined_kwargs)
|
|
86
|
-
return result
|
|
87
|
-
|
|
88
|
-
@wraps(fn)
|
|
89
|
-
def wrapper_generator(self: BaseModel, *args: Any, **kwargs: Any): # noqa: ANN202, ANN401
|
|
90
|
-
"""Wraps a pydantic class method that returns a generator."""
|
|
91
|
-
joined_kwargs = {**kwargs, **custom_kwargs}
|
|
92
|
-
before_call = (
|
|
93
|
-
handle_before_call(self, fn, **joined_kwargs)
|
|
94
|
-
if handle_before_call is not None
|
|
95
|
-
else None
|
|
96
|
-
)
|
|
97
|
-
if isinstance(before_call, AbstractContextManager):
|
|
98
|
-
with before_call as result_before_call:
|
|
99
|
-
result = fn(self, *args, **kwargs)
|
|
100
|
-
output = []
|
|
101
|
-
for value in result:
|
|
102
|
-
output.append(value)
|
|
103
|
-
yield value
|
|
104
|
-
if handle_after_call is not None:
|
|
105
|
-
handle_after_call(
|
|
106
|
-
self, fn, output, result_before_call, **joined_kwargs
|
|
107
|
-
)
|
|
108
|
-
else:
|
|
109
|
-
result = fn(self, *args, **kwargs)
|
|
110
|
-
output = []
|
|
111
|
-
for value in result:
|
|
112
|
-
output.append(value)
|
|
113
|
-
yield value
|
|
114
|
-
if handle_after_call is not None:
|
|
115
|
-
handle_after_call(self, fn, output, before_call, **joined_kwargs)
|
|
116
|
-
|
|
117
|
-
@wraps(fn)
|
|
118
|
-
async def wrapper_generator_async(self: BaseModel, *args: Any, **kwargs: Any): # noqa: ANN202, ANN401
|
|
119
|
-
"""Wraps a pydantic async class method that returns a generator."""
|
|
120
|
-
joined_kwargs = {**kwargs, **custom_kwargs}
|
|
121
|
-
before_call = None
|
|
122
|
-
if handle_before_call_async is not None:
|
|
123
|
-
before_call = await handle_before_call_async(self, fn, **joined_kwargs)
|
|
124
|
-
elif handle_before_call is not None:
|
|
125
|
-
before_call = handle_before_call(self, fn, **joined_kwargs)
|
|
126
|
-
if isinstance(before_call, AbstractContextManager):
|
|
127
|
-
with before_call as result_before_call:
|
|
128
|
-
result = fn(self, *args, **kwargs)
|
|
129
|
-
output = []
|
|
130
|
-
async for value in result:
|
|
131
|
-
output.append(value)
|
|
132
|
-
yield value
|
|
133
|
-
await run_after_call_handler(
|
|
134
|
-
self, output, result_before_call, joined_kwargs
|
|
135
|
-
)
|
|
136
|
-
else:
|
|
137
|
-
result = fn(self, *args, **kwargs)
|
|
138
|
-
output = []
|
|
139
|
-
async for value in result:
|
|
140
|
-
output.append(value)
|
|
141
|
-
yield value
|
|
142
|
-
await run_after_call_handler(self, output, before_call, joined_kwargs)
|
|
143
|
-
|
|
144
|
-
wrapper_function = wrapper
|
|
145
|
-
if inspect.isasyncgenfunction(fn):
|
|
146
|
-
wrapper_function = wrapper_generator_async
|
|
147
|
-
elif inspect.iscoroutinefunction(fn):
|
|
148
|
-
wrapper_function = wrapper_async
|
|
149
|
-
elif inspect.isgeneratorfunction(fn):
|
|
150
|
-
wrapper_function = wrapper_generator
|
|
151
|
-
if decorator is not None:
|
|
152
|
-
wrapper_function = decorator(wrapper_function)
|
|
153
|
-
return wrapper_function
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
def wrap_mirascope_class_functions( # noqa: ANN201
|
|
157
|
-
cls: type[BaseModel],
|
|
158
|
-
*,
|
|
159
|
-
handle_before_call: Callable[..., Any] | None = None,
|
|
160
|
-
handle_before_call_async: Callable[..., Awaitable[Any]] | None = None,
|
|
161
|
-
handle_after_call: Callable[..., Any] | None = None,
|
|
162
|
-
handle_after_call_async: Callable[..., Awaitable[Any]] | None = None,
|
|
163
|
-
decorator: DecoratorType | None = None,
|
|
164
|
-
**custom_kwargs: Any, # noqa: ANN401
|
|
165
|
-
):
|
|
166
|
-
"""Wraps Mirascope class functions with a decorator.
|
|
167
|
-
|
|
168
|
-
Args:
|
|
169
|
-
cls: The Mirascope class to wrap.
|
|
170
|
-
handle_before_call: A function to call before the call to the wrapped function.
|
|
171
|
-
handle_after_call: A function to call after the call to the wrapped function.
|
|
172
|
-
custom_kwargs: Additional keyword arguments to pass to the decorator.
|
|
173
|
-
"""
|
|
174
|
-
|
|
175
|
-
for name in get_class_functions(cls):
|
|
176
|
-
setattr(
|
|
177
|
-
cls,
|
|
178
|
-
name,
|
|
179
|
-
mirascope_span(
|
|
180
|
-
getattr(cls, name),
|
|
181
|
-
handle_before_call=handle_before_call,
|
|
182
|
-
handle_before_call_async=handle_before_call_async,
|
|
183
|
-
handle_after_call=handle_after_call,
|
|
184
|
-
handle_after_call_async=handle_after_call_async,
|
|
185
|
-
decorator=decorator,
|
|
186
|
-
**custom_kwargs,
|
|
187
|
-
),
|
|
188
|
-
)
|
|
189
|
-
return cls
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
def get_class_functions(cls: type[BaseModel]) -> Generator[str, None, None]:
|
|
193
|
-
"""Get the class functions of a `BaseModel`."""
|
|
194
|
-
ignore_functions = [
|
|
195
|
-
"copy",
|
|
196
|
-
"dict",
|
|
197
|
-
"dump",
|
|
198
|
-
"json",
|
|
199
|
-
"messages",
|
|
200
|
-
"model_copy",
|
|
201
|
-
"model_dump",
|
|
202
|
-
"model_dump_json",
|
|
203
|
-
"model_post_init",
|
|
204
|
-
]
|
|
205
|
-
for name, _ in inspect.getmembers(cls, predicate=inspect.isfunction):
|
|
206
|
-
if not name.startswith("_") and name not in ignore_functions:
|
|
207
|
-
yield name
|
mirascope/v0/base/prompts.py
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
from collections.abc import Callable
|
|
2
|
-
from typing import TypeVar
|
|
3
|
-
|
|
4
|
-
from .calls import BaseCall
|
|
5
|
-
|
|
6
|
-
_BaseCallT = TypeVar("_BaseCallT", bound=BaseCall)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def tags(args: list[str]) -> Callable[[type[_BaseCallT]], type[_BaseCallT]]:
|
|
10
|
-
'''A decorator for adding tags to a `BasePrompt`.
|
|
11
|
-
|
|
12
|
-
Adding this decorator to a `BasePrompt` updates the `_tags` class attribute to the
|
|
13
|
-
given value. This is useful for adding metadata to a `BasePrompt` that can be used
|
|
14
|
-
for logging or filtering.
|
|
15
|
-
|
|
16
|
-
Example:
|
|
17
|
-
|
|
18
|
-
```python
|
|
19
|
-
from mirascope import BasePrompt, tags
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@tags(["book_recommendation", "entertainment"])
|
|
23
|
-
class BookRecommendationPrompt(BasePrompt):
|
|
24
|
-
prompt_template = """
|
|
25
|
-
SYSTEM:
|
|
26
|
-
You are the world's greatest librarian.
|
|
27
|
-
|
|
28
|
-
USER:
|
|
29
|
-
I've recently read this book: {book_title}.
|
|
30
|
-
What should I read next?
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
book_title: [str]
|
|
34
|
-
|
|
35
|
-
print(BookRecommendationPrompt.dump()["tags"])
|
|
36
|
-
#> ['book_recommendation', 'entertainment']
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Returns:
|
|
40
|
-
The decorated class with `tags` class attribute set.
|
|
41
|
-
'''
|
|
42
|
-
|
|
43
|
-
def tags_fn(model_class: type[_BaseCallT]) -> type[_BaseCallT]:
|
|
44
|
-
"""Updates the `tags` class attribute to the given value."""
|
|
45
|
-
model_class.tags = args
|
|
46
|
-
return model_class
|
|
47
|
-
|
|
48
|
-
return tags_fn
|
mirascope/v0/base/types.py
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
from collections.abc import Callable
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, ConfigDict
|
|
4
|
-
|
|
5
|
-
from ...core.base import BaseTool
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class BaseCallParams(BaseModel):
|
|
9
|
-
"""The parameters with which to make a call."""
|
|
10
|
-
|
|
11
|
-
model: str
|
|
12
|
-
tools: list[type[BaseTool] | Callable] | None = None
|
|
13
|
-
|
|
14
|
-
model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
|
mirascope/v0/base/utils.py
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
from collections.abc import Callable
|
|
2
|
-
|
|
3
|
-
from tenacity import AsyncRetrying, Retrying, retry, stop_after_attempt
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def retry_decorator(retries: int | Retrying | AsyncRetrying) -> Callable:
|
|
7
|
-
if isinstance(retries, int):
|
|
8
|
-
if retries == 0:
|
|
9
|
-
return lambda x: x
|
|
10
|
-
return retry(stop=stop_after_attempt(retries))
|
|
11
|
-
return retry(
|
|
12
|
-
sleep=retries.sleep,
|
|
13
|
-
stop=retries.stop,
|
|
14
|
-
wait=retries.wait,
|
|
15
|
-
before=retries.before,
|
|
16
|
-
after=retries.after,
|
|
17
|
-
before_sleep=retries.before_sleep,
|
|
18
|
-
reraise=retries.reraise,
|
|
19
|
-
retry_error_cls=retries.retry_error_cls,
|
|
20
|
-
retry_error_callback=retries.retry_error_callback,
|
|
21
|
-
)
|