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,121 +0,0 @@
|
|
|
1
|
-
"""Utility for converting `BaseMessageParam` to `ChatRequestMessage`."""
|
|
2
|
-
|
|
3
|
-
import base64
|
|
4
|
-
import json
|
|
5
|
-
from typing import cast
|
|
6
|
-
|
|
7
|
-
from azure.ai.inference.models import (
|
|
8
|
-
AssistantMessage,
|
|
9
|
-
ChatCompletionsToolCall,
|
|
10
|
-
ChatRequestMessage,
|
|
11
|
-
FunctionCall,
|
|
12
|
-
ToolMessage,
|
|
13
|
-
UserMessage,
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
from ...base import BaseMessageParam
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def convert_message_params(
|
|
20
|
-
message_params: list[BaseMessageParam | ChatRequestMessage],
|
|
21
|
-
) -> list[ChatRequestMessage]:
|
|
22
|
-
converted_message_params: list[ChatRequestMessage | ToolMessage] = []
|
|
23
|
-
for message_param in message_params:
|
|
24
|
-
if not isinstance(message_param, BaseMessageParam):
|
|
25
|
-
converted_message_params.append(message_param)
|
|
26
|
-
elif isinstance((content := message_param.content), str):
|
|
27
|
-
converted_message_params.append(UserMessage(content=content))
|
|
28
|
-
else:
|
|
29
|
-
converted_content = []
|
|
30
|
-
for part in content:
|
|
31
|
-
if part.type == "text":
|
|
32
|
-
converted_content.append(part.model_dump())
|
|
33
|
-
elif part.type == "image":
|
|
34
|
-
if part.media_type not in [
|
|
35
|
-
"image/jpeg",
|
|
36
|
-
"image/png",
|
|
37
|
-
"image/gif",
|
|
38
|
-
"image/webp",
|
|
39
|
-
]:
|
|
40
|
-
raise ValueError(
|
|
41
|
-
f"Unsupported image media type: {part.media_type}. Azure"
|
|
42
|
-
" currently only supports JPEG, PNG, GIF, and WebP images."
|
|
43
|
-
)
|
|
44
|
-
data = base64.b64encode(part.image).decode("utf-8")
|
|
45
|
-
converted_content.append(
|
|
46
|
-
{
|
|
47
|
-
"type": "image_url",
|
|
48
|
-
"image_url": {
|
|
49
|
-
"url": f"data:{part.media_type};base64,{data}",
|
|
50
|
-
"detail": part.detail if part.detail else "auto",
|
|
51
|
-
},
|
|
52
|
-
}
|
|
53
|
-
)
|
|
54
|
-
elif part.type == "image_url":
|
|
55
|
-
converted_content.append(
|
|
56
|
-
{
|
|
57
|
-
"type": "image_url",
|
|
58
|
-
"image_url": {
|
|
59
|
-
"url": part.url,
|
|
60
|
-
"detail": part.detail if part.detail else "auto",
|
|
61
|
-
},
|
|
62
|
-
}
|
|
63
|
-
)
|
|
64
|
-
elif part.type == "tool_call":
|
|
65
|
-
converted_message_param = AssistantMessage(
|
|
66
|
-
tool_calls=[
|
|
67
|
-
ChatCompletionsToolCall(
|
|
68
|
-
id=part.id, # pyright: ignore [reportArgumentType]
|
|
69
|
-
function=FunctionCall(
|
|
70
|
-
name=part.name, arguments=json.dumps(part.args)
|
|
71
|
-
),
|
|
72
|
-
)
|
|
73
|
-
]
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
if converted_content:
|
|
77
|
-
if len(converted_content) == 1:
|
|
78
|
-
if converted_content[0]["type"] == "text":
|
|
79
|
-
converted_message_param["content"] = converted_content[
|
|
80
|
-
0
|
|
81
|
-
]["text"]
|
|
82
|
-
else:
|
|
83
|
-
converted_message_params.append(
|
|
84
|
-
ChatRequestMessage(
|
|
85
|
-
{
|
|
86
|
-
"role": message_param.role,
|
|
87
|
-
"content": converted_content,
|
|
88
|
-
}
|
|
89
|
-
)
|
|
90
|
-
)
|
|
91
|
-
converted_content = []
|
|
92
|
-
converted_message_params.append(converted_message_param)
|
|
93
|
-
elif part.type == "tool_result":
|
|
94
|
-
if converted_content:
|
|
95
|
-
converted_message_params.append(
|
|
96
|
-
ChatRequestMessage(
|
|
97
|
-
{
|
|
98
|
-
"role": message_param.role,
|
|
99
|
-
"content": converted_content,
|
|
100
|
-
}
|
|
101
|
-
)
|
|
102
|
-
)
|
|
103
|
-
converted_content = []
|
|
104
|
-
converted_message_params.append(
|
|
105
|
-
ToolMessage(
|
|
106
|
-
content=part.content,
|
|
107
|
-
tool_call_id=cast(str, part.id),
|
|
108
|
-
)
|
|
109
|
-
)
|
|
110
|
-
else:
|
|
111
|
-
raise ValueError(
|
|
112
|
-
"Azure currently only supports text and image parts. "
|
|
113
|
-
f"Part provided: {part.type}"
|
|
114
|
-
)
|
|
115
|
-
if converted_content:
|
|
116
|
-
converted_message_params.append(
|
|
117
|
-
ChatRequestMessage(
|
|
118
|
-
{"role": message_param.role, "content": converted_content}
|
|
119
|
-
)
|
|
120
|
-
)
|
|
121
|
-
return converted_message_params
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import os
|
|
4
|
-
from typing import TYPE_CHECKING
|
|
5
|
-
|
|
6
|
-
from azure.core.credentials import AzureKeyCredential
|
|
7
|
-
|
|
8
|
-
if TYPE_CHECKING:
|
|
9
|
-
from azure.identity import ( # pyright: ignore [reportMissingImports]
|
|
10
|
-
DefaultAzureCredential,
|
|
11
|
-
)
|
|
12
|
-
else:
|
|
13
|
-
AzureDefaultCredential = None
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def _get_key_from_env() -> str | None:
|
|
17
|
-
return os.environ.get("AZURE_INFERENCE_CREDENTIAL")
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def _get_azure_default_credential() -> DefaultAzureCredential:
|
|
21
|
-
try:
|
|
22
|
-
from azure.identity import DefaultAzureCredential
|
|
23
|
-
except ImportError:
|
|
24
|
-
raise ImportError(
|
|
25
|
-
"To use the AzureDefaultCredential, please install the azure-identity package with `pip install azure-identity`."
|
|
26
|
-
)
|
|
27
|
-
return DefaultAzureCredential()
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def get_credential() -> DefaultAzureCredential | AzureKeyCredential:
|
|
31
|
-
if (credential := _get_key_from_env()) is None:
|
|
32
|
-
return _get_azure_default_credential()
|
|
33
|
-
return AzureKeyCredential(credential)
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"""Get the JSON output from a completion response."""
|
|
2
|
-
|
|
3
|
-
from ..call_response import AzureCallResponse
|
|
4
|
-
from ..call_response_chunk import AzureCallResponseChunk
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def get_json_output(
|
|
8
|
-
response: AzureCallResponse | AzureCallResponseChunk, json_mode: bool
|
|
9
|
-
) -> str:
|
|
10
|
-
"""Get the JSON output from a completion response."""
|
|
11
|
-
if isinstance(response, AzureCallResponse):
|
|
12
|
-
if json_mode and response.content:
|
|
13
|
-
return response.content
|
|
14
|
-
elif tool_calls := response.response.choices[0].message.tool_calls:
|
|
15
|
-
return tool_calls[0].function.arguments
|
|
16
|
-
raise ValueError("No tool call or JSON object found in response.")
|
|
17
|
-
else:
|
|
18
|
-
if json_mode:
|
|
19
|
-
return response.content
|
|
20
|
-
elif (
|
|
21
|
-
(choices := response.chunk.choices)
|
|
22
|
-
and (tool_calls := choices[0].delta.tool_calls)
|
|
23
|
-
and (function := tool_calls[0].function)
|
|
24
|
-
and (arguments := function.arguments) is not None
|
|
25
|
-
):
|
|
26
|
-
return arguments
|
|
27
|
-
return ""
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
"""Handles the stream of completion chunks."""
|
|
2
|
-
|
|
3
|
-
import copy
|
|
4
|
-
from collections.abc import AsyncGenerator, Generator
|
|
5
|
-
|
|
6
|
-
from azure.ai.inference.models import (
|
|
7
|
-
ChatCompletionsToolCall,
|
|
8
|
-
FunctionCall,
|
|
9
|
-
StreamingChatCompletionsUpdate,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
from ..call_response_chunk import AzureCallResponseChunk
|
|
13
|
-
from ..tool import AzureTool
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def _handle_chunk(
|
|
17
|
-
chunk: StreamingChatCompletionsUpdate,
|
|
18
|
-
current_tool_call: ChatCompletionsToolCall,
|
|
19
|
-
current_tool_type: type[AzureTool] | None,
|
|
20
|
-
tool_types: list[type[AzureTool]] | None,
|
|
21
|
-
) -> tuple[
|
|
22
|
-
AzureTool | None,
|
|
23
|
-
ChatCompletionsToolCall,
|
|
24
|
-
type[AzureTool] | None,
|
|
25
|
-
]:
|
|
26
|
-
"""Handles a chunk of the stream."""
|
|
27
|
-
if (
|
|
28
|
-
not tool_types
|
|
29
|
-
or not chunk.choices
|
|
30
|
-
or not (tool_calls := chunk.choices[0].delta.tool_calls)
|
|
31
|
-
):
|
|
32
|
-
return None, current_tool_call, current_tool_type
|
|
33
|
-
|
|
34
|
-
tool_call = tool_calls[0]
|
|
35
|
-
# Reset on new tool
|
|
36
|
-
if tool_call.id and tool_call.function is not None:
|
|
37
|
-
previous_tool_call = copy.deepcopy(current_tool_call)
|
|
38
|
-
previous_tool_type = current_tool_type
|
|
39
|
-
current_tool_call = ChatCompletionsToolCall(
|
|
40
|
-
id=tool_call.id,
|
|
41
|
-
function=FunctionCall(
|
|
42
|
-
arguments="",
|
|
43
|
-
name=tool_call.function.name if tool_call.function.name else "",
|
|
44
|
-
),
|
|
45
|
-
)
|
|
46
|
-
current_tool_type = None
|
|
47
|
-
for tool_type in tool_types:
|
|
48
|
-
if tool_type._name() == tool_call.function.name:
|
|
49
|
-
current_tool_type = tool_type
|
|
50
|
-
break
|
|
51
|
-
if current_tool_type is None:
|
|
52
|
-
raise RuntimeError(
|
|
53
|
-
f"Unknown tool type in stream: {tool_call.function.name}"
|
|
54
|
-
) # pragma: no cover
|
|
55
|
-
if (
|
|
56
|
-
previous_tool_call.id
|
|
57
|
-
and previous_tool_call.function.arguments
|
|
58
|
-
and previous_tool_type is not None
|
|
59
|
-
):
|
|
60
|
-
return (
|
|
61
|
-
previous_tool_type.from_tool_call(previous_tool_call),
|
|
62
|
-
current_tool_call,
|
|
63
|
-
current_tool_type,
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
# Update arguments with each chunk
|
|
67
|
-
if tool_call.function and tool_call.function.arguments:
|
|
68
|
-
current_tool_call.function.arguments += tool_call.function.arguments
|
|
69
|
-
|
|
70
|
-
return None, current_tool_call, current_tool_type
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def handle_stream(
|
|
74
|
-
stream: Generator[StreamingChatCompletionsUpdate, None, None],
|
|
75
|
-
tool_types: list[type[AzureTool]] | None,
|
|
76
|
-
partial_tools: bool = False,
|
|
77
|
-
) -> Generator[tuple[AzureCallResponseChunk, AzureTool | None], None, None]:
|
|
78
|
-
"""Iterator over the stream and constructs tools as they are streamed."""
|
|
79
|
-
current_tool_call = ChatCompletionsToolCall(
|
|
80
|
-
id="", function=FunctionCall(arguments="", name="")
|
|
81
|
-
)
|
|
82
|
-
current_tool_type = None
|
|
83
|
-
for chunk in stream:
|
|
84
|
-
if not tool_types or not chunk.choices or not chunk.choices[0].delta.tool_calls:
|
|
85
|
-
if current_tool_type:
|
|
86
|
-
yield (
|
|
87
|
-
AzureCallResponseChunk(chunk=chunk),
|
|
88
|
-
current_tool_type.from_tool_call(current_tool_call),
|
|
89
|
-
)
|
|
90
|
-
current_tool_type = None
|
|
91
|
-
else:
|
|
92
|
-
yield AzureCallResponseChunk(chunk=chunk), None
|
|
93
|
-
tool, current_tool_call, current_tool_type = _handle_chunk(
|
|
94
|
-
chunk,
|
|
95
|
-
current_tool_call,
|
|
96
|
-
current_tool_type,
|
|
97
|
-
tool_types,
|
|
98
|
-
)
|
|
99
|
-
if tool is not None:
|
|
100
|
-
yield AzureCallResponseChunk(chunk=chunk), tool
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
async def handle_stream_async(
|
|
104
|
-
stream: AsyncGenerator[StreamingChatCompletionsUpdate, None],
|
|
105
|
-
tool_types: list[type[AzureTool]] | None,
|
|
106
|
-
partial_tools: bool = False,
|
|
107
|
-
) -> AsyncGenerator[tuple[AzureCallResponseChunk, AzureTool | None], None]:
|
|
108
|
-
"""Async iterator over the stream and constructs tools as they are streamed."""
|
|
109
|
-
current_tool_call = ChatCompletionsToolCall(
|
|
110
|
-
id="", function=FunctionCall(arguments="", name="")
|
|
111
|
-
)
|
|
112
|
-
current_tool_type = None
|
|
113
|
-
async for chunk in stream:
|
|
114
|
-
if not tool_types or not chunk.choices[0].delta.tool_calls:
|
|
115
|
-
if current_tool_type:
|
|
116
|
-
yield (
|
|
117
|
-
AzureCallResponseChunk(chunk=chunk),
|
|
118
|
-
current_tool_type.from_tool_call(current_tool_call),
|
|
119
|
-
)
|
|
120
|
-
current_tool_type = None
|
|
121
|
-
else:
|
|
122
|
-
yield AzureCallResponseChunk(chunk=chunk), None
|
|
123
|
-
tool, current_tool_call, current_tool_type = _handle_chunk(
|
|
124
|
-
chunk,
|
|
125
|
-
current_tool_call,
|
|
126
|
-
current_tool_type,
|
|
127
|
-
tool_types,
|
|
128
|
-
)
|
|
129
|
-
if tool is not None:
|
|
130
|
-
yield AzureCallResponseChunk(chunk=chunk), tool
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from typing import cast
|
|
3
|
-
|
|
4
|
-
from azure.ai.inference.models import (
|
|
5
|
-
AssistantMessage,
|
|
6
|
-
ChatRequestMessage,
|
|
7
|
-
ContentItem,
|
|
8
|
-
ImageContentItem,
|
|
9
|
-
TextContentItem,
|
|
10
|
-
ToolMessage,
|
|
11
|
-
UserMessage,
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
from mirascope.core.azure._utils import convert_message_params
|
|
15
|
-
from mirascope.core.base import (
|
|
16
|
-
BaseMessageParam,
|
|
17
|
-
ImageURLPart,
|
|
18
|
-
TextPart,
|
|
19
|
-
ToolCallPart,
|
|
20
|
-
ToolResultPart,
|
|
21
|
-
)
|
|
22
|
-
from mirascope.core.base._utils._base_message_param_converter import (
|
|
23
|
-
BaseMessageParamConverter,
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def _parse_content(content: list[ContentItem]) -> list[TextPart | ImageURLPart]:
|
|
28
|
-
converted_parts = []
|
|
29
|
-
for part in content:
|
|
30
|
-
if isinstance(part, TextContentItem):
|
|
31
|
-
converted_parts.append(TextPart(type="text", text=part.text))
|
|
32
|
-
elif isinstance(part, ImageContentItem):
|
|
33
|
-
converted_parts.append(
|
|
34
|
-
ImageURLPart(
|
|
35
|
-
type="image_url",
|
|
36
|
-
url=part.image_url.url,
|
|
37
|
-
detail=part.image_url.detail,
|
|
38
|
-
)
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
return converted_parts
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class AzureMessageParamConverter(BaseMessageParamConverter):
|
|
45
|
-
"""Converts between Azure `ChatRequestMessage` / `AssistantMessage` and Mirascope `BaseMessageParam`."""
|
|
46
|
-
|
|
47
|
-
@staticmethod
|
|
48
|
-
def to_provider(message_params: list[BaseMessageParam]) -> list[ChatRequestMessage]:
|
|
49
|
-
"""Convert from Mirascope `BaseMessageParam` to Azure's `ChatRequestMessage`."""
|
|
50
|
-
return convert_message_params(
|
|
51
|
-
cast(list[BaseMessageParam | ChatRequestMessage], message_params)
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
@staticmethod
|
|
55
|
-
def from_provider(
|
|
56
|
-
message_params: list[ChatRequestMessage],
|
|
57
|
-
) -> list[BaseMessageParam]:
|
|
58
|
-
"""
|
|
59
|
-
Convert from Azure's `AssistantMessage` back to Mirascope `BaseMessageParam`.
|
|
60
|
-
"""
|
|
61
|
-
converted: list[BaseMessageParam] = []
|
|
62
|
-
for message_param in message_params:
|
|
63
|
-
if isinstance(message_param, UserMessage):
|
|
64
|
-
if isinstance(message_param.content, str):
|
|
65
|
-
converted.append(
|
|
66
|
-
BaseMessageParam(role="user", content=message_param.content)
|
|
67
|
-
)
|
|
68
|
-
elif isinstance(message_param.content, list):
|
|
69
|
-
converted_parts = _parse_content(message_param.content)
|
|
70
|
-
converted.append(
|
|
71
|
-
BaseMessageParam(role="user", content=converted_parts)
|
|
72
|
-
)
|
|
73
|
-
elif isinstance(message_param, AssistantMessage):
|
|
74
|
-
converted_parts = []
|
|
75
|
-
if tool_calls := message_param.tool_calls:
|
|
76
|
-
converted_parts.extend(
|
|
77
|
-
ToolCallPart(
|
|
78
|
-
type="tool_call",
|
|
79
|
-
name=tool_call.function.name,
|
|
80
|
-
id=tool_call.id,
|
|
81
|
-
args=json.loads(tool_call.function.arguments),
|
|
82
|
-
)
|
|
83
|
-
for tool_call in tool_calls
|
|
84
|
-
)
|
|
85
|
-
if isinstance(message_param.content, str):
|
|
86
|
-
converted_parts.append(
|
|
87
|
-
TextPart(type="text", text=message_param.content)
|
|
88
|
-
)
|
|
89
|
-
elif isinstance(message_param.content, list):
|
|
90
|
-
converted_parts = _parse_content(message_param.content)
|
|
91
|
-
else:
|
|
92
|
-
converted_parts.append(TextPart(type="text", text=""))
|
|
93
|
-
converted.append(
|
|
94
|
-
BaseMessageParam(
|
|
95
|
-
role="assistant",
|
|
96
|
-
content=converted_parts[0].text
|
|
97
|
-
if len(converted_parts) == 1
|
|
98
|
-
and isinstance(converted_parts[0], TextPart)
|
|
99
|
-
else converted_parts,
|
|
100
|
-
)
|
|
101
|
-
)
|
|
102
|
-
elif isinstance(message_param, ToolMessage):
|
|
103
|
-
converted.append(
|
|
104
|
-
BaseMessageParam(
|
|
105
|
-
role="tool",
|
|
106
|
-
content=[
|
|
107
|
-
ToolResultPart(
|
|
108
|
-
type="tool_result",
|
|
109
|
-
name="",
|
|
110
|
-
content=message_param.content,
|
|
111
|
-
id=message_param.tool_call_id,
|
|
112
|
-
is_error=False,
|
|
113
|
-
)
|
|
114
|
-
],
|
|
115
|
-
)
|
|
116
|
-
)
|
|
117
|
-
return converted
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
"""This module contains the setup_call function for Azure tools."""
|
|
2
|
-
|
|
3
|
-
import inspect
|
|
4
|
-
import os
|
|
5
|
-
import warnings
|
|
6
|
-
from collections.abc import AsyncIterable, Awaitable, Callable, Iterable
|
|
7
|
-
from typing import Any, cast, overload
|
|
8
|
-
|
|
9
|
-
from azure.ai.inference import ChatCompletionsClient
|
|
10
|
-
from azure.ai.inference.aio import ChatCompletionsClient as AsyncChatCompletionsClient
|
|
11
|
-
from azure.ai.inference.models import (
|
|
12
|
-
ChatCompletions,
|
|
13
|
-
ChatRequestMessage,
|
|
14
|
-
StreamingChatCompletionsUpdate,
|
|
15
|
-
UserMessage,
|
|
16
|
-
)
|
|
17
|
-
from azure.core.credentials import AzureKeyCredential
|
|
18
|
-
from pydantic import BaseModel
|
|
19
|
-
|
|
20
|
-
from ...base import BaseMessageParam, BaseTool, _utils
|
|
21
|
-
from ...base._utils import (
|
|
22
|
-
DEFAULT_TOOL_DOCSTRING,
|
|
23
|
-
AsyncCreateFn,
|
|
24
|
-
CreateFn,
|
|
25
|
-
get_async_create_fn,
|
|
26
|
-
get_create_fn,
|
|
27
|
-
)
|
|
28
|
-
from ...base.call_params import CommonCallParams
|
|
29
|
-
from ...base.stream_config import StreamConfig
|
|
30
|
-
from .._call_kwargs import AzureCallKwargs
|
|
31
|
-
from ..call_params import AzureCallParams, ResponseFormatJSON
|
|
32
|
-
from ..dynamic_config import AsyncAzureDynamicConfig, AzureDynamicConfig
|
|
33
|
-
from ..tool import AzureTool, GenerateAzureStrictToolJsonSchema
|
|
34
|
-
from ._convert_common_call_params import convert_common_call_params
|
|
35
|
-
from ._convert_message_params import convert_message_params
|
|
36
|
-
from ._get_credential import get_credential
|
|
37
|
-
|
|
38
|
-
try:
|
|
39
|
-
from azure.ai.inference.models._models import (
|
|
40
|
-
ChatCompletionsResponseFormatJSON as FormatJSON,
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
json_object: ResponseFormatJSON | None = None
|
|
44
|
-
except ImportError: # pragma: no cover
|
|
45
|
-
# https://github.com/Azure/azure-sdk-for-python/commit/cf61ada8243d619ee6164bf1d32b3939b3c271e5#diff-0fb29d8cce6df3a014592ba8e9959409b8c471088381549807239324f5e8ddc4R15-R17
|
|
46
|
-
from azure.ai.inference.models._models import (
|
|
47
|
-
JsonSchemaFormat as FormatJSON, # pyright: ignore [reportAttributeAccessIssue]
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
json_object = "json_object" # pyright: ignore [reportAssignmentType]
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
@overload
|
|
54
|
-
def setup_call(
|
|
55
|
-
*,
|
|
56
|
-
model: str,
|
|
57
|
-
client: AsyncChatCompletionsClient | None,
|
|
58
|
-
fn: Callable[..., Awaitable[AsyncAzureDynamicConfig]],
|
|
59
|
-
fn_args: dict[str, Any],
|
|
60
|
-
dynamic_config: AsyncAzureDynamicConfig,
|
|
61
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
62
|
-
json_mode: bool,
|
|
63
|
-
call_params: AzureCallParams | CommonCallParams,
|
|
64
|
-
response_model: type[BaseModel] | None,
|
|
65
|
-
stream: bool | StreamConfig,
|
|
66
|
-
) -> tuple[
|
|
67
|
-
AsyncCreateFn[ChatCompletions, StreamingChatCompletionsUpdate],
|
|
68
|
-
str | None,
|
|
69
|
-
list[ChatRequestMessage],
|
|
70
|
-
list[type[AzureTool]] | None,
|
|
71
|
-
AzureCallKwargs,
|
|
72
|
-
]: ...
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
@overload
|
|
76
|
-
def setup_call(
|
|
77
|
-
*,
|
|
78
|
-
model: str,
|
|
79
|
-
client: ChatCompletionsClient | None,
|
|
80
|
-
fn: Callable[..., AzureDynamicConfig],
|
|
81
|
-
fn_args: dict[str, Any],
|
|
82
|
-
dynamic_config: AzureDynamicConfig,
|
|
83
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
84
|
-
json_mode: bool,
|
|
85
|
-
call_params: AzureCallParams | CommonCallParams,
|
|
86
|
-
response_model: type[BaseModel] | None,
|
|
87
|
-
stream: bool | StreamConfig,
|
|
88
|
-
) -> tuple[
|
|
89
|
-
CreateFn[ChatCompletions, StreamingChatCompletionsUpdate],
|
|
90
|
-
str | None,
|
|
91
|
-
list[ChatRequestMessage],
|
|
92
|
-
list[type[AzureTool]] | None,
|
|
93
|
-
AzureCallKwargs,
|
|
94
|
-
]: ...
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
def setup_call(
|
|
98
|
-
*,
|
|
99
|
-
model: str,
|
|
100
|
-
client: ChatCompletionsClient | AsyncChatCompletionsClient | None,
|
|
101
|
-
fn: Callable[..., AzureDynamicConfig]
|
|
102
|
-
| Callable[..., Awaitable[AzureDynamicConfig]],
|
|
103
|
-
fn_args: dict[str, Any],
|
|
104
|
-
dynamic_config: AzureDynamicConfig,
|
|
105
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
106
|
-
json_mode: bool,
|
|
107
|
-
call_params: AzureCallParams | CommonCallParams,
|
|
108
|
-
response_model: type[BaseModel] | None,
|
|
109
|
-
stream: bool | StreamConfig,
|
|
110
|
-
) -> tuple[
|
|
111
|
-
CreateFn[ChatCompletions, StreamingChatCompletionsUpdate]
|
|
112
|
-
| AsyncCreateFn[ChatCompletions, StreamingChatCompletionsUpdate],
|
|
113
|
-
str | None,
|
|
114
|
-
list[ChatRequestMessage],
|
|
115
|
-
list[type[AzureTool]] | None,
|
|
116
|
-
AzureCallKwargs,
|
|
117
|
-
]:
|
|
118
|
-
prompt_template, messages, tool_types, base_call_kwargs = _utils.setup_call(
|
|
119
|
-
fn,
|
|
120
|
-
fn_args,
|
|
121
|
-
dynamic_config,
|
|
122
|
-
tools,
|
|
123
|
-
AzureTool,
|
|
124
|
-
call_params,
|
|
125
|
-
convert_common_call_params,
|
|
126
|
-
)
|
|
127
|
-
call_kwargs = cast(AzureCallKwargs, base_call_kwargs)
|
|
128
|
-
messages = cast(list[BaseMessageParam | ChatRequestMessage], messages)
|
|
129
|
-
messages = convert_message_params(messages)
|
|
130
|
-
if json_mode:
|
|
131
|
-
if response_model and response_model.model_config.get("strict", False):
|
|
132
|
-
call_kwargs["response_format"] = FormatJSON(
|
|
133
|
-
{
|
|
134
|
-
"name": response_model.__name__,
|
|
135
|
-
"description": response_model.__doc__ or DEFAULT_TOOL_DOCSTRING,
|
|
136
|
-
"strict": True,
|
|
137
|
-
"schema": response_model.model_json_schema(
|
|
138
|
-
schema_generator=GenerateAzureStrictToolJsonSchema
|
|
139
|
-
),
|
|
140
|
-
}
|
|
141
|
-
)
|
|
142
|
-
else:
|
|
143
|
-
call_kwargs["response_format"] = json_object or FormatJSON()
|
|
144
|
-
json_mode_content = _utils.json_mode_content(response_model).strip()
|
|
145
|
-
messages.append(UserMessage(content=json_mode_content))
|
|
146
|
-
elif response_model:
|
|
147
|
-
assert tool_types, "At least one tool must be provided for extraction."
|
|
148
|
-
if tool_types and tool_types[0].model_config.get("strict", False):
|
|
149
|
-
warnings.warn(
|
|
150
|
-
"You must set `json_mode=True` to use `strict=True` response models. "
|
|
151
|
-
"Ignoring `strict` and using tools for extraction.",
|
|
152
|
-
UserWarning,
|
|
153
|
-
)
|
|
154
|
-
call_kwargs["tool_choice"] = "required"
|
|
155
|
-
call_kwargs |= {"model": model, "messages": messages}
|
|
156
|
-
|
|
157
|
-
if client is None:
|
|
158
|
-
endpoint = os.environ["AZURE_INFERENCE_ENDPOINT"]
|
|
159
|
-
credential = cast(AzureKeyCredential, get_credential())
|
|
160
|
-
|
|
161
|
-
client = (
|
|
162
|
-
AsyncChatCompletionsClient(endpoint=endpoint, credential=credential)
|
|
163
|
-
if inspect.iscoroutinefunction(fn)
|
|
164
|
-
else ChatCompletionsClient(endpoint=endpoint, credential=credential)
|
|
165
|
-
)
|
|
166
|
-
create = (
|
|
167
|
-
get_async_create_fn(
|
|
168
|
-
cast(
|
|
169
|
-
AsyncCreateFn[
|
|
170
|
-
ChatCompletions, AsyncIterable[StreamingChatCompletionsUpdate]
|
|
171
|
-
],
|
|
172
|
-
client.complete,
|
|
173
|
-
)
|
|
174
|
-
)
|
|
175
|
-
if isinstance(client, AsyncChatCompletionsClient)
|
|
176
|
-
else get_create_fn(
|
|
177
|
-
cast(
|
|
178
|
-
CreateFn[ChatCompletions, Iterable[StreamingChatCompletionsUpdate]],
|
|
179
|
-
client.complete,
|
|
180
|
-
)
|
|
181
|
-
)
|
|
182
|
-
)
|
|
183
|
-
return create, prompt_template, messages, tool_types, call_kwargs
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"""usage docs: learn/calls.md#provider-specific-parameters"""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from typing import Any, Literal, TypeAlias
|
|
6
|
-
|
|
7
|
-
from azure.ai.inference.models import (
|
|
8
|
-
ChatCompletionsNamedToolChoice,
|
|
9
|
-
ChatCompletionsToolChoicePreset,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
try:
|
|
13
|
-
from azure.ai.inference.models import (
|
|
14
|
-
ChatCompletionsResponseFormatJSON,
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
ResponseFormatJSON: TypeAlias = ChatCompletionsResponseFormatJSON # pyright: ignore [reportRedeclaration]
|
|
18
|
-
except ImportError: # pragma: no cover
|
|
19
|
-
from azure.ai.inference.models import (
|
|
20
|
-
JsonSchemaFormat, # pyright: ignore [reportAttributeAccessIssue]
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
ResponseFormatJSON: TypeAlias = JsonSchemaFormat | Literal["json_object"] # pyright: ignore [reportRedeclaration]
|
|
24
|
-
|
|
25
|
-
from typing_extensions import NotRequired
|
|
26
|
-
|
|
27
|
-
from ..base import BaseCallParams
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class AzureCallParams(BaseCallParams):
|
|
31
|
-
"""The parameters to use when calling the Azure API.
|
|
32
|
-
|
|
33
|
-
[Azure API Reference](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/ai/azure-ai-inference)
|
|
34
|
-
|
|
35
|
-
Attributes:
|
|
36
|
-
frequency_penalty: ...
|
|
37
|
-
max_tokens: ...
|
|
38
|
-
model_extras: ...
|
|
39
|
-
presence_penalty: ...
|
|
40
|
-
response_format: ...
|
|
41
|
-
seed: ...
|
|
42
|
-
stop: ...
|
|
43
|
-
temperature: ...
|
|
44
|
-
tool_choice: ...
|
|
45
|
-
top_p: ...
|
|
46
|
-
"""
|
|
47
|
-
|
|
48
|
-
frequency_penalty: NotRequired[float | None]
|
|
49
|
-
max_tokens: NotRequired[int | None]
|
|
50
|
-
model_extras: NotRequired[dict[str, Any] | None]
|
|
51
|
-
presence_penalty: NotRequired[float | None]
|
|
52
|
-
response_format: NotRequired[ResponseFormatJSON | None]
|
|
53
|
-
seed: NotRequired[int | None]
|
|
54
|
-
stop: NotRequired[list[str] | None]
|
|
55
|
-
temperature: NotRequired[float | None]
|
|
56
|
-
tool_choice: NotRequired[
|
|
57
|
-
str | ChatCompletionsToolChoicePreset | ChatCompletionsNamedToolChoice | None
|
|
58
|
-
]
|
|
59
|
-
top_p: NotRequired[float | None]
|