mirascope 2.0.0__py3-none-any.whl → 2.0.0a1__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 +2 -11
- mirascope/graphs/__init__.py +22 -0
- mirascope/graphs/finite_state_machine.py +625 -0
- mirascope/llm/__init__.py +15 -96
- 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 +1 -2
- mirascope/llm/calls/base_call.py +33 -0
- mirascope/llm/calls/calls.py +58 -84
- mirascope/llm/calls/decorator.py +120 -140
- mirascope/llm/clients/__init__.py +34 -0
- mirascope/llm/clients/_missing_import_stubs.py +47 -0
- mirascope/llm/clients/anthropic/__init__.py +25 -0
- mirascope/llm/{providers/openai/completions → clients/anthropic}/_utils/__init__.py +0 -2
- mirascope/llm/{providers → clients}/anthropic/_utils/decode.py +22 -66
- 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/{providers → clients}/base/__init__.py +5 -4
- mirascope/llm/{providers → clients}/base/_utils.py +17 -78
- mirascope/llm/{providers/base/base_provider.py → clients/base/client.py} +145 -468
- mirascope/llm/{models → clients/base}/params.py +37 -16
- mirascope/llm/clients/google/__init__.py +20 -0
- mirascope/llm/{providers/openai/responses → clients/google}/_utils/__init__.py +0 -2
- mirascope/llm/{providers → clients}/google/_utils/decode.py +22 -98
- mirascope/llm/{providers → clients}/google/_utils/encode.py +46 -168
- mirascope/llm/clients/google/clients.py +853 -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 +28 -0
- mirascope/llm/{providers/google → clients/openai/completions}/_utils/__init__.py +0 -4
- mirascope/llm/{providers → clients}/openai/completions/_utils/decode.py +9 -74
- mirascope/llm/{providers → clients}/openai/completions/_utils/encode.py +52 -70
- 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 +26 -0
- mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
- mirascope/llm/{providers → clients}/openai/responses/_utils/decode.py +14 -80
- mirascope/llm/{providers → clients}/openai/responses/_utils/encode.py +41 -92
- 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 +2 -3
- mirascope/llm/content/tool_call.py +0 -6
- mirascope/llm/content/tool_output.py +5 -22
- mirascope/llm/context/_utils.py +6 -19
- mirascope/llm/exceptions.py +43 -298
- mirascope/llm/formatting/__init__.py +2 -19
- mirascope/llm/formatting/_utils.py +74 -0
- mirascope/llm/formatting/format.py +30 -219
- mirascope/llm/formatting/from_call_args.py +2 -2
- mirascope/llm/formatting/partial.py +7 -80
- mirascope/llm/formatting/types.py +64 -21
- mirascope/llm/mcp/__init__.py +2 -2
- mirascope/llm/mcp/client.py +118 -0
- mirascope/llm/messages/__init__.py +0 -3
- mirascope/llm/messages/message.py +5 -13
- mirascope/llm/models/__init__.py +2 -7
- mirascope/llm/models/models.py +139 -315
- mirascope/llm/prompts/__init__.py +12 -13
- mirascope/llm/prompts/_utils.py +43 -14
- mirascope/llm/prompts/decorator.py +204 -144
- mirascope/llm/prompts/protocols.py +59 -25
- mirascope/llm/responses/__init__.py +1 -9
- mirascope/llm/responses/_utils.py +12 -102
- mirascope/llm/responses/base_response.py +6 -18
- mirascope/llm/responses/base_stream_response.py +50 -173
- mirascope/llm/responses/finish_reason.py +0 -1
- mirascope/llm/responses/response.py +13 -34
- mirascope/llm/responses/root_response.py +29 -100
- mirascope/llm/responses/stream_response.py +31 -40
- mirascope/llm/tools/__init__.py +2 -9
- mirascope/llm/tools/_utils.py +3 -12
- mirascope/llm/tools/decorator.py +16 -25
- mirascope/llm/tools/protocols.py +4 -4
- mirascope/llm/tools/tool_schema.py +19 -87
- mirascope/llm/tools/toolkit.py +27 -35
- mirascope/llm/tools/tools.py +41 -135
- {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/METADATA +13 -90
- mirascope-2.0.0a1.dist-info/RECORD +102 -0
- {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/WHEEL +1 -1
- {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/licenses/LICENSE +1 -1
- mirascope/_stubs.py +0 -363
- mirascope/api/__init__.py +0 -14
- mirascope/api/_generated/README.md +0 -207
- mirascope/api/_generated/__init__.py +0 -440
- mirascope/api/_generated/annotations/__init__.py +0 -33
- mirascope/api/_generated/annotations/client.py +0 -506
- mirascope/api/_generated/annotations/raw_client.py +0 -1414
- mirascope/api/_generated/annotations/types/__init__.py +0 -31
- mirascope/api/_generated/annotations/types/annotations_create_request_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_create_response.py +0 -48
- mirascope/api/_generated/annotations/types/annotations_create_response_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_get_response.py +0 -48
- mirascope/api/_generated/annotations/types/annotations_get_response_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_list_request_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_list_response.py +0 -21
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +0 -50
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_update_request_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_update_response.py +0 -48
- mirascope/api/_generated/annotations/types/annotations_update_response_label.py +0 -5
- mirascope/api/_generated/api_keys/__init__.py +0 -17
- mirascope/api/_generated/api_keys/client.py +0 -530
- mirascope/api/_generated/api_keys/raw_client.py +0 -1236
- mirascope/api/_generated/api_keys/types/__init__.py +0 -15
- mirascope/api/_generated/api_keys/types/api_keys_create_response.py +0 -28
- mirascope/api/_generated/api_keys/types/api_keys_get_response.py +0 -27
- mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +0 -40
- mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +0 -27
- mirascope/api/_generated/client.py +0 -211
- mirascope/api/_generated/core/__init__.py +0 -52
- mirascope/api/_generated/core/api_error.py +0 -23
- mirascope/api/_generated/core/client_wrapper.py +0 -46
- mirascope/api/_generated/core/datetime_utils.py +0 -28
- mirascope/api/_generated/core/file.py +0 -67
- mirascope/api/_generated/core/force_multipart.py +0 -16
- mirascope/api/_generated/core/http_client.py +0 -543
- mirascope/api/_generated/core/http_response.py +0 -55
- mirascope/api/_generated/core/jsonable_encoder.py +0 -100
- mirascope/api/_generated/core/pydantic_utilities.py +0 -255
- mirascope/api/_generated/core/query_encoder.py +0 -58
- mirascope/api/_generated/core/remove_none_from_dict.py +0 -11
- mirascope/api/_generated/core/request_options.py +0 -35
- mirascope/api/_generated/core/serialization.py +0 -276
- mirascope/api/_generated/docs/__init__.py +0 -4
- mirascope/api/_generated/docs/client.py +0 -91
- mirascope/api/_generated/docs/raw_client.py +0 -178
- mirascope/api/_generated/environment.py +0 -9
- mirascope/api/_generated/environments/__init__.py +0 -23
- mirascope/api/_generated/environments/client.py +0 -649
- mirascope/api/_generated/environments/raw_client.py +0 -1567
- mirascope/api/_generated/environments/types/__init__.py +0 -25
- mirascope/api/_generated/environments/types/environments_create_response.py +0 -24
- mirascope/api/_generated/environments/types/environments_get_analytics_response.py +0 -60
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +0 -24
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +0 -22
- mirascope/api/_generated/environments/types/environments_get_response.py +0 -24
- mirascope/api/_generated/environments/types/environments_list_response_item.py +0 -24
- mirascope/api/_generated/environments/types/environments_update_response.py +0 -24
- mirascope/api/_generated/errors/__init__.py +0 -25
- mirascope/api/_generated/errors/bad_request_error.py +0 -14
- mirascope/api/_generated/errors/conflict_error.py +0 -14
- mirascope/api/_generated/errors/forbidden_error.py +0 -11
- mirascope/api/_generated/errors/internal_server_error.py +0 -10
- mirascope/api/_generated/errors/not_found_error.py +0 -11
- mirascope/api/_generated/errors/payment_required_error.py +0 -15
- mirascope/api/_generated/errors/service_unavailable_error.py +0 -14
- mirascope/api/_generated/errors/too_many_requests_error.py +0 -15
- mirascope/api/_generated/errors/unauthorized_error.py +0 -11
- mirascope/api/_generated/functions/__init__.py +0 -39
- mirascope/api/_generated/functions/client.py +0 -647
- mirascope/api/_generated/functions/raw_client.py +0 -1890
- mirascope/api/_generated/functions/types/__init__.py +0 -53
- mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +0 -20
- mirascope/api/_generated/functions/types/functions_create_response.py +0 -37
- mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +0 -20
- mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +0 -39
- mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +0 -20
- mirascope/api/_generated/functions/types/functions_get_by_env_response.py +0 -53
- mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +0 -22
- mirascope/api/_generated/functions/types/functions_get_response.py +0 -37
- mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +0 -20
- mirascope/api/_generated/functions/types/functions_list_by_env_response.py +0 -25
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +0 -56
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +0 -22
- mirascope/api/_generated/functions/types/functions_list_response.py +0 -21
- mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +0 -41
- mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +0 -20
- mirascope/api/_generated/health/__init__.py +0 -7
- mirascope/api/_generated/health/client.py +0 -92
- mirascope/api/_generated/health/raw_client.py +0 -175
- mirascope/api/_generated/health/types/__init__.py +0 -8
- mirascope/api/_generated/health/types/health_check_response.py +0 -22
- mirascope/api/_generated/health/types/health_check_response_status.py +0 -5
- mirascope/api/_generated/organization_invitations/__init__.py +0 -33
- mirascope/api/_generated/organization_invitations/client.py +0 -546
- mirascope/api/_generated/organization_invitations/raw_client.py +0 -1519
- mirascope/api/_generated/organization_invitations/types/__init__.py +0 -53
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +0 -34
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +0 -48
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +0 -48
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +0 -48
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +0 -7
- mirascope/api/_generated/organization_memberships/__init__.py +0 -19
- mirascope/api/_generated/organization_memberships/client.py +0 -302
- mirascope/api/_generated/organization_memberships/raw_client.py +0 -736
- mirascope/api/_generated/organization_memberships/types/__init__.py +0 -27
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +0 -33
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +0 -7
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +0 -7
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +0 -31
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +0 -7
- mirascope/api/_generated/organizations/__init__.py +0 -51
- mirascope/api/_generated/organizations/client.py +0 -869
- mirascope/api/_generated/organizations/raw_client.py +0 -2593
- mirascope/api/_generated/organizations/types/__init__.py +0 -71
- mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +0 -24
- mirascope/api/_generated/organizations/types/organizations_create_response.py +0 -26
- mirascope/api/_generated/organizations/types/organizations_create_response_role.py +0 -5
- mirascope/api/_generated/organizations/types/organizations_get_response.py +0 -26
- mirascope/api/_generated/organizations/types/organizations_get_response_role.py +0 -5
- mirascope/api/_generated/organizations/types/organizations_list_response_item.py +0 -26
- mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +0 -5
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +0 -7
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +0 -47
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +0 -33
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +0 -7
- mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +0 -24
- mirascope/api/_generated/organizations/types/organizations_subscription_response.py +0 -53
- mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +0 -7
- mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +0 -26
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +0 -34
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +0 -7
- mirascope/api/_generated/organizations/types/organizations_update_response.py +0 -26
- mirascope/api/_generated/organizations/types/organizations_update_response_role.py +0 -5
- mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +0 -7
- mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +0 -35
- mirascope/api/_generated/project_memberships/__init__.py +0 -25
- mirascope/api/_generated/project_memberships/client.py +0 -437
- mirascope/api/_generated/project_memberships/raw_client.py +0 -1039
- mirascope/api/_generated/project_memberships/types/__init__.py +0 -29
- mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +0 -7
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +0 -35
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +0 -7
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +0 -33
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +0 -7
- mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +0 -7
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +0 -35
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +0 -7
- mirascope/api/_generated/projects/__init__.py +0 -7
- mirascope/api/_generated/projects/client.py +0 -428
- mirascope/api/_generated/projects/raw_client.py +0 -1302
- mirascope/api/_generated/projects/types/__init__.py +0 -10
- mirascope/api/_generated/projects/types/projects_create_response.py +0 -25
- mirascope/api/_generated/projects/types/projects_get_response.py +0 -25
- mirascope/api/_generated/projects/types/projects_list_response_item.py +0 -25
- mirascope/api/_generated/projects/types/projects_update_response.py +0 -25
- mirascope/api/_generated/reference.md +0 -4915
- mirascope/api/_generated/tags/__init__.py +0 -19
- mirascope/api/_generated/tags/client.py +0 -504
- mirascope/api/_generated/tags/raw_client.py +0 -1288
- mirascope/api/_generated/tags/types/__init__.py +0 -17
- mirascope/api/_generated/tags/types/tags_create_response.py +0 -41
- mirascope/api/_generated/tags/types/tags_get_response.py +0 -41
- mirascope/api/_generated/tags/types/tags_list_response.py +0 -23
- mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +0 -41
- mirascope/api/_generated/tags/types/tags_update_response.py +0 -41
- mirascope/api/_generated/token_cost/__init__.py +0 -7
- mirascope/api/_generated/token_cost/client.py +0 -160
- mirascope/api/_generated/token_cost/raw_client.py +0 -264
- mirascope/api/_generated/token_cost/types/__init__.py +0 -8
- mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +0 -54
- mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +0 -52
- mirascope/api/_generated/traces/__init__.py +0 -97
- mirascope/api/_generated/traces/client.py +0 -1103
- mirascope/api/_generated/traces/raw_client.py +0 -2322
- mirascope/api/_generated/traces/types/__init__.py +0 -155
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +0 -29
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +0 -27
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +0 -23
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +0 -38
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +0 -19
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +0 -22
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +0 -20
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +0 -29
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +0 -31
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +0 -23
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +0 -38
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +0 -19
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +0 -22
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +0 -22
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +0 -48
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +0 -23
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +0 -38
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +0 -19
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +0 -24
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +0 -22
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +0 -20
- mirascope/api/_generated/traces/types/traces_create_response.py +0 -24
- mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +0 -22
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +0 -60
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +0 -24
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +0 -22
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +0 -33
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +0 -88
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +0 -33
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +0 -88
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +0 -25
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +0 -44
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +0 -26
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +0 -7
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +0 -7
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +0 -7
- mirascope/api/_generated/traces/types/traces_search_by_env_response.py +0 -26
- mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +0 -50
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +0 -26
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +0 -7
- mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +0 -7
- mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +0 -5
- mirascope/api/_generated/traces/types/traces_search_response.py +0 -26
- mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +0 -50
- mirascope/api/_generated/types/__init__.py +0 -85
- mirascope/api/_generated/types/already_exists_error.py +0 -22
- mirascope/api/_generated/types/already_exists_error_tag.py +0 -5
- mirascope/api/_generated/types/bad_request_error_body.py +0 -50
- mirascope/api/_generated/types/click_house_error.py +0 -22
- mirascope/api/_generated/types/database_error.py +0 -22
- mirascope/api/_generated/types/database_error_tag.py +0 -5
- mirascope/api/_generated/types/date.py +0 -3
- mirascope/api/_generated/types/http_api_decode_error.py +0 -27
- mirascope/api/_generated/types/http_api_decode_error_tag.py +0 -5
- mirascope/api/_generated/types/immutable_resource_error.py +0 -22
- mirascope/api/_generated/types/internal_server_error_body.py +0 -49
- mirascope/api/_generated/types/issue.py +0 -38
- mirascope/api/_generated/types/issue_tag.py +0 -10
- mirascope/api/_generated/types/not_found_error_body.py +0 -22
- mirascope/api/_generated/types/not_found_error_tag.py +0 -5
- mirascope/api/_generated/types/number_from_string.py +0 -3
- mirascope/api/_generated/types/permission_denied_error.py +0 -22
- mirascope/api/_generated/types/permission_denied_error_tag.py +0 -5
- mirascope/api/_generated/types/plan_limit_exceeded_error.py +0 -32
- mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +0 -7
- mirascope/api/_generated/types/pricing_unavailable_error.py +0 -23
- mirascope/api/_generated/types/property_key.py +0 -7
- mirascope/api/_generated/types/property_key_key.py +0 -25
- mirascope/api/_generated/types/property_key_key_tag.py +0 -5
- mirascope/api/_generated/types/rate_limit_error.py +0 -31
- mirascope/api/_generated/types/rate_limit_error_tag.py +0 -5
- mirascope/api/_generated/types/service_unavailable_error_body.py +0 -24
- mirascope/api/_generated/types/service_unavailable_error_tag.py +0 -7
- mirascope/api/_generated/types/stripe_error.py +0 -20
- mirascope/api/_generated/types/subscription_past_due_error.py +0 -31
- mirascope/api/_generated/types/subscription_past_due_error_tag.py +0 -7
- mirascope/api/_generated/types/unauthorized_error_body.py +0 -21
- mirascope/api/_generated/types/unauthorized_error_tag.py +0 -5
- mirascope/api/client.py +0 -255
- mirascope/api/settings.py +0 -99
- mirascope/llm/formatting/output_parser.py +0 -178
- mirascope/llm/formatting/primitives.py +0 -192
- mirascope/llm/mcp/mcp_client.py +0 -130
- mirascope/llm/messages/_utils.py +0 -34
- mirascope/llm/models/thinking_config.py +0 -61
- mirascope/llm/prompts/prompts.py +0 -487
- mirascope/llm/providers/__init__.py +0 -62
- mirascope/llm/providers/anthropic/__init__.py +0 -11
- mirascope/llm/providers/anthropic/_utils/__init__.py +0 -27
- mirascope/llm/providers/anthropic/_utils/beta_decode.py +0 -282
- mirascope/llm/providers/anthropic/_utils/beta_encode.py +0 -266
- mirascope/llm/providers/anthropic/_utils/encode.py +0 -418
- mirascope/llm/providers/anthropic/_utils/errors.py +0 -46
- mirascope/llm/providers/anthropic/beta_provider.py +0 -374
- mirascope/llm/providers/anthropic/model_id.py +0 -23
- mirascope/llm/providers/anthropic/model_info.py +0 -87
- mirascope/llm/providers/anthropic/provider.py +0 -479
- mirascope/llm/providers/google/__init__.py +0 -6
- mirascope/llm/providers/google/_utils/errors.py +0 -50
- mirascope/llm/providers/google/model_id.py +0 -22
- mirascope/llm/providers/google/model_info.py +0 -63
- mirascope/llm/providers/google/provider.py +0 -492
- mirascope/llm/providers/mirascope/__init__.py +0 -5
- mirascope/llm/providers/mirascope/_utils.py +0 -73
- mirascope/llm/providers/mirascope/provider.py +0 -349
- mirascope/llm/providers/mlx/__init__.py +0 -9
- mirascope/llm/providers/mlx/_utils.py +0 -141
- mirascope/llm/providers/mlx/encoding/__init__.py +0 -8
- mirascope/llm/providers/mlx/encoding/base.py +0 -72
- mirascope/llm/providers/mlx/encoding/transformers.py +0 -150
- mirascope/llm/providers/mlx/mlx.py +0 -254
- mirascope/llm/providers/mlx/model_id.py +0 -17
- mirascope/llm/providers/mlx/provider.py +0 -452
- mirascope/llm/providers/model_id.py +0 -16
- mirascope/llm/providers/ollama/__init__.py +0 -7
- mirascope/llm/providers/ollama/provider.py +0 -71
- mirascope/llm/providers/openai/__init__.py +0 -15
- mirascope/llm/providers/openai/_utils/__init__.py +0 -5
- mirascope/llm/providers/openai/_utils/errors.py +0 -46
- mirascope/llm/providers/openai/completions/__init__.py +0 -7
- mirascope/llm/providers/openai/completions/base_provider.py +0 -542
- mirascope/llm/providers/openai/completions/provider.py +0 -22
- mirascope/llm/providers/openai/model_id.py +0 -31
- mirascope/llm/providers/openai/model_info.py +0 -303
- mirascope/llm/providers/openai/provider.py +0 -441
- mirascope/llm/providers/openai/responses/__init__.py +0 -5
- mirascope/llm/providers/openai/responses/provider.py +0 -513
- mirascope/llm/providers/provider_id.py +0 -24
- mirascope/llm/providers/provider_registry.py +0 -299
- mirascope/llm/providers/together/__init__.py +0 -7
- mirascope/llm/providers/together/provider.py +0 -40
- mirascope/llm/responses/usage.py +0 -95
- mirascope/ops/__init__.py +0 -111
- mirascope/ops/_internal/__init__.py +0 -5
- mirascope/ops/_internal/closure.py +0 -1169
- mirascope/ops/_internal/configuration.py +0 -177
- mirascope/ops/_internal/context.py +0 -76
- mirascope/ops/_internal/exporters/__init__.py +0 -26
- mirascope/ops/_internal/exporters/exporters.py +0 -395
- mirascope/ops/_internal/exporters/processors.py +0 -104
- mirascope/ops/_internal/exporters/types.py +0 -165
- mirascope/ops/_internal/exporters/utils.py +0 -29
- mirascope/ops/_internal/instrumentation/__init__.py +0 -8
- mirascope/ops/_internal/instrumentation/llm/__init__.py +0 -8
- mirascope/ops/_internal/instrumentation/llm/common.py +0 -530
- mirascope/ops/_internal/instrumentation/llm/cost.py +0 -190
- mirascope/ops/_internal/instrumentation/llm/encode.py +0 -238
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +0 -38
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +0 -31
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +0 -38
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +0 -18
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +0 -100
- mirascope/ops/_internal/instrumentation/llm/llm.py +0 -161
- mirascope/ops/_internal/instrumentation/llm/model.py +0 -1798
- mirascope/ops/_internal/instrumentation/llm/response.py +0 -521
- mirascope/ops/_internal/instrumentation/llm/serialize.py +0 -300
- mirascope/ops/_internal/propagation.py +0 -198
- mirascope/ops/_internal/protocols.py +0 -133
- mirascope/ops/_internal/session.py +0 -139
- mirascope/ops/_internal/spans.py +0 -232
- mirascope/ops/_internal/traced_calls.py +0 -375
- mirascope/ops/_internal/traced_functions.py +0 -523
- mirascope/ops/_internal/tracing.py +0 -353
- mirascope/ops/_internal/types.py +0 -13
- mirascope/ops/_internal/utils.py +0 -123
- mirascope/ops/_internal/versioned_calls.py +0 -512
- mirascope/ops/_internal/versioned_functions.py +0 -357
- mirascope/ops/_internal/versioning.py +0 -303
- mirascope/ops/exceptions.py +0 -21
- mirascope-2.0.0.dist-info/RECORD +0 -423
- /mirascope/llm/{providers → clients}/base/kwargs.py +0 -0
- /mirascope/llm/{providers → clients}/google/message.py +0 -0
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
-
|
|
3
|
-
import typing
|
|
4
|
-
|
|
5
|
-
import pydantic
|
|
6
|
-
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class PricingUnavailableError(UniversalBaseModel):
|
|
10
|
-
message: str
|
|
11
|
-
provider: typing.Optional[str] = None
|
|
12
|
-
model: typing.Optional[str] = None
|
|
13
|
-
|
|
14
|
-
if IS_PYDANTIC_V2:
|
|
15
|
-
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(
|
|
16
|
-
extra="allow", frozen=True
|
|
17
|
-
) # type: ignore # Pydantic v2
|
|
18
|
-
else:
|
|
19
|
-
|
|
20
|
-
class Config:
|
|
21
|
-
frozen = True
|
|
22
|
-
smart_union = True
|
|
23
|
-
extra = pydantic.Extra.allow
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
-
|
|
3
|
-
import typing
|
|
4
|
-
|
|
5
|
-
import pydantic
|
|
6
|
-
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
|
|
7
|
-
from .property_key_key_tag import PropertyKeyKeyTag
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class PropertyKeyKey(UniversalBaseModel):
|
|
11
|
-
"""
|
|
12
|
-
an object to be decoded into a globally shared symbol
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
tag: PropertyKeyKeyTag
|
|
16
|
-
key: str
|
|
17
|
-
|
|
18
|
-
if IS_PYDANTIC_V2:
|
|
19
|
-
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
20
|
-
else:
|
|
21
|
-
|
|
22
|
-
class Config:
|
|
23
|
-
frozen = True
|
|
24
|
-
smart_union = True
|
|
25
|
-
extra = pydantic.Extra.allow
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
-
|
|
3
|
-
import typing
|
|
4
|
-
|
|
5
|
-
import pydantic
|
|
6
|
-
import typing_extensions
|
|
7
|
-
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
|
|
8
|
-
from ..core.serialization import FieldMetadata
|
|
9
|
-
from .rate_limit_error_tag import RateLimitErrorTag
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class RateLimitError(UniversalBaseModel):
|
|
13
|
-
message: str
|
|
14
|
-
organization_id: typing_extensions.Annotated[
|
|
15
|
-
str, FieldMetadata(alias="organizationId")
|
|
16
|
-
]
|
|
17
|
-
limit: float
|
|
18
|
-
retry_after: typing_extensions.Annotated[float, FieldMetadata(alias="retryAfter")]
|
|
19
|
-
plan_tier: typing_extensions.Annotated[str, FieldMetadata(alias="planTier")]
|
|
20
|
-
tag: RateLimitErrorTag
|
|
21
|
-
|
|
22
|
-
if IS_PYDANTIC_V2:
|
|
23
|
-
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(
|
|
24
|
-
extra="allow", frozen=True
|
|
25
|
-
) # type: ignore # Pydantic v2
|
|
26
|
-
else:
|
|
27
|
-
|
|
28
|
-
class Config:
|
|
29
|
-
frozen = True
|
|
30
|
-
smart_union = True
|
|
31
|
-
extra = pydantic.Extra.allow
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
-
|
|
3
|
-
import typing
|
|
4
|
-
|
|
5
|
-
import pydantic
|
|
6
|
-
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
|
|
7
|
-
from .service_unavailable_error_tag import ServiceUnavailableErrorTag
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class ServiceUnavailableErrorBody(UniversalBaseModel):
|
|
11
|
-
message: str
|
|
12
|
-
service: typing.Optional[str] = None
|
|
13
|
-
tag: ServiceUnavailableErrorTag
|
|
14
|
-
|
|
15
|
-
if IS_PYDANTIC_V2:
|
|
16
|
-
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(
|
|
17
|
-
extra="allow", frozen=True
|
|
18
|
-
) # type: ignore # Pydantic v2
|
|
19
|
-
else:
|
|
20
|
-
|
|
21
|
-
class Config:
|
|
22
|
-
frozen = True
|
|
23
|
-
smart_union = True
|
|
24
|
-
extra = pydantic.Extra.allow
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
-
|
|
3
|
-
import typing
|
|
4
|
-
|
|
5
|
-
import pydantic
|
|
6
|
-
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class StripeError(UniversalBaseModel):
|
|
10
|
-
message: str
|
|
11
|
-
cause: typing.Optional[typing.Optional[typing.Any]] = None
|
|
12
|
-
|
|
13
|
-
if IS_PYDANTIC_V2:
|
|
14
|
-
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
15
|
-
else:
|
|
16
|
-
|
|
17
|
-
class Config:
|
|
18
|
-
frozen = True
|
|
19
|
-
smart_union = True
|
|
20
|
-
extra = pydantic.Extra.allow
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
-
|
|
3
|
-
import typing
|
|
4
|
-
|
|
5
|
-
import pydantic
|
|
6
|
-
import typing_extensions
|
|
7
|
-
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
|
|
8
|
-
from ..core.serialization import FieldMetadata
|
|
9
|
-
from .subscription_past_due_error_tag import SubscriptionPastDueErrorTag
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class SubscriptionPastDueError(UniversalBaseModel):
|
|
13
|
-
message: str
|
|
14
|
-
stripe_customer_id: typing_extensions.Annotated[
|
|
15
|
-
str, FieldMetadata(alias="stripeCustomerId")
|
|
16
|
-
]
|
|
17
|
-
past_due_subscription_ids: typing_extensions.Annotated[
|
|
18
|
-
typing.List[str], FieldMetadata(alias="pastDueSubscriptionIds")
|
|
19
|
-
]
|
|
20
|
-
tag: SubscriptionPastDueErrorTag
|
|
21
|
-
|
|
22
|
-
if IS_PYDANTIC_V2:
|
|
23
|
-
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(
|
|
24
|
-
extra="allow", frozen=True
|
|
25
|
-
) # type: ignore # Pydantic v2
|
|
26
|
-
else:
|
|
27
|
-
|
|
28
|
-
class Config:
|
|
29
|
-
frozen = True
|
|
30
|
-
smart_union = True
|
|
31
|
-
extra = pydantic.Extra.allow
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
-
|
|
3
|
-
import typing
|
|
4
|
-
|
|
5
|
-
import pydantic
|
|
6
|
-
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
|
|
7
|
-
from .unauthorized_error_tag import UnauthorizedErrorTag
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class UnauthorizedErrorBody(UniversalBaseModel):
|
|
11
|
-
message: str
|
|
12
|
-
tag: UnauthorizedErrorTag
|
|
13
|
-
|
|
14
|
-
if IS_PYDANTIC_V2:
|
|
15
|
-
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
16
|
-
else:
|
|
17
|
-
|
|
18
|
-
class Config:
|
|
19
|
-
frozen = True
|
|
20
|
-
smart_union = True
|
|
21
|
-
extra = pydantic.Extra.allow
|
mirascope/api/client.py
DELETED
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
"""Client interfaces and factory for Mirascope SDK.
|
|
2
|
-
|
|
3
|
-
This module provides interfaces and factory functions for creating Mirascope clients
|
|
4
|
-
that support both the Fern-generated API client and OpenTelemetry exporters.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import asyncio
|
|
10
|
-
import logging
|
|
11
|
-
import weakref
|
|
12
|
-
from collections.abc import Callable
|
|
13
|
-
from functools import lru_cache
|
|
14
|
-
from typing import ParamSpec, TypeAlias, TypeVar
|
|
15
|
-
|
|
16
|
-
import httpx
|
|
17
|
-
|
|
18
|
-
from ._generated.client import (
|
|
19
|
-
AsyncMirascope as _BaseAsyncMirascope,
|
|
20
|
-
Mirascope as _BaseMirascope,
|
|
21
|
-
)
|
|
22
|
-
from .settings import get_settings
|
|
23
|
-
|
|
24
|
-
ApiKey: TypeAlias = str
|
|
25
|
-
BaseUrl: TypeAlias = str
|
|
26
|
-
Token: TypeAlias = str | Callable[[], str] | None
|
|
27
|
-
_P = ParamSpec("_P")
|
|
28
|
-
_R = TypeVar("_R")
|
|
29
|
-
|
|
30
|
-
logger = logging.getLogger(__name__)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class Mirascope(_BaseMirascope):
|
|
34
|
-
"""Enhanced Mirascope client with error handling.
|
|
35
|
-
|
|
36
|
-
This client automatically handles API errors and provides fallback behavior
|
|
37
|
-
for non-critical failures while preserving important exceptions like NotFoundError.
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
def __init__(
|
|
41
|
-
self,
|
|
42
|
-
*,
|
|
43
|
-
base_url: str | None = None,
|
|
44
|
-
api_key: str | None = None,
|
|
45
|
-
token: Token = None,
|
|
46
|
-
timeout: float | None = None,
|
|
47
|
-
follow_redirects: bool | None = True,
|
|
48
|
-
httpx_client: httpx.Client | None = None,
|
|
49
|
-
) -> None:
|
|
50
|
-
"""Initialize the enhanced Mirascope client."""
|
|
51
|
-
try:
|
|
52
|
-
settings = get_settings()
|
|
53
|
-
self.api_key = api_key or settings.api_key
|
|
54
|
-
if not self.api_key:
|
|
55
|
-
raise ValueError("`Mirascope` client requires `api_key`.")
|
|
56
|
-
|
|
57
|
-
self.base_url = base_url or settings.base_url
|
|
58
|
-
|
|
59
|
-
headers = {"Authorization": f"Bearer {self.api_key}"}
|
|
60
|
-
if httpx_client:
|
|
61
|
-
if hasattr(httpx_client, "headers"):
|
|
62
|
-
httpx_client.headers.update(headers)
|
|
63
|
-
else:
|
|
64
|
-
httpx_client = httpx.Client(
|
|
65
|
-
headers=headers,
|
|
66
|
-
timeout=timeout or 30.0,
|
|
67
|
-
follow_redirects=follow_redirects
|
|
68
|
-
if follow_redirects is not None
|
|
69
|
-
else True,
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
super().__init__(
|
|
73
|
-
base_url=self.base_url,
|
|
74
|
-
timeout=timeout,
|
|
75
|
-
follow_redirects=follow_redirects,
|
|
76
|
-
httpx_client=httpx_client,
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
except Exception as e:
|
|
80
|
-
logger.error("Failed to initialize Mirascope client: %s", e)
|
|
81
|
-
raise RuntimeError(f"Client initialization failed: {e}") from e
|
|
82
|
-
|
|
83
|
-
def close(self) -> None:
|
|
84
|
-
"""Close the underlying synchronous HTTP client."""
|
|
85
|
-
wrapper_client = getattr(self._client_wrapper, "httpx_client", None)
|
|
86
|
-
underlying_httpx_client = getattr(wrapper_client, "httpx_client", None)
|
|
87
|
-
if underlying_httpx_client is not None:
|
|
88
|
-
underlying_httpx_client.close()
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
class AsyncMirascope(_BaseAsyncMirascope):
|
|
92
|
-
"""Enhanced async Mirascope client with error handling.
|
|
93
|
-
|
|
94
|
-
This client automatically handles API errors and provides fallback behavior
|
|
95
|
-
for non-critical failures while preserving important exceptions like NotFoundError.
|
|
96
|
-
"""
|
|
97
|
-
|
|
98
|
-
def __init__(
|
|
99
|
-
self,
|
|
100
|
-
*,
|
|
101
|
-
base_url: str | None = None,
|
|
102
|
-
api_key: str | None = None,
|
|
103
|
-
token: Token = None,
|
|
104
|
-
timeout: float | None = None,
|
|
105
|
-
follow_redirects: bool | None = True,
|
|
106
|
-
httpx_client: httpx.AsyncClient | None = None,
|
|
107
|
-
) -> None:
|
|
108
|
-
"""Initialize the enhanced async Mirascope client."""
|
|
109
|
-
try:
|
|
110
|
-
settings = get_settings()
|
|
111
|
-
self.api_key = api_key or settings.api_key
|
|
112
|
-
if not self.api_key:
|
|
113
|
-
raise ValueError("`AsyncMirascope` client requires `api_key`.")
|
|
114
|
-
|
|
115
|
-
self.base_url = base_url or settings.base_url
|
|
116
|
-
|
|
117
|
-
headers = {"Authorization": f"Bearer {self.api_key}"}
|
|
118
|
-
if httpx_client:
|
|
119
|
-
if hasattr(httpx_client, "headers"):
|
|
120
|
-
httpx_client.headers.update(headers)
|
|
121
|
-
else:
|
|
122
|
-
httpx_client = httpx.AsyncClient(
|
|
123
|
-
headers=headers,
|
|
124
|
-
timeout=timeout or 30.0,
|
|
125
|
-
follow_redirects=follow_redirects
|
|
126
|
-
if follow_redirects is not None
|
|
127
|
-
else True,
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
super().__init__(
|
|
131
|
-
base_url=self.base_url,
|
|
132
|
-
timeout=timeout,
|
|
133
|
-
follow_redirects=follow_redirects,
|
|
134
|
-
httpx_client=httpx_client,
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
except Exception as e:
|
|
138
|
-
logger.error("Failed to initialize AsyncMirascope client: %s", e)
|
|
139
|
-
raise RuntimeError(f"Async client initialization failed: {e}") from e
|
|
140
|
-
|
|
141
|
-
async def aclose(self) -> None:
|
|
142
|
-
"""Close the underlying asynchronous HTTP client."""
|
|
143
|
-
wrapper_client = getattr(self._client_wrapper, "httpx_client", None)
|
|
144
|
-
underlying_httpx_client = getattr(wrapper_client, "httpx_client", None)
|
|
145
|
-
if underlying_httpx_client is not None:
|
|
146
|
-
await underlying_httpx_client.aclose()
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
@lru_cache(maxsize=256)
|
|
150
|
-
def _sync_singleton(api_key: str | None, base_url: str | None) -> Mirascope:
|
|
151
|
-
"""Return the process-wide synchronous client, creating one if none yet exists"""
|
|
152
|
-
try:
|
|
153
|
-
logger.debug("Creating sync client with api_key=*****, base_url=%s", base_url)
|
|
154
|
-
return Mirascope(api_key=api_key, base_url=base_url)
|
|
155
|
-
except Exception as e:
|
|
156
|
-
logger.error("Failed to create singleton Mirascope client: %s", e)
|
|
157
|
-
raise RuntimeError(f"Failed to create cached client: {e}") from e
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
def get_sync_client(
|
|
161
|
-
api_key: str | None = None,
|
|
162
|
-
base_url: str | None = None,
|
|
163
|
-
) -> Mirascope:
|
|
164
|
-
"""Get or create a cached synchronous client.
|
|
165
|
-
|
|
166
|
-
Args:
|
|
167
|
-
api_key: API key for authentication
|
|
168
|
-
base_url: Base URL for the API
|
|
169
|
-
|
|
170
|
-
Returns:
|
|
171
|
-
Cached Mirascope client instance
|
|
172
|
-
"""
|
|
173
|
-
settings = get_settings()
|
|
174
|
-
|
|
175
|
-
return _sync_singleton(
|
|
176
|
-
api_key or settings.api_key,
|
|
177
|
-
base_url or settings.base_url,
|
|
178
|
-
)
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
@lru_cache(maxsize=256)
|
|
182
|
-
def _async_singleton(
|
|
183
|
-
_loop_id_for_cache: int, api_key: str | None, base_url: str | None
|
|
184
|
-
) -> AsyncMirascope:
|
|
185
|
-
"""Return the loop-specific asynchronous client, creating one if none yet exists"""
|
|
186
|
-
try:
|
|
187
|
-
logger.debug("Creating async client with api_key=*****, base_url=%s", base_url)
|
|
188
|
-
loop = asyncio.get_running_loop()
|
|
189
|
-
client = AsyncMirascope(api_key=api_key, base_url=base_url)
|
|
190
|
-
weakref.finalize(loop, _async_singleton.cache_clear)
|
|
191
|
-
return client
|
|
192
|
-
except Exception as e:
|
|
193
|
-
logger.error("Failed to create singleton AsyncMirascope client: %s", e)
|
|
194
|
-
raise RuntimeError(f"Failed to create cached async client: {e}") from e
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
def get_async_client(
|
|
198
|
-
api_key: str | None = None,
|
|
199
|
-
base_url: str | None = None,
|
|
200
|
-
) -> AsyncMirascope:
|
|
201
|
-
"""Get or create a cached asynchronous client.
|
|
202
|
-
|
|
203
|
-
Args:
|
|
204
|
-
api_key: API key for authentication
|
|
205
|
-
base_url: Base URL for the API
|
|
206
|
-
|
|
207
|
-
Returns:
|
|
208
|
-
Cached AsyncMirascope client instance
|
|
209
|
-
"""
|
|
210
|
-
try:
|
|
211
|
-
loop = asyncio.get_running_loop()
|
|
212
|
-
except RuntimeError as exc:
|
|
213
|
-
raise RuntimeError(
|
|
214
|
-
"get_async_client() must be called from within an active event loop."
|
|
215
|
-
) from exc
|
|
216
|
-
|
|
217
|
-
settings = get_settings()
|
|
218
|
-
|
|
219
|
-
return _async_singleton(
|
|
220
|
-
id(loop),
|
|
221
|
-
api_key or settings.api_key,
|
|
222
|
-
base_url or settings.base_url,
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
def create_export_client(
|
|
227
|
-
*,
|
|
228
|
-
base_url: str | None = None,
|
|
229
|
-
api_key: str | None = None,
|
|
230
|
-
timeout: float = 30.0,
|
|
231
|
-
httpx_client: httpx.Client | None = None,
|
|
232
|
-
) -> Mirascope:
|
|
233
|
-
"""Create a client suitable for OpenTelemetry export.
|
|
234
|
-
|
|
235
|
-
Args:
|
|
236
|
-
base_url: Base URL for the API
|
|
237
|
-
api_key: API key for authentication
|
|
238
|
-
timeout: Request timeout in seconds
|
|
239
|
-
httpx_client: Optional custom httpx client
|
|
240
|
-
|
|
241
|
-
Returns:
|
|
242
|
-
Mirascope client configured for export use
|
|
243
|
-
"""
|
|
244
|
-
return Mirascope(
|
|
245
|
-
base_url=base_url,
|
|
246
|
-
api_key=api_key,
|
|
247
|
-
timeout=timeout,
|
|
248
|
-
httpx_client=httpx_client,
|
|
249
|
-
)
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
def close_cached_clients() -> None:
|
|
253
|
-
"""Close all cached client instances."""
|
|
254
|
-
_sync_singleton.cache_clear()
|
|
255
|
-
_async_singleton.cache_clear()
|
mirascope/api/settings.py
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
"""Settings and configuration for Mirascope SDK."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from collections.abc import Iterator
|
|
6
|
-
from contextlib import contextmanager
|
|
7
|
-
from contextvars import ContextVar
|
|
8
|
-
from functools import cache
|
|
9
|
-
from typing import Any
|
|
10
|
-
|
|
11
|
-
from pydantic import Field
|
|
12
|
-
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class Settings(BaseSettings):
|
|
16
|
-
"""Global settings for Mirascope SDK."""
|
|
17
|
-
|
|
18
|
-
base_url: str = Field(default="https://v2.mirascope.com")
|
|
19
|
-
api_key: str | None = None
|
|
20
|
-
|
|
21
|
-
def update(self, **kwargs: Any) -> None: # noqa: ANN401
|
|
22
|
-
"""Update non-None fields in place."""
|
|
23
|
-
for k, v in kwargs.items():
|
|
24
|
-
if v is not None and hasattr(self, k):
|
|
25
|
-
setattr(self, k, v)
|
|
26
|
-
|
|
27
|
-
model_config = SettingsConfigDict(env_prefix="MIRASCOPE_")
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@cache
|
|
31
|
-
def _default_settings() -> Settings:
|
|
32
|
-
return Settings()
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
CURRENT_SETTINGS: ContextVar[Settings | None] = ContextVar(
|
|
36
|
-
"CURRENT_SETTINGS", default=None
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def get_settings() -> Settings:
|
|
41
|
-
"""Return Settings for the current context."""
|
|
42
|
-
settings = CURRENT_SETTINGS.get()
|
|
43
|
-
if settings is None:
|
|
44
|
-
settings = _default_settings()
|
|
45
|
-
CURRENT_SETTINGS.set(settings)
|
|
46
|
-
return settings
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def update_settings(
|
|
50
|
-
*,
|
|
51
|
-
api_key: str | None = None,
|
|
52
|
-
base_url: str | None = None,
|
|
53
|
-
) -> None:
|
|
54
|
-
"""Update the current settings with provided values.
|
|
55
|
-
|
|
56
|
-
This allows programmatic configuration of settings (e.g., from ops.configure)
|
|
57
|
-
that will be used by get_sync_client() and get_async_client().
|
|
58
|
-
|
|
59
|
-
Args:
|
|
60
|
-
api_key: API key to set (if provided)
|
|
61
|
-
base_url: Base URL to set (if provided)
|
|
62
|
-
"""
|
|
63
|
-
current = get_settings()
|
|
64
|
-
current.update(api_key=api_key, base_url=base_url)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
@contextmanager
|
|
68
|
-
def settings(
|
|
69
|
-
base_url: str | None = None,
|
|
70
|
-
api_key: str | None = None,
|
|
71
|
-
) -> Iterator[Settings]:
|
|
72
|
-
"""Context manager for temporarily overriding settings.
|
|
73
|
-
|
|
74
|
-
Args:
|
|
75
|
-
base_url: Override the base URL for API calls
|
|
76
|
-
api_key: Override the API key
|
|
77
|
-
|
|
78
|
-
Yields:
|
|
79
|
-
Settings instance with overrides applied
|
|
80
|
-
|
|
81
|
-
Example:
|
|
82
|
-
with settings(base_url="https://api.example.com", api_key="test-key"):
|
|
83
|
-
# Use custom settings within this context
|
|
84
|
-
client = MirascopeClient()
|
|
85
|
-
"""
|
|
86
|
-
current = CURRENT_SETTINGS.get()
|
|
87
|
-
if current is None:
|
|
88
|
-
current = _default_settings()
|
|
89
|
-
|
|
90
|
-
new_settings = Settings(
|
|
91
|
-
base_url=base_url or current.base_url,
|
|
92
|
-
api_key=api_key or current.api_key,
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
token = CURRENT_SETTINGS.set(new_settings)
|
|
96
|
-
try:
|
|
97
|
-
yield new_settings
|
|
98
|
-
finally:
|
|
99
|
-
CURRENT_SETTINGS.reset(token)
|