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,132 +0,0 @@
|
|
|
1
|
-
"""This module contains the setup_call function for Groq tools."""
|
|
2
|
-
|
|
3
|
-
import inspect
|
|
4
|
-
from collections.abc import Awaitable, Callable
|
|
5
|
-
from typing import Any, cast, overload
|
|
6
|
-
|
|
7
|
-
from groq import AsyncGroq, Groq
|
|
8
|
-
from groq.types.chat import (
|
|
9
|
-
ChatCompletion,
|
|
10
|
-
ChatCompletionChunk,
|
|
11
|
-
ChatCompletionMessageParam,
|
|
12
|
-
)
|
|
13
|
-
from pydantic import BaseModel
|
|
14
|
-
|
|
15
|
-
from ...base import BaseMessageParam, BaseTool, _utils
|
|
16
|
-
from ...base._utils import AsyncCreateFn, CreateFn, get_async_create_fn, get_create_fn
|
|
17
|
-
from ...base.call_params import CommonCallParams
|
|
18
|
-
from ...base.stream_config import StreamConfig
|
|
19
|
-
from .._call_kwargs import GroqCallKwargs
|
|
20
|
-
from ..call_params import GroqCallParams
|
|
21
|
-
from ..dynamic_config import AsyncGroqDynamicConfig, GroqDynamicConfig
|
|
22
|
-
from ..tool import GroqTool
|
|
23
|
-
from ._convert_common_call_params import convert_common_call_params
|
|
24
|
-
from ._convert_message_params import convert_message_params
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@overload
|
|
28
|
-
def setup_call(
|
|
29
|
-
*,
|
|
30
|
-
model: str,
|
|
31
|
-
client: AsyncGroq | None,
|
|
32
|
-
fn: Callable[..., Awaitable[AsyncGroqDynamicConfig]],
|
|
33
|
-
fn_args: dict[str, Any],
|
|
34
|
-
dynamic_config: AsyncGroqDynamicConfig,
|
|
35
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
36
|
-
json_mode: bool,
|
|
37
|
-
call_params: GroqCallParams | CommonCallParams,
|
|
38
|
-
response_model: type[BaseModel] | None,
|
|
39
|
-
stream: bool | StreamConfig,
|
|
40
|
-
) -> tuple[
|
|
41
|
-
AsyncCreateFn[ChatCompletion, ChatCompletionChunk],
|
|
42
|
-
str | None,
|
|
43
|
-
list[ChatCompletionMessageParam],
|
|
44
|
-
list[type[GroqTool]] | None,
|
|
45
|
-
GroqCallKwargs,
|
|
46
|
-
]: ...
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
@overload
|
|
50
|
-
def setup_call(
|
|
51
|
-
*,
|
|
52
|
-
model: str,
|
|
53
|
-
client: Groq | None,
|
|
54
|
-
fn: Callable[..., GroqDynamicConfig],
|
|
55
|
-
fn_args: dict[str, Any],
|
|
56
|
-
dynamic_config: GroqDynamicConfig,
|
|
57
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
58
|
-
json_mode: bool,
|
|
59
|
-
call_params: GroqCallParams | CommonCallParams,
|
|
60
|
-
response_model: type[BaseModel] | None,
|
|
61
|
-
stream: bool | StreamConfig,
|
|
62
|
-
) -> tuple[
|
|
63
|
-
CreateFn[ChatCompletion, ChatCompletionChunk],
|
|
64
|
-
str | None,
|
|
65
|
-
list[ChatCompletionMessageParam],
|
|
66
|
-
list[type[GroqTool]] | None,
|
|
67
|
-
GroqCallKwargs,
|
|
68
|
-
]: ...
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def setup_call(
|
|
72
|
-
*,
|
|
73
|
-
model: str,
|
|
74
|
-
client: Groq | AsyncGroq | None,
|
|
75
|
-
fn: Callable[..., GroqDynamicConfig | Awaitable[AsyncGroqDynamicConfig]],
|
|
76
|
-
fn_args: dict[str, Any],
|
|
77
|
-
dynamic_config: GroqDynamicConfig | AsyncGroqDynamicConfig,
|
|
78
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
79
|
-
json_mode: bool,
|
|
80
|
-
call_params: GroqCallParams | CommonCallParams,
|
|
81
|
-
response_model: type[BaseModel] | None,
|
|
82
|
-
stream: bool | StreamConfig,
|
|
83
|
-
) -> tuple[
|
|
84
|
-
CreateFn[ChatCompletion, ChatCompletionChunk]
|
|
85
|
-
| AsyncCreateFn[ChatCompletion, ChatCompletionChunk],
|
|
86
|
-
str | None,
|
|
87
|
-
list[ChatCompletionMessageParam],
|
|
88
|
-
list[type[GroqTool]] | None,
|
|
89
|
-
GroqCallKwargs,
|
|
90
|
-
]:
|
|
91
|
-
prompt_template, messages, tool_types, base_call_kwargs = _utils.setup_call(
|
|
92
|
-
fn,
|
|
93
|
-
fn_args,
|
|
94
|
-
dynamic_config,
|
|
95
|
-
tools,
|
|
96
|
-
GroqTool,
|
|
97
|
-
call_params,
|
|
98
|
-
convert_common_call_params,
|
|
99
|
-
)
|
|
100
|
-
call_kwargs = cast(GroqCallKwargs, base_call_kwargs)
|
|
101
|
-
messages = cast(list[BaseMessageParam | ChatCompletionMessageParam], messages)
|
|
102
|
-
messages = convert_message_params(messages)
|
|
103
|
-
if json_mode:
|
|
104
|
-
if not tools:
|
|
105
|
-
call_kwargs["response_format"] = {"type": "json_object"}
|
|
106
|
-
json_mode_content = _utils.json_mode_content(response_model)
|
|
107
|
-
if messages[-1]["role"] == "user":
|
|
108
|
-
if isinstance(messages[-1]["content"], str):
|
|
109
|
-
messages[-1]["content"] += json_mode_content
|
|
110
|
-
else:
|
|
111
|
-
messages[-1]["content"] = list(messages[-1]["content"]) + [
|
|
112
|
-
{"type": "text", "text": json_mode_content.strip()}
|
|
113
|
-
]
|
|
114
|
-
else:
|
|
115
|
-
messages.append({"role": "user", "content": json_mode_content.strip()})
|
|
116
|
-
elif response_model:
|
|
117
|
-
assert tool_types, "At least one tool must be provided for extraction."
|
|
118
|
-
call_kwargs["tool_choice"] = {
|
|
119
|
-
"type": "function",
|
|
120
|
-
"function": {"name": tool_types[0]._name()},
|
|
121
|
-
}
|
|
122
|
-
call_kwargs |= {"model": model, "messages": messages}
|
|
123
|
-
if client is None:
|
|
124
|
-
client = AsyncGroq() if inspect.iscoroutinefunction(fn) else Groq()
|
|
125
|
-
|
|
126
|
-
create = (
|
|
127
|
-
get_async_create_fn(client.chat.completions.create)
|
|
128
|
-
if isinstance(client, AsyncGroq)
|
|
129
|
-
else get_create_fn(client.chat.completions.create)
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
return create, prompt_template, messages, tool_types, call_kwargs
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"""usage docs: learn/calls.md#provider-specific-parameters"""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from groq.types.chat.chat_completion_tool_choice_option_param import (
|
|
6
|
-
ChatCompletionToolChoiceOptionParam,
|
|
7
|
-
)
|
|
8
|
-
from groq.types.chat.completion_create_params import ResponseFormat
|
|
9
|
-
from typing_extensions import NotRequired
|
|
10
|
-
|
|
11
|
-
from ..base import BaseCallParams
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class GroqCallParams(BaseCallParams):
|
|
15
|
-
"""The parameters to use when calling the Groq API.
|
|
16
|
-
|
|
17
|
-
[Groq API Reference](https://console.groq.com/docs/api-reference#chat-create)
|
|
18
|
-
|
|
19
|
-
Attributes:
|
|
20
|
-
frequency_penalty: ...
|
|
21
|
-
logit_bias: ...
|
|
22
|
-
logprobs: ...
|
|
23
|
-
max_tokens: ...
|
|
24
|
-
n: ...
|
|
25
|
-
parallel_tool_calls: ...
|
|
26
|
-
presence_penalty: ...
|
|
27
|
-
response_format: ...
|
|
28
|
-
seed: ...
|
|
29
|
-
stop: ...
|
|
30
|
-
temperature: ...
|
|
31
|
-
tool_choice: ...
|
|
32
|
-
top_logprobs: ...
|
|
33
|
-
top_p: ...
|
|
34
|
-
user: ...
|
|
35
|
-
"""
|
|
36
|
-
|
|
37
|
-
extra_headers: NotRequired[dict[str, str] | None]
|
|
38
|
-
frequency_penalty: NotRequired[float | None]
|
|
39
|
-
logit_bias: NotRequired[dict[str, int] | None]
|
|
40
|
-
logprobs: NotRequired[bool | None]
|
|
41
|
-
max_tokens: NotRequired[int | None]
|
|
42
|
-
n: NotRequired[int | None]
|
|
43
|
-
parallel_tool_calls: NotRequired[bool]
|
|
44
|
-
presence_penalty: NotRequired[float | None]
|
|
45
|
-
response_format: NotRequired[ResponseFormat]
|
|
46
|
-
seed: NotRequired[int | None]
|
|
47
|
-
stop: NotRequired[str | list[str] | None]
|
|
48
|
-
temperature: NotRequired[float | None]
|
|
49
|
-
tool_choice: NotRequired[ChatCompletionToolChoiceOptionParam]
|
|
50
|
-
top_logprobs: NotRequired[int | None]
|
|
51
|
-
top_p: NotRequired[float | None]
|
|
52
|
-
user: NotRequired[str]
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
"""This module contains the `GroqCallResponse` class.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/calls.md#handling-responses
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from collections.abc import Sequence
|
|
7
|
-
from functools import cached_property
|
|
8
|
-
from typing import cast
|
|
9
|
-
|
|
10
|
-
from groq.types.chat import (
|
|
11
|
-
ChatCompletion,
|
|
12
|
-
ChatCompletionAssistantMessageParam,
|
|
13
|
-
ChatCompletionMessageParam,
|
|
14
|
-
ChatCompletionToolMessageParam,
|
|
15
|
-
ChatCompletionToolParam,
|
|
16
|
-
ChatCompletionUserMessageParam,
|
|
17
|
-
)
|
|
18
|
-
from groq.types.completion_usage import CompletionUsage
|
|
19
|
-
from pydantic import SerializeAsAny, computed_field
|
|
20
|
-
|
|
21
|
-
from .. import BaseMessageParam
|
|
22
|
-
from ..base import BaseCallResponse, transform_tool_outputs
|
|
23
|
-
from ..base.types import CostMetadata, FinishReason, ImageMetadata
|
|
24
|
-
from ._utils._message_param_converter import GroqMessageParamConverter
|
|
25
|
-
from .call_params import GroqCallParams
|
|
26
|
-
from .dynamic_config import AsyncGroqDynamicConfig, GroqDynamicConfig
|
|
27
|
-
from .tool import GroqTool
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class GroqCallResponse(
|
|
31
|
-
BaseCallResponse[
|
|
32
|
-
ChatCompletion,
|
|
33
|
-
GroqTool,
|
|
34
|
-
ChatCompletionToolParam,
|
|
35
|
-
AsyncGroqDynamicConfig | GroqDynamicConfig,
|
|
36
|
-
ChatCompletionMessageParam,
|
|
37
|
-
GroqCallParams,
|
|
38
|
-
ChatCompletionUserMessageParam,
|
|
39
|
-
GroqMessageParamConverter,
|
|
40
|
-
]
|
|
41
|
-
):
|
|
42
|
-
"""A convenience wrapper around the Groq `ChatCompletion` response.
|
|
43
|
-
|
|
44
|
-
When calling the Groq API using a function decorated with `groq_call`, the
|
|
45
|
-
response will be an `GroqCallResponse` instance with properties that allow for
|
|
46
|
-
more convenience access to commonly used attributes.
|
|
47
|
-
|
|
48
|
-
Example:
|
|
49
|
-
|
|
50
|
-
```python
|
|
51
|
-
from mirascope.core import prompt_template
|
|
52
|
-
from mirascope.core.groq import groq_call
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
@groq_call("llama-3.1-8b-instant")
|
|
56
|
-
def recommend_book(genre: str) -> str:
|
|
57
|
-
return f"Recommend a {genre} book"
|
|
58
|
-
|
|
59
|
-
response = recommend_book("fantasy") # response is an `GroqCallResponse` instance
|
|
60
|
-
print(response.content)
|
|
61
|
-
```
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
_message_converter: type[GroqMessageParamConverter] = GroqMessageParamConverter
|
|
65
|
-
|
|
66
|
-
_provider = "groq"
|
|
67
|
-
|
|
68
|
-
@computed_field
|
|
69
|
-
@property
|
|
70
|
-
def content(self) -> str:
|
|
71
|
-
"""Returns the content of the chat completion for the 0th choice."""
|
|
72
|
-
message = self.response.choices[0].message
|
|
73
|
-
return message.content if message.content is not None else ""
|
|
74
|
-
|
|
75
|
-
@computed_field
|
|
76
|
-
@property
|
|
77
|
-
def finish_reasons(self) -> list[str]:
|
|
78
|
-
"""Returns the finish reasons of the response."""
|
|
79
|
-
return [str(choice.finish_reason) for choice in self.response.choices]
|
|
80
|
-
|
|
81
|
-
@computed_field
|
|
82
|
-
@property
|
|
83
|
-
def model(self) -> str:
|
|
84
|
-
"""Returns the name of the response model."""
|
|
85
|
-
return self.response.model
|
|
86
|
-
|
|
87
|
-
@computed_field
|
|
88
|
-
@property
|
|
89
|
-
def id(self) -> str:
|
|
90
|
-
"""Returns the id of the response."""
|
|
91
|
-
return self.response.id
|
|
92
|
-
|
|
93
|
-
@property
|
|
94
|
-
def usage(self) -> CompletionUsage | None:
|
|
95
|
-
"""Returns the usage of the chat completion."""
|
|
96
|
-
return self.response.usage
|
|
97
|
-
|
|
98
|
-
@computed_field
|
|
99
|
-
@property
|
|
100
|
-
def input_tokens(self) -> int | None:
|
|
101
|
-
"""Returns the number of input tokens."""
|
|
102
|
-
return self.usage.prompt_tokens if self.usage else None
|
|
103
|
-
|
|
104
|
-
@computed_field
|
|
105
|
-
@property
|
|
106
|
-
def cached_tokens(self) -> int | None:
|
|
107
|
-
"""Returns the number of cached tokens."""
|
|
108
|
-
return 0
|
|
109
|
-
|
|
110
|
-
@computed_field
|
|
111
|
-
@property
|
|
112
|
-
def output_tokens(self) -> int | None:
|
|
113
|
-
"""Returns the number of output tokens."""
|
|
114
|
-
return self.usage.completion_tokens if self.usage else None
|
|
115
|
-
|
|
116
|
-
@computed_field
|
|
117
|
-
@cached_property
|
|
118
|
-
def message_param(self) -> SerializeAsAny[ChatCompletionAssistantMessageParam]:
|
|
119
|
-
"""Returns the assistants's response as a message parameter."""
|
|
120
|
-
message_param = self.response.choices[0].message.model_dump(
|
|
121
|
-
exclude={"function_call"}
|
|
122
|
-
)
|
|
123
|
-
return ChatCompletionAssistantMessageParam(**message_param)
|
|
124
|
-
|
|
125
|
-
@cached_property
|
|
126
|
-
def tools(self) -> list[GroqTool] | None:
|
|
127
|
-
"""Returns any available tool calls as their `GroqTool` definition.
|
|
128
|
-
|
|
129
|
-
Raises:
|
|
130
|
-
ValidationError: if a tool call doesn't match the tool's schema.
|
|
131
|
-
"""
|
|
132
|
-
tool_calls = self.response.choices[0].message.tool_calls
|
|
133
|
-
if not self.tool_types or not tool_calls:
|
|
134
|
-
return None
|
|
135
|
-
|
|
136
|
-
extracted_tools = []
|
|
137
|
-
for tool_call in tool_calls:
|
|
138
|
-
for tool_type in self.tool_types:
|
|
139
|
-
if tool_call.function.name == tool_type._name():
|
|
140
|
-
extracted_tools.append(tool_type.from_tool_call(tool_call))
|
|
141
|
-
break
|
|
142
|
-
|
|
143
|
-
return extracted_tools
|
|
144
|
-
|
|
145
|
-
@cached_property
|
|
146
|
-
def tool(self) -> GroqTool | None:
|
|
147
|
-
"""Returns the 0th tool for the 0th choice message.
|
|
148
|
-
|
|
149
|
-
Raises:
|
|
150
|
-
ValidationError: if the tool call doesn't match the tool's schema.
|
|
151
|
-
"""
|
|
152
|
-
if tools := self.tools:
|
|
153
|
-
return tools[0]
|
|
154
|
-
return None
|
|
155
|
-
|
|
156
|
-
@classmethod
|
|
157
|
-
@transform_tool_outputs
|
|
158
|
-
def tool_message_params(
|
|
159
|
-
cls, tools_and_outputs: Sequence[tuple[GroqTool, str]]
|
|
160
|
-
) -> list[ChatCompletionToolMessageParam]:
|
|
161
|
-
"""Returns the tool message parameters for tool call results.
|
|
162
|
-
|
|
163
|
-
Args:
|
|
164
|
-
tools_and_outputs: The sequence of tools and their outputs from which the tool
|
|
165
|
-
message parameters should be constructed.
|
|
166
|
-
|
|
167
|
-
Returns:
|
|
168
|
-
The list of constructed `ChatCompletionToolMessageParam` parameters.
|
|
169
|
-
"""
|
|
170
|
-
return [
|
|
171
|
-
ChatCompletionToolMessageParam( # pyright: ignore [reportCallIssue]
|
|
172
|
-
role="tool",
|
|
173
|
-
content=output,
|
|
174
|
-
tool_call_id=tool.tool_call.id, # pyright: ignore [reportOptionalMemberAccess]
|
|
175
|
-
name=tool._name(), # pyright: ignore [reportCallIssue]
|
|
176
|
-
)
|
|
177
|
-
for tool, output in tools_and_outputs
|
|
178
|
-
]
|
|
179
|
-
|
|
180
|
-
@property
|
|
181
|
-
def common_finish_reasons(self) -> list[FinishReason] | None:
|
|
182
|
-
return cast(list[FinishReason], self.finish_reasons)
|
|
183
|
-
|
|
184
|
-
@property
|
|
185
|
-
def common_message_param(self) -> BaseMessageParam:
|
|
186
|
-
return GroqMessageParamConverter.from_provider([self.message_param])[0]
|
|
187
|
-
|
|
188
|
-
@property
|
|
189
|
-
def common_user_message_param(self) -> BaseMessageParam | None:
|
|
190
|
-
if not self.user_message_param:
|
|
191
|
-
return None
|
|
192
|
-
return GroqMessageParamConverter.from_provider([self.user_message_param])[0]
|
|
193
|
-
|
|
194
|
-
@property
|
|
195
|
-
def cost_metadata(self) -> CostMetadata:
|
|
196
|
-
cost_metadata = super().cost_metadata
|
|
197
|
-
image_metadata = []
|
|
198
|
-
|
|
199
|
-
for message in self.messages:
|
|
200
|
-
if "content" not in message:
|
|
201
|
-
continue
|
|
202
|
-
content = message["content"]
|
|
203
|
-
|
|
204
|
-
if not isinstance(content, list):
|
|
205
|
-
continue
|
|
206
|
-
for part in content:
|
|
207
|
-
# Check if this part is an image_url
|
|
208
|
-
if isinstance(part, dict) and part.get("type") == "image_url":
|
|
209
|
-
# Only count the image if it has a URL
|
|
210
|
-
image_metadata.append(ImageMetadata(width=0, height=0))
|
|
211
|
-
|
|
212
|
-
cost_metadata.images = image_metadata
|
|
213
|
-
return cost_metadata
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"""This module contains the `GroqCallResponseChunk` class.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md#handling-streamed-responses
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from typing import cast
|
|
7
|
-
|
|
8
|
-
from groq.types.chat import ChatCompletionChunk
|
|
9
|
-
from groq.types.chat.chat_completion import Choice
|
|
10
|
-
from groq.types.completion_usage import CompletionUsage
|
|
11
|
-
|
|
12
|
-
from ..base import BaseCallResponseChunk
|
|
13
|
-
from ..base.types import CostMetadata
|
|
14
|
-
|
|
15
|
-
FinishReason = Choice.__annotations__["finish_reason"]
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class GroqCallResponseChunk(BaseCallResponseChunk[ChatCompletionChunk, FinishReason]):
|
|
19
|
-
"""A convenience wrapper around the Groq `ChatCompletionChunk` streamed chunks.
|
|
20
|
-
|
|
21
|
-
When calling the Groq API using a function decorated with `groq_call` and
|
|
22
|
-
`stream` set to `True`, the stream will contain `GroqResponseChunk` instances with
|
|
23
|
-
properties that allow for more convenient access to commonly used attributes.
|
|
24
|
-
|
|
25
|
-
Example:
|
|
26
|
-
|
|
27
|
-
```python
|
|
28
|
-
from mirascope.core import prompt_template
|
|
29
|
-
from mirascope.core.groq import groq_call
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@groq_call("llama-3.1-8b-instant", stream=True)
|
|
33
|
-
def recommend_book(genre: str) -> str:
|
|
34
|
-
return f"Recommend a {genre} book"
|
|
35
|
-
|
|
36
|
-
stream = recommend_book("fantasy") # response is an `GroqStream`
|
|
37
|
-
for chunk, _ in stream:
|
|
38
|
-
print(chunk.content, end="", flush=True)
|
|
39
|
-
```
|
|
40
|
-
"""
|
|
41
|
-
|
|
42
|
-
@property
|
|
43
|
-
def content(self) -> str:
|
|
44
|
-
"""Returns the content for the 0th choice delta."""
|
|
45
|
-
delta = None
|
|
46
|
-
if self.chunk.choices:
|
|
47
|
-
delta = self.chunk.choices[0].delta
|
|
48
|
-
return delta.content if delta is not None and delta.content else ""
|
|
49
|
-
|
|
50
|
-
@property
|
|
51
|
-
def finish_reasons(
|
|
52
|
-
self,
|
|
53
|
-
) -> list[FinishReason]:
|
|
54
|
-
"""Returns the finish reasons of the response."""
|
|
55
|
-
return [
|
|
56
|
-
choice.finish_reason
|
|
57
|
-
for choice in self.chunk.choices
|
|
58
|
-
if choice.finish_reason
|
|
59
|
-
]
|
|
60
|
-
|
|
61
|
-
@property
|
|
62
|
-
def model(self) -> str:
|
|
63
|
-
"""Returns the name of the response model."""
|
|
64
|
-
return self.chunk.model
|
|
65
|
-
|
|
66
|
-
@property
|
|
67
|
-
def id(self) -> str:
|
|
68
|
-
"""Returns the id of the response."""
|
|
69
|
-
return self.chunk.id
|
|
70
|
-
|
|
71
|
-
@property
|
|
72
|
-
def usage(self) -> CompletionUsage | None:
|
|
73
|
-
"""Returns the usage of the chat completion."""
|
|
74
|
-
if self.chunk.usage:
|
|
75
|
-
return self.chunk.usage
|
|
76
|
-
return None
|
|
77
|
-
|
|
78
|
-
@property
|
|
79
|
-
def input_tokens(self) -> int | None:
|
|
80
|
-
"""Returns the number of input tokens."""
|
|
81
|
-
if self.usage:
|
|
82
|
-
return self.usage.prompt_tokens
|
|
83
|
-
return None
|
|
84
|
-
|
|
85
|
-
@property
|
|
86
|
-
def cached_tokens(self) -> int | None:
|
|
87
|
-
"""Returns the number of cached tokens."""
|
|
88
|
-
return 0
|
|
89
|
-
|
|
90
|
-
@property
|
|
91
|
-
def output_tokens(self) -> int | None:
|
|
92
|
-
"""Returns the number of output tokens."""
|
|
93
|
-
if self.usage:
|
|
94
|
-
return self.usage.completion_tokens
|
|
95
|
-
return None
|
|
96
|
-
|
|
97
|
-
@property
|
|
98
|
-
def cost_metadata(self) -> CostMetadata:
|
|
99
|
-
"""Returns the cost metadata."""
|
|
100
|
-
return super().cost_metadata
|
|
101
|
-
|
|
102
|
-
@property
|
|
103
|
-
def common_finish_reasons(self) -> list[FinishReason] | None:
|
|
104
|
-
return cast(list[FinishReason], self.finish_reasons)
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"""This module defines the function return type for functions as LLM calls."""
|
|
2
|
-
|
|
3
|
-
from groq import AsyncGroq, Groq
|
|
4
|
-
from groq.types.chat import ChatCompletionMessageParam
|
|
5
|
-
|
|
6
|
-
from ..base import BaseDynamicConfig, BaseMessageParam
|
|
7
|
-
from .call_params import GroqCallParams
|
|
8
|
-
|
|
9
|
-
AsyncGroqDynamicConfig = BaseDynamicConfig[
|
|
10
|
-
ChatCompletionMessageParam | BaseMessageParam, GroqCallParams, AsyncGroq
|
|
11
|
-
]
|
|
12
|
-
GroqDynamicConfig = BaseDynamicConfig[
|
|
13
|
-
ChatCompletionMessageParam | BaseMessageParam, GroqCallParams, Groq
|
|
14
|
-
]
|
|
15
|
-
"""The function return type for functions wrapped with the `groq_call` decorator.
|
|
16
|
-
|
|
17
|
-
Example:
|
|
18
|
-
|
|
19
|
-
```python
|
|
20
|
-
from mirascope.core import prompt_template
|
|
21
|
-
from mirascope.core.groq import GroqDynamicConfig, groq_call
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@groq_call("llama-3.1-8b-instant")
|
|
25
|
-
@prompt_template("Recommend a {capitalized_genre} book")
|
|
26
|
-
def recommend_book(genre: str) -> GroqDynamicConfig:
|
|
27
|
-
return {"computed_fields": {"capitalized_genre": genre.capitalize()}}
|
|
28
|
-
```
|
|
29
|
-
"""
|
mirascope/core/groq/py.typed
DELETED
|
File without changes
|
mirascope/core/groq/stream.py
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
"""The `GroqStream` class for convenience around streaming LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from groq.types.chat import (
|
|
7
|
-
ChatCompletion,
|
|
8
|
-
ChatCompletionAssistantMessageParam,
|
|
9
|
-
ChatCompletionMessageParam,
|
|
10
|
-
ChatCompletionMessageToolCallParam,
|
|
11
|
-
ChatCompletionToolMessageParam,
|
|
12
|
-
ChatCompletionToolParam,
|
|
13
|
-
ChatCompletionUserMessageParam,
|
|
14
|
-
)
|
|
15
|
-
from groq.types.chat.chat_completion import Choice
|
|
16
|
-
from groq.types.chat.chat_completion_message import ChatCompletionMessage
|
|
17
|
-
from groq.types.completion_usage import CompletionUsage
|
|
18
|
-
|
|
19
|
-
from ..base.stream import BaseStream
|
|
20
|
-
from ..base.types import CostMetadata
|
|
21
|
-
from .call_params import GroqCallParams
|
|
22
|
-
from .call_response import GroqCallResponse
|
|
23
|
-
from .call_response_chunk import GroqCallResponseChunk
|
|
24
|
-
from .dynamic_config import AsyncGroqDynamicConfig, GroqDynamicConfig
|
|
25
|
-
from .tool import GroqTool
|
|
26
|
-
|
|
27
|
-
FinishReason = Choice.__annotations__["finish_reason"]
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class GroqStream(
|
|
31
|
-
BaseStream[
|
|
32
|
-
GroqCallResponse,
|
|
33
|
-
GroqCallResponseChunk,
|
|
34
|
-
ChatCompletionUserMessageParam,
|
|
35
|
-
ChatCompletionAssistantMessageParam,
|
|
36
|
-
ChatCompletionToolMessageParam,
|
|
37
|
-
ChatCompletionMessageParam,
|
|
38
|
-
GroqTool,
|
|
39
|
-
ChatCompletionToolParam,
|
|
40
|
-
AsyncGroqDynamicConfig | GroqDynamicConfig,
|
|
41
|
-
GroqCallParams,
|
|
42
|
-
FinishReason,
|
|
43
|
-
]
|
|
44
|
-
):
|
|
45
|
-
"""A class for convenience around streaming Groq LLM calls.
|
|
46
|
-
|
|
47
|
-
Example:
|
|
48
|
-
|
|
49
|
-
```python
|
|
50
|
-
from mirascope.core import prompt_template
|
|
51
|
-
from mirascope.core.groq import groq_call
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
@groq_call("llama-3.1-8b-instant", stream=True)
|
|
55
|
-
def recommend_book(genre: str) -> str:
|
|
56
|
-
return f"Recommend a {genre} book"
|
|
57
|
-
|
|
58
|
-
stream = recommend_book("fantasy") # returns `GroqStream` instance
|
|
59
|
-
for chunk, _ in stream:
|
|
60
|
-
print(chunk.content, end="", flush=True)
|
|
61
|
-
```
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
_provider = "groq"
|
|
65
|
-
|
|
66
|
-
def _construct_message_param(
|
|
67
|
-
self,
|
|
68
|
-
tool_calls: list[ChatCompletionMessageToolCallParam] | None = None,
|
|
69
|
-
content: str | None = None,
|
|
70
|
-
) -> ChatCompletionAssistantMessageParam:
|
|
71
|
-
message_param = ChatCompletionAssistantMessageParam(
|
|
72
|
-
role="assistant",
|
|
73
|
-
content=content,
|
|
74
|
-
)
|
|
75
|
-
if tool_calls:
|
|
76
|
-
message_param["tool_calls"] = tool_calls
|
|
77
|
-
return message_param
|
|
78
|
-
|
|
79
|
-
def construct_call_response(self) -> GroqCallResponse:
|
|
80
|
-
"""Constructs the call response from a consumed GroqStream.
|
|
81
|
-
|
|
82
|
-
Raises:
|
|
83
|
-
ValueError: if the stream has not yet been consumed.
|
|
84
|
-
"""
|
|
85
|
-
if not hasattr(self, "message_param"):
|
|
86
|
-
raise ValueError(
|
|
87
|
-
"No stream response, check if the stream has been consumed."
|
|
88
|
-
)
|
|
89
|
-
message = {
|
|
90
|
-
"role": self.message_param["role"],
|
|
91
|
-
"content": self.message_param.get("content", ""),
|
|
92
|
-
"tool_calls": self.message_param.get("tool_calls", []),
|
|
93
|
-
}
|
|
94
|
-
if not self.input_tokens and not self.output_tokens:
|
|
95
|
-
usage = None
|
|
96
|
-
else:
|
|
97
|
-
usage = CompletionUsage(
|
|
98
|
-
prompt_tokens=int(self.input_tokens or 0),
|
|
99
|
-
completion_tokens=int(self.output_tokens or 0),
|
|
100
|
-
total_tokens=int(self.input_tokens or 0) + int(self.output_tokens or 0),
|
|
101
|
-
)
|
|
102
|
-
completion = ChatCompletion(
|
|
103
|
-
id=self.id if self.id else "",
|
|
104
|
-
model=self.model,
|
|
105
|
-
choices=[
|
|
106
|
-
Choice(
|
|
107
|
-
finish_reason=self.finish_reasons[0]
|
|
108
|
-
if self.finish_reasons and self.finish_reasons[0]
|
|
109
|
-
else "stop",
|
|
110
|
-
index=0,
|
|
111
|
-
message=ChatCompletionMessage.model_validate(message),
|
|
112
|
-
)
|
|
113
|
-
],
|
|
114
|
-
created=0,
|
|
115
|
-
object="chat.completion",
|
|
116
|
-
usage=usage,
|
|
117
|
-
)
|
|
118
|
-
return GroqCallResponse(
|
|
119
|
-
metadata=self.metadata,
|
|
120
|
-
response=completion,
|
|
121
|
-
tool_types=self.tool_types,
|
|
122
|
-
prompt_template=self.prompt_template,
|
|
123
|
-
fn_args=self.fn_args if self.fn_args else {},
|
|
124
|
-
dynamic_config=self.dynamic_config,
|
|
125
|
-
messages=self.messages,
|
|
126
|
-
call_params=self.call_params,
|
|
127
|
-
call_kwargs=self.call_kwargs,
|
|
128
|
-
user_message_param=self.user_message_param,
|
|
129
|
-
start_time=self.start_time,
|
|
130
|
-
end_time=self.end_time,
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
@property
|
|
134
|
-
def cost_metadata(self) -> CostMetadata:
|
|
135
|
-
return super().cost_metadata
|