mirascope 1.25.7__py3-none-any.whl → 2.0.0a0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mirascope/__init__.py +3 -59
- mirascope/graphs/__init__.py +22 -0
- mirascope/{experimental/graphs → graphs}/finite_state_machine.py +70 -159
- mirascope/llm/__init__.py +206 -16
- mirascope/llm/agents/__init__.py +15 -0
- mirascope/llm/agents/agent.py +97 -0
- mirascope/llm/agents/agent_template.py +45 -0
- mirascope/llm/agents/decorator.py +176 -0
- mirascope/llm/calls/__init__.py +16 -0
- mirascope/llm/calls/base_call.py +33 -0
- mirascope/llm/calls/calls.py +315 -0
- mirascope/llm/calls/decorator.py +255 -0
- mirascope/llm/clients/__init__.py +34 -0
- mirascope/llm/clients/anthropic/__init__.py +11 -0
- mirascope/llm/clients/anthropic/_utils/__init__.py +13 -0
- mirascope/llm/clients/anthropic/_utils/decode.py +244 -0
- mirascope/llm/clients/anthropic/_utils/encode.py +243 -0
- mirascope/llm/clients/anthropic/clients.py +819 -0
- mirascope/llm/clients/anthropic/model_ids.py +8 -0
- mirascope/llm/clients/base/__init__.py +15 -0
- mirascope/llm/clients/base/_utils.py +192 -0
- mirascope/llm/clients/base/client.py +1256 -0
- mirascope/llm/clients/base/kwargs.py +12 -0
- mirascope/llm/clients/base/params.py +93 -0
- mirascope/llm/clients/google/__init__.py +6 -0
- mirascope/llm/clients/google/_utils/__init__.py +13 -0
- mirascope/llm/clients/google/_utils/decode.py +231 -0
- mirascope/llm/clients/google/_utils/encode.py +279 -0
- mirascope/llm/clients/google/clients.py +853 -0
- mirascope/llm/clients/google/message.py +7 -0
- mirascope/llm/clients/google/model_ids.py +15 -0
- mirascope/llm/clients/openai/__init__.py +25 -0
- mirascope/llm/clients/openai/completions/__init__.py +9 -0
- mirascope/llm/clients/openai/completions/_utils/__init__.py +13 -0
- mirascope/llm/clients/openai/completions/_utils/decode.py +187 -0
- mirascope/llm/clients/openai/completions/_utils/encode.py +358 -0
- mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
- mirascope/llm/clients/openai/completions/clients.py +833 -0
- mirascope/llm/clients/openai/completions/model_ids.py +8 -0
- mirascope/llm/clients/openai/responses/__init__.py +9 -0
- mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
- mirascope/llm/clients/openai/responses/_utils/decode.py +194 -0
- mirascope/llm/clients/openai/responses/_utils/encode.py +333 -0
- mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
- mirascope/llm/clients/openai/responses/clients.py +832 -0
- mirascope/llm/clients/openai/responses/model_ids.py +8 -0
- mirascope/llm/clients/openai/shared/__init__.py +7 -0
- mirascope/llm/clients/openai/shared/_utils.py +55 -0
- mirascope/llm/clients/providers.py +175 -0
- mirascope/llm/content/__init__.py +70 -0
- mirascope/llm/content/audio.py +173 -0
- mirascope/llm/content/document.py +94 -0
- mirascope/llm/content/image.py +206 -0
- mirascope/llm/content/text.py +47 -0
- mirascope/llm/content/thought.py +58 -0
- mirascope/llm/content/tool_call.py +63 -0
- mirascope/llm/content/tool_output.py +26 -0
- mirascope/llm/context/__init__.py +6 -0
- mirascope/llm/context/_utils.py +28 -0
- mirascope/llm/context/context.py +24 -0
- mirascope/llm/exceptions.py +105 -0
- mirascope/llm/formatting/__init__.py +22 -0
- mirascope/llm/formatting/_utils.py +74 -0
- mirascope/llm/formatting/format.py +104 -0
- mirascope/llm/formatting/from_call_args.py +30 -0
- mirascope/llm/formatting/partial.py +58 -0
- mirascope/llm/formatting/types.py +109 -0
- mirascope/llm/mcp/__init__.py +5 -0
- mirascope/llm/mcp/client.py +118 -0
- mirascope/llm/messages/__init__.py +32 -0
- mirascope/llm/messages/message.py +182 -0
- mirascope/llm/models/__init__.py +16 -0
- mirascope/llm/models/models.py +1243 -0
- mirascope/llm/prompts/__init__.py +33 -0
- mirascope/llm/prompts/_utils.py +60 -0
- mirascope/llm/prompts/decorator.py +286 -0
- mirascope/llm/prompts/protocols.py +99 -0
- mirascope/llm/responses/__init__.py +57 -0
- mirascope/llm/responses/_utils.py +56 -0
- mirascope/llm/responses/base_response.py +91 -0
- mirascope/llm/responses/base_stream_response.py +697 -0
- mirascope/llm/responses/finish_reason.py +27 -0
- mirascope/llm/responses/response.py +345 -0
- mirascope/llm/responses/root_response.py +177 -0
- mirascope/llm/responses/stream_response.py +572 -0
- mirascope/llm/responses/streams.py +363 -0
- mirascope/llm/tools/__init__.py +40 -0
- mirascope/llm/tools/_utils.py +25 -0
- mirascope/llm/tools/decorator.py +175 -0
- mirascope/llm/tools/protocols.py +96 -0
- mirascope/llm/tools/tool_schema.py +246 -0
- mirascope/llm/tools/toolkit.py +152 -0
- mirascope/llm/tools/tools.py +169 -0
- mirascope/llm/types/__init__.py +22 -0
- mirascope/llm/types/dataclass.py +9 -0
- mirascope/llm/types/jsonable.py +44 -0
- mirascope/llm/types/type_vars.py +19 -0
- mirascope-2.0.0a0.dist-info/METADATA +117 -0
- mirascope-2.0.0a0.dist-info/RECORD +101 -0
- mirascope/beta/__init__.py +0 -3
- mirascope/beta/openai/__init__.py +0 -17
- mirascope/beta/openai/realtime/__init__.py +0 -13
- mirascope/beta/openai/realtime/_utils/__init__.py +0 -3
- mirascope/beta/openai/realtime/_utils/_audio.py +0 -74
- mirascope/beta/openai/realtime/_utils/_protocols.py +0 -50
- mirascope/beta/openai/realtime/realtime.py +0 -500
- mirascope/beta/openai/realtime/recording.py +0 -98
- mirascope/beta/openai/realtime/tool.py +0 -113
- mirascope/beta/rag/__init__.py +0 -24
- mirascope/beta/rag/base/__init__.py +0 -22
- mirascope/beta/rag/base/chunkers/__init__.py +0 -2
- mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
- mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
- mirascope/beta/rag/base/config.py +0 -8
- mirascope/beta/rag/base/document.py +0 -11
- mirascope/beta/rag/base/embedders.py +0 -35
- mirascope/beta/rag/base/embedding_params.py +0 -18
- mirascope/beta/rag/base/embedding_response.py +0 -30
- mirascope/beta/rag/base/query_results.py +0 -7
- mirascope/beta/rag/base/vectorstore_params.py +0 -18
- mirascope/beta/rag/base/vectorstores.py +0 -37
- mirascope/beta/rag/chroma/__init__.py +0 -11
- mirascope/beta/rag/chroma/types.py +0 -62
- mirascope/beta/rag/chroma/vectorstores.py +0 -121
- mirascope/beta/rag/cohere/__init__.py +0 -11
- mirascope/beta/rag/cohere/embedders.py +0 -87
- mirascope/beta/rag/cohere/embedding_params.py +0 -29
- mirascope/beta/rag/cohere/embedding_response.py +0 -29
- mirascope/beta/rag/cohere/py.typed +0 -0
- mirascope/beta/rag/openai/__init__.py +0 -11
- mirascope/beta/rag/openai/embedders.py +0 -144
- mirascope/beta/rag/openai/embedding_params.py +0 -18
- mirascope/beta/rag/openai/embedding_response.py +0 -14
- mirascope/beta/rag/openai/py.typed +0 -0
- mirascope/beta/rag/pinecone/__init__.py +0 -19
- mirascope/beta/rag/pinecone/types.py +0 -143
- mirascope/beta/rag/pinecone/vectorstores.py +0 -148
- mirascope/beta/rag/weaviate/__init__.py +0 -6
- mirascope/beta/rag/weaviate/types.py +0 -92
- mirascope/beta/rag/weaviate/vectorstores.py +0 -103
- mirascope/core/__init__.py +0 -109
- mirascope/core/anthropic/__init__.py +0 -31
- mirascope/core/anthropic/_call.py +0 -67
- mirascope/core/anthropic/_call_kwargs.py +0 -13
- mirascope/core/anthropic/_thinking.py +0 -70
- mirascope/core/anthropic/_utils/__init__.py +0 -16
- mirascope/core/anthropic/_utils/_convert_common_call_params.py +0 -25
- mirascope/core/anthropic/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/anthropic/_utils/_convert_message_params.py +0 -102
- mirascope/core/anthropic/_utils/_get_json_output.py +0 -31
- mirascope/core/anthropic/_utils/_handle_stream.py +0 -113
- mirascope/core/anthropic/_utils/_message_param_converter.py +0 -154
- mirascope/core/anthropic/_utils/_setup_call.py +0 -146
- mirascope/core/anthropic/call_params.py +0 -44
- mirascope/core/anthropic/call_response.py +0 -226
- mirascope/core/anthropic/call_response_chunk.py +0 -152
- mirascope/core/anthropic/dynamic_config.py +0 -40
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -204
- mirascope/core/anthropic/tool.py +0 -101
- mirascope/core/azure/__init__.py +0 -31
- mirascope/core/azure/_call.py +0 -67
- mirascope/core/azure/_call_kwargs.py +0 -13
- mirascope/core/azure/_utils/__init__.py +0 -14
- mirascope/core/azure/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/azure/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/azure/_utils/_convert_message_params.py +0 -121
- mirascope/core/azure/_utils/_get_credential.py +0 -33
- mirascope/core/azure/_utils/_get_json_output.py +0 -27
- mirascope/core/azure/_utils/_handle_stream.py +0 -130
- mirascope/core/azure/_utils/_message_param_converter.py +0 -117
- mirascope/core/azure/_utils/_setup_call.py +0 -183
- mirascope/core/azure/call_params.py +0 -59
- mirascope/core/azure/call_response.py +0 -215
- mirascope/core/azure/call_response_chunk.py +0 -105
- mirascope/core/azure/dynamic_config.py +0 -30
- mirascope/core/azure/py.typed +0 -0
- mirascope/core/azure/stream.py +0 -147
- mirascope/core/azure/tool.py +0 -93
- mirascope/core/base/__init__.py +0 -86
- mirascope/core/base/_call_factory.py +0 -256
- mirascope/core/base/_create.py +0 -253
- mirascope/core/base/_extract.py +0 -175
- mirascope/core/base/_extract_with_tools.py +0 -189
- mirascope/core/base/_partial.py +0 -95
- mirascope/core/base/_utils/__init__.py +0 -92
- mirascope/core/base/_utils/_base_message_param_converter.py +0 -22
- mirascope/core/base/_utils/_base_type.py +0 -26
- mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -48
- mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
- mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -139
- mirascope/core/base/_utils/_convert_messages_to_message_params.py +0 -178
- mirascope/core/base/_utils/_convert_provider_finish_reason_to_finish_reason.py +0 -20
- mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
- mirascope/core/base/_utils/_extract_tool_return.py +0 -42
- mirascope/core/base/_utils/_fn_is_async.py +0 -24
- mirascope/core/base/_utils/_format_template.py +0 -32
- mirascope/core/base/_utils/_get_audio_type.py +0 -18
- mirascope/core/base/_utils/_get_common_usage.py +0 -20
- mirascope/core/base/_utils/_get_create_fn_or_async_create_fn.py +0 -137
- mirascope/core/base/_utils/_get_document_type.py +0 -7
- mirascope/core/base/_utils/_get_dynamic_configuration.py +0 -69
- mirascope/core/base/_utils/_get_fields_from_call_args.py +0 -34
- mirascope/core/base/_utils/_get_fn_args.py +0 -23
- mirascope/core/base/_utils/_get_image_dimensions.py +0 -39
- mirascope/core/base/_utils/_get_image_type.py +0 -26
- mirascope/core/base/_utils/_get_metadata.py +0 -17
- mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
- mirascope/core/base/_utils/_get_prompt_template.py +0 -28
- mirascope/core/base/_utils/_get_template_values.py +0 -51
- mirascope/core/base/_utils/_get_template_variables.py +0 -38
- mirascope/core/base/_utils/_get_unsupported_tool_config_keys.py +0 -10
- mirascope/core/base/_utils/_is_prompt_template.py +0 -24
- mirascope/core/base/_utils/_json_mode_content.py +0 -17
- mirascope/core/base/_utils/_messages_decorator.py +0 -121
- mirascope/core/base/_utils/_parse_content_template.py +0 -323
- mirascope/core/base/_utils/_parse_prompt_messages.py +0 -63
- mirascope/core/base/_utils/_pil_image_to_bytes.py +0 -13
- mirascope/core/base/_utils/_protocols.py +0 -901
- mirascope/core/base/_utils/_setup_call.py +0 -79
- mirascope/core/base/_utils/_setup_extract_tool.py +0 -30
- mirascope/core/base/call_kwargs.py +0 -13
- mirascope/core/base/call_params.py +0 -36
- mirascope/core/base/call_response.py +0 -338
- mirascope/core/base/call_response_chunk.py +0 -130
- mirascope/core/base/dynamic_config.py +0 -82
- mirascope/core/base/from_call_args.py +0 -30
- mirascope/core/base/merge_decorators.py +0 -59
- mirascope/core/base/message_param.py +0 -175
- mirascope/core/base/messages.py +0 -116
- mirascope/core/base/metadata.py +0 -13
- mirascope/core/base/prompt.py +0 -497
- mirascope/core/base/response_model_config_dict.py +0 -9
- mirascope/core/base/stream.py +0 -479
- mirascope/core/base/stream_config.py +0 -11
- mirascope/core/base/structured_stream.py +0 -296
- mirascope/core/base/tool.py +0 -214
- mirascope/core/base/toolkit.py +0 -176
- mirascope/core/base/types.py +0 -344
- mirascope/core/bedrock/__init__.py +0 -34
- mirascope/core/bedrock/_call.py +0 -68
- mirascope/core/bedrock/_call_kwargs.py +0 -12
- mirascope/core/bedrock/_types.py +0 -104
- mirascope/core/bedrock/_utils/__init__.py +0 -14
- mirascope/core/bedrock/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/bedrock/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/bedrock/_utils/_convert_message_params.py +0 -111
- mirascope/core/bedrock/_utils/_get_json_output.py +0 -30
- mirascope/core/bedrock/_utils/_handle_stream.py +0 -104
- mirascope/core/bedrock/_utils/_message_param_converter.py +0 -172
- mirascope/core/bedrock/_utils/_setup_call.py +0 -258
- mirascope/core/bedrock/call_params.py +0 -38
- mirascope/core/bedrock/call_response.py +0 -248
- mirascope/core/bedrock/call_response_chunk.py +0 -111
- mirascope/core/bedrock/dynamic_config.py +0 -37
- mirascope/core/bedrock/py.typed +0 -0
- mirascope/core/bedrock/stream.py +0 -154
- mirascope/core/bedrock/tool.py +0 -100
- mirascope/core/cohere/__init__.py +0 -30
- mirascope/core/cohere/_call.py +0 -67
- mirascope/core/cohere/_call_kwargs.py +0 -11
- mirascope/core/cohere/_types.py +0 -20
- mirascope/core/cohere/_utils/__init__.py +0 -14
- mirascope/core/cohere/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/cohere/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -24
- mirascope/core/cohere/_utils/_convert_message_params.py +0 -32
- mirascope/core/cohere/_utils/_get_json_output.py +0 -30
- mirascope/core/cohere/_utils/_handle_stream.py +0 -35
- mirascope/core/cohere/_utils/_message_param_converter.py +0 -54
- mirascope/core/cohere/_utils/_setup_call.py +0 -150
- mirascope/core/cohere/call_params.py +0 -62
- mirascope/core/cohere/call_response.py +0 -205
- mirascope/core/cohere/call_response_chunk.py +0 -125
- mirascope/core/cohere/dynamic_config.py +0 -32
- mirascope/core/cohere/py.typed +0 -0
- mirascope/core/cohere/stream.py +0 -113
- mirascope/core/cohere/tool.py +0 -93
- mirascope/core/costs/__init__.py +0 -5
- mirascope/core/costs/_anthropic_calculate_cost.py +0 -219
- mirascope/core/costs/_azure_calculate_cost.py +0 -11
- mirascope/core/costs/_bedrock_calculate_cost.py +0 -15
- mirascope/core/costs/_cohere_calculate_cost.py +0 -44
- mirascope/core/costs/_gemini_calculate_cost.py +0 -67
- mirascope/core/costs/_google_calculate_cost.py +0 -427
- mirascope/core/costs/_groq_calculate_cost.py +0 -156
- mirascope/core/costs/_litellm_calculate_cost.py +0 -11
- mirascope/core/costs/_mistral_calculate_cost.py +0 -64
- mirascope/core/costs/_openai_calculate_cost.py +0 -416
- mirascope/core/costs/_vertex_calculate_cost.py +0 -67
- mirascope/core/costs/_xai_calculate_cost.py +0 -104
- mirascope/core/costs/calculate_cost.py +0 -86
- mirascope/core/gemini/__init__.py +0 -40
- mirascope/core/gemini/_call.py +0 -67
- mirascope/core/gemini/_call_kwargs.py +0 -12
- mirascope/core/gemini/_utils/__init__.py +0 -14
- mirascope/core/gemini/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/gemini/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/gemini/_utils/_convert_message_params.py +0 -156
- mirascope/core/gemini/_utils/_get_json_output.py +0 -35
- mirascope/core/gemini/_utils/_handle_stream.py +0 -33
- mirascope/core/gemini/_utils/_message_param_converter.py +0 -209
- mirascope/core/gemini/_utils/_setup_call.py +0 -149
- mirascope/core/gemini/call_params.py +0 -52
- mirascope/core/gemini/call_response.py +0 -216
- mirascope/core/gemini/call_response_chunk.py +0 -100
- mirascope/core/gemini/dynamic_config.py +0 -26
- mirascope/core/gemini/stream.py +0 -120
- mirascope/core/gemini/tool.py +0 -104
- mirascope/core/google/__init__.py +0 -29
- mirascope/core/google/_call.py +0 -67
- mirascope/core/google/_call_kwargs.py +0 -13
- mirascope/core/google/_utils/__init__.py +0 -14
- mirascope/core/google/_utils/_convert_common_call_params.py +0 -38
- mirascope/core/google/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -27
- mirascope/core/google/_utils/_convert_message_params.py +0 -297
- mirascope/core/google/_utils/_get_json_output.py +0 -37
- mirascope/core/google/_utils/_handle_stream.py +0 -58
- mirascope/core/google/_utils/_message_param_converter.py +0 -200
- mirascope/core/google/_utils/_setup_call.py +0 -201
- mirascope/core/google/_utils/_validate_media_type.py +0 -58
- mirascope/core/google/call_params.py +0 -22
- mirascope/core/google/call_response.py +0 -255
- mirascope/core/google/call_response_chunk.py +0 -135
- mirascope/core/google/dynamic_config.py +0 -26
- mirascope/core/google/stream.py +0 -199
- mirascope/core/google/tool.py +0 -146
- mirascope/core/groq/__init__.py +0 -30
- mirascope/core/groq/_call.py +0 -67
- mirascope/core/groq/_call_kwargs.py +0 -13
- mirascope/core/groq/_utils/__init__.py +0 -14
- mirascope/core/groq/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/groq/_utils/_convert_message_params.py +0 -112
- mirascope/core/groq/_utils/_get_json_output.py +0 -27
- mirascope/core/groq/_utils/_handle_stream.py +0 -123
- mirascope/core/groq/_utils/_message_param_converter.py +0 -89
- mirascope/core/groq/_utils/_setup_call.py +0 -132
- mirascope/core/groq/call_params.py +0 -52
- mirascope/core/groq/call_response.py +0 -213
- mirascope/core/groq/call_response_chunk.py +0 -104
- mirascope/core/groq/dynamic_config.py +0 -29
- mirascope/core/groq/py.typed +0 -0
- mirascope/core/groq/stream.py +0 -135
- mirascope/core/groq/tool.py +0 -80
- mirascope/core/litellm/__init__.py +0 -28
- mirascope/core/litellm/_call.py +0 -67
- mirascope/core/litellm/_utils/__init__.py +0 -5
- mirascope/core/litellm/_utils/_setup_call.py +0 -109
- mirascope/core/litellm/call_params.py +0 -10
- mirascope/core/litellm/call_response.py +0 -24
- mirascope/core/litellm/call_response_chunk.py +0 -14
- mirascope/core/litellm/dynamic_config.py +0 -8
- mirascope/core/litellm/py.typed +0 -0
- mirascope/core/litellm/stream.py +0 -86
- mirascope/core/litellm/tool.py +0 -13
- mirascope/core/mistral/__init__.py +0 -36
- mirascope/core/mistral/_call.py +0 -65
- mirascope/core/mistral/_call_kwargs.py +0 -19
- mirascope/core/mistral/_utils/__init__.py +0 -14
- mirascope/core/mistral/_utils/_convert_common_call_params.py +0 -24
- mirascope/core/mistral/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -22
- mirascope/core/mistral/_utils/_convert_message_params.py +0 -122
- mirascope/core/mistral/_utils/_get_json_output.py +0 -34
- mirascope/core/mistral/_utils/_handle_stream.py +0 -139
- mirascope/core/mistral/_utils/_message_param_converter.py +0 -176
- mirascope/core/mistral/_utils/_setup_call.py +0 -164
- mirascope/core/mistral/call_params.py +0 -36
- mirascope/core/mistral/call_response.py +0 -205
- mirascope/core/mistral/call_response_chunk.py +0 -105
- mirascope/core/mistral/dynamic_config.py +0 -33
- mirascope/core/mistral/py.typed +0 -0
- mirascope/core/mistral/stream.py +0 -120
- mirascope/core/mistral/tool.py +0 -81
- mirascope/core/openai/__init__.py +0 -31
- mirascope/core/openai/_call.py +0 -67
- mirascope/core/openai/_call_kwargs.py +0 -13
- mirascope/core/openai/_utils/__init__.py +0 -14
- mirascope/core/openai/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/openai/_utils/_convert_message_params.py +0 -148
- mirascope/core/openai/_utils/_get_json_output.py +0 -31
- mirascope/core/openai/_utils/_handle_stream.py +0 -138
- mirascope/core/openai/_utils/_message_param_converter.py +0 -105
- mirascope/core/openai/_utils/_setup_call.py +0 -155
- mirascope/core/openai/call_params.py +0 -92
- mirascope/core/openai/call_response.py +0 -273
- mirascope/core/openai/call_response_chunk.py +0 -139
- mirascope/core/openai/dynamic_config.py +0 -34
- mirascope/core/openai/py.typed +0 -0
- mirascope/core/openai/stream.py +0 -185
- mirascope/core/openai/tool.py +0 -101
- mirascope/core/py.typed +0 -0
- mirascope/core/vertex/__init__.py +0 -45
- mirascope/core/vertex/_call.py +0 -62
- mirascope/core/vertex/_call_kwargs.py +0 -12
- mirascope/core/vertex/_utils/__init__.py +0 -14
- mirascope/core/vertex/_utils/_convert_common_call_params.py +0 -37
- mirascope/core/vertex/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/vertex/_utils/_convert_message_params.py +0 -171
- mirascope/core/vertex/_utils/_get_json_output.py +0 -36
- mirascope/core/vertex/_utils/_handle_stream.py +0 -33
- mirascope/core/vertex/_utils/_message_param_converter.py +0 -133
- mirascope/core/vertex/_utils/_setup_call.py +0 -160
- mirascope/core/vertex/call_params.py +0 -24
- mirascope/core/vertex/call_response.py +0 -206
- mirascope/core/vertex/call_response_chunk.py +0 -99
- mirascope/core/vertex/dynamic_config.py +0 -28
- mirascope/core/vertex/stream.py +0 -119
- mirascope/core/vertex/tool.py +0 -101
- mirascope/core/xai/__init__.py +0 -28
- mirascope/core/xai/_call.py +0 -67
- mirascope/core/xai/_utils/__init__.py +0 -5
- mirascope/core/xai/_utils/_setup_call.py +0 -113
- mirascope/core/xai/call_params.py +0 -10
- mirascope/core/xai/call_response.py +0 -16
- mirascope/core/xai/call_response_chunk.py +0 -14
- mirascope/core/xai/dynamic_config.py +0 -8
- mirascope/core/xai/py.typed +0 -0
- mirascope/core/xai/stream.py +0 -57
- mirascope/core/xai/tool.py +0 -13
- mirascope/experimental/graphs/__init__.py +0 -5
- mirascope/integrations/__init__.py +0 -16
- mirascope/integrations/_middleware_factory.py +0 -403
- mirascope/integrations/langfuse/__init__.py +0 -3
- mirascope/integrations/langfuse/_utils.py +0 -114
- mirascope/integrations/langfuse/_with_langfuse.py +0 -70
- mirascope/integrations/logfire/__init__.py +0 -3
- mirascope/integrations/logfire/_utils.py +0 -225
- mirascope/integrations/logfire/_with_logfire.py +0 -63
- mirascope/integrations/otel/__init__.py +0 -10
- mirascope/integrations/otel/_utils.py +0 -270
- mirascope/integrations/otel/_with_hyperdx.py +0 -60
- mirascope/integrations/otel/_with_otel.py +0 -59
- mirascope/integrations/tenacity.py +0 -14
- mirascope/llm/_call.py +0 -401
- mirascope/llm/_context.py +0 -384
- mirascope/llm/_override.py +0 -3639
- mirascope/llm/_protocols.py +0 -500
- mirascope/llm/_response_metaclass.py +0 -31
- mirascope/llm/call_response.py +0 -158
- mirascope/llm/call_response_chunk.py +0 -66
- mirascope/llm/stream.py +0 -162
- mirascope/llm/tool.py +0 -64
- mirascope/mcp/__init__.py +0 -7
- mirascope/mcp/_utils.py +0 -288
- mirascope/mcp/client.py +0 -167
- mirascope/mcp/server.py +0 -356
- mirascope/mcp/tools.py +0 -110
- mirascope/py.typed +0 -0
- mirascope/retries/__init__.py +0 -11
- mirascope/retries/fallback.py +0 -131
- mirascope/retries/tenacity.py +0 -50
- mirascope/tools/__init__.py +0 -37
- mirascope/tools/base.py +0 -98
- mirascope/tools/system/__init__.py +0 -0
- mirascope/tools/system/_docker_operation.py +0 -166
- mirascope/tools/system/_file_system.py +0 -267
- mirascope/tools/web/__init__.py +0 -0
- mirascope/tools/web/_duckduckgo.py +0 -111
- mirascope/tools/web/_httpx.py +0 -125
- mirascope/tools/web/_parse_url_content.py +0 -94
- mirascope/tools/web/_requests.py +0 -54
- mirascope/v0/__init__.py +0 -43
- mirascope/v0/anthropic.py +0 -54
- mirascope/v0/base/__init__.py +0 -12
- mirascope/v0/base/calls.py +0 -118
- mirascope/v0/base/extractors.py +0 -122
- mirascope/v0/base/ops_utils.py +0 -207
- mirascope/v0/base/prompts.py +0 -48
- mirascope/v0/base/types.py +0 -14
- mirascope/v0/base/utils.py +0 -21
- mirascope/v0/openai.py +0 -54
- mirascope-1.25.7.dist-info/METADATA +0 -169
- mirascope-1.25.7.dist-info/RECORD +0 -378
- {mirascope-1.25.7.dist-info → mirascope-2.0.0a0.dist-info}/WHEEL +0 -0
- {mirascope-1.25.7.dist-info → mirascope-2.0.0a0.dist-info}/licenses/LICENSE +0 -0
mirascope/core/google/tool.py
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
"""The `GoogleTool` class for easy tool usage with Google's Google LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/tools.md
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
from typing import Any
|
|
9
|
-
|
|
10
|
-
from google.genai.types import (
|
|
11
|
-
FunctionCall,
|
|
12
|
-
FunctionDeclaration,
|
|
13
|
-
Tool,
|
|
14
|
-
)
|
|
15
|
-
from pydantic.json_schema import SkipJsonSchema
|
|
16
|
-
|
|
17
|
-
from ..base import BaseTool
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class GoogleTool(BaseTool):
|
|
21
|
-
"""A class for defining tools for Google LLM calls.
|
|
22
|
-
|
|
23
|
-
Example:
|
|
24
|
-
|
|
25
|
-
```python
|
|
26
|
-
from mirascope.core import prompt_template
|
|
27
|
-
from mirascope.core.google import google_call
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def format_book(title: str, author: str) -> str:
|
|
31
|
-
return f"{title} by {author}"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@google_call("google-1.5-flash", tools=[format_book])
|
|
35
|
-
def recommend_book(genre: str) -> str:
|
|
36
|
-
return f"Recommend a {genre} book"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
response = recommend_book("fantasy")
|
|
40
|
-
if tool := response.tool: # returns an `GoogleTool` instance
|
|
41
|
-
print(tool.call())
|
|
42
|
-
```
|
|
43
|
-
"""
|
|
44
|
-
|
|
45
|
-
__provider__ = "google"
|
|
46
|
-
|
|
47
|
-
tool_call: SkipJsonSchema[FunctionCall]
|
|
48
|
-
|
|
49
|
-
@classmethod
|
|
50
|
-
def tool_schema(cls) -> Tool:
|
|
51
|
-
"""Constructs a JSON Schema tool schema from the `BaseModel` schema defined.
|
|
52
|
-
|
|
53
|
-
Example:
|
|
54
|
-
```python
|
|
55
|
-
from mirascope.core.google import GoogleTool
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def format_book(title: str, author: str) -> str:
|
|
59
|
-
return f"{title} by {author}"
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
tool_type = GoogleTool.type_from_fn(format_book)
|
|
63
|
-
print(tool_type.tool_schema()) # prints the Google-specific tool schema
|
|
64
|
-
```
|
|
65
|
-
"""
|
|
66
|
-
model_schema = cls.model_json_schema()
|
|
67
|
-
fn: dict[str, Any] = {"name": cls._name(), "description": cls._description()}
|
|
68
|
-
|
|
69
|
-
if model_schema["properties"]:
|
|
70
|
-
fn["parameters"] = model_schema
|
|
71
|
-
|
|
72
|
-
if "parameters" in fn:
|
|
73
|
-
# Define a function to handle both ref resolution and examples conversion
|
|
74
|
-
def resolve_refs_and_fix_examples(
|
|
75
|
-
schema: dict[str, Any], defs: dict[str, Any] | None = None
|
|
76
|
-
) -> dict[str, Any]:
|
|
77
|
-
"""Recursively resolve $ref references and fix examples/example fields."""
|
|
78
|
-
# If this is a reference, resolve it
|
|
79
|
-
if "$ref" in schema:
|
|
80
|
-
ref = schema["$ref"]
|
|
81
|
-
if ref.startswith("#/$defs/") and defs:
|
|
82
|
-
ref_key = ref.replace("#/$defs/", "")
|
|
83
|
-
if ref_key in defs:
|
|
84
|
-
# Merge the definition with the current schema (excluding $ref)
|
|
85
|
-
resolved = {
|
|
86
|
-
**{k: v for k, v in schema.items() if k != "$ref"},
|
|
87
|
-
**resolve_refs_and_fix_examples(defs[ref_key], defs),
|
|
88
|
-
}
|
|
89
|
-
return resolved
|
|
90
|
-
|
|
91
|
-
# Handle examples -> example conversion
|
|
92
|
-
result = {}
|
|
93
|
-
for key, value in schema.items():
|
|
94
|
-
# Convert "examples" to "example" for Google Schema
|
|
95
|
-
if key == "examples":
|
|
96
|
-
result["example"] = value
|
|
97
|
-
elif isinstance(value, dict):
|
|
98
|
-
result[key] = resolve_refs_and_fix_examples(value, defs)
|
|
99
|
-
elif isinstance(value, list):
|
|
100
|
-
result[key] = [
|
|
101
|
-
resolve_refs_and_fix_examples(item, defs)
|
|
102
|
-
if isinstance(item, dict)
|
|
103
|
-
else item
|
|
104
|
-
for item in value
|
|
105
|
-
]
|
|
106
|
-
else:
|
|
107
|
-
result[key] = value
|
|
108
|
-
return result
|
|
109
|
-
|
|
110
|
-
# Extract $defs if they exist
|
|
111
|
-
defs = {}
|
|
112
|
-
if "$defs" in fn["parameters"]:
|
|
113
|
-
defs = fn["parameters"].pop("$defs")
|
|
114
|
-
|
|
115
|
-
# Resolve all references in the parameters and fix examples
|
|
116
|
-
fn["parameters"] = resolve_refs_and_fix_examples(fn["parameters"], defs)
|
|
117
|
-
|
|
118
|
-
def handle_enum_schema(prop_schema: dict[str, Any]) -> dict[str, Any]:
|
|
119
|
-
if "enum" in prop_schema:
|
|
120
|
-
prop_schema["format"] = "enum"
|
|
121
|
-
return prop_schema
|
|
122
|
-
|
|
123
|
-
# Process properties after resolving references
|
|
124
|
-
# We're already handling examples -> example conversion recursively above
|
|
125
|
-
fn["parameters"]["properties"] = {
|
|
126
|
-
prop: {
|
|
127
|
-
key: value
|
|
128
|
-
for key, value in handle_enum_schema(prop_schema).items()
|
|
129
|
-
if key != "default"
|
|
130
|
-
}
|
|
131
|
-
for prop, prop_schema in fn["parameters"]["properties"].items()
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return Tool(function_declarations=[FunctionDeclaration(**fn)])
|
|
135
|
-
|
|
136
|
-
@classmethod
|
|
137
|
-
def from_tool_call(cls, tool_call: FunctionCall) -> GoogleTool:
|
|
138
|
-
"""Constructs an `GoogleTool` instance from a `tool_call`.
|
|
139
|
-
|
|
140
|
-
Args:
|
|
141
|
-
tool_call: The Google tool call from which to construct this tool instance.
|
|
142
|
-
"""
|
|
143
|
-
model_json = {"tool_call": tool_call}
|
|
144
|
-
if tool_call.args:
|
|
145
|
-
model_json |= dict(tool_call.args.items())
|
|
146
|
-
return cls.model_validate(model_json)
|
mirascope/core/groq/__init__.py
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"""The Mirascope Groq Module."""
|
|
2
|
-
|
|
3
|
-
from typing import TypeAlias
|
|
4
|
-
|
|
5
|
-
from groq.types.chat import ChatCompletionMessageParam
|
|
6
|
-
|
|
7
|
-
from ..base import BaseMessageParam
|
|
8
|
-
from ._call import groq_call
|
|
9
|
-
from ._call import groq_call as call
|
|
10
|
-
from .call_params import GroqCallParams
|
|
11
|
-
from .call_response import GroqCallResponse
|
|
12
|
-
from .call_response_chunk import GroqCallResponseChunk
|
|
13
|
-
from .dynamic_config import AsyncGroqDynamicConfig, GroqDynamicConfig
|
|
14
|
-
from .stream import GroqStream
|
|
15
|
-
from .tool import GroqTool
|
|
16
|
-
|
|
17
|
-
GroqMessageParam: TypeAlias = ChatCompletionMessageParam | BaseMessageParam
|
|
18
|
-
|
|
19
|
-
__all__ = [
|
|
20
|
-
"AsyncGroqDynamicConfig",
|
|
21
|
-
"GroqCallParams",
|
|
22
|
-
"GroqCallResponse",
|
|
23
|
-
"GroqCallResponseChunk",
|
|
24
|
-
"GroqDynamicConfig",
|
|
25
|
-
"GroqMessageParam",
|
|
26
|
-
"GroqStream",
|
|
27
|
-
"GroqTool",
|
|
28
|
-
"call",
|
|
29
|
-
"groq_call",
|
|
30
|
-
]
|
mirascope/core/groq/_call.py
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"""The `groq_call` decorator for functions as LLM calls."""
|
|
2
|
-
|
|
3
|
-
from ..base import call_factory
|
|
4
|
-
from ._utils import (
|
|
5
|
-
get_json_output,
|
|
6
|
-
handle_stream,
|
|
7
|
-
handle_stream_async,
|
|
8
|
-
setup_call,
|
|
9
|
-
)
|
|
10
|
-
from .call_params import GroqCallParams
|
|
11
|
-
from .call_response import GroqCallResponse
|
|
12
|
-
from .call_response_chunk import GroqCallResponseChunk
|
|
13
|
-
from .stream import GroqStream
|
|
14
|
-
from .tool import GroqTool
|
|
15
|
-
|
|
16
|
-
groq_call = call_factory(
|
|
17
|
-
TCallResponse=GroqCallResponse,
|
|
18
|
-
TCallResponseChunk=GroqCallResponseChunk,
|
|
19
|
-
TToolType=GroqTool,
|
|
20
|
-
TStream=GroqStream,
|
|
21
|
-
default_call_params=GroqCallParams(),
|
|
22
|
-
setup_call=setup_call,
|
|
23
|
-
get_json_output=get_json_output,
|
|
24
|
-
handle_stream=handle_stream,
|
|
25
|
-
handle_stream_async=handle_stream_async,
|
|
26
|
-
)
|
|
27
|
-
"""A decorator for calling the Groq API with a typed function.
|
|
28
|
-
|
|
29
|
-
usage docs: learn/calls.md
|
|
30
|
-
|
|
31
|
-
This decorator is used to wrap a typed function that calls the Groq API. It parses
|
|
32
|
-
the prompt template of the wrapped function as the messages array and templates the input
|
|
33
|
-
arguments for the function into each message's template.
|
|
34
|
-
|
|
35
|
-
Example:
|
|
36
|
-
|
|
37
|
-
```python
|
|
38
|
-
from mirascope.core import prompt_template
|
|
39
|
-
from mirascope.core.groq import groq_call
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@groq_call("llama-3.1-8b-instant")
|
|
43
|
-
def recommend_book(genre: str) -> str:
|
|
44
|
-
return f"Recommend a {genre} book"
|
|
45
|
-
|
|
46
|
-
response = recommend_book("fantasy")
|
|
47
|
-
print(response.content)
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
Args:
|
|
51
|
-
model (str): The Groq model to use in the API call.
|
|
52
|
-
stream (bool): Whether to stream the response from the API call.
|
|
53
|
-
tools (list[BaseTool | Callable]): The tools to use in the Groq API call.
|
|
54
|
-
response_model (BaseModel | BaseType): The response model into which the response
|
|
55
|
-
should be structured.
|
|
56
|
-
output_parser (Callable[[CohereCallResponse | ResponseModelT], Any]): A function for
|
|
57
|
-
parsing the call response whose value will be returned in place of the original
|
|
58
|
-
call response.
|
|
59
|
-
json_mode (bool): Whether to use JSON Mode.
|
|
60
|
-
client (object): An optional custom client to use in place of the default client.
|
|
61
|
-
call_params (GroqCallParams): The `GroqCallParams` call parameters to use in the API
|
|
62
|
-
call.
|
|
63
|
-
|
|
64
|
-
Returns:
|
|
65
|
-
decorator (Callable): The decorator for turning a typed function into a Groq API
|
|
66
|
-
call.
|
|
67
|
-
"""
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"""This module contains the type definition for the Groq call keyword arguments."""
|
|
2
|
-
|
|
3
|
-
from collections.abc import Sequence
|
|
4
|
-
|
|
5
|
-
from groq.types.chat import ChatCompletionMessageParam, ChatCompletionToolParam
|
|
6
|
-
|
|
7
|
-
from ..base import BaseCallKwargs
|
|
8
|
-
from .call_params import GroqCallParams
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class GroqCallKwargs(GroqCallParams, BaseCallKwargs[ChatCompletionToolParam]):
|
|
12
|
-
model: str
|
|
13
|
-
messages: Sequence[ChatCompletionMessageParam]
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"""Groq utilities for decorator factories."""
|
|
2
|
-
|
|
3
|
-
from ._convert_message_params import convert_message_params
|
|
4
|
-
from ._get_json_output import get_json_output
|
|
5
|
-
from ._handle_stream import handle_stream, handle_stream_async
|
|
6
|
-
from ._setup_call import setup_call
|
|
7
|
-
|
|
8
|
-
__all__ = [
|
|
9
|
-
"convert_message_params",
|
|
10
|
-
"get_json_output",
|
|
11
|
-
"handle_stream",
|
|
12
|
-
"handle_stream_async",
|
|
13
|
-
"setup_call",
|
|
14
|
-
]
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
from typing import cast
|
|
2
|
-
|
|
3
|
-
from ...base.call_params import CommonCallParams
|
|
4
|
-
from ..call_params import GroqCallParams
|
|
5
|
-
|
|
6
|
-
GROQ_PARAM_MAPPING = {
|
|
7
|
-
"temperature": "temperature",
|
|
8
|
-
"max_tokens": "max_tokens",
|
|
9
|
-
"top_p": "top_p",
|
|
10
|
-
"frequency_penalty": "frequency_penalty",
|
|
11
|
-
"presence_penalty": "presence_penalty",
|
|
12
|
-
"seed": "seed",
|
|
13
|
-
"stop": "stop",
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def convert_common_call_params(common_params: CommonCallParams) -> GroqCallParams:
|
|
18
|
-
"""Convert CommonCallParams to Groq parameters."""
|
|
19
|
-
return cast(
|
|
20
|
-
GroqCallParams,
|
|
21
|
-
{
|
|
22
|
-
GROQ_PARAM_MAPPING[key]: value
|
|
23
|
-
for key, value in common_params.items()
|
|
24
|
-
if key in GROQ_PARAM_MAPPING and value is not None
|
|
25
|
-
},
|
|
26
|
-
)
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
"""Utility for converting `BaseMessageParam` to `ChatCompletionMessageParam`"""
|
|
2
|
-
|
|
3
|
-
import base64
|
|
4
|
-
import json
|
|
5
|
-
|
|
6
|
-
from groq.types.chat import (
|
|
7
|
-
ChatCompletionMessageParam,
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
from ...base import BaseMessageParam
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def convert_message_params(
|
|
14
|
-
message_params: list[BaseMessageParam | ChatCompletionMessageParam],
|
|
15
|
-
) -> list[ChatCompletionMessageParam]:
|
|
16
|
-
converted_message_params = []
|
|
17
|
-
for message_param in message_params:
|
|
18
|
-
if not isinstance(message_param, BaseMessageParam):
|
|
19
|
-
converted_message_params.append(message_param)
|
|
20
|
-
elif isinstance(content := message_param.content, str):
|
|
21
|
-
converted_message_params.append(message_param.model_dump())
|
|
22
|
-
else:
|
|
23
|
-
converted_content = []
|
|
24
|
-
for part in content:
|
|
25
|
-
if part.type == "text":
|
|
26
|
-
converted_content.append(part.model_dump())
|
|
27
|
-
elif part.type == "image":
|
|
28
|
-
if part.media_type not in [
|
|
29
|
-
"image/jpeg",
|
|
30
|
-
"image/png",
|
|
31
|
-
"image/gif",
|
|
32
|
-
"image/webp",
|
|
33
|
-
]:
|
|
34
|
-
raise ValueError(
|
|
35
|
-
f"Unsupported image media type: {part.media_type}. Groq"
|
|
36
|
-
" currently only supports JPEG, PNG, GIF, and WebP images."
|
|
37
|
-
)
|
|
38
|
-
data = base64.b64encode(part.image).decode("utf-8")
|
|
39
|
-
converted_content.append(
|
|
40
|
-
{
|
|
41
|
-
"type": "image_url",
|
|
42
|
-
"image_url": {
|
|
43
|
-
"url": f"data:{part.media_type};base64,{data}",
|
|
44
|
-
"detail": part.detail if part.detail else "auto",
|
|
45
|
-
},
|
|
46
|
-
}
|
|
47
|
-
)
|
|
48
|
-
elif part.type == "image_url":
|
|
49
|
-
converted_content.append(
|
|
50
|
-
{
|
|
51
|
-
"type": "image_url",
|
|
52
|
-
"image_url": {
|
|
53
|
-
"url": part.url,
|
|
54
|
-
},
|
|
55
|
-
}
|
|
56
|
-
)
|
|
57
|
-
elif part.type == "tool_call":
|
|
58
|
-
converted_message_param = {
|
|
59
|
-
"role": "assistant",
|
|
60
|
-
"tool_calls": [
|
|
61
|
-
{
|
|
62
|
-
"type": "function",
|
|
63
|
-
"id": part.id,
|
|
64
|
-
"function": {
|
|
65
|
-
"name": part.name,
|
|
66
|
-
"arguments": json.dumps(part.args),
|
|
67
|
-
},
|
|
68
|
-
}
|
|
69
|
-
],
|
|
70
|
-
}
|
|
71
|
-
if converted_content:
|
|
72
|
-
if len(converted_content) == 1:
|
|
73
|
-
if converted_content[0]["type"] == "text":
|
|
74
|
-
converted_message_param["content"] = converted_content[
|
|
75
|
-
0
|
|
76
|
-
]["text"]
|
|
77
|
-
else:
|
|
78
|
-
converted_message_params.append(
|
|
79
|
-
{
|
|
80
|
-
"role": message_param.role,
|
|
81
|
-
"content": converted_content,
|
|
82
|
-
}
|
|
83
|
-
)
|
|
84
|
-
converted_content = []
|
|
85
|
-
converted_message_params.append(converted_message_param)
|
|
86
|
-
|
|
87
|
-
elif part.type == "tool_result":
|
|
88
|
-
if converted_content:
|
|
89
|
-
converted_message_params.append(
|
|
90
|
-
{
|
|
91
|
-
"role": message_param.role,
|
|
92
|
-
"content": converted_content,
|
|
93
|
-
}
|
|
94
|
-
)
|
|
95
|
-
converted_content = []
|
|
96
|
-
converted_message_params.append(
|
|
97
|
-
{
|
|
98
|
-
"role": "tool",
|
|
99
|
-
"content": part.content,
|
|
100
|
-
"tool_call_id": part.id,
|
|
101
|
-
}
|
|
102
|
-
)
|
|
103
|
-
else:
|
|
104
|
-
raise ValueError(
|
|
105
|
-
"Groq currently only supports text and image parts. "
|
|
106
|
-
f"Part provided: {part.type}"
|
|
107
|
-
)
|
|
108
|
-
if converted_content:
|
|
109
|
-
converted_message_params.append(
|
|
110
|
-
{"role": message_param.role, "content": converted_content}
|
|
111
|
-
)
|
|
112
|
-
return converted_message_params
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"""Get the JSON output from a completion response."""
|
|
2
|
-
|
|
3
|
-
from ..call_response import GroqCallResponse
|
|
4
|
-
from ..call_response_chunk import GroqCallResponseChunk
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def get_json_output(
|
|
8
|
-
response: GroqCallResponse | GroqCallResponseChunk, json_mode: bool
|
|
9
|
-
) -> str:
|
|
10
|
-
"""Get the JSON output from a completion response."""
|
|
11
|
-
if isinstance(response, GroqCallResponse):
|
|
12
|
-
if json_mode and response.content:
|
|
13
|
-
return response.content
|
|
14
|
-
elif tool_calls := response.response.choices[0].message.tool_calls:
|
|
15
|
-
return tool_calls[0].function.arguments
|
|
16
|
-
raise ValueError("No tool call or JSON object found in response.")
|
|
17
|
-
else:
|
|
18
|
-
if json_mode:
|
|
19
|
-
return response.content
|
|
20
|
-
elif (
|
|
21
|
-
(choices := response.chunk.choices)
|
|
22
|
-
and (tool_calls := choices[0].delta.tool_calls)
|
|
23
|
-
and (function := tool_calls[0].function)
|
|
24
|
-
and (arguments := function.arguments) is not None
|
|
25
|
-
):
|
|
26
|
-
return arguments
|
|
27
|
-
return ""
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
"""Handles the stream of completion chunks."""
|
|
2
|
-
|
|
3
|
-
from collections.abc import AsyncGenerator, Generator
|
|
4
|
-
|
|
5
|
-
from groq.types.chat import ChatCompletionChunk, ChatCompletionMessageToolCall
|
|
6
|
-
from groq.types.chat.chat_completion_message_tool_call import Function
|
|
7
|
-
|
|
8
|
-
from ..call_response_chunk import GroqCallResponseChunk
|
|
9
|
-
from ..tool import GroqTool
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def _handle_chunk(
|
|
13
|
-
chunk: ChatCompletionChunk,
|
|
14
|
-
current_tool_call: ChatCompletionMessageToolCall,
|
|
15
|
-
current_tool_type: type[GroqTool] | None,
|
|
16
|
-
tool_types: list[type[GroqTool]] | None,
|
|
17
|
-
) -> tuple[
|
|
18
|
-
GroqTool | None,
|
|
19
|
-
ChatCompletionMessageToolCall,
|
|
20
|
-
type[GroqTool] | None,
|
|
21
|
-
]:
|
|
22
|
-
"""Handles a chunk of the stream."""
|
|
23
|
-
if not tool_types or not (tool_calls := chunk.choices[0].delta.tool_calls):
|
|
24
|
-
return None, current_tool_call, current_tool_type
|
|
25
|
-
|
|
26
|
-
tool_call = tool_calls[0]
|
|
27
|
-
# Reset on new tool
|
|
28
|
-
if tool_call.id and tool_call.function is not None:
|
|
29
|
-
previous_tool_call = current_tool_call.model_copy()
|
|
30
|
-
previous_tool_type = current_tool_type
|
|
31
|
-
current_tool_call = ChatCompletionMessageToolCall(
|
|
32
|
-
id=tool_call.id,
|
|
33
|
-
function=Function(
|
|
34
|
-
arguments="",
|
|
35
|
-
name=tool_call.function.name if tool_call.function.name else "",
|
|
36
|
-
),
|
|
37
|
-
type="function",
|
|
38
|
-
)
|
|
39
|
-
current_tool_type = None
|
|
40
|
-
for tool_type in tool_types:
|
|
41
|
-
if tool_type._name() == tool_call.function.name:
|
|
42
|
-
current_tool_type = tool_type
|
|
43
|
-
break
|
|
44
|
-
if current_tool_type is None:
|
|
45
|
-
raise RuntimeError(
|
|
46
|
-
f"Unknown tool type in stream: {tool_call.function.name}"
|
|
47
|
-
) # pragma: no cover
|
|
48
|
-
if (
|
|
49
|
-
previous_tool_call.id
|
|
50
|
-
and previous_tool_call.function.arguments
|
|
51
|
-
and previous_tool_type is not None
|
|
52
|
-
):
|
|
53
|
-
return (
|
|
54
|
-
previous_tool_type.from_tool_call(previous_tool_call),
|
|
55
|
-
current_tool_call,
|
|
56
|
-
current_tool_type,
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
# Update arguments with each chunk
|
|
60
|
-
if tool_call.function and tool_call.function.arguments:
|
|
61
|
-
current_tool_call.function.arguments += tool_call.function.arguments
|
|
62
|
-
|
|
63
|
-
return None, current_tool_call, current_tool_type
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def handle_stream(
|
|
67
|
-
stream: Generator[ChatCompletionChunk, None, None],
|
|
68
|
-
tool_types: list[type[GroqTool]] | None,
|
|
69
|
-
partial_tools: bool = False,
|
|
70
|
-
) -> Generator[tuple[GroqCallResponseChunk, GroqTool | None], None, None]:
|
|
71
|
-
"""Iterator over the stream and constructs tools as they are streamed."""
|
|
72
|
-
current_tool_call = ChatCompletionMessageToolCall(
|
|
73
|
-
id="", function=Function(arguments="", name=""), type="function"
|
|
74
|
-
)
|
|
75
|
-
current_tool_type = None
|
|
76
|
-
for chunk in stream:
|
|
77
|
-
if not tool_types or not chunk.choices[0].delta.tool_calls:
|
|
78
|
-
if current_tool_type:
|
|
79
|
-
yield (
|
|
80
|
-
GroqCallResponseChunk(chunk=chunk),
|
|
81
|
-
current_tool_type.from_tool_call(current_tool_call),
|
|
82
|
-
)
|
|
83
|
-
current_tool_type = None
|
|
84
|
-
else:
|
|
85
|
-
yield GroqCallResponseChunk(chunk=chunk), None
|
|
86
|
-
tool, current_tool_call, current_tool_type = _handle_chunk(
|
|
87
|
-
chunk,
|
|
88
|
-
current_tool_call,
|
|
89
|
-
current_tool_type,
|
|
90
|
-
tool_types,
|
|
91
|
-
)
|
|
92
|
-
if tool is not None:
|
|
93
|
-
yield GroqCallResponseChunk(chunk=chunk), tool
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
async def handle_stream_async(
|
|
97
|
-
stream: AsyncGenerator[ChatCompletionChunk, None],
|
|
98
|
-
tool_types: list[type[GroqTool]] | None,
|
|
99
|
-
partial_tools: bool = False,
|
|
100
|
-
) -> AsyncGenerator[tuple[GroqCallResponseChunk, GroqTool | None], None]:
|
|
101
|
-
"""Async iterator over the stream and constructs tools as they are streamed."""
|
|
102
|
-
current_tool_call = ChatCompletionMessageToolCall(
|
|
103
|
-
id="", function=Function(arguments="", name=""), type="function"
|
|
104
|
-
)
|
|
105
|
-
current_tool_type = None
|
|
106
|
-
async for chunk in stream:
|
|
107
|
-
if not tool_types or not chunk.choices[0].delta.tool_calls:
|
|
108
|
-
if current_tool_type:
|
|
109
|
-
yield (
|
|
110
|
-
GroqCallResponseChunk(chunk=chunk),
|
|
111
|
-
current_tool_type.from_tool_call(current_tool_call),
|
|
112
|
-
)
|
|
113
|
-
current_tool_type = None
|
|
114
|
-
else:
|
|
115
|
-
yield GroqCallResponseChunk(chunk=chunk), None
|
|
116
|
-
tool, current_tool_call, current_tool_type = _handle_chunk(
|
|
117
|
-
chunk,
|
|
118
|
-
current_tool_call,
|
|
119
|
-
current_tool_type,
|
|
120
|
-
tool_types,
|
|
121
|
-
)
|
|
122
|
-
if tool is not None:
|
|
123
|
-
yield GroqCallResponseChunk(chunk=chunk), tool
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from typing import cast
|
|
3
|
-
|
|
4
|
-
from groq.types.chat import ChatCompletionMessageParam
|
|
5
|
-
|
|
6
|
-
from mirascope.core import BaseMessageParam
|
|
7
|
-
from mirascope.core.base import TextPart, ToolResultPart
|
|
8
|
-
from mirascope.core.base._utils._base_message_param_converter import (
|
|
9
|
-
BaseMessageParamConverter,
|
|
10
|
-
)
|
|
11
|
-
from mirascope.core.base.message_param import ImageURLPart, ToolCallPart
|
|
12
|
-
from mirascope.core.groq._utils import convert_message_params
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class GroqMessageParamConverter(BaseMessageParamConverter):
|
|
16
|
-
"""Converts between Groq `ChatCompletionMessageParam` and Mirascope `BaseMessageParam`."""
|
|
17
|
-
|
|
18
|
-
@staticmethod
|
|
19
|
-
def to_provider(
|
|
20
|
-
message_params: list[BaseMessageParam],
|
|
21
|
-
) -> list[ChatCompletionMessageParam]:
|
|
22
|
-
"""
|
|
23
|
-
Convert from Mirascope `BaseMessageParam` to Groq `ChatCompletionMessageParam`.
|
|
24
|
-
"""
|
|
25
|
-
return convert_message_params(
|
|
26
|
-
cast(list[BaseMessageParam | ChatCompletionMessageParam], message_params)
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
@staticmethod
|
|
30
|
-
def from_provider(
|
|
31
|
-
message_params: list[ChatCompletionMessageParam],
|
|
32
|
-
) -> list[BaseMessageParam]:
|
|
33
|
-
"""Convert from Groq's `ChatCompletionAssistantMessageParam` to Mirascope `BaseMessageParam`."""
|
|
34
|
-
converted = []
|
|
35
|
-
for message_param in message_params:
|
|
36
|
-
contents = []
|
|
37
|
-
content = message_param.get("content")
|
|
38
|
-
if message_param["role"] == "tool":
|
|
39
|
-
converted.append(
|
|
40
|
-
BaseMessageParam(
|
|
41
|
-
role="tool",
|
|
42
|
-
content=[
|
|
43
|
-
ToolResultPart(
|
|
44
|
-
type="tool_result",
|
|
45
|
-
name=getattr(message_param, "name", ""),
|
|
46
|
-
content=message_param["content"],
|
|
47
|
-
id=message_param["tool_call_id"],
|
|
48
|
-
is_error=False,
|
|
49
|
-
)
|
|
50
|
-
],
|
|
51
|
-
)
|
|
52
|
-
)
|
|
53
|
-
continue
|
|
54
|
-
if tool_calls := message_param.get("tool_calls"):
|
|
55
|
-
for tool_call in tool_calls:
|
|
56
|
-
contents.append(
|
|
57
|
-
ToolCallPart(
|
|
58
|
-
type="tool_call",
|
|
59
|
-
name=tool_call["function"]["name"],
|
|
60
|
-
id=tool_call["id"],
|
|
61
|
-
args=json.loads(tool_call["function"]["arguments"]),
|
|
62
|
-
)
|
|
63
|
-
)
|
|
64
|
-
elif isinstance(content, str):
|
|
65
|
-
converted.append(
|
|
66
|
-
BaseMessageParam(role=message_param["role"], content=content)
|
|
67
|
-
)
|
|
68
|
-
continue
|
|
69
|
-
elif isinstance(content, list):
|
|
70
|
-
for part in content:
|
|
71
|
-
if "text" in part:
|
|
72
|
-
contents.append(TextPart(type="text", text=part["text"]))
|
|
73
|
-
elif "image_url" in part:
|
|
74
|
-
contents.append(
|
|
75
|
-
ImageURLPart(
|
|
76
|
-
type="image_url",
|
|
77
|
-
url=part["image_url"]["url"],
|
|
78
|
-
detail=part["image_url"].get("detail"),
|
|
79
|
-
)
|
|
80
|
-
)
|
|
81
|
-
if contents:
|
|
82
|
-
converted.append(
|
|
83
|
-
BaseMessageParam(role=message_param["role"], content=contents)
|
|
84
|
-
)
|
|
85
|
-
else:
|
|
86
|
-
converted.append(
|
|
87
|
-
BaseMessageParam(role=message_param["role"], content="")
|
|
88
|
-
)
|
|
89
|
-
return converted
|