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,92 +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 openai.types.chat import (
|
|
8
|
-
ChatCompletionStreamOptionsParam,
|
|
9
|
-
ChatCompletionToolChoiceOptionParam,
|
|
10
|
-
)
|
|
11
|
-
from openai.types.chat.completion_create_params import ResponseFormat
|
|
12
|
-
from typing_extensions import NotRequired
|
|
13
|
-
|
|
14
|
-
from ..base import BaseCallParams
|
|
15
|
-
|
|
16
|
-
if TYPE_CHECKING:
|
|
17
|
-
from openai.types.chat.chat_completion_audio_param import ( # pyright: ignore [reportMissingImports]
|
|
18
|
-
ChatCompletionAudioParam,
|
|
19
|
-
ChatCompletionModality, # pyright: ignore [reportAttributeAccessIssue]
|
|
20
|
-
)
|
|
21
|
-
from openai.types.chat.chat_completion_reasoning_effort import ( # pyright: ignore [reportMissingImports]
|
|
22
|
-
ChatCompletionReasoningEffort, # pyright: ignore [reportAttributeAccessIssue]
|
|
23
|
-
)
|
|
24
|
-
else:
|
|
25
|
-
try:
|
|
26
|
-
from openai.types.chat.chat_completion_audio_param import ( # pyright: ignore [reportMissingImports]
|
|
27
|
-
ChatCompletionAudioParam,
|
|
28
|
-
ChatCompletionModality,
|
|
29
|
-
)
|
|
30
|
-
except ImportError:
|
|
31
|
-
|
|
32
|
-
class ChatCompletionAudioParam: ...
|
|
33
|
-
|
|
34
|
-
class ChatCompletionModality: ...
|
|
35
|
-
|
|
36
|
-
try:
|
|
37
|
-
from openai.types.chat.chat_completion_reasoning_effort import ( # pyright: ignore [reportMissingImports]
|
|
38
|
-
ChatCompletionReasoningEffort,
|
|
39
|
-
)
|
|
40
|
-
except ImportError:
|
|
41
|
-
|
|
42
|
-
class ChatCompletionReasoningEffort: ...
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
class OpenAICallParams(BaseCallParams):
|
|
46
|
-
"""The parameters to use when calling the OpenAI API.
|
|
47
|
-
|
|
48
|
-
[OpenAI API Reference](https://platform.openai.com/docs/api-reference/chat/create)
|
|
49
|
-
|
|
50
|
-
Attributes:
|
|
51
|
-
audio: ...
|
|
52
|
-
frequency_penalty: ...
|
|
53
|
-
logit_bias: ...
|
|
54
|
-
logprobs: ...
|
|
55
|
-
max_tokens: ...
|
|
56
|
-
modalities: ...
|
|
57
|
-
n: ...
|
|
58
|
-
parallel_tool_calls: ...
|
|
59
|
-
presence_penalty: ...
|
|
60
|
-
reasoning_effort: ...
|
|
61
|
-
response_format: ...
|
|
62
|
-
seed: ...
|
|
63
|
-
stop: ...
|
|
64
|
-
stream_options: ...
|
|
65
|
-
temperature: ...
|
|
66
|
-
tool_choice: ...
|
|
67
|
-
top_logprobs: ...
|
|
68
|
-
top_p: ...
|
|
69
|
-
user: ...
|
|
70
|
-
"""
|
|
71
|
-
|
|
72
|
-
audio: NotRequired[ChatCompletionAudioParam | None]
|
|
73
|
-
extra_headers: NotRequired[dict[str, str] | None]
|
|
74
|
-
frequency_penalty: NotRequired[float | None]
|
|
75
|
-
logit_bias: NotRequired[dict[str, int] | None]
|
|
76
|
-
logprobs: NotRequired[bool | None]
|
|
77
|
-
max_tokens: NotRequired[int | None]
|
|
78
|
-
metadata: NotRequired[dict[str, str] | None]
|
|
79
|
-
modalities: NotRequired[list[ChatCompletionModality] | None]
|
|
80
|
-
n: NotRequired[int | None]
|
|
81
|
-
parallel_tool_calls: NotRequired[bool]
|
|
82
|
-
presence_penalty: NotRequired[float | None]
|
|
83
|
-
reasoning_effort: NotRequired[ChatCompletionReasoningEffort | None]
|
|
84
|
-
response_format: NotRequired[ResponseFormat]
|
|
85
|
-
seed: NotRequired[int | None]
|
|
86
|
-
stop: NotRequired[str | list[str] | None]
|
|
87
|
-
stream_options: NotRequired[ChatCompletionStreamOptionsParam | None]
|
|
88
|
-
temperature: NotRequired[float | None]
|
|
89
|
-
tool_choice: NotRequired[ChatCompletionToolChoiceOptionParam]
|
|
90
|
-
top_logprobs: NotRequired[int | None]
|
|
91
|
-
top_p: NotRequired[float | None]
|
|
92
|
-
user: NotRequired[str]
|
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
"""This module contains the `OpenAICallResponse` class.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/calls.md#handling-responses
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
import base64
|
|
7
|
-
from collections.abc import Sequence
|
|
8
|
-
from functools import cached_property
|
|
9
|
-
from typing import cast
|
|
10
|
-
|
|
11
|
-
from openai.types.chat import (
|
|
12
|
-
ChatCompletion,
|
|
13
|
-
ChatCompletionAssistantMessageParam,
|
|
14
|
-
ChatCompletionMessageParam,
|
|
15
|
-
ChatCompletionToolMessageParam,
|
|
16
|
-
ChatCompletionToolParam,
|
|
17
|
-
ChatCompletionUserMessageParam,
|
|
18
|
-
)
|
|
19
|
-
from openai.types.completion_usage import CompletionUsage
|
|
20
|
-
from pydantic import SerializeAsAny, SkipValidation, computed_field
|
|
21
|
-
|
|
22
|
-
from .. import BaseMessageParam
|
|
23
|
-
from ..base import (
|
|
24
|
-
BaseCallResponse,
|
|
25
|
-
transform_tool_outputs,
|
|
26
|
-
)
|
|
27
|
-
from ..base._utils._get_image_dimensions import (
|
|
28
|
-
get_image_dimensions,
|
|
29
|
-
)
|
|
30
|
-
from ..base.types import (
|
|
31
|
-
CostMetadata,
|
|
32
|
-
FinishReason,
|
|
33
|
-
)
|
|
34
|
-
from ._utils._message_param_converter import OpenAIMessageParamConverter
|
|
35
|
-
from .call_params import OpenAICallParams
|
|
36
|
-
from .dynamic_config import OpenAIDynamicConfig
|
|
37
|
-
from .tool import OpenAITool
|
|
38
|
-
|
|
39
|
-
try:
|
|
40
|
-
from openai.types.chat import (
|
|
41
|
-
ChatCompletionAudio, # pyright: ignore [reportAssignmentType]
|
|
42
|
-
)
|
|
43
|
-
except ImportError: # pragma: no cover
|
|
44
|
-
|
|
45
|
-
class ChatCompletionAudio:
|
|
46
|
-
@property
|
|
47
|
-
def data(self) -> str: ...
|
|
48
|
-
|
|
49
|
-
@property
|
|
50
|
-
def transcript(self) -> str: ...
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class OpenAICallResponse(
|
|
54
|
-
BaseCallResponse[
|
|
55
|
-
ChatCompletion,
|
|
56
|
-
OpenAITool,
|
|
57
|
-
ChatCompletionToolParam,
|
|
58
|
-
OpenAIDynamicConfig,
|
|
59
|
-
ChatCompletionMessageParam,
|
|
60
|
-
OpenAICallParams,
|
|
61
|
-
ChatCompletionUserMessageParam,
|
|
62
|
-
OpenAIMessageParamConverter,
|
|
63
|
-
]
|
|
64
|
-
):
|
|
65
|
-
"""A convenience wrapper around the OpenAI `ChatCompletion` response.
|
|
66
|
-
|
|
67
|
-
When calling the OpenAI API using a function decorated with `openai_call`, the
|
|
68
|
-
response will be an `OpenAICallResponse` instance with properties that allow for
|
|
69
|
-
more convenience access to commonly used attributes.
|
|
70
|
-
|
|
71
|
-
Example:
|
|
72
|
-
|
|
73
|
-
```python
|
|
74
|
-
from mirascope.core import prompt_template
|
|
75
|
-
from mirascope.core.openai import openai_call
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
@openai_call("gpt-4o")
|
|
79
|
-
def recommend_book(genre: str) -> str:
|
|
80
|
-
return f"Recommend a {genre} book"
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
response = recommend_book("fantasy") # response is an `OpenAICallResponse` instance
|
|
84
|
-
print(response.content)
|
|
85
|
-
```
|
|
86
|
-
"""
|
|
87
|
-
|
|
88
|
-
response: SkipValidation[ChatCompletion]
|
|
89
|
-
_message_converter: type[OpenAIMessageParamConverter] = OpenAIMessageParamConverter
|
|
90
|
-
|
|
91
|
-
_provider = "openai"
|
|
92
|
-
|
|
93
|
-
@computed_field
|
|
94
|
-
@property
|
|
95
|
-
def content(self) -> str:
|
|
96
|
-
"""Returns the content of the chat completion for the 0th choice."""
|
|
97
|
-
message = self.response.choices[0].message
|
|
98
|
-
return message.content if message.content is not None else ""
|
|
99
|
-
|
|
100
|
-
@computed_field
|
|
101
|
-
@property
|
|
102
|
-
def finish_reasons(self) -> list[str]:
|
|
103
|
-
"""Returns the finish reasons of the response."""
|
|
104
|
-
return [str(choice.finish_reason) for choice in self.response.choices]
|
|
105
|
-
|
|
106
|
-
@computed_field
|
|
107
|
-
@property
|
|
108
|
-
def model(self) -> str:
|
|
109
|
-
"""Returns the name of the response model."""
|
|
110
|
-
return self.response.model
|
|
111
|
-
|
|
112
|
-
@computed_field
|
|
113
|
-
@property
|
|
114
|
-
def id(self) -> str:
|
|
115
|
-
"""Returns the id of the response."""
|
|
116
|
-
return self.response.id
|
|
117
|
-
|
|
118
|
-
@property
|
|
119
|
-
def usage(self) -> CompletionUsage | None:
|
|
120
|
-
"""Returns the usage of the chat completion."""
|
|
121
|
-
return self.response.usage
|
|
122
|
-
|
|
123
|
-
@computed_field
|
|
124
|
-
@property
|
|
125
|
-
def input_tokens(self) -> int | None:
|
|
126
|
-
"""Returns the number of input tokens."""
|
|
127
|
-
return self.usage.prompt_tokens if self.usage else None
|
|
128
|
-
|
|
129
|
-
@computed_field
|
|
130
|
-
@property
|
|
131
|
-
def cached_tokens(self) -> int | None:
|
|
132
|
-
"""Returns the number of cached tokens."""
|
|
133
|
-
return (
|
|
134
|
-
details.cached_tokens
|
|
135
|
-
if self.usage
|
|
136
|
-
and (details := getattr(self.usage, "prompt_tokens_details", None))
|
|
137
|
-
else None
|
|
138
|
-
)
|
|
139
|
-
|
|
140
|
-
@computed_field
|
|
141
|
-
@property
|
|
142
|
-
def output_tokens(self) -> int | None:
|
|
143
|
-
"""Returns the number of output tokens."""
|
|
144
|
-
return self.usage.completion_tokens if self.usage else None
|
|
145
|
-
|
|
146
|
-
@computed_field
|
|
147
|
-
@cached_property
|
|
148
|
-
def message_param(self) -> SerializeAsAny[ChatCompletionAssistantMessageParam]:
|
|
149
|
-
"""Returns the assistants's response as a message parameter."""
|
|
150
|
-
message_param = self.response.choices[0].message.model_dump(
|
|
151
|
-
exclude={"function_call", "audio"}
|
|
152
|
-
)
|
|
153
|
-
if audio := getattr(self.response.choices[0].message, "audio", None):
|
|
154
|
-
message_param["audio"] = {"id": audio.id}
|
|
155
|
-
return ChatCompletionAssistantMessageParam(**message_param)
|
|
156
|
-
|
|
157
|
-
@cached_property
|
|
158
|
-
def tools(self) -> list[OpenAITool] | None:
|
|
159
|
-
"""Returns any available tool calls as their `OpenAITool` definition.
|
|
160
|
-
|
|
161
|
-
Raises:
|
|
162
|
-
ValidationError: if a tool call doesn't match the tool's schema.
|
|
163
|
-
ValueError: if the model refused to response, in which case the error
|
|
164
|
-
message will be the refusal.
|
|
165
|
-
"""
|
|
166
|
-
if hasattr(self.response.choices[0].message, "refusal") and (
|
|
167
|
-
refusal := self.response.choices[0].message.refusal
|
|
168
|
-
):
|
|
169
|
-
raise ValueError(refusal)
|
|
170
|
-
|
|
171
|
-
tool_calls = self.response.choices[0].message.tool_calls
|
|
172
|
-
if not self.tool_types or not tool_calls:
|
|
173
|
-
return None
|
|
174
|
-
|
|
175
|
-
extracted_tools = []
|
|
176
|
-
for tool_call in tool_calls:
|
|
177
|
-
for tool_type in self.tool_types:
|
|
178
|
-
if tool_call.function.name == tool_type._name():
|
|
179
|
-
extracted_tools.append(tool_type.from_tool_call(tool_call))
|
|
180
|
-
break
|
|
181
|
-
|
|
182
|
-
return extracted_tools
|
|
183
|
-
|
|
184
|
-
@cached_property
|
|
185
|
-
def tool(self) -> OpenAITool | None:
|
|
186
|
-
"""Returns the 0th tool for the 0th choice message.
|
|
187
|
-
|
|
188
|
-
Raises:
|
|
189
|
-
ValidationError: if the tool call doesn't match the tool's schema.
|
|
190
|
-
ValueError: if the model refused to response, in which case the error
|
|
191
|
-
message will be the refusal.
|
|
192
|
-
"""
|
|
193
|
-
if tools := self.tools:
|
|
194
|
-
return tools[0]
|
|
195
|
-
return None
|
|
196
|
-
|
|
197
|
-
@classmethod
|
|
198
|
-
@transform_tool_outputs
|
|
199
|
-
def tool_message_params(
|
|
200
|
-
cls, tools_and_outputs: Sequence[tuple[OpenAITool, str]]
|
|
201
|
-
) -> list[ChatCompletionToolMessageParam]:
|
|
202
|
-
"""Returns the tool message parameters for tool call results.
|
|
203
|
-
|
|
204
|
-
Args:
|
|
205
|
-
tools_and_outputs: The sequence of tools and their outputs from which the tool
|
|
206
|
-
message parameters should be constructed.
|
|
207
|
-
|
|
208
|
-
Returns:
|
|
209
|
-
The list of constructed `ChatCompletionToolMessageParam` parameters.
|
|
210
|
-
"""
|
|
211
|
-
return [
|
|
212
|
-
ChatCompletionToolMessageParam( # pyright: ignore [reportCallIssue]
|
|
213
|
-
role="tool",
|
|
214
|
-
content=output,
|
|
215
|
-
tool_call_id=tool.tool_call.id, # pyright: ignore [reportOptionalMemberAccess]
|
|
216
|
-
name=tool._name(), # pyright: ignore [reportCallIssue]
|
|
217
|
-
)
|
|
218
|
-
for tool, output in tools_and_outputs
|
|
219
|
-
]
|
|
220
|
-
|
|
221
|
-
@computed_field
|
|
222
|
-
@property
|
|
223
|
-
def audio(self) -> bytes | None:
|
|
224
|
-
"""Returns the audio data of the response."""
|
|
225
|
-
if audio := getattr(self.response.choices[0].message, "audio", None):
|
|
226
|
-
return base64.b64decode(audio.data)
|
|
227
|
-
return None
|
|
228
|
-
|
|
229
|
-
@computed_field
|
|
230
|
-
@property
|
|
231
|
-
def audio_transcript(self) -> str | None:
|
|
232
|
-
"""Returns the transcript of the audio content."""
|
|
233
|
-
if audio := getattr(self.response.choices[0].message, "audio", None):
|
|
234
|
-
return audio.transcript
|
|
235
|
-
return None
|
|
236
|
-
|
|
237
|
-
@property
|
|
238
|
-
def common_finish_reasons(self) -> list[FinishReason] | None:
|
|
239
|
-
"""Provider-agnostic finish reasons."""
|
|
240
|
-
return cast(list[FinishReason], self.finish_reasons)
|
|
241
|
-
|
|
242
|
-
@property
|
|
243
|
-
def common_message_param(self) -> BaseMessageParam:
|
|
244
|
-
return OpenAIMessageParamConverter.from_provider([self.message_param])[0]
|
|
245
|
-
|
|
246
|
-
@property
|
|
247
|
-
def common_user_message_param(self) -> BaseMessageParam | None:
|
|
248
|
-
if not self.user_message_param:
|
|
249
|
-
return None
|
|
250
|
-
return OpenAIMessageParamConverter.from_provider([self.user_message_param])[0]
|
|
251
|
-
|
|
252
|
-
@property
|
|
253
|
-
def cost_metadata(self) -> CostMetadata:
|
|
254
|
-
cost_metadata = super().cost_metadata
|
|
255
|
-
for message in self.messages:
|
|
256
|
-
if message.get("role") != "user":
|
|
257
|
-
continue
|
|
258
|
-
for part in message.get("content") or []:
|
|
259
|
-
if not isinstance(part, dict):
|
|
260
|
-
continue
|
|
261
|
-
if not (part.get("type") == "image_url" and "image_url" in part):
|
|
262
|
-
continue
|
|
263
|
-
url = part["image_url"].get("url", "")
|
|
264
|
-
detail = part["image_url"].get("detail", "auto")
|
|
265
|
-
|
|
266
|
-
dimensions = get_image_dimensions(url)
|
|
267
|
-
if not dimensions:
|
|
268
|
-
continue
|
|
269
|
-
dimensions.detail = detail
|
|
270
|
-
if cost_metadata.images is None:
|
|
271
|
-
cost_metadata.images = []
|
|
272
|
-
cost_metadata.images.append(dimensions)
|
|
273
|
-
return cost_metadata
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
"""This module contains the `OpenAICallResponseChunk` class.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md#handling-streamed-responses
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
import base64
|
|
9
|
-
from typing import cast
|
|
10
|
-
|
|
11
|
-
from openai.types.chat import ChatCompletionChunk
|
|
12
|
-
from openai.types.chat.chat_completion_chunk import Choice
|
|
13
|
-
from openai.types.completion_usage import CompletionUsage
|
|
14
|
-
from pydantic import SkipValidation, computed_field
|
|
15
|
-
|
|
16
|
-
from ..base import BaseCallResponseChunk
|
|
17
|
-
from ..base.types import CostMetadata
|
|
18
|
-
|
|
19
|
-
FinishReason = Choice.__annotations__["finish_reason"]
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class OpenAICallResponseChunk(BaseCallResponseChunk[ChatCompletionChunk, FinishReason]):
|
|
23
|
-
"""A convenience wrapper around the OpenAI `ChatCompletionChunk` streamed chunks.
|
|
24
|
-
|
|
25
|
-
When calling the OpenAI API using a function decorated with `openai_call` and
|
|
26
|
-
`stream` set to `True`, the stream will contain `OpenAIResponseChunk` instances with
|
|
27
|
-
properties that allow for more convenient access to commonly used attributes.
|
|
28
|
-
|
|
29
|
-
Example:
|
|
30
|
-
|
|
31
|
-
```python
|
|
32
|
-
from mirascope.core import prompt_template
|
|
33
|
-
from mirascope.core.openai import openai_call
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@openai_call("gpt-4o-mini", stream=True)
|
|
37
|
-
def recommend_book(genre: str) -> str:
|
|
38
|
-
return f"Recommend a {genre} book"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
stream = recommend_book("fantasy") # response is an `OpenAIStream`
|
|
42
|
-
for chunk, _ in stream:
|
|
43
|
-
print(chunk.content, end="", flush=True)
|
|
44
|
-
```
|
|
45
|
-
"""
|
|
46
|
-
|
|
47
|
-
chunk: SkipValidation[ChatCompletionChunk]
|
|
48
|
-
|
|
49
|
-
@property
|
|
50
|
-
def content(self) -> str:
|
|
51
|
-
"""Returns the content for the 0th choice delta."""
|
|
52
|
-
delta = None
|
|
53
|
-
if self.chunk.choices:
|
|
54
|
-
delta = self.chunk.choices[0].delta
|
|
55
|
-
return delta.content if delta is not None and delta.content else ""
|
|
56
|
-
|
|
57
|
-
@property
|
|
58
|
-
def finish_reasons(self) -> list[FinishReason]:
|
|
59
|
-
"""Returns the finish reasons of the response."""
|
|
60
|
-
return [
|
|
61
|
-
choice.finish_reason
|
|
62
|
-
for choice in self.chunk.choices
|
|
63
|
-
if choice.finish_reason
|
|
64
|
-
]
|
|
65
|
-
|
|
66
|
-
@property
|
|
67
|
-
def model(self) -> str:
|
|
68
|
-
"""Returns the name of the response model."""
|
|
69
|
-
return self.chunk.model
|
|
70
|
-
|
|
71
|
-
@property
|
|
72
|
-
def id(self) -> str:
|
|
73
|
-
"""Returns the id of the response."""
|
|
74
|
-
return self.chunk.id
|
|
75
|
-
|
|
76
|
-
@property
|
|
77
|
-
def usage(self) -> CompletionUsage | None:
|
|
78
|
-
"""Returns the usage of the chat completion."""
|
|
79
|
-
if hasattr(self.chunk, "usage") and self.chunk.usage:
|
|
80
|
-
return self.chunk.usage
|
|
81
|
-
return None
|
|
82
|
-
|
|
83
|
-
@computed_field
|
|
84
|
-
@property
|
|
85
|
-
def cached_tokens(self) -> int | None:
|
|
86
|
-
"""Returns the number of cached tokens."""
|
|
87
|
-
return (
|
|
88
|
-
details.cached_tokens
|
|
89
|
-
if hasattr(self.chunk, "usage")
|
|
90
|
-
and self.usage
|
|
91
|
-
and (details := getattr(self.usage, "prompt_tokens_details", None))
|
|
92
|
-
else None
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
@property
|
|
96
|
-
def input_tokens(self) -> int | None:
|
|
97
|
-
"""Returns the number of input tokens."""
|
|
98
|
-
if self.usage:
|
|
99
|
-
return self.usage.prompt_tokens
|
|
100
|
-
return None
|
|
101
|
-
|
|
102
|
-
@property
|
|
103
|
-
def output_tokens(self) -> int | None:
|
|
104
|
-
"""Returns the number of output tokens."""
|
|
105
|
-
if self.usage:
|
|
106
|
-
return self.usage.completion_tokens
|
|
107
|
-
return None
|
|
108
|
-
|
|
109
|
-
@computed_field
|
|
110
|
-
@property
|
|
111
|
-
def audio(self) -> bytes | None:
|
|
112
|
-
"""Returns the audio data of the response."""
|
|
113
|
-
|
|
114
|
-
if self.chunk.choices and (
|
|
115
|
-
(audio := getattr(self.chunk.choices[0].delta, "audio", None))
|
|
116
|
-
and (audio_data := audio.get("data"))
|
|
117
|
-
):
|
|
118
|
-
return base64.b64decode(audio_data)
|
|
119
|
-
return None
|
|
120
|
-
|
|
121
|
-
@computed_field
|
|
122
|
-
@property
|
|
123
|
-
def audio_transcript(self) -> str | None:
|
|
124
|
-
"""Returns the transcript of the audio content."""
|
|
125
|
-
if self.chunk.choices and (
|
|
126
|
-
audio := getattr(self.chunk.choices[0].delta, "audio", None)
|
|
127
|
-
):
|
|
128
|
-
return audio.get("transcript")
|
|
129
|
-
return None
|
|
130
|
-
|
|
131
|
-
@property
|
|
132
|
-
def cost_metadata(self) -> CostMetadata:
|
|
133
|
-
"""Returns the cost metadata."""
|
|
134
|
-
return super().cost_metadata
|
|
135
|
-
|
|
136
|
-
@property
|
|
137
|
-
def common_finish_reasons(self) -> list[FinishReason] | None:
|
|
138
|
-
"""Provider-agnostic finish reasons."""
|
|
139
|
-
return cast(list[FinishReason], self.finish_reasons)
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"""This module defines the function return type for functions as LLM calls."""
|
|
2
|
-
|
|
3
|
-
from openai import AsyncAzureOpenAI, AsyncOpenAI, AzureOpenAI, OpenAI
|
|
4
|
-
from openai.types.chat import ChatCompletionMessageParam
|
|
5
|
-
|
|
6
|
-
from ..base import BaseDynamicConfig, BaseMessageParam
|
|
7
|
-
from .call_params import OpenAICallParams
|
|
8
|
-
|
|
9
|
-
AsyncOpenAIDynamicConfig = BaseDynamicConfig[
|
|
10
|
-
ChatCompletionMessageParam | BaseMessageParam,
|
|
11
|
-
OpenAICallParams,
|
|
12
|
-
AsyncOpenAI | AsyncAzureOpenAI,
|
|
13
|
-
]
|
|
14
|
-
|
|
15
|
-
OpenAIDynamicConfig = BaseDynamicConfig[
|
|
16
|
-
ChatCompletionMessageParam | BaseMessageParam,
|
|
17
|
-
OpenAICallParams,
|
|
18
|
-
OpenAI | AzureOpenAI,
|
|
19
|
-
]
|
|
20
|
-
"""The function return type for functions wrapped with the `openai_call` decorator.
|
|
21
|
-
|
|
22
|
-
Example:
|
|
23
|
-
|
|
24
|
-
```python
|
|
25
|
-
from mirascope.core import prompt_template
|
|
26
|
-
from mirascope.core.openai import OpenAIDynamicConfig, openai_call
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@openai_call("gpt-4o-mini")
|
|
30
|
-
@prompt_template("Recommend a {capitalized_genre} book")
|
|
31
|
-
def recommend_book(genre: str) -> OpenAIDynamicConfig:
|
|
32
|
-
return {"computed_fields": {"capitalized_genre": genre.capitalize()}}
|
|
33
|
-
```
|
|
34
|
-
"""
|
mirascope/core/openai/py.typed
DELETED
|
File without changes
|