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,255 +0,0 @@
|
|
|
1
|
-
"""This module contains the `GoogleCallResponse` 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
|
-
|
|
9
|
-
from google.genai.types import (
|
|
10
|
-
ContentDict,
|
|
11
|
-
ContentListUnion,
|
|
12
|
-
ContentListUnionDict,
|
|
13
|
-
FunctionResponseDict,
|
|
14
|
-
GenerateContentResponse,
|
|
15
|
-
GenerateContentResponseUsageMetadata,
|
|
16
|
-
Part,
|
|
17
|
-
PartDict,
|
|
18
|
-
# Import manually SchemaDict to avoid Pydantic error
|
|
19
|
-
SchemaDict, # noqa: F401
|
|
20
|
-
Tool,
|
|
21
|
-
)
|
|
22
|
-
from pydantic import computed_field
|
|
23
|
-
|
|
24
|
-
from .. import BaseMessageParam
|
|
25
|
-
from ..base import BaseCallResponse, transform_tool_outputs
|
|
26
|
-
from ..base.types import CostMetadata, FinishReason, GoogleMetadata
|
|
27
|
-
from ._utils._convert_finish_reason_to_common_finish_reasons import (
|
|
28
|
-
_convert_finish_reasons_to_common_finish_reasons,
|
|
29
|
-
)
|
|
30
|
-
from ._utils._message_param_converter import GoogleMessageParamConverter
|
|
31
|
-
from .call_params import GoogleCallParams
|
|
32
|
-
from .dynamic_config import GoogleDynamicConfig
|
|
33
|
-
from .tool import GoogleTool
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class GoogleCallResponse(
|
|
37
|
-
BaseCallResponse[
|
|
38
|
-
GenerateContentResponse,
|
|
39
|
-
GoogleTool,
|
|
40
|
-
Tool,
|
|
41
|
-
GoogleDynamicConfig,
|
|
42
|
-
ContentListUnion | ContentListUnionDict,
|
|
43
|
-
GoogleCallParams,
|
|
44
|
-
ContentDict,
|
|
45
|
-
GoogleMessageParamConverter,
|
|
46
|
-
]
|
|
47
|
-
):
|
|
48
|
-
"""A convenience wrapper around the Google API response.
|
|
49
|
-
|
|
50
|
-
When calling the Google API using a function decorated with `google_call`, the
|
|
51
|
-
response will be a `GoogleCallResponse` instance with properties that allow for
|
|
52
|
-
more convenient access to commonly used attributes.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
Example:
|
|
56
|
-
|
|
57
|
-
```python
|
|
58
|
-
from mirascope.core import prompt_template
|
|
59
|
-
from mirascope.core.google import google_call
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
@google_call("google-1.5-flash")
|
|
63
|
-
def recommend_book(genre: str) -> str:
|
|
64
|
-
return f"Recommend a {genre} book"
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
response = recommend_book("fantasy") # response is an `GoogleCallResponse` instance
|
|
68
|
-
print(response.content)
|
|
69
|
-
```
|
|
70
|
-
"""
|
|
71
|
-
|
|
72
|
-
_message_converter: type[GoogleMessageParamConverter] = GoogleMessageParamConverter
|
|
73
|
-
|
|
74
|
-
_provider = "google"
|
|
75
|
-
|
|
76
|
-
def _parts(self) -> list[Part]:
|
|
77
|
-
"""Returns the parts of the 0th candidate."""
|
|
78
|
-
if (
|
|
79
|
-
not (candidates := self.response.candidates)
|
|
80
|
-
or not (content := candidates[0].content)
|
|
81
|
-
or not (parts := content.parts)
|
|
82
|
-
):
|
|
83
|
-
return []
|
|
84
|
-
return parts
|
|
85
|
-
|
|
86
|
-
@computed_field
|
|
87
|
-
@property
|
|
88
|
-
def content(self) -> str:
|
|
89
|
-
"""Returns the contained string content for the 0th choice."""
|
|
90
|
-
for part in self._parts():
|
|
91
|
-
if not part.thought and part.text:
|
|
92
|
-
return part.text
|
|
93
|
-
return ""
|
|
94
|
-
|
|
95
|
-
@computed_field
|
|
96
|
-
@property
|
|
97
|
-
def thinking(self) -> str | None:
|
|
98
|
-
"""Returns the thought content from the first thought part"""
|
|
99
|
-
for part in self._parts():
|
|
100
|
-
if part.thought and part.text:
|
|
101
|
-
return part.text
|
|
102
|
-
return None
|
|
103
|
-
|
|
104
|
-
@computed_field
|
|
105
|
-
@property
|
|
106
|
-
def finish_reasons(self) -> list[str]:
|
|
107
|
-
"""Returns the finish reasons of the response."""
|
|
108
|
-
|
|
109
|
-
return [
|
|
110
|
-
candidate.finish_reason.value
|
|
111
|
-
for candidate in (self.response.candidates or [])
|
|
112
|
-
if candidate and candidate.finish_reason is not None
|
|
113
|
-
]
|
|
114
|
-
|
|
115
|
-
@computed_field
|
|
116
|
-
@property
|
|
117
|
-
def model(self) -> str:
|
|
118
|
-
"""Returns the model name.
|
|
119
|
-
|
|
120
|
-
google.generativeai does not return model, so we return the model provided by
|
|
121
|
-
the user.
|
|
122
|
-
"""
|
|
123
|
-
return (
|
|
124
|
-
self.response.model_version if self.response.model_version else self._model
|
|
125
|
-
)
|
|
126
|
-
|
|
127
|
-
@computed_field
|
|
128
|
-
@property
|
|
129
|
-
def id(self) -> str | None:
|
|
130
|
-
"""Returns the id of the response.
|
|
131
|
-
|
|
132
|
-
google.generativeai does not return an id
|
|
133
|
-
"""
|
|
134
|
-
return None
|
|
135
|
-
|
|
136
|
-
@property
|
|
137
|
-
def usage(self) -> GenerateContentResponseUsageMetadata | None:
|
|
138
|
-
"""Returns the usage of the chat completion.
|
|
139
|
-
|
|
140
|
-
google.generativeai does not have Usage, so we return None
|
|
141
|
-
"""
|
|
142
|
-
return self.response.usage_metadata
|
|
143
|
-
|
|
144
|
-
@computed_field
|
|
145
|
-
@property
|
|
146
|
-
def input_tokens(self) -> int | None:
|
|
147
|
-
"""Returns the number of input tokens."""
|
|
148
|
-
return (
|
|
149
|
-
self.response.usage_metadata.prompt_token_count
|
|
150
|
-
if self.response.usage_metadata
|
|
151
|
-
else None
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
@computed_field
|
|
155
|
-
@property
|
|
156
|
-
def cached_tokens(self) -> int | None:
|
|
157
|
-
"""Returns the number of cached tokens."""
|
|
158
|
-
return (
|
|
159
|
-
self.response.usage_metadata.cached_content_token_count
|
|
160
|
-
if self.response.usage_metadata
|
|
161
|
-
else None
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
@computed_field
|
|
165
|
-
@property
|
|
166
|
-
def output_tokens(self) -> int | None:
|
|
167
|
-
"""Returns the number of output tokens."""
|
|
168
|
-
return (
|
|
169
|
-
self.response.usage_metadata.candidates_token_count
|
|
170
|
-
if self.response.usage_metadata
|
|
171
|
-
else None
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
@computed_field
|
|
175
|
-
@cached_property
|
|
176
|
-
def message_param(self) -> ContentDict:
|
|
177
|
-
"""Returns the models's response as a message parameter."""
|
|
178
|
-
return {"role": "model", "parts": self.response.candidates[0].content.parts} # pyright: ignore [reportReturnType, reportOptionalSubscript, reportOptionalMemberAccess]
|
|
179
|
-
|
|
180
|
-
@cached_property
|
|
181
|
-
def tools(self) -> list[GoogleTool] | None:
|
|
182
|
-
"""Returns the list of tools for the response."""
|
|
183
|
-
if self.tool_types is None:
|
|
184
|
-
return None
|
|
185
|
-
|
|
186
|
-
extracted_tools = []
|
|
187
|
-
for tool_call in self.response.function_calls or []:
|
|
188
|
-
for tool_type in self.tool_types:
|
|
189
|
-
if tool_call.name == tool_type._name(): # pyright: ignore [reportOptionalMemberAccess]
|
|
190
|
-
extracted_tools.append(tool_type.from_tool_call(tool_call)) # pyright: ignore [reportArgumentType]
|
|
191
|
-
break
|
|
192
|
-
|
|
193
|
-
return extracted_tools
|
|
194
|
-
|
|
195
|
-
@cached_property
|
|
196
|
-
def tool(self) -> GoogleTool | None:
|
|
197
|
-
"""Returns the 0th tool for the 0th candidate's 0th content part.
|
|
198
|
-
|
|
199
|
-
Raises:
|
|
200
|
-
ValidationError: if the tool call doesn't match the tool's schema.
|
|
201
|
-
"""
|
|
202
|
-
tools = self.tools
|
|
203
|
-
if tools:
|
|
204
|
-
return tools[0]
|
|
205
|
-
return None
|
|
206
|
-
|
|
207
|
-
@classmethod
|
|
208
|
-
@transform_tool_outputs
|
|
209
|
-
def tool_message_params(
|
|
210
|
-
cls, tools_and_outputs: Sequence[tuple[GoogleTool, str]]
|
|
211
|
-
) -> list[ContentDict]:
|
|
212
|
-
"""Returns the tool message parameters for tool call results.
|
|
213
|
-
|
|
214
|
-
Args:
|
|
215
|
-
tools_and_outputs: The sequence of tools and their outputs from which the tool
|
|
216
|
-
message parameters should be constructed.
|
|
217
|
-
|
|
218
|
-
Returns:
|
|
219
|
-
The list of constructed `FunctionResponse` parameters.
|
|
220
|
-
"""
|
|
221
|
-
return [
|
|
222
|
-
{
|
|
223
|
-
"role": "user",
|
|
224
|
-
"parts": [
|
|
225
|
-
PartDict(
|
|
226
|
-
function_response=FunctionResponseDict(
|
|
227
|
-
name=tool._name(), response={"result": output}
|
|
228
|
-
)
|
|
229
|
-
)
|
|
230
|
-
for tool, output in tools_and_outputs
|
|
231
|
-
],
|
|
232
|
-
}
|
|
233
|
-
]
|
|
234
|
-
|
|
235
|
-
@property
|
|
236
|
-
def common_finish_reasons(self) -> list[FinishReason] | None:
|
|
237
|
-
return _convert_finish_reasons_to_common_finish_reasons(self.finish_reasons)
|
|
238
|
-
|
|
239
|
-
@property
|
|
240
|
-
def common_message_param(self) -> BaseMessageParam:
|
|
241
|
-
return GoogleMessageParamConverter.from_provider([self.message_param])[0]
|
|
242
|
-
|
|
243
|
-
@property
|
|
244
|
-
def common_user_message_param(self) -> BaseMessageParam | None:
|
|
245
|
-
if not self.user_message_param:
|
|
246
|
-
return None
|
|
247
|
-
return GoogleMessageParamConverter.from_provider([self.user_message_param])[0]
|
|
248
|
-
|
|
249
|
-
@property
|
|
250
|
-
def cost_metadata(self) -> CostMetadata:
|
|
251
|
-
cost_metadata = super().cost_metadata
|
|
252
|
-
cost_metadata.google = GoogleMetadata(
|
|
253
|
-
use_vertex_ai="use_vertex_ai" in self.metadata.get("tags", [])
|
|
254
|
-
)
|
|
255
|
-
return cost_metadata
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
"""This module contains the `GoogleCallResponseChunk` class.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md#handling-streamed-responses
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from typing import cast
|
|
7
|
-
|
|
8
|
-
from google.genai.types import FinishReason as GoogleFinishReason
|
|
9
|
-
from google.genai.types import (
|
|
10
|
-
GenerateContentResponse,
|
|
11
|
-
GenerateContentResponseUsageMetadata,
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
from mirascope.core.base.types import CostMetadata, FinishReason
|
|
15
|
-
|
|
16
|
-
from ..base import BaseCallResponseChunk
|
|
17
|
-
from ._utils._convert_finish_reason_to_common_finish_reasons import (
|
|
18
|
-
_convert_finish_reasons_to_common_finish_reasons,
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class GoogleCallResponseChunk(
|
|
23
|
-
BaseCallResponseChunk[GenerateContentResponse, GoogleFinishReason]
|
|
24
|
-
):
|
|
25
|
-
"""A convenience wrapper around the Google API streamed response chunks.
|
|
26
|
-
|
|
27
|
-
When calling the Google API using a function decorated with `google_call` and
|
|
28
|
-
`stream` set to `True`, the stream will contain `GoogleCallResponseChunk` instances
|
|
29
|
-
|
|
30
|
-
Example:
|
|
31
|
-
|
|
32
|
-
```python
|
|
33
|
-
from mirascope.core import prompt_template
|
|
34
|
-
from mirascope.core.google import google_call
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
@google_call("google-1.5-flash", stream=True)
|
|
38
|
-
def recommend_book(genre: str) -> str:
|
|
39
|
-
return f"Recommend a {genre} book"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
stream = recommend_book("fantasy") # response is an `GoogleStream`
|
|
43
|
-
for chunk, _ in stream:
|
|
44
|
-
print(chunk.content, end="", flush=True)
|
|
45
|
-
```
|
|
46
|
-
"""
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def content(self) -> str:
|
|
50
|
-
"""Returns the chunk content for the 0th choice."""
|
|
51
|
-
if (
|
|
52
|
-
not (candidates := self.chunk.candidates)
|
|
53
|
-
or not (content := candidates[0].content)
|
|
54
|
-
or not (parts := content.parts)
|
|
55
|
-
):
|
|
56
|
-
return ""
|
|
57
|
-
|
|
58
|
-
for part in parts:
|
|
59
|
-
if not part.thought and part.text:
|
|
60
|
-
return part.text
|
|
61
|
-
return ""
|
|
62
|
-
|
|
63
|
-
@property
|
|
64
|
-
def thinking(self) -> str:
|
|
65
|
-
"""Returns the thinking content from thinking parts."""
|
|
66
|
-
if (
|
|
67
|
-
not (candidates := self.chunk.candidates)
|
|
68
|
-
or not (content := candidates[0].content)
|
|
69
|
-
or not (parts := content.parts)
|
|
70
|
-
):
|
|
71
|
-
return ""
|
|
72
|
-
|
|
73
|
-
for part in parts:
|
|
74
|
-
if part.thought and part.text:
|
|
75
|
-
return part.text
|
|
76
|
-
return ""
|
|
77
|
-
|
|
78
|
-
@property
|
|
79
|
-
def finish_reasons(self) -> list[GoogleFinishReason]:
|
|
80
|
-
"""Returns the finish reasons of the response."""
|
|
81
|
-
return [
|
|
82
|
-
candidate.finish_reason
|
|
83
|
-
for candidate in (self.chunk.candidates or [])
|
|
84
|
-
if candidate.finish_reason is not None
|
|
85
|
-
]
|
|
86
|
-
|
|
87
|
-
@property
|
|
88
|
-
def model(self) -> str | None:
|
|
89
|
-
"""Returns the model name.
|
|
90
|
-
|
|
91
|
-
google.generativeai does not return model, so we return None
|
|
92
|
-
"""
|
|
93
|
-
return self.chunk.model_version
|
|
94
|
-
|
|
95
|
-
@property
|
|
96
|
-
def id(self) -> str | None:
|
|
97
|
-
"""Returns the id of the response.
|
|
98
|
-
|
|
99
|
-
google.generativeai does not return an id
|
|
100
|
-
"""
|
|
101
|
-
return None
|
|
102
|
-
|
|
103
|
-
@property
|
|
104
|
-
def usage(self) -> GenerateContentResponseUsageMetadata | None:
|
|
105
|
-
"""Returns the usage of the chat completion.
|
|
106
|
-
|
|
107
|
-
google.generativeai does not have Usage, so we return None
|
|
108
|
-
"""
|
|
109
|
-
return self.chunk.usage_metadata
|
|
110
|
-
|
|
111
|
-
@property
|
|
112
|
-
def input_tokens(self) -> int | None:
|
|
113
|
-
"""Returns the number of input tokens."""
|
|
114
|
-
return self.usage.prompt_token_count if self.usage else None
|
|
115
|
-
|
|
116
|
-
@property
|
|
117
|
-
def cached_tokens(self) -> int | None:
|
|
118
|
-
"""Returns the number of cached tokens."""
|
|
119
|
-
return self.usage.cached_content_token_count if self.usage else None
|
|
120
|
-
|
|
121
|
-
@property
|
|
122
|
-
def output_tokens(self) -> int | None:
|
|
123
|
-
"""Returns the number of output tokens."""
|
|
124
|
-
return self.usage.candidates_token_count if self.usage else None
|
|
125
|
-
|
|
126
|
-
@property
|
|
127
|
-
def cost_metadata(self) -> CostMetadata:
|
|
128
|
-
"""Returns the cost metadata."""
|
|
129
|
-
return super().cost_metadata
|
|
130
|
-
|
|
131
|
-
@property
|
|
132
|
-
def common_finish_reasons(self) -> list[FinishReason] | None:
|
|
133
|
-
return _convert_finish_reasons_to_common_finish_reasons(
|
|
134
|
-
cast(list[str], self.finish_reasons)
|
|
135
|
-
)
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"""This module defines the function return type for functions as LLM calls."""
|
|
2
|
-
|
|
3
|
-
from google.genai import Client
|
|
4
|
-
from google.genai.types import ContentListUnion, ContentListUnionDict
|
|
5
|
-
|
|
6
|
-
from ..base import BaseDynamicConfig, BaseMessageParam
|
|
7
|
-
from .call_params import GoogleCallParams
|
|
8
|
-
|
|
9
|
-
GoogleDynamicConfig = BaseDynamicConfig[
|
|
10
|
-
ContentListUnion | ContentListUnionDict | BaseMessageParam, GoogleCallParams, Client
|
|
11
|
-
]
|
|
12
|
-
"""The function return type for functions wrapped with the `google_call` decorator.
|
|
13
|
-
|
|
14
|
-
Example:
|
|
15
|
-
|
|
16
|
-
```python
|
|
17
|
-
from mirascope.core import prompt_template
|
|
18
|
-
from mirascope.core.google import GoogleDynamicConfig, google_call
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@google_call("google-1.5-flash")
|
|
22
|
-
@prompt_template("Recommend a {capitalized_genre} book")
|
|
23
|
-
def recommend_book(genre: str) -> GoogleDynamicConfig:
|
|
24
|
-
return {"computed_fields": {"capitalized_genre": genre.capitalize()}}
|
|
25
|
-
```
|
|
26
|
-
"""
|
mirascope/core/google/stream.py
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
"""The `GoogleStream` class for convenience around streaming LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from collections.abc import AsyncGenerator, Generator
|
|
7
|
-
from typing import Any, cast
|
|
8
|
-
|
|
9
|
-
from google.genai.types import (
|
|
10
|
-
Candidate,
|
|
11
|
-
Content,
|
|
12
|
-
ContentDict,
|
|
13
|
-
ContentListUnion,
|
|
14
|
-
ContentListUnionDict,
|
|
15
|
-
FinishReason,
|
|
16
|
-
FunctionCall,
|
|
17
|
-
GenerateContentResponse,
|
|
18
|
-
GenerateContentResponseUsageMetadata,
|
|
19
|
-
PartDict,
|
|
20
|
-
Tool,
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
from ..base.call_kwargs import BaseCallKwargs
|
|
24
|
-
from ..base.metadata import Metadata
|
|
25
|
-
from ..base.stream import BaseStream
|
|
26
|
-
from ..base.types import CostMetadata
|
|
27
|
-
from .call_params import GoogleCallParams
|
|
28
|
-
from .call_response import GoogleCallResponse
|
|
29
|
-
from .call_response_chunk import GoogleCallResponseChunk
|
|
30
|
-
from .dynamic_config import GoogleDynamicConfig
|
|
31
|
-
from .tool import GoogleTool
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class GoogleStream(
|
|
35
|
-
BaseStream[
|
|
36
|
-
GoogleCallResponse,
|
|
37
|
-
GoogleCallResponseChunk,
|
|
38
|
-
ContentDict,
|
|
39
|
-
ContentDict,
|
|
40
|
-
ContentDict,
|
|
41
|
-
ContentListUnion | ContentListUnionDict,
|
|
42
|
-
GoogleTool,
|
|
43
|
-
Tool,
|
|
44
|
-
GoogleDynamicConfig,
|
|
45
|
-
GoogleCallParams,
|
|
46
|
-
FinishReason,
|
|
47
|
-
]
|
|
48
|
-
):
|
|
49
|
-
"""A class for convenience around streaming Google LLM calls.
|
|
50
|
-
|
|
51
|
-
Example:
|
|
52
|
-
|
|
53
|
-
```python
|
|
54
|
-
from mirascope.core import prompt_template
|
|
55
|
-
from mirascope.core.google import google_call
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
@google_call("google-1.5-flash", stream=True)
|
|
59
|
-
def recommend_book(genre: str) -> str:
|
|
60
|
-
return f"Recommend a {genre} book"
|
|
61
|
-
|
|
62
|
-
stream = recommend_book("fantasy") # returns `GoogleStream` instance
|
|
63
|
-
for chunk, _ in stream:
|
|
64
|
-
print(chunk.content, end="", flush=True)
|
|
65
|
-
```
|
|
66
|
-
"""
|
|
67
|
-
|
|
68
|
-
_provider = "google"
|
|
69
|
-
|
|
70
|
-
def __init__(
|
|
71
|
-
self,
|
|
72
|
-
*,
|
|
73
|
-
stream: Generator[tuple[GoogleCallResponseChunk, GoogleTool | None], None, None]
|
|
74
|
-
| AsyncGenerator[tuple[GoogleCallResponseChunk, GoogleTool | None], None],
|
|
75
|
-
metadata: Metadata,
|
|
76
|
-
tool_types: list[type[GoogleTool]] | None,
|
|
77
|
-
call_response_type: type[GoogleCallResponse],
|
|
78
|
-
model: str,
|
|
79
|
-
prompt_template: str | None,
|
|
80
|
-
fn_args: dict[str, Any],
|
|
81
|
-
dynamic_config: GoogleDynamicConfig,
|
|
82
|
-
messages: list[ContentListUnion | ContentListUnionDict],
|
|
83
|
-
call_params: GoogleCallParams,
|
|
84
|
-
call_kwargs: BaseCallKwargs[Tool],
|
|
85
|
-
) -> None:
|
|
86
|
-
"""Initialize GoogleStream with thinking content tracking."""
|
|
87
|
-
super().__init__(
|
|
88
|
-
stream=stream,
|
|
89
|
-
metadata=metadata,
|
|
90
|
-
tool_types=tool_types,
|
|
91
|
-
call_response_type=call_response_type,
|
|
92
|
-
model=model,
|
|
93
|
-
prompt_template=prompt_template,
|
|
94
|
-
fn_args=fn_args,
|
|
95
|
-
dynamic_config=dynamic_config,
|
|
96
|
-
messages=messages,
|
|
97
|
-
call_params=call_params,
|
|
98
|
-
call_kwargs=call_kwargs,
|
|
99
|
-
)
|
|
100
|
-
self.thinking = ""
|
|
101
|
-
|
|
102
|
-
def _update_properties(self, chunk: GoogleCallResponseChunk) -> None:
|
|
103
|
-
"""Updates the properties of the stream, including thinking content."""
|
|
104
|
-
super()._update_properties(chunk)
|
|
105
|
-
self.thinking += chunk.thinking
|
|
106
|
-
|
|
107
|
-
def _construct_message_param(
|
|
108
|
-
self, tool_calls: list[FunctionCall] | None = None, content: str | None = None
|
|
109
|
-
) -> ContentDict:
|
|
110
|
-
"""Constructs the message parameter for the assistant."""
|
|
111
|
-
return {
|
|
112
|
-
"role": "model",
|
|
113
|
-
"parts": cast(
|
|
114
|
-
list[PartDict],
|
|
115
|
-
[{"text": content}]
|
|
116
|
-
+ (
|
|
117
|
-
[
|
|
118
|
-
{"function_call": tool_call}
|
|
119
|
-
for tool_call in (tool_calls or [])
|
|
120
|
-
if tool_calls
|
|
121
|
-
]
|
|
122
|
-
or []
|
|
123
|
-
),
|
|
124
|
-
),
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
def construct_call_response(self) -> GoogleCallResponse:
|
|
128
|
-
"""Constructs the call response from a consumed GoogleStream.
|
|
129
|
-
|
|
130
|
-
Raises:
|
|
131
|
-
ValueError: if the stream has not yet been consumed.
|
|
132
|
-
"""
|
|
133
|
-
if not hasattr(self, "message_param"):
|
|
134
|
-
raise ValueError(
|
|
135
|
-
"No stream response, check if the stream has been consumed."
|
|
136
|
-
)
|
|
137
|
-
candidates_token_count = (
|
|
138
|
-
int(self.output_tokens) if self.output_tokens is not None else None
|
|
139
|
-
)
|
|
140
|
-
prompt_token_count = (
|
|
141
|
-
int(self.input_tokens) if self.input_tokens is not None else None
|
|
142
|
-
)
|
|
143
|
-
total_token_count = int(candidates_token_count or 0) + int(
|
|
144
|
-
prompt_token_count or 0
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
parts: list[PartDict] = []
|
|
148
|
-
|
|
149
|
-
# Add thinking part first if we have thinking content
|
|
150
|
-
if self.thinking:
|
|
151
|
-
parts.append({"text": self.thinking, "thought": True})
|
|
152
|
-
|
|
153
|
-
for pd in self.message_param.get("parts") or []:
|
|
154
|
-
if pd.get("text") == "":
|
|
155
|
-
# These parts are generated based only on chunk content;
|
|
156
|
-
# thinking parts have empty content and are reconstructed separately.
|
|
157
|
-
# Skip this so the thinking parts aren't duplicated.
|
|
158
|
-
continue
|
|
159
|
-
else:
|
|
160
|
-
parts.append(pd)
|
|
161
|
-
|
|
162
|
-
response = GenerateContentResponse(
|
|
163
|
-
candidates=[
|
|
164
|
-
Candidate(
|
|
165
|
-
finish_reason=self.finish_reasons[0]
|
|
166
|
-
if self.finish_reasons
|
|
167
|
-
else FinishReason.STOP,
|
|
168
|
-
content=Content(
|
|
169
|
-
role=self.message_param["role"], # pyright: ignore [reportTypedDictNotRequiredAccess]
|
|
170
|
-
parts=parts, # pyright: ignore [reportArgumentType]
|
|
171
|
-
),
|
|
172
|
-
)
|
|
173
|
-
],
|
|
174
|
-
model_version=self.model,
|
|
175
|
-
usage_metadata=GenerateContentResponseUsageMetadata(
|
|
176
|
-
candidates_token_count=candidates_token_count,
|
|
177
|
-
prompt_token_count=prompt_token_count,
|
|
178
|
-
total_token_count=total_token_count,
|
|
179
|
-
),
|
|
180
|
-
)
|
|
181
|
-
|
|
182
|
-
return GoogleCallResponse(
|
|
183
|
-
metadata=self.metadata,
|
|
184
|
-
response=response,
|
|
185
|
-
tool_types=self.tool_types,
|
|
186
|
-
prompt_template=self.prompt_template,
|
|
187
|
-
fn_args=self.fn_args if self.fn_args else {},
|
|
188
|
-
dynamic_config=self.dynamic_config,
|
|
189
|
-
messages=self.messages,
|
|
190
|
-
call_params=self.call_params,
|
|
191
|
-
call_kwargs=self.call_kwargs,
|
|
192
|
-
user_message_param=self.user_message_param,
|
|
193
|
-
start_time=self.start_time,
|
|
194
|
-
end_time=self.end_time,
|
|
195
|
-
)
|
|
196
|
-
|
|
197
|
-
@property
|
|
198
|
-
def cost_metadata(self) -> CostMetadata:
|
|
199
|
-
return super().cost_metadata
|