mirascope 1.25.7__py3-none-any.whl → 2.0.0a0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mirascope/__init__.py +3 -59
- mirascope/graphs/__init__.py +22 -0
- mirascope/{experimental/graphs → graphs}/finite_state_machine.py +70 -159
- mirascope/llm/__init__.py +206 -16
- mirascope/llm/agents/__init__.py +15 -0
- mirascope/llm/agents/agent.py +97 -0
- mirascope/llm/agents/agent_template.py +45 -0
- mirascope/llm/agents/decorator.py +176 -0
- mirascope/llm/calls/__init__.py +16 -0
- mirascope/llm/calls/base_call.py +33 -0
- mirascope/llm/calls/calls.py +315 -0
- mirascope/llm/calls/decorator.py +255 -0
- mirascope/llm/clients/__init__.py +34 -0
- mirascope/llm/clients/anthropic/__init__.py +11 -0
- mirascope/llm/clients/anthropic/_utils/__init__.py +13 -0
- mirascope/llm/clients/anthropic/_utils/decode.py +244 -0
- mirascope/llm/clients/anthropic/_utils/encode.py +243 -0
- mirascope/llm/clients/anthropic/clients.py +819 -0
- mirascope/llm/clients/anthropic/model_ids.py +8 -0
- mirascope/llm/clients/base/__init__.py +15 -0
- mirascope/llm/clients/base/_utils.py +192 -0
- mirascope/llm/clients/base/client.py +1256 -0
- mirascope/llm/clients/base/kwargs.py +12 -0
- mirascope/llm/clients/base/params.py +93 -0
- mirascope/llm/clients/google/__init__.py +6 -0
- mirascope/llm/clients/google/_utils/__init__.py +13 -0
- mirascope/llm/clients/google/_utils/decode.py +231 -0
- mirascope/llm/clients/google/_utils/encode.py +279 -0
- mirascope/llm/clients/google/clients.py +853 -0
- mirascope/llm/clients/google/message.py +7 -0
- mirascope/llm/clients/google/model_ids.py +15 -0
- mirascope/llm/clients/openai/__init__.py +25 -0
- mirascope/llm/clients/openai/completions/__init__.py +9 -0
- mirascope/llm/clients/openai/completions/_utils/__init__.py +13 -0
- mirascope/llm/clients/openai/completions/_utils/decode.py +187 -0
- mirascope/llm/clients/openai/completions/_utils/encode.py +358 -0
- mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
- mirascope/llm/clients/openai/completions/clients.py +833 -0
- mirascope/llm/clients/openai/completions/model_ids.py +8 -0
- mirascope/llm/clients/openai/responses/__init__.py +9 -0
- mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
- mirascope/llm/clients/openai/responses/_utils/decode.py +194 -0
- mirascope/llm/clients/openai/responses/_utils/encode.py +333 -0
- mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
- mirascope/llm/clients/openai/responses/clients.py +832 -0
- mirascope/llm/clients/openai/responses/model_ids.py +8 -0
- mirascope/llm/clients/openai/shared/__init__.py +7 -0
- mirascope/llm/clients/openai/shared/_utils.py +55 -0
- mirascope/llm/clients/providers.py +175 -0
- mirascope/llm/content/__init__.py +70 -0
- mirascope/llm/content/audio.py +173 -0
- mirascope/llm/content/document.py +94 -0
- mirascope/llm/content/image.py +206 -0
- mirascope/llm/content/text.py +47 -0
- mirascope/llm/content/thought.py +58 -0
- mirascope/llm/content/tool_call.py +63 -0
- mirascope/llm/content/tool_output.py +26 -0
- mirascope/llm/context/__init__.py +6 -0
- mirascope/llm/context/_utils.py +28 -0
- mirascope/llm/context/context.py +24 -0
- mirascope/llm/exceptions.py +105 -0
- mirascope/llm/formatting/__init__.py +22 -0
- mirascope/llm/formatting/_utils.py +74 -0
- mirascope/llm/formatting/format.py +104 -0
- mirascope/llm/formatting/from_call_args.py +30 -0
- mirascope/llm/formatting/partial.py +58 -0
- mirascope/llm/formatting/types.py +109 -0
- mirascope/llm/mcp/__init__.py +5 -0
- mirascope/llm/mcp/client.py +118 -0
- mirascope/llm/messages/__init__.py +32 -0
- mirascope/llm/messages/message.py +182 -0
- mirascope/llm/models/__init__.py +16 -0
- mirascope/llm/models/models.py +1243 -0
- mirascope/llm/prompts/__init__.py +33 -0
- mirascope/llm/prompts/_utils.py +60 -0
- mirascope/llm/prompts/decorator.py +286 -0
- mirascope/llm/prompts/protocols.py +99 -0
- mirascope/llm/responses/__init__.py +57 -0
- mirascope/llm/responses/_utils.py +56 -0
- mirascope/llm/responses/base_response.py +91 -0
- mirascope/llm/responses/base_stream_response.py +697 -0
- mirascope/llm/responses/finish_reason.py +27 -0
- mirascope/llm/responses/response.py +345 -0
- mirascope/llm/responses/root_response.py +177 -0
- mirascope/llm/responses/stream_response.py +572 -0
- mirascope/llm/responses/streams.py +363 -0
- mirascope/llm/tools/__init__.py +40 -0
- mirascope/llm/tools/_utils.py +25 -0
- mirascope/llm/tools/decorator.py +175 -0
- mirascope/llm/tools/protocols.py +96 -0
- mirascope/llm/tools/tool_schema.py +246 -0
- mirascope/llm/tools/toolkit.py +152 -0
- mirascope/llm/tools/tools.py +169 -0
- mirascope/llm/types/__init__.py +22 -0
- mirascope/llm/types/dataclass.py +9 -0
- mirascope/llm/types/jsonable.py +44 -0
- mirascope/llm/types/type_vars.py +19 -0
- mirascope-2.0.0a0.dist-info/METADATA +117 -0
- mirascope-2.0.0a0.dist-info/RECORD +101 -0
- mirascope/beta/__init__.py +0 -3
- mirascope/beta/openai/__init__.py +0 -17
- mirascope/beta/openai/realtime/__init__.py +0 -13
- mirascope/beta/openai/realtime/_utils/__init__.py +0 -3
- mirascope/beta/openai/realtime/_utils/_audio.py +0 -74
- mirascope/beta/openai/realtime/_utils/_protocols.py +0 -50
- mirascope/beta/openai/realtime/realtime.py +0 -500
- mirascope/beta/openai/realtime/recording.py +0 -98
- mirascope/beta/openai/realtime/tool.py +0 -113
- mirascope/beta/rag/__init__.py +0 -24
- mirascope/beta/rag/base/__init__.py +0 -22
- mirascope/beta/rag/base/chunkers/__init__.py +0 -2
- mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
- mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
- mirascope/beta/rag/base/config.py +0 -8
- mirascope/beta/rag/base/document.py +0 -11
- mirascope/beta/rag/base/embedders.py +0 -35
- mirascope/beta/rag/base/embedding_params.py +0 -18
- mirascope/beta/rag/base/embedding_response.py +0 -30
- mirascope/beta/rag/base/query_results.py +0 -7
- mirascope/beta/rag/base/vectorstore_params.py +0 -18
- mirascope/beta/rag/base/vectorstores.py +0 -37
- mirascope/beta/rag/chroma/__init__.py +0 -11
- mirascope/beta/rag/chroma/types.py +0 -62
- mirascope/beta/rag/chroma/vectorstores.py +0 -121
- mirascope/beta/rag/cohere/__init__.py +0 -11
- mirascope/beta/rag/cohere/embedders.py +0 -87
- mirascope/beta/rag/cohere/embedding_params.py +0 -29
- mirascope/beta/rag/cohere/embedding_response.py +0 -29
- mirascope/beta/rag/cohere/py.typed +0 -0
- mirascope/beta/rag/openai/__init__.py +0 -11
- mirascope/beta/rag/openai/embedders.py +0 -144
- mirascope/beta/rag/openai/embedding_params.py +0 -18
- mirascope/beta/rag/openai/embedding_response.py +0 -14
- mirascope/beta/rag/openai/py.typed +0 -0
- mirascope/beta/rag/pinecone/__init__.py +0 -19
- mirascope/beta/rag/pinecone/types.py +0 -143
- mirascope/beta/rag/pinecone/vectorstores.py +0 -148
- mirascope/beta/rag/weaviate/__init__.py +0 -6
- mirascope/beta/rag/weaviate/types.py +0 -92
- mirascope/beta/rag/weaviate/vectorstores.py +0 -103
- mirascope/core/__init__.py +0 -109
- mirascope/core/anthropic/__init__.py +0 -31
- mirascope/core/anthropic/_call.py +0 -67
- mirascope/core/anthropic/_call_kwargs.py +0 -13
- mirascope/core/anthropic/_thinking.py +0 -70
- mirascope/core/anthropic/_utils/__init__.py +0 -16
- mirascope/core/anthropic/_utils/_convert_common_call_params.py +0 -25
- mirascope/core/anthropic/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/anthropic/_utils/_convert_message_params.py +0 -102
- mirascope/core/anthropic/_utils/_get_json_output.py +0 -31
- mirascope/core/anthropic/_utils/_handle_stream.py +0 -113
- mirascope/core/anthropic/_utils/_message_param_converter.py +0 -154
- mirascope/core/anthropic/_utils/_setup_call.py +0 -146
- mirascope/core/anthropic/call_params.py +0 -44
- mirascope/core/anthropic/call_response.py +0 -226
- mirascope/core/anthropic/call_response_chunk.py +0 -152
- mirascope/core/anthropic/dynamic_config.py +0 -40
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -204
- mirascope/core/anthropic/tool.py +0 -101
- mirascope/core/azure/__init__.py +0 -31
- mirascope/core/azure/_call.py +0 -67
- mirascope/core/azure/_call_kwargs.py +0 -13
- mirascope/core/azure/_utils/__init__.py +0 -14
- mirascope/core/azure/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/azure/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/azure/_utils/_convert_message_params.py +0 -121
- mirascope/core/azure/_utils/_get_credential.py +0 -33
- mirascope/core/azure/_utils/_get_json_output.py +0 -27
- mirascope/core/azure/_utils/_handle_stream.py +0 -130
- mirascope/core/azure/_utils/_message_param_converter.py +0 -117
- mirascope/core/azure/_utils/_setup_call.py +0 -183
- mirascope/core/azure/call_params.py +0 -59
- mirascope/core/azure/call_response.py +0 -215
- mirascope/core/azure/call_response_chunk.py +0 -105
- mirascope/core/azure/dynamic_config.py +0 -30
- mirascope/core/azure/py.typed +0 -0
- mirascope/core/azure/stream.py +0 -147
- mirascope/core/azure/tool.py +0 -93
- mirascope/core/base/__init__.py +0 -86
- mirascope/core/base/_call_factory.py +0 -256
- mirascope/core/base/_create.py +0 -253
- mirascope/core/base/_extract.py +0 -175
- mirascope/core/base/_extract_with_tools.py +0 -189
- mirascope/core/base/_partial.py +0 -95
- mirascope/core/base/_utils/__init__.py +0 -92
- mirascope/core/base/_utils/_base_message_param_converter.py +0 -22
- mirascope/core/base/_utils/_base_type.py +0 -26
- mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -48
- mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
- mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -139
- mirascope/core/base/_utils/_convert_messages_to_message_params.py +0 -178
- mirascope/core/base/_utils/_convert_provider_finish_reason_to_finish_reason.py +0 -20
- mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
- mirascope/core/base/_utils/_extract_tool_return.py +0 -42
- mirascope/core/base/_utils/_fn_is_async.py +0 -24
- mirascope/core/base/_utils/_format_template.py +0 -32
- mirascope/core/base/_utils/_get_audio_type.py +0 -18
- mirascope/core/base/_utils/_get_common_usage.py +0 -20
- mirascope/core/base/_utils/_get_create_fn_or_async_create_fn.py +0 -137
- mirascope/core/base/_utils/_get_document_type.py +0 -7
- mirascope/core/base/_utils/_get_dynamic_configuration.py +0 -69
- mirascope/core/base/_utils/_get_fields_from_call_args.py +0 -34
- mirascope/core/base/_utils/_get_fn_args.py +0 -23
- mirascope/core/base/_utils/_get_image_dimensions.py +0 -39
- mirascope/core/base/_utils/_get_image_type.py +0 -26
- mirascope/core/base/_utils/_get_metadata.py +0 -17
- mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
- mirascope/core/base/_utils/_get_prompt_template.py +0 -28
- mirascope/core/base/_utils/_get_template_values.py +0 -51
- mirascope/core/base/_utils/_get_template_variables.py +0 -38
- mirascope/core/base/_utils/_get_unsupported_tool_config_keys.py +0 -10
- mirascope/core/base/_utils/_is_prompt_template.py +0 -24
- mirascope/core/base/_utils/_json_mode_content.py +0 -17
- mirascope/core/base/_utils/_messages_decorator.py +0 -121
- mirascope/core/base/_utils/_parse_content_template.py +0 -323
- mirascope/core/base/_utils/_parse_prompt_messages.py +0 -63
- mirascope/core/base/_utils/_pil_image_to_bytes.py +0 -13
- mirascope/core/base/_utils/_protocols.py +0 -901
- mirascope/core/base/_utils/_setup_call.py +0 -79
- mirascope/core/base/_utils/_setup_extract_tool.py +0 -30
- mirascope/core/base/call_kwargs.py +0 -13
- mirascope/core/base/call_params.py +0 -36
- mirascope/core/base/call_response.py +0 -338
- mirascope/core/base/call_response_chunk.py +0 -130
- mirascope/core/base/dynamic_config.py +0 -82
- mirascope/core/base/from_call_args.py +0 -30
- mirascope/core/base/merge_decorators.py +0 -59
- mirascope/core/base/message_param.py +0 -175
- mirascope/core/base/messages.py +0 -116
- mirascope/core/base/metadata.py +0 -13
- mirascope/core/base/prompt.py +0 -497
- mirascope/core/base/response_model_config_dict.py +0 -9
- mirascope/core/base/stream.py +0 -479
- mirascope/core/base/stream_config.py +0 -11
- mirascope/core/base/structured_stream.py +0 -296
- mirascope/core/base/tool.py +0 -214
- mirascope/core/base/toolkit.py +0 -176
- mirascope/core/base/types.py +0 -344
- mirascope/core/bedrock/__init__.py +0 -34
- mirascope/core/bedrock/_call.py +0 -68
- mirascope/core/bedrock/_call_kwargs.py +0 -12
- mirascope/core/bedrock/_types.py +0 -104
- mirascope/core/bedrock/_utils/__init__.py +0 -14
- mirascope/core/bedrock/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/bedrock/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/bedrock/_utils/_convert_message_params.py +0 -111
- mirascope/core/bedrock/_utils/_get_json_output.py +0 -30
- mirascope/core/bedrock/_utils/_handle_stream.py +0 -104
- mirascope/core/bedrock/_utils/_message_param_converter.py +0 -172
- mirascope/core/bedrock/_utils/_setup_call.py +0 -258
- mirascope/core/bedrock/call_params.py +0 -38
- mirascope/core/bedrock/call_response.py +0 -248
- mirascope/core/bedrock/call_response_chunk.py +0 -111
- mirascope/core/bedrock/dynamic_config.py +0 -37
- mirascope/core/bedrock/py.typed +0 -0
- mirascope/core/bedrock/stream.py +0 -154
- mirascope/core/bedrock/tool.py +0 -100
- mirascope/core/cohere/__init__.py +0 -30
- mirascope/core/cohere/_call.py +0 -67
- mirascope/core/cohere/_call_kwargs.py +0 -11
- mirascope/core/cohere/_types.py +0 -20
- mirascope/core/cohere/_utils/__init__.py +0 -14
- mirascope/core/cohere/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/cohere/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -24
- mirascope/core/cohere/_utils/_convert_message_params.py +0 -32
- mirascope/core/cohere/_utils/_get_json_output.py +0 -30
- mirascope/core/cohere/_utils/_handle_stream.py +0 -35
- mirascope/core/cohere/_utils/_message_param_converter.py +0 -54
- mirascope/core/cohere/_utils/_setup_call.py +0 -150
- mirascope/core/cohere/call_params.py +0 -62
- mirascope/core/cohere/call_response.py +0 -205
- mirascope/core/cohere/call_response_chunk.py +0 -125
- mirascope/core/cohere/dynamic_config.py +0 -32
- mirascope/core/cohere/py.typed +0 -0
- mirascope/core/cohere/stream.py +0 -113
- mirascope/core/cohere/tool.py +0 -93
- mirascope/core/costs/__init__.py +0 -5
- mirascope/core/costs/_anthropic_calculate_cost.py +0 -219
- mirascope/core/costs/_azure_calculate_cost.py +0 -11
- mirascope/core/costs/_bedrock_calculate_cost.py +0 -15
- mirascope/core/costs/_cohere_calculate_cost.py +0 -44
- mirascope/core/costs/_gemini_calculate_cost.py +0 -67
- mirascope/core/costs/_google_calculate_cost.py +0 -427
- mirascope/core/costs/_groq_calculate_cost.py +0 -156
- mirascope/core/costs/_litellm_calculate_cost.py +0 -11
- mirascope/core/costs/_mistral_calculate_cost.py +0 -64
- mirascope/core/costs/_openai_calculate_cost.py +0 -416
- mirascope/core/costs/_vertex_calculate_cost.py +0 -67
- mirascope/core/costs/_xai_calculate_cost.py +0 -104
- mirascope/core/costs/calculate_cost.py +0 -86
- mirascope/core/gemini/__init__.py +0 -40
- mirascope/core/gemini/_call.py +0 -67
- mirascope/core/gemini/_call_kwargs.py +0 -12
- mirascope/core/gemini/_utils/__init__.py +0 -14
- mirascope/core/gemini/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/gemini/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/gemini/_utils/_convert_message_params.py +0 -156
- mirascope/core/gemini/_utils/_get_json_output.py +0 -35
- mirascope/core/gemini/_utils/_handle_stream.py +0 -33
- mirascope/core/gemini/_utils/_message_param_converter.py +0 -209
- mirascope/core/gemini/_utils/_setup_call.py +0 -149
- mirascope/core/gemini/call_params.py +0 -52
- mirascope/core/gemini/call_response.py +0 -216
- mirascope/core/gemini/call_response_chunk.py +0 -100
- mirascope/core/gemini/dynamic_config.py +0 -26
- mirascope/core/gemini/stream.py +0 -120
- mirascope/core/gemini/tool.py +0 -104
- mirascope/core/google/__init__.py +0 -29
- mirascope/core/google/_call.py +0 -67
- mirascope/core/google/_call_kwargs.py +0 -13
- mirascope/core/google/_utils/__init__.py +0 -14
- mirascope/core/google/_utils/_convert_common_call_params.py +0 -38
- mirascope/core/google/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -27
- mirascope/core/google/_utils/_convert_message_params.py +0 -297
- mirascope/core/google/_utils/_get_json_output.py +0 -37
- mirascope/core/google/_utils/_handle_stream.py +0 -58
- mirascope/core/google/_utils/_message_param_converter.py +0 -200
- mirascope/core/google/_utils/_setup_call.py +0 -201
- mirascope/core/google/_utils/_validate_media_type.py +0 -58
- mirascope/core/google/call_params.py +0 -22
- mirascope/core/google/call_response.py +0 -255
- mirascope/core/google/call_response_chunk.py +0 -135
- mirascope/core/google/dynamic_config.py +0 -26
- mirascope/core/google/stream.py +0 -199
- mirascope/core/google/tool.py +0 -146
- mirascope/core/groq/__init__.py +0 -30
- mirascope/core/groq/_call.py +0 -67
- mirascope/core/groq/_call_kwargs.py +0 -13
- mirascope/core/groq/_utils/__init__.py +0 -14
- mirascope/core/groq/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/groq/_utils/_convert_message_params.py +0 -112
- mirascope/core/groq/_utils/_get_json_output.py +0 -27
- mirascope/core/groq/_utils/_handle_stream.py +0 -123
- mirascope/core/groq/_utils/_message_param_converter.py +0 -89
- mirascope/core/groq/_utils/_setup_call.py +0 -132
- mirascope/core/groq/call_params.py +0 -52
- mirascope/core/groq/call_response.py +0 -213
- mirascope/core/groq/call_response_chunk.py +0 -104
- mirascope/core/groq/dynamic_config.py +0 -29
- mirascope/core/groq/py.typed +0 -0
- mirascope/core/groq/stream.py +0 -135
- mirascope/core/groq/tool.py +0 -80
- mirascope/core/litellm/__init__.py +0 -28
- mirascope/core/litellm/_call.py +0 -67
- mirascope/core/litellm/_utils/__init__.py +0 -5
- mirascope/core/litellm/_utils/_setup_call.py +0 -109
- mirascope/core/litellm/call_params.py +0 -10
- mirascope/core/litellm/call_response.py +0 -24
- mirascope/core/litellm/call_response_chunk.py +0 -14
- mirascope/core/litellm/dynamic_config.py +0 -8
- mirascope/core/litellm/py.typed +0 -0
- mirascope/core/litellm/stream.py +0 -86
- mirascope/core/litellm/tool.py +0 -13
- mirascope/core/mistral/__init__.py +0 -36
- mirascope/core/mistral/_call.py +0 -65
- mirascope/core/mistral/_call_kwargs.py +0 -19
- mirascope/core/mistral/_utils/__init__.py +0 -14
- mirascope/core/mistral/_utils/_convert_common_call_params.py +0 -24
- mirascope/core/mistral/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -22
- mirascope/core/mistral/_utils/_convert_message_params.py +0 -122
- mirascope/core/mistral/_utils/_get_json_output.py +0 -34
- mirascope/core/mistral/_utils/_handle_stream.py +0 -139
- mirascope/core/mistral/_utils/_message_param_converter.py +0 -176
- mirascope/core/mistral/_utils/_setup_call.py +0 -164
- mirascope/core/mistral/call_params.py +0 -36
- mirascope/core/mistral/call_response.py +0 -205
- mirascope/core/mistral/call_response_chunk.py +0 -105
- mirascope/core/mistral/dynamic_config.py +0 -33
- mirascope/core/mistral/py.typed +0 -0
- mirascope/core/mistral/stream.py +0 -120
- mirascope/core/mistral/tool.py +0 -81
- mirascope/core/openai/__init__.py +0 -31
- mirascope/core/openai/_call.py +0 -67
- mirascope/core/openai/_call_kwargs.py +0 -13
- mirascope/core/openai/_utils/__init__.py +0 -14
- mirascope/core/openai/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/openai/_utils/_convert_message_params.py +0 -148
- mirascope/core/openai/_utils/_get_json_output.py +0 -31
- mirascope/core/openai/_utils/_handle_stream.py +0 -138
- mirascope/core/openai/_utils/_message_param_converter.py +0 -105
- mirascope/core/openai/_utils/_setup_call.py +0 -155
- mirascope/core/openai/call_params.py +0 -92
- mirascope/core/openai/call_response.py +0 -273
- mirascope/core/openai/call_response_chunk.py +0 -139
- mirascope/core/openai/dynamic_config.py +0 -34
- mirascope/core/openai/py.typed +0 -0
- mirascope/core/openai/stream.py +0 -185
- mirascope/core/openai/tool.py +0 -101
- mirascope/core/py.typed +0 -0
- mirascope/core/vertex/__init__.py +0 -45
- mirascope/core/vertex/_call.py +0 -62
- mirascope/core/vertex/_call_kwargs.py +0 -12
- mirascope/core/vertex/_utils/__init__.py +0 -14
- mirascope/core/vertex/_utils/_convert_common_call_params.py +0 -37
- mirascope/core/vertex/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/vertex/_utils/_convert_message_params.py +0 -171
- mirascope/core/vertex/_utils/_get_json_output.py +0 -36
- mirascope/core/vertex/_utils/_handle_stream.py +0 -33
- mirascope/core/vertex/_utils/_message_param_converter.py +0 -133
- mirascope/core/vertex/_utils/_setup_call.py +0 -160
- mirascope/core/vertex/call_params.py +0 -24
- mirascope/core/vertex/call_response.py +0 -206
- mirascope/core/vertex/call_response_chunk.py +0 -99
- mirascope/core/vertex/dynamic_config.py +0 -28
- mirascope/core/vertex/stream.py +0 -119
- mirascope/core/vertex/tool.py +0 -101
- mirascope/core/xai/__init__.py +0 -28
- mirascope/core/xai/_call.py +0 -67
- mirascope/core/xai/_utils/__init__.py +0 -5
- mirascope/core/xai/_utils/_setup_call.py +0 -113
- mirascope/core/xai/call_params.py +0 -10
- mirascope/core/xai/call_response.py +0 -16
- mirascope/core/xai/call_response_chunk.py +0 -14
- mirascope/core/xai/dynamic_config.py +0 -8
- mirascope/core/xai/py.typed +0 -0
- mirascope/core/xai/stream.py +0 -57
- mirascope/core/xai/tool.py +0 -13
- mirascope/experimental/graphs/__init__.py +0 -5
- mirascope/integrations/__init__.py +0 -16
- mirascope/integrations/_middleware_factory.py +0 -403
- mirascope/integrations/langfuse/__init__.py +0 -3
- mirascope/integrations/langfuse/_utils.py +0 -114
- mirascope/integrations/langfuse/_with_langfuse.py +0 -70
- mirascope/integrations/logfire/__init__.py +0 -3
- mirascope/integrations/logfire/_utils.py +0 -225
- mirascope/integrations/logfire/_with_logfire.py +0 -63
- mirascope/integrations/otel/__init__.py +0 -10
- mirascope/integrations/otel/_utils.py +0 -270
- mirascope/integrations/otel/_with_hyperdx.py +0 -60
- mirascope/integrations/otel/_with_otel.py +0 -59
- mirascope/integrations/tenacity.py +0 -14
- mirascope/llm/_call.py +0 -401
- mirascope/llm/_context.py +0 -384
- mirascope/llm/_override.py +0 -3639
- mirascope/llm/_protocols.py +0 -500
- mirascope/llm/_response_metaclass.py +0 -31
- mirascope/llm/call_response.py +0 -158
- mirascope/llm/call_response_chunk.py +0 -66
- mirascope/llm/stream.py +0 -162
- mirascope/llm/tool.py +0 -64
- mirascope/mcp/__init__.py +0 -7
- mirascope/mcp/_utils.py +0 -288
- mirascope/mcp/client.py +0 -167
- mirascope/mcp/server.py +0 -356
- mirascope/mcp/tools.py +0 -110
- mirascope/py.typed +0 -0
- mirascope/retries/__init__.py +0 -11
- mirascope/retries/fallback.py +0 -131
- mirascope/retries/tenacity.py +0 -50
- mirascope/tools/__init__.py +0 -37
- mirascope/tools/base.py +0 -98
- mirascope/tools/system/__init__.py +0 -0
- mirascope/tools/system/_docker_operation.py +0 -166
- mirascope/tools/system/_file_system.py +0 -267
- mirascope/tools/web/__init__.py +0 -0
- mirascope/tools/web/_duckduckgo.py +0 -111
- mirascope/tools/web/_httpx.py +0 -125
- mirascope/tools/web/_parse_url_content.py +0 -94
- mirascope/tools/web/_requests.py +0 -54
- mirascope/v0/__init__.py +0 -43
- mirascope/v0/anthropic.py +0 -54
- mirascope/v0/base/__init__.py +0 -12
- mirascope/v0/base/calls.py +0 -118
- mirascope/v0/base/extractors.py +0 -122
- mirascope/v0/base/ops_utils.py +0 -207
- mirascope/v0/base/prompts.py +0 -48
- mirascope/v0/base/types.py +0 -14
- mirascope/v0/base/utils.py +0 -21
- mirascope/v0/openai.py +0 -54
- mirascope-1.25.7.dist-info/METADATA +0 -169
- mirascope-1.25.7.dist-info/RECORD +0 -378
- {mirascope-1.25.7.dist-info → mirascope-2.0.0a0.dist-info}/WHEEL +0 -0
- {mirascope-1.25.7.dist-info → mirascope-2.0.0a0.dist-info}/licenses/LICENSE +0 -0
mirascope/mcp/client.py
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
"""The `MCPServer` Class and context managers."""
|
|
2
|
-
|
|
3
|
-
import contextlib
|
|
4
|
-
from collections.abc import AsyncIterator, Awaitable, Callable
|
|
5
|
-
from datetime import timedelta
|
|
6
|
-
from typing import Any
|
|
7
|
-
|
|
8
|
-
from mcp import ClientSession
|
|
9
|
-
from mcp.client.session import ListRootsFnT, SamplingFnT
|
|
10
|
-
from mcp.client.sse import sse_client as mcp_sse_client
|
|
11
|
-
from mcp.client.stdio import StdioServerParameters
|
|
12
|
-
from mcp.client.stdio import stdio_client as mcp_stdio_client
|
|
13
|
-
from mcp.types import (
|
|
14
|
-
BlobResourceContents,
|
|
15
|
-
Resource,
|
|
16
|
-
)
|
|
17
|
-
from pydantic import AnyUrl
|
|
18
|
-
|
|
19
|
-
from mirascope.core import BaseMessageParam, BaseTool, TextPart
|
|
20
|
-
from mirascope.mcp import _utils
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class MCPClient(ClientSession):
|
|
24
|
-
"""The SSE client session that connects to the MCP server.
|
|
25
|
-
|
|
26
|
-
All of the results from the server are converted into Mirascope-friendly types.
|
|
27
|
-
"""
|
|
28
|
-
|
|
29
|
-
_session: ClientSession
|
|
30
|
-
|
|
31
|
-
def __init__(self, session: ClientSession) -> None:
|
|
32
|
-
"""Initializes an instance of `MCPClient`.
|
|
33
|
-
|
|
34
|
-
Args:
|
|
35
|
-
session: The original MCP `ClientSession`.
|
|
36
|
-
"""
|
|
37
|
-
self._session = session
|
|
38
|
-
|
|
39
|
-
async def list_resources(self) -> list[Resource]: # pyright: ignore [reportIncompatibleMethodOverride]
|
|
40
|
-
"""List all resources available on the MCP server.
|
|
41
|
-
|
|
42
|
-
Returns:
|
|
43
|
-
A list of Resource objects
|
|
44
|
-
"""
|
|
45
|
-
result = await self._session.list_resources()
|
|
46
|
-
return result.resources
|
|
47
|
-
|
|
48
|
-
async def read_resource( # pyright: ignore [reportIncompatibleMethodOverride]
|
|
49
|
-
self, uri: str | AnyUrl
|
|
50
|
-
) -> list[TextPart | BlobResourceContents]:
|
|
51
|
-
"""Read a resource from the MCP server.
|
|
52
|
-
|
|
53
|
-
Args:
|
|
54
|
-
uri: URI of the resource to read
|
|
55
|
-
|
|
56
|
-
Returns:
|
|
57
|
-
Contents of the resource, either as string or BlobResourceContents
|
|
58
|
-
"""
|
|
59
|
-
result = await self._session.read_resource(
|
|
60
|
-
uri if isinstance(uri, AnyUrl) else AnyUrl(uri)
|
|
61
|
-
)
|
|
62
|
-
parsed_results: list[TextPart | BlobResourceContents] = []
|
|
63
|
-
for content in result.contents:
|
|
64
|
-
if isinstance(content, BlobResourceContents):
|
|
65
|
-
parsed_results.append(content)
|
|
66
|
-
else:
|
|
67
|
-
parsed_results.append(TextPart(type="text", text=content.text))
|
|
68
|
-
return parsed_results
|
|
69
|
-
|
|
70
|
-
async def list_prompts(self) -> list[Any]: # pyright: ignore [reportIncompatibleMethodOverride]
|
|
71
|
-
"""List all prompts available on the MCP server.
|
|
72
|
-
|
|
73
|
-
Returns:
|
|
74
|
-
A list of Prompt objects
|
|
75
|
-
"""
|
|
76
|
-
result = await self._session.list_prompts()
|
|
77
|
-
return result.prompts
|
|
78
|
-
|
|
79
|
-
async def get_prompt_template(
|
|
80
|
-
self, name: str
|
|
81
|
-
) -> Callable[..., Awaitable[list[BaseMessageParam]]]:
|
|
82
|
-
"""Get a prompt template from the MCP server.
|
|
83
|
-
|
|
84
|
-
Args:
|
|
85
|
-
name: Name of the prompt template
|
|
86
|
-
|
|
87
|
-
Returns:
|
|
88
|
-
A callable that accepts keyword arguments and returns a list of BaseMessageParam
|
|
89
|
-
"""
|
|
90
|
-
|
|
91
|
-
# TODO: wrap this with `llm.prompt` once it's implemented so that they prompts
|
|
92
|
-
# can be run super easily inside of an `llm.context` block.
|
|
93
|
-
async def async_prompt(**kwargs: str) -> list[BaseMessageParam]:
|
|
94
|
-
result = await self._session.get_prompt(name, kwargs) # type: ignore
|
|
95
|
-
|
|
96
|
-
return [
|
|
97
|
-
_utils.convert_prompt_message_to_base_message_params(prompt_message)
|
|
98
|
-
for prompt_message in result.messages
|
|
99
|
-
]
|
|
100
|
-
|
|
101
|
-
return async_prompt
|
|
102
|
-
|
|
103
|
-
async def list_tools(self) -> list[type[BaseTool]]: # pyright: ignore [reportIncompatibleMethodOverride]
|
|
104
|
-
"""List all tools available on the MCP server.
|
|
105
|
-
|
|
106
|
-
Returns:
|
|
107
|
-
A list of dynamically created `BaseTool` types.
|
|
108
|
-
"""
|
|
109
|
-
list_tool_result = await self._session.list_tools()
|
|
110
|
-
|
|
111
|
-
converted_tools = []
|
|
112
|
-
for tool in list_tool_result.tools:
|
|
113
|
-
model = _utils.create_tool_from_mcp_tool(tool)
|
|
114
|
-
tool_call_method = _utils.create_tool_call(
|
|
115
|
-
tool.name, self._session.call_tool
|
|
116
|
-
)
|
|
117
|
-
model.call = tool_call_method # pyright: ignore [reportAttributeAccessIssue]
|
|
118
|
-
converted_tools.append(model)
|
|
119
|
-
return converted_tools
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
@contextlib.asynccontextmanager
|
|
123
|
-
async def sse_client(
|
|
124
|
-
url: str,
|
|
125
|
-
list_roots_callback: ListRootsFnT | None = None,
|
|
126
|
-
read_timeout_seconds: timedelta | None = None,
|
|
127
|
-
sampling_callback: SamplingFnT | None = None,
|
|
128
|
-
session: ClientSession | None = None,
|
|
129
|
-
) -> AsyncIterator[MCPClient]:
|
|
130
|
-
async with (
|
|
131
|
-
mcp_sse_client(url) as (read, write),
|
|
132
|
-
ClientSession(
|
|
133
|
-
read,
|
|
134
|
-
write,
|
|
135
|
-
read_timeout_seconds=read_timeout_seconds,
|
|
136
|
-
sampling_callback=sampling_callback,
|
|
137
|
-
list_roots_callback=list_roots_callback,
|
|
138
|
-
) as session,
|
|
139
|
-
):
|
|
140
|
-
await session.initialize()
|
|
141
|
-
yield MCPClient(session)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
@contextlib.asynccontextmanager
|
|
145
|
-
async def stdio_client(
|
|
146
|
-
server_parameters: StdioServerParameters,
|
|
147
|
-
read_stream_exception_handler: Callable[[Exception], None] | None = None,
|
|
148
|
-
) -> AsyncIterator[MCPClient]:
|
|
149
|
-
"""
|
|
150
|
-
Create a MCPClient instance with the given server parameters and exception handler.
|
|
151
|
-
|
|
152
|
-
Args:
|
|
153
|
-
server_parameters:
|
|
154
|
-
read_stream_exception_handler:
|
|
155
|
-
|
|
156
|
-
Returns:
|
|
157
|
-
|
|
158
|
-
"""
|
|
159
|
-
async with (
|
|
160
|
-
mcp_stdio_client(server_parameters) as (read, write),
|
|
161
|
-
_utils.read_stream_exception_filer(
|
|
162
|
-
read, read_stream_exception_handler
|
|
163
|
-
) as filtered_read,
|
|
164
|
-
ClientSession(filtered_read, write) as session, # pyright: ignore [reportArgumentType]
|
|
165
|
-
):
|
|
166
|
-
await session.initialize()
|
|
167
|
-
yield MCPClient(session)
|
mirascope/mcp/server.py
DELETED
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
"""The `MCPServer` Class and context managers."""
|
|
2
|
-
|
|
3
|
-
import inspect
|
|
4
|
-
import warnings
|
|
5
|
-
from collections.abc import Awaitable, Callable, Iterable
|
|
6
|
-
from typing import Literal, ParamSpec, cast, overload
|
|
7
|
-
|
|
8
|
-
import mcp.server.stdio
|
|
9
|
-
from docstring_parser import parse
|
|
10
|
-
from mcp.server import NotificationOptions, Server
|
|
11
|
-
from mcp.server.models import InitializationOptions
|
|
12
|
-
from mcp.types import (
|
|
13
|
-
GetPromptResult,
|
|
14
|
-
ImageContent,
|
|
15
|
-
Prompt,
|
|
16
|
-
PromptArgument,
|
|
17
|
-
PromptMessage,
|
|
18
|
-
Resource,
|
|
19
|
-
TextContent,
|
|
20
|
-
Tool,
|
|
21
|
-
)
|
|
22
|
-
from pydantic import AnyUrl, BaseModel
|
|
23
|
-
|
|
24
|
-
from mirascope.core import BaseDynamicConfig, BaseMessageParam, BaseTool
|
|
25
|
-
from mirascope.core.base import ImagePart, TextPart
|
|
26
|
-
from mirascope.core.base._utils import (
|
|
27
|
-
MessagesDecorator,
|
|
28
|
-
convert_base_model_to_base_tool,
|
|
29
|
-
convert_function_to_base_tool,
|
|
30
|
-
fn_is_async,
|
|
31
|
-
)
|
|
32
|
-
from mirascope.core.base._utils._messages_decorator import (
|
|
33
|
-
MessagesAsyncFunction,
|
|
34
|
-
MessagesSyncFunction,
|
|
35
|
-
)
|
|
36
|
-
from mirascope.core.base.prompt import PromptDecorator, prompt_template
|
|
37
|
-
from mirascope.mcp.tools import MCPTool, ToolUseBlock
|
|
38
|
-
|
|
39
|
-
_P = ParamSpec("_P")
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def _convert_base_message_param_to_prompt_messages(
|
|
43
|
-
base_message_param: BaseMessageParam,
|
|
44
|
-
) -> list[PromptMessage]:
|
|
45
|
-
"""
|
|
46
|
-
Convert BaseMessageParam to types.PromptMessage.
|
|
47
|
-
|
|
48
|
-
Args:
|
|
49
|
-
base_message_param: BaseMessageParam instance.
|
|
50
|
-
|
|
51
|
-
Returns:
|
|
52
|
-
A list of types.PromptMessage instances.
|
|
53
|
-
"""
|
|
54
|
-
|
|
55
|
-
# Validate role
|
|
56
|
-
role = base_message_param.role
|
|
57
|
-
if role not in ["user", "assistant"]:
|
|
58
|
-
raise ValueError(f"invalid role: {role}")
|
|
59
|
-
|
|
60
|
-
if isinstance(base_message_param.content, str):
|
|
61
|
-
contents = [TextContent(type="text", text=base_message_param.content)]
|
|
62
|
-
elif isinstance(base_message_param.content, Iterable):
|
|
63
|
-
contents = []
|
|
64
|
-
for part in base_message_param.content:
|
|
65
|
-
if isinstance(part, TextPart):
|
|
66
|
-
contents.append(TextContent(type="text", text=part.text))
|
|
67
|
-
elif isinstance(part, ImagePart):
|
|
68
|
-
contents.append(
|
|
69
|
-
ImageContent(
|
|
70
|
-
type="image",
|
|
71
|
-
data=part.image.decode("utf-8"),
|
|
72
|
-
mimeType=part.media_type,
|
|
73
|
-
)
|
|
74
|
-
)
|
|
75
|
-
else:
|
|
76
|
-
raise ValueError(f"Unsupported content type: {type(part)}")
|
|
77
|
-
else:
|
|
78
|
-
raise ValueError(
|
|
79
|
-
f"Unsupported content type: {type(base_message_param.content)}"
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
return [
|
|
83
|
-
PromptMessage(role=cast(Literal["user", "assistant"], role), content=content)
|
|
84
|
-
for content in contents
|
|
85
|
-
]
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
def _generate_prompt_from_function(fn: Callable) -> Prompt:
|
|
89
|
-
"""
|
|
90
|
-
Generate a Prompt object from a function, extracting metadata like argument descriptions
|
|
91
|
-
from the function's docstring and type hints.
|
|
92
|
-
|
|
93
|
-
Args:
|
|
94
|
-
fn (Callable): The function to process.
|
|
95
|
-
|
|
96
|
-
Returns:
|
|
97
|
-
Prompt: A structured Prompt object with metadata.
|
|
98
|
-
"""
|
|
99
|
-
# Parse the docstring for structured information
|
|
100
|
-
docstring = parse(fn.__doc__ or "")
|
|
101
|
-
|
|
102
|
-
# Extract general description from the docstring
|
|
103
|
-
description = docstring.short_description or ""
|
|
104
|
-
|
|
105
|
-
# Prepare to extract argument details
|
|
106
|
-
signature = inspect.signature(fn)
|
|
107
|
-
parameter_docs = {param.arg_name: param.description for param in docstring.params}
|
|
108
|
-
|
|
109
|
-
arguments = []
|
|
110
|
-
for parameter in signature.parameters.values():
|
|
111
|
-
arg_desc = parameter_docs.get(parameter.name, "")
|
|
112
|
-
required = parameter.default is inspect.Parameter.empty
|
|
113
|
-
arguments.append(
|
|
114
|
-
PromptArgument(name=parameter.name, description=arg_desc, required=required)
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
return Prompt(name=fn.__name__, description=description, arguments=arguments)
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
class MCPServer:
|
|
121
|
-
"""MCP server implementation.
|
|
122
|
-
|
|
123
|
-
DEPRECATED: The MCPServer implementation is deprecated and will be removed in a future version.
|
|
124
|
-
Mirascope will only implement the client-side of MCP in the future, allowing it to connect to any
|
|
125
|
-
MCP server implementation, even if not built with Mirascope.
|
|
126
|
-
"""
|
|
127
|
-
|
|
128
|
-
def __init__(
|
|
129
|
-
self,
|
|
130
|
-
name: str,
|
|
131
|
-
version: str = "1.0.0",
|
|
132
|
-
tools: list[Callable | type[BaseTool]] | None = None,
|
|
133
|
-
resources: list[tuple[Resource, Callable]] | None = None,
|
|
134
|
-
prompts: list[
|
|
135
|
-
Callable[
|
|
136
|
-
...,
|
|
137
|
-
list[BaseMessageParam]
|
|
138
|
-
| Callable[..., Awaitable[list[BaseMessageParam]]],
|
|
139
|
-
]
|
|
140
|
-
]
|
|
141
|
-
| None = None,
|
|
142
|
-
) -> None:
|
|
143
|
-
warnings.warn(
|
|
144
|
-
"MCPServer is deprecated and will be removed in a future version. "
|
|
145
|
-
"Mirascope will only implement the client-side of MCP in the future. "
|
|
146
|
-
"We recommend using the official MCP SDK (e.g. `FastMCP`) for server-side implementations.",
|
|
147
|
-
DeprecationWarning,
|
|
148
|
-
stacklevel=2,
|
|
149
|
-
)
|
|
150
|
-
self.name: str = name
|
|
151
|
-
self.version: str = version
|
|
152
|
-
self.server: Server = Server(name)
|
|
153
|
-
self._tools: dict[str, tuple[Tool, type[MCPTool]]] = {}
|
|
154
|
-
self._resources: dict[str, tuple[Resource, Callable]] = {}
|
|
155
|
-
self._prompts: dict[
|
|
156
|
-
str,
|
|
157
|
-
tuple[
|
|
158
|
-
Prompt,
|
|
159
|
-
Callable[..., Awaitable[list[BaseMessageParam]]]
|
|
160
|
-
| Callable[..., list[BaseMessageParam]],
|
|
161
|
-
],
|
|
162
|
-
] = {}
|
|
163
|
-
if tools:
|
|
164
|
-
for tool in tools:
|
|
165
|
-
self.tool()(tool)
|
|
166
|
-
if resources:
|
|
167
|
-
for resource, resource_func in resources:
|
|
168
|
-
self.resource(
|
|
169
|
-
uri=str(resource.uri),
|
|
170
|
-
name=resource.name,
|
|
171
|
-
description=resource.description,
|
|
172
|
-
mime_type=resource.mimeType,
|
|
173
|
-
)(resource_func)
|
|
174
|
-
if prompts:
|
|
175
|
-
for prompt in prompts:
|
|
176
|
-
self._register_prompt(prompt)
|
|
177
|
-
|
|
178
|
-
def tool(
|
|
179
|
-
self,
|
|
180
|
-
) -> Callable[[Callable | type[BaseTool]], type[BaseTool]]:
|
|
181
|
-
"""Decorator to register tools."""
|
|
182
|
-
|
|
183
|
-
def decorator(
|
|
184
|
-
tool: Callable | type[BaseTool],
|
|
185
|
-
) -> type[BaseTool]:
|
|
186
|
-
if inspect.isclass(tool):
|
|
187
|
-
if issubclass(tool, MCPTool):
|
|
188
|
-
converted_tool = tool
|
|
189
|
-
else:
|
|
190
|
-
converted_tool = convert_base_model_to_base_tool(
|
|
191
|
-
cast(type[BaseModel], tool), MCPTool
|
|
192
|
-
)
|
|
193
|
-
else:
|
|
194
|
-
converted_tool = convert_function_to_base_tool(tool, MCPTool)
|
|
195
|
-
tool_schema = converted_tool.tool_schema()
|
|
196
|
-
name = tool_schema["name"]
|
|
197
|
-
if name in self._tools:
|
|
198
|
-
# Raise KeyError if tool name already exists
|
|
199
|
-
raise KeyError(f"Tool {name} already exists.")
|
|
200
|
-
|
|
201
|
-
self._tools[name] = (
|
|
202
|
-
Tool(
|
|
203
|
-
name=name,
|
|
204
|
-
description=tool_schema.get("description"),
|
|
205
|
-
inputSchema=tool_schema["input_schema"],
|
|
206
|
-
),
|
|
207
|
-
converted_tool,
|
|
208
|
-
)
|
|
209
|
-
return converted_tool
|
|
210
|
-
|
|
211
|
-
return decorator
|
|
212
|
-
|
|
213
|
-
def resource(
|
|
214
|
-
self,
|
|
215
|
-
uri: str,
|
|
216
|
-
name: str | None = None,
|
|
217
|
-
description: str | None = None,
|
|
218
|
-
mime_type: str | None = None,
|
|
219
|
-
) -> Callable[[Callable], Callable]:
|
|
220
|
-
"""Decorator to register resources."""
|
|
221
|
-
|
|
222
|
-
def decorator(func: Callable) -> Callable:
|
|
223
|
-
# Normalize URI so it always ends with a slash if needed
|
|
224
|
-
uri_with_slash = uri + "/" if not uri.endswith("/") else uri
|
|
225
|
-
|
|
226
|
-
if uri_with_slash in self._resources:
|
|
227
|
-
# Raise KeyError if resource URI already exists
|
|
228
|
-
raise KeyError(f"Resource {uri_with_slash} already exists.")
|
|
229
|
-
|
|
230
|
-
resource = Resource(
|
|
231
|
-
uri=cast(AnyUrl, uri_with_slash),
|
|
232
|
-
name=name or func.__name__,
|
|
233
|
-
mimeType=mime_type,
|
|
234
|
-
description=description
|
|
235
|
-
or parse(func.__doc__ or "").short_description
|
|
236
|
-
or "",
|
|
237
|
-
)
|
|
238
|
-
self._resources[str(resource.uri)] = resource, func
|
|
239
|
-
return func
|
|
240
|
-
|
|
241
|
-
return decorator
|
|
242
|
-
|
|
243
|
-
def _register_prompt(self, decorated_func: Callable) -> None:
|
|
244
|
-
prompt = _generate_prompt_from_function(decorated_func)
|
|
245
|
-
name = prompt.name
|
|
246
|
-
if name in self._prompts:
|
|
247
|
-
# Raise KeyError if prompt name already exists
|
|
248
|
-
raise KeyError(f"Prompt {name} already exists.")
|
|
249
|
-
|
|
250
|
-
self._prompts[prompt.name] = prompt, decorated_func
|
|
251
|
-
|
|
252
|
-
@overload
|
|
253
|
-
def prompt(self, template: str) -> PromptDecorator: ...
|
|
254
|
-
|
|
255
|
-
@overload
|
|
256
|
-
def prompt(self, template: None = None) -> MessagesDecorator: ...
|
|
257
|
-
|
|
258
|
-
def prompt(
|
|
259
|
-
self,
|
|
260
|
-
template: str | None = None,
|
|
261
|
-
) -> PromptDecorator | MessagesDecorator:
|
|
262
|
-
"""Decorator to register prompts."""
|
|
263
|
-
|
|
264
|
-
def decorator(
|
|
265
|
-
func: MessagesSyncFunction | MessagesAsyncFunction,
|
|
266
|
-
) -> (
|
|
267
|
-
Callable[..., Awaitable[list[BaseMessageParam] | BaseDynamicConfig]]
|
|
268
|
-
| Callable[..., list[BaseMessageParam] | BaseDynamicConfig]
|
|
269
|
-
):
|
|
270
|
-
decorated_prompt = prompt_template(template)(func)
|
|
271
|
-
self._register_prompt(decorated_prompt)
|
|
272
|
-
return decorated_prompt
|
|
273
|
-
|
|
274
|
-
return decorator # pyright: ignore [reportReturnType]
|
|
275
|
-
|
|
276
|
-
async def run(self) -> None:
|
|
277
|
-
"""Run the MCP server."""
|
|
278
|
-
|
|
279
|
-
@self.server.read_resource()
|
|
280
|
-
async def handle_read_resource(uri: AnyUrl) -> str:
|
|
281
|
-
resource_and_func = self._resources.get(str(uri))
|
|
282
|
-
if resource_and_func is None:
|
|
283
|
-
raise ValueError(f"Unknown resource: {uri}")
|
|
284
|
-
|
|
285
|
-
resource, func = resource_and_func
|
|
286
|
-
if fn_is_async(func):
|
|
287
|
-
ret = await func()
|
|
288
|
-
else:
|
|
289
|
-
ret = func()
|
|
290
|
-
return ret
|
|
291
|
-
|
|
292
|
-
@self.server.list_resources()
|
|
293
|
-
async def handle_list_resource() -> list[Resource]:
|
|
294
|
-
return [resource for resource, _ in self._resources.values()]
|
|
295
|
-
|
|
296
|
-
@self.server.list_tools()
|
|
297
|
-
async def list_tools() -> list[Tool]:
|
|
298
|
-
return [tool for tool, _ in self._tools.values()]
|
|
299
|
-
|
|
300
|
-
@self.server.call_tool()
|
|
301
|
-
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
|
|
302
|
-
if name not in self._tools:
|
|
303
|
-
raise KeyError(f"Tool {name} not found.")
|
|
304
|
-
_, tool_type = self._tools[name]
|
|
305
|
-
|
|
306
|
-
tool = tool_type.from_tool_call(
|
|
307
|
-
tool_call=ToolUseBlock(id=name, name=name, input=arguments)
|
|
308
|
-
)
|
|
309
|
-
if fn_is_async(tool.call):
|
|
310
|
-
result = await tool.call()
|
|
311
|
-
else:
|
|
312
|
-
result = tool.call()
|
|
313
|
-
return [TextContent(type="text", text=result)]
|
|
314
|
-
|
|
315
|
-
@self.server.list_prompts()
|
|
316
|
-
async def handle_list_prompts() -> list[Prompt]:
|
|
317
|
-
return [prompt for prompt, _ in self._prompts.values()]
|
|
318
|
-
|
|
319
|
-
@self.server.get_prompt()
|
|
320
|
-
async def handle_get_prompt(
|
|
321
|
-
name: str, arguments: dict[str, str] | None
|
|
322
|
-
) -> GetPromptResult:
|
|
323
|
-
if name not in self._prompts:
|
|
324
|
-
raise ValueError(f"Unknown prompt: {name}")
|
|
325
|
-
if arguments is None:
|
|
326
|
-
arguments = {}
|
|
327
|
-
prompt, decorated_func = self._prompts[name]
|
|
328
|
-
if fn_is_async(decorated_func):
|
|
329
|
-
messages: list[BaseMessageParam] = await decorated_func(**arguments)
|
|
330
|
-
else:
|
|
331
|
-
messages = decorated_func(**arguments)
|
|
332
|
-
|
|
333
|
-
return GetPromptResult(
|
|
334
|
-
description=f"{prompt.name} template for {arguments}",
|
|
335
|
-
messages=[
|
|
336
|
-
prompt_message
|
|
337
|
-
for message in messages
|
|
338
|
-
for prompt_message in _convert_base_message_param_to_prompt_messages(
|
|
339
|
-
message
|
|
340
|
-
)
|
|
341
|
-
],
|
|
342
|
-
)
|
|
343
|
-
|
|
344
|
-
async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
|
|
345
|
-
await self.server.run(
|
|
346
|
-
read_stream,
|
|
347
|
-
write_stream,
|
|
348
|
-
InitializationOptions(
|
|
349
|
-
server_name=self.name,
|
|
350
|
-
server_version=self.version,
|
|
351
|
-
capabilities=self.server.get_capabilities(
|
|
352
|
-
notification_options=NotificationOptions(),
|
|
353
|
-
experimental_capabilities={},
|
|
354
|
-
),
|
|
355
|
-
),
|
|
356
|
-
)
|
mirascope/mcp/tools.py
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
"""The `MCPTool` class for easy tool usage with MCPTool LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/tools.md
|
|
4
|
-
|
|
5
|
-
DEPRECATED: The MCPTool class is deprecated and will be removed in a future version.
|
|
6
|
-
Mirascope will only implement the client-side of MCP in the future, allowing it to connect to any
|
|
7
|
-
MCP server implementation, even if not built with Mirascope.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import warnings
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
from pydantic import BaseModel
|
|
16
|
-
from pydantic.json_schema import SkipJsonSchema
|
|
17
|
-
from typing_extensions import Required, TypedDict
|
|
18
|
-
|
|
19
|
-
from mirascope.core import BaseTool
|
|
20
|
-
from mirascope.core.base import ToolConfig
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class ToolParam(TypedDict, total=False):
|
|
24
|
-
input_schema: Required[dict[str, Any]]
|
|
25
|
-
name: Required[str]
|
|
26
|
-
description: str
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class ToolUseBlock(BaseModel):
|
|
30
|
-
id: str
|
|
31
|
-
input: dict[str, Any]
|
|
32
|
-
name: str
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class MCPToolToolConfig(ToolConfig, total=False):
|
|
36
|
-
"""A tool configuration for mcp-specific features."""
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
class MCPTool(BaseTool):
|
|
40
|
-
"""A class for defining tools for MCP LLM calls.
|
|
41
|
-
|
|
42
|
-
DEPRECATED: The MCPTool class is deprecated and will be removed in a future version.
|
|
43
|
-
Mirascope will only implement the client-side of MCP in the future.
|
|
44
|
-
|
|
45
|
-
Example:
|
|
46
|
-
|
|
47
|
-
```python
|
|
48
|
-
import asyncio
|
|
49
|
-
|
|
50
|
-
from mirascope.mcp import MCPServer
|
|
51
|
-
|
|
52
|
-
app = MCPServer("book-recommend")
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
@app.tool()
|
|
56
|
-
async def recommend_book(genre: str) -> str:
|
|
57
|
-
return f"Recommend a {genre} book"
|
|
58
|
-
|
|
59
|
-
asyncio.run(app.run())
|
|
60
|
-
```
|
|
61
|
-
"""
|
|
62
|
-
|
|
63
|
-
__provider__ = "mcp"
|
|
64
|
-
__tool_config_type__ = MCPToolToolConfig
|
|
65
|
-
|
|
66
|
-
tool_call: SkipJsonSchema[ToolUseBlock]
|
|
67
|
-
|
|
68
|
-
@classmethod
|
|
69
|
-
def tool_schema(cls) -> ToolParam:
|
|
70
|
-
"""Constructs a `ToolParam` tool schema from the `BaseModel` schema defined.
|
|
71
|
-
|
|
72
|
-
Example:
|
|
73
|
-
```python
|
|
74
|
-
from mirascope.mcp import MCPTool
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def format_book(title: str, author: str) -> str:
|
|
78
|
-
return f"{title} by {author}"
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
tool_type = MCPTool.type_from_fn(format_book)
|
|
82
|
-
print(tool_type.tool_schema()) # prints the MCP-specific tool schema
|
|
83
|
-
```
|
|
84
|
-
"""
|
|
85
|
-
# Show deprecation warning
|
|
86
|
-
warnings.warn(
|
|
87
|
-
"The MCPTool class is deprecated and will be removed in a future version. "
|
|
88
|
-
"Mirascope will only implement the client-side of MCP in the future. "
|
|
89
|
-
"We recommend using the official MCP SDK (e.g. `FastMCP`) for server-side implementations.",
|
|
90
|
-
DeprecationWarning,
|
|
91
|
-
stacklevel=2,
|
|
92
|
-
)
|
|
93
|
-
kwargs = {
|
|
94
|
-
"input_schema": cls.model_json_schema(),
|
|
95
|
-
"name": cls._name(),
|
|
96
|
-
"description": cls._description(),
|
|
97
|
-
}
|
|
98
|
-
return ToolParam(**kwargs)
|
|
99
|
-
|
|
100
|
-
@classmethod
|
|
101
|
-
def from_tool_call(cls, tool_call: ToolUseBlock) -> MCPTool:
|
|
102
|
-
"""Constructs an `MCPTool` instance from a `tool_call`.
|
|
103
|
-
|
|
104
|
-
Args:
|
|
105
|
-
tool_call: The MCP tool call from which to construct this tool
|
|
106
|
-
instance.
|
|
107
|
-
"""
|
|
108
|
-
model_json = {"tool_call": tool_call}
|
|
109
|
-
model_json |= tool_call.input
|
|
110
|
-
return cls.model_validate(model_json)
|
mirascope/py.typed
DELETED
|
File without changes
|
mirascope/retries/__init__.py
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"""Utilities for retrying failed API calls."""
|
|
2
|
-
|
|
3
|
-
from contextlib import suppress
|
|
4
|
-
|
|
5
|
-
from .fallback import FallbackError, fallback
|
|
6
|
-
|
|
7
|
-
with suppress(ImportError):
|
|
8
|
-
from . import tenacity as tenacity
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
__all__ = ["FallbackError", "fallback", "tenacity"]
|