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,87 +0,0 @@
|
|
|
1
|
-
"""A module for calling OpenAI's Embeddings models."""
|
|
2
|
-
|
|
3
|
-
import datetime
|
|
4
|
-
from typing import ClassVar
|
|
5
|
-
|
|
6
|
-
from cohere import AsyncClient, Client
|
|
7
|
-
|
|
8
|
-
from ..base.embedders import BaseEmbedder
|
|
9
|
-
from .embedding_params import CohereEmbeddingParams
|
|
10
|
-
from .embedding_response import CohereEmbeddingResponse
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class CohereEmbedder(BaseEmbedder[CohereEmbeddingResponse]):
|
|
14
|
-
"""Cohere Embedder
|
|
15
|
-
|
|
16
|
-
model max_dimensions
|
|
17
|
-
embed-english-v3.0 1024
|
|
18
|
-
embed-multilingual-v3.0 1024
|
|
19
|
-
embed-english-light-v3.0 384
|
|
20
|
-
embed-multilingual-light-v3.0 384
|
|
21
|
-
embed-english-v2.0 4096
|
|
22
|
-
embed-english-light-v2.0 1024
|
|
23
|
-
embed-multilingual-v2.0 768
|
|
24
|
-
|
|
25
|
-
Example:
|
|
26
|
-
|
|
27
|
-
```python
|
|
28
|
-
import os
|
|
29
|
-
from mirascope.beta.rag.cohere import CohereEmbedder
|
|
30
|
-
|
|
31
|
-
os.environ["CO_API_KEY"] = "YOUR_COHERE_API_KEY"
|
|
32
|
-
|
|
33
|
-
cohere_embedder = CohereEmbedder()
|
|
34
|
-
response = cohere_embedder.embed(["your text to embed"])
|
|
35
|
-
print(response)
|
|
36
|
-
```
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
dimensions: int | None = 1024
|
|
40
|
-
embedding_params: ClassVar[CohereEmbeddingParams] = CohereEmbeddingParams(
|
|
41
|
-
model="embed-english-v3.0"
|
|
42
|
-
)
|
|
43
|
-
_provider: ClassVar[str] = "cohere"
|
|
44
|
-
|
|
45
|
-
def embed(self, inputs: list[str]) -> CohereEmbeddingResponse:
|
|
46
|
-
"""Call the embedder with multiple inputs"""
|
|
47
|
-
|
|
48
|
-
co = Client(api_key=self.api_key, base_url=self.base_url)
|
|
49
|
-
embedding_type = (
|
|
50
|
-
self.embedding_params.embedding_types[0]
|
|
51
|
-
if self.embedding_params.embedding_types
|
|
52
|
-
else None
|
|
53
|
-
)
|
|
54
|
-
start_time = datetime.datetime.now().timestamp() * 1000
|
|
55
|
-
response = co.embed(texts=inputs, **self.embedding_params.kwargs())
|
|
56
|
-
return CohereEmbeddingResponse(
|
|
57
|
-
response=response,
|
|
58
|
-
start_time=start_time,
|
|
59
|
-
end_time=datetime.datetime.now().timestamp() * 1000,
|
|
60
|
-
embedding_type=embedding_type,
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
async def embed_async(self, inputs: list[str]) -> CohereEmbeddingResponse:
|
|
64
|
-
"""Asynchronously call the embedder with multiple inputs"""
|
|
65
|
-
co = AsyncClient(api_key=self.api_key, base_url=self.base_url)
|
|
66
|
-
embedding_type = (
|
|
67
|
-
self.embedding_params.embedding_types[0]
|
|
68
|
-
if self.embedding_params.embedding_types
|
|
69
|
-
else None
|
|
70
|
-
)
|
|
71
|
-
start_time = datetime.datetime.now().timestamp() * 1000
|
|
72
|
-
response = await co.embed(texts=inputs, **self.embedding_params.kwargs())
|
|
73
|
-
return CohereEmbeddingResponse(
|
|
74
|
-
response=response,
|
|
75
|
-
start_time=start_time,
|
|
76
|
-
end_time=datetime.datetime.now().timestamp() * 1000,
|
|
77
|
-
embedding_type=embedding_type,
|
|
78
|
-
)
|
|
79
|
-
|
|
80
|
-
def __call__(self, input: list[str]) -> list[list[float]] | list[list[int]] | None:
|
|
81
|
-
"""Call the embedder with a input
|
|
82
|
-
|
|
83
|
-
Chroma expects parameter to be `input`.
|
|
84
|
-
"""
|
|
85
|
-
response = self.embed(input)
|
|
86
|
-
embeddings = response.embeddings
|
|
87
|
-
return embeddings
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
from collections.abc import Sequence
|
|
2
|
-
from typing import Any, Literal, NotRequired
|
|
3
|
-
|
|
4
|
-
from typing_extensions import TypedDict
|
|
5
|
-
|
|
6
|
-
from ..base.embedding_params import BaseEmbeddingParams
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class RequestOptions(TypedDict):
|
|
10
|
-
"""Redefining their class to use `typing_extensions.TypedDict` for Pydantic."""
|
|
11
|
-
|
|
12
|
-
timeout_in_seconds: NotRequired[int]
|
|
13
|
-
max_retries: NotRequired[int]
|
|
14
|
-
additional_headers: NotRequired[dict[str, Any]]
|
|
15
|
-
additional_query_parameters: NotRequired[dict[str, Any]]
|
|
16
|
-
additional_body_parameters: NotRequired[dict[str, Any]]
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class CohereEmbeddingParams(BaseEmbeddingParams):
|
|
20
|
-
model: str = "embed-english-v3.0"
|
|
21
|
-
input_type: Literal[
|
|
22
|
-
"search_document", "search_query", "classification", "clustering"
|
|
23
|
-
] = "search_query"
|
|
24
|
-
embedding_types: (
|
|
25
|
-
Sequence[Literal["float", "int8", "uint8", "binary", "ubinary"]] | None
|
|
26
|
-
) = None
|
|
27
|
-
truncate: Literal["none", "end", "start"] | None = "end"
|
|
28
|
-
request_options: RequestOptions | None = None
|
|
29
|
-
batching: bool | None = True
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
from typing import Literal
|
|
2
|
-
|
|
3
|
-
from cohere.types import EmbedByTypeResponseEmbeddings, EmbedResponse
|
|
4
|
-
from pydantic import SkipValidation
|
|
5
|
-
|
|
6
|
-
from ..base.embedding_response import BaseEmbeddingResponse
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class CohereEmbeddingResponse(BaseEmbeddingResponse[SkipValidation[EmbedResponse]]):
|
|
10
|
-
"""A convenience wrapper around the Cohere `EmbedResponse` response."""
|
|
11
|
-
|
|
12
|
-
embedding_type: Literal["float", "int8", "uint8", "binary", "ubinary"] | None = None
|
|
13
|
-
|
|
14
|
-
@property
|
|
15
|
-
def embeddings(
|
|
16
|
-
self,
|
|
17
|
-
) -> list[list[float]] | list[list[int]] | None:
|
|
18
|
-
"""Returns the embeddings"""
|
|
19
|
-
if self.response.response_type == "embeddings_floats":
|
|
20
|
-
return self.response.embeddings
|
|
21
|
-
else:
|
|
22
|
-
embedding_type = self.embedding_type
|
|
23
|
-
if embedding_type == "float":
|
|
24
|
-
embedding_type = "float_"
|
|
25
|
-
|
|
26
|
-
# TODO: Update to model_dump when Cohere updates to Pydantic v2
|
|
27
|
-
embeddings_by_type: EmbedByTypeResponseEmbeddings = self.response.embeddings
|
|
28
|
-
embedding_dict = embeddings_by_type.dict()
|
|
29
|
-
return embedding_dict.get(str(embedding_type), None)
|
|
File without changes
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"""A module for interacting with OpenAI models."""
|
|
2
|
-
|
|
3
|
-
from .embedders import OpenAIEmbedder
|
|
4
|
-
from .embedding_params import OpenAIEmbeddingParams
|
|
5
|
-
from .embedding_response import OpenAIEmbeddingResponse
|
|
6
|
-
|
|
7
|
-
__all__ = [
|
|
8
|
-
"OpenAIEmbedder",
|
|
9
|
-
"OpenAIEmbeddingParams",
|
|
10
|
-
"OpenAIEmbeddingResponse",
|
|
11
|
-
]
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
"""A module for calling OpenAI's Embeddings models."""
|
|
2
|
-
|
|
3
|
-
import asyncio
|
|
4
|
-
import datetime
|
|
5
|
-
from concurrent.futures import ThreadPoolExecutor
|
|
6
|
-
from typing import ClassVar
|
|
7
|
-
|
|
8
|
-
from openai import AsyncOpenAI, OpenAI
|
|
9
|
-
from openai.types import Embedding
|
|
10
|
-
from openai.types.create_embedding_response import CreateEmbeddingResponse, Usage
|
|
11
|
-
|
|
12
|
-
from ..base.embedders import BaseEmbedder
|
|
13
|
-
from .embedding_params import OpenAIEmbeddingParams
|
|
14
|
-
from .embedding_response import OpenAIEmbeddingResponse
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class OpenAIEmbedder(BaseEmbedder[OpenAIEmbeddingResponse]):
|
|
18
|
-
"""OpenAI Embedder
|
|
19
|
-
|
|
20
|
-
Example:
|
|
21
|
-
|
|
22
|
-
```python
|
|
23
|
-
import os
|
|
24
|
-
from mirascope.beta.rag.openai import OpenAIEmbedder
|
|
25
|
-
|
|
26
|
-
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
|
|
27
|
-
|
|
28
|
-
openai_embedder = OpenAIEmbedder()
|
|
29
|
-
response = openai_embedder.embed(["your text to embed"])
|
|
30
|
-
print(response)
|
|
31
|
-
```
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
dimensions: int | None = 1536
|
|
35
|
-
embed_batch_size: int | None = 20
|
|
36
|
-
max_workers: int | None = 64
|
|
37
|
-
embedding_params: ClassVar[OpenAIEmbeddingParams] = OpenAIEmbeddingParams(
|
|
38
|
-
model="text-embedding-3-small"
|
|
39
|
-
)
|
|
40
|
-
_provider: ClassVar[str] = "openai"
|
|
41
|
-
|
|
42
|
-
def embed(self, inputs: list[str]) -> OpenAIEmbeddingResponse:
|
|
43
|
-
"""Call the embedder with multiple inputs"""
|
|
44
|
-
if self.embed_batch_size is None:
|
|
45
|
-
return self._embed(inputs)
|
|
46
|
-
|
|
47
|
-
input_batches = [
|
|
48
|
-
inputs[i : i + self.embed_batch_size]
|
|
49
|
-
for i in range(0, len(inputs), self.embed_batch_size)
|
|
50
|
-
]
|
|
51
|
-
|
|
52
|
-
embedding_responses: list[OpenAIEmbeddingResponse] = list(
|
|
53
|
-
ThreadPoolExecutor(self.max_workers).map(
|
|
54
|
-
lambda inputs: self._embed(inputs),
|
|
55
|
-
input_batches,
|
|
56
|
-
)
|
|
57
|
-
)
|
|
58
|
-
return self._merge_batch_embeddings(embedding_responses)
|
|
59
|
-
|
|
60
|
-
async def embed_async(self, inputs: list[str]) -> OpenAIEmbeddingResponse:
|
|
61
|
-
"""Asynchronously call the embedder with multiple inputs"""
|
|
62
|
-
if self.embed_batch_size is None:
|
|
63
|
-
return await self._embed_async(inputs)
|
|
64
|
-
|
|
65
|
-
input_batches = [
|
|
66
|
-
inputs[i : i + self.embed_batch_size]
|
|
67
|
-
for i in range(0, len(inputs), self.embed_batch_size)
|
|
68
|
-
]
|
|
69
|
-
embedding_responses: list[OpenAIEmbeddingResponse] = await asyncio.gather(
|
|
70
|
-
*[self._embed_async(inputs) for inputs in input_batches]
|
|
71
|
-
)
|
|
72
|
-
return self._merge_batch_embeddings(embedding_responses)
|
|
73
|
-
|
|
74
|
-
def __call__(self, input: list[str]) -> list[list[float]]:
|
|
75
|
-
"""Call the embedder with a input
|
|
76
|
-
|
|
77
|
-
Chroma expects parameter to be `input`.
|
|
78
|
-
"""
|
|
79
|
-
embedding_response = self.embed(input)
|
|
80
|
-
|
|
81
|
-
return embedding_response.embeddings
|
|
82
|
-
|
|
83
|
-
############################## PRIVATE METHODS ###################################
|
|
84
|
-
|
|
85
|
-
def _embed(self, inputs: list[str]) -> OpenAIEmbeddingResponse:
|
|
86
|
-
"""Call the embedder with a single input"""
|
|
87
|
-
client = OpenAI(api_key=self.api_key, base_url=self.base_url)
|
|
88
|
-
kwargs = self.embedding_params.kwargs()
|
|
89
|
-
if self.embedding_params.model != "text-embedding-ada-002":
|
|
90
|
-
kwargs["dimensions"] = self.dimensions
|
|
91
|
-
start_time = datetime.datetime.now().timestamp() * 1000
|
|
92
|
-
embeddings = client.embeddings.create(input=inputs, **kwargs)
|
|
93
|
-
return OpenAIEmbeddingResponse(
|
|
94
|
-
response=embeddings,
|
|
95
|
-
start_time=start_time,
|
|
96
|
-
end_time=datetime.datetime.now().timestamp() * 1000,
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
async def _embed_async(self, inputs: list[str]) -> OpenAIEmbeddingResponse:
|
|
100
|
-
"""Asynchronously call the embedder with a single input"""
|
|
101
|
-
client = AsyncOpenAI(api_key=self.api_key, base_url=self.base_url)
|
|
102
|
-
kwargs = self.embedding_params.kwargs()
|
|
103
|
-
if self.embedding_params.model != "text-embedding-ada-002":
|
|
104
|
-
kwargs["dimensions"] = self.dimensions
|
|
105
|
-
start_time = datetime.datetime.now().timestamp() * 1000
|
|
106
|
-
embeddings = await client.embeddings.create(input=inputs, **kwargs)
|
|
107
|
-
return OpenAIEmbeddingResponse(
|
|
108
|
-
response=embeddings,
|
|
109
|
-
start_time=start_time,
|
|
110
|
-
end_time=datetime.datetime.now().timestamp() * 1000,
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
def _merge_batch_embeddings(
|
|
114
|
-
self, openai_embeddings: list[OpenAIEmbeddingResponse]
|
|
115
|
-
) -> OpenAIEmbeddingResponse:
|
|
116
|
-
"""Merge a batch of embeddings into a single embedding"""
|
|
117
|
-
embeddings: list[Embedding] = []
|
|
118
|
-
usage = Usage(
|
|
119
|
-
prompt_tokens=0,
|
|
120
|
-
total_tokens=0,
|
|
121
|
-
)
|
|
122
|
-
start_time = float("inf")
|
|
123
|
-
end_time: float = 0.0
|
|
124
|
-
i: int = 0
|
|
125
|
-
for openai_embedding in openai_embeddings:
|
|
126
|
-
for embedding in openai_embedding.response.data:
|
|
127
|
-
embedding.index = i
|
|
128
|
-
embeddings.append(embedding)
|
|
129
|
-
i += 1
|
|
130
|
-
usage.prompt_tokens += openai_embedding.response.usage.prompt_tokens
|
|
131
|
-
usage.total_tokens += openai_embedding.response.usage.total_tokens
|
|
132
|
-
start_time = min(start_time, openai_embedding.start_time)
|
|
133
|
-
end_time = max(end_time, openai_embedding.end_time)
|
|
134
|
-
create_embedding_response = CreateEmbeddingResponse(
|
|
135
|
-
data=embeddings,
|
|
136
|
-
model=openai_embeddings[0].response.model,
|
|
137
|
-
object=openai_embeddings[0].response.object,
|
|
138
|
-
usage=usage,
|
|
139
|
-
)
|
|
140
|
-
return OpenAIEmbeddingResponse(
|
|
141
|
-
response=create_embedding_response,
|
|
142
|
-
start_time=start_time,
|
|
143
|
-
end_time=end_time,
|
|
144
|
-
)
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
from typing import Literal
|
|
2
|
-
|
|
3
|
-
from httpx import Timeout
|
|
4
|
-
from openai._types import Body, Headers, Query
|
|
5
|
-
|
|
6
|
-
from ..base.embedding_params import BaseEmbeddingParams
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class OpenAIEmbeddingParams(BaseEmbeddingParams):
|
|
10
|
-
model: str = "text-embedding-3-small"
|
|
11
|
-
encoding_format: Literal["float", "base64"] | None = None
|
|
12
|
-
user: str | None = None
|
|
13
|
-
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
14
|
-
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
15
|
-
extra_headers: Headers | None = None
|
|
16
|
-
extra_query: Query | None = None
|
|
17
|
-
extra_body: Body | None = None
|
|
18
|
-
timeout: float | Timeout | None = None
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
from openai.types import Embedding
|
|
2
|
-
from openai.types.create_embedding_response import CreateEmbeddingResponse
|
|
3
|
-
|
|
4
|
-
from ..base.embedding_response import BaseEmbeddingResponse
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class OpenAIEmbeddingResponse(BaseEmbeddingResponse[CreateEmbeddingResponse]):
|
|
8
|
-
"""A convenience wrapper around the OpenAI `CreateEmbeddingResponse` response."""
|
|
9
|
-
|
|
10
|
-
@property
|
|
11
|
-
def embeddings(self) -> list[list[float]]:
|
|
12
|
-
"""Returns the raw embeddings."""
|
|
13
|
-
embeddings_model: list[Embedding] = list(self.response.data)
|
|
14
|
-
return [embedding.embedding for embedding in embeddings_model]
|
|
File without changes
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"""A module for interacting with Pinecone vectorstores."""
|
|
2
|
-
|
|
3
|
-
from .types import (
|
|
4
|
-
PineconeParams,
|
|
5
|
-
PineconePodParams,
|
|
6
|
-
PineconeQueryResult,
|
|
7
|
-
PineconeServerlessParams,
|
|
8
|
-
PineconeSettings,
|
|
9
|
-
)
|
|
10
|
-
from .vectorstores import PineconeVectorStore
|
|
11
|
-
|
|
12
|
-
__all__ = [
|
|
13
|
-
"PineconeParams",
|
|
14
|
-
"PineconePodParams",
|
|
15
|
-
"PineconeQueryResult",
|
|
16
|
-
"PineconeServerlessParams",
|
|
17
|
-
"PineconeSettings",
|
|
18
|
-
"PineconeVectorStore",
|
|
19
|
-
]
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
"""Types for interacting with Pinecone using Mirascope."""
|
|
2
|
-
|
|
3
|
-
from typing import Any, Literal
|
|
4
|
-
|
|
5
|
-
from pinecone.config import Config
|
|
6
|
-
from pinecone.core.client.api.manage_indexes_api import ManageIndexesApi
|
|
7
|
-
from pydantic import BaseModel, ConfigDict
|
|
8
|
-
|
|
9
|
-
from ..vectorstore_params import BaseVectorStoreParams
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class ServerlessSpec(BaseModel):
|
|
13
|
-
"""The parameters for Pinecone ServerlessSpec"""
|
|
14
|
-
|
|
15
|
-
cloud: str
|
|
16
|
-
region: str
|
|
17
|
-
|
|
18
|
-
def kwargs(self) -> dict[str, Any]:
|
|
19
|
-
"""Returns all parameters for the index as a keyword arguments dictionary."""
|
|
20
|
-
kwargs = {
|
|
21
|
-
key: value for key, value in self.model_dump().items() if value is not None
|
|
22
|
-
}
|
|
23
|
-
return {"serverless": kwargs}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class PodSpec(BaseModel):
|
|
27
|
-
"""The parameters for Pinecone PodSpec"""
|
|
28
|
-
|
|
29
|
-
environment: str
|
|
30
|
-
replicas: int | None = None
|
|
31
|
-
shards: int | None = None
|
|
32
|
-
pods: int | None = None
|
|
33
|
-
pod_type: str | None = "p1.x1"
|
|
34
|
-
metadata_config: dict | None = {}
|
|
35
|
-
source_collection: str | None = None
|
|
36
|
-
|
|
37
|
-
def kwargs(self) -> dict[str, Any]:
|
|
38
|
-
"""Returns all parameters for the index as a keyword arguments dictionary."""
|
|
39
|
-
kwargs = {
|
|
40
|
-
key: value for key, value in self.model_dump().items() if value is not None
|
|
41
|
-
}
|
|
42
|
-
return {"pod": kwargs}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
class PineconeParams(BaseModel):
|
|
46
|
-
"""The parameters for Pinecone create_index"""
|
|
47
|
-
|
|
48
|
-
metric: Literal["cosine", "dotproduct", "euclidean"] | None = "cosine"
|
|
49
|
-
timeout: int | None = None
|
|
50
|
-
|
|
51
|
-
def kwargs(self) -> dict[str, Any]:
|
|
52
|
-
"""Returns all parameters for the index as a keyword arguments dictionary."""
|
|
53
|
-
kwargs = {
|
|
54
|
-
key: value for key, value in self.model_dump().items() if value is not None
|
|
55
|
-
}
|
|
56
|
-
return kwargs
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class PineconeServerlessParams(PineconeParams, ServerlessSpec, BaseVectorStoreParams):
|
|
60
|
-
"""The parameters for Pinecone create_index with serverless spec and weave"""
|
|
61
|
-
|
|
62
|
-
def kwargs(self) -> dict[str, Any]:
|
|
63
|
-
"""Returns all parameters for the index as a keyword arguments dictionary."""
|
|
64
|
-
serverless_kwargs = ServerlessSpec(**self.model_dump()).kwargs()
|
|
65
|
-
pinecone_kwargs = PineconeParams(**self.model_dump()).kwargs()
|
|
66
|
-
return {**pinecone_kwargs, "spec": {**serverless_kwargs}}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
class PineconePodParams(PineconeParams, PodSpec, BaseVectorStoreParams):
|
|
70
|
-
"""The parameters for Pinecone create_index with pod spec and weave"""
|
|
71
|
-
|
|
72
|
-
def kwargs(self) -> dict[str, Any]:
|
|
73
|
-
"""Returns all parameters for the index as a keyword arguments dictionary."""
|
|
74
|
-
pod_kwargs = PodSpec(**self.model_dump()).kwargs()
|
|
75
|
-
pinecone_kwargs = PineconeParams(**self.model_dump()).kwargs()
|
|
76
|
-
# print(pinecone_kwargs, serverless_kwargs)
|
|
77
|
-
return {**pinecone_kwargs, "spec": {**pod_kwargs}}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
class PineconeSettings(BaseModel):
|
|
81
|
-
"""Settings for Pinecone instance"""
|
|
82
|
-
|
|
83
|
-
api_key: str | None = None
|
|
84
|
-
host: str | None = None
|
|
85
|
-
proxy_url: str | None = None
|
|
86
|
-
proxy_headers: dict[str, str] | None = None
|
|
87
|
-
ssl_ca_certs: str | None = None
|
|
88
|
-
ssl_verify: bool | None = None
|
|
89
|
-
config: Config | None = None
|
|
90
|
-
additional_headers: dict[str, str] | None = {}
|
|
91
|
-
pool_threads: int | None = 1
|
|
92
|
-
index_api: ManageIndexesApi | None = None
|
|
93
|
-
|
|
94
|
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
95
|
-
|
|
96
|
-
def kwargs(self) -> dict[str, Any]:
|
|
97
|
-
"""Returns all parameters for the index as a keyword arguments dictionary."""
|
|
98
|
-
kwargs = {
|
|
99
|
-
key: value for key, value in self.model_dump().items() if value is not None
|
|
100
|
-
}
|
|
101
|
-
return kwargs
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
class PineconeQueryResult(BaseModel):
|
|
105
|
-
"""The result of a Pinecone index query
|
|
106
|
-
|
|
107
|
-
Example:
|
|
108
|
-
|
|
109
|
-
```python
|
|
110
|
-
from mirascope.pinecone import (
|
|
111
|
-
PineconeServerlessParams,
|
|
112
|
-
PineconeSettings,
|
|
113
|
-
PineconeVectorStore,
|
|
114
|
-
)
|
|
115
|
-
from mirascope.openai import OpenAIEmbedder
|
|
116
|
-
from mirascope.rag import TextChunker
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
class MyStore(ChromaVectorStore):
|
|
120
|
-
embedder = OpenAIEmbedder(dimensions=1536)
|
|
121
|
-
chunker = TextChunker(chunk_size=1000, chunk_overlap=200)
|
|
122
|
-
index_name = "my-store-0001"
|
|
123
|
-
api_key = settings.pinecone_api_key
|
|
124
|
-
client_settings = PineconeSettings()
|
|
125
|
-
vectorstore_params = PineconeServerlessParams(
|
|
126
|
-
cloud="aws",
|
|
127
|
-
region="us-west-2",
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
my_store = MyStore()
|
|
131
|
-
with open(f"{PATH_TO_FILE}") as file:
|
|
132
|
-
data = file.read()
|
|
133
|
-
my_store.add(data)
|
|
134
|
-
query_results = my_store.retrieve("my question")
|
|
135
|
-
#> QueryResult(ids=['0'], documents=['my answer'],
|
|
136
|
-
# scores=[0.9999999999999999], embeddings=[[0.0, 0.0, 0.0, ...]])
|
|
137
|
-
```
|
|
138
|
-
"""
|
|
139
|
-
|
|
140
|
-
ids: list[str]
|
|
141
|
-
documents: list[str] | None = None
|
|
142
|
-
scores: list[float] | None = None
|
|
143
|
-
embeddings: list[list[float]] | None = None
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
"""A module for calling Chroma's Client and Collection."""
|
|
2
|
-
|
|
3
|
-
from collections.abc import Callable
|
|
4
|
-
from functools import cached_property
|
|
5
|
-
from typing import Any, ClassVar
|
|
6
|
-
|
|
7
|
-
from pinecone import Index, Pinecone, QueryResponse
|
|
8
|
-
|
|
9
|
-
from ..base.document import Document
|
|
10
|
-
from ..base.embedding_response import BaseEmbeddingResponse
|
|
11
|
-
from ..base.vectorstores import BaseVectorStore
|
|
12
|
-
from .types import (
|
|
13
|
-
PineconePodParams,
|
|
14
|
-
PineconeQueryResult,
|
|
15
|
-
PineconeServerlessParams,
|
|
16
|
-
PineconeSettings,
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class PineconeVectorStore(BaseVectorStore):
|
|
21
|
-
"""A vectorstore for Pinecone.
|
|
22
|
-
|
|
23
|
-
Example:
|
|
24
|
-
|
|
25
|
-
```python
|
|
26
|
-
from mirascope.beta.rag.pinecone import (
|
|
27
|
-
PineconeServerlessParams,
|
|
28
|
-
PineconeSettings,
|
|
29
|
-
PineconeVectorStore,
|
|
30
|
-
)
|
|
31
|
-
from mirascope.beta.rag.openai import OpenAIEmbedder
|
|
32
|
-
from mirascope.beta.rag import TextChunker
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class MyStore(PineconeVectorStore):
|
|
36
|
-
embedder = OpenAIEmbedder(dimensions=1536)
|
|
37
|
-
chunker = TextChunker(chunk_size=1000, chunk_overlap=200)
|
|
38
|
-
index_name = "my-store-0001"
|
|
39
|
-
api_key = settings.pinecone_api_key
|
|
40
|
-
client_settings = PineconeSettings()
|
|
41
|
-
vectorstore_params = PineconeServerlessParams(
|
|
42
|
-
cloud="aws",
|
|
43
|
-
region="us-west-2",
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
my_store = MyStore()
|
|
47
|
-
with open(f"{PATH_TO_FILE}") as file:
|
|
48
|
-
data = file.read()
|
|
49
|
-
my_store.add(data)
|
|
50
|
-
documents = my_store.retrieve("my question").documents
|
|
51
|
-
print(documents)
|
|
52
|
-
```
|
|
53
|
-
"""
|
|
54
|
-
|
|
55
|
-
handle_add_text: Callable[[list[Document]], None] | None = None
|
|
56
|
-
handle_retrieve_text: Callable[[list[float]], list[str]] | None = None
|
|
57
|
-
|
|
58
|
-
vectorstore_params: ClassVar[PineconePodParams | PineconeServerlessParams] = (
|
|
59
|
-
PineconeServerlessParams(cloud="aws", region="us-east-1")
|
|
60
|
-
)
|
|
61
|
-
client_settings: ClassVar[PineconeSettings] = PineconeSettings()
|
|
62
|
-
_provider: ClassVar[str] = "pinecone"
|
|
63
|
-
|
|
64
|
-
def retrieve(self, text: str, **kwargs: Any) -> PineconeQueryResult: # noqa: ANN401
|
|
65
|
-
"""Queries the vectorstore for closest match"""
|
|
66
|
-
embed = self.embedder.embed
|
|
67
|
-
text_embedding: BaseEmbeddingResponse = embed([text])
|
|
68
|
-
if "top_k" not in kwargs:
|
|
69
|
-
kwargs["top_k"] = 8
|
|
70
|
-
if text_embedding.embeddings is None:
|
|
71
|
-
raise ValueError("Embedding is None")
|
|
72
|
-
query_result: QueryResponse = self._index.query(
|
|
73
|
-
vector=text_embedding.embeddings[0],
|
|
74
|
-
**{"include_metadata": True, "include_values": True, **kwargs},
|
|
75
|
-
)
|
|
76
|
-
ids: list[str] = []
|
|
77
|
-
scores: list[float] = []
|
|
78
|
-
documents: list[str] = []
|
|
79
|
-
embeddings: list[list[float]] = []
|
|
80
|
-
for match in query_result.matches:
|
|
81
|
-
ids.append(match.id)
|
|
82
|
-
scores.append(match.score)
|
|
83
|
-
documents.append(
|
|
84
|
-
self.handle_retrieve_text([match.values])[0]
|
|
85
|
-
if self.handle_retrieve_text
|
|
86
|
-
else match.metadata["text"]
|
|
87
|
-
)
|
|
88
|
-
embeddings.append(match.values)
|
|
89
|
-
|
|
90
|
-
return PineconeQueryResult(
|
|
91
|
-
ids=ids,
|
|
92
|
-
scores=scores,
|
|
93
|
-
documents=documents,
|
|
94
|
-
embeddings=embeddings,
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
def add(
|
|
98
|
-
self,
|
|
99
|
-
text: str | list[Document],
|
|
100
|
-
**kwargs: Any, # noqa: ANN401
|
|
101
|
-
) -> None:
|
|
102
|
-
"""Takes unstructured data and upserts into vectorstore"""
|
|
103
|
-
documents: list[Document]
|
|
104
|
-
if isinstance(text, str):
|
|
105
|
-
chunk = self.chunker.chunk
|
|
106
|
-
documents = chunk(text)
|
|
107
|
-
else:
|
|
108
|
-
documents = text
|
|
109
|
-
inputs = [document.text for document in documents]
|
|
110
|
-
embed = self.embedder.embed
|
|
111
|
-
embedding_repsonse: BaseEmbeddingResponse = embed(inputs)
|
|
112
|
-
if self.handle_add_text:
|
|
113
|
-
self.handle_add_text(documents)
|
|
114
|
-
if embedding_repsonse.embeddings is None:
|
|
115
|
-
raise ValueError("Embedding is None")
|
|
116
|
-
vectors = []
|
|
117
|
-
for i, embedding in enumerate(embedding_repsonse.embeddings):
|
|
118
|
-
if documents[i] is not None:
|
|
119
|
-
metadata = documents[i].metadata or {}
|
|
120
|
-
metadata_text = (
|
|
121
|
-
{"text": documents[i].text}
|
|
122
|
-
if documents[i].text and not self.handle_add_text
|
|
123
|
-
else {}
|
|
124
|
-
)
|
|
125
|
-
vectors.append(
|
|
126
|
-
{
|
|
127
|
-
"id": documents[i].id,
|
|
128
|
-
"values": embedding,
|
|
129
|
-
"metadata": {**metadata, **metadata_text},
|
|
130
|
-
}
|
|
131
|
-
)
|
|
132
|
-
return self._index.upsert(vectors, **kwargs)
|
|
133
|
-
|
|
134
|
-
############################# PRIVATE PROPERTIES #################################
|
|
135
|
-
|
|
136
|
-
@cached_property
|
|
137
|
-
def _client(self) -> Pinecone:
|
|
138
|
-
return Pinecone(api_key=self.api_key, **self.client_settings.kwargs())
|
|
139
|
-
|
|
140
|
-
@cached_property
|
|
141
|
-
def _index(self) -> Index:
|
|
142
|
-
if self.index_name not in self._client.list_indexes().names():
|
|
143
|
-
self._client.create_index(
|
|
144
|
-
name=self.index_name,
|
|
145
|
-
dimension=self.embedder.dimensions,
|
|
146
|
-
**self.vectorstore_params.kwargs(),
|
|
147
|
-
)
|
|
148
|
-
return self._client.Index(self.index_name)
|