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,296 +0,0 @@
|
|
|
1
|
-
"""This module defines the base class for structured streams."""
|
|
2
|
-
|
|
3
|
-
from collections.abc import (
|
|
4
|
-
AsyncGenerator,
|
|
5
|
-
AsyncIterable,
|
|
6
|
-
Awaitable,
|
|
7
|
-
Callable,
|
|
8
|
-
Generator,
|
|
9
|
-
Iterable,
|
|
10
|
-
)
|
|
11
|
-
from functools import wraps
|
|
12
|
-
from typing import (
|
|
13
|
-
Any,
|
|
14
|
-
Generic,
|
|
15
|
-
ParamSpec,
|
|
16
|
-
TypeVar,
|
|
17
|
-
cast,
|
|
18
|
-
overload,
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
from pydantic import BaseModel
|
|
22
|
-
|
|
23
|
-
from ._utils import (
|
|
24
|
-
BaseType,
|
|
25
|
-
GetJsonOutput,
|
|
26
|
-
SameSyncAndAsyncClientSetupCall,
|
|
27
|
-
SetupCall,
|
|
28
|
-
extract_tool_return,
|
|
29
|
-
fn_is_async,
|
|
30
|
-
setup_extract_tool,
|
|
31
|
-
)
|
|
32
|
-
from ._utils._get_fields_from_call_args import (
|
|
33
|
-
get_fields_from_call_args,
|
|
34
|
-
)
|
|
35
|
-
from .call_params import BaseCallParams
|
|
36
|
-
from .call_response import BaseCallResponse
|
|
37
|
-
from .call_response_chunk import BaseCallResponseChunk
|
|
38
|
-
from .dynamic_config import BaseDynamicConfig
|
|
39
|
-
from .stream import BaseStream, stream_factory
|
|
40
|
-
from .tool import BaseTool
|
|
41
|
-
|
|
42
|
-
_BaseCallResponseT = TypeVar("_BaseCallResponseT", bound=BaseCallResponse)
|
|
43
|
-
_BaseCallResponseChunkT = TypeVar(
|
|
44
|
-
"_BaseCallResponseChunkT", bound=BaseCallResponseChunk
|
|
45
|
-
)
|
|
46
|
-
_BaseToolT = TypeVar("_BaseToolT", bound=BaseTool)
|
|
47
|
-
_BaseCallParamsT = TypeVar("_BaseCallParamsT", bound=BaseCallParams)
|
|
48
|
-
_BaseDynamicConfigT = TypeVar("_BaseDynamicConfigT", bound=BaseDynamicConfig)
|
|
49
|
-
_ResponseModelT = TypeVar("_ResponseModelT", bound=BaseModel | BaseType)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class BaseStructuredStream(Generic[_ResponseModelT]):
|
|
53
|
-
"""A base class for streaming structured outputs from LLMs."""
|
|
54
|
-
|
|
55
|
-
stream: BaseStream
|
|
56
|
-
response_model: type[_ResponseModelT]
|
|
57
|
-
constructed_response_model: _ResponseModelT
|
|
58
|
-
|
|
59
|
-
def __init__(
|
|
60
|
-
self,
|
|
61
|
-
*,
|
|
62
|
-
stream: BaseStream,
|
|
63
|
-
response_model: type[_ResponseModelT],
|
|
64
|
-
fields_from_call_args: dict[str, Any],
|
|
65
|
-
) -> None:
|
|
66
|
-
"""Initializes an instance of `BaseStructuredStream`."""
|
|
67
|
-
self.stream = stream
|
|
68
|
-
self.response_model = response_model
|
|
69
|
-
self.fields_from_call_args = fields_from_call_args
|
|
70
|
-
|
|
71
|
-
def __iter__(self) -> Generator[_ResponseModelT, None, None]:
|
|
72
|
-
"""Iterates over the stream and extracts structured outputs."""
|
|
73
|
-
json_output = ""
|
|
74
|
-
for chunk, _ in self.stream:
|
|
75
|
-
json_output += chunk.content
|
|
76
|
-
if json_output and json_output[0] != "{":
|
|
77
|
-
try:
|
|
78
|
-
json_start = json_output.index("{")
|
|
79
|
-
json_output = json_output[json_start:]
|
|
80
|
-
except ValueError:
|
|
81
|
-
json_output = ""
|
|
82
|
-
if chunk.model is not None:
|
|
83
|
-
self.stream.model = chunk.model
|
|
84
|
-
if json_output:
|
|
85
|
-
yield extract_tool_return(
|
|
86
|
-
self.response_model, json_output, True, self.fields_from_call_args
|
|
87
|
-
)
|
|
88
|
-
if json_output:
|
|
89
|
-
json_output = json_output[: json_output.rfind("}") + 1]
|
|
90
|
-
self.constructed_response_model = extract_tool_return(
|
|
91
|
-
self.response_model, json_output, False, self.fields_from_call_args
|
|
92
|
-
)
|
|
93
|
-
yield self.constructed_response_model
|
|
94
|
-
|
|
95
|
-
def __aiter__(self) -> AsyncGenerator[_ResponseModelT, None]:
|
|
96
|
-
"""Iterates over the stream and extracts structured outputs."""
|
|
97
|
-
|
|
98
|
-
async def generator() -> AsyncGenerator[_ResponseModelT, None]:
|
|
99
|
-
json_output = ""
|
|
100
|
-
async for chunk, _ in self.stream:
|
|
101
|
-
json_output += chunk.content
|
|
102
|
-
if json_output and json_output[0] != "{":
|
|
103
|
-
try:
|
|
104
|
-
json_start = json_output.index("{")
|
|
105
|
-
json_output = json_output[json_start:]
|
|
106
|
-
except ValueError:
|
|
107
|
-
json_output = ""
|
|
108
|
-
if chunk.model is not None:
|
|
109
|
-
self.stream.model = chunk.model
|
|
110
|
-
if json_output:
|
|
111
|
-
yield extract_tool_return(
|
|
112
|
-
self.response_model,
|
|
113
|
-
json_output,
|
|
114
|
-
True,
|
|
115
|
-
self.fields_from_call_args,
|
|
116
|
-
)
|
|
117
|
-
if json_output:
|
|
118
|
-
json_output = json_output[: json_output.rfind("}") + 1]
|
|
119
|
-
self.constructed_response_model = extract_tool_return(
|
|
120
|
-
self.response_model, json_output, False, self.fields_from_call_args
|
|
121
|
-
)
|
|
122
|
-
yield self.constructed_response_model
|
|
123
|
-
|
|
124
|
-
return generator()
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
_BaseDynamicConfigT = TypeVar("_BaseDynamicConfigT", bound=BaseDynamicConfig)
|
|
128
|
-
_AsyncBaseDynamicConfigT = TypeVar("_AsyncBaseDynamicConfigT", bound=BaseDynamicConfig)
|
|
129
|
-
_SameSyncAndAsyncClientT = TypeVar("_SameSyncAndAsyncClientT", contravariant=True)
|
|
130
|
-
_SyncBaseClientT = TypeVar("_SyncBaseClientT", contravariant=True)
|
|
131
|
-
_AsyncBaseClientT = TypeVar("_AsyncBaseClientT", contravariant=True)
|
|
132
|
-
_ResponseT = TypeVar("_ResponseT")
|
|
133
|
-
_ResponseChunkT = TypeVar("_ResponseChunkT")
|
|
134
|
-
_AsyncResponseT = TypeVar("_AsyncResponseT")
|
|
135
|
-
_AsyncResponseChunkT = TypeVar("_AsyncResponseChunkT")
|
|
136
|
-
_P = ParamSpec("_P")
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
def structured_stream_factory( # noqa: ANN201
|
|
140
|
-
*,
|
|
141
|
-
TCallResponse: type[_BaseCallResponseT],
|
|
142
|
-
TCallResponseChunk: type[_BaseCallResponseChunkT],
|
|
143
|
-
TStream: type[BaseStream],
|
|
144
|
-
TToolType: type[_BaseToolT],
|
|
145
|
-
setup_call: SameSyncAndAsyncClientSetupCall[
|
|
146
|
-
_SameSyncAndAsyncClientT,
|
|
147
|
-
_BaseDynamicConfigT,
|
|
148
|
-
_AsyncBaseDynamicConfigT,
|
|
149
|
-
_BaseCallParamsT,
|
|
150
|
-
_ResponseT,
|
|
151
|
-
_ResponseChunkT,
|
|
152
|
-
_AsyncResponseT,
|
|
153
|
-
_AsyncResponseChunkT,
|
|
154
|
-
_BaseToolT,
|
|
155
|
-
]
|
|
156
|
-
| SetupCall[
|
|
157
|
-
_SyncBaseClientT,
|
|
158
|
-
_AsyncBaseClientT,
|
|
159
|
-
_BaseDynamicConfigT,
|
|
160
|
-
_AsyncBaseDynamicConfigT,
|
|
161
|
-
_BaseCallParamsT,
|
|
162
|
-
_ResponseT,
|
|
163
|
-
_ResponseChunkT,
|
|
164
|
-
_AsyncResponseT,
|
|
165
|
-
_AsyncResponseChunkT,
|
|
166
|
-
_BaseToolT,
|
|
167
|
-
],
|
|
168
|
-
get_json_output: GetJsonOutput[_BaseCallResponseChunkT],
|
|
169
|
-
):
|
|
170
|
-
class CustomContentChunk(TCallResponseChunk):
|
|
171
|
-
json_output: str
|
|
172
|
-
|
|
173
|
-
@property
|
|
174
|
-
def content(self) -> str:
|
|
175
|
-
return self.json_output
|
|
176
|
-
|
|
177
|
-
@overload
|
|
178
|
-
def decorator(
|
|
179
|
-
fn: Callable[_P, _BaseDynamicConfigT],
|
|
180
|
-
model: str,
|
|
181
|
-
response_model: type[_ResponseModelT],
|
|
182
|
-
json_mode: bool,
|
|
183
|
-
client: _SameSyncAndAsyncClientT | _SyncBaseClientT | None,
|
|
184
|
-
call_params: _BaseCallParamsT,
|
|
185
|
-
) -> Callable[
|
|
186
|
-
_P,
|
|
187
|
-
Iterable[_ResponseModelT],
|
|
188
|
-
]: ...
|
|
189
|
-
|
|
190
|
-
@overload
|
|
191
|
-
def decorator(
|
|
192
|
-
fn: Callable[_P, Awaitable[_AsyncBaseDynamicConfigT]],
|
|
193
|
-
model: str,
|
|
194
|
-
response_model: type[_ResponseModelT],
|
|
195
|
-
json_mode: bool,
|
|
196
|
-
client: _SameSyncAndAsyncClientT | _AsyncBaseClientT | None,
|
|
197
|
-
call_params: _BaseCallParamsT,
|
|
198
|
-
) -> Callable[
|
|
199
|
-
_P,
|
|
200
|
-
Awaitable[AsyncIterable[_ResponseModelT]],
|
|
201
|
-
]: ...
|
|
202
|
-
|
|
203
|
-
def decorator(
|
|
204
|
-
fn: Callable[_P, _BaseDynamicConfigT]
|
|
205
|
-
| Callable[_P, Awaitable[_AsyncBaseDynamicConfigT]],
|
|
206
|
-
model: str,
|
|
207
|
-
response_model: type[_ResponseModelT],
|
|
208
|
-
json_mode: bool,
|
|
209
|
-
client: _SameSyncAndAsyncClientT | _SyncBaseClientT | _AsyncBaseClientT | None,
|
|
210
|
-
call_params: _BaseCallParamsT,
|
|
211
|
-
) -> Callable[
|
|
212
|
-
_P,
|
|
213
|
-
Iterable[_ResponseModelT] | Awaitable[AsyncIterable[_ResponseModelT]],
|
|
214
|
-
]:
|
|
215
|
-
def handle_chunk(
|
|
216
|
-
chunk: _ResponseChunkT | _AsyncResponseChunkT,
|
|
217
|
-
) -> tuple[_BaseCallResponseChunkT, None]:
|
|
218
|
-
call_response_chunk = TCallResponseChunk(chunk=chunk)
|
|
219
|
-
json_output = get_json_output(call_response_chunk, json_mode)
|
|
220
|
-
|
|
221
|
-
call_response_chunk = cast(
|
|
222
|
-
_BaseCallResponseChunkT,
|
|
223
|
-
CustomContentChunk(chunk=chunk, json_output=json_output), # pyright: ignore [reportAbstractUsage]
|
|
224
|
-
)
|
|
225
|
-
return call_response_chunk, None
|
|
226
|
-
|
|
227
|
-
def handle_stream(
|
|
228
|
-
stream: Generator[_ResponseChunkT, None, None],
|
|
229
|
-
tool_types: list[type[_BaseToolT]] | None,
|
|
230
|
-
partial_tools: bool = False,
|
|
231
|
-
) -> Generator[tuple[_BaseCallResponseChunkT, None], None, None]:
|
|
232
|
-
for chunk in stream:
|
|
233
|
-
yield handle_chunk(chunk)
|
|
234
|
-
|
|
235
|
-
async def handle_stream_async(
|
|
236
|
-
stream: AsyncGenerator[_AsyncResponseChunkT, None],
|
|
237
|
-
tool_types: list[type[_BaseToolT]] | None,
|
|
238
|
-
partial_tools: bool = False,
|
|
239
|
-
) -> AsyncGenerator[tuple[_BaseCallResponseChunkT, None], None]:
|
|
240
|
-
async for chunk in stream:
|
|
241
|
-
yield handle_chunk(chunk)
|
|
242
|
-
|
|
243
|
-
stream_decorator = stream_factory(
|
|
244
|
-
TCallResponse=TCallResponse,
|
|
245
|
-
TStream=TStream,
|
|
246
|
-
setup_call=setup_call,
|
|
247
|
-
handle_stream=handle_stream,
|
|
248
|
-
handle_stream_async=handle_stream_async,
|
|
249
|
-
)
|
|
250
|
-
|
|
251
|
-
tool = setup_extract_tool(response_model, TToolType)
|
|
252
|
-
stream_decorator_kwargs = {
|
|
253
|
-
"model": model,
|
|
254
|
-
"tools": [tool],
|
|
255
|
-
"json_mode": json_mode,
|
|
256
|
-
"client": client,
|
|
257
|
-
"call_params": call_params,
|
|
258
|
-
}
|
|
259
|
-
fn._model = model # pyright: ignore [reportFunctionMemberAccess]
|
|
260
|
-
fn.__mirascope_call__ = True # pyright: ignore [reportFunctionMemberAccess]
|
|
261
|
-
if fn_is_async(fn):
|
|
262
|
-
|
|
263
|
-
@wraps(fn)
|
|
264
|
-
async def inner_async(
|
|
265
|
-
*args: _P.args, **kwargs: _P.kwargs
|
|
266
|
-
) -> AsyncIterable[_ResponseModelT]:
|
|
267
|
-
fields_from_call_args = get_fields_from_call_args(
|
|
268
|
-
response_model, fn, args, kwargs
|
|
269
|
-
)
|
|
270
|
-
return BaseStructuredStream[_ResponseModelT](
|
|
271
|
-
stream=await stream_decorator(fn=fn, **stream_decorator_kwargs)(
|
|
272
|
-
*args, **kwargs
|
|
273
|
-
),
|
|
274
|
-
response_model=response_model,
|
|
275
|
-
fields_from_call_args=fields_from_call_args,
|
|
276
|
-
)
|
|
277
|
-
|
|
278
|
-
return inner_async
|
|
279
|
-
else:
|
|
280
|
-
|
|
281
|
-
@wraps(fn)
|
|
282
|
-
def inner(*args: _P.args, **kwargs: _P.kwargs) -> Iterable[_ResponseModelT]:
|
|
283
|
-
fields_from_call_args = get_fields_from_call_args(
|
|
284
|
-
response_model, fn, args, kwargs
|
|
285
|
-
)
|
|
286
|
-
return BaseStructuredStream[_ResponseModelT](
|
|
287
|
-
stream=stream_decorator(fn=fn, **stream_decorator_kwargs)(
|
|
288
|
-
*args, **kwargs
|
|
289
|
-
),
|
|
290
|
-
response_model=response_model,
|
|
291
|
-
fields_from_call_args=fields_from_call_args,
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
return inner
|
|
295
|
-
|
|
296
|
-
return decorator
|
mirascope/core/base/tool.py
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
"""This module defines the base class for tools used in LLM calls.
|
|
2
|
-
|
|
3
|
-
usage-docs: learn/tools.md
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
import inspect
|
|
9
|
-
import warnings
|
|
10
|
-
from abc import ABC, abstractmethod
|
|
11
|
-
from collections.abc import Callable
|
|
12
|
-
from typing import Any, ClassVar, TypeVar
|
|
13
|
-
|
|
14
|
-
import jiter
|
|
15
|
-
from pydantic import BaseModel, ConfigDict
|
|
16
|
-
from pydantic.json_schema import (
|
|
17
|
-
DEFAULT_REF_TEMPLATE,
|
|
18
|
-
GenerateJsonSchema,
|
|
19
|
-
JsonSchemaMode,
|
|
20
|
-
JsonSchemaValue,
|
|
21
|
-
SkipJsonSchema,
|
|
22
|
-
)
|
|
23
|
-
from pydantic_core.core_schema import CoreSchema
|
|
24
|
-
from typing_extensions import TypedDict
|
|
25
|
-
|
|
26
|
-
from . import _utils
|
|
27
|
-
|
|
28
|
-
_BaseToolT = TypeVar("_BaseToolT", bound=BaseModel)
|
|
29
|
-
_ToolSchemaT = TypeVar("_ToolSchemaT")
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class ToolConfig(TypedDict, total=False):
|
|
33
|
-
"""A base class for tool configurations."""
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class GenerateJsonSchemaNoTitles(GenerateJsonSchema):
|
|
37
|
-
_openai_strict: ClassVar[bool] = False
|
|
38
|
-
|
|
39
|
-
def _remove_title(self, key: str | None, obj: Any) -> Any: # noqa: ANN401
|
|
40
|
-
if isinstance(obj, dict):
|
|
41
|
-
if self._openai_strict and "type" in obj and obj["type"] == "object":
|
|
42
|
-
obj["additionalProperties"] = False
|
|
43
|
-
if "type" in obj or "$ref" in obj or "properties" in obj:
|
|
44
|
-
title = obj.pop("title", None)
|
|
45
|
-
if key and title and key.lower() != title.lower():
|
|
46
|
-
obj["title"] = title
|
|
47
|
-
|
|
48
|
-
for key, value in list(obj.items()):
|
|
49
|
-
obj[key] = self._remove_title(key, value)
|
|
50
|
-
elif isinstance(obj, list):
|
|
51
|
-
return [self._remove_title(None, item) for item in obj]
|
|
52
|
-
|
|
53
|
-
return obj
|
|
54
|
-
|
|
55
|
-
def generate(
|
|
56
|
-
self, schema: CoreSchema, mode: JsonSchemaMode = "validation"
|
|
57
|
-
) -> JsonSchemaValue:
|
|
58
|
-
json_schema = super().generate(schema, mode=mode)
|
|
59
|
-
json_schema.pop("title", None)
|
|
60
|
-
json_schema.pop("description", None)
|
|
61
|
-
json_schema = self._remove_title(None, json_schema)
|
|
62
|
-
return json_schema
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
class BaseTool(BaseModel, ABC):
|
|
66
|
-
'''A class for defining tools for LLM calls.
|
|
67
|
-
|
|
68
|
-
Example:
|
|
69
|
-
|
|
70
|
-
```python
|
|
71
|
-
from mirascope.core import BaseTool
|
|
72
|
-
from pydantic import Field
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
class FormatBook(BaseTool):
|
|
76
|
-
"""Returns a nicely formatted book recommendation."""
|
|
77
|
-
|
|
78
|
-
title: str = Field(..., description="The title of the book.")
|
|
79
|
-
author: str = Field(..., description="The author of the book.")
|
|
80
|
-
|
|
81
|
-
def call(self) -> str:
|
|
82
|
-
return f"{self.title} by {self.author}"
|
|
83
|
-
```
|
|
84
|
-
'''
|
|
85
|
-
|
|
86
|
-
__provider__: ClassVar[str] = "NONE"
|
|
87
|
-
__tool_config_type__: ClassVar[type[ToolConfig]] = ToolConfig
|
|
88
|
-
__custom_name__: ClassVar[str] = ""
|
|
89
|
-
tool_config: ClassVar[ToolConfig] = ToolConfig()
|
|
90
|
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
91
|
-
delta: SkipJsonSchema[str | None] = None
|
|
92
|
-
|
|
93
|
-
@classmethod
|
|
94
|
-
def _dict_from_json(cls, json: str, allow_partial: bool = False) -> dict[str, Any]:
|
|
95
|
-
"""Returns a dictionary from a JSON string."""
|
|
96
|
-
if not json:
|
|
97
|
-
return {}
|
|
98
|
-
return jiter.from_json(
|
|
99
|
-
json.encode(), partial_mode="trailing-strings" if allow_partial else "off"
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
@classmethod
|
|
103
|
-
def _name(cls) -> str:
|
|
104
|
-
"""Returns the name of the tool."""
|
|
105
|
-
return cls.__custom_name__ if cls.__custom_name__ else cls.__name__
|
|
106
|
-
|
|
107
|
-
@classmethod
|
|
108
|
-
def _description(cls) -> str:
|
|
109
|
-
"""Returns the description of the tool."""
|
|
110
|
-
return (
|
|
111
|
-
inspect.cleandoc(cls.__doc__)
|
|
112
|
-
if cls.__doc__
|
|
113
|
-
else _utils.DEFAULT_TOOL_DOCSTRING
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
@property
|
|
117
|
-
def args(self) -> dict[str, Any]:
|
|
118
|
-
"""The arguments of the tool as a dictionary."""
|
|
119
|
-
return {
|
|
120
|
-
field: getattr(self, field)
|
|
121
|
-
for field in self.model_fields
|
|
122
|
-
if field not in {"tool_call", "delta"}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
@property
|
|
126
|
-
def id(self) -> str | None:
|
|
127
|
-
"""The id of the tool."""
|
|
128
|
-
if tool_call := getattr(self, "tool_call", None):
|
|
129
|
-
# Expect tool_call has an id attribute.
|
|
130
|
-
# If not, we should override this method on the provider tool
|
|
131
|
-
return getattr(tool_call, "id", None)
|
|
132
|
-
return None
|
|
133
|
-
|
|
134
|
-
@abstractmethod
|
|
135
|
-
def call(self, *args: Any, **kwargs: Any) -> Any: # noqa: ANN401
|
|
136
|
-
"""The method to call the tool."""
|
|
137
|
-
...
|
|
138
|
-
|
|
139
|
-
@classmethod
|
|
140
|
-
def type_from_fn(cls: type[_BaseToolT], fn: Callable) -> type[_BaseToolT]:
|
|
141
|
-
"""Returns this tool type converted from a function.
|
|
142
|
-
|
|
143
|
-
Args:
|
|
144
|
-
fn: The function to convert into this tool type.
|
|
145
|
-
"""
|
|
146
|
-
return _utils.convert_function_to_base_tool(fn, cls)
|
|
147
|
-
|
|
148
|
-
@classmethod
|
|
149
|
-
def type_from_base_model_type(
|
|
150
|
-
cls: type[_BaseToolT], tool_type: type[BaseModel]
|
|
151
|
-
) -> type[_BaseToolT]:
|
|
152
|
-
"""Returns this tool type converted from a given base tool type.
|
|
153
|
-
|
|
154
|
-
Args:
|
|
155
|
-
tool_type: The tool type to convert into this tool type. This can be a
|
|
156
|
-
custom `BaseTool` or `BaseModel` definition.
|
|
157
|
-
"""
|
|
158
|
-
return _utils.convert_base_model_to_base_tool(tool_type, cls)
|
|
159
|
-
|
|
160
|
-
@classmethod
|
|
161
|
-
def type_from_base_type(
|
|
162
|
-
cls: type[_BaseToolT], base_type: type[_utils.BaseType]
|
|
163
|
-
) -> type[_BaseToolT]:
|
|
164
|
-
"""Returns this tool type converted from a base type.
|
|
165
|
-
|
|
166
|
-
Args:
|
|
167
|
-
base_type: The base type (e.g. `int`) to convert into this tool type.
|
|
168
|
-
"""
|
|
169
|
-
return _utils.convert_base_type_to_base_tool(base_type, cls)
|
|
170
|
-
|
|
171
|
-
@classmethod
|
|
172
|
-
def tool_schema(cls) -> Any: # noqa: ANN401
|
|
173
|
-
raise RuntimeError(
|
|
174
|
-
f"{cls.__name__}.tool_schema() is not implemented. "
|
|
175
|
-
"This method should be implemented in provider-specific tool classes."
|
|
176
|
-
)
|
|
177
|
-
|
|
178
|
-
@classmethod
|
|
179
|
-
def model_json_schema(
|
|
180
|
-
cls,
|
|
181
|
-
by_alias: bool = True,
|
|
182
|
-
ref_template: str = DEFAULT_REF_TEMPLATE,
|
|
183
|
-
schema_generator: type[GenerateJsonSchema] = GenerateJsonSchemaNoTitles,
|
|
184
|
-
mode: JsonSchemaMode = "validation",
|
|
185
|
-
) -> dict[str, Any]:
|
|
186
|
-
"""Returns the generated JSON schema for the class."""
|
|
187
|
-
cls.warn_for_unsupported_configurations()
|
|
188
|
-
return super().model_json_schema(
|
|
189
|
-
by_alias=by_alias,
|
|
190
|
-
ref_template=ref_template,
|
|
191
|
-
schema_generator=schema_generator,
|
|
192
|
-
mode=mode,
|
|
193
|
-
)
|
|
194
|
-
|
|
195
|
-
@classmethod
|
|
196
|
-
def warn_for_unsupported_configurations(cls) -> None:
|
|
197
|
-
"""Warns when a specific provider does not support provided config options."""
|
|
198
|
-
unsupported_tool_keys = _utils.get_unsupported_tool_config_keys(
|
|
199
|
-
cls.tool_config, cls.__tool_config_type__
|
|
200
|
-
)
|
|
201
|
-
if unsupported_tool_keys:
|
|
202
|
-
warnings.warn(
|
|
203
|
-
f"{cls.__provider__} does not support the following tool "
|
|
204
|
-
f"configurations, so they will be ignored: {unsupported_tool_keys}",
|
|
205
|
-
UserWarning,
|
|
206
|
-
)
|
|
207
|
-
|
|
208
|
-
if "strict" in cls.model_config and cls.__provider__ not in ["openai", "azure"]:
|
|
209
|
-
warnings.warn(
|
|
210
|
-
f"{cls.__provider__} does not support strict structured outputs, but "
|
|
211
|
-
"you have configured `strict=True` in your `ResponseModelConfigDict`. "
|
|
212
|
-
"Ignoring `strict` as this feature is only supported by OpenAI.",
|
|
213
|
-
UserWarning,
|
|
214
|
-
)
|
mirascope/core/base/toolkit.py
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
"""The module for defining the toolkit class for LLM call tools.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/tools.md#toolkit
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
import inspect
|
|
9
|
-
from abc import ABC
|
|
10
|
-
from collections.abc import Callable
|
|
11
|
-
from typing import Any, ClassVar, Concatenate, NamedTuple, TypeVar, cast, overload
|
|
12
|
-
|
|
13
|
-
from pydantic import BaseModel, ConfigDict, create_model
|
|
14
|
-
from typing_extensions import ParamSpec
|
|
15
|
-
|
|
16
|
-
from . import BaseTool
|
|
17
|
-
from ._utils import convert_function_to_base_tool, get_template_variables
|
|
18
|
-
|
|
19
|
-
_TOOLKIT_TOOL_METHOD_MARKER: str = "__toolkit_tool_method__"
|
|
20
|
-
|
|
21
|
-
_namespaces: set[str] = set()
|
|
22
|
-
|
|
23
|
-
P = ParamSpec("P")
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def is_toolkit_tool(method: Callable[..., Any] | BaseTool) -> bool:
|
|
27
|
-
return getattr(method, _TOOLKIT_TOOL_METHOD_MARKER, False) is True
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class ToolKitToolMethod(NamedTuple):
|
|
31
|
-
method: Callable[..., str]
|
|
32
|
-
template_vars: list[str]
|
|
33
|
-
template: str
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class BaseToolKit(BaseModel, ABC):
|
|
37
|
-
"""A class for defining tools for LLM call tools.
|
|
38
|
-
|
|
39
|
-
The class should have methods decorated with `@toolkit_tool` to create tools.
|
|
40
|
-
|
|
41
|
-
Example:
|
|
42
|
-
```python
|
|
43
|
-
from mirascope.core.base import BaseToolKit, toolkit_tool
|
|
44
|
-
from mirascope.core import openai
|
|
45
|
-
|
|
46
|
-
class BookRecommendationToolKit(BaseToolKit):
|
|
47
|
-
'''A toolkit for recommending books.'''
|
|
48
|
-
|
|
49
|
-
__namespace__: ClassVar[str | None] = 'book_tools'
|
|
50
|
-
reading_level: Literal["beginner", "advanced"]
|
|
51
|
-
|
|
52
|
-
@toolkit_tool
|
|
53
|
-
def format_book(self, title: str, author: str) -> str:
|
|
54
|
-
'''Returns the title and author of a book nicely formatted.
|
|
55
|
-
|
|
56
|
-
Reading level: {self.reading_level}
|
|
57
|
-
'''
|
|
58
|
-
return f"{title} by {author}"
|
|
59
|
-
|
|
60
|
-
@openai.call(model="gpt-4o")
|
|
61
|
-
def recommend_book(genre: str, reading_level: Literal["beginner", "advanced"]):
|
|
62
|
-
'''Recommend a {genre} book.'''
|
|
63
|
-
toolkit = BookRecommendationToolKit(reading_level=reading_level)
|
|
64
|
-
return {"tools": toolkit.create_tools()}
|
|
65
|
-
|
|
66
|
-
response = recommend_book("fantasy", "beginner")
|
|
67
|
-
if tool := response.tool:
|
|
68
|
-
output = tool.call()
|
|
69
|
-
print(output)
|
|
70
|
-
#> The Name of the Wind by Patrick Rothfuss
|
|
71
|
-
else:
|
|
72
|
-
print(response.content)
|
|
73
|
-
#> Sure! I would recommend...
|
|
74
|
-
```
|
|
75
|
-
"""
|
|
76
|
-
|
|
77
|
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
78
|
-
_toolkit_tool_methods: ClassVar[list[ToolKitToolMethod]]
|
|
79
|
-
__namespace__: ClassVar[str | None] = None
|
|
80
|
-
|
|
81
|
-
def create_tools(self) -> list[type[BaseTool]]:
|
|
82
|
-
"""The method to create the tools."""
|
|
83
|
-
tools = []
|
|
84
|
-
for method, template_vars, template in self._toolkit_tool_methods:
|
|
85
|
-
for var in template_vars:
|
|
86
|
-
if var.startswith("self."):
|
|
87
|
-
continue
|
|
88
|
-
# Replace non-self template variables with escaped double brackets so
|
|
89
|
-
# that templating `self` results in a future templateable string.
|
|
90
|
-
template = template.replace(f"{{{var}}}", f"{{{{{var}}}}}")
|
|
91
|
-
if inspect.isclass(method) and issubclass(method, BaseTool):
|
|
92
|
-
converted_method = create_model(
|
|
93
|
-
f"{self.__namespace__}_{method.__name__}",
|
|
94
|
-
__doc__=inspect.cleandoc(cast(str, method.__doc__)),
|
|
95
|
-
__base__=method,
|
|
96
|
-
__module__=method.__module__,
|
|
97
|
-
)
|
|
98
|
-
else:
|
|
99
|
-
converted_method = convert_function_to_base_tool(
|
|
100
|
-
method, BaseTool, template.format(self=self), self.__namespace__
|
|
101
|
-
)
|
|
102
|
-
for key in dir(self):
|
|
103
|
-
if not hasattr(converted_method, key):
|
|
104
|
-
setattr(converted_method, key, getattr(self, key))
|
|
105
|
-
tools.append(converted_method)
|
|
106
|
-
return tools
|
|
107
|
-
|
|
108
|
-
@classmethod
|
|
109
|
-
def __pydantic_init_subclass__(cls, **kwargs: Any) -> None: # noqa: ANN401
|
|
110
|
-
# validate the namespace
|
|
111
|
-
if cls.__namespace__:
|
|
112
|
-
if cls.__namespace__ in _namespaces:
|
|
113
|
-
raise ValueError(f"The namespace {cls.__namespace__} is already used")
|
|
114
|
-
_namespaces.add(cls.__namespace__)
|
|
115
|
-
|
|
116
|
-
cls._toolkit_tool_methods = []
|
|
117
|
-
for key in dir(cls):
|
|
118
|
-
attr = getattr(cls, key)
|
|
119
|
-
if not is_toolkit_tool(attr):
|
|
120
|
-
continue
|
|
121
|
-
# Validate the toolkit_tool_method
|
|
122
|
-
if (template := attr.__doc__) is None:
|
|
123
|
-
raise ValueError("The toolkit_tool method must have a docstring")
|
|
124
|
-
|
|
125
|
-
dedented_template = inspect.cleandoc(template)
|
|
126
|
-
template_vars = get_template_variables(dedented_template, False)
|
|
127
|
-
|
|
128
|
-
for var in template_vars:
|
|
129
|
-
if not var.startswith("self."):
|
|
130
|
-
# Skip template variables that do not start with self as they may
|
|
131
|
-
# be later templated e.g. if using a call as a tool.
|
|
132
|
-
continue
|
|
133
|
-
|
|
134
|
-
self_var = var[5:].split(".")[0]
|
|
135
|
-
|
|
136
|
-
# Expecting pydantic model fields or class attribute and property
|
|
137
|
-
if self_var in cls.model_fields or hasattr(cls, self_var):
|
|
138
|
-
continue
|
|
139
|
-
raise ValueError(
|
|
140
|
-
f"The toolkit_tool method template variable {var} is not found in "
|
|
141
|
-
"the class"
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
cls._toolkit_tool_methods.append(
|
|
145
|
-
ToolKitToolMethod(attr, template_vars, dedented_template)
|
|
146
|
-
)
|
|
147
|
-
if ABC in cls.__bases__ or any(
|
|
148
|
-
ABC in base.__bases__ for base in cls.__bases__ if base != BaseToolKit
|
|
149
|
-
):
|
|
150
|
-
return # Skip if the class is a generic class
|
|
151
|
-
|
|
152
|
-
if not cls._toolkit_tool_methods:
|
|
153
|
-
raise ValueError("No toolkit_tool method found")
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
_BaseToolKitT = TypeVar("_BaseToolKitT", bound=BaseToolKit)
|
|
157
|
-
_BaseToolT = TypeVar("_BaseToolT", bound=BaseTool)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
@overload
|
|
161
|
-
def toolkit_tool(
|
|
162
|
-
method: Callable[Concatenate[_BaseToolKitT, P], str],
|
|
163
|
-
) -> Callable[Concatenate[_BaseToolKitT, P], str]: ...
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
@overload
|
|
167
|
-
def toolkit_tool(
|
|
168
|
-
method: type[_BaseToolT],
|
|
169
|
-
) -> type[_BaseToolT]: ...
|
|
170
|
-
def toolkit_tool(
|
|
171
|
-
method: Callable[Concatenate[_BaseToolKitT, P], str] | type[_BaseToolT],
|
|
172
|
-
) -> Callable[Concatenate[_BaseToolKitT, P], str] | type[_BaseToolT]:
|
|
173
|
-
# Mark the method as a toolkit tool
|
|
174
|
-
setattr(method, _TOOLKIT_TOOL_METHOD_MARKER, True)
|
|
175
|
-
|
|
176
|
-
return method
|