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,113 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import Any, Literal
|
|
4
|
-
|
|
5
|
-
import jiter
|
|
6
|
-
from pydantic.json_schema import SkipJsonSchema
|
|
7
|
-
from typing_extensions import NotRequired, TypedDict
|
|
8
|
-
|
|
9
|
-
from ....core import BaseTool
|
|
10
|
-
from ....core.base import GenerateJsonSchemaNoTitles, ToolConfig
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class OpenAIRealtimeToolConfig(ToolConfig, total=False):
|
|
14
|
-
"""A tool configuration for OpenAI-specific features."""
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class RealtimeToolParam(TypedDict, total=False):
|
|
18
|
-
type: Literal["function"]
|
|
19
|
-
"""The type of the tool."""
|
|
20
|
-
|
|
21
|
-
name: str
|
|
22
|
-
"""The name of the function."""
|
|
23
|
-
|
|
24
|
-
description: str
|
|
25
|
-
"""The description of the function."""
|
|
26
|
-
|
|
27
|
-
parameters: NotRequired[dict[str, Any]]
|
|
28
|
-
"""Parameters of the function in JSON Schema."""
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class FunctionCallArguments(TypedDict, total=False):
|
|
32
|
-
call_id: str
|
|
33
|
-
"""The ID of the function call."""
|
|
34
|
-
|
|
35
|
-
arguments: str
|
|
36
|
-
"""The arguments that the model called."""
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
class OpenAIRealtimeTool(BaseTool):
|
|
40
|
-
"""A class for defining tools for OpenAI Realtime LLM calls.
|
|
41
|
-
|
|
42
|
-
Example:
|
|
43
|
-
|
|
44
|
-
```python
|
|
45
|
-
from mirascope.beta.openai import Realtime, OpenAIRealtimeTool, Context
|
|
46
|
-
|
|
47
|
-
app = Realtime(
|
|
48
|
-
"gpt-4o-realtime-preview-2024-10-01",
|
|
49
|
-
modalities=["text"],
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
def format_book(title: str, author: str) -> str:
|
|
53
|
-
return f"{title} by {author}"
|
|
54
|
-
|
|
55
|
-
@app.sender(wait_for_text_response=True, tools=[format_book])
|
|
56
|
-
async def send_genre(context: Context) -> str:
|
|
57
|
-
genre = await async_input("Enter a genre: ")
|
|
58
|
-
return f"Recommend a {genre} book"
|
|
59
|
-
|
|
60
|
-
@app.receiver("text")
|
|
61
|
-
async def receive_text(response: str, context: dict[str, Any]) -> None:
|
|
62
|
-
print(f"AI(text): {response}", flush=True)
|
|
63
|
-
|
|
64
|
-
@app.receiver("tool")
|
|
65
|
-
def recommend_book(response: OpenAIRealtimeTool, context: Context) -> None:
|
|
66
|
-
print(response.call())
|
|
67
|
-
```
|
|
68
|
-
"""
|
|
69
|
-
|
|
70
|
-
__provider__ = "openai"
|
|
71
|
-
__tool_config_type__ = OpenAIRealtimeToolConfig
|
|
72
|
-
|
|
73
|
-
tool_call: SkipJsonSchema[FunctionCallArguments]
|
|
74
|
-
|
|
75
|
-
@classmethod
|
|
76
|
-
def tool_schema(cls) -> RealtimeToolParam:
|
|
77
|
-
"""Constructs a JSON Schema tool schema from the `BaseModel` schema defined.
|
|
78
|
-
|
|
79
|
-
Example:
|
|
80
|
-
```python
|
|
81
|
-
from mirascope.beta.openai import OpenAITool
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
def format_book(title: str, author: str) -> str:
|
|
85
|
-
return f"{title} by {author}"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
tool_type = OpenAIRealtimeTool.type_from_fn(format_book)
|
|
89
|
-
print(tool_type.tool_schema()) # prints the OpenAI-specific tool schema
|
|
90
|
-
```
|
|
91
|
-
"""
|
|
92
|
-
|
|
93
|
-
tool = RealtimeToolParam(
|
|
94
|
-
name=cls._name(), description=cls._description(), type="function"
|
|
95
|
-
)
|
|
96
|
-
model_schema = cls.model_json_schema(
|
|
97
|
-
schema_generator=GenerateJsonSchemaNoTitles
|
|
98
|
-
)
|
|
99
|
-
if model_schema["properties"]:
|
|
100
|
-
tool["parameters"] = model_schema
|
|
101
|
-
return tool
|
|
102
|
-
|
|
103
|
-
@classmethod
|
|
104
|
-
def from_tool_call(cls, tool_call: FunctionCallArguments) -> OpenAIRealtimeTool:
|
|
105
|
-
"""Constructs an `OpenAITool` instance from a `tool_call`.
|
|
106
|
-
|
|
107
|
-
Args:
|
|
108
|
-
tool_call: The OpenAI tool call from which to construct this tool instance.
|
|
109
|
-
"""
|
|
110
|
-
model_json = {"tool_call": tool_call.copy()}
|
|
111
|
-
if args := tool_call.get("arguments", None):
|
|
112
|
-
model_json |= jiter.from_json(args.encode())
|
|
113
|
-
return cls.model_validate(model_json)
|
mirascope/beta/rag/__init__.py
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"""A module for interacting with Mirascope RAG."""
|
|
2
|
-
|
|
3
|
-
from .base import (
|
|
4
|
-
BaseChunker,
|
|
5
|
-
BaseEmbedder,
|
|
6
|
-
BaseEmbeddingParams,
|
|
7
|
-
BaseEmbeddingResponse,
|
|
8
|
-
BaseQueryResults,
|
|
9
|
-
BaseVectorStore,
|
|
10
|
-
BaseVectorStoreParams,
|
|
11
|
-
Document,
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
__all__ = [
|
|
15
|
-
"BaseChunker",
|
|
16
|
-
"BaseEmbedder",
|
|
17
|
-
"BaseEmbeddingParams",
|
|
18
|
-
"BaseEmbeddingResponse",
|
|
19
|
-
"BaseQueryResults",
|
|
20
|
-
"BaseVectorStore",
|
|
21
|
-
"BaseVectorStoreParams",
|
|
22
|
-
"Document",
|
|
23
|
-
"TextChunker",
|
|
24
|
-
]
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"""A module for interacting with Mirascope RAG."""
|
|
2
|
-
|
|
3
|
-
from .chunkers import BaseChunker, TextChunker
|
|
4
|
-
from .document import Document
|
|
5
|
-
from .embedders import BaseEmbedder
|
|
6
|
-
from .embedding_params import BaseEmbeddingParams
|
|
7
|
-
from .embedding_response import BaseEmbeddingResponse
|
|
8
|
-
from .query_results import BaseQueryResults
|
|
9
|
-
from .vectorstore_params import BaseVectorStoreParams
|
|
10
|
-
from .vectorstores import BaseVectorStore
|
|
11
|
-
|
|
12
|
-
__all__ = [
|
|
13
|
-
"BaseChunker",
|
|
14
|
-
"BaseEmbedder",
|
|
15
|
-
"BaseEmbeddingParams",
|
|
16
|
-
"BaseEmbeddingResponse",
|
|
17
|
-
"BaseQueryResults",
|
|
18
|
-
"BaseVectorStore",
|
|
19
|
-
"BaseVectorStoreParams",
|
|
20
|
-
"Document",
|
|
21
|
-
"TextChunker",
|
|
22
|
-
]
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"""Chunkers for the RAG module."""
|
|
2
|
-
|
|
3
|
-
from abc import ABC, abstractmethod
|
|
4
|
-
|
|
5
|
-
from pydantic import BaseModel
|
|
6
|
-
|
|
7
|
-
from ..document import Document
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class BaseChunker(BaseModel, ABC):
|
|
11
|
-
"""Base class for chunkers.
|
|
12
|
-
|
|
13
|
-
Example:
|
|
14
|
-
|
|
15
|
-
```python
|
|
16
|
-
from mirascope.rag import BaseChunker, Document
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class TextChunker(BaseChunker):
|
|
20
|
-
chunk_size: int
|
|
21
|
-
chunk_overlap: int
|
|
22
|
-
|
|
23
|
-
def chunk(self, text: str) -> list[Document]:
|
|
24
|
-
chunks: list[Document] = []
|
|
25
|
-
start: int = 0
|
|
26
|
-
while start < len(text):
|
|
27
|
-
end: int = min(start + self.chunk_size, len(text))
|
|
28
|
-
chunks.append(Document(text=text[start:end], id=str(uuid.uuid4())))
|
|
29
|
-
start += self.chunk_size - self.chunk_overlap
|
|
30
|
-
return chunks
|
|
31
|
-
```
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
@abstractmethod
|
|
35
|
-
def chunk(self, text: str) -> list[Document]:
|
|
36
|
-
"""Returns a Document that contains an id, text, and optionally metadata."""
|
|
37
|
-
...
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"""Text chunker for the RAG module"""
|
|
2
|
-
|
|
3
|
-
import uuid
|
|
4
|
-
|
|
5
|
-
from ..document import Document
|
|
6
|
-
from .base_chunker import BaseChunker
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class TextChunker(BaseChunker):
|
|
10
|
-
"""A text chunker that splits a text into chunks of a certain size and overlaps.
|
|
11
|
-
|
|
12
|
-
Example:
|
|
13
|
-
|
|
14
|
-
```python
|
|
15
|
-
from mirascope.rag import TextChunker
|
|
16
|
-
|
|
17
|
-
text_chunker = TextChunker(chunk_size=1000, chunk_overlap=200)
|
|
18
|
-
chunks = text_chunker.chunk("This is a long text that I want to split into chunks.")
|
|
19
|
-
print(chunks)
|
|
20
|
-
```
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
chunk_size: int
|
|
24
|
-
chunk_overlap: int
|
|
25
|
-
|
|
26
|
-
def chunk(self, text: str) -> list[Document]:
|
|
27
|
-
chunks: list[Document] = []
|
|
28
|
-
start: int = 0
|
|
29
|
-
while start < len(text):
|
|
30
|
-
end: int = min(start + self.chunk_size, len(text))
|
|
31
|
-
chunks.append(Document(text=text[start:end], id=str(uuid.uuid4())))
|
|
32
|
-
start += self.chunk_size - self.chunk_overlap
|
|
33
|
-
return chunks
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"""Embedders for the RAG module."""
|
|
2
|
-
|
|
3
|
-
from abc import ABC, abstractmethod
|
|
4
|
-
from typing import ClassVar, Generic, TypeVar
|
|
5
|
-
|
|
6
|
-
from pydantic import BaseModel
|
|
7
|
-
|
|
8
|
-
from .config import BaseConfig
|
|
9
|
-
from .embedding_params import BaseEmbeddingParams
|
|
10
|
-
from .embedding_response import BaseEmbeddingResponse
|
|
11
|
-
|
|
12
|
-
BaseEmbeddingT = TypeVar("BaseEmbeddingT", bound=BaseEmbeddingResponse)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class BaseEmbedder(BaseModel, Generic[BaseEmbeddingT], ABC):
|
|
16
|
-
"""The base class abstract interface for interacting with LLM embeddings."""
|
|
17
|
-
|
|
18
|
-
api_key: ClassVar[str | None] = None
|
|
19
|
-
base_url: ClassVar[str | None] = None
|
|
20
|
-
embedding_params: ClassVar[BaseEmbeddingParams] = BaseEmbeddingParams(
|
|
21
|
-
model="text-embedding-ada-002"
|
|
22
|
-
)
|
|
23
|
-
dimensions: int | None = None
|
|
24
|
-
configuration: ClassVar[BaseConfig] = BaseConfig(llm_ops=[], client_wrappers=[])
|
|
25
|
-
_provider: ClassVar[str] = "base"
|
|
26
|
-
|
|
27
|
-
@abstractmethod
|
|
28
|
-
def embed(self, input: list[str]) -> BaseEmbeddingT:
|
|
29
|
-
"""A call to the embedder with a single input"""
|
|
30
|
-
...
|
|
31
|
-
|
|
32
|
-
@abstractmethod
|
|
33
|
-
async def embed_async(self, input: list[str]) -> BaseEmbeddingT:
|
|
34
|
-
"""Asynchronously call the embedder with a single input"""
|
|
35
|
-
...
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
from typing import Any
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, ConfigDict
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class BaseEmbeddingParams(BaseModel):
|
|
7
|
-
"""The parameters with which to make an embedding."""
|
|
8
|
-
|
|
9
|
-
model: str
|
|
10
|
-
|
|
11
|
-
model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
|
|
12
|
-
|
|
13
|
-
def kwargs(self) -> dict[str, Any]:
|
|
14
|
-
"""Returns all parameters for the embedder as a keyword arguments dictionary."""
|
|
15
|
-
kwargs = {
|
|
16
|
-
key: value for key, value in self.model_dump().items() if value is not None
|
|
17
|
-
}
|
|
18
|
-
return kwargs
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
from abc import ABC, abstractmethod
|
|
2
|
-
from typing import Any, Generic, TypeVar
|
|
3
|
-
|
|
4
|
-
from pydantic import BaseModel, ConfigDict
|
|
5
|
-
|
|
6
|
-
ResponseT = TypeVar("ResponseT", bound=Any)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class BaseEmbeddingResponse(BaseModel, Generic[ResponseT], ABC):
|
|
10
|
-
"""A base abstract interface for LLM embedding responses.
|
|
11
|
-
|
|
12
|
-
Attributes:
|
|
13
|
-
response: The original response from whichever model response this wraps.
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
response: ResponseT
|
|
17
|
-
start_time: float # The start time of the embedding in ms
|
|
18
|
-
end_time: float # The end time of the embedding in ms
|
|
19
|
-
|
|
20
|
-
model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
|
|
21
|
-
|
|
22
|
-
@property
|
|
23
|
-
@abstractmethod
|
|
24
|
-
def embeddings(self) -> list[list[float]] | list[list[int]] | None:
|
|
25
|
-
"""Should return the embedding of the response.
|
|
26
|
-
|
|
27
|
-
If there are multiple choices in a response, this method should select the 0th
|
|
28
|
-
choice and return it's embedding.
|
|
29
|
-
"""
|
|
30
|
-
...
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
from typing import Any
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, ConfigDict
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class BaseVectorStoreParams(BaseModel):
|
|
7
|
-
"""The parameters with which to make a vectorstore."""
|
|
8
|
-
|
|
9
|
-
model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
|
|
10
|
-
|
|
11
|
-
def kwargs(
|
|
12
|
-
self,
|
|
13
|
-
) -> dict[str, Any]:
|
|
14
|
-
"""Returns all parameters for the index as a keyword arguments dictionary."""
|
|
15
|
-
kwargs = {
|
|
16
|
-
key: value for key, value in self.model_dump().items() if value is not None
|
|
17
|
-
}
|
|
18
|
-
return kwargs
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"""Vectorstores for the RAG module."""
|
|
2
|
-
|
|
3
|
-
from abc import ABC, abstractmethod
|
|
4
|
-
from typing import Any, ClassVar, Generic, TypeVar
|
|
5
|
-
|
|
6
|
-
from pydantic import BaseModel
|
|
7
|
-
|
|
8
|
-
from .chunkers import BaseChunker, TextChunker
|
|
9
|
-
from .config import BaseConfig
|
|
10
|
-
from .document import Document
|
|
11
|
-
from .embedders import BaseEmbedder
|
|
12
|
-
from .query_results import BaseQueryResults
|
|
13
|
-
from .vectorstore_params import BaseVectorStoreParams
|
|
14
|
-
|
|
15
|
-
BaseQueryResultsT = TypeVar("BaseQueryResultsT", bound=BaseQueryResults)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class BaseVectorStore(BaseModel, Generic[BaseQueryResultsT], ABC):
|
|
19
|
-
"""The base class abstract interface for interacting with vectorstores."""
|
|
20
|
-
|
|
21
|
-
api_key: ClassVar[str | None] = None
|
|
22
|
-
index_name: ClassVar[str | None] = None
|
|
23
|
-
chunker: ClassVar[BaseChunker] = TextChunker(chunk_size=1000, chunk_overlap=200)
|
|
24
|
-
embedder: ClassVar[BaseEmbedder]
|
|
25
|
-
vectorstore_params: ClassVar[BaseVectorStoreParams] = BaseVectorStoreParams()
|
|
26
|
-
configuration: ClassVar[BaseConfig] = BaseConfig()
|
|
27
|
-
_provider: ClassVar[str] = "base"
|
|
28
|
-
|
|
29
|
-
@abstractmethod
|
|
30
|
-
def retrieve(self, text: str, **kwargs: Any) -> BaseQueryResultsT: # noqa: ANN401
|
|
31
|
-
"""Queries the vectorstore for closest match"""
|
|
32
|
-
...
|
|
33
|
-
|
|
34
|
-
@abstractmethod
|
|
35
|
-
def add(self, text: str | list[Document], **kwargs: Any) -> None: # noqa: ANN401
|
|
36
|
-
"""Takes unstructured data and upserts into vectorstore"""
|
|
37
|
-
...
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"""A module for interacting with Chroma vectorstores."""
|
|
2
|
-
|
|
3
|
-
from .types import ChromaParams, ChromaQueryResult, ChromaSettings
|
|
4
|
-
from .vectorstores import ChromaVectorStore
|
|
5
|
-
|
|
6
|
-
__all__ = [
|
|
7
|
-
"ChromaParams",
|
|
8
|
-
"ChromaQueryResult",
|
|
9
|
-
"ChromaSettings",
|
|
10
|
-
"ChromaVectorStore",
|
|
11
|
-
]
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
"""Types for interacting with Chroma using Mirascope."""
|
|
2
|
-
|
|
3
|
-
from typing import Any, Literal
|
|
4
|
-
|
|
5
|
-
from chromadb import CollectionMetadata
|
|
6
|
-
from chromadb.api.types import URI, Document, IDs, Loadable, Metadata
|
|
7
|
-
from chromadb.config import DEFAULT_DATABASE, DEFAULT_TENANT, Settings
|
|
8
|
-
from chromadb.types import Vector
|
|
9
|
-
from pydantic import BaseModel, ConfigDict
|
|
10
|
-
|
|
11
|
-
from ..base.vectorstore_params import BaseVectorStoreParams
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class ChromaParams(BaseVectorStoreParams):
|
|
15
|
-
metadata: CollectionMetadata | None = None
|
|
16
|
-
get_or_create: bool = False
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class ChromaQueryResult(BaseModel):
|
|
20
|
-
ids: list[IDs]
|
|
21
|
-
embeddings: list[list[Vector]] | None = None
|
|
22
|
-
documents: list[list[Document]] | None = None
|
|
23
|
-
uris: list[list[URI]] | None = None
|
|
24
|
-
data: list[Loadable] | None = None
|
|
25
|
-
metadatas: list[list[Metadata | None]] | None = None
|
|
26
|
-
distances: list[list[float]] | None = None
|
|
27
|
-
|
|
28
|
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class ChromaSettings(BaseModel):
|
|
32
|
-
mode: Literal["http", "persistent", "ephemeral", "cloud"] = "persistent"
|
|
33
|
-
path: str = "./chroma"
|
|
34
|
-
host: str = "localhost"
|
|
35
|
-
port: int = 8000
|
|
36
|
-
ssl: bool = False
|
|
37
|
-
headers: dict[str, str] | None = None
|
|
38
|
-
settings: Settings | None = None
|
|
39
|
-
tenant: str = DEFAULT_TENANT
|
|
40
|
-
database: str = DEFAULT_DATABASE
|
|
41
|
-
api_key: str | None = None
|
|
42
|
-
|
|
43
|
-
model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
|
|
44
|
-
|
|
45
|
-
def kwargs(self) -> dict[str, Any]:
|
|
46
|
-
"""Returns all parameters for the index as a keyword arguments dictionary."""
|
|
47
|
-
if self.mode == "http":
|
|
48
|
-
exclude = {"mode", "path", "api_key"}
|
|
49
|
-
elif self.mode == "persistent":
|
|
50
|
-
exclude = {"mode", "host", "port", "ssl", "headers", "api_key"}
|
|
51
|
-
elif self.mode == "ephemeral":
|
|
52
|
-
exclude = {"mode", "host", "port", "ssl", "headers", "path", "api_key"}
|
|
53
|
-
elif self.mode == "cloud":
|
|
54
|
-
exclude = {"mode", "path", "host", "port", "ssl", "headers"}
|
|
55
|
-
else:
|
|
56
|
-
exclude = {"mode"}
|
|
57
|
-
kwargs = {
|
|
58
|
-
key: value
|
|
59
|
-
for key, value in self.model_dump(exclude=exclude).items()
|
|
60
|
-
if value is not None
|
|
61
|
-
}
|
|
62
|
-
return kwargs
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
"""A module for calling Chroma's Client and Collection."""
|
|
2
|
-
|
|
3
|
-
from functools import cached_property
|
|
4
|
-
from typing import Any, ClassVar, cast
|
|
5
|
-
|
|
6
|
-
from chromadb import (
|
|
7
|
-
CloudClient,
|
|
8
|
-
Collection,
|
|
9
|
-
EphemeralClient,
|
|
10
|
-
HttpClient,
|
|
11
|
-
Metadata,
|
|
12
|
-
PersistentClient,
|
|
13
|
-
)
|
|
14
|
-
from chromadb.api import ClientAPI
|
|
15
|
-
|
|
16
|
-
from ..base.document import Document
|
|
17
|
-
from ..base.vectorstores import BaseVectorStore
|
|
18
|
-
from .types import ChromaParams, ChromaQueryResult, ChromaSettings
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class ChromaVectorStore(BaseVectorStore):
|
|
22
|
-
"""A vectorstore for Chroma.
|
|
23
|
-
|
|
24
|
-
Example:
|
|
25
|
-
|
|
26
|
-
```python
|
|
27
|
-
from mirascope.beta.rag.chroma import ChromaSettings, ChromaVectorStore
|
|
28
|
-
from mirascope.beta.rag.openai import OpenAIEmbedder
|
|
29
|
-
from mirascope.beta.rag import TextChunker
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# Local persistent storage
|
|
33
|
-
class MyStore(ChromaVectorStore):
|
|
34
|
-
embedder = OpenAIEmbedder()
|
|
35
|
-
chunker = TextChunker(chunk_size=1000, chunk_overlap=200)
|
|
36
|
-
index_name = "my-store-0001"
|
|
37
|
-
client_settings = ChromaSettings()
|
|
38
|
-
|
|
39
|
-
# Cloud mode with CloudClient authentication
|
|
40
|
-
class MyCloudStore(ChromaVectorStore):
|
|
41
|
-
embedder = OpenAIEmbedder()
|
|
42
|
-
chunker = TextChunker(chunk_size=1000, chunk_overlap=200)
|
|
43
|
-
index_name = "my-cloud-store-0001"
|
|
44
|
-
client_settings = ChromaSettings(
|
|
45
|
-
mode="cloud",
|
|
46
|
-
api_key="your-api-key",
|
|
47
|
-
tenant="your-tenant",
|
|
48
|
-
database="your-database",
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
my_store = MyStore()
|
|
52
|
-
with open(f"{PATH_TO_FILE}") as file:
|
|
53
|
-
data = file.read()
|
|
54
|
-
my_store.add(data)
|
|
55
|
-
documents = my_store.retrieve("my question").documents
|
|
56
|
-
print(documents)
|
|
57
|
-
```
|
|
58
|
-
"""
|
|
59
|
-
|
|
60
|
-
vectorstore_params = ChromaParams(get_or_create=True)
|
|
61
|
-
client_settings: ClassVar[ChromaSettings] = ChromaSettings(mode="persistent")
|
|
62
|
-
_provider: ClassVar[str] = "chroma"
|
|
63
|
-
|
|
64
|
-
def retrieve(
|
|
65
|
-
self,
|
|
66
|
-
text: str | list[str] | None = None,
|
|
67
|
-
**kwargs: Any, # noqa: ANN401
|
|
68
|
-
) -> ChromaQueryResult:
|
|
69
|
-
"""Queries the vectorstore for closest match"""
|
|
70
|
-
if text:
|
|
71
|
-
if isinstance(text, str):
|
|
72
|
-
text = [text]
|
|
73
|
-
query_result = self._index.query(query_texts=text, **kwargs)
|
|
74
|
-
else:
|
|
75
|
-
query_result = self._index.query(**kwargs)
|
|
76
|
-
|
|
77
|
-
return ChromaQueryResult.model_validate(query_result)
|
|
78
|
-
|
|
79
|
-
def add(self, text: str | list[Document], **kwargs: Any) -> None: # noqa: ANN401
|
|
80
|
-
"""Takes unstructured data and upserts into vectorstore"""
|
|
81
|
-
documents: list[Document]
|
|
82
|
-
if isinstance(text, str):
|
|
83
|
-
chunk = self.chunker.chunk
|
|
84
|
-
documents = chunk(text)
|
|
85
|
-
else:
|
|
86
|
-
documents = text
|
|
87
|
-
|
|
88
|
-
return self._index.upsert(
|
|
89
|
-
ids=[document.id for document in documents],
|
|
90
|
-
documents=[document.text for document in documents],
|
|
91
|
-
metadatas=[cast(Metadata, document.metadata) for document in documents],
|
|
92
|
-
**kwargs,
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
############################# PRIVATE PROPERTIES #################################
|
|
96
|
-
|
|
97
|
-
@cached_property
|
|
98
|
-
def _client(self) -> ClientAPI:
|
|
99
|
-
if self.client_settings.mode == "persistent":
|
|
100
|
-
return PersistentClient(**self.client_settings.kwargs())
|
|
101
|
-
elif self.client_settings.mode == "http":
|
|
102
|
-
return HttpClient(**self.client_settings.kwargs())
|
|
103
|
-
elif self.client_settings.mode == "ephemeral":
|
|
104
|
-
return EphemeralClient(**self.client_settings.kwargs())
|
|
105
|
-
elif self.client_settings.mode == "cloud":
|
|
106
|
-
return CloudClient(**self.client_settings.kwargs())
|
|
107
|
-
else:
|
|
108
|
-
raise ValueError(f"Unsupported client mode: {self.client_settings.mode}")
|
|
109
|
-
|
|
110
|
-
@cached_property
|
|
111
|
-
def _index(self) -> Collection:
|
|
112
|
-
vectorstore_params = self.vectorstore_params
|
|
113
|
-
if self.index_name:
|
|
114
|
-
vectorstore_params = self.vectorstore_params.model_copy(
|
|
115
|
-
update={"name": self.index_name}
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
return self._client.create_collection(
|
|
119
|
-
**vectorstore_params.kwargs(),
|
|
120
|
-
embedding_function=self.embedder, # type: ignore[arg-type]
|
|
121
|
-
)
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"""A module for interacting with Cohere chat models."""
|
|
2
|
-
|
|
3
|
-
from .embedders import CohereEmbedder
|
|
4
|
-
from .embedding_params import CohereEmbeddingParams
|
|
5
|
-
from .embedding_response import CohereEmbeddingResponse
|
|
6
|
-
|
|
7
|
-
__all__ = [
|
|
8
|
-
"CohereEmbedder",
|
|
9
|
-
"CohereEmbeddingParams",
|
|
10
|
-
"CohereEmbeddingResponse",
|
|
11
|
-
]
|