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