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,26 +0,0 @@
|
|
|
1
|
-
from typing import cast
|
|
2
|
-
|
|
3
|
-
from ...base.call_params import CommonCallParams
|
|
4
|
-
from ..call_params import OpenAICallParams
|
|
5
|
-
|
|
6
|
-
OPENAI_PARAM_MAPPING = {
|
|
7
|
-
"temperature": "temperature",
|
|
8
|
-
"max_tokens": "max_tokens",
|
|
9
|
-
"top_p": "top_p",
|
|
10
|
-
"frequency_penalty": "frequency_penalty",
|
|
11
|
-
"presence_penalty": "presence_penalty",
|
|
12
|
-
"seed": "seed",
|
|
13
|
-
"stop": "stop",
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def convert_common_call_params(common_params: CommonCallParams) -> OpenAICallParams:
|
|
18
|
-
"""Convert CommonCallParams to OpenAI parameters."""
|
|
19
|
-
return cast(
|
|
20
|
-
OpenAICallParams,
|
|
21
|
-
{
|
|
22
|
-
OPENAI_PARAM_MAPPING[key]: value
|
|
23
|
-
for key, value in common_params.items()
|
|
24
|
-
if key in OPENAI_PARAM_MAPPING and value is not None
|
|
25
|
-
},
|
|
26
|
-
)
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
"""Utility for converting `BaseMessageParam` to `ChatCompletionMessageParam`."""
|
|
2
|
-
|
|
3
|
-
import base64
|
|
4
|
-
import json
|
|
5
|
-
|
|
6
|
-
from openai.types.chat import ChatCompletionMessageParam
|
|
7
|
-
|
|
8
|
-
from ...base import BaseMessageParam
|
|
9
|
-
from ...base._utils import get_audio_type
|
|
10
|
-
from ...base._utils._parse_content_template import _load_media
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def convert_message_params(
|
|
14
|
-
message_params: list[BaseMessageParam | ChatCompletionMessageParam],
|
|
15
|
-
) -> list[ChatCompletionMessageParam]:
|
|
16
|
-
converted_message_params = []
|
|
17
|
-
for message_param in message_params:
|
|
18
|
-
if not isinstance(message_param, BaseMessageParam):
|
|
19
|
-
converted_message_params.append(message_param)
|
|
20
|
-
elif isinstance((content := message_param.content), str):
|
|
21
|
-
converted_message_params.append(message_param.model_dump())
|
|
22
|
-
else:
|
|
23
|
-
converted_content = []
|
|
24
|
-
|
|
25
|
-
tool_calls = []
|
|
26
|
-
for part in content:
|
|
27
|
-
if part.type == "text":
|
|
28
|
-
converted_content.append(part.model_dump())
|
|
29
|
-
elif part.type == "image":
|
|
30
|
-
if part.media_type not in [
|
|
31
|
-
"image/jpeg",
|
|
32
|
-
"image/png",
|
|
33
|
-
"image/gif",
|
|
34
|
-
"image/webp",
|
|
35
|
-
]:
|
|
36
|
-
raise ValueError(
|
|
37
|
-
f"Unsupported image media type: {part.media_type}. OpenAI"
|
|
38
|
-
" currently only supports JPEG, PNG, GIF, and WebP images."
|
|
39
|
-
)
|
|
40
|
-
data = base64.b64encode(part.image).decode("utf-8")
|
|
41
|
-
converted_content.append(
|
|
42
|
-
{
|
|
43
|
-
"type": "image_url",
|
|
44
|
-
"image_url": {
|
|
45
|
-
"url": f"data:{part.media_type};base64,{data}",
|
|
46
|
-
"detail": part.detail if part.detail else "auto",
|
|
47
|
-
},
|
|
48
|
-
}
|
|
49
|
-
)
|
|
50
|
-
elif part.type == "image_url":
|
|
51
|
-
converted_content.append(
|
|
52
|
-
{
|
|
53
|
-
"type": "image_url",
|
|
54
|
-
"image_url": {
|
|
55
|
-
"url": part.url,
|
|
56
|
-
"detail": part.detail if part.detail else "auto",
|
|
57
|
-
},
|
|
58
|
-
}
|
|
59
|
-
)
|
|
60
|
-
elif part.type == "audio":
|
|
61
|
-
if part.media_type not in [
|
|
62
|
-
"audio/wav",
|
|
63
|
-
"audio/mp3",
|
|
64
|
-
]:
|
|
65
|
-
raise ValueError(
|
|
66
|
-
f"Unsupported audio media type: {part.media_type}. "
|
|
67
|
-
"OpenAI currently only supports WAV and MP3 audio file types."
|
|
68
|
-
)
|
|
69
|
-
data = (
|
|
70
|
-
part.audio
|
|
71
|
-
if isinstance(part.audio, str)
|
|
72
|
-
else base64.b64encode(part.audio).decode("utf-8")
|
|
73
|
-
)
|
|
74
|
-
converted_content.append(
|
|
75
|
-
{
|
|
76
|
-
"input_audio": {
|
|
77
|
-
"format": part.media_type.split("/")[-1],
|
|
78
|
-
"data": data,
|
|
79
|
-
},
|
|
80
|
-
"type": "input_audio",
|
|
81
|
-
}
|
|
82
|
-
)
|
|
83
|
-
elif part.type == "audio_url":
|
|
84
|
-
audio = _load_media(part.url)
|
|
85
|
-
audio_type = get_audio_type(audio)
|
|
86
|
-
if audio_type not in [
|
|
87
|
-
"wav",
|
|
88
|
-
"mp3",
|
|
89
|
-
]:
|
|
90
|
-
raise ValueError(
|
|
91
|
-
f"Unsupported audio media type: audio/{audio_type}. "
|
|
92
|
-
"OpenAI currently only supports WAV and MP3 audio file types."
|
|
93
|
-
)
|
|
94
|
-
converted_content.append(
|
|
95
|
-
{
|
|
96
|
-
"input_audio": {
|
|
97
|
-
"format": audio_type,
|
|
98
|
-
"data": base64.b64encode(audio).decode("utf-8"),
|
|
99
|
-
},
|
|
100
|
-
"type": "input_audio",
|
|
101
|
-
}
|
|
102
|
-
)
|
|
103
|
-
elif part.type == "tool_call":
|
|
104
|
-
tool_calls.append(
|
|
105
|
-
{
|
|
106
|
-
"function": {
|
|
107
|
-
"name": part.name,
|
|
108
|
-
"arguments": json.dumps(part.args),
|
|
109
|
-
},
|
|
110
|
-
"type": "function",
|
|
111
|
-
"id": part.id,
|
|
112
|
-
}
|
|
113
|
-
)
|
|
114
|
-
elif part.type == "tool_result":
|
|
115
|
-
if converted_content:
|
|
116
|
-
converted_message_params.append(
|
|
117
|
-
{"role": message_param.role, "content": converted_content}
|
|
118
|
-
)
|
|
119
|
-
converted_content = []
|
|
120
|
-
|
|
121
|
-
converted_message_params.append(
|
|
122
|
-
{
|
|
123
|
-
"role": "tool",
|
|
124
|
-
"tool_call_id": part.id,
|
|
125
|
-
"content": part.content,
|
|
126
|
-
}
|
|
127
|
-
)
|
|
128
|
-
else:
|
|
129
|
-
raise ValueError(
|
|
130
|
-
"OpenAI currently only supports text, image and audio parts. "
|
|
131
|
-
f"Part provided: {part.type}"
|
|
132
|
-
)
|
|
133
|
-
if tool_calls:
|
|
134
|
-
converted_message_param = {
|
|
135
|
-
"role": "assistant",
|
|
136
|
-
"tool_calls": tool_calls,
|
|
137
|
-
}
|
|
138
|
-
converted_message_params.append(converted_message_param)
|
|
139
|
-
if converted_content:
|
|
140
|
-
converted_message_param["content"] = converted_content
|
|
141
|
-
elif converted_content:
|
|
142
|
-
converted_message_params.append(
|
|
143
|
-
{
|
|
144
|
-
"role": message_param.role,
|
|
145
|
-
"content": converted_content,
|
|
146
|
-
}
|
|
147
|
-
)
|
|
148
|
-
return converted_message_params
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"""Get the JSON output from a completion response."""
|
|
2
|
-
|
|
3
|
-
from ..call_response import OpenAICallResponse
|
|
4
|
-
from ..call_response_chunk import OpenAICallResponseChunk
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def get_json_output(
|
|
8
|
-
response: OpenAICallResponse | OpenAICallResponseChunk, json_mode: bool
|
|
9
|
-
) -> str:
|
|
10
|
-
"""Get the JSON output from a completion response."""
|
|
11
|
-
if isinstance(response, OpenAICallResponse):
|
|
12
|
-
if hasattr(response.response.choices[0].message, "refusal") and (
|
|
13
|
-
refusal := response.response.choices[0].message.refusal
|
|
14
|
-
):
|
|
15
|
-
raise ValueError(refusal)
|
|
16
|
-
elif json_mode and response.content:
|
|
17
|
-
return response.content
|
|
18
|
-
elif tool_calls := response.response.choices[0].message.tool_calls:
|
|
19
|
-
return tool_calls[0].function.arguments
|
|
20
|
-
raise ValueError("No tool call or JSON object found in response.")
|
|
21
|
-
else:
|
|
22
|
-
if json_mode:
|
|
23
|
-
return response.content
|
|
24
|
-
elif (
|
|
25
|
-
(choices := response.chunk.choices)
|
|
26
|
-
and (tool_calls := choices[0].delta.tool_calls)
|
|
27
|
-
and (function := tool_calls[0].function)
|
|
28
|
-
and (arguments := function.arguments) is not None
|
|
29
|
-
):
|
|
30
|
-
return arguments
|
|
31
|
-
return ""
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
"""Handles the stream of completion chunks."""
|
|
2
|
-
|
|
3
|
-
from collections.abc import AsyncGenerator, Generator
|
|
4
|
-
from typing import cast
|
|
5
|
-
|
|
6
|
-
from openai.types.chat import ChatCompletionChunk, ChatCompletionMessageToolCall
|
|
7
|
-
from openai.types.chat.chat_completion_message_tool_call import Function
|
|
8
|
-
|
|
9
|
-
from ..call_response_chunk import OpenAICallResponseChunk
|
|
10
|
-
from ..tool import OpenAITool
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def _handle_chunk(
|
|
14
|
-
chunk: ChatCompletionChunk,
|
|
15
|
-
current_tool_call: ChatCompletionMessageToolCall,
|
|
16
|
-
current_tool_type: type[OpenAITool] | None,
|
|
17
|
-
tool_types: list[type[OpenAITool]] | None,
|
|
18
|
-
partial_tools: bool = False,
|
|
19
|
-
) -> tuple[
|
|
20
|
-
OpenAITool | None,
|
|
21
|
-
ChatCompletionMessageToolCall,
|
|
22
|
-
type[OpenAITool] | None,
|
|
23
|
-
]:
|
|
24
|
-
"""Handles a chunk of the stream."""
|
|
25
|
-
if (
|
|
26
|
-
not tool_types
|
|
27
|
-
or not chunk.choices
|
|
28
|
-
or not (tool_calls := chunk.choices[0].delta.tool_calls)
|
|
29
|
-
):
|
|
30
|
-
return None, current_tool_call, current_tool_type
|
|
31
|
-
|
|
32
|
-
tool_call = tool_calls[0]
|
|
33
|
-
# Reset on new tool
|
|
34
|
-
if tool_call.id and tool_call.function is not None:
|
|
35
|
-
previous_tool_call = current_tool_call.model_copy()
|
|
36
|
-
previous_tool_type = current_tool_type
|
|
37
|
-
current_tool_call = ChatCompletionMessageToolCall(
|
|
38
|
-
id=tool_call.id,
|
|
39
|
-
function=Function(
|
|
40
|
-
arguments="",
|
|
41
|
-
name=tool_call.function.name if tool_call.function.name else "",
|
|
42
|
-
),
|
|
43
|
-
type="function",
|
|
44
|
-
)
|
|
45
|
-
current_tool_type = None
|
|
46
|
-
for tool_type in tool_types:
|
|
47
|
-
if tool_type._name() == tool_call.function.name:
|
|
48
|
-
current_tool_type = tool_type
|
|
49
|
-
break
|
|
50
|
-
if current_tool_type is None:
|
|
51
|
-
raise RuntimeError(
|
|
52
|
-
f"Unknown tool type in stream: {tool_call.function.name}"
|
|
53
|
-
) # pragma: no cover
|
|
54
|
-
if (
|
|
55
|
-
previous_tool_call.id
|
|
56
|
-
and previous_tool_call.function.arguments
|
|
57
|
-
and previous_tool_type is not None
|
|
58
|
-
):
|
|
59
|
-
return (
|
|
60
|
-
previous_tool_type.from_tool_call(previous_tool_call),
|
|
61
|
-
current_tool_call,
|
|
62
|
-
current_tool_type,
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
# Update arguments with each chunk
|
|
66
|
-
if tool_call.function and tool_call.function.arguments:
|
|
67
|
-
current_tool_call.function.arguments += tool_call.function.arguments
|
|
68
|
-
|
|
69
|
-
# Return partial tool state if enabled
|
|
70
|
-
if partial_tools and current_tool_type:
|
|
71
|
-
partial_tool = current_tool_type.from_tool_call(current_tool_call, True)
|
|
72
|
-
# Set delta to current chunk arguments
|
|
73
|
-
partial_tool.delta = cast(str, tool_call.function.arguments)
|
|
74
|
-
return partial_tool, current_tool_call, current_tool_type
|
|
75
|
-
|
|
76
|
-
return None, current_tool_call, current_tool_type
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def handle_stream(
|
|
80
|
-
stream: Generator[ChatCompletionChunk, None, None],
|
|
81
|
-
tool_types: list[type[OpenAITool]] | None,
|
|
82
|
-
partial_tools: bool = False,
|
|
83
|
-
) -> Generator[tuple[OpenAICallResponseChunk, OpenAITool | None], None, None]:
|
|
84
|
-
"""Iterator over the stream and constructs tools as they are streamed."""
|
|
85
|
-
current_tool_call = ChatCompletionMessageToolCall(
|
|
86
|
-
id="", function=Function(arguments="", name=""), type="function"
|
|
87
|
-
)
|
|
88
|
-
current_tool_type = None
|
|
89
|
-
for chunk in stream:
|
|
90
|
-
if not tool_types or not chunk.choices or not chunk.choices[0].delta.tool_calls:
|
|
91
|
-
if current_tool_type:
|
|
92
|
-
yield (
|
|
93
|
-
OpenAICallResponseChunk(chunk=chunk),
|
|
94
|
-
current_tool_type.from_tool_call(current_tool_call),
|
|
95
|
-
)
|
|
96
|
-
current_tool_type = None
|
|
97
|
-
else:
|
|
98
|
-
yield OpenAICallResponseChunk(chunk=chunk), None
|
|
99
|
-
tool, current_tool_call, current_tool_type = _handle_chunk(
|
|
100
|
-
chunk,
|
|
101
|
-
current_tool_call,
|
|
102
|
-
current_tool_type,
|
|
103
|
-
tool_types,
|
|
104
|
-
partial_tools,
|
|
105
|
-
)
|
|
106
|
-
if tool is not None:
|
|
107
|
-
yield OpenAICallResponseChunk(chunk=chunk), tool
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
async def handle_stream_async(
|
|
111
|
-
stream: AsyncGenerator[ChatCompletionChunk, None],
|
|
112
|
-
tool_types: list[type[OpenAITool]] | None,
|
|
113
|
-
partial_tools: bool = False,
|
|
114
|
-
) -> AsyncGenerator[tuple[OpenAICallResponseChunk, OpenAITool | None], None]:
|
|
115
|
-
"""Async iterator over the stream and constructs tools as they are streamed."""
|
|
116
|
-
current_tool_call = ChatCompletionMessageToolCall(
|
|
117
|
-
id="", function=Function(arguments="", name=""), type="function"
|
|
118
|
-
)
|
|
119
|
-
current_tool_type = None
|
|
120
|
-
async for chunk in stream:
|
|
121
|
-
if not tool_types or not chunk.choices or not chunk.choices[0].delta.tool_calls:
|
|
122
|
-
if current_tool_type:
|
|
123
|
-
yield (
|
|
124
|
-
OpenAICallResponseChunk(chunk=chunk),
|
|
125
|
-
current_tool_type.from_tool_call(current_tool_call),
|
|
126
|
-
)
|
|
127
|
-
current_tool_type = None
|
|
128
|
-
else:
|
|
129
|
-
yield OpenAICallResponseChunk(chunk=chunk), None
|
|
130
|
-
tool, current_tool_call, current_tool_type = _handle_chunk(
|
|
131
|
-
chunk,
|
|
132
|
-
current_tool_call,
|
|
133
|
-
current_tool_type,
|
|
134
|
-
tool_types,
|
|
135
|
-
partial_tools,
|
|
136
|
-
)
|
|
137
|
-
if tool is not None:
|
|
138
|
-
yield OpenAICallResponseChunk(chunk=chunk), tool
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
"""This module contains the OpenAIMessageParamConverter class."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
from collections.abc import Iterable
|
|
5
|
-
from typing import cast
|
|
6
|
-
|
|
7
|
-
from openai.types.chat import ChatCompletionMessageParam
|
|
8
|
-
|
|
9
|
-
from mirascope.core import BaseMessageParam
|
|
10
|
-
from mirascope.core.base import (
|
|
11
|
-
AudioPart,
|
|
12
|
-
ImageURLPart,
|
|
13
|
-
TextPart,
|
|
14
|
-
ToolCallPart,
|
|
15
|
-
ToolResultPart,
|
|
16
|
-
)
|
|
17
|
-
from mirascope.core.base._utils._base_message_param_converter import (
|
|
18
|
-
BaseMessageParamConverter,
|
|
19
|
-
)
|
|
20
|
-
from mirascope.core.openai._utils import convert_message_params
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class OpenAIMessageParamConverter(BaseMessageParamConverter):
|
|
24
|
-
@staticmethod
|
|
25
|
-
def to_provider(
|
|
26
|
-
message_params: list[BaseMessageParam],
|
|
27
|
-
) -> list[ChatCompletionMessageParam]:
|
|
28
|
-
"""Converts base message params to OpenAI message params."""
|
|
29
|
-
return convert_message_params(
|
|
30
|
-
cast(list[BaseMessageParam | ChatCompletionMessageParam], message_params)
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
@staticmethod
|
|
34
|
-
def from_provider(
|
|
35
|
-
message_params: list[ChatCompletionMessageParam],
|
|
36
|
-
) -> list[BaseMessageParam]:
|
|
37
|
-
"""Converts OpenAI message params to base message params."""
|
|
38
|
-
converted = []
|
|
39
|
-
for message_param in message_params:
|
|
40
|
-
contents = []
|
|
41
|
-
content = message_param.get("content")
|
|
42
|
-
if (
|
|
43
|
-
message_param["role"] == "tool"
|
|
44
|
-
and "name" in message_param
|
|
45
|
-
and "content" in message_param
|
|
46
|
-
):
|
|
47
|
-
converted.append(
|
|
48
|
-
BaseMessageParam(
|
|
49
|
-
role="tool",
|
|
50
|
-
content=[
|
|
51
|
-
ToolResultPart(
|
|
52
|
-
type="tool_result",
|
|
53
|
-
name=message_param["name"],
|
|
54
|
-
content=message_param["content"],
|
|
55
|
-
id=message_param["tool_call_id"],
|
|
56
|
-
is_error=False,
|
|
57
|
-
)
|
|
58
|
-
],
|
|
59
|
-
)
|
|
60
|
-
)
|
|
61
|
-
continue
|
|
62
|
-
elif isinstance(content, str):
|
|
63
|
-
converted.append(
|
|
64
|
-
BaseMessageParam(role=message_param["role"], content=content)
|
|
65
|
-
)
|
|
66
|
-
continue
|
|
67
|
-
elif isinstance(content, Iterable):
|
|
68
|
-
for part in content:
|
|
69
|
-
if part["type"] == "text":
|
|
70
|
-
contents.append(TextPart(type="text", text=part["text"]))
|
|
71
|
-
elif part["type"] == "image_url":
|
|
72
|
-
image_url = part["image_url"]
|
|
73
|
-
contents.append(
|
|
74
|
-
ImageURLPart(
|
|
75
|
-
type="image_url",
|
|
76
|
-
url=image_url["url"],
|
|
77
|
-
detail=image_url.get("detail", None),
|
|
78
|
-
)
|
|
79
|
-
)
|
|
80
|
-
elif part["type"] == "input_audio":
|
|
81
|
-
input_audio = part["input_audio"]
|
|
82
|
-
contents.append(
|
|
83
|
-
AudioPart(
|
|
84
|
-
type="audio",
|
|
85
|
-
media_type=f"audio/{input_audio['format']}",
|
|
86
|
-
audio=input_audio["data"],
|
|
87
|
-
)
|
|
88
|
-
)
|
|
89
|
-
else:
|
|
90
|
-
raise ValueError(part["refusal"]) # pyright: ignore [reportGeneralTypeIssues]
|
|
91
|
-
if tool_calls := message_param.get("tool_calls"):
|
|
92
|
-
for tool_call in tool_calls:
|
|
93
|
-
contents.append(
|
|
94
|
-
ToolCallPart(
|
|
95
|
-
type="tool_call",
|
|
96
|
-
name=tool_call["function"]["name"],
|
|
97
|
-
id=tool_call["id"],
|
|
98
|
-
args=json.loads(tool_call["function"]["arguments"]),
|
|
99
|
-
)
|
|
100
|
-
)
|
|
101
|
-
if contents:
|
|
102
|
-
converted.append(
|
|
103
|
-
BaseMessageParam(role=message_param["role"], content=contents)
|
|
104
|
-
)
|
|
105
|
-
return converted
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
"""This module contains the setup_call function for OpenAI tools."""
|
|
2
|
-
|
|
3
|
-
import inspect
|
|
4
|
-
import warnings
|
|
5
|
-
from collections.abc import Awaitable, Callable
|
|
6
|
-
from typing import Any, cast, overload
|
|
7
|
-
|
|
8
|
-
from openai import AsyncAzureOpenAI, AsyncOpenAI, AzureOpenAI, OpenAI
|
|
9
|
-
from openai.types.chat import (
|
|
10
|
-
ChatCompletion,
|
|
11
|
-
ChatCompletionChunk,
|
|
12
|
-
ChatCompletionMessageParam,
|
|
13
|
-
ChatCompletionUserMessageParam,
|
|
14
|
-
)
|
|
15
|
-
from pydantic import BaseModel
|
|
16
|
-
|
|
17
|
-
from ...base import BaseMessageParam, BaseTool, _utils
|
|
18
|
-
from ...base._utils import (
|
|
19
|
-
DEFAULT_TOOL_DOCSTRING,
|
|
20
|
-
AsyncCreateFn,
|
|
21
|
-
CreateFn,
|
|
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 OpenAICallKwargs
|
|
28
|
-
from ..call_params import OpenAICallParams
|
|
29
|
-
from ..dynamic_config import AsyncOpenAIDynamicConfig, OpenAIDynamicConfig
|
|
30
|
-
from ..tool import GenerateOpenAIStrictToolJsonSchema, OpenAITool
|
|
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: AsyncOpenAI | AsyncAzureOpenAI | None,
|
|
40
|
-
fn: Callable[..., Awaitable[AsyncOpenAIDynamicConfig]],
|
|
41
|
-
fn_args: dict[str, Any],
|
|
42
|
-
dynamic_config: AsyncOpenAIDynamicConfig,
|
|
43
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
44
|
-
json_mode: bool,
|
|
45
|
-
call_params: OpenAICallParams | CommonCallParams,
|
|
46
|
-
response_model: type[BaseModel] | None,
|
|
47
|
-
stream: bool | StreamConfig,
|
|
48
|
-
) -> tuple[
|
|
49
|
-
AsyncCreateFn[ChatCompletion, ChatCompletionChunk],
|
|
50
|
-
str | None,
|
|
51
|
-
list[ChatCompletionMessageParam],
|
|
52
|
-
list[type[OpenAITool]] | None,
|
|
53
|
-
OpenAICallKwargs,
|
|
54
|
-
]: ...
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@overload
|
|
58
|
-
def setup_call(
|
|
59
|
-
*,
|
|
60
|
-
model: str,
|
|
61
|
-
client: OpenAI | AzureOpenAI | None,
|
|
62
|
-
fn: Callable[..., OpenAIDynamicConfig],
|
|
63
|
-
fn_args: dict[str, Any],
|
|
64
|
-
dynamic_config: OpenAIDynamicConfig,
|
|
65
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
66
|
-
json_mode: bool,
|
|
67
|
-
call_params: OpenAICallParams | CommonCallParams,
|
|
68
|
-
response_model: type[BaseModel] | None,
|
|
69
|
-
stream: bool | StreamConfig,
|
|
70
|
-
) -> tuple[
|
|
71
|
-
CreateFn[ChatCompletion, ChatCompletionChunk],
|
|
72
|
-
str | None,
|
|
73
|
-
list[ChatCompletionMessageParam],
|
|
74
|
-
list[type[OpenAITool]] | None,
|
|
75
|
-
OpenAICallKwargs,
|
|
76
|
-
]: ...
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def setup_call(
|
|
80
|
-
*,
|
|
81
|
-
model: str,
|
|
82
|
-
client: OpenAI | AsyncOpenAI | AzureOpenAI | AsyncAzureOpenAI | None,
|
|
83
|
-
fn: Callable[..., OpenAIDynamicConfig]
|
|
84
|
-
| Callable[..., Awaitable[AsyncOpenAIDynamicConfig]],
|
|
85
|
-
fn_args: dict[str, Any],
|
|
86
|
-
dynamic_config: OpenAIDynamicConfig | AsyncOpenAIDynamicConfig,
|
|
87
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
88
|
-
json_mode: bool,
|
|
89
|
-
call_params: OpenAICallParams | CommonCallParams,
|
|
90
|
-
response_model: type[BaseModel] | None,
|
|
91
|
-
stream: bool | StreamConfig,
|
|
92
|
-
) -> tuple[
|
|
93
|
-
CreateFn[ChatCompletion, ChatCompletionChunk]
|
|
94
|
-
| AsyncCreateFn[ChatCompletion, ChatCompletionChunk],
|
|
95
|
-
str | None,
|
|
96
|
-
list[ChatCompletionMessageParam],
|
|
97
|
-
list[type[OpenAITool]] | None,
|
|
98
|
-
OpenAICallKwargs,
|
|
99
|
-
]:
|
|
100
|
-
prompt_template, messages, tool_types, base_call_kwargs = _utils.setup_call(
|
|
101
|
-
fn,
|
|
102
|
-
fn_args,
|
|
103
|
-
dynamic_config,
|
|
104
|
-
tools,
|
|
105
|
-
OpenAITool,
|
|
106
|
-
call_params,
|
|
107
|
-
convert_common_call_params,
|
|
108
|
-
)
|
|
109
|
-
call_kwargs = cast(OpenAICallKwargs, base_call_kwargs)
|
|
110
|
-
messages = cast(list[BaseMessageParam | ChatCompletionMessageParam], messages)
|
|
111
|
-
messages = convert_message_params(messages)
|
|
112
|
-
if json_mode:
|
|
113
|
-
if response_model and response_model.model_config.get("strict", False):
|
|
114
|
-
call_kwargs["response_format"] = {
|
|
115
|
-
"type": "json_schema",
|
|
116
|
-
"json_schema": {
|
|
117
|
-
"name": response_model.__name__,
|
|
118
|
-
"description": response_model.__doc__ or DEFAULT_TOOL_DOCSTRING,
|
|
119
|
-
"strict": True,
|
|
120
|
-
"schema": response_model.model_json_schema(
|
|
121
|
-
schema_generator=GenerateOpenAIStrictToolJsonSchema
|
|
122
|
-
),
|
|
123
|
-
},
|
|
124
|
-
}
|
|
125
|
-
else:
|
|
126
|
-
call_kwargs["response_format"] = {"type": "json_object"}
|
|
127
|
-
json_mode_content = _utils.json_mode_content(response_model).strip()
|
|
128
|
-
messages.append(
|
|
129
|
-
ChatCompletionUserMessageParam(role="user", content=json_mode_content)
|
|
130
|
-
)
|
|
131
|
-
elif response_model:
|
|
132
|
-
assert tool_types, "At least one tool must be provided for extraction."
|
|
133
|
-
if tool_types and tool_types[0].model_config.get("strict", False):
|
|
134
|
-
warnings.warn(
|
|
135
|
-
"You must set `json_mode=True` to use `strict=True` response models. "
|
|
136
|
-
"Ignoring `strict` and using tools for extraction.",
|
|
137
|
-
UserWarning,
|
|
138
|
-
)
|
|
139
|
-
call_kwargs["tool_choice"] = "required"
|
|
140
|
-
if stream:
|
|
141
|
-
call_kwargs["stream_options"] = (
|
|
142
|
-
{"include_usage": True}
|
|
143
|
-
if "stream_options" not in call_kwargs
|
|
144
|
-
else call_kwargs["stream_options"].update({"include_usage": True}) # pyright: ignore [reportOptionalMemberAccess]
|
|
145
|
-
)
|
|
146
|
-
call_kwargs |= {"model": model, "messages": messages}
|
|
147
|
-
|
|
148
|
-
if client is None:
|
|
149
|
-
client = AsyncOpenAI() if inspect.iscoroutinefunction(fn) else OpenAI()
|
|
150
|
-
create = (
|
|
151
|
-
get_async_create_fn(client.chat.completions.create)
|
|
152
|
-
if isinstance(client, AsyncOpenAI)
|
|
153
|
-
else get_create_fn(client.chat.completions.create)
|
|
154
|
-
)
|
|
155
|
-
return create, prompt_template, messages, tool_types, call_kwargs
|