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,111 +0,0 @@
|
|
|
1
|
-
"""Utility for converting `BaseMessageParam` to `BedrockMessageParam`."""
|
|
2
|
-
|
|
3
|
-
from typing import cast
|
|
4
|
-
|
|
5
|
-
from ...base import BaseMessageParam
|
|
6
|
-
from ...base._utils import get_image_type
|
|
7
|
-
from ...base._utils._parse_content_template import _load_media
|
|
8
|
-
from .._types import ConversationRoleType, InternalBedrockMessageParam
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def convert_message_params(
|
|
12
|
-
message_params: list[BaseMessageParam | InternalBedrockMessageParam],
|
|
13
|
-
) -> list[InternalBedrockMessageParam]:
|
|
14
|
-
converted_message_params = []
|
|
15
|
-
for message_param in message_params:
|
|
16
|
-
if not isinstance(message_param, BaseMessageParam):
|
|
17
|
-
converted_message_params.append(message_param)
|
|
18
|
-
elif isinstance((content := message_param.content), str):
|
|
19
|
-
converted_message_params.append(
|
|
20
|
-
{
|
|
21
|
-
"role": cast(ConversationRoleType, message_param.role),
|
|
22
|
-
"content": [{"text": content}],
|
|
23
|
-
}
|
|
24
|
-
)
|
|
25
|
-
else:
|
|
26
|
-
converted_content = []
|
|
27
|
-
for part in content:
|
|
28
|
-
if part.type == "text":
|
|
29
|
-
converted_content.append({"text": part.text})
|
|
30
|
-
elif part.type == "image":
|
|
31
|
-
if part.media_type not in [
|
|
32
|
-
"image/jpeg",
|
|
33
|
-
"image/png",
|
|
34
|
-
"image/gif",
|
|
35
|
-
"image/webp",
|
|
36
|
-
]:
|
|
37
|
-
raise ValueError(
|
|
38
|
-
f"Unsupported image media type: {part.media_type}. Bedrock"
|
|
39
|
-
" currently only supports JPEG, PNG, GIF, and WebP images."
|
|
40
|
-
)
|
|
41
|
-
converted_content.append(
|
|
42
|
-
{
|
|
43
|
-
"image": {
|
|
44
|
-
"format": part.media_type.split("/")[-1],
|
|
45
|
-
"source": {"bytes": part.image},
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
)
|
|
49
|
-
elif part.type == "image_url":
|
|
50
|
-
image = _load_media(part.url)
|
|
51
|
-
converted_content.append(
|
|
52
|
-
{
|
|
53
|
-
"image": {
|
|
54
|
-
"format": get_image_type(image),
|
|
55
|
-
"source": {"bytes": image},
|
|
56
|
-
},
|
|
57
|
-
}
|
|
58
|
-
)
|
|
59
|
-
elif part.type == "tool_result":
|
|
60
|
-
if converted_content:
|
|
61
|
-
converted_message_params.append(
|
|
62
|
-
{"role": message_param.role, "content": converted_content}
|
|
63
|
-
)
|
|
64
|
-
converted_content = []
|
|
65
|
-
|
|
66
|
-
converted_message_params.append(
|
|
67
|
-
{
|
|
68
|
-
"role": "user",
|
|
69
|
-
"content": [
|
|
70
|
-
{
|
|
71
|
-
"toolResult": {
|
|
72
|
-
"toolUseId": part.id,
|
|
73
|
-
"content": [{"text": part.content}]
|
|
74
|
-
if isinstance(part.content, str)
|
|
75
|
-
else part.content,
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
],
|
|
79
|
-
}
|
|
80
|
-
)
|
|
81
|
-
elif part.type == "tool_call":
|
|
82
|
-
if converted_content:
|
|
83
|
-
converted_message_params.append(
|
|
84
|
-
{"role": message_param.role, "content": converted_content}
|
|
85
|
-
)
|
|
86
|
-
converted_content = []
|
|
87
|
-
|
|
88
|
-
converted_message_params.append(
|
|
89
|
-
{
|
|
90
|
-
"role": "assistant",
|
|
91
|
-
"content": [
|
|
92
|
-
{
|
|
93
|
-
"toolUse": {
|
|
94
|
-
"toolUseId": part.id,
|
|
95
|
-
"name": part.name,
|
|
96
|
-
"input": part.args,
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
],
|
|
100
|
-
}
|
|
101
|
-
)
|
|
102
|
-
else:
|
|
103
|
-
raise ValueError(
|
|
104
|
-
"Bedrock currently only supports text and image parts. "
|
|
105
|
-
f"Part provided: {part.type}"
|
|
106
|
-
)
|
|
107
|
-
if converted_content:
|
|
108
|
-
converted_message_params.append(
|
|
109
|
-
{"role": message_param.role, "content": converted_content}
|
|
110
|
-
)
|
|
111
|
-
return converted_message_params
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"""Get the JSON output from a completion response."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
|
|
5
|
-
from ..call_response import BedrockCallResponse
|
|
6
|
-
from ..call_response_chunk import BedrockCallResponseChunk
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def get_json_output(
|
|
10
|
-
response: BedrockCallResponse | BedrockCallResponseChunk, json_mode: bool
|
|
11
|
-
) -> str:
|
|
12
|
-
"""Get the JSON output from a completion response."""
|
|
13
|
-
if isinstance(response, BedrockCallResponse):
|
|
14
|
-
if json_mode and response.content:
|
|
15
|
-
return response.content
|
|
16
|
-
elif message := response.message:
|
|
17
|
-
tool_calls = [t for c in message["content"] if (t := c.get("toolUse"))]
|
|
18
|
-
if tool_calls and (tool_call_input := tool_calls[0].get("input", {})):
|
|
19
|
-
return json.dumps(tool_call_input)
|
|
20
|
-
raise ValueError("No tool call or JSON object found in response.")
|
|
21
|
-
else:
|
|
22
|
-
if json_mode:
|
|
23
|
-
return response.content
|
|
24
|
-
elif (
|
|
25
|
-
(content_block_delta := response.chunk.get("contentBlockDelta"))
|
|
26
|
-
and (tool_use := content_block_delta["delta"].get("toolUse"))
|
|
27
|
-
and (tool_use_input := tool_use.get("input"))
|
|
28
|
-
):
|
|
29
|
-
return tool_use_input
|
|
30
|
-
return ""
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"""Handles the stream of completion chunks."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
from collections.abc import AsyncGenerator, Generator
|
|
5
|
-
|
|
6
|
-
from mypy_boto3_bedrock_runtime.type_defs import (
|
|
7
|
-
ToolUseBlockOutputTypeDef,
|
|
8
|
-
)
|
|
9
|
-
from typing_extensions import TypedDict
|
|
10
|
-
|
|
11
|
-
from .._types import (
|
|
12
|
-
AsyncStreamOutputChunk,
|
|
13
|
-
StreamOutputChunk,
|
|
14
|
-
ToolUseBlockContentTypeDef,
|
|
15
|
-
)
|
|
16
|
-
from ..call_response_chunk import BedrockCallResponseChunk
|
|
17
|
-
from ..tool import BedrockTool
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class ToolUseChunk(TypedDict):
|
|
21
|
-
tool_use_id: str
|
|
22
|
-
input_chunk: str
|
|
23
|
-
name: str
|
|
24
|
-
stop: bool
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def _handle_chunk(
|
|
28
|
-
chunk: StreamOutputChunk | AsyncStreamOutputChunk,
|
|
29
|
-
current_tool_use_chunk: ToolUseChunk | None,
|
|
30
|
-
tool_types: list[type[BedrockTool]] | None,
|
|
31
|
-
) -> tuple[
|
|
32
|
-
BedrockCallResponseChunk | None,
|
|
33
|
-
BedrockTool | None,
|
|
34
|
-
ToolUseChunk | None,
|
|
35
|
-
]:
|
|
36
|
-
"""Handles a chunk of the stream."""
|
|
37
|
-
if not tool_types:
|
|
38
|
-
return BedrockCallResponseChunk(chunk=chunk), None, None
|
|
39
|
-
elif (content_block_start := chunk.get("contentBlockStart")) and (
|
|
40
|
-
tool_use := content_block_start["start"].get("toolUse")
|
|
41
|
-
):
|
|
42
|
-
current_tool_use_chunk = ToolUseChunk(
|
|
43
|
-
tool_use_id=tool_use["toolUseId"],
|
|
44
|
-
input_chunk="",
|
|
45
|
-
name=tool_use["name"],
|
|
46
|
-
stop=False,
|
|
47
|
-
)
|
|
48
|
-
elif (
|
|
49
|
-
(content_block_delta := chunk.get("contentBlockDelta"))
|
|
50
|
-
and (tool_use := content_block_delta["delta"].get("toolUse"))
|
|
51
|
-
and current_tool_use_chunk
|
|
52
|
-
and not current_tool_use_chunk["stop"]
|
|
53
|
-
):
|
|
54
|
-
current_tool_use_chunk["input_chunk"] += tool_use["input"]
|
|
55
|
-
return None, None, current_tool_use_chunk
|
|
56
|
-
elif "contentBlockStop" in chunk and current_tool_use_chunk:
|
|
57
|
-
current_tool_use_chunk["stop"] = True
|
|
58
|
-
return None, None, current_tool_use_chunk
|
|
59
|
-
elif current_tool_use_chunk and current_tool_use_chunk["stop"]:
|
|
60
|
-
for tool_type in tool_types:
|
|
61
|
-
if current_tool_use_chunk["name"] == tool_type._name():
|
|
62
|
-
current_tool_use = ToolUseBlockContentTypeDef(
|
|
63
|
-
toolUse=ToolUseBlockOutputTypeDef(
|
|
64
|
-
toolUseId=current_tool_use_chunk["tool_use_id"],
|
|
65
|
-
input=json.loads(current_tool_use_chunk["input_chunk"]),
|
|
66
|
-
name=current_tool_use_chunk["name"],
|
|
67
|
-
)
|
|
68
|
-
)
|
|
69
|
-
return (
|
|
70
|
-
BedrockCallResponseChunk(chunk=chunk),
|
|
71
|
-
tool_type.from_tool_call(current_tool_use),
|
|
72
|
-
None,
|
|
73
|
-
)
|
|
74
|
-
return BedrockCallResponseChunk(chunk=chunk), None, current_tool_use_chunk
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def handle_stream(
|
|
78
|
-
stream: Generator[StreamOutputChunk, None, None],
|
|
79
|
-
tool_types: list[type[BedrockTool]] | None,
|
|
80
|
-
partial_tools: bool = False,
|
|
81
|
-
) -> Generator[tuple[BedrockCallResponseChunk, BedrockTool | None], None, None]:
|
|
82
|
-
"""Iterator over the stream and constructs tools as they are streamed."""
|
|
83
|
-
current_tool_use_chunk = None
|
|
84
|
-
for chunk in stream:
|
|
85
|
-
call_response, tool, current_tool_use_chunk = _handle_chunk(
|
|
86
|
-
chunk, current_tool_use_chunk, tool_types
|
|
87
|
-
)
|
|
88
|
-
if call_response:
|
|
89
|
-
yield call_response, tool
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
async def handle_stream_async(
|
|
93
|
-
stream: AsyncGenerator[AsyncStreamOutputChunk, None],
|
|
94
|
-
tool_types: list[type[BedrockTool]] | None,
|
|
95
|
-
partial_tools: bool = False,
|
|
96
|
-
) -> AsyncGenerator[tuple[BedrockCallResponseChunk, BedrockTool | None], None]:
|
|
97
|
-
"""Async iterator over the stream and constructs tools as they are streamed."""
|
|
98
|
-
current_tool_use_chunk = None
|
|
99
|
-
async for chunk in stream:
|
|
100
|
-
call_response, tool, current_tool_use_chunk = _handle_chunk(
|
|
101
|
-
chunk, current_tool_use_chunk, tool_types
|
|
102
|
-
)
|
|
103
|
-
if call_response:
|
|
104
|
-
yield call_response, tool
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
from typing import cast
|
|
2
|
-
|
|
3
|
-
from mirascope.core import BaseMessageParam
|
|
4
|
-
from mirascope.core.base import (
|
|
5
|
-
DocumentPart,
|
|
6
|
-
ImagePart,
|
|
7
|
-
TextPart,
|
|
8
|
-
ToolCallPart,
|
|
9
|
-
ToolResultPart,
|
|
10
|
-
)
|
|
11
|
-
from mirascope.core.base._utils._base_message_param_converter import (
|
|
12
|
-
BaseMessageParamConverter,
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
from .._types import (
|
|
16
|
-
InternalBedrockMessageParam,
|
|
17
|
-
)
|
|
18
|
-
from . import convert_message_params
|
|
19
|
-
|
|
20
|
-
IMAGE_FORMAT_MAP = {
|
|
21
|
-
"JPEG": "image/jpeg",
|
|
22
|
-
"PNG": "image/png",
|
|
23
|
-
"GIF": "image/gif",
|
|
24
|
-
"WEBP": "image/webp",
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class BedrockMessageParamConverter(BaseMessageParamConverter):
|
|
29
|
-
"""Converts between Bedrock `InternalBedrockMessageParam` and Mirascope `BaseMessageParam`."""
|
|
30
|
-
|
|
31
|
-
@staticmethod
|
|
32
|
-
def to_provider(
|
|
33
|
-
message_params: list[BaseMessageParam],
|
|
34
|
-
) -> list[InternalBedrockMessageParam]:
|
|
35
|
-
"""
|
|
36
|
-
Convert from Mirascope `BaseMessageParam` to Bedrock's `InternalBedrockMessageParam`.
|
|
37
|
-
"""
|
|
38
|
-
return convert_message_params(
|
|
39
|
-
cast(list[BaseMessageParam | InternalBedrockMessageParam], message_params)
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
@staticmethod
|
|
43
|
-
def from_provider(
|
|
44
|
-
message_params: list[InternalBedrockMessageParam],
|
|
45
|
-
) -> list[BaseMessageParam]:
|
|
46
|
-
"""
|
|
47
|
-
Convert from Bedrock's `InternalBedrockMessageParam` to Mirascope `BaseMessageParam`.
|
|
48
|
-
"""
|
|
49
|
-
converted = []
|
|
50
|
-
for message_param in message_params:
|
|
51
|
-
message_param["role"]
|
|
52
|
-
content_blocks = message_param["content"]
|
|
53
|
-
|
|
54
|
-
converted_content = []
|
|
55
|
-
for block in content_blocks:
|
|
56
|
-
if "text" in block:
|
|
57
|
-
text = block["text"]
|
|
58
|
-
if not isinstance(text, str):
|
|
59
|
-
raise ValueError("Text content must be a string.")
|
|
60
|
-
converted_content.append(TextPart(type="text", text=text))
|
|
61
|
-
|
|
62
|
-
elif "image" in block:
|
|
63
|
-
image_block = block["image"]
|
|
64
|
-
img_format = image_block["format"] # e.g. "JPEG"
|
|
65
|
-
source = image_block["source"]
|
|
66
|
-
if "bytes" not in source or not isinstance(source["bytes"], bytes):
|
|
67
|
-
raise ValueError(
|
|
68
|
-
"Image block must have 'source.bytes' as bytes."
|
|
69
|
-
)
|
|
70
|
-
media_type = IMAGE_FORMAT_MAP.get(img_format.upper())
|
|
71
|
-
if not media_type:
|
|
72
|
-
raise ValueError(f"Unsupported image format: {img_format}")
|
|
73
|
-
converted_content.append(
|
|
74
|
-
ImagePart(
|
|
75
|
-
type="image",
|
|
76
|
-
media_type=media_type,
|
|
77
|
-
image=source["bytes"],
|
|
78
|
-
detail=None,
|
|
79
|
-
)
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
elif "document" in block:
|
|
83
|
-
doc_block = block["document"]
|
|
84
|
-
doc_format = doc_block["format"] # e.g. "PDF"
|
|
85
|
-
if doc_format.upper() != "PDF":
|
|
86
|
-
raise ValueError(
|
|
87
|
-
f"Unsupported document format: {doc_format}. Only PDF is supported."
|
|
88
|
-
)
|
|
89
|
-
source = doc_block["source"]
|
|
90
|
-
if "bytes" not in source or not isinstance(source["bytes"], bytes):
|
|
91
|
-
raise ValueError(
|
|
92
|
-
"Document block must have 'source.bytes' as bytes."
|
|
93
|
-
)
|
|
94
|
-
converted_content.append(
|
|
95
|
-
DocumentPart(
|
|
96
|
-
type="document",
|
|
97
|
-
media_type="application/pdf",
|
|
98
|
-
document=source["bytes"],
|
|
99
|
-
)
|
|
100
|
-
)
|
|
101
|
-
elif "toolUse" in block:
|
|
102
|
-
tool_use = block["toolUse"]
|
|
103
|
-
|
|
104
|
-
tool_use_part = ToolCallPart(
|
|
105
|
-
type="tool_call",
|
|
106
|
-
name=tool_use["name"],
|
|
107
|
-
id=tool_use["toolUseId"],
|
|
108
|
-
args=tool_use["input"],
|
|
109
|
-
)
|
|
110
|
-
if converted_content:
|
|
111
|
-
converted_content.append(tool_use_part)
|
|
112
|
-
converted.append(
|
|
113
|
-
BaseMessageParam(
|
|
114
|
-
role=message_param["role"], content=converted_content
|
|
115
|
-
)
|
|
116
|
-
)
|
|
117
|
-
converted_content = []
|
|
118
|
-
continue
|
|
119
|
-
|
|
120
|
-
converted.append(
|
|
121
|
-
BaseMessageParam(
|
|
122
|
-
role="assistant",
|
|
123
|
-
content=[tool_use_part],
|
|
124
|
-
)
|
|
125
|
-
)
|
|
126
|
-
elif "toolResult" in block:
|
|
127
|
-
tool_result = block["toolResult"]
|
|
128
|
-
if converted_content:
|
|
129
|
-
converted.append(
|
|
130
|
-
BaseMessageParam(
|
|
131
|
-
role=message_param["role"], content=converted_content
|
|
132
|
-
)
|
|
133
|
-
)
|
|
134
|
-
converted_content = []
|
|
135
|
-
converted.append(
|
|
136
|
-
BaseMessageParam(
|
|
137
|
-
role="user",
|
|
138
|
-
content=[
|
|
139
|
-
ToolResultPart(
|
|
140
|
-
type="tool_result",
|
|
141
|
-
id=tool_result["toolUseId"],
|
|
142
|
-
content=tool_result["content"]
|
|
143
|
-
if isinstance(tool_result["content"], str)
|
|
144
|
-
else tool_result["content"][0]["text"], # pyright: ignore [reportTypedDictNotRequiredAccess]
|
|
145
|
-
is_error=tool_result.get("isError", False),
|
|
146
|
-
)
|
|
147
|
-
],
|
|
148
|
-
)
|
|
149
|
-
)
|
|
150
|
-
else:
|
|
151
|
-
raise ValueError(
|
|
152
|
-
"Content block does not contain supported content."
|
|
153
|
-
)
|
|
154
|
-
if len(converted_content) == 1 and isinstance(
|
|
155
|
-
converted_content[0], TextPart
|
|
156
|
-
):
|
|
157
|
-
converted.append(
|
|
158
|
-
BaseMessageParam(
|
|
159
|
-
role=message_param["role"],
|
|
160
|
-
content=converted_content[0].text,
|
|
161
|
-
)
|
|
162
|
-
)
|
|
163
|
-
else:
|
|
164
|
-
if converted_content:
|
|
165
|
-
converted.append(
|
|
166
|
-
BaseMessageParam(
|
|
167
|
-
role=message_param["role"],
|
|
168
|
-
content=converted_content,
|
|
169
|
-
)
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
return converted
|
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
"""This module contains the setup_call function for Bedrock tools."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import os
|
|
6
|
-
from collections.abc import AsyncGenerator, Awaitable, Callable, Coroutine, Generator
|
|
7
|
-
from functools import wraps
|
|
8
|
-
from typing import Any, ParamSpec, cast, overload
|
|
9
|
-
|
|
10
|
-
import aiobotocore.client
|
|
11
|
-
from aiobotocore.session import AioSession, get_session
|
|
12
|
-
from boto3.session import Session
|
|
13
|
-
from mypy_boto3_bedrock_runtime import BedrockRuntimeClient
|
|
14
|
-
from mypy_boto3_bedrock_runtime.type_defs import (
|
|
15
|
-
ConverseResponseTypeDef,
|
|
16
|
-
ConverseStreamResponseTypeDef,
|
|
17
|
-
ToolChoiceTypeDef,
|
|
18
|
-
ToolConfigurationTypeDef,
|
|
19
|
-
)
|
|
20
|
-
from pydantic import BaseModel
|
|
21
|
-
from types_aiobotocore_bedrock_runtime import (
|
|
22
|
-
BedrockRuntimeClient as AsyncBedrockRuntimeClient,
|
|
23
|
-
)
|
|
24
|
-
from types_aiobotocore_bedrock_runtime.type_defs import (
|
|
25
|
-
ConverseRequestRequestTypeDef as AsyncConverseRequestRequestTypeDef,
|
|
26
|
-
)
|
|
27
|
-
from types_aiobotocore_bedrock_runtime.type_defs import (
|
|
28
|
-
ConverseResponseTypeDef as AsyncConverseResponseTypeDef,
|
|
29
|
-
)
|
|
30
|
-
from types_aiobotocore_bedrock_runtime.type_defs import (
|
|
31
|
-
ConverseStreamRequestRequestTypeDef as AsyncConverseStreamRequestRequestTypeDef,
|
|
32
|
-
)
|
|
33
|
-
from types_aiobotocore_bedrock_runtime.type_defs import (
|
|
34
|
-
ConverseStreamResponseTypeDef as AsyncConverseStreamResponseTypeDef,
|
|
35
|
-
)
|
|
36
|
-
from typing_extensions import Unpack
|
|
37
|
-
|
|
38
|
-
from ... import BaseMessageParam
|
|
39
|
-
from ...base import BaseTool, _utils
|
|
40
|
-
from ...base._utils import (
|
|
41
|
-
AsyncCreateFn,
|
|
42
|
-
CreateFn,
|
|
43
|
-
fn_is_async,
|
|
44
|
-
get_async_create_fn,
|
|
45
|
-
get_create_fn,
|
|
46
|
-
)
|
|
47
|
-
from ...base.call_params import CommonCallParams
|
|
48
|
-
from ...base.stream_config import StreamConfig
|
|
49
|
-
from .._call_kwargs import BedrockCallKwargs
|
|
50
|
-
from .._types import (
|
|
51
|
-
AsyncStreamOutputChunk,
|
|
52
|
-
InternalBedrockMessageParam,
|
|
53
|
-
StreamOutputChunk,
|
|
54
|
-
)
|
|
55
|
-
from ..call_params import BedrockCallParams
|
|
56
|
-
from ..dynamic_config import AsyncBedrockDynamicConfig, BedrockDynamicConfig
|
|
57
|
-
from ..tool import BedrockTool
|
|
58
|
-
from ._convert_common_call_params import convert_common_call_params
|
|
59
|
-
from ._convert_message_params import convert_message_params
|
|
60
|
-
|
|
61
|
-
_P = ParamSpec("_P")
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def _extract_sync_stream_fn(
|
|
65
|
-
fn: Callable[_P, ConverseStreamResponseTypeDef], model: str
|
|
66
|
-
) -> Callable[_P, Generator[StreamOutputChunk, None, None]]:
|
|
67
|
-
@wraps(fn)
|
|
68
|
-
def _inner(
|
|
69
|
-
*args: _P.args, **kwargs: _P.kwargs
|
|
70
|
-
) -> Generator[StreamOutputChunk, None, None]:
|
|
71
|
-
response = fn(*args, **kwargs)
|
|
72
|
-
for chunk in response["stream"]:
|
|
73
|
-
yield StreamOutputChunk(
|
|
74
|
-
responseMetadata=response["ResponseMetadata"], model=model, **chunk
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
return _inner
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def _extract_async_stream_fn(
|
|
81
|
-
fn: Callable[_P, Coroutine[Any, Any, AsyncConverseStreamResponseTypeDef]],
|
|
82
|
-
model: str,
|
|
83
|
-
) -> Callable[_P, AsyncGenerator[AsyncStreamOutputChunk, None]]:
|
|
84
|
-
@wraps(fn)
|
|
85
|
-
async def _inner(
|
|
86
|
-
*args: _P.args, **kwargs: _P.kwargs
|
|
87
|
-
) -> AsyncGenerator[AsyncStreamOutputChunk, None]:
|
|
88
|
-
response = await fn(*args, **kwargs)
|
|
89
|
-
async for chunk in response["stream"]:
|
|
90
|
-
yield AsyncStreamOutputChunk(
|
|
91
|
-
responseMetadata=response["ResponseMetadata"], model=model, **chunk
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
return _inner
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
class _AsyncBedrockRuntimeWrappedClient:
|
|
98
|
-
def __init__(self, session: AioSession, model: str) -> None:
|
|
99
|
-
self.session: AioSession = session
|
|
100
|
-
self.model: str = model
|
|
101
|
-
|
|
102
|
-
async def converse(
|
|
103
|
-
self, **kwargs: Unpack[AsyncConverseRequestRequestTypeDef]
|
|
104
|
-
) -> AsyncConverseResponseTypeDef:
|
|
105
|
-
async with self.session.create_client("bedrock-runtime") as client:
|
|
106
|
-
return await client.converse(**kwargs)
|
|
107
|
-
|
|
108
|
-
async def converse_stream(
|
|
109
|
-
self, **kwargs: Unpack[AsyncConverseStreamRequestRequestTypeDef]
|
|
110
|
-
) -> AsyncGenerator[AsyncStreamOutputChunk, None]:
|
|
111
|
-
async with self.session.create_client("bedrock-runtime") as client:
|
|
112
|
-
response = await client.converse_stream(**kwargs)
|
|
113
|
-
async for chunk in response["stream"]:
|
|
114
|
-
yield AsyncStreamOutputChunk(
|
|
115
|
-
responseMetadata=response["ResponseMetadata"],
|
|
116
|
-
model=self.model,
|
|
117
|
-
**chunk,
|
|
118
|
-
)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
@overload
|
|
122
|
-
def setup_call(
|
|
123
|
-
*,
|
|
124
|
-
model: str,
|
|
125
|
-
client: AsyncBedrockRuntimeClient | None,
|
|
126
|
-
fn: Callable[..., Awaitable[AsyncBedrockDynamicConfig]],
|
|
127
|
-
fn_args: dict[str, Any],
|
|
128
|
-
dynamic_config: AsyncBedrockDynamicConfig,
|
|
129
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
130
|
-
json_mode: bool,
|
|
131
|
-
call_params: BedrockCallParams | CommonCallParams,
|
|
132
|
-
response_model: type[BaseModel] | None,
|
|
133
|
-
stream: bool | StreamConfig,
|
|
134
|
-
) -> tuple[
|
|
135
|
-
AsyncCreateFn[AsyncConverseResponseTypeDef, AsyncStreamOutputChunk],
|
|
136
|
-
str | None,
|
|
137
|
-
list[InternalBedrockMessageParam],
|
|
138
|
-
list[type[BedrockTool]] | None,
|
|
139
|
-
BedrockCallKwargs,
|
|
140
|
-
]: ...
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
@overload
|
|
144
|
-
def setup_call(
|
|
145
|
-
*,
|
|
146
|
-
model: str,
|
|
147
|
-
client: BedrockRuntimeClient | None,
|
|
148
|
-
fn: Callable[..., BedrockDynamicConfig],
|
|
149
|
-
fn_args: dict[str, Any],
|
|
150
|
-
dynamic_config: BedrockDynamicConfig,
|
|
151
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
152
|
-
json_mode: bool,
|
|
153
|
-
call_params: BedrockCallParams | CommonCallParams,
|
|
154
|
-
response_model: type[BaseModel] | None,
|
|
155
|
-
stream: bool | StreamConfig,
|
|
156
|
-
) -> tuple[
|
|
157
|
-
CreateFn[ConverseResponseTypeDef, StreamOutputChunk],
|
|
158
|
-
str | None,
|
|
159
|
-
list[InternalBedrockMessageParam],
|
|
160
|
-
list[type[BedrockTool]] | None,
|
|
161
|
-
BedrockCallKwargs,
|
|
162
|
-
]: ...
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
def setup_call(
|
|
166
|
-
*,
|
|
167
|
-
model: str,
|
|
168
|
-
client: BedrockRuntimeClient | AsyncBedrockRuntimeClient | None,
|
|
169
|
-
fn: Callable[..., BedrockDynamicConfig]
|
|
170
|
-
| Callable[..., Awaitable[AsyncBedrockDynamicConfig]],
|
|
171
|
-
fn_args: dict[str, Any],
|
|
172
|
-
dynamic_config: BedrockDynamicConfig | AsyncBedrockDynamicConfig,
|
|
173
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
174
|
-
json_mode: bool,
|
|
175
|
-
call_params: BedrockCallParams | CommonCallParams,
|
|
176
|
-
response_model: type[BaseModel] | None,
|
|
177
|
-
stream: bool | StreamConfig,
|
|
178
|
-
) -> tuple[
|
|
179
|
-
AsyncCreateFn[AsyncConverseResponseTypeDef, AsyncStreamOutputChunk]
|
|
180
|
-
| CreateFn[ConverseResponseTypeDef, StreamOutputChunk],
|
|
181
|
-
str | None,
|
|
182
|
-
list[InternalBedrockMessageParam],
|
|
183
|
-
list[type[BedrockTool]] | None,
|
|
184
|
-
BedrockCallKwargs,
|
|
185
|
-
]:
|
|
186
|
-
prompt_template, messages, tool_types, base_call_kwargs = _utils.setup_call(
|
|
187
|
-
fn,
|
|
188
|
-
fn_args,
|
|
189
|
-
dynamic_config,
|
|
190
|
-
tools,
|
|
191
|
-
BedrockTool,
|
|
192
|
-
call_params,
|
|
193
|
-
convert_common_call_params,
|
|
194
|
-
)
|
|
195
|
-
call_kwargs = cast(BedrockCallKwargs, base_call_kwargs)
|
|
196
|
-
messages = cast(list[InternalBedrockMessageParam | BaseMessageParam], messages)
|
|
197
|
-
messages = convert_message_params(messages)
|
|
198
|
-
if messages[0]["role"] == "system":
|
|
199
|
-
call_kwargs["system"] = [
|
|
200
|
-
{"text": text}
|
|
201
|
-
for c in messages.pop(0)["content"]
|
|
202
|
-
if (text := c.get("text"))
|
|
203
|
-
]
|
|
204
|
-
|
|
205
|
-
if call_kwargs_tools := call_kwargs.pop("tools", None):
|
|
206
|
-
call_kwargs["toolConfig"] = cast(
|
|
207
|
-
ToolConfigurationTypeDef, {"tools": call_kwargs_tools}
|
|
208
|
-
)
|
|
209
|
-
if json_mode:
|
|
210
|
-
json_mode_content = _utils.json_mode_content(response_model)
|
|
211
|
-
if "text" in messages[-1]["content"][-1]:
|
|
212
|
-
messages[-1]["content"][-1]["text"] += json_mode_content
|
|
213
|
-
else:
|
|
214
|
-
messages[-1]["content"] = [
|
|
215
|
-
*messages[-1]["content"],
|
|
216
|
-
{"text": json_mode_content},
|
|
217
|
-
]
|
|
218
|
-
elif response_model:
|
|
219
|
-
assert tool_types, "At least one tool must be provided for extraction."
|
|
220
|
-
if "toolConfig" in call_kwargs:
|
|
221
|
-
call_kwargs["toolConfig"]["toolChoice"] = cast(
|
|
222
|
-
ToolChoiceTypeDef, {"tool": {"name": tool_types[0]._name()}}
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
call_kwargs |= cast(BedrockCallKwargs, {"modelId": model, "messages": messages})
|
|
226
|
-
|
|
227
|
-
env_vars = {}
|
|
228
|
-
if access_key_id := os.getenv("AWS_ACCESS_KEY_ID"):
|
|
229
|
-
env_vars["aws_access_key_id"] = access_key_id
|
|
230
|
-
if secret_access_key := os.getenv("AWS_SECRET_ACCESS_KEY"):
|
|
231
|
-
env_vars["aws_secret_access_key"] = secret_access_key
|
|
232
|
-
if session_token := os.getenv("AWS_SESSION_TOKEN"):
|
|
233
|
-
env_vars["aws_session_token"] = session_token
|
|
234
|
-
if region_name := os.getenv("AWS_REGION_NAME"):
|
|
235
|
-
env_vars["region_name"] = region_name
|
|
236
|
-
if profile_name := os.getenv("AWS_PROFILE"):
|
|
237
|
-
env_vars["profile_name"] = profile_name
|
|
238
|
-
if client is None:
|
|
239
|
-
if fn_is_async(fn):
|
|
240
|
-
session = get_session(env_vars=env_vars)
|
|
241
|
-
_client = _AsyncBedrockRuntimeWrappedClient(session, model)
|
|
242
|
-
else:
|
|
243
|
-
session = Session(**env_vars)
|
|
244
|
-
_client = session.client("bedrock-runtime")
|
|
245
|
-
else:
|
|
246
|
-
_client = client
|
|
247
|
-
if isinstance(_client, aiobotocore.client.AioBaseClient):
|
|
248
|
-
create = get_async_create_fn(
|
|
249
|
-
_client.converse, _extract_async_stream_fn(_client.converse_stream, model)
|
|
250
|
-
)
|
|
251
|
-
elif isinstance(_client, _AsyncBedrockRuntimeWrappedClient):
|
|
252
|
-
create = get_async_create_fn(_client.converse, _client.converse_stream)
|
|
253
|
-
|
|
254
|
-
else:
|
|
255
|
-
create = get_create_fn(
|
|
256
|
-
_client.converse, _extract_sync_stream_fn(_client.converse_stream, model)
|
|
257
|
-
)
|
|
258
|
-
return create, prompt_template, messages, tool_types, call_kwargs
|