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,149 +0,0 @@
|
|
|
1
|
-
"""This module contains the setup_call function, which is used to set up the"""
|
|
2
|
-
|
|
3
|
-
from collections.abc import Awaitable, Callable
|
|
4
|
-
from dataclasses import asdict, is_dataclass
|
|
5
|
-
from typing import Any, cast, overload
|
|
6
|
-
|
|
7
|
-
from google.generativeai import GenerativeModel
|
|
8
|
-
from google.generativeai.types import (
|
|
9
|
-
AsyncGenerateContentResponse,
|
|
10
|
-
ContentDict,
|
|
11
|
-
GenerateContentResponse,
|
|
12
|
-
GenerationConfigDict,
|
|
13
|
-
)
|
|
14
|
-
from google.generativeai.types.content_types import ToolConfigDict, to_content
|
|
15
|
-
from pydantic import BaseModel
|
|
16
|
-
|
|
17
|
-
from ...base import BaseMessageParam, BaseTool, _utils
|
|
18
|
-
from ...base._utils import (
|
|
19
|
-
AsyncCreateFn,
|
|
20
|
-
CreateFn,
|
|
21
|
-
fn_is_async,
|
|
22
|
-
get_async_create_fn,
|
|
23
|
-
get_create_fn,
|
|
24
|
-
)
|
|
25
|
-
from ...base.call_params import CommonCallParams
|
|
26
|
-
from ...base.stream_config import StreamConfig
|
|
27
|
-
from .._call_kwargs import GeminiCallKwargs
|
|
28
|
-
from ..call_params import GeminiCallParams
|
|
29
|
-
from ..dynamic_config import GeminiDynamicConfig
|
|
30
|
-
from ..tool import GeminiTool
|
|
31
|
-
from ._convert_common_call_params import convert_common_call_params
|
|
32
|
-
from ._convert_message_params import convert_message_params
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
@overload
|
|
36
|
-
def setup_call(
|
|
37
|
-
*,
|
|
38
|
-
model: str,
|
|
39
|
-
client: GenerativeModel | None,
|
|
40
|
-
fn: Callable[..., Awaitable[GeminiDynamicConfig]],
|
|
41
|
-
fn_args: dict[str, Any],
|
|
42
|
-
dynamic_config: GeminiDynamicConfig,
|
|
43
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
44
|
-
json_mode: bool,
|
|
45
|
-
call_params: GeminiCallParams | CommonCallParams,
|
|
46
|
-
response_model: type[BaseModel] | None,
|
|
47
|
-
stream: bool | StreamConfig,
|
|
48
|
-
) -> tuple[
|
|
49
|
-
AsyncCreateFn[AsyncGenerateContentResponse, AsyncGenerateContentResponse],
|
|
50
|
-
str | None,
|
|
51
|
-
list[ContentDict],
|
|
52
|
-
list[type[GeminiTool]] | None,
|
|
53
|
-
GeminiCallKwargs,
|
|
54
|
-
]: ...
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@overload
|
|
58
|
-
def setup_call(
|
|
59
|
-
*,
|
|
60
|
-
model: str,
|
|
61
|
-
client: GenerativeModel | None,
|
|
62
|
-
fn: Callable[..., GeminiDynamicConfig],
|
|
63
|
-
fn_args: dict[str, Any],
|
|
64
|
-
dynamic_config: GeminiDynamicConfig,
|
|
65
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
66
|
-
json_mode: bool,
|
|
67
|
-
call_params: GeminiCallParams | CommonCallParams,
|
|
68
|
-
response_model: type[BaseModel] | None,
|
|
69
|
-
stream: bool | StreamConfig,
|
|
70
|
-
) -> tuple[
|
|
71
|
-
CreateFn[GenerateContentResponse, GenerateContentResponse],
|
|
72
|
-
str | None,
|
|
73
|
-
list[ContentDict],
|
|
74
|
-
list[type[GeminiTool]] | None,
|
|
75
|
-
GeminiCallKwargs,
|
|
76
|
-
]: ...
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def setup_call(
|
|
80
|
-
*,
|
|
81
|
-
model: str,
|
|
82
|
-
client: GenerativeModel | None,
|
|
83
|
-
fn: Callable[..., GeminiDynamicConfig | Awaitable[GeminiDynamicConfig]],
|
|
84
|
-
fn_args: dict[str, Any],
|
|
85
|
-
dynamic_config: GeminiDynamicConfig,
|
|
86
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
87
|
-
json_mode: bool,
|
|
88
|
-
call_params: GeminiCallParams | CommonCallParams,
|
|
89
|
-
response_model: type[BaseModel] | None,
|
|
90
|
-
stream: bool | StreamConfig,
|
|
91
|
-
) -> tuple[
|
|
92
|
-
CreateFn[GenerateContentResponse, GenerateContentResponse]
|
|
93
|
-
| AsyncCreateFn[AsyncGenerateContentResponse, AsyncGenerateContentResponse],
|
|
94
|
-
str | None,
|
|
95
|
-
list[ContentDict],
|
|
96
|
-
list[type[GeminiTool]] | None,
|
|
97
|
-
GeminiCallKwargs,
|
|
98
|
-
]:
|
|
99
|
-
prompt_template, messages, tool_types, base_call_kwargs = _utils.setup_call(
|
|
100
|
-
fn,
|
|
101
|
-
fn_args,
|
|
102
|
-
dynamic_config,
|
|
103
|
-
tools,
|
|
104
|
-
GeminiTool,
|
|
105
|
-
call_params,
|
|
106
|
-
convert_common_call_params,
|
|
107
|
-
)
|
|
108
|
-
call_kwargs = cast(GeminiCallKwargs, base_call_kwargs)
|
|
109
|
-
messages = cast(list[BaseMessageParam | ContentDict], messages)
|
|
110
|
-
messages = convert_message_params(messages)
|
|
111
|
-
|
|
112
|
-
if json_mode:
|
|
113
|
-
generation_config = call_kwargs.get("generation_config", {})
|
|
114
|
-
if is_dataclass(generation_config):
|
|
115
|
-
generation_config = asdict(generation_config)
|
|
116
|
-
if not tools:
|
|
117
|
-
generation_config["response_mime_type"] = "application/json"
|
|
118
|
-
call_kwargs["generation_config"] = cast(GenerationConfigDict, generation_config)
|
|
119
|
-
messages[-1]["parts"].append(_utils.json_mode_content(response_model))
|
|
120
|
-
elif response_model:
|
|
121
|
-
assert tool_types, "At least one tool must be provided for extraction."
|
|
122
|
-
call_kwargs.pop("tool_config", None)
|
|
123
|
-
tool_config = ToolConfigDict()
|
|
124
|
-
tool_config.function_calling_config = {
|
|
125
|
-
"mode": "any",
|
|
126
|
-
"allowed_function_names": [tool_types[0]._name()],
|
|
127
|
-
}
|
|
128
|
-
call_kwargs["tool_config"] = tool_config
|
|
129
|
-
|
|
130
|
-
if client is None:
|
|
131
|
-
client = GenerativeModel(model_name=model)
|
|
132
|
-
|
|
133
|
-
if messages and messages[0]["role"] == "system":
|
|
134
|
-
system_instruction = client._system_instruction
|
|
135
|
-
system_instruction = (
|
|
136
|
-
list(system_instruction.parts) if system_instruction else []
|
|
137
|
-
)
|
|
138
|
-
system_instruction.extend(messages.pop(0)["parts"]) # pyright: ignore [reportArgumentType]
|
|
139
|
-
client._system_instruction = to_content(system_instruction) # pyright: ignore [reportArgumentType]
|
|
140
|
-
|
|
141
|
-
call_kwargs |= {"contents": messages}
|
|
142
|
-
|
|
143
|
-
create = (
|
|
144
|
-
get_async_create_fn(client.generate_content_async)
|
|
145
|
-
if fn_is_async(fn)
|
|
146
|
-
else get_create_fn(client.generate_content)
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
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 typing import TYPE_CHECKING
|
|
6
|
-
|
|
7
|
-
from google.generativeai.types.content_types import ToolConfigType
|
|
8
|
-
from google.generativeai.types.safety_types import SafetySettingOptions
|
|
9
|
-
from pydantic import ConfigDict, with_config
|
|
10
|
-
from typing_extensions import NotRequired
|
|
11
|
-
|
|
12
|
-
from ..base import BaseCallParams
|
|
13
|
-
|
|
14
|
-
if TYPE_CHECKING:
|
|
15
|
-
from google.generativeai.types import (
|
|
16
|
-
GenerationConfig,
|
|
17
|
-
GenerationConfigDict,
|
|
18
|
-
RequestOptions,
|
|
19
|
-
)
|
|
20
|
-
else:
|
|
21
|
-
from google.generativeai.types import (
|
|
22
|
-
GenerationConfig as _GenerationConfig,
|
|
23
|
-
)
|
|
24
|
-
from google.generativeai.types import GenerationConfigDict as _GenerationConfigDict
|
|
25
|
-
from google.generativeai.types import RequestOptions as _RequestOptions
|
|
26
|
-
|
|
27
|
-
@with_config(ConfigDict(arbitrary_types_allowed=True))
|
|
28
|
-
class GenerationConfigDict(_GenerationConfigDict): ...
|
|
29
|
-
|
|
30
|
-
class GenerationConfig(_GenerationConfig):
|
|
31
|
-
__pydantic_config__ = ConfigDict(arbitrary_types_allowed=True)
|
|
32
|
-
|
|
33
|
-
class RequestOptions(_RequestOptions):
|
|
34
|
-
__pydantic_config__ = ConfigDict(arbitrary_types_allowed=True)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class GeminiCallParams(BaseCallParams):
|
|
38
|
-
"""The parameters to use when calling the Gemini API.
|
|
39
|
-
|
|
40
|
-
[Gemini API Reference](https://ai.google.dev/gemini-api/docs/text-generation?lang=python)
|
|
41
|
-
|
|
42
|
-
Attributes:
|
|
43
|
-
generation_config: ...
|
|
44
|
-
safety_settings: ...
|
|
45
|
-
request_options: ...
|
|
46
|
-
tool_config: ...
|
|
47
|
-
"""
|
|
48
|
-
|
|
49
|
-
generation_config: NotRequired[GenerationConfigDict | GenerationConfig]
|
|
50
|
-
safety_settings: NotRequired[SafetySettingOptions]
|
|
51
|
-
request_options: NotRequired[RequestOptions]
|
|
52
|
-
tool_config: NotRequired[ToolConfigType]
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
"""This module contains the `GeminiCallResponse` 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.generativeai.protos import FunctionResponse
|
|
10
|
-
from google.generativeai.types import (
|
|
11
|
-
AsyncGenerateContentResponse,
|
|
12
|
-
ContentDict,
|
|
13
|
-
ContentsType, # type: ignore
|
|
14
|
-
GenerateContentResponse,
|
|
15
|
-
Tool,
|
|
16
|
-
)
|
|
17
|
-
from pydantic import computed_field
|
|
18
|
-
|
|
19
|
-
from .. import BaseMessageParam
|
|
20
|
-
from ..base import BaseCallResponse, transform_tool_outputs
|
|
21
|
-
from ..base.types import CostMetadata, FinishReason
|
|
22
|
-
from ._utils._convert_finish_reason_to_common_finish_reasons import (
|
|
23
|
-
_convert_finish_reasons_to_common_finish_reasons,
|
|
24
|
-
)
|
|
25
|
-
from ._utils._message_param_converter import GeminiMessageParamConverter
|
|
26
|
-
from .call_params import GeminiCallParams
|
|
27
|
-
from .dynamic_config import GeminiDynamicConfig
|
|
28
|
-
from .tool import GeminiTool
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class GeminiCallResponse(
|
|
32
|
-
BaseCallResponse[
|
|
33
|
-
GenerateContentResponse | AsyncGenerateContentResponse,
|
|
34
|
-
GeminiTool,
|
|
35
|
-
Tool,
|
|
36
|
-
GeminiDynamicConfig,
|
|
37
|
-
ContentsType,
|
|
38
|
-
GeminiCallParams,
|
|
39
|
-
ContentDict,
|
|
40
|
-
GeminiMessageParamConverter,
|
|
41
|
-
]
|
|
42
|
-
):
|
|
43
|
-
"""A convenience wrapper around the Gemini API response.
|
|
44
|
-
|
|
45
|
-
When calling the Gemini API using a function decorated with `gemini_call`, the
|
|
46
|
-
response will be a `GeminiCallResponse` instance with properties that allow for
|
|
47
|
-
more convenient access to commonly used attributes.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
Example:
|
|
51
|
-
|
|
52
|
-
```python
|
|
53
|
-
from mirascope.core import prompt_template
|
|
54
|
-
from mirascope.core.gemini import gemini_call
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@gemini_call("gemini-1.5-flash")
|
|
58
|
-
def recommend_book(genre: str) -> str:
|
|
59
|
-
return f"Recommend a {genre} book"
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
response = recommend_book("fantasy") # response is an `GeminiCallResponse` instance
|
|
63
|
-
print(response.content)
|
|
64
|
-
```
|
|
65
|
-
"""
|
|
66
|
-
|
|
67
|
-
_message_converter: type[GeminiMessageParamConverter] = GeminiMessageParamConverter
|
|
68
|
-
|
|
69
|
-
_provider = "gemini"
|
|
70
|
-
|
|
71
|
-
@computed_field
|
|
72
|
-
@property
|
|
73
|
-
def content(self) -> str:
|
|
74
|
-
"""Returns the contained string content for the 0th choice."""
|
|
75
|
-
return self.response.candidates[0].content.parts[0].text
|
|
76
|
-
|
|
77
|
-
@computed_field
|
|
78
|
-
@property
|
|
79
|
-
def finish_reasons(self) -> list[str]:
|
|
80
|
-
"""Returns the finish reasons of the response."""
|
|
81
|
-
finish_reasons = [
|
|
82
|
-
"FINISH_REASON_UNSPECIFIED",
|
|
83
|
-
"STOP",
|
|
84
|
-
"MAX_TOKENS",
|
|
85
|
-
"SAFETY",
|
|
86
|
-
"RECITATION",
|
|
87
|
-
"OTHER",
|
|
88
|
-
]
|
|
89
|
-
|
|
90
|
-
return [
|
|
91
|
-
finish_reasons[candidate.finish_reason]
|
|
92
|
-
for candidate in self.response.candidates
|
|
93
|
-
]
|
|
94
|
-
|
|
95
|
-
@computed_field
|
|
96
|
-
@property
|
|
97
|
-
def model(self) -> str:
|
|
98
|
-
"""Returns the model name.
|
|
99
|
-
|
|
100
|
-
google.generativeai does not return model, so we return the model provided by
|
|
101
|
-
the user.
|
|
102
|
-
"""
|
|
103
|
-
return self._model
|
|
104
|
-
|
|
105
|
-
@computed_field
|
|
106
|
-
@property
|
|
107
|
-
def id(self) -> str | None:
|
|
108
|
-
"""Returns the id of the response.
|
|
109
|
-
|
|
110
|
-
google.generativeai does not return an id
|
|
111
|
-
"""
|
|
112
|
-
return None
|
|
113
|
-
|
|
114
|
-
@property
|
|
115
|
-
def usage(self) -> None:
|
|
116
|
-
"""Returns the usage of the chat completion.
|
|
117
|
-
|
|
118
|
-
google.generativeai does not have Usage, so we return None
|
|
119
|
-
"""
|
|
120
|
-
return None
|
|
121
|
-
|
|
122
|
-
@computed_field
|
|
123
|
-
@property
|
|
124
|
-
def input_tokens(self) -> None:
|
|
125
|
-
"""Returns the number of input tokens."""
|
|
126
|
-
return None
|
|
127
|
-
|
|
128
|
-
@computed_field
|
|
129
|
-
@property
|
|
130
|
-
def cached_tokens(self) -> None:
|
|
131
|
-
"""Returns the number of cached tokens."""
|
|
132
|
-
return None
|
|
133
|
-
|
|
134
|
-
@computed_field
|
|
135
|
-
@property
|
|
136
|
-
def output_tokens(self) -> None:
|
|
137
|
-
"""Returns the number of output tokens."""
|
|
138
|
-
return None
|
|
139
|
-
|
|
140
|
-
@computed_field
|
|
141
|
-
@cached_property
|
|
142
|
-
def message_param(self) -> ContentDict:
|
|
143
|
-
"""Returns the models's response as a message parameter."""
|
|
144
|
-
return {"role": "model", "parts": self.response.parts} # pyright: ignore [reportReturnType]
|
|
145
|
-
|
|
146
|
-
@cached_property
|
|
147
|
-
def tools(self) -> list[GeminiTool] | None:
|
|
148
|
-
"""Returns the list of tools for the 0th candidate's 0th content part."""
|
|
149
|
-
if self.tool_types is None:
|
|
150
|
-
return None
|
|
151
|
-
|
|
152
|
-
extracted_tools = []
|
|
153
|
-
for part in self.response.candidates[0].content.parts:
|
|
154
|
-
tool_call = part.function_call
|
|
155
|
-
for tool_type in self.tool_types:
|
|
156
|
-
if tool_call.name == tool_type._name():
|
|
157
|
-
extracted_tools.append(tool_type.from_tool_call(tool_call))
|
|
158
|
-
break
|
|
159
|
-
|
|
160
|
-
return extracted_tools
|
|
161
|
-
|
|
162
|
-
@cached_property
|
|
163
|
-
def tool(self) -> GeminiTool | None:
|
|
164
|
-
"""Returns the 0th tool for the 0th candidate's 0th content part.
|
|
165
|
-
|
|
166
|
-
Raises:
|
|
167
|
-
ValidationError: if the tool call doesn't match the tool's schema.
|
|
168
|
-
"""
|
|
169
|
-
tools = self.tools
|
|
170
|
-
if tools:
|
|
171
|
-
return tools[0]
|
|
172
|
-
return None
|
|
173
|
-
|
|
174
|
-
@classmethod
|
|
175
|
-
@transform_tool_outputs
|
|
176
|
-
def tool_message_params(
|
|
177
|
-
cls, tools_and_outputs: Sequence[tuple[GeminiTool, str]]
|
|
178
|
-
) -> list[ContentDict]:
|
|
179
|
-
"""Returns the tool message parameters for tool call results.
|
|
180
|
-
|
|
181
|
-
Args:
|
|
182
|
-
tools_and_outputs: The sequence of tools and their outputs from which the tool
|
|
183
|
-
message parameters should be constructed.
|
|
184
|
-
|
|
185
|
-
Returns:
|
|
186
|
-
The list of constructed `FunctionResponse` parameters.
|
|
187
|
-
"""
|
|
188
|
-
return [
|
|
189
|
-
{
|
|
190
|
-
"role": "user",
|
|
191
|
-
"parts": [
|
|
192
|
-
FunctionResponse(name=tool._name(), response={"result": output})
|
|
193
|
-
for tool, output in tools_and_outputs
|
|
194
|
-
],
|
|
195
|
-
}
|
|
196
|
-
]
|
|
197
|
-
|
|
198
|
-
@property
|
|
199
|
-
def common_finish_reasons(self) -> list[FinishReason] | None:
|
|
200
|
-
return _convert_finish_reasons_to_common_finish_reasons(self.finish_reasons)
|
|
201
|
-
|
|
202
|
-
@property
|
|
203
|
-
def common_message_param(self) -> BaseMessageParam:
|
|
204
|
-
return GeminiMessageParamConverter.from_provider([self.message_param])[0]
|
|
205
|
-
|
|
206
|
-
@property
|
|
207
|
-
def common_user_message_param(self) -> BaseMessageParam | None:
|
|
208
|
-
if not self.user_message_param:
|
|
209
|
-
return None
|
|
210
|
-
return GeminiMessageParamConverter.from_provider([self.user_message_param])[0]
|
|
211
|
-
|
|
212
|
-
@computed_field
|
|
213
|
-
@property
|
|
214
|
-
def cost_metadata(self) -> CostMetadata:
|
|
215
|
-
"""Get metadata required for cost calculation."""
|
|
216
|
-
return super().cost_metadata
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
"""This module contains the `GeminiCallResponseChunk` class.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md#handling-streamed-responses
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from google.ai.generativelanguage import Candidate
|
|
7
|
-
from google.generativeai.types import GenerateContentResponse
|
|
8
|
-
|
|
9
|
-
from ..base import BaseCallResponseChunk
|
|
10
|
-
from ..base.types import CostMetadata, FinishReason
|
|
11
|
-
from ._utils._convert_finish_reason_to_common_finish_reasons import (
|
|
12
|
-
_convert_finish_reasons_to_common_finish_reasons,
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class GeminiCallResponseChunk(
|
|
17
|
-
BaseCallResponseChunk[GenerateContentResponse, Candidate.FinishReason]
|
|
18
|
-
):
|
|
19
|
-
"""A convenience wrapper around the Gemini API streamed response chunks.
|
|
20
|
-
|
|
21
|
-
When calling the Gemini API using a function decorated with `gemini_call` and
|
|
22
|
-
`stream` set to `True`, the stream will contain `GeminiCallResponseChunk` instances
|
|
23
|
-
|
|
24
|
-
Example:
|
|
25
|
-
|
|
26
|
-
```python
|
|
27
|
-
from mirascope.core import prompt_template
|
|
28
|
-
from mirascope.core.gemini import gemini_call
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@gemini_call("gemini-1.5-flash", stream=True)
|
|
32
|
-
def recommend_book(genre: str) -> str:
|
|
33
|
-
return f"Recommend a {genre} book"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
stream = recommend_book("fantasy") # response is an `GeminiStream`
|
|
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 chunk content for the 0th choice."""
|
|
45
|
-
return self.chunk.candidates[0].content.parts[0].text
|
|
46
|
-
|
|
47
|
-
@property
|
|
48
|
-
def finish_reasons(self) -> list[Candidate.FinishReason]:
|
|
49
|
-
"""Returns the finish reasons of the response."""
|
|
50
|
-
return [candidate.finish_reason for candidate in self.chunk.candidates]
|
|
51
|
-
|
|
52
|
-
@property
|
|
53
|
-
def model(self) -> None:
|
|
54
|
-
"""Returns the model name.
|
|
55
|
-
|
|
56
|
-
google.generativeai does not return model, so we return None
|
|
57
|
-
"""
|
|
58
|
-
return None
|
|
59
|
-
|
|
60
|
-
@property
|
|
61
|
-
def id(self) -> str | None:
|
|
62
|
-
"""Returns the id of the response.
|
|
63
|
-
|
|
64
|
-
google.generativeai does not return an id
|
|
65
|
-
"""
|
|
66
|
-
return None
|
|
67
|
-
|
|
68
|
-
@property
|
|
69
|
-
def usage(self) -> None:
|
|
70
|
-
"""Returns the usage of the chat completion.
|
|
71
|
-
|
|
72
|
-
google.generativeai does not have Usage, so we return None
|
|
73
|
-
"""
|
|
74
|
-
return None
|
|
75
|
-
|
|
76
|
-
@property
|
|
77
|
-
def input_tokens(self) -> None:
|
|
78
|
-
"""Returns the number of input tokens."""
|
|
79
|
-
return None
|
|
80
|
-
|
|
81
|
-
@property
|
|
82
|
-
def cached_tokens(self) -> None:
|
|
83
|
-
"""Returns the number of cached tokens."""
|
|
84
|
-
return None
|
|
85
|
-
|
|
86
|
-
@property
|
|
87
|
-
def output_tokens(self) -> None:
|
|
88
|
-
"""Returns the number of output tokens."""
|
|
89
|
-
return None
|
|
90
|
-
|
|
91
|
-
@property
|
|
92
|
-
def cost_metadata(self) -> CostMetadata:
|
|
93
|
-
"""Returns the cost metadata."""
|
|
94
|
-
return super().cost_metadata
|
|
95
|
-
|
|
96
|
-
@property
|
|
97
|
-
def common_finish_reasons(self) -> list[FinishReason] | None:
|
|
98
|
-
return _convert_finish_reasons_to_common_finish_reasons(
|
|
99
|
-
[finish_reason.name for finish_reason in self.finish_reasons]
|
|
100
|
-
)
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"""This module defines the function return type for functions as LLM calls."""
|
|
2
|
-
|
|
3
|
-
from google.generativeai import GenerativeModel
|
|
4
|
-
from google.generativeai.types import ContentsType
|
|
5
|
-
|
|
6
|
-
from ..base import BaseDynamicConfig, BaseMessageParam
|
|
7
|
-
from .call_params import GeminiCallParams
|
|
8
|
-
|
|
9
|
-
GeminiDynamicConfig = BaseDynamicConfig[
|
|
10
|
-
ContentsType | BaseMessageParam, GeminiCallParams, GenerativeModel
|
|
11
|
-
]
|
|
12
|
-
"""The function return type for functions wrapped with the `gemini_call` decorator.
|
|
13
|
-
|
|
14
|
-
Example:
|
|
15
|
-
|
|
16
|
-
```python
|
|
17
|
-
from mirascope.core import prompt_template
|
|
18
|
-
from mirascope.core.gemini import GeminiDynamicConfig, gemini_call
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@gemini_call("gemini-1.5-flash")
|
|
22
|
-
@prompt_template("Recommend a {capitalized_genre} book")
|
|
23
|
-
def recommend_book(genre: str) -> GeminiDynamicConfig:
|
|
24
|
-
return {"computed_fields": {"capitalized_genre": genre.capitalize()}}
|
|
25
|
-
```
|
|
26
|
-
"""
|
mirascope/core/gemini/stream.py
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
"""The `GeminiStream` class for convenience around streaming LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from typing import cast
|
|
7
|
-
|
|
8
|
-
from google.ai.generativelanguage import (
|
|
9
|
-
Candidate,
|
|
10
|
-
Content,
|
|
11
|
-
FunctionCall,
|
|
12
|
-
GenerateContentResponse,
|
|
13
|
-
)
|
|
14
|
-
from google.generativeai.types import (
|
|
15
|
-
ContentDict,
|
|
16
|
-
ContentsType,
|
|
17
|
-
Tool,
|
|
18
|
-
)
|
|
19
|
-
from google.generativeai.types import (
|
|
20
|
-
GenerateContentResponse as GenerateContentResponseType,
|
|
21
|
-
)
|
|
22
|
-
from google.generativeai.types.content_types import PartType
|
|
23
|
-
|
|
24
|
-
from ..base.stream import BaseStream
|
|
25
|
-
from ..base.types import CostMetadata
|
|
26
|
-
from .call_params import GeminiCallParams
|
|
27
|
-
from .call_response import GeminiCallResponse
|
|
28
|
-
from .call_response_chunk import GeminiCallResponseChunk
|
|
29
|
-
from .dynamic_config import GeminiDynamicConfig
|
|
30
|
-
from .tool import GeminiTool
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class GeminiStream(
|
|
34
|
-
BaseStream[
|
|
35
|
-
GeminiCallResponse,
|
|
36
|
-
GeminiCallResponseChunk,
|
|
37
|
-
ContentDict,
|
|
38
|
-
ContentDict,
|
|
39
|
-
ContentDict,
|
|
40
|
-
ContentsType,
|
|
41
|
-
GeminiTool,
|
|
42
|
-
Tool,
|
|
43
|
-
GeminiDynamicConfig,
|
|
44
|
-
GeminiCallParams,
|
|
45
|
-
Candidate.FinishReason,
|
|
46
|
-
]
|
|
47
|
-
):
|
|
48
|
-
"""A class for convenience around streaming Gemini LLM calls.
|
|
49
|
-
|
|
50
|
-
Example:
|
|
51
|
-
|
|
52
|
-
```python
|
|
53
|
-
from mirascope.core import prompt_template
|
|
54
|
-
from mirascope.core.gemini import gemini_call
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@gemini_call("gemini-1.5-flash", stream=True)
|
|
58
|
-
def recommend_book(genre: str) -> str:
|
|
59
|
-
return f"Recommend a {genre} book"
|
|
60
|
-
|
|
61
|
-
stream = recommend_book("fantasy") # returns `GeminiStream` instance
|
|
62
|
-
for chunk, _ in stream:
|
|
63
|
-
print(chunk.content, end="", flush=True)
|
|
64
|
-
```
|
|
65
|
-
"""
|
|
66
|
-
|
|
67
|
-
_provider = "gemini"
|
|
68
|
-
|
|
69
|
-
def _construct_message_param(
|
|
70
|
-
self, tool_calls: list[FunctionCall] | None = None, content: str | None = None
|
|
71
|
-
) -> ContentDict:
|
|
72
|
-
"""Constructs the message parameter for the assistant."""
|
|
73
|
-
return {
|
|
74
|
-
"role": "model",
|
|
75
|
-
"parts": cast(list[PartType], [{"text": content}] + (tool_calls or [])),
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
def construct_call_response(self) -> GeminiCallResponse:
|
|
79
|
-
"""Constructs the call response from a consumed GeminiStream.
|
|
80
|
-
|
|
81
|
-
Raises:
|
|
82
|
-
ValueError: if the stream has not yet been consumed.
|
|
83
|
-
"""
|
|
84
|
-
if not hasattr(self, "message_param"):
|
|
85
|
-
raise ValueError(
|
|
86
|
-
"No stream response, check if the stream has been consumed."
|
|
87
|
-
)
|
|
88
|
-
response = GenerateContentResponseType.from_response(
|
|
89
|
-
GenerateContentResponse(
|
|
90
|
-
candidates=[
|
|
91
|
-
Candidate(
|
|
92
|
-
finish_reason=self.finish_reasons[0]
|
|
93
|
-
if self.finish_reasons
|
|
94
|
-
else Candidate.FinishReason.STOP,
|
|
95
|
-
content=Content(
|
|
96
|
-
role=self.message_param["role"],
|
|
97
|
-
parts=self.message_param["parts"],
|
|
98
|
-
),
|
|
99
|
-
)
|
|
100
|
-
]
|
|
101
|
-
)
|
|
102
|
-
)
|
|
103
|
-
return GeminiCallResponse(
|
|
104
|
-
metadata=self.metadata,
|
|
105
|
-
response=response,
|
|
106
|
-
tool_types=self.tool_types,
|
|
107
|
-
prompt_template=self.prompt_template,
|
|
108
|
-
fn_args=self.fn_args if self.fn_args else {},
|
|
109
|
-
dynamic_config=self.dynamic_config,
|
|
110
|
-
messages=self.messages,
|
|
111
|
-
call_params=self.call_params,
|
|
112
|
-
call_kwargs=self.call_kwargs,
|
|
113
|
-
user_message_param=self.user_message_param,
|
|
114
|
-
start_time=self.start_time,
|
|
115
|
-
end_time=self.end_time,
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
@property
|
|
119
|
-
def cost_metadata(self) -> CostMetadata:
|
|
120
|
-
return super().cost_metadata
|