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,416 +0,0 @@
|
|
|
1
|
-
"""Calculate the cost of a completion using the OpenAI API."""
|
|
2
|
-
|
|
3
|
-
from ..base.types import CostMetadata
|
|
4
|
-
|
|
5
|
-
# Constants for image token calculation
|
|
6
|
-
LOW_DETAIL_IMAGE_TOKENS = 85
|
|
7
|
-
HIGH_DETAIL_TILE_TOKENS = 170
|
|
8
|
-
HIGH_DETAIL_BASE_TOKENS = 85
|
|
9
|
-
TILE_SIZE = 512
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def _calculate_image_tokens(metadata: CostMetadata) -> int | None:
|
|
13
|
-
"""Calculate tokens used by images based on their size and detail level.
|
|
14
|
-
|
|
15
|
-
https://platform.openai.com/docs/guides/vision
|
|
16
|
-
Following OpenAI's pricing structure:
|
|
17
|
-
- Low detail: 85 tokens per image
|
|
18
|
-
- High detail: 85 tokens base + 170 tokens per 512px tile
|
|
19
|
-
(after scaling to fit within 2048x2048 and making shortest side 768px)
|
|
20
|
-
"""
|
|
21
|
-
if not metadata.images or not metadata.images:
|
|
22
|
-
return 0
|
|
23
|
-
|
|
24
|
-
total_image_tokens = 0
|
|
25
|
-
|
|
26
|
-
for img in metadata.images:
|
|
27
|
-
if not img.width or not img.height:
|
|
28
|
-
continue
|
|
29
|
-
|
|
30
|
-
# If image already has precalculated tokens, use those
|
|
31
|
-
if img.tokens is not None:
|
|
32
|
-
total_image_tokens += img.tokens
|
|
33
|
-
continue
|
|
34
|
-
|
|
35
|
-
if img.detail is not None and img.detail != "auto":
|
|
36
|
-
detail = img.detail
|
|
37
|
-
else:
|
|
38
|
-
# Default to high detail for auto
|
|
39
|
-
# We can't determine detail level from image alone
|
|
40
|
-
detail = "high"
|
|
41
|
-
if detail == "low":
|
|
42
|
-
# Low detail is a fixed cost regardless of size
|
|
43
|
-
total_image_tokens += LOW_DETAIL_IMAGE_TOKENS
|
|
44
|
-
else:
|
|
45
|
-
# High detail calculation
|
|
46
|
-
|
|
47
|
-
# Scale to fit within 2048x2048 square
|
|
48
|
-
width, height = img.width, img.height
|
|
49
|
-
if width > 2048 or height > 2048:
|
|
50
|
-
aspect_ratio = width / height
|
|
51
|
-
if width > height:
|
|
52
|
-
width = 2048
|
|
53
|
-
height = int(width / aspect_ratio)
|
|
54
|
-
else:
|
|
55
|
-
height = 2048
|
|
56
|
-
width = int(height * aspect_ratio)
|
|
57
|
-
|
|
58
|
-
# Scale so shortest side is 768px
|
|
59
|
-
if min(width, height) > 768:
|
|
60
|
-
if width < height:
|
|
61
|
-
scale_factor = 768 / width
|
|
62
|
-
width = 768
|
|
63
|
-
height = int(height * scale_factor)
|
|
64
|
-
else:
|
|
65
|
-
scale_factor = 768 / height
|
|
66
|
-
height = 768
|
|
67
|
-
width = int(width * scale_factor)
|
|
68
|
-
|
|
69
|
-
# Calculate number of 512px tiles needed
|
|
70
|
-
tiles_x = (width + TILE_SIZE - 1) // TILE_SIZE
|
|
71
|
-
tiles_y = (height + TILE_SIZE - 1) // TILE_SIZE
|
|
72
|
-
num_tiles = tiles_x * tiles_y
|
|
73
|
-
|
|
74
|
-
# Calculate token cost
|
|
75
|
-
image_tokens = (
|
|
76
|
-
HIGH_DETAIL_TILE_TOKENS * num_tiles
|
|
77
|
-
) + HIGH_DETAIL_BASE_TOKENS
|
|
78
|
-
total_image_tokens += image_tokens
|
|
79
|
-
|
|
80
|
-
return total_image_tokens
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def calculate_cost(
|
|
84
|
-
metadata: CostMetadata,
|
|
85
|
-
model: str = "gpt-3.5-turbo-16k",
|
|
86
|
-
) -> float | None:
|
|
87
|
-
"""Calculate the cost of a completion using the OpenAI API.
|
|
88
|
-
|
|
89
|
-
https://openai.com/pricing
|
|
90
|
-
|
|
91
|
-
Model Input Cached Output
|
|
92
|
-
gpt-4.5-preview $75.00 / 1M tokens $37.50 / 1M tokens $150.00 / 1M tokens
|
|
93
|
-
gpt-4.5-preview-2025-02-27 $75.00 / 1M tokens $37.50 / 1M tokens $150.00 / 1M tokens
|
|
94
|
-
gpt-4o $2.50 / 1M tokens $1.25 / 1M tokens $10.00 / 1M tokens
|
|
95
|
-
gpt-4o-2024-11-20 $2.50 / 1M tokens $1.25 / 1M tokens $10.00 / 1M tokens
|
|
96
|
-
gpt-4o-2024-08-06 $2.50 / 1M tokens $1.25 / 1M tokens $10.00 / 1M tokens
|
|
97
|
-
gpt-4o-2024-05-13 $5.00 / 1M tokens $15.00 / 1M tokens
|
|
98
|
-
gpt-4o-audio-preview $2.50 / 1M tokens $1.25 / 1M tokens $10.00 / 1M tokens
|
|
99
|
-
gpt-4o-audio-preview-2024-12-17 $2.50 / 1M tokens $1.25 / 1M tokens $10.00 / 1M tokens
|
|
100
|
-
gpt-4o-audio-preview-2024-10-01 $2.50 / 1M tokens $1.25 / 1M tokens $10.00 / 1M tokens
|
|
101
|
-
gpt-4o-realtime-preview $5.00 / 1M tokens $2.50 / 1M tokens $20.00 / 1M tokens
|
|
102
|
-
gpt-4o-realtime-preview-2024-12-17 $5.00 / 1M tokens $2.50 / 1M tokens $20.00 / 1M tokens
|
|
103
|
-
gpt-4o-realtime-preview-2024-10-01 $5.00 / 1M tokens $2.50 / 1M tokens $20.00 / 1M tokens
|
|
104
|
-
gpt-4o-mini $0.150 / 1M tokens $0.075 / 1M tokens $0.600 / 1M tokens
|
|
105
|
-
gpt-4o-mini-2024-07-18 $0.150 / 1M tokens $0.075 / 1M tokens $0.600 / 1M tokens
|
|
106
|
-
gpt-4o-mini-audio-preview $0.150 / 1M tokens $0.075 / 1M tokens $0.600 / 1M tokens
|
|
107
|
-
gpt-4o-mini-audio-preview-2024-12-17 $0.150 / 1M tokens $0.075 / 1M tokens $0.600 / 1M tokens
|
|
108
|
-
gpt-4o-mini-realtime-preview $0.60 / 1M tokens $0.30 / 1M tokens $2.40 / 1M tokens
|
|
109
|
-
gpt-4o-mini-realtime-preview-2024-12-17 $0.60 / 1M tokens $0.30 / 1M tokens $2.40 / 1M tokens
|
|
110
|
-
o1 $15.00 / 1M tokens $7.50 / 1M tokens $60.00 / 1M tokens
|
|
111
|
-
o1-2024-12-17 $15.00 / 1M tokens $7.50 / 1M tokens $60.00 / 1M tokens
|
|
112
|
-
o1-preview $15.00 / 1M tokens $7.50 / 1M tokens $60.00 / 1M tokens
|
|
113
|
-
o1-preview-2024-09-12 $15.00 / 1M tokens $7.50 / 1M tokens $60.00 / 1M tokens
|
|
114
|
-
o3-mini $1.10 / 1M tokens $0.55 / 1M tokens $4.40 / 1M tokens
|
|
115
|
-
o3-mini-2025-01-31 $1.10 / 1M tokens $0.55 / 1M tokens $4.40 / 1M tokens
|
|
116
|
-
o1-mini $1.10 / 1M tokens $0.55 / 1M tokens $4.40 / 1M tokens
|
|
117
|
-
o1-mini-2024-09-12 $1.10 / 1M tokens $0.55 / 1M tokens $4.40 / 1M tokens
|
|
118
|
-
chatgpt-4o-latest $5.00 / 1M tokens $15.00 / 1M tokens
|
|
119
|
-
gpt-4-turbo $10.00 / 1M tokens $30.00 / 1M tokens
|
|
120
|
-
gpt-4-turbo-2024-04-09 $10.00 / 1M tokens $30.00 / 1M tokens
|
|
121
|
-
gpt-3.5-turbo-0125 $0.50 / 1M tokens $1.50 / 1M tokens
|
|
122
|
-
gpt-3.5-turbo-1106 $1.00 / 1M tokens $2.00 / 1M tokens
|
|
123
|
-
gpt-4-0125-preview $10.00 / 1M tokens $30.00 / 1M tokens
|
|
124
|
-
gpt-4-1106-preview $10.00 / 1M tokens $30.00 / 1M tokens
|
|
125
|
-
gpt-4-vision-preview $10.00 / 1M tokens $30.00 / 1M tokens
|
|
126
|
-
gpt-4 $30.00 / 1M tokens $60.00 / 1M tokens
|
|
127
|
-
gpt-4-32k $60.00 / 1M tokens $120.00 / 1M tokens
|
|
128
|
-
text-embedding-3-small $0.02 / 1M tokens
|
|
129
|
-
text-embedding-3-large $0.13 / 1M tokens
|
|
130
|
-
text-embedding-ada-002 $0.10 / 1M tokens
|
|
131
|
-
"""
|
|
132
|
-
pricing = {
|
|
133
|
-
"gpt-4.5-preview": {
|
|
134
|
-
"prompt": 0.000_075,
|
|
135
|
-
"cached": 0.000_037_5,
|
|
136
|
-
"completion": 0.000_15,
|
|
137
|
-
"batch_prompt": 0.000_037_5,
|
|
138
|
-
"batch_completion": 0.000_075,
|
|
139
|
-
},
|
|
140
|
-
"gpt-4.5-preview-2025-02-27": {
|
|
141
|
-
"prompt": 0.000_075,
|
|
142
|
-
"cached": 0.000_037_5,
|
|
143
|
-
"completion": 0.000_15,
|
|
144
|
-
},
|
|
145
|
-
"gpt-4o": {
|
|
146
|
-
"prompt": 0.000_002_5,
|
|
147
|
-
"cached": 0.000_001_25,
|
|
148
|
-
"completion": 0.000_01,
|
|
149
|
-
"batch_prompt": 0.000_001_25,
|
|
150
|
-
"batch_completion": 0.000_005,
|
|
151
|
-
},
|
|
152
|
-
"gpt-4o-2024-11-20": {
|
|
153
|
-
"prompt": 0.000_002_5,
|
|
154
|
-
"cached": 0.000_001_25,
|
|
155
|
-
"completion": 0.000_01,
|
|
156
|
-
},
|
|
157
|
-
"gpt-4o-2024-08-06": {
|
|
158
|
-
"prompt": 0.000_002_5,
|
|
159
|
-
"cached": 0.000_001_25,
|
|
160
|
-
"completion": 0.000_01,
|
|
161
|
-
},
|
|
162
|
-
"gpt-4o-2024-05-13": {
|
|
163
|
-
"prompt": 0.000_005,
|
|
164
|
-
"cached": 0.000_002_5,
|
|
165
|
-
"completion": 0.000_015,
|
|
166
|
-
},
|
|
167
|
-
"gpt-4o-audio-preview": {
|
|
168
|
-
"prompt": 0.000_002_5,
|
|
169
|
-
"cached": 0.000_001_25,
|
|
170
|
-
"completion": 0.000_01,
|
|
171
|
-
},
|
|
172
|
-
"gpt-4o-audio-preview-2024-12-17": {
|
|
173
|
-
"prompt": 0.000_002_5,
|
|
174
|
-
"cached": 0.000_001_25,
|
|
175
|
-
"completion": 0.000_01,
|
|
176
|
-
},
|
|
177
|
-
"gpt-4o-audio-preview-2024-10-01": {
|
|
178
|
-
"prompt": 0.000_002_5,
|
|
179
|
-
"cached": 0.000_001_25,
|
|
180
|
-
"completion": 0.000_01,
|
|
181
|
-
},
|
|
182
|
-
"gpt-4o-realtime-preview": {
|
|
183
|
-
"prompt": 0.000_005,
|
|
184
|
-
"cached": 0.000_002_5,
|
|
185
|
-
"completion": 0.000_02,
|
|
186
|
-
},
|
|
187
|
-
"gpt-4o-realtime-preview-2024-12-17": {
|
|
188
|
-
"prompt": 0.000_005,
|
|
189
|
-
"cached": 0.000_002_5,
|
|
190
|
-
"completion": 0.000_02,
|
|
191
|
-
},
|
|
192
|
-
"gpt-4o-realtime-preview-2024-10-01": {
|
|
193
|
-
"prompt": 0.000_005,
|
|
194
|
-
"cached": 0.000_002_5,
|
|
195
|
-
"completion": 0.000_02,
|
|
196
|
-
},
|
|
197
|
-
"gpt-4o-mini": {
|
|
198
|
-
"prompt": 0.000_000_15,
|
|
199
|
-
"cached": 0.000_000_075,
|
|
200
|
-
"completion": 0.000_000_6,
|
|
201
|
-
},
|
|
202
|
-
"gpt-4o-mini-2024-07-18": {
|
|
203
|
-
"prompt": 0.000_000_15,
|
|
204
|
-
"cached": 0.000_000_075,
|
|
205
|
-
"completion": 0.000_000_6,
|
|
206
|
-
},
|
|
207
|
-
"gpt-4o-mini-audio-preview": {
|
|
208
|
-
"prompt": 0.000_000_15,
|
|
209
|
-
"cached": 0.000_000_075,
|
|
210
|
-
"completion": 0.000_000_6,
|
|
211
|
-
},
|
|
212
|
-
"gpt-4o-mini-audio-preview-2024-12-17": {
|
|
213
|
-
"prompt": 0.000_000_15,
|
|
214
|
-
"cached": 0.000_000_075,
|
|
215
|
-
"completion": 0.000_000_6,
|
|
216
|
-
},
|
|
217
|
-
"gpt-4o-mini-realtime-preview": {
|
|
218
|
-
"prompt": 0.000_000_6,
|
|
219
|
-
"cached": 0.000_000_3,
|
|
220
|
-
"completion": 0.000_002_4,
|
|
221
|
-
},
|
|
222
|
-
"gpt-4o-mini-realtime-preview-2024-12-17": {
|
|
223
|
-
"prompt": 0.000_000_6,
|
|
224
|
-
"cached": 0.000_000_3,
|
|
225
|
-
"completion": 0.000_002_4,
|
|
226
|
-
},
|
|
227
|
-
"o1": {
|
|
228
|
-
"prompt": 0.000_015,
|
|
229
|
-
"cached": 0.000_007_5,
|
|
230
|
-
"completion": 0.000_06,
|
|
231
|
-
},
|
|
232
|
-
"o1-2024-12-17": {
|
|
233
|
-
"prompt": 0.000_015,
|
|
234
|
-
"cached": 0.000_007_5,
|
|
235
|
-
"completion": 0.000_06,
|
|
236
|
-
},
|
|
237
|
-
"o1-preview": {
|
|
238
|
-
"prompt": 0.000_015,
|
|
239
|
-
"cached": 0.000_007_5,
|
|
240
|
-
"completion": 0.000_06,
|
|
241
|
-
},
|
|
242
|
-
"o1-preview-2024-09-12": {
|
|
243
|
-
"prompt": 0.000_015,
|
|
244
|
-
"cached": 0.000_007_5,
|
|
245
|
-
"completion": 0.000_06,
|
|
246
|
-
},
|
|
247
|
-
"o3-mini": {
|
|
248
|
-
"prompt": 0.000_001_1,
|
|
249
|
-
"cached": 0.000_000_55,
|
|
250
|
-
"completion": 0.000_004_4,
|
|
251
|
-
},
|
|
252
|
-
"o3-mini-2025-01-31": {
|
|
253
|
-
"prompt": 0.000_001_1,
|
|
254
|
-
"cached": 0.000_000_55,
|
|
255
|
-
"completion": 0.000_004_4,
|
|
256
|
-
},
|
|
257
|
-
"o1-mini": {
|
|
258
|
-
"prompt": 0.000_001_1,
|
|
259
|
-
"cached": 0.000_000_55,
|
|
260
|
-
"completion": 0.000_004_4,
|
|
261
|
-
},
|
|
262
|
-
"o1-mini-2024-09-12": {
|
|
263
|
-
"prompt": 0.000_001_1,
|
|
264
|
-
"cached": 0.000_000_55,
|
|
265
|
-
"completion": 0.000_004_4,
|
|
266
|
-
},
|
|
267
|
-
"chatgpt-4o-latest": {
|
|
268
|
-
"prompt": 0.000_005,
|
|
269
|
-
"cached": 0,
|
|
270
|
-
"completion": 0.000_015,
|
|
271
|
-
},
|
|
272
|
-
"gpt-4-turbo": {
|
|
273
|
-
"prompt": 0.000_01,
|
|
274
|
-
"cached": 0,
|
|
275
|
-
"completion": 0.000_03,
|
|
276
|
-
},
|
|
277
|
-
"gpt-4-turbo-2024-04-09": {
|
|
278
|
-
"prompt": 0.000_01,
|
|
279
|
-
"cached": 0,
|
|
280
|
-
"completion": 0.000_03,
|
|
281
|
-
},
|
|
282
|
-
"gpt-3.5-turbo-0125": {
|
|
283
|
-
"prompt": 0.000_000_5,
|
|
284
|
-
"cached": 0,
|
|
285
|
-
"completion": 0.000_001_5,
|
|
286
|
-
},
|
|
287
|
-
"gpt-3.5-turbo-1106": {
|
|
288
|
-
"prompt": 0.000_001,
|
|
289
|
-
"cached": 0,
|
|
290
|
-
"completion": 0.000_002,
|
|
291
|
-
},
|
|
292
|
-
"gpt-4-0125-preview": {
|
|
293
|
-
"prompt": 0.000_01,
|
|
294
|
-
"cached": 0,
|
|
295
|
-
"completion": 0.000_03,
|
|
296
|
-
},
|
|
297
|
-
"gpt-4-1106-preview": {
|
|
298
|
-
"prompt": 0.000_01,
|
|
299
|
-
"cached": 0,
|
|
300
|
-
"completion": 0.000_03,
|
|
301
|
-
},
|
|
302
|
-
"gpt-4-vision-preview": {
|
|
303
|
-
"prompt": 0.000_01,
|
|
304
|
-
"cached": 0,
|
|
305
|
-
"completion": 0.000_03,
|
|
306
|
-
},
|
|
307
|
-
"gpt-4": {
|
|
308
|
-
"prompt": 0.000_03,
|
|
309
|
-
"cached": 0,
|
|
310
|
-
"completion": 0.000_06,
|
|
311
|
-
},
|
|
312
|
-
"gpt-4-32k": {
|
|
313
|
-
"prompt": 0.000_06,
|
|
314
|
-
"cached": 0,
|
|
315
|
-
"completion": 0.000_12,
|
|
316
|
-
},
|
|
317
|
-
"gpt-3.5-turbo-4k": {
|
|
318
|
-
"prompt": 0.000_015,
|
|
319
|
-
"cached": 0,
|
|
320
|
-
"completion": 0.000_02,
|
|
321
|
-
},
|
|
322
|
-
"gpt-3.5-turbo-16k": {
|
|
323
|
-
"prompt": 0.000_003,
|
|
324
|
-
"cached": 0,
|
|
325
|
-
"completion": 0.000_004,
|
|
326
|
-
},
|
|
327
|
-
"gpt-4-8k": {
|
|
328
|
-
"prompt": 0.000_03,
|
|
329
|
-
"cached": 0,
|
|
330
|
-
"completion": 0.000_06,
|
|
331
|
-
},
|
|
332
|
-
"text-embedding-3-small": {
|
|
333
|
-
"prompt": 0.000_000_02,
|
|
334
|
-
"cached": 0,
|
|
335
|
-
"completion": 0,
|
|
336
|
-
"batch_prompt": 0.000_000_01,
|
|
337
|
-
},
|
|
338
|
-
"text-embedding-ada-002": {
|
|
339
|
-
"prompt": 0.000_000_1,
|
|
340
|
-
"cached": 0,
|
|
341
|
-
"completion": 0,
|
|
342
|
-
"batch_prompt": 0.000_000_05,
|
|
343
|
-
},
|
|
344
|
-
"text-embedding-3-large": {
|
|
345
|
-
"prompt": 0.000_000_13,
|
|
346
|
-
"cached": 0,
|
|
347
|
-
"completion": 0,
|
|
348
|
-
"batch_prompt": 0.000_000_065,
|
|
349
|
-
},
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
# Audio pricing for audio models (per-minute rates in dollars)
|
|
353
|
-
|
|
354
|
-
if metadata.cost is not None:
|
|
355
|
-
return metadata.cost
|
|
356
|
-
|
|
357
|
-
# Audio input/output costs
|
|
358
|
-
# ChatCompletion.usage has brake down of audio input and output.
|
|
359
|
-
# The total cost already includes the audio input/output cost.
|
|
360
|
-
|
|
361
|
-
# Initialize cached tokens if not provided
|
|
362
|
-
if metadata.cached_tokens is None:
|
|
363
|
-
metadata.cached_tokens = 0
|
|
364
|
-
|
|
365
|
-
# Try to get model pricing
|
|
366
|
-
try:
|
|
367
|
-
model_pricing = pricing[model]
|
|
368
|
-
except KeyError:
|
|
369
|
-
return None
|
|
370
|
-
|
|
371
|
-
image_tokens = _calculate_image_tokens(metadata) or 0
|
|
372
|
-
|
|
373
|
-
input_tokens = (metadata.input_tokens or 0) + image_tokens
|
|
374
|
-
|
|
375
|
-
# Calculate costs for each component
|
|
376
|
-
prompt_cost = input_tokens * model_pricing["prompt"]
|
|
377
|
-
cached_cost = metadata.cached_tokens * model_pricing["cached"]
|
|
378
|
-
completion_cost = (metadata.output_tokens or 0) * model_pricing["completion"]
|
|
379
|
-
|
|
380
|
-
# Special handling for embedding models (only input tokens matter)
|
|
381
|
-
if "embedding" in model:
|
|
382
|
-
total_cost = prompt_cost
|
|
383
|
-
else:
|
|
384
|
-
total_cost = prompt_cost + cached_cost + completion_cost
|
|
385
|
-
|
|
386
|
-
# Apply batch discounts if applicable
|
|
387
|
-
if metadata.batch_mode:
|
|
388
|
-
# Based on the OpenAI pricing table, batch mode typically provides
|
|
389
|
-
# approximately 50% discount for both input and output tokens
|
|
390
|
-
if "embedding" in model.lower():
|
|
391
|
-
# Embedding models have specific batch pricing
|
|
392
|
-
if model == "text-embedding-3-small":
|
|
393
|
-
prompt_cost = (
|
|
394
|
-
input_tokens * 0.000_000_01
|
|
395
|
-
) # $0.01 per 1M tokens in batch mode
|
|
396
|
-
elif model == "text-embedding-3-large":
|
|
397
|
-
prompt_cost = (
|
|
398
|
-
input_tokens * 0.000_000_065
|
|
399
|
-
) # $0.065 per 1M tokens in batch mode
|
|
400
|
-
elif model == "text-embedding-ada-002":
|
|
401
|
-
prompt_cost = (
|
|
402
|
-
input_tokens * 0.000_000_05
|
|
403
|
-
) # $0.05 per 1M tokens in batch mode
|
|
404
|
-
else:
|
|
405
|
-
# For LLM models, typically 50% discount
|
|
406
|
-
prompt_cost *= 0.5
|
|
407
|
-
cached_cost *= 0.5
|
|
408
|
-
completion_cost *= 0.5
|
|
409
|
-
|
|
410
|
-
# Recalculate total cost with batch pricing
|
|
411
|
-
if "embedding" in model:
|
|
412
|
-
total_cost = prompt_cost
|
|
413
|
-
else:
|
|
414
|
-
total_cost = prompt_cost + cached_cost + completion_cost
|
|
415
|
-
|
|
416
|
-
return total_cost
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"""Calculate the cost of a completion using the Vertex AI Gemini API, considering context window size."""
|
|
2
|
-
|
|
3
|
-
from ..base.types import CostMetadata
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def calculate_cost(
|
|
7
|
-
metadata: CostMetadata,
|
|
8
|
-
model: str = "gemini-1.5-pro",
|
|
9
|
-
) -> float | None:
|
|
10
|
-
"""Calculate the cost of a completion using the Vertex AI Gemini API.
|
|
11
|
-
|
|
12
|
-
https://cloud.google.com/vertex-ai/pricing#generative_ai_models
|
|
13
|
-
|
|
14
|
-
Model Input (<=128K) Output (<=128K) Input (>128K) Output (>128K)
|
|
15
|
-
gemini-1.5-flash $0.00001875 / 1k $0.000075 / 1k $0.0000375 / 1k $0.00015 / 1k
|
|
16
|
-
gemini-1.5-pro $0.00125 / 1k $0.00375 / 1k $0.0025 / 1k $0.0075 / 1k
|
|
17
|
-
gemini-1.0-pro $0.000125 / 1k $0.000375 / 1k N/A N/A
|
|
18
|
-
|
|
19
|
-
Note: Prices are per 1k characters. Gemini 1.0 Pro only supports up to 32K context window.
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
context_length = metadata.context_length or 0
|
|
23
|
-
pricing = {
|
|
24
|
-
"gemini-1.5-flash": {
|
|
25
|
-
"prompt_short": 0.000_018_75,
|
|
26
|
-
"completion_short": 0.000_075,
|
|
27
|
-
"prompt_long": 0.000_037_5,
|
|
28
|
-
"completion_long": 0.000_15,
|
|
29
|
-
},
|
|
30
|
-
"gemini-1.5-pro": {
|
|
31
|
-
"prompt_short": 0.001_25,
|
|
32
|
-
"completion_short": 0.003_75,
|
|
33
|
-
"prompt_long": 0.002_5,
|
|
34
|
-
"completion_long": 0.007_5,
|
|
35
|
-
},
|
|
36
|
-
"gemini-1.0-pro": {
|
|
37
|
-
"prompt_short": 0.000_125,
|
|
38
|
-
"completion_short": 0.000_375,
|
|
39
|
-
"prompt_long": None,
|
|
40
|
-
"completion_long": None,
|
|
41
|
-
},
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if metadata.input_tokens is None or metadata.output_tokens is None:
|
|
45
|
-
return None
|
|
46
|
-
|
|
47
|
-
try:
|
|
48
|
-
model_pricing = pricing[model]
|
|
49
|
-
except KeyError:
|
|
50
|
-
return None
|
|
51
|
-
|
|
52
|
-
# Determine if we're using long context pricing
|
|
53
|
-
use_long_context = context_length > 128000
|
|
54
|
-
|
|
55
|
-
if use_long_context and model == "gemini-1.0-pro":
|
|
56
|
-
return None # Gemini 1.0 Pro doesn't support long context
|
|
57
|
-
|
|
58
|
-
prompt_price = model_pricing["prompt_long" if use_long_context else "prompt_short"]
|
|
59
|
-
completion_price = model_pricing[
|
|
60
|
-
"completion_long" if use_long_context else "completion_short"
|
|
61
|
-
]
|
|
62
|
-
|
|
63
|
-
prompt_cost = (metadata.input_tokens / 1000) * prompt_price
|
|
64
|
-
completion_cost = (metadata.output_tokens / 1000) * completion_price
|
|
65
|
-
total_cost = prompt_cost + completion_cost
|
|
66
|
-
|
|
67
|
-
return total_cost
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"""Calculate the cost of a Grok API call."""
|
|
2
|
-
|
|
3
|
-
from ..base.types import CostMetadata
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def calculate_cost(
|
|
7
|
-
metadata: CostMetadata,
|
|
8
|
-
model: str,
|
|
9
|
-
) -> float | None:
|
|
10
|
-
"""Calculate the cost of an xAI Grok API call.
|
|
11
|
-
|
|
12
|
-
https://docs.x.ai
|
|
13
|
-
|
|
14
|
-
Pricing (per 1M tokens):
|
|
15
|
-
|
|
16
|
-
Model Input Cached Output
|
|
17
|
-
grok-3 $3.50 $0.875 $10.50
|
|
18
|
-
grok-3-latest $3.50 $0.875 $10.50
|
|
19
|
-
grok-2 $2.00 $0.50 $6.00
|
|
20
|
-
grok-2-latest $2.00 $0.50 $6.00
|
|
21
|
-
grok-2-1212 $2.00 $0.50 $6.00
|
|
22
|
-
grok-2-mini $0.33 $0.083 $1.00
|
|
23
|
-
grok-2-vision-1212 $2.00 $0.50 $6.00
|
|
24
|
-
grok-vision-beta $5.00 $1.25 $15.00
|
|
25
|
-
grok-beta $5.00 $1.25 $15.00
|
|
26
|
-
|
|
27
|
-
Args:
|
|
28
|
-
input_tokens: Number of input tokens
|
|
29
|
-
cached_tokens: Number of cached tokens
|
|
30
|
-
output_tokens: Number of output tokens
|
|
31
|
-
model: Model name to use for pricing calculation
|
|
32
|
-
|
|
33
|
-
Returns:
|
|
34
|
-
Total cost in USD or None if invalid input
|
|
35
|
-
"""
|
|
36
|
-
pricing = {
|
|
37
|
-
"grok-3": {
|
|
38
|
-
"prompt": 0.000_003_5,
|
|
39
|
-
"cached": 0.000_000_875,
|
|
40
|
-
"completion": 0.000_010_5,
|
|
41
|
-
},
|
|
42
|
-
"grok-3-latest": {
|
|
43
|
-
"prompt": 0.000_003_5,
|
|
44
|
-
"cached": 0.000_000_875,
|
|
45
|
-
"completion": 0.000_010_5,
|
|
46
|
-
},
|
|
47
|
-
"grok-2": {
|
|
48
|
-
"prompt": 0.000_002,
|
|
49
|
-
"cached": 0.000_000_5,
|
|
50
|
-
"completion": 0.000_006,
|
|
51
|
-
},
|
|
52
|
-
"grok-latest": {
|
|
53
|
-
"prompt": 0.000_002,
|
|
54
|
-
"cached": 0.000_000_5,
|
|
55
|
-
"completion": 0.000_006,
|
|
56
|
-
},
|
|
57
|
-
"grok-2-1212": {
|
|
58
|
-
"prompt": 0.000_002,
|
|
59
|
-
"cached": 0.000_000_5,
|
|
60
|
-
"completion": 0.000_006,
|
|
61
|
-
},
|
|
62
|
-
"grok-2-mini": {
|
|
63
|
-
"prompt": 0.000_000_33,
|
|
64
|
-
"cached": 0.000_000_083,
|
|
65
|
-
"completion": 0.000_001,
|
|
66
|
-
},
|
|
67
|
-
"grok-2-vision-1212": {
|
|
68
|
-
"prompt": 0.000_002,
|
|
69
|
-
"cached": 0.000_000_5,
|
|
70
|
-
"completion": 0.000_006,
|
|
71
|
-
},
|
|
72
|
-
"grok-vision-beta": {
|
|
73
|
-
"prompt": 0.000_005,
|
|
74
|
-
"cached": 0.000_001_25,
|
|
75
|
-
"completion": 0.000_015,
|
|
76
|
-
},
|
|
77
|
-
"grok-beta": {
|
|
78
|
-
"prompt": 0.000_005,
|
|
79
|
-
"cached": 0.000_001_25,
|
|
80
|
-
"completion": 0.000_015,
|
|
81
|
-
},
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if metadata.input_tokens is None or metadata.output_tokens is None:
|
|
85
|
-
return None
|
|
86
|
-
|
|
87
|
-
if metadata.cached_tokens is None:
|
|
88
|
-
metadata.cached_tokens = 0
|
|
89
|
-
|
|
90
|
-
try:
|
|
91
|
-
model_pricing = pricing[model]
|
|
92
|
-
except KeyError:
|
|
93
|
-
return None
|
|
94
|
-
|
|
95
|
-
prompt_price = model_pricing["prompt"]
|
|
96
|
-
cached_price = model_pricing["cached"]
|
|
97
|
-
completion_price = model_pricing["completion"]
|
|
98
|
-
|
|
99
|
-
prompt_cost = metadata.input_tokens * prompt_price
|
|
100
|
-
cached_cost = metadata.cached_tokens * cached_price
|
|
101
|
-
completion_cost = metadata.output_tokens * completion_price
|
|
102
|
-
total_cost = prompt_cost + cached_cost + completion_cost
|
|
103
|
-
|
|
104
|
-
return total_cost
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"""Cost calculation utilities for LLM API calls."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from ..base.types import CostMetadata, Provider
|
|
6
|
-
from ._anthropic_calculate_cost import (
|
|
7
|
-
calculate_cost as anthropic_calculate_cost,
|
|
8
|
-
)
|
|
9
|
-
from ._azure_calculate_cost import calculate_cost as azure_calculate_cost
|
|
10
|
-
from ._bedrock_calculate_cost import calculate_cost as bedrock_calculate_cost
|
|
11
|
-
from ._cohere_calculate_cost import calculate_cost as cohere_calculate_cost
|
|
12
|
-
from ._gemini_calculate_cost import calculate_cost as gemini_calculate_cost
|
|
13
|
-
from ._google_calculate_cost import calculate_cost as google_calculate_cost
|
|
14
|
-
from ._groq_calculate_cost import calculate_cost as groq_calculate_cost
|
|
15
|
-
from ._litellm_calculate_cost import calculate_cost as litellm_calculate_cost
|
|
16
|
-
from ._mistral_calculate_cost import calculate_cost as mistral_calculate_cost
|
|
17
|
-
from ._openai_calculate_cost import calculate_cost as openai_calculate_cost
|
|
18
|
-
from ._vertex_calculate_cost import calculate_cost as vertex_calculate_cost
|
|
19
|
-
from ._xai_calculate_cost import calculate_cost as xai_calculate_cost
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def calculate_cost(
|
|
23
|
-
provider: Provider,
|
|
24
|
-
model: str,
|
|
25
|
-
metadata: CostMetadata | None = None,
|
|
26
|
-
) -> float | None:
|
|
27
|
-
"""Calculate the cost for an LLM API call.
|
|
28
|
-
|
|
29
|
-
This function routes to the appropriate provider-specific cost calculation function,
|
|
30
|
-
preserving existing behavior while providing a unified interface.
|
|
31
|
-
|
|
32
|
-
Args:
|
|
33
|
-
provider: The LLM provider (e.g., "openai", "anthropic")
|
|
34
|
-
model: The model name (e.g., "gpt-4", "claude-3-opus")
|
|
35
|
-
metadata: Additional metadata required for cost calculation
|
|
36
|
-
|
|
37
|
-
Returns:
|
|
38
|
-
The calculated cost in USD or None if unable to calculate
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
# Initialize empty metadata if none provided
|
|
42
|
-
if metadata is None:
|
|
43
|
-
metadata = CostMetadata()
|
|
44
|
-
|
|
45
|
-
# Set default values
|
|
46
|
-
if metadata.cached_tokens is None:
|
|
47
|
-
metadata.cached_tokens = 0
|
|
48
|
-
|
|
49
|
-
# Route to provider-specific implementations
|
|
50
|
-
if provider == "openai":
|
|
51
|
-
return openai_calculate_cost(metadata, model)
|
|
52
|
-
|
|
53
|
-
elif provider == "anthropic":
|
|
54
|
-
return anthropic_calculate_cost(metadata, model)
|
|
55
|
-
|
|
56
|
-
elif provider == "azure":
|
|
57
|
-
return azure_calculate_cost(metadata, model)
|
|
58
|
-
|
|
59
|
-
elif provider == "bedrock":
|
|
60
|
-
return bedrock_calculate_cost(metadata, model)
|
|
61
|
-
|
|
62
|
-
elif provider == "cohere":
|
|
63
|
-
return cohere_calculate_cost(metadata, model)
|
|
64
|
-
|
|
65
|
-
elif provider == "gemini":
|
|
66
|
-
return gemini_calculate_cost(metadata, model)
|
|
67
|
-
|
|
68
|
-
elif provider == "google":
|
|
69
|
-
return google_calculate_cost(metadata, model)
|
|
70
|
-
|
|
71
|
-
elif provider == "groq":
|
|
72
|
-
return groq_calculate_cost(metadata, model)
|
|
73
|
-
|
|
74
|
-
elif provider == "mistral":
|
|
75
|
-
return mistral_calculate_cost(metadata, model)
|
|
76
|
-
|
|
77
|
-
elif provider == "vertex":
|
|
78
|
-
return vertex_calculate_cost(metadata, model)
|
|
79
|
-
|
|
80
|
-
elif provider == "xai":
|
|
81
|
-
return xai_calculate_cost(metadata, model)
|
|
82
|
-
|
|
83
|
-
elif provider == "litellm":
|
|
84
|
-
return litellm_calculate_cost(metadata, model)
|
|
85
|
-
else:
|
|
86
|
-
raise ValueError(f"Unsupported provider: {provider}")
|