mirascope 1.25.7__py3-none-any.whl → 2.0.0a0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mirascope/__init__.py +3 -59
- mirascope/graphs/__init__.py +22 -0
- mirascope/{experimental/graphs → graphs}/finite_state_machine.py +70 -159
- mirascope/llm/__init__.py +206 -16
- mirascope/llm/agents/__init__.py +15 -0
- mirascope/llm/agents/agent.py +97 -0
- mirascope/llm/agents/agent_template.py +45 -0
- mirascope/llm/agents/decorator.py +176 -0
- mirascope/llm/calls/__init__.py +16 -0
- mirascope/llm/calls/base_call.py +33 -0
- mirascope/llm/calls/calls.py +315 -0
- mirascope/llm/calls/decorator.py +255 -0
- mirascope/llm/clients/__init__.py +34 -0
- mirascope/llm/clients/anthropic/__init__.py +11 -0
- mirascope/llm/clients/anthropic/_utils/__init__.py +13 -0
- mirascope/llm/clients/anthropic/_utils/decode.py +244 -0
- mirascope/llm/clients/anthropic/_utils/encode.py +243 -0
- mirascope/llm/clients/anthropic/clients.py +819 -0
- mirascope/llm/clients/anthropic/model_ids.py +8 -0
- mirascope/llm/clients/base/__init__.py +15 -0
- mirascope/llm/clients/base/_utils.py +192 -0
- mirascope/llm/clients/base/client.py +1256 -0
- mirascope/llm/clients/base/kwargs.py +12 -0
- mirascope/llm/clients/base/params.py +93 -0
- mirascope/llm/clients/google/__init__.py +6 -0
- mirascope/llm/clients/google/_utils/__init__.py +13 -0
- mirascope/llm/clients/google/_utils/decode.py +231 -0
- mirascope/llm/clients/google/_utils/encode.py +279 -0
- mirascope/llm/clients/google/clients.py +853 -0
- mirascope/llm/clients/google/message.py +7 -0
- mirascope/llm/clients/google/model_ids.py +15 -0
- mirascope/llm/clients/openai/__init__.py +25 -0
- mirascope/llm/clients/openai/completions/__init__.py +9 -0
- mirascope/llm/clients/openai/completions/_utils/__init__.py +13 -0
- mirascope/llm/clients/openai/completions/_utils/decode.py +187 -0
- mirascope/llm/clients/openai/completions/_utils/encode.py +358 -0
- mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
- mirascope/llm/clients/openai/completions/clients.py +833 -0
- mirascope/llm/clients/openai/completions/model_ids.py +8 -0
- mirascope/llm/clients/openai/responses/__init__.py +9 -0
- mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
- mirascope/llm/clients/openai/responses/_utils/decode.py +194 -0
- mirascope/llm/clients/openai/responses/_utils/encode.py +333 -0
- mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
- mirascope/llm/clients/openai/responses/clients.py +832 -0
- mirascope/llm/clients/openai/responses/model_ids.py +8 -0
- mirascope/llm/clients/openai/shared/__init__.py +7 -0
- mirascope/llm/clients/openai/shared/_utils.py +55 -0
- mirascope/llm/clients/providers.py +175 -0
- mirascope/llm/content/__init__.py +70 -0
- mirascope/llm/content/audio.py +173 -0
- mirascope/llm/content/document.py +94 -0
- mirascope/llm/content/image.py +206 -0
- mirascope/llm/content/text.py +47 -0
- mirascope/llm/content/thought.py +58 -0
- mirascope/llm/content/tool_call.py +63 -0
- mirascope/llm/content/tool_output.py +26 -0
- mirascope/llm/context/__init__.py +6 -0
- mirascope/llm/context/_utils.py +28 -0
- mirascope/llm/context/context.py +24 -0
- mirascope/llm/exceptions.py +105 -0
- mirascope/llm/formatting/__init__.py +22 -0
- mirascope/llm/formatting/_utils.py +74 -0
- mirascope/llm/formatting/format.py +104 -0
- mirascope/llm/formatting/from_call_args.py +30 -0
- mirascope/llm/formatting/partial.py +58 -0
- mirascope/llm/formatting/types.py +109 -0
- mirascope/llm/mcp/__init__.py +5 -0
- mirascope/llm/mcp/client.py +118 -0
- mirascope/llm/messages/__init__.py +32 -0
- mirascope/llm/messages/message.py +182 -0
- mirascope/llm/models/__init__.py +16 -0
- mirascope/llm/models/models.py +1243 -0
- mirascope/llm/prompts/__init__.py +33 -0
- mirascope/llm/prompts/_utils.py +60 -0
- mirascope/llm/prompts/decorator.py +286 -0
- mirascope/llm/prompts/protocols.py +99 -0
- mirascope/llm/responses/__init__.py +57 -0
- mirascope/llm/responses/_utils.py +56 -0
- mirascope/llm/responses/base_response.py +91 -0
- mirascope/llm/responses/base_stream_response.py +697 -0
- mirascope/llm/responses/finish_reason.py +27 -0
- mirascope/llm/responses/response.py +345 -0
- mirascope/llm/responses/root_response.py +177 -0
- mirascope/llm/responses/stream_response.py +572 -0
- mirascope/llm/responses/streams.py +363 -0
- mirascope/llm/tools/__init__.py +40 -0
- mirascope/llm/tools/_utils.py +25 -0
- mirascope/llm/tools/decorator.py +175 -0
- mirascope/llm/tools/protocols.py +96 -0
- mirascope/llm/tools/tool_schema.py +246 -0
- mirascope/llm/tools/toolkit.py +152 -0
- mirascope/llm/tools/tools.py +169 -0
- mirascope/llm/types/__init__.py +22 -0
- mirascope/llm/types/dataclass.py +9 -0
- mirascope/llm/types/jsonable.py +44 -0
- mirascope/llm/types/type_vars.py +19 -0
- mirascope-2.0.0a0.dist-info/METADATA +117 -0
- mirascope-2.0.0a0.dist-info/RECORD +101 -0
- mirascope/beta/__init__.py +0 -3
- mirascope/beta/openai/__init__.py +0 -17
- mirascope/beta/openai/realtime/__init__.py +0 -13
- mirascope/beta/openai/realtime/_utils/__init__.py +0 -3
- mirascope/beta/openai/realtime/_utils/_audio.py +0 -74
- mirascope/beta/openai/realtime/_utils/_protocols.py +0 -50
- mirascope/beta/openai/realtime/realtime.py +0 -500
- mirascope/beta/openai/realtime/recording.py +0 -98
- mirascope/beta/openai/realtime/tool.py +0 -113
- mirascope/beta/rag/__init__.py +0 -24
- mirascope/beta/rag/base/__init__.py +0 -22
- mirascope/beta/rag/base/chunkers/__init__.py +0 -2
- mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
- mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
- mirascope/beta/rag/base/config.py +0 -8
- mirascope/beta/rag/base/document.py +0 -11
- mirascope/beta/rag/base/embedders.py +0 -35
- mirascope/beta/rag/base/embedding_params.py +0 -18
- mirascope/beta/rag/base/embedding_response.py +0 -30
- mirascope/beta/rag/base/query_results.py +0 -7
- mirascope/beta/rag/base/vectorstore_params.py +0 -18
- mirascope/beta/rag/base/vectorstores.py +0 -37
- mirascope/beta/rag/chroma/__init__.py +0 -11
- mirascope/beta/rag/chroma/types.py +0 -62
- mirascope/beta/rag/chroma/vectorstores.py +0 -121
- mirascope/beta/rag/cohere/__init__.py +0 -11
- mirascope/beta/rag/cohere/embedders.py +0 -87
- mirascope/beta/rag/cohere/embedding_params.py +0 -29
- mirascope/beta/rag/cohere/embedding_response.py +0 -29
- mirascope/beta/rag/cohere/py.typed +0 -0
- mirascope/beta/rag/openai/__init__.py +0 -11
- mirascope/beta/rag/openai/embedders.py +0 -144
- mirascope/beta/rag/openai/embedding_params.py +0 -18
- mirascope/beta/rag/openai/embedding_response.py +0 -14
- mirascope/beta/rag/openai/py.typed +0 -0
- mirascope/beta/rag/pinecone/__init__.py +0 -19
- mirascope/beta/rag/pinecone/types.py +0 -143
- mirascope/beta/rag/pinecone/vectorstores.py +0 -148
- mirascope/beta/rag/weaviate/__init__.py +0 -6
- mirascope/beta/rag/weaviate/types.py +0 -92
- mirascope/beta/rag/weaviate/vectorstores.py +0 -103
- mirascope/core/__init__.py +0 -109
- mirascope/core/anthropic/__init__.py +0 -31
- mirascope/core/anthropic/_call.py +0 -67
- mirascope/core/anthropic/_call_kwargs.py +0 -13
- mirascope/core/anthropic/_thinking.py +0 -70
- mirascope/core/anthropic/_utils/__init__.py +0 -16
- mirascope/core/anthropic/_utils/_convert_common_call_params.py +0 -25
- mirascope/core/anthropic/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/anthropic/_utils/_convert_message_params.py +0 -102
- mirascope/core/anthropic/_utils/_get_json_output.py +0 -31
- mirascope/core/anthropic/_utils/_handle_stream.py +0 -113
- mirascope/core/anthropic/_utils/_message_param_converter.py +0 -154
- mirascope/core/anthropic/_utils/_setup_call.py +0 -146
- mirascope/core/anthropic/call_params.py +0 -44
- mirascope/core/anthropic/call_response.py +0 -226
- mirascope/core/anthropic/call_response_chunk.py +0 -152
- mirascope/core/anthropic/dynamic_config.py +0 -40
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -204
- mirascope/core/anthropic/tool.py +0 -101
- mirascope/core/azure/__init__.py +0 -31
- mirascope/core/azure/_call.py +0 -67
- mirascope/core/azure/_call_kwargs.py +0 -13
- mirascope/core/azure/_utils/__init__.py +0 -14
- mirascope/core/azure/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/azure/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/azure/_utils/_convert_message_params.py +0 -121
- mirascope/core/azure/_utils/_get_credential.py +0 -33
- mirascope/core/azure/_utils/_get_json_output.py +0 -27
- mirascope/core/azure/_utils/_handle_stream.py +0 -130
- mirascope/core/azure/_utils/_message_param_converter.py +0 -117
- mirascope/core/azure/_utils/_setup_call.py +0 -183
- mirascope/core/azure/call_params.py +0 -59
- mirascope/core/azure/call_response.py +0 -215
- mirascope/core/azure/call_response_chunk.py +0 -105
- mirascope/core/azure/dynamic_config.py +0 -30
- mirascope/core/azure/py.typed +0 -0
- mirascope/core/azure/stream.py +0 -147
- mirascope/core/azure/tool.py +0 -93
- mirascope/core/base/__init__.py +0 -86
- mirascope/core/base/_call_factory.py +0 -256
- mirascope/core/base/_create.py +0 -253
- mirascope/core/base/_extract.py +0 -175
- mirascope/core/base/_extract_with_tools.py +0 -189
- mirascope/core/base/_partial.py +0 -95
- mirascope/core/base/_utils/__init__.py +0 -92
- mirascope/core/base/_utils/_base_message_param_converter.py +0 -22
- mirascope/core/base/_utils/_base_type.py +0 -26
- mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -48
- mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
- mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -139
- mirascope/core/base/_utils/_convert_messages_to_message_params.py +0 -178
- mirascope/core/base/_utils/_convert_provider_finish_reason_to_finish_reason.py +0 -20
- mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
- mirascope/core/base/_utils/_extract_tool_return.py +0 -42
- mirascope/core/base/_utils/_fn_is_async.py +0 -24
- mirascope/core/base/_utils/_format_template.py +0 -32
- mirascope/core/base/_utils/_get_audio_type.py +0 -18
- mirascope/core/base/_utils/_get_common_usage.py +0 -20
- mirascope/core/base/_utils/_get_create_fn_or_async_create_fn.py +0 -137
- mirascope/core/base/_utils/_get_document_type.py +0 -7
- mirascope/core/base/_utils/_get_dynamic_configuration.py +0 -69
- mirascope/core/base/_utils/_get_fields_from_call_args.py +0 -34
- mirascope/core/base/_utils/_get_fn_args.py +0 -23
- mirascope/core/base/_utils/_get_image_dimensions.py +0 -39
- mirascope/core/base/_utils/_get_image_type.py +0 -26
- mirascope/core/base/_utils/_get_metadata.py +0 -17
- mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
- mirascope/core/base/_utils/_get_prompt_template.py +0 -28
- mirascope/core/base/_utils/_get_template_values.py +0 -51
- mirascope/core/base/_utils/_get_template_variables.py +0 -38
- mirascope/core/base/_utils/_get_unsupported_tool_config_keys.py +0 -10
- mirascope/core/base/_utils/_is_prompt_template.py +0 -24
- mirascope/core/base/_utils/_json_mode_content.py +0 -17
- mirascope/core/base/_utils/_messages_decorator.py +0 -121
- mirascope/core/base/_utils/_parse_content_template.py +0 -323
- mirascope/core/base/_utils/_parse_prompt_messages.py +0 -63
- mirascope/core/base/_utils/_pil_image_to_bytes.py +0 -13
- mirascope/core/base/_utils/_protocols.py +0 -901
- mirascope/core/base/_utils/_setup_call.py +0 -79
- mirascope/core/base/_utils/_setup_extract_tool.py +0 -30
- mirascope/core/base/call_kwargs.py +0 -13
- mirascope/core/base/call_params.py +0 -36
- mirascope/core/base/call_response.py +0 -338
- mirascope/core/base/call_response_chunk.py +0 -130
- mirascope/core/base/dynamic_config.py +0 -82
- mirascope/core/base/from_call_args.py +0 -30
- mirascope/core/base/merge_decorators.py +0 -59
- mirascope/core/base/message_param.py +0 -175
- mirascope/core/base/messages.py +0 -116
- mirascope/core/base/metadata.py +0 -13
- mirascope/core/base/prompt.py +0 -497
- mirascope/core/base/response_model_config_dict.py +0 -9
- mirascope/core/base/stream.py +0 -479
- mirascope/core/base/stream_config.py +0 -11
- mirascope/core/base/structured_stream.py +0 -296
- mirascope/core/base/tool.py +0 -214
- mirascope/core/base/toolkit.py +0 -176
- mirascope/core/base/types.py +0 -344
- mirascope/core/bedrock/__init__.py +0 -34
- mirascope/core/bedrock/_call.py +0 -68
- mirascope/core/bedrock/_call_kwargs.py +0 -12
- mirascope/core/bedrock/_types.py +0 -104
- mirascope/core/bedrock/_utils/__init__.py +0 -14
- mirascope/core/bedrock/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/bedrock/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/bedrock/_utils/_convert_message_params.py +0 -111
- mirascope/core/bedrock/_utils/_get_json_output.py +0 -30
- mirascope/core/bedrock/_utils/_handle_stream.py +0 -104
- mirascope/core/bedrock/_utils/_message_param_converter.py +0 -172
- mirascope/core/bedrock/_utils/_setup_call.py +0 -258
- mirascope/core/bedrock/call_params.py +0 -38
- mirascope/core/bedrock/call_response.py +0 -248
- mirascope/core/bedrock/call_response_chunk.py +0 -111
- mirascope/core/bedrock/dynamic_config.py +0 -37
- mirascope/core/bedrock/py.typed +0 -0
- mirascope/core/bedrock/stream.py +0 -154
- mirascope/core/bedrock/tool.py +0 -100
- mirascope/core/cohere/__init__.py +0 -30
- mirascope/core/cohere/_call.py +0 -67
- mirascope/core/cohere/_call_kwargs.py +0 -11
- mirascope/core/cohere/_types.py +0 -20
- mirascope/core/cohere/_utils/__init__.py +0 -14
- mirascope/core/cohere/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/cohere/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -24
- mirascope/core/cohere/_utils/_convert_message_params.py +0 -32
- mirascope/core/cohere/_utils/_get_json_output.py +0 -30
- mirascope/core/cohere/_utils/_handle_stream.py +0 -35
- mirascope/core/cohere/_utils/_message_param_converter.py +0 -54
- mirascope/core/cohere/_utils/_setup_call.py +0 -150
- mirascope/core/cohere/call_params.py +0 -62
- mirascope/core/cohere/call_response.py +0 -205
- mirascope/core/cohere/call_response_chunk.py +0 -125
- mirascope/core/cohere/dynamic_config.py +0 -32
- mirascope/core/cohere/py.typed +0 -0
- mirascope/core/cohere/stream.py +0 -113
- mirascope/core/cohere/tool.py +0 -93
- mirascope/core/costs/__init__.py +0 -5
- mirascope/core/costs/_anthropic_calculate_cost.py +0 -219
- mirascope/core/costs/_azure_calculate_cost.py +0 -11
- mirascope/core/costs/_bedrock_calculate_cost.py +0 -15
- mirascope/core/costs/_cohere_calculate_cost.py +0 -44
- mirascope/core/costs/_gemini_calculate_cost.py +0 -67
- mirascope/core/costs/_google_calculate_cost.py +0 -427
- mirascope/core/costs/_groq_calculate_cost.py +0 -156
- mirascope/core/costs/_litellm_calculate_cost.py +0 -11
- mirascope/core/costs/_mistral_calculate_cost.py +0 -64
- mirascope/core/costs/_openai_calculate_cost.py +0 -416
- mirascope/core/costs/_vertex_calculate_cost.py +0 -67
- mirascope/core/costs/_xai_calculate_cost.py +0 -104
- mirascope/core/costs/calculate_cost.py +0 -86
- mirascope/core/gemini/__init__.py +0 -40
- mirascope/core/gemini/_call.py +0 -67
- mirascope/core/gemini/_call_kwargs.py +0 -12
- mirascope/core/gemini/_utils/__init__.py +0 -14
- mirascope/core/gemini/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/gemini/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/gemini/_utils/_convert_message_params.py +0 -156
- mirascope/core/gemini/_utils/_get_json_output.py +0 -35
- mirascope/core/gemini/_utils/_handle_stream.py +0 -33
- mirascope/core/gemini/_utils/_message_param_converter.py +0 -209
- mirascope/core/gemini/_utils/_setup_call.py +0 -149
- mirascope/core/gemini/call_params.py +0 -52
- mirascope/core/gemini/call_response.py +0 -216
- mirascope/core/gemini/call_response_chunk.py +0 -100
- mirascope/core/gemini/dynamic_config.py +0 -26
- mirascope/core/gemini/stream.py +0 -120
- mirascope/core/gemini/tool.py +0 -104
- mirascope/core/google/__init__.py +0 -29
- mirascope/core/google/_call.py +0 -67
- mirascope/core/google/_call_kwargs.py +0 -13
- mirascope/core/google/_utils/__init__.py +0 -14
- mirascope/core/google/_utils/_convert_common_call_params.py +0 -38
- mirascope/core/google/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -27
- mirascope/core/google/_utils/_convert_message_params.py +0 -297
- mirascope/core/google/_utils/_get_json_output.py +0 -37
- mirascope/core/google/_utils/_handle_stream.py +0 -58
- mirascope/core/google/_utils/_message_param_converter.py +0 -200
- mirascope/core/google/_utils/_setup_call.py +0 -201
- mirascope/core/google/_utils/_validate_media_type.py +0 -58
- mirascope/core/google/call_params.py +0 -22
- mirascope/core/google/call_response.py +0 -255
- mirascope/core/google/call_response_chunk.py +0 -135
- mirascope/core/google/dynamic_config.py +0 -26
- mirascope/core/google/stream.py +0 -199
- mirascope/core/google/tool.py +0 -146
- mirascope/core/groq/__init__.py +0 -30
- mirascope/core/groq/_call.py +0 -67
- mirascope/core/groq/_call_kwargs.py +0 -13
- mirascope/core/groq/_utils/__init__.py +0 -14
- mirascope/core/groq/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/groq/_utils/_convert_message_params.py +0 -112
- mirascope/core/groq/_utils/_get_json_output.py +0 -27
- mirascope/core/groq/_utils/_handle_stream.py +0 -123
- mirascope/core/groq/_utils/_message_param_converter.py +0 -89
- mirascope/core/groq/_utils/_setup_call.py +0 -132
- mirascope/core/groq/call_params.py +0 -52
- mirascope/core/groq/call_response.py +0 -213
- mirascope/core/groq/call_response_chunk.py +0 -104
- mirascope/core/groq/dynamic_config.py +0 -29
- mirascope/core/groq/py.typed +0 -0
- mirascope/core/groq/stream.py +0 -135
- mirascope/core/groq/tool.py +0 -80
- mirascope/core/litellm/__init__.py +0 -28
- mirascope/core/litellm/_call.py +0 -67
- mirascope/core/litellm/_utils/__init__.py +0 -5
- mirascope/core/litellm/_utils/_setup_call.py +0 -109
- mirascope/core/litellm/call_params.py +0 -10
- mirascope/core/litellm/call_response.py +0 -24
- mirascope/core/litellm/call_response_chunk.py +0 -14
- mirascope/core/litellm/dynamic_config.py +0 -8
- mirascope/core/litellm/py.typed +0 -0
- mirascope/core/litellm/stream.py +0 -86
- mirascope/core/litellm/tool.py +0 -13
- mirascope/core/mistral/__init__.py +0 -36
- mirascope/core/mistral/_call.py +0 -65
- mirascope/core/mistral/_call_kwargs.py +0 -19
- mirascope/core/mistral/_utils/__init__.py +0 -14
- mirascope/core/mistral/_utils/_convert_common_call_params.py +0 -24
- mirascope/core/mistral/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -22
- mirascope/core/mistral/_utils/_convert_message_params.py +0 -122
- mirascope/core/mistral/_utils/_get_json_output.py +0 -34
- mirascope/core/mistral/_utils/_handle_stream.py +0 -139
- mirascope/core/mistral/_utils/_message_param_converter.py +0 -176
- mirascope/core/mistral/_utils/_setup_call.py +0 -164
- mirascope/core/mistral/call_params.py +0 -36
- mirascope/core/mistral/call_response.py +0 -205
- mirascope/core/mistral/call_response_chunk.py +0 -105
- mirascope/core/mistral/dynamic_config.py +0 -33
- mirascope/core/mistral/py.typed +0 -0
- mirascope/core/mistral/stream.py +0 -120
- mirascope/core/mistral/tool.py +0 -81
- mirascope/core/openai/__init__.py +0 -31
- mirascope/core/openai/_call.py +0 -67
- mirascope/core/openai/_call_kwargs.py +0 -13
- mirascope/core/openai/_utils/__init__.py +0 -14
- mirascope/core/openai/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/openai/_utils/_convert_message_params.py +0 -148
- mirascope/core/openai/_utils/_get_json_output.py +0 -31
- mirascope/core/openai/_utils/_handle_stream.py +0 -138
- mirascope/core/openai/_utils/_message_param_converter.py +0 -105
- mirascope/core/openai/_utils/_setup_call.py +0 -155
- mirascope/core/openai/call_params.py +0 -92
- mirascope/core/openai/call_response.py +0 -273
- mirascope/core/openai/call_response_chunk.py +0 -139
- mirascope/core/openai/dynamic_config.py +0 -34
- mirascope/core/openai/py.typed +0 -0
- mirascope/core/openai/stream.py +0 -185
- mirascope/core/openai/tool.py +0 -101
- mirascope/core/py.typed +0 -0
- mirascope/core/vertex/__init__.py +0 -45
- mirascope/core/vertex/_call.py +0 -62
- mirascope/core/vertex/_call_kwargs.py +0 -12
- mirascope/core/vertex/_utils/__init__.py +0 -14
- mirascope/core/vertex/_utils/_convert_common_call_params.py +0 -37
- mirascope/core/vertex/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/vertex/_utils/_convert_message_params.py +0 -171
- mirascope/core/vertex/_utils/_get_json_output.py +0 -36
- mirascope/core/vertex/_utils/_handle_stream.py +0 -33
- mirascope/core/vertex/_utils/_message_param_converter.py +0 -133
- mirascope/core/vertex/_utils/_setup_call.py +0 -160
- mirascope/core/vertex/call_params.py +0 -24
- mirascope/core/vertex/call_response.py +0 -206
- mirascope/core/vertex/call_response_chunk.py +0 -99
- mirascope/core/vertex/dynamic_config.py +0 -28
- mirascope/core/vertex/stream.py +0 -119
- mirascope/core/vertex/tool.py +0 -101
- mirascope/core/xai/__init__.py +0 -28
- mirascope/core/xai/_call.py +0 -67
- mirascope/core/xai/_utils/__init__.py +0 -5
- mirascope/core/xai/_utils/_setup_call.py +0 -113
- mirascope/core/xai/call_params.py +0 -10
- mirascope/core/xai/call_response.py +0 -16
- mirascope/core/xai/call_response_chunk.py +0 -14
- mirascope/core/xai/dynamic_config.py +0 -8
- mirascope/core/xai/py.typed +0 -0
- mirascope/core/xai/stream.py +0 -57
- mirascope/core/xai/tool.py +0 -13
- mirascope/experimental/graphs/__init__.py +0 -5
- mirascope/integrations/__init__.py +0 -16
- mirascope/integrations/_middleware_factory.py +0 -403
- mirascope/integrations/langfuse/__init__.py +0 -3
- mirascope/integrations/langfuse/_utils.py +0 -114
- mirascope/integrations/langfuse/_with_langfuse.py +0 -70
- mirascope/integrations/logfire/__init__.py +0 -3
- mirascope/integrations/logfire/_utils.py +0 -225
- mirascope/integrations/logfire/_with_logfire.py +0 -63
- mirascope/integrations/otel/__init__.py +0 -10
- mirascope/integrations/otel/_utils.py +0 -270
- mirascope/integrations/otel/_with_hyperdx.py +0 -60
- mirascope/integrations/otel/_with_otel.py +0 -59
- mirascope/integrations/tenacity.py +0 -14
- mirascope/llm/_call.py +0 -401
- mirascope/llm/_context.py +0 -384
- mirascope/llm/_override.py +0 -3639
- mirascope/llm/_protocols.py +0 -500
- mirascope/llm/_response_metaclass.py +0 -31
- mirascope/llm/call_response.py +0 -158
- mirascope/llm/call_response_chunk.py +0 -66
- mirascope/llm/stream.py +0 -162
- mirascope/llm/tool.py +0 -64
- mirascope/mcp/__init__.py +0 -7
- mirascope/mcp/_utils.py +0 -288
- mirascope/mcp/client.py +0 -167
- mirascope/mcp/server.py +0 -356
- mirascope/mcp/tools.py +0 -110
- mirascope/py.typed +0 -0
- mirascope/retries/__init__.py +0 -11
- mirascope/retries/fallback.py +0 -131
- mirascope/retries/tenacity.py +0 -50
- mirascope/tools/__init__.py +0 -37
- mirascope/tools/base.py +0 -98
- mirascope/tools/system/__init__.py +0 -0
- mirascope/tools/system/_docker_operation.py +0 -166
- mirascope/tools/system/_file_system.py +0 -267
- mirascope/tools/web/__init__.py +0 -0
- mirascope/tools/web/_duckduckgo.py +0 -111
- mirascope/tools/web/_httpx.py +0 -125
- mirascope/tools/web/_parse_url_content.py +0 -94
- mirascope/tools/web/_requests.py +0 -54
- mirascope/v0/__init__.py +0 -43
- mirascope/v0/anthropic.py +0 -54
- mirascope/v0/base/__init__.py +0 -12
- mirascope/v0/base/calls.py +0 -118
- mirascope/v0/base/extractors.py +0 -122
- mirascope/v0/base/ops_utils.py +0 -207
- mirascope/v0/base/prompts.py +0 -48
- mirascope/v0/base/types.py +0 -14
- mirascope/v0/base/utils.py +0 -21
- mirascope/v0/openai.py +0 -54
- mirascope-1.25.7.dist-info/METADATA +0 -169
- mirascope-1.25.7.dist-info/RECORD +0 -378
- {mirascope-1.25.7.dist-info → mirascope-2.0.0a0.dist-info}/WHEEL +0 -0
- {mirascope-1.25.7.dist-info → mirascope-2.0.0a0.dist-info}/licenses/LICENSE +0 -0
mirascope/core/openai/stream.py
DELETED
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
"""The `OpenAIStream` class for convenience around streaming LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from collections.abc import AsyncGenerator, Generator
|
|
7
|
-
|
|
8
|
-
from openai.types.chat import (
|
|
9
|
-
ChatCompletion,
|
|
10
|
-
ChatCompletionAssistantMessageParam,
|
|
11
|
-
ChatCompletionMessage,
|
|
12
|
-
ChatCompletionMessageParam,
|
|
13
|
-
ChatCompletionMessageToolCall,
|
|
14
|
-
ChatCompletionMessageToolCallParam,
|
|
15
|
-
ChatCompletionToolMessageParam,
|
|
16
|
-
ChatCompletionToolParam,
|
|
17
|
-
ChatCompletionUserMessageParam,
|
|
18
|
-
)
|
|
19
|
-
from openai.types.chat.chat_completion import Choice
|
|
20
|
-
from openai.types.chat.chat_completion_message_tool_call_param import Function
|
|
21
|
-
from openai.types.completion_usage import CompletionUsage
|
|
22
|
-
|
|
23
|
-
from ..base.stream import BaseStream
|
|
24
|
-
from ..base.types import CostMetadata
|
|
25
|
-
from .call_params import OpenAICallParams
|
|
26
|
-
from .call_response import OpenAICallResponse
|
|
27
|
-
from .call_response_chunk import OpenAICallResponseChunk
|
|
28
|
-
from .dynamic_config import OpenAIDynamicConfig
|
|
29
|
-
from .tool import OpenAITool
|
|
30
|
-
|
|
31
|
-
FinishReason = Choice.__annotations__["finish_reason"]
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class OpenAIStream(
|
|
35
|
-
BaseStream[
|
|
36
|
-
OpenAICallResponse,
|
|
37
|
-
OpenAICallResponseChunk,
|
|
38
|
-
ChatCompletionUserMessageParam,
|
|
39
|
-
ChatCompletionAssistantMessageParam,
|
|
40
|
-
ChatCompletionToolMessageParam,
|
|
41
|
-
ChatCompletionMessageParam,
|
|
42
|
-
OpenAITool,
|
|
43
|
-
ChatCompletionToolParam,
|
|
44
|
-
OpenAIDynamicConfig,
|
|
45
|
-
OpenAICallParams,
|
|
46
|
-
FinishReason,
|
|
47
|
-
]
|
|
48
|
-
):
|
|
49
|
-
"""A class for convenience around streaming OpenAI LLM calls.
|
|
50
|
-
|
|
51
|
-
Example:
|
|
52
|
-
|
|
53
|
-
```python
|
|
54
|
-
from mirascope.core import prompt_template
|
|
55
|
-
from mirascope.core.openai import openai_call
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
@openai_call("gpt-4o-mini", stream=True)
|
|
59
|
-
def recommend_book(genre: str) -> str:
|
|
60
|
-
return f"Recommend a {genre} book"
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
stream = recommend_book("fantasy") # returns `OpenAIStream` instance
|
|
64
|
-
for chunk, _ in stream:
|
|
65
|
-
print(chunk.content, end="", flush=True)
|
|
66
|
-
```
|
|
67
|
-
"""
|
|
68
|
-
|
|
69
|
-
audio_id: str | None = None
|
|
70
|
-
|
|
71
|
-
_provider = "openai"
|
|
72
|
-
|
|
73
|
-
def __iter__(
|
|
74
|
-
self,
|
|
75
|
-
) -> Generator[tuple[OpenAICallResponseChunk, OpenAITool | None], None, None]:
|
|
76
|
-
for chunk, tool in super().__iter__():
|
|
77
|
-
if (
|
|
78
|
-
(choices := chunk.chunk.choices)
|
|
79
|
-
and (audio := getattr(choices[0].delta, "audio", None))
|
|
80
|
-
and (audio_id := audio.get("id"))
|
|
81
|
-
):
|
|
82
|
-
self.audio_id = audio_id
|
|
83
|
-
yield chunk, tool
|
|
84
|
-
|
|
85
|
-
def __aiter__(
|
|
86
|
-
self,
|
|
87
|
-
) -> AsyncGenerator[tuple[OpenAICallResponseChunk, OpenAITool | None], None]:
|
|
88
|
-
aiter = super().__aiter__()
|
|
89
|
-
|
|
90
|
-
async def generator() -> AsyncGenerator[
|
|
91
|
-
tuple[OpenAICallResponseChunk, OpenAITool | None], None
|
|
92
|
-
]:
|
|
93
|
-
async for chunk, tool in aiter:
|
|
94
|
-
if (
|
|
95
|
-
(choices := chunk.chunk.choices)
|
|
96
|
-
and (audio := getattr(choices[0].delta, "audio", None))
|
|
97
|
-
and (audio_id := audio.get("id"))
|
|
98
|
-
):
|
|
99
|
-
self.audio_id = audio_id
|
|
100
|
-
yield chunk, tool
|
|
101
|
-
|
|
102
|
-
return generator()
|
|
103
|
-
|
|
104
|
-
def _construct_message_param(
|
|
105
|
-
self,
|
|
106
|
-
tool_calls: list[ChatCompletionMessageToolCall] | None = None,
|
|
107
|
-
content: str | None = None,
|
|
108
|
-
) -> ChatCompletionAssistantMessageParam:
|
|
109
|
-
"""Constructs the message parameter for the assistant."""
|
|
110
|
-
message_param = ChatCompletionAssistantMessageParam(
|
|
111
|
-
role="assistant", content=content
|
|
112
|
-
)
|
|
113
|
-
if tool_calls:
|
|
114
|
-
message_param["tool_calls"] = [
|
|
115
|
-
ChatCompletionMessageToolCallParam(
|
|
116
|
-
type="function",
|
|
117
|
-
function=Function(
|
|
118
|
-
arguments=tool_call.function.arguments,
|
|
119
|
-
name=tool_call.function.name,
|
|
120
|
-
),
|
|
121
|
-
id=tool_call.id,
|
|
122
|
-
)
|
|
123
|
-
for tool_call in tool_calls
|
|
124
|
-
]
|
|
125
|
-
if self.audio_id:
|
|
126
|
-
message_param["audio"] = {"id": self.audio_id}
|
|
127
|
-
return message_param
|
|
128
|
-
|
|
129
|
-
def construct_call_response(self) -> OpenAICallResponse:
|
|
130
|
-
"""Constructs the call response from a consumed OpenAIStream.
|
|
131
|
-
|
|
132
|
-
Raises:
|
|
133
|
-
ValueError: if the stream has not yet been consumed.
|
|
134
|
-
"""
|
|
135
|
-
if not hasattr(self, "message_param"):
|
|
136
|
-
raise ValueError(
|
|
137
|
-
"No stream response, check if the stream has been consumed."
|
|
138
|
-
)
|
|
139
|
-
message = {
|
|
140
|
-
"role": self.message_param["role"],
|
|
141
|
-
"content": self.message_param.get("content", ""),
|
|
142
|
-
"tool_calls": self.message_param.get("tool_calls", []),
|
|
143
|
-
}
|
|
144
|
-
if not self.input_tokens and not self.output_tokens:
|
|
145
|
-
usage = None
|
|
146
|
-
else:
|
|
147
|
-
usage = CompletionUsage(
|
|
148
|
-
prompt_tokens=int(self.input_tokens or 0),
|
|
149
|
-
completion_tokens=int(self.output_tokens or 0),
|
|
150
|
-
total_tokens=int(self.input_tokens or 0) + int(self.output_tokens or 0),
|
|
151
|
-
)
|
|
152
|
-
completion = ChatCompletion(
|
|
153
|
-
id=self.id if self.id else "",
|
|
154
|
-
model=self.model,
|
|
155
|
-
choices=[
|
|
156
|
-
Choice(
|
|
157
|
-
finish_reason=self.finish_reasons[0]
|
|
158
|
-
if self.finish_reasons
|
|
159
|
-
else "stop",
|
|
160
|
-
index=0,
|
|
161
|
-
message=ChatCompletionMessage.model_validate(message),
|
|
162
|
-
)
|
|
163
|
-
],
|
|
164
|
-
created=0,
|
|
165
|
-
object="chat.completion",
|
|
166
|
-
usage=usage,
|
|
167
|
-
)
|
|
168
|
-
return OpenAICallResponse(
|
|
169
|
-
metadata=self.metadata,
|
|
170
|
-
response=completion,
|
|
171
|
-
tool_types=self.tool_types,
|
|
172
|
-
prompt_template=self.prompt_template,
|
|
173
|
-
fn_args=self.fn_args if self.fn_args else {},
|
|
174
|
-
dynamic_config=self.dynamic_config,
|
|
175
|
-
messages=self.messages,
|
|
176
|
-
call_params=self.call_params,
|
|
177
|
-
call_kwargs=self.call_kwargs,
|
|
178
|
-
user_message_param=self.user_message_param,
|
|
179
|
-
start_time=self.start_time,
|
|
180
|
-
end_time=self.end_time,
|
|
181
|
-
)
|
|
182
|
-
|
|
183
|
-
@property
|
|
184
|
-
def cost_metadata(self) -> CostMetadata:
|
|
185
|
-
return super().cost_metadata
|
mirascope/core/openai/tool.py
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
"""The `OpenAITool` class for easy tool usage with OpenAI LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/tools.md
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
from openai.types.chat import (
|
|
9
|
-
ChatCompletionMessageToolCall,
|
|
10
|
-
ChatCompletionToolParam,
|
|
11
|
-
)
|
|
12
|
-
from openai.types.shared_params import FunctionDefinition
|
|
13
|
-
from pydantic.json_schema import SkipJsonSchema
|
|
14
|
-
|
|
15
|
-
from ..base import BaseTool, GenerateJsonSchemaNoTitles, ToolConfig
|
|
16
|
-
from ..base._partial import partial
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class GenerateOpenAIStrictToolJsonSchema(GenerateJsonSchemaNoTitles):
|
|
20
|
-
_openai_strict = True
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class OpenAIToolConfig(ToolConfig, total=False):
|
|
24
|
-
"""A tool configuration for OpenAI-specific features."""
|
|
25
|
-
|
|
26
|
-
strict: bool
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class OpenAITool(BaseTool):
|
|
30
|
-
"""A class for defining tools for OpenAI LLM calls.
|
|
31
|
-
|
|
32
|
-
Example:
|
|
33
|
-
|
|
34
|
-
```python
|
|
35
|
-
from mirascope.core import prompt_template
|
|
36
|
-
from mirascope.core.openai import openai_call
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def format_book(title: str, author: str) -> str:
|
|
40
|
-
return f"{title} by {author}"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
@openai_call("gpt-4o-mini", tools=[format_book])
|
|
44
|
-
def recommend_book(genre: str) -> str:
|
|
45
|
-
return f"Recommend a {genre} book"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
response = recommend_book("fantasy")
|
|
49
|
-
if tool := response.tool: # returns an `OpenAITool` instance
|
|
50
|
-
print(tool.call())
|
|
51
|
-
```
|
|
52
|
-
"""
|
|
53
|
-
|
|
54
|
-
__provider__ = "openai"
|
|
55
|
-
__tool_config_type__ = OpenAIToolConfig
|
|
56
|
-
|
|
57
|
-
tool_call: SkipJsonSchema[ChatCompletionMessageToolCall]
|
|
58
|
-
|
|
59
|
-
@classmethod
|
|
60
|
-
def tool_schema(cls) -> ChatCompletionToolParam:
|
|
61
|
-
"""Constructs a JSON Schema tool schema from the `BaseModel` schema defined.
|
|
62
|
-
|
|
63
|
-
Example:
|
|
64
|
-
```python
|
|
65
|
-
from mirascope.core.openai import OpenAITool
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
def format_book(title: str, author: str) -> str:
|
|
69
|
-
return f"{title} by {author}"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
tool_type = OpenAITool.type_from_fn(format_book)
|
|
73
|
-
print(tool_type.tool_schema()) # prints the OpenAI-specific tool schema
|
|
74
|
-
```
|
|
75
|
-
"""
|
|
76
|
-
fn = FunctionDefinition(name=cls._name(), description=cls._description())
|
|
77
|
-
schema_generator = GenerateJsonSchemaNoTitles
|
|
78
|
-
if cls.tool_config.get("strict", False):
|
|
79
|
-
fn["strict"] = True
|
|
80
|
-
schema_generator = GenerateOpenAIStrictToolJsonSchema
|
|
81
|
-
model_schema = cls.model_json_schema(schema_generator=schema_generator)
|
|
82
|
-
if model_schema["properties"]:
|
|
83
|
-
fn["parameters"] = model_schema
|
|
84
|
-
return ChatCompletionToolParam(function=fn, type="function")
|
|
85
|
-
|
|
86
|
-
@classmethod
|
|
87
|
-
def from_tool_call(
|
|
88
|
-
cls, tool_call: ChatCompletionMessageToolCall, allow_partial: bool = False
|
|
89
|
-
) -> OpenAITool:
|
|
90
|
-
"""Constructs an `OpenAITool` instance from a `tool_call`.
|
|
91
|
-
|
|
92
|
-
Args:
|
|
93
|
-
tool_call: The OpenAI tool call from which to construct this tool instance.
|
|
94
|
-
allow_partial: Whether to allow partial JSON data.
|
|
95
|
-
"""
|
|
96
|
-
model_json = {"tool_call": tool_call.model_dump()}
|
|
97
|
-
if args := tool_call.function.arguments:
|
|
98
|
-
model_json |= cls._dict_from_json(args, allow_partial)
|
|
99
|
-
if allow_partial:
|
|
100
|
-
return partial(cls, {"tool_call", "delta"}).model_validate(model_json)
|
|
101
|
-
return cls.model_validate(model_json)
|
mirascope/core/py.typed
DELETED
|
File without changes
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"""The Mirascope Vertex Module."""
|
|
2
|
-
|
|
3
|
-
import inspect
|
|
4
|
-
import warnings
|
|
5
|
-
from typing import TypeAlias
|
|
6
|
-
|
|
7
|
-
from google.cloud.aiplatform_v1beta1.types import FunctionResponse
|
|
8
|
-
from vertexai.generative_models import Content
|
|
9
|
-
|
|
10
|
-
from ..base import BaseMessageParam
|
|
11
|
-
from ._call import vertex_call
|
|
12
|
-
from ._call import vertex_call as call
|
|
13
|
-
from .call_params import VertexCallParams
|
|
14
|
-
from .call_response import VertexCallResponse
|
|
15
|
-
from .call_response_chunk import VertexCallResponseChunk
|
|
16
|
-
from .dynamic_config import VertexDynamicConfig
|
|
17
|
-
from .stream import VertexStream
|
|
18
|
-
from .tool import VertexTool
|
|
19
|
-
|
|
20
|
-
VertexMessageParam: TypeAlias = Content | FunctionResponse | BaseMessageParam
|
|
21
|
-
|
|
22
|
-
warnings.warn(
|
|
23
|
-
inspect.cleandoc("""
|
|
24
|
-
The `mirascope.core.gemini` module is deprecated and will be removed in a future release.
|
|
25
|
-
Please use the `mirascope.core.google` module instead.
|
|
26
|
-
|
|
27
|
-
You can use Vertex AI by setting a custom `client` or environment variables.
|
|
28
|
-
See these docs for reference:
|
|
29
|
-
- Google AI SDK Custom Client: https://googleapis.github.io/python-genai/#create-a-client
|
|
30
|
-
- Mirascope Google Custom Client: https://mirascope.com/learn/calls/#__tabbed_39_5
|
|
31
|
-
"""),
|
|
32
|
-
category=DeprecationWarning,
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
__all__ = [
|
|
36
|
-
"VertexCallParams",
|
|
37
|
-
"VertexCallResponse",
|
|
38
|
-
"VertexCallResponseChunk",
|
|
39
|
-
"VertexDynamicConfig",
|
|
40
|
-
"VertexMessageParam",
|
|
41
|
-
"VertexStream",
|
|
42
|
-
"VertexTool",
|
|
43
|
-
"call",
|
|
44
|
-
"vertex_call",
|
|
45
|
-
]
|
mirascope/core/vertex/_call.py
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
"""The `vertex_call` decorator for functions as LLM calls."""
|
|
2
|
-
|
|
3
|
-
from ..base import call_factory
|
|
4
|
-
from ._utils import get_json_output, handle_stream, handle_stream_async, setup_call
|
|
5
|
-
from .call_params import VertexCallParams
|
|
6
|
-
from .call_response import VertexCallResponse
|
|
7
|
-
from .call_response_chunk import VertexCallResponseChunk
|
|
8
|
-
from .stream import VertexStream
|
|
9
|
-
from .tool import VertexTool
|
|
10
|
-
|
|
11
|
-
vertex_call = call_factory(
|
|
12
|
-
TCallResponse=VertexCallResponse,
|
|
13
|
-
TCallResponseChunk=VertexCallResponseChunk,
|
|
14
|
-
TStream=VertexStream,
|
|
15
|
-
TToolType=VertexTool,
|
|
16
|
-
default_call_params=VertexCallParams(),
|
|
17
|
-
setup_call=setup_call,
|
|
18
|
-
get_json_output=get_json_output,
|
|
19
|
-
handle_stream=handle_stream, # pyright: ignore [reportArgumentType]
|
|
20
|
-
handle_stream_async=handle_stream_async, # pyright: ignore [reportArgumentType]
|
|
21
|
-
)
|
|
22
|
-
"""A decorator for calling the Vertex API with a typed function.
|
|
23
|
-
|
|
24
|
-
usage docs: learn/calls.md
|
|
25
|
-
|
|
26
|
-
This decorator is used to wrap a typed function that calls the Vertex API. It parses
|
|
27
|
-
the prompt template of the wrapped function as the messages array and templates the
|
|
28
|
-
input arguments for the function into each message's template.
|
|
29
|
-
|
|
30
|
-
Example:
|
|
31
|
-
|
|
32
|
-
```python
|
|
33
|
-
from mirascope.core import prompt_template
|
|
34
|
-
from mirascope.core.vertex import vertex_call
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
@vertex_call("gemini-1.5-flash")
|
|
38
|
-
def recommend_book(genre: str) -> str:
|
|
39
|
-
return f"Recommend a {genre} book"
|
|
40
|
-
|
|
41
|
-
response = recommend_book("fantasy")
|
|
42
|
-
print(response.content)
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Args:
|
|
46
|
-
model (str): The Vertex model to use in the API call.
|
|
47
|
-
stream (bool): Whether to stream the response from the API call.
|
|
48
|
-
tools (list[BaseTool | Callable]): The tools to use in the Vertex API call.
|
|
49
|
-
response_model (BaseModel | BaseType): The response model into which the response
|
|
50
|
-
should be structured.
|
|
51
|
-
output_parser (Callable[[VertexCallResponse | ResponseModelT], Any]): A function
|
|
52
|
-
for parsing the call response whose value will be returned in place of the
|
|
53
|
-
original call response.
|
|
54
|
-
json_modem (bool): Whether to use JSON Mode.
|
|
55
|
-
client (object): An optional custom client to use in place of the default client.
|
|
56
|
-
call_params (VertexCallParams): The `VertexCallParams` call parameters to use in the
|
|
57
|
-
API call.
|
|
58
|
-
|
|
59
|
-
Returns:
|
|
60
|
-
decorator (Callable): The decorator for turning a typed function into a Vertex API
|
|
61
|
-
call.
|
|
62
|
-
"""
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"""This module contains the type definition for the Vertex call keyword arguments."""
|
|
2
|
-
|
|
3
|
-
from collections.abc import Sequence
|
|
4
|
-
|
|
5
|
-
from vertexai.generative_models import Content, Tool
|
|
6
|
-
|
|
7
|
-
from ..base import BaseCallKwargs
|
|
8
|
-
from .call_params import VertexCallParams
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class VertexCallKwargs(VertexCallParams, BaseCallKwargs[Tool]):
|
|
12
|
-
contents: Sequence[Content]
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"""Vertex utilities for decorator factories."""
|
|
2
|
-
|
|
3
|
-
from ._convert_message_params import convert_message_params
|
|
4
|
-
from ._get_json_output import get_json_output
|
|
5
|
-
from ._handle_stream import handle_stream, handle_stream_async
|
|
6
|
-
from ._setup_call import setup_call
|
|
7
|
-
|
|
8
|
-
__all__ = [
|
|
9
|
-
"convert_message_params",
|
|
10
|
-
"get_json_output",
|
|
11
|
-
"handle_stream",
|
|
12
|
-
"handle_stream_async",
|
|
13
|
-
"setup_call",
|
|
14
|
-
]
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
from typing import cast
|
|
2
|
-
|
|
3
|
-
from vertexai.generative_models import GenerationConfig
|
|
4
|
-
|
|
5
|
-
from ...base.call_params import CommonCallParams
|
|
6
|
-
from ..call_params import VertexCallParams
|
|
7
|
-
|
|
8
|
-
VERTEX_PARAM_MAPPING = {
|
|
9
|
-
"temperature": "temperature",
|
|
10
|
-
"max_tokens": "max_output_tokens",
|
|
11
|
-
"top_p": "top_p",
|
|
12
|
-
"stop": "stop_sequences",
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def convert_common_call_params(common_params: CommonCallParams) -> VertexCallParams:
|
|
17
|
-
"""Convert CommonCallParams to Vertex parameters."""
|
|
18
|
-
generation_config = {}
|
|
19
|
-
|
|
20
|
-
for key, value in common_params.items():
|
|
21
|
-
if key not in VERTEX_PARAM_MAPPING or value is None:
|
|
22
|
-
continue
|
|
23
|
-
|
|
24
|
-
if key == "stop":
|
|
25
|
-
generation_config["stop_sequences"] = (
|
|
26
|
-
[value] if isinstance(value, str) else value
|
|
27
|
-
)
|
|
28
|
-
else:
|
|
29
|
-
generation_config[VERTEX_PARAM_MAPPING[key]] = value
|
|
30
|
-
|
|
31
|
-
if not generation_config:
|
|
32
|
-
return cast(VertexCallParams, {})
|
|
33
|
-
|
|
34
|
-
return cast(
|
|
35
|
-
VertexCallParams,
|
|
36
|
-
{"generation_config": cast(GenerationConfig, generation_config)},
|
|
37
|
-
)
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
from mirascope.core.base._utils._convert_provider_finish_reason_to_finish_reason import (
|
|
2
|
-
FinishReasonMappingValue,
|
|
3
|
-
_convert_finish_reasons_to_common_finish_reasons_from_mapping,
|
|
4
|
-
)
|
|
5
|
-
from mirascope.core.base.types import FinishReason
|
|
6
|
-
|
|
7
|
-
_FinishReasonMapping: dict[str, FinishReasonMappingValue] = {
|
|
8
|
-
"FINISH_REASON_UNSPECIFIED": "stop",
|
|
9
|
-
"STOP": "stop",
|
|
10
|
-
"MAX_TOKENS": "length",
|
|
11
|
-
"SAFETY": "content_filter",
|
|
12
|
-
"RECITATION": "stop",
|
|
13
|
-
"OTHER": "stop",
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def _convert_finish_reasons_to_common_finish_reasons(
|
|
18
|
-
finish_reasons: list[str],
|
|
19
|
-
) -> list[FinishReason] | None:
|
|
20
|
-
"""Provider-agnostic finish reasons."""
|
|
21
|
-
return _convert_finish_reasons_to_common_finish_reasons_from_mapping(
|
|
22
|
-
finish_reasons, _FinishReasonMapping
|
|
23
|
-
)
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
"""Utility for converting `BaseMessageParam` to `Content`"""
|
|
2
|
-
|
|
3
|
-
import base64
|
|
4
|
-
import io
|
|
5
|
-
|
|
6
|
-
import PIL.Image
|
|
7
|
-
from google.cloud.aiplatform_v1beta1.types import content as gapic_content_types
|
|
8
|
-
from google.cloud.aiplatform_v1beta1.types import tool as gapic_tool_types
|
|
9
|
-
from vertexai.generative_models import Content, Image, Part
|
|
10
|
-
|
|
11
|
-
from ...base import BaseMessageParam
|
|
12
|
-
from ...base._utils import get_audio_type
|
|
13
|
-
from ...base._utils._parse_content_template import _load_media
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def convert_message_params(
|
|
17
|
-
message_params: list[BaseMessageParam | Content],
|
|
18
|
-
) -> list[Content]:
|
|
19
|
-
converted_message_params = []
|
|
20
|
-
for message_param in message_params:
|
|
21
|
-
if isinstance(message_param, Content):
|
|
22
|
-
converted_message_params.append(message_param)
|
|
23
|
-
elif (role := message_param.role) == "system":
|
|
24
|
-
content = message_param.content
|
|
25
|
-
if not isinstance(content, str):
|
|
26
|
-
raise ValueError(
|
|
27
|
-
"System message content must be a single text string."
|
|
28
|
-
) # pragma: no cover
|
|
29
|
-
converted_message_params += [
|
|
30
|
-
Content(
|
|
31
|
-
role="system",
|
|
32
|
-
parts=[
|
|
33
|
-
Part.from_text(content) if isinstance(content, str) else content
|
|
34
|
-
],
|
|
35
|
-
),
|
|
36
|
-
]
|
|
37
|
-
elif isinstance((content := message_param.content), str):
|
|
38
|
-
converted_message_params.append(
|
|
39
|
-
Content(role="user", parts=[Part.from_text(content)])
|
|
40
|
-
)
|
|
41
|
-
else:
|
|
42
|
-
converted_content: list[Part] = []
|
|
43
|
-
for part in content:
|
|
44
|
-
if part.type == "text":
|
|
45
|
-
converted_content.append(Part.from_text(part.text))
|
|
46
|
-
elif part.type == "image":
|
|
47
|
-
if part.media_type not in [
|
|
48
|
-
"image/jpeg",
|
|
49
|
-
"image/png",
|
|
50
|
-
"image/webp",
|
|
51
|
-
"image/heic",
|
|
52
|
-
"image/heif",
|
|
53
|
-
]:
|
|
54
|
-
raise ValueError(
|
|
55
|
-
f"Unsupported image media type: {part.media_type}. "
|
|
56
|
-
"Vertex currently only supports JPEG, PNG, WebP, HEIC, "
|
|
57
|
-
"and HEIF images."
|
|
58
|
-
)
|
|
59
|
-
image = Image.from_bytes(part.image)
|
|
60
|
-
converted_content.append(Part.from_image(image))
|
|
61
|
-
elif part.type == "image_url":
|
|
62
|
-
# Should download the image to determine the media type
|
|
63
|
-
image = PIL.Image.open(io.BytesIO(_load_media(part.url)))
|
|
64
|
-
media_type = (
|
|
65
|
-
PIL.Image.MIME[image.format]
|
|
66
|
-
if image.format
|
|
67
|
-
else "image/unknown"
|
|
68
|
-
)
|
|
69
|
-
if media_type not in [
|
|
70
|
-
"image/jpeg",
|
|
71
|
-
"image/png",
|
|
72
|
-
"image/webp",
|
|
73
|
-
"image/heic",
|
|
74
|
-
"image/heif",
|
|
75
|
-
]:
|
|
76
|
-
raise ValueError(
|
|
77
|
-
f"Unsupported image media type: {media_type}. "
|
|
78
|
-
"Gemini currently only supports JPEG, PNG, WebP, HEIC, "
|
|
79
|
-
"and HEIF images."
|
|
80
|
-
)
|
|
81
|
-
converted_content.append(
|
|
82
|
-
Part.from_uri(part.url, mime_type=media_type)
|
|
83
|
-
)
|
|
84
|
-
elif part.type == "audio":
|
|
85
|
-
if part.media_type not in [
|
|
86
|
-
"audio/wav",
|
|
87
|
-
"audio/mp3",
|
|
88
|
-
"audio/aiff",
|
|
89
|
-
"audio/aac",
|
|
90
|
-
"audio/ogg",
|
|
91
|
-
"audio/flac",
|
|
92
|
-
]:
|
|
93
|
-
raise ValueError(
|
|
94
|
-
f"Unsupported audio media type: {part.media_type}. "
|
|
95
|
-
"Vertex currently only supports WAV, MP3, AIFF, AAC, OGG, "
|
|
96
|
-
"and FLAC audio file types."
|
|
97
|
-
)
|
|
98
|
-
converted_content.append(
|
|
99
|
-
Part.from_data(
|
|
100
|
-
mime_type=part.media_type,
|
|
101
|
-
data=part.audio
|
|
102
|
-
if isinstance(part.audio, bytes)
|
|
103
|
-
else base64.b64decode(part.audio),
|
|
104
|
-
)
|
|
105
|
-
)
|
|
106
|
-
elif part.type == "audio_url":
|
|
107
|
-
# Should download the audio to determine the media type
|
|
108
|
-
audio = _load_media(part.url)
|
|
109
|
-
audio_type = f"audio/{get_audio_type(audio)}"
|
|
110
|
-
if audio_type not in [
|
|
111
|
-
"audio/wav",
|
|
112
|
-
"audio/mp3",
|
|
113
|
-
"audio/aiff",
|
|
114
|
-
"audio/aac",
|
|
115
|
-
"audio/ogg",
|
|
116
|
-
"audio/flac",
|
|
117
|
-
]:
|
|
118
|
-
raise ValueError(
|
|
119
|
-
f"Unsupported audio media type: {audio_type}. "
|
|
120
|
-
"Gemini currently only supports WAV, MP3, AIFF, AAC, OGG, "
|
|
121
|
-
"and FLAC audio file types."
|
|
122
|
-
)
|
|
123
|
-
converted_content.append(
|
|
124
|
-
Part.from_uri(part.url, mime_type=audio_type)
|
|
125
|
-
)
|
|
126
|
-
elif part.type == "tool_call":
|
|
127
|
-
if converted_content:
|
|
128
|
-
converted_message_params.append(
|
|
129
|
-
Content(role=role, parts=converted_content)
|
|
130
|
-
)
|
|
131
|
-
converted_content = []
|
|
132
|
-
raw_gapic_part = gapic_content_types.Part(
|
|
133
|
-
function_call=gapic_tool_types.FunctionCall(
|
|
134
|
-
name=part.name, args=part.args
|
|
135
|
-
)
|
|
136
|
-
)
|
|
137
|
-
converted_message_params.append(
|
|
138
|
-
Content(
|
|
139
|
-
role=role,
|
|
140
|
-
parts=[Part._from_gapic(raw_gapic_part)],
|
|
141
|
-
)
|
|
142
|
-
)
|
|
143
|
-
elif part.type == "tool_result":
|
|
144
|
-
if converted_content:
|
|
145
|
-
converted_message_params.append(
|
|
146
|
-
Content(role=role, parts=converted_content)
|
|
147
|
-
)
|
|
148
|
-
converted_content = []
|
|
149
|
-
converted_message_params.append(
|
|
150
|
-
Content(
|
|
151
|
-
role=role,
|
|
152
|
-
parts=[
|
|
153
|
-
Part.from_function_response(
|
|
154
|
-
name=part.name,
|
|
155
|
-
response={
|
|
156
|
-
"content": {"result": part.content},
|
|
157
|
-
},
|
|
158
|
-
)
|
|
159
|
-
],
|
|
160
|
-
)
|
|
161
|
-
)
|
|
162
|
-
else:
|
|
163
|
-
raise ValueError(
|
|
164
|
-
"Vertex currently only supports text, image, and audio parts. "
|
|
165
|
-
f"Part provided: {part.type}"
|
|
166
|
-
)
|
|
167
|
-
if converted_content:
|
|
168
|
-
converted_message_params.append(
|
|
169
|
-
Content(role=role, parts=converted_content)
|
|
170
|
-
)
|
|
171
|
-
return converted_message_params
|