mirascope 1.0.5__py3-none-any.whl → 2.1.1__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 +6 -6
- mirascope/_stubs.py +384 -0
- mirascope/_utils.py +34 -0
- mirascope/api/__init__.py +14 -0
- mirascope/api/_generated/README.md +207 -0
- mirascope/api/_generated/__init__.py +444 -0
- mirascope/api/_generated/annotations/__init__.py +33 -0
- mirascope/api/_generated/annotations/client.py +506 -0
- mirascope/api/_generated/annotations/raw_client.py +1414 -0
- mirascope/api/_generated/annotations/types/__init__.py +31 -0
- mirascope/api/_generated/annotations/types/annotations_create_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_create_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_create_response_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_get_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_get_response_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_list_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_list_response.py +21 -0
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +50 -0
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_update_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_update_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_update_response_label.py +5 -0
- mirascope/api/_generated/api_keys/__init__.py +17 -0
- mirascope/api/_generated/api_keys/client.py +530 -0
- mirascope/api/_generated/api_keys/raw_client.py +1236 -0
- mirascope/api/_generated/api_keys/types/__init__.py +15 -0
- mirascope/api/_generated/api_keys/types/api_keys_create_response.py +28 -0
- mirascope/api/_generated/api_keys/types/api_keys_get_response.py +27 -0
- mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +40 -0
- mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +27 -0
- mirascope/api/_generated/client.py +211 -0
- mirascope/api/_generated/core/__init__.py +52 -0
- mirascope/api/_generated/core/api_error.py +23 -0
- mirascope/api/_generated/core/client_wrapper.py +46 -0
- mirascope/api/_generated/core/datetime_utils.py +28 -0
- mirascope/api/_generated/core/file.py +67 -0
- mirascope/api/_generated/core/force_multipart.py +16 -0
- mirascope/api/_generated/core/http_client.py +543 -0
- mirascope/api/_generated/core/http_response.py +55 -0
- mirascope/api/_generated/core/jsonable_encoder.py +100 -0
- mirascope/api/_generated/core/pydantic_utilities.py +255 -0
- mirascope/api/_generated/core/query_encoder.py +58 -0
- mirascope/api/_generated/core/remove_none_from_dict.py +11 -0
- mirascope/api/_generated/core/request_options.py +35 -0
- mirascope/api/_generated/core/serialization.py +276 -0
- mirascope/api/_generated/docs/__init__.py +4 -0
- mirascope/api/_generated/docs/client.py +91 -0
- mirascope/api/_generated/docs/raw_client.py +178 -0
- mirascope/api/_generated/environment.py +9 -0
- mirascope/api/_generated/environments/__init__.py +23 -0
- mirascope/api/_generated/environments/client.py +649 -0
- mirascope/api/_generated/environments/raw_client.py +1567 -0
- mirascope/api/_generated/environments/types/__init__.py +25 -0
- mirascope/api/_generated/environments/types/environments_create_response.py +24 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response.py +60 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +24 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +22 -0
- mirascope/api/_generated/environments/types/environments_get_response.py +24 -0
- mirascope/api/_generated/environments/types/environments_list_response_item.py +24 -0
- mirascope/api/_generated/environments/types/environments_update_response.py +24 -0
- mirascope/api/_generated/errors/__init__.py +25 -0
- mirascope/api/_generated/errors/bad_request_error.py +14 -0
- mirascope/api/_generated/errors/conflict_error.py +14 -0
- mirascope/api/_generated/errors/forbidden_error.py +11 -0
- mirascope/api/_generated/errors/internal_server_error.py +10 -0
- mirascope/api/_generated/errors/not_found_error.py +11 -0
- mirascope/api/_generated/errors/payment_required_error.py +15 -0
- mirascope/api/_generated/errors/service_unavailable_error.py +14 -0
- mirascope/api/_generated/errors/too_many_requests_error.py +15 -0
- mirascope/api/_generated/errors/unauthorized_error.py +11 -0
- mirascope/api/_generated/functions/__init__.py +39 -0
- mirascope/api/_generated/functions/client.py +647 -0
- mirascope/api/_generated/functions/raw_client.py +1890 -0
- mirascope/api/_generated/functions/types/__init__.py +53 -0
- mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_create_response.py +37 -0
- mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +39 -0
- mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_get_by_env_response.py +53 -0
- mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +22 -0
- mirascope/api/_generated/functions/types/functions_get_response.py +37 -0
- mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response.py +25 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +56 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +22 -0
- mirascope/api/_generated/functions/types/functions_list_response.py +21 -0
- mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +41 -0
- mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +20 -0
- mirascope/api/_generated/health/__init__.py +7 -0
- mirascope/api/_generated/health/client.py +92 -0
- mirascope/api/_generated/health/raw_client.py +175 -0
- mirascope/api/_generated/health/types/__init__.py +8 -0
- mirascope/api/_generated/health/types/health_check_response.py +22 -0
- mirascope/api/_generated/health/types/health_check_response_status.py +5 -0
- mirascope/api/_generated/organization_invitations/__init__.py +33 -0
- mirascope/api/_generated/organization_invitations/client.py +546 -0
- mirascope/api/_generated/organization_invitations/raw_client.py +1519 -0
- mirascope/api/_generated/organization_invitations/types/__init__.py +53 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +34 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +7 -0
- mirascope/api/_generated/organization_memberships/__init__.py +19 -0
- mirascope/api/_generated/organization_memberships/client.py +302 -0
- mirascope/api/_generated/organization_memberships/raw_client.py +736 -0
- mirascope/api/_generated/organization_memberships/types/__init__.py +27 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +33 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +7 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +7 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +31 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +7 -0
- mirascope/api/_generated/organizations/__init__.py +51 -0
- mirascope/api/_generated/organizations/client.py +869 -0
- mirascope/api/_generated/organizations/raw_client.py +2593 -0
- mirascope/api/_generated/organizations/types/__init__.py +71 -0
- mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +24 -0
- mirascope/api/_generated/organizations/types/organizations_create_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_create_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_get_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_get_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_list_response_item.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +47 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +33 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +24 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response.py +53 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +34 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_update_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_update_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +35 -0
- mirascope/api/_generated/project_memberships/__init__.py +29 -0
- mirascope/api/_generated/project_memberships/client.py +528 -0
- mirascope/api/_generated/project_memberships/raw_client.py +1278 -0
- mirascope/api/_generated/project_memberships/types/__init__.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +35 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_get_response.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_get_response_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +35 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +7 -0
- mirascope/api/_generated/projects/__init__.py +7 -0
- mirascope/api/_generated/projects/client.py +428 -0
- mirascope/api/_generated/projects/raw_client.py +1302 -0
- mirascope/api/_generated/projects/types/__init__.py +10 -0
- mirascope/api/_generated/projects/types/projects_create_response.py +25 -0
- mirascope/api/_generated/projects/types/projects_get_response.py +25 -0
- mirascope/api/_generated/projects/types/projects_list_response_item.py +25 -0
- mirascope/api/_generated/projects/types/projects_update_response.py +25 -0
- mirascope/api/_generated/reference.md +4987 -0
- mirascope/api/_generated/tags/__init__.py +19 -0
- mirascope/api/_generated/tags/client.py +504 -0
- mirascope/api/_generated/tags/raw_client.py +1288 -0
- mirascope/api/_generated/tags/types/__init__.py +17 -0
- mirascope/api/_generated/tags/types/tags_create_response.py +41 -0
- mirascope/api/_generated/tags/types/tags_get_response.py +41 -0
- mirascope/api/_generated/tags/types/tags_list_response.py +23 -0
- mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +41 -0
- mirascope/api/_generated/tags/types/tags_update_response.py +41 -0
- mirascope/api/_generated/token_cost/__init__.py +7 -0
- mirascope/api/_generated/token_cost/client.py +160 -0
- mirascope/api/_generated/token_cost/raw_client.py +264 -0
- mirascope/api/_generated/token_cost/types/__init__.py +8 -0
- mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +54 -0
- mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +52 -0
- mirascope/api/_generated/traces/__init__.py +97 -0
- mirascope/api/_generated/traces/client.py +1103 -0
- mirascope/api/_generated/traces/raw_client.py +2322 -0
- mirascope/api/_generated/traces/types/__init__.py +155 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +29 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +27 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +20 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +29 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +31 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +48 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +24 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +20 -0
- mirascope/api/_generated/traces/types/traces_create_response.py +24 -0
- mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +22 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +60 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +24 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +33 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +88 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +33 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +88 -0
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +25 -0
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +44 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_response.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +50 -0
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +5 -0
- mirascope/api/_generated/traces/types/traces_search_response.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +50 -0
- mirascope/api/_generated/types/__init__.py +85 -0
- mirascope/api/_generated/types/already_exists_error.py +22 -0
- mirascope/api/_generated/types/already_exists_error_tag.py +5 -0
- mirascope/api/_generated/types/bad_request_error_body.py +50 -0
- mirascope/api/_generated/types/click_house_error.py +22 -0
- mirascope/api/_generated/types/database_error.py +22 -0
- mirascope/api/_generated/types/database_error_tag.py +5 -0
- mirascope/api/_generated/types/date.py +3 -0
- mirascope/api/_generated/types/http_api_decode_error.py +27 -0
- mirascope/api/_generated/types/http_api_decode_error_tag.py +5 -0
- mirascope/api/_generated/types/immutable_resource_error.py +22 -0
- mirascope/api/_generated/types/internal_server_error_body.py +49 -0
- mirascope/api/_generated/types/issue.py +38 -0
- mirascope/api/_generated/types/issue_tag.py +10 -0
- mirascope/api/_generated/types/not_found_error_body.py +22 -0
- mirascope/api/_generated/types/not_found_error_tag.py +5 -0
- mirascope/api/_generated/types/number_from_string.py +3 -0
- mirascope/api/_generated/types/permission_denied_error.py +22 -0
- mirascope/api/_generated/types/permission_denied_error_tag.py +5 -0
- mirascope/api/_generated/types/plan_limit_exceeded_error.py +32 -0
- mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +7 -0
- mirascope/api/_generated/types/pricing_unavailable_error.py +23 -0
- mirascope/api/_generated/types/property_key.py +7 -0
- mirascope/api/_generated/types/property_key_key.py +25 -0
- mirascope/api/_generated/types/property_key_key_tag.py +5 -0
- mirascope/api/_generated/types/rate_limit_error.py +31 -0
- mirascope/api/_generated/types/rate_limit_error_tag.py +5 -0
- mirascope/api/_generated/types/service_unavailable_error_body.py +24 -0
- mirascope/api/_generated/types/service_unavailable_error_tag.py +7 -0
- mirascope/api/_generated/types/stripe_error.py +20 -0
- mirascope/api/_generated/types/subscription_past_due_error.py +31 -0
- mirascope/api/_generated/types/subscription_past_due_error_tag.py +7 -0
- mirascope/api/_generated/types/unauthorized_error_body.py +21 -0
- mirascope/api/_generated/types/unauthorized_error_tag.py +5 -0
- mirascope/api/client.py +255 -0
- mirascope/api/settings.py +99 -0
- mirascope/llm/__init__.py +316 -0
- mirascope/llm/calls/__init__.py +17 -0
- mirascope/llm/calls/calls.py +348 -0
- mirascope/llm/calls/decorator.py +268 -0
- mirascope/llm/content/__init__.py +71 -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 +69 -0
- mirascope/llm/content/tool_output.py +43 -0
- mirascope/llm/context/__init__.py +6 -0
- mirascope/llm/context/_utils.py +41 -0
- mirascope/llm/context/context.py +24 -0
- mirascope/llm/exceptions.py +360 -0
- mirascope/llm/formatting/__init__.py +39 -0
- mirascope/llm/formatting/format.py +291 -0
- mirascope/llm/formatting/from_call_args.py +30 -0
- mirascope/llm/formatting/output_parser.py +178 -0
- mirascope/llm/formatting/partial.py +131 -0
- mirascope/llm/formatting/primitives.py +192 -0
- mirascope/llm/formatting/types.py +83 -0
- mirascope/llm/mcp/__init__.py +5 -0
- mirascope/llm/mcp/mcp_client.py +130 -0
- mirascope/llm/messages/__init__.py +35 -0
- mirascope/llm/messages/_utils.py +34 -0
- mirascope/llm/messages/message.py +190 -0
- mirascope/llm/models/__init__.py +21 -0
- mirascope/llm/models/models.py +1339 -0
- mirascope/llm/models/params.py +72 -0
- mirascope/llm/models/thinking_config.py +61 -0
- mirascope/llm/prompts/__init__.py +34 -0
- mirascope/llm/prompts/_utils.py +31 -0
- mirascope/llm/prompts/decorator.py +215 -0
- mirascope/llm/prompts/prompts.py +484 -0
- mirascope/llm/prompts/protocols.py +65 -0
- mirascope/llm/providers/__init__.py +65 -0
- mirascope/llm/providers/anthropic/__init__.py +11 -0
- mirascope/llm/providers/anthropic/_utils/__init__.py +27 -0
- mirascope/llm/providers/anthropic/_utils/beta_decode.py +297 -0
- mirascope/llm/providers/anthropic/_utils/beta_encode.py +272 -0
- mirascope/llm/providers/anthropic/_utils/decode.py +326 -0
- mirascope/llm/providers/anthropic/_utils/encode.py +431 -0
- mirascope/llm/providers/anthropic/_utils/errors.py +46 -0
- mirascope/llm/providers/anthropic/beta_provider.py +338 -0
- mirascope/llm/providers/anthropic/model_id.py +23 -0
- mirascope/llm/providers/anthropic/model_info.py +87 -0
- mirascope/llm/providers/anthropic/provider.py +440 -0
- mirascope/llm/providers/base/__init__.py +14 -0
- mirascope/llm/providers/base/_utils.py +248 -0
- mirascope/llm/providers/base/base_provider.py +1463 -0
- mirascope/llm/providers/base/kwargs.py +12 -0
- mirascope/llm/providers/google/__init__.py +6 -0
- mirascope/llm/providers/google/_utils/__init__.py +17 -0
- mirascope/llm/providers/google/_utils/decode.py +357 -0
- mirascope/llm/providers/google/_utils/encode.py +418 -0
- mirascope/llm/providers/google/_utils/errors.py +50 -0
- mirascope/llm/providers/google/message.py +7 -0
- mirascope/llm/providers/google/model_id.py +22 -0
- mirascope/llm/providers/google/model_info.py +63 -0
- mirascope/llm/providers/google/provider.py +456 -0
- mirascope/llm/providers/mirascope/__init__.py +5 -0
- mirascope/llm/providers/mirascope/_utils.py +73 -0
- mirascope/llm/providers/mirascope/provider.py +313 -0
- mirascope/llm/providers/mlx/__init__.py +9 -0
- mirascope/llm/providers/mlx/_utils.py +141 -0
- mirascope/llm/providers/mlx/encoding/__init__.py +8 -0
- mirascope/llm/providers/mlx/encoding/base.py +69 -0
- mirascope/llm/providers/mlx/encoding/transformers.py +146 -0
- mirascope/llm/providers/mlx/mlx.py +242 -0
- mirascope/llm/providers/mlx/model_id.py +17 -0
- mirascope/llm/providers/mlx/provider.py +416 -0
- mirascope/llm/providers/model_id.py +16 -0
- mirascope/llm/providers/ollama/__init__.py +7 -0
- mirascope/llm/providers/ollama/provider.py +71 -0
- mirascope/llm/providers/openai/__init__.py +15 -0
- mirascope/llm/providers/openai/_utils/__init__.py +5 -0
- mirascope/llm/providers/openai/_utils/errors.py +46 -0
- mirascope/llm/providers/openai/completions/__init__.py +7 -0
- mirascope/llm/providers/openai/completions/_utils/__init__.py +18 -0
- mirascope/llm/providers/openai/completions/_utils/decode.py +252 -0
- mirascope/llm/providers/openai/completions/_utils/encode.py +390 -0
- mirascope/llm/providers/openai/completions/_utils/feature_info.py +50 -0
- mirascope/llm/providers/openai/completions/base_provider.py +522 -0
- mirascope/llm/providers/openai/completions/provider.py +28 -0
- mirascope/llm/providers/openai/model_id.py +31 -0
- mirascope/llm/providers/openai/model_info.py +303 -0
- mirascope/llm/providers/openai/provider.py +405 -0
- mirascope/llm/providers/openai/responses/__init__.py +5 -0
- mirascope/llm/providers/openai/responses/_utils/__init__.py +15 -0
- mirascope/llm/providers/openai/responses/_utils/decode.py +289 -0
- mirascope/llm/providers/openai/responses/_utils/encode.py +399 -0
- mirascope/llm/providers/openai/responses/provider.py +472 -0
- mirascope/llm/providers/openrouter/__init__.py +5 -0
- mirascope/llm/providers/openrouter/provider.py +67 -0
- mirascope/llm/providers/provider_id.py +26 -0
- mirascope/llm/providers/provider_registry.py +305 -0
- mirascope/llm/providers/together/__init__.py +7 -0
- mirascope/llm/providers/together/provider.py +40 -0
- mirascope/llm/responses/__init__.py +66 -0
- mirascope/llm/responses/_utils.py +146 -0
- mirascope/llm/responses/base_response.py +103 -0
- mirascope/llm/responses/base_stream_response.py +824 -0
- mirascope/llm/responses/finish_reason.py +28 -0
- mirascope/llm/responses/response.py +362 -0
- mirascope/llm/responses/root_response.py +248 -0
- mirascope/llm/responses/stream_response.py +577 -0
- mirascope/llm/responses/streams.py +363 -0
- mirascope/llm/responses/usage.py +139 -0
- mirascope/llm/tools/__init__.py +71 -0
- mirascope/llm/tools/_utils.py +34 -0
- mirascope/llm/tools/decorator.py +184 -0
- mirascope/llm/tools/protocols.py +96 -0
- mirascope/llm/tools/provider_tools.py +18 -0
- mirascope/llm/tools/tool_schema.py +321 -0
- mirascope/llm/tools/toolkit.py +178 -0
- mirascope/llm/tools/tools.py +263 -0
- mirascope/llm/tools/types.py +112 -0
- mirascope/llm/tools/web_search_tool.py +32 -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/ops/__init__.py +129 -0
- mirascope/ops/_internal/__init__.py +5 -0
- mirascope/ops/_internal/closure.py +1172 -0
- mirascope/ops/_internal/configuration.py +177 -0
- mirascope/ops/_internal/context.py +76 -0
- mirascope/ops/_internal/exporters/__init__.py +26 -0
- mirascope/ops/_internal/exporters/exporters.py +362 -0
- mirascope/ops/_internal/exporters/processors.py +104 -0
- mirascope/ops/_internal/exporters/types.py +165 -0
- mirascope/ops/_internal/exporters/utils.py +66 -0
- mirascope/ops/_internal/instrumentation/__init__.py +28 -0
- mirascope/ops/_internal/instrumentation/llm/__init__.py +8 -0
- mirascope/ops/_internal/instrumentation/llm/common.py +500 -0
- mirascope/ops/_internal/instrumentation/llm/cost.py +190 -0
- mirascope/ops/_internal/instrumentation/llm/encode.py +238 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +38 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +31 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +38 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +18 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +100 -0
- mirascope/ops/_internal/instrumentation/llm/llm.py +161 -0
- mirascope/ops/_internal/instrumentation/llm/model.py +1777 -0
- mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
- mirascope/ops/_internal/instrumentation/llm/serialize.py +324 -0
- mirascope/ops/_internal/instrumentation/providers/__init__.py +29 -0
- mirascope/ops/_internal/instrumentation/providers/anthropic.py +78 -0
- mirascope/ops/_internal/instrumentation/providers/base.py +179 -0
- mirascope/ops/_internal/instrumentation/providers/google_genai.py +85 -0
- mirascope/ops/_internal/instrumentation/providers/openai.py +82 -0
- mirascope/ops/_internal/propagation.py +198 -0
- mirascope/ops/_internal/protocols.py +133 -0
- mirascope/ops/_internal/session.py +139 -0
- mirascope/ops/_internal/spans.py +232 -0
- mirascope/ops/_internal/traced_calls.py +389 -0
- mirascope/ops/_internal/traced_functions.py +528 -0
- mirascope/ops/_internal/tracing.py +353 -0
- mirascope/ops/_internal/types.py +13 -0
- mirascope/ops/_internal/utils.py +131 -0
- mirascope/ops/_internal/versioned_calls.py +512 -0
- mirascope/ops/_internal/versioned_functions.py +357 -0
- mirascope/ops/_internal/versioning.py +303 -0
- mirascope/ops/exceptions.py +21 -0
- mirascope-2.1.1.dist-info/METADATA +231 -0
- mirascope-2.1.1.dist-info/RECORD +437 -0
- {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/WHEEL +1 -1
- {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/licenses/LICENSE +1 -1
- mirascope/beta/__init__.py +0 -0
- mirascope/beta/openai/__init__.py +0 -5
- mirascope/beta/openai/parse.py +0 -129
- 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 -57
- mirascope/beta/rag/chroma/vectorstores.py +0 -97
- 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 -55
- mirascope/core/anthropic/__init__.py +0 -21
- mirascope/core/anthropic/_call.py +0 -71
- mirascope/core/anthropic/_utils/__init__.py +0 -16
- mirascope/core/anthropic/_utils/_calculate_cost.py +0 -63
- mirascope/core/anthropic/_utils/_convert_message_params.py +0 -54
- mirascope/core/anthropic/_utils/_get_json_output.py +0 -34
- mirascope/core/anthropic/_utils/_handle_stream.py +0 -89
- mirascope/core/anthropic/_utils/_setup_call.py +0 -76
- mirascope/core/anthropic/call_params.py +0 -36
- mirascope/core/anthropic/call_response.py +0 -158
- mirascope/core/anthropic/call_response_chunk.py +0 -104
- mirascope/core/anthropic/dynamic_config.py +0 -26
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -140
- mirascope/core/anthropic/tool.py +0 -77
- mirascope/core/base/__init__.py +0 -40
- mirascope/core/base/_call_factory.py +0 -323
- mirascope/core/base/_create.py +0 -167
- mirascope/core/base/_extract.py +0 -139
- mirascope/core/base/_partial.py +0 -63
- mirascope/core/base/_utils/__init__.py +0 -64
- mirascope/core/base/_utils/_base_type.py +0 -17
- mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -45
- mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
- mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -126
- mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
- mirascope/core/base/_utils/_extract_tool_return.py +0 -36
- mirascope/core/base/_utils/_format_template.py +0 -29
- mirascope/core/base/_utils/_get_audio_type.py +0 -18
- mirascope/core/base/_utils/_get_fn_args.py +0 -14
- 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 -25
- mirascope/core/base/_utils/_get_template_values.py +0 -52
- mirascope/core/base/_utils/_get_template_variables.py +0 -38
- mirascope/core/base/_utils/_json_mode_content.py +0 -15
- mirascope/core/base/_utils/_parse_content_template.py +0 -157
- mirascope/core/base/_utils/_parse_prompt_messages.py +0 -51
- mirascope/core/base/_utils/_protocols.py +0 -215
- mirascope/core/base/_utils/_setup_call.py +0 -64
- mirascope/core/base/_utils/_setup_extract_tool.py +0 -24
- mirascope/core/base/call_params.py +0 -6
- mirascope/core/base/call_response.py +0 -189
- mirascope/core/base/call_response_chunk.py +0 -91
- mirascope/core/base/dynamic_config.py +0 -55
- mirascope/core/base/message_param.py +0 -61
- mirascope/core/base/metadata.py +0 -13
- mirascope/core/base/prompt.py +0 -415
- mirascope/core/base/stream.py +0 -365
- mirascope/core/base/structured_stream.py +0 -251
- mirascope/core/base/tool.py +0 -126
- mirascope/core/base/toolkit.py +0 -146
- mirascope/core/cohere/__init__.py +0 -21
- mirascope/core/cohere/_call.py +0 -71
- mirascope/core/cohere/_utils/__init__.py +0 -16
- mirascope/core/cohere/_utils/_calculate_cost.py +0 -39
- mirascope/core/cohere/_utils/_convert_message_params.py +0 -31
- mirascope/core/cohere/_utils/_get_json_output.py +0 -31
- mirascope/core/cohere/_utils/_handle_stream.py +0 -33
- mirascope/core/cohere/_utils/_setup_call.py +0 -89
- mirascope/core/cohere/call_params.py +0 -57
- mirascope/core/cohere/call_response.py +0 -167
- mirascope/core/cohere/call_response_chunk.py +0 -101
- mirascope/core/cohere/dynamic_config.py +0 -24
- mirascope/core/cohere/py.typed +0 -0
- mirascope/core/cohere/stream.py +0 -113
- mirascope/core/cohere/tool.py +0 -92
- mirascope/core/gemini/__init__.py +0 -21
- mirascope/core/gemini/_call.py +0 -71
- mirascope/core/gemini/_utils/__init__.py +0 -16
- mirascope/core/gemini/_utils/_calculate_cost.py +0 -8
- mirascope/core/gemini/_utils/_convert_message_params.py +0 -74
- mirascope/core/gemini/_utils/_get_json_output.py +0 -33
- mirascope/core/gemini/_utils/_handle_stream.py +0 -33
- mirascope/core/gemini/_utils/_setup_call.py +0 -68
- mirascope/core/gemini/call_params.py +0 -28
- mirascope/core/gemini/call_response.py +0 -173
- mirascope/core/gemini/call_response_chunk.py +0 -85
- mirascope/core/gemini/dynamic_config.py +0 -26
- mirascope/core/gemini/stream.py +0 -121
- mirascope/core/gemini/tool.py +0 -104
- mirascope/core/groq/__init__.py +0 -21
- mirascope/core/groq/_call.py +0 -71
- mirascope/core/groq/_utils/__init__.py +0 -16
- mirascope/core/groq/_utils/_calculate_cost.py +0 -68
- mirascope/core/groq/_utils/_convert_message_params.py +0 -23
- mirascope/core/groq/_utils/_get_json_output.py +0 -27
- mirascope/core/groq/_utils/_handle_stream.py +0 -121
- mirascope/core/groq/_utils/_setup_call.py +0 -67
- mirascope/core/groq/call_params.py +0 -51
- mirascope/core/groq/call_response.py +0 -160
- mirascope/core/groq/call_response_chunk.py +0 -89
- mirascope/core/groq/dynamic_config.py +0 -26
- mirascope/core/groq/py.typed +0 -0
- mirascope/core/groq/stream.py +0 -136
- mirascope/core/groq/tool.py +0 -79
- mirascope/core/litellm/__init__.py +0 -6
- mirascope/core/litellm/_call.py +0 -73
- mirascope/core/litellm/_utils/__init__.py +0 -5
- mirascope/core/litellm/_utils/_setup_call.py +0 -46
- mirascope/core/litellm/py.typed +0 -0
- mirascope/core/mistral/__init__.py +0 -21
- mirascope/core/mistral/_call.py +0 -69
- mirascope/core/mistral/_utils/__init__.py +0 -16
- mirascope/core/mistral/_utils/_calculate_cost.py +0 -47
- mirascope/core/mistral/_utils/_convert_message_params.py +0 -23
- mirascope/core/mistral/_utils/_get_json_output.py +0 -28
- mirascope/core/mistral/_utils/_handle_stream.py +0 -121
- mirascope/core/mistral/_utils/_setup_call.py +0 -86
- mirascope/core/mistral/call_params.py +0 -36
- mirascope/core/mistral/call_response.py +0 -156
- mirascope/core/mistral/call_response_chunk.py +0 -84
- mirascope/core/mistral/dynamic_config.py +0 -24
- mirascope/core/mistral/py.typed +0 -0
- mirascope/core/mistral/stream.py +0 -117
- mirascope/core/mistral/tool.py +0 -77
- mirascope/core/openai/__init__.py +0 -21
- mirascope/core/openai/_call.py +0 -71
- mirascope/core/openai/_utils/__init__.py +0 -16
- mirascope/core/openai/_utils/_calculate_cost.py +0 -110
- mirascope/core/openai/_utils/_convert_message_params.py +0 -53
- mirascope/core/openai/_utils/_get_json_output.py +0 -27
- mirascope/core/openai/_utils/_handle_stream.py +0 -125
- mirascope/core/openai/_utils/_setup_call.py +0 -62
- mirascope/core/openai/call_params.py +0 -54
- mirascope/core/openai/call_response.py +0 -162
- mirascope/core/openai/call_response_chunk.py +0 -90
- mirascope/core/openai/dynamic_config.py +0 -26
- mirascope/core/openai/py.typed +0 -0
- mirascope/core/openai/stream.py +0 -148
- mirascope/core/openai/tool.py +0 -79
- mirascope/core/py.typed +0 -0
- mirascope/integrations/__init__.py +0 -20
- mirascope/integrations/_middleware_factory.py +0 -277
- mirascope/integrations/langfuse/__init__.py +0 -3
- mirascope/integrations/langfuse/_utils.py +0 -114
- mirascope/integrations/langfuse/_with_langfuse.py +0 -71
- mirascope/integrations/logfire/__init__.py +0 -3
- mirascope/integrations/logfire/_utils.py +0 -188
- mirascope/integrations/logfire/_with_logfire.py +0 -60
- mirascope/integrations/otel/__init__.py +0 -5
- mirascope/integrations/otel/_utils.py +0 -268
- mirascope/integrations/otel/_with_hyperdx.py +0 -61
- mirascope/integrations/otel/_with_otel.py +0 -60
- mirascope/integrations/tenacity.py +0 -50
- mirascope/py.typed +0 -0
- 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.0.5.dist-info/METADATA +0 -519
- mirascope-1.0.5.dist-info/RECORD +0 -198
mirascope/__init__.py
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
"""Mirascope
|
|
1
|
+
"""Mirascope v2 Beta."""
|
|
2
2
|
|
|
3
|
-
import importlib.metadata
|
|
4
3
|
from contextlib import suppress
|
|
5
4
|
|
|
6
5
|
with suppress(ImportError):
|
|
7
|
-
from . import
|
|
6
|
+
from . import llm as llm
|
|
8
7
|
|
|
9
8
|
with suppress(ImportError):
|
|
10
|
-
from . import
|
|
9
|
+
from . import api as api
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
with suppress(ImportError):
|
|
12
|
+
from . import ops as ops
|
|
13
13
|
|
|
14
|
-
__all__ = ["
|
|
14
|
+
__all__ = ["api", "llm", "ops"]
|
mirascope/_stubs.py
ADDED
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
"""Utilities for stubbing modules with missing optional dependencies."""
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
from collections.abc import MutableSequence, Sequence
|
|
5
|
+
from importlib.abc import Loader, MetaPathFinder
|
|
6
|
+
from importlib.machinery import ModuleSpec
|
|
7
|
+
from types import ModuleType
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
# ruff: noqa: ANN401
|
|
11
|
+
|
|
12
|
+
# Mapping of extra names to their import names
|
|
13
|
+
# This mapping is automatically generated from pyproject.toml
|
|
14
|
+
# To regenerate: uv run python scripts/generate_extra_imports.py --overwrite
|
|
15
|
+
# BEGIN GENERATED - DO NOT EDIT MANUALLY
|
|
16
|
+
EXTRA_IMPORTS: dict[str, list[str]] = {
|
|
17
|
+
"anthropic": ["anthropic"],
|
|
18
|
+
"api": ["pydantic_settings"],
|
|
19
|
+
"google": [
|
|
20
|
+
"google.genai",
|
|
21
|
+
"PIL",
|
|
22
|
+
"proto",
|
|
23
|
+
],
|
|
24
|
+
"openai": ["openai"],
|
|
25
|
+
"mcp": ["mcp"],
|
|
26
|
+
"ops": [
|
|
27
|
+
"opentelemetry.sdk",
|
|
28
|
+
"opentelemetry",
|
|
29
|
+
"opentelemetry.instrumentation",
|
|
30
|
+
"opentelemetry.exporter.otlp",
|
|
31
|
+
"opentelemetry.propagators.b3",
|
|
32
|
+
"orjson",
|
|
33
|
+
"opentelemetry.propagators.jaeger",
|
|
34
|
+
"libcst",
|
|
35
|
+
"packaging",
|
|
36
|
+
"opentelemetry.instrumentation.openai_v2",
|
|
37
|
+
"opentelemetry.instrumentation.anthropic",
|
|
38
|
+
"opentelemetry.instrumentation.google_genai",
|
|
39
|
+
],
|
|
40
|
+
"mlx": ["mlx_lm"],
|
|
41
|
+
}
|
|
42
|
+
# END GENERATED
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _make_import_error(package_name: str, name: str) -> ImportError:
|
|
46
|
+
"""Create an ImportError with a helpful installation message.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
package_name: The package/extra name (e.g., "ops", "api")
|
|
50
|
+
name: The specific item being accessed (e.g., "trace", "settings")
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
ImportError with installation instructions
|
|
54
|
+
"""
|
|
55
|
+
return ImportError(
|
|
56
|
+
f"The '{package_name}' packages are required to use {name}. "
|
|
57
|
+
f"Install them with: `uv add 'mirascope[{package_name}]'`. "
|
|
58
|
+
"Or use `uv add 'mirascope[all]'` to support all optional features."
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class _StubMeta(type):
|
|
63
|
+
"""Metaclass for stub classes that fail on actual use.
|
|
64
|
+
|
|
65
|
+
This metaclass allows stub classes to be used transparently in type hints,
|
|
66
|
+
class definitions, and passed around as values, but fails with a helpful
|
|
67
|
+
error when actually used (instantiated, methods called, attributes accessed).
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
_package_name: str
|
|
71
|
+
_stub_name: str
|
|
72
|
+
|
|
73
|
+
def __call__(cls, *args: Any, **kwargs: Any) -> Any:
|
|
74
|
+
"""Raise ImportError when trying to instantiate the stub class."""
|
|
75
|
+
raise _make_import_error(cls._package_name, cls._stub_name)
|
|
76
|
+
|
|
77
|
+
def __getattr__(cls, name: str) -> Any:
|
|
78
|
+
"""Raise ImportError when accessing class attributes (except private/dunder)."""
|
|
79
|
+
# Allow private/dunder attributes to raise AttributeError normally
|
|
80
|
+
if name.startswith("_"):
|
|
81
|
+
raise AttributeError(name)
|
|
82
|
+
raise _make_import_error(cls._package_name, cls._stub_name)
|
|
83
|
+
|
|
84
|
+
def __instancecheck__(cls, instance: Any) -> bool:
|
|
85
|
+
"""Raise ImportError when checking isinstance()."""
|
|
86
|
+
raise _make_import_error(cls._package_name, cls._stub_name)
|
|
87
|
+
|
|
88
|
+
def __subclasscheck__(cls, subclass: Any) -> bool:
|
|
89
|
+
"""Allow the stub to be subclassed, but raise ImportError for issubclass checks.
|
|
90
|
+
|
|
91
|
+
This allows code like `class MyTrace(Trace): pass` to work
|
|
92
|
+
at definition time. The subclass will inherit _StubMeta, so using IT
|
|
93
|
+
will also fail appropriately.
|
|
94
|
+
"""
|
|
95
|
+
if subclass is cls:
|
|
96
|
+
return True
|
|
97
|
+
# For issubclass() checks with other classes, fail
|
|
98
|
+
raise _make_import_error(cls._package_name, cls._stub_name)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def _create_stub(package_name: str, name: str) -> type:
|
|
102
|
+
"""Create a universal stub that works as a class or callable.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
package_name: The package/extra name (e.g., "ops", "api")
|
|
106
|
+
name: The name of the item being stubbed (e.g., "trace", "settings")
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
A stub class with _StubMeta metaclass
|
|
110
|
+
"""
|
|
111
|
+
return _StubMeta(
|
|
112
|
+
name,
|
|
113
|
+
(),
|
|
114
|
+
{
|
|
115
|
+
"_package_name": package_name,
|
|
116
|
+
"_stub_name": name,
|
|
117
|
+
"__module__": f"mirascope.{package_name}",
|
|
118
|
+
},
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class _StubLoader(Loader):
|
|
123
|
+
"""Loader that creates stub modules for missing submodules."""
|
|
124
|
+
|
|
125
|
+
def __init__(self, fullname: str, package_name: str) -> None:
|
|
126
|
+
"""Initialize the stub loader.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
fullname: The full module name being loaded
|
|
130
|
+
package_name: The package/extra name for error messages
|
|
131
|
+
"""
|
|
132
|
+
self.fullname = fullname
|
|
133
|
+
self.package_name = package_name
|
|
134
|
+
|
|
135
|
+
def create_module(self, spec: ModuleSpec) -> ModuleType:
|
|
136
|
+
"""Create a stub module.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
spec: The module spec
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
A new _StubModule instance
|
|
143
|
+
"""
|
|
144
|
+
return _StubModule(self.fullname, self.package_name)
|
|
145
|
+
|
|
146
|
+
def exec_module(self, module: ModuleType) -> None:
|
|
147
|
+
"""Execute the module (no-op for stubs).
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
module: The module to execute
|
|
151
|
+
"""
|
|
152
|
+
pass # Stub modules don't need execution
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
class _StubFinder(MetaPathFinder):
|
|
156
|
+
"""Meta path finder that intercepts imports for stubbed modules."""
|
|
157
|
+
|
|
158
|
+
def __init__(self) -> None:
|
|
159
|
+
"""Initialize the stub finder."""
|
|
160
|
+
self.stubbed_modules: set[str] = set()
|
|
161
|
+
|
|
162
|
+
def register_stub(self, module_path: str) -> None:
|
|
163
|
+
"""Register a module path as stubbed.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
module_path: The full module path that's been stubbed
|
|
167
|
+
"""
|
|
168
|
+
self.stubbed_modules.add(module_path)
|
|
169
|
+
|
|
170
|
+
def find_spec(
|
|
171
|
+
self, fullname: str, path: Any = None, target: Any = None
|
|
172
|
+
) -> ModuleSpec | None:
|
|
173
|
+
"""Find a module spec for stubbed submodules.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
fullname: The full name of the module being imported
|
|
177
|
+
path: The path to search (unused)
|
|
178
|
+
target: The target module (unused)
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
A ModuleSpec if this is a submodule of a stubbed module, None otherwise
|
|
182
|
+
"""
|
|
183
|
+
# Check if this import is for a submodule of any stubbed module
|
|
184
|
+
for stub_root in self.stubbed_modules:
|
|
185
|
+
if fullname.startswith(f"{stub_root}."):
|
|
186
|
+
# Extract the package name from the stub root
|
|
187
|
+
# e.g., "mirascope.llm.providers.openai" -> find package_name
|
|
188
|
+
if fullname in sys.modules and isinstance(
|
|
189
|
+
sys.modules[fullname], _StubModule
|
|
190
|
+
):
|
|
191
|
+
# Already stubbed
|
|
192
|
+
return None
|
|
193
|
+
|
|
194
|
+
# Get the package_name from the parent stub module
|
|
195
|
+
parent_module = sys.modules.get(stub_root)
|
|
196
|
+
if isinstance(parent_module, _StubModule):
|
|
197
|
+
# Use the parent's package name
|
|
198
|
+
package_name = parent_module._StubModule__package_name
|
|
199
|
+
return ModuleSpec(
|
|
200
|
+
fullname,
|
|
201
|
+
_StubLoader(fullname, package_name),
|
|
202
|
+
is_package=True,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
return None
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
# Global finder instance
|
|
209
|
+
_finder = _StubFinder()
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
class _StubModule(ModuleType):
|
|
213
|
+
"""A module that returns stubs for all attribute access.
|
|
214
|
+
|
|
215
|
+
This allows the entire module to be stubbed, so any imports from it will
|
|
216
|
+
work transparently for type checking but fail with helpful errors on actual use.
|
|
217
|
+
|
|
218
|
+
For nested module imports like `from .openai.completions.provider import X`,
|
|
219
|
+
this dynamically registers child stub modules in sys.modules when accessed.
|
|
220
|
+
|
|
221
|
+
Each stub module instance can also act like a stub class - it can be called,
|
|
222
|
+
subclassed, and used in isinstance/issubclass checks, all of which fail with
|
|
223
|
+
helpful error messages.
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
def __init__(self, name: str, package_name: str) -> None:
|
|
227
|
+
"""Initialize the stub module.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
name: The full module name (e.g., "mirascope.ops._internal.tracing")
|
|
231
|
+
package_name: The package/extra name for error messages (e.g., "ops")
|
|
232
|
+
"""
|
|
233
|
+
super().__init__(name)
|
|
234
|
+
self.__package_name = package_name
|
|
235
|
+
self.__stub_name = name.split(".")[-1] # Use last part for error messages
|
|
236
|
+
self.__stubs: dict[str, Any] = {}
|
|
237
|
+
# Set __path__ to make this look like a package to Python's import system
|
|
238
|
+
# This allows nested imports like `from .openai.completions import X` to work
|
|
239
|
+
self.__path__: MutableSequence[str] = []
|
|
240
|
+
|
|
241
|
+
def __call__(self, *args: Any, **kwargs: Any) -> Any:
|
|
242
|
+
"""Raise ImportError when trying to instantiate/call the stub.
|
|
243
|
+
|
|
244
|
+
Raises:
|
|
245
|
+
ImportError: With installation instructions
|
|
246
|
+
"""
|
|
247
|
+
raise _make_import_error(self.__package_name, self.__stub_name)
|
|
248
|
+
|
|
249
|
+
def __getattr__(self, name: str) -> Any:
|
|
250
|
+
"""Return a stub for any accessed attribute.
|
|
251
|
+
|
|
252
|
+
For nested imports like `from .openai.completions.provider import X`, the
|
|
253
|
+
_StubFinder will create intermediate stub modules automatically. This method
|
|
254
|
+
handles direct attribute access for both getting submodules and getting
|
|
255
|
+
classes/functions from the stub.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
name: The attribute name being accessed
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
Either a stub module (if already in sys.modules) or a stub class
|
|
262
|
+
|
|
263
|
+
Raises:
|
|
264
|
+
AttributeError: For private/dunder attributes
|
|
265
|
+
"""
|
|
266
|
+
if name.startswith("_"):
|
|
267
|
+
raise AttributeError(name)
|
|
268
|
+
|
|
269
|
+
# Check if we've already created a stub for this name
|
|
270
|
+
if name in self.__stubs:
|
|
271
|
+
return self.__stubs[name]
|
|
272
|
+
|
|
273
|
+
# Check if there's a submodule already created by the finder
|
|
274
|
+
full_name = f"{self.__name__}.{name}"
|
|
275
|
+
if full_name in sys.modules:
|
|
276
|
+
submodule = sys.modules[full_name]
|
|
277
|
+
self.__stubs[name] = submodule
|
|
278
|
+
return submodule
|
|
279
|
+
|
|
280
|
+
# Otherwise return a stub class for direct attribute access
|
|
281
|
+
stub_class = _create_stub(self.__package_name, name)
|
|
282
|
+
self.__stubs[name] = stub_class
|
|
283
|
+
return stub_class
|
|
284
|
+
|
|
285
|
+
def __instancecheck__(self, instance: Any) -> bool:
|
|
286
|
+
"""Raise ImportError when checking isinstance().
|
|
287
|
+
|
|
288
|
+
Raises:
|
|
289
|
+
ImportError: With installation instructions
|
|
290
|
+
"""
|
|
291
|
+
raise _make_import_error(self.__package_name, self.__stub_name)
|
|
292
|
+
|
|
293
|
+
def __subclasscheck__(self, subclass: Any) -> bool:
|
|
294
|
+
"""Allow subclassing but raise ImportError for issubclass checks.
|
|
295
|
+
|
|
296
|
+
Args:
|
|
297
|
+
subclass: The class being checked
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
True if checking against self
|
|
301
|
+
|
|
302
|
+
Raises:
|
|
303
|
+
ImportError: For issubclass checks with other classes
|
|
304
|
+
"""
|
|
305
|
+
if subclass is self:
|
|
306
|
+
return True
|
|
307
|
+
raise _make_import_error(self.__package_name, self.__stub_name)
|
|
308
|
+
|
|
309
|
+
def __dir__(self) -> list[str]:
|
|
310
|
+
"""Return empty list to avoid advertising stub names.
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
Empty list
|
|
314
|
+
"""
|
|
315
|
+
return []
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def stub_module_if_missing(
|
|
319
|
+
module_path: str,
|
|
320
|
+
package_name: str | Sequence[str],
|
|
321
|
+
) -> bool:
|
|
322
|
+
"""Check if all packages for one or more extras are installed; if not, stub a module.
|
|
323
|
+
|
|
324
|
+
This must be called BEFORE importing from the module.
|
|
325
|
+
|
|
326
|
+
Args:
|
|
327
|
+
module_path: Full module path to stub (e.g., 'mirascope.ops._internal.tracing')
|
|
328
|
+
package_name: The extra name (e.g., "ops") or a sequence of extra names.
|
|
329
|
+
If multiple extras are provided, the module is available only when
|
|
330
|
+
all of the extras have all imports available.
|
|
331
|
+
An empty sequence is a no-op and returns True (vacuously satisfied).
|
|
332
|
+
|
|
333
|
+
Returns:
|
|
334
|
+
True if all packages for all extras are available (including empty sequence),
|
|
335
|
+
False if stubbed.
|
|
336
|
+
|
|
337
|
+
Raises:
|
|
338
|
+
KeyError: If package_name is not found in EXTRA_IMPORTS mapping.
|
|
339
|
+
"""
|
|
340
|
+
package_names: tuple[str, ...]
|
|
341
|
+
if isinstance(package_name, str):
|
|
342
|
+
package_names = (package_name,)
|
|
343
|
+
else:
|
|
344
|
+
package_names = tuple(package_name)
|
|
345
|
+
|
|
346
|
+
unknown = [name for name in package_names if name not in EXTRA_IMPORTS]
|
|
347
|
+
if unknown:
|
|
348
|
+
unknown_names = ", ".join(unknown)
|
|
349
|
+
raise KeyError(
|
|
350
|
+
f"Unknown extra '{unknown_names}'. "
|
|
351
|
+
f"Available extras: {', '.join(EXTRA_IMPORTS.keys())}"
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
def _extra_available(extra_name: str) -> bool:
|
|
355
|
+
imports_to_check = EXTRA_IMPORTS[extra_name]
|
|
356
|
+
for import_name in imports_to_check:
|
|
357
|
+
try:
|
|
358
|
+
__import__(import_name)
|
|
359
|
+
except ImportError:
|
|
360
|
+
return False
|
|
361
|
+
return True
|
|
362
|
+
|
|
363
|
+
# Find the first missing extra (short-circuit to avoid unnecessary imports)
|
|
364
|
+
first_missing_extra: str | None = None
|
|
365
|
+
for extra_name in package_names:
|
|
366
|
+
if not _extra_available(extra_name):
|
|
367
|
+
first_missing_extra = extra_name
|
|
368
|
+
break
|
|
369
|
+
|
|
370
|
+
# If no extras are missing, all packages are available
|
|
371
|
+
if first_missing_extra is None:
|
|
372
|
+
return True
|
|
373
|
+
|
|
374
|
+
# Use the first missing extra for the error message
|
|
375
|
+
sys.modules[module_path] = _StubModule(module_path, first_missing_extra)
|
|
376
|
+
|
|
377
|
+
# Register with the finder to handle nested imports
|
|
378
|
+
_finder.register_stub(module_path)
|
|
379
|
+
|
|
380
|
+
# Ensure the finder is in sys.meta_path (only add once)
|
|
381
|
+
if _finder not in sys.meta_path:
|
|
382
|
+
sys.meta_path.insert(0, _finder)
|
|
383
|
+
|
|
384
|
+
return False
|
mirascope/_utils.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Shared internal utilities for mirascope."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
# Attributes to copy from wrapped functions (matches functools.WRAPPER_ASSIGNMENTS)
|
|
6
|
+
WRAPPER_ASSIGNMENTS = (
|
|
7
|
+
"__module__",
|
|
8
|
+
"__name__",
|
|
9
|
+
"__qualname__",
|
|
10
|
+
"__annotations__",
|
|
11
|
+
"__doc__",
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def copy_function_metadata(target: Any, source: Any) -> None: # noqa: ANN401
|
|
16
|
+
"""Copy standard function metadata from source to target.
|
|
17
|
+
|
|
18
|
+
Copies __module__, __name__, __qualname__, __annotations__, __doc__
|
|
19
|
+
from source to target, and sets __wrapped__ to source.
|
|
20
|
+
|
|
21
|
+
This enables decorator stacking by preserving the original function's
|
|
22
|
+
metadata on wrapper objects.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
target: The wrapper object to copy metadata to
|
|
26
|
+
source: The original function to copy metadata from
|
|
27
|
+
"""
|
|
28
|
+
for attr in WRAPPER_ASSIGNMENTS:
|
|
29
|
+
try:
|
|
30
|
+
value = getattr(source, attr)
|
|
31
|
+
object.__setattr__(target, attr, value)
|
|
32
|
+
except AttributeError:
|
|
33
|
+
pass
|
|
34
|
+
object.__setattr__(target, "__wrapped__", source)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""The Mirascope Cloud API client."""
|
|
2
|
+
|
|
3
|
+
from .._stubs import stub_module_if_missing
|
|
4
|
+
|
|
5
|
+
# Stub modules for missing optional dependencies BEFORE importing
|
|
6
|
+
# This must happen before any imports from these modules
|
|
7
|
+
stub_module_if_missing("mirascope.api", "api")
|
|
8
|
+
|
|
9
|
+
# Now imports work regardless of which packages are installed
|
|
10
|
+
# ruff: noqa: E402
|
|
11
|
+
from .client import AsyncMirascope, Mirascope
|
|
12
|
+
from .settings import get_settings, settings
|
|
13
|
+
|
|
14
|
+
__all__ = ["AsyncMirascope", "Mirascope", "get_settings", "settings"]
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Mirascope Python Library
|
|
2
|
+
|
|
3
|
+
[](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Mirascope%2FPython)
|
|
4
|
+
[](https://pypi.python.org/pypi/mirascope)
|
|
5
|
+
|
|
6
|
+
The Mirascope Python library provides convenient access to the Mirascope APIs from Python.
|
|
7
|
+
|
|
8
|
+
## Table of Contents
|
|
9
|
+
|
|
10
|
+
- [Installation](#installation)
|
|
11
|
+
- [Reference](#reference)
|
|
12
|
+
- [Usage](#usage)
|
|
13
|
+
- [Async Client](#async-client)
|
|
14
|
+
- [Exception Handling](#exception-handling)
|
|
15
|
+
- [Advanced](#advanced)
|
|
16
|
+
- [Access Raw Response Data](#access-raw-response-data)
|
|
17
|
+
- [Retries](#retries)
|
|
18
|
+
- [Timeouts](#timeouts)
|
|
19
|
+
- [Custom Client](#custom-client)
|
|
20
|
+
- [Contributing](#contributing)
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
pip install mirascope
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Reference
|
|
29
|
+
|
|
30
|
+
A full reference for this library is available [here](./reference.md).
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
Instantiate and use the client with the following:
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
from mirascope.api._generated import Mirascope
|
|
38
|
+
from mirascope.api._generated.traces import (
|
|
39
|
+
TracesCreateRequestResourceSpansItem,
|
|
40
|
+
TracesCreateRequestResourceSpansItemScopeSpansItem,
|
|
41
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemSpansItem,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
client = Mirascope()
|
|
45
|
+
client.traces.create(
|
|
46
|
+
resource_spans=[
|
|
47
|
+
TracesCreateRequestResourceSpansItem(
|
|
48
|
+
scope_spans=[
|
|
49
|
+
TracesCreateRequestResourceSpansItemScopeSpansItem(
|
|
50
|
+
spans=[
|
|
51
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemSpansItem(
|
|
52
|
+
trace_id="traceId",
|
|
53
|
+
span_id="spanId",
|
|
54
|
+
name="name",
|
|
55
|
+
start_time_unix_nano="startTimeUnixNano",
|
|
56
|
+
end_time_unix_nano="endTimeUnixNano",
|
|
57
|
+
)
|
|
58
|
+
],
|
|
59
|
+
)
|
|
60
|
+
],
|
|
61
|
+
)
|
|
62
|
+
],
|
|
63
|
+
)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Async Client
|
|
67
|
+
|
|
68
|
+
The SDK also exports an `async` client so that you can make non-blocking calls to our API.
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
import asyncio
|
|
72
|
+
|
|
73
|
+
from mirascope.api._generated import AsyncMirascope
|
|
74
|
+
from mirascope.api._generated.traces import (
|
|
75
|
+
TracesCreateRequestResourceSpansItem,
|
|
76
|
+
TracesCreateRequestResourceSpansItemScopeSpansItem,
|
|
77
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemSpansItem,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
client = AsyncMirascope()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
async def main() -> None:
|
|
84
|
+
await client.traces.create(
|
|
85
|
+
resource_spans=[
|
|
86
|
+
TracesCreateRequestResourceSpansItem(
|
|
87
|
+
scope_spans=[
|
|
88
|
+
TracesCreateRequestResourceSpansItemScopeSpansItem(
|
|
89
|
+
spans=[
|
|
90
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemSpansItem(
|
|
91
|
+
trace_id="traceId",
|
|
92
|
+
span_id="spanId",
|
|
93
|
+
name="name",
|
|
94
|
+
start_time_unix_nano="startTimeUnixNano",
|
|
95
|
+
end_time_unix_nano="endTimeUnixNano",
|
|
96
|
+
)
|
|
97
|
+
],
|
|
98
|
+
)
|
|
99
|
+
],
|
|
100
|
+
)
|
|
101
|
+
],
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
asyncio.run(main())
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Exception Handling
|
|
109
|
+
|
|
110
|
+
When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error
|
|
111
|
+
will be thrown.
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
from mirascope.api._generated.core.api_error import ApiError
|
|
115
|
+
|
|
116
|
+
try:
|
|
117
|
+
client.traces.create(...)
|
|
118
|
+
except ApiError as e:
|
|
119
|
+
print(e.status_code)
|
|
120
|
+
print(e.body)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Advanced
|
|
124
|
+
|
|
125
|
+
### Access Raw Response Data
|
|
126
|
+
|
|
127
|
+
The SDK provides access to raw response data, including headers, through the `.with_raw_response` property.
|
|
128
|
+
The `.with_raw_response` property returns a "raw" client that can be used to access the `.headers` and `.data` attributes.
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
from mirascope.api._generated import Mirascope
|
|
132
|
+
|
|
133
|
+
client = Mirascope(
|
|
134
|
+
...,
|
|
135
|
+
)
|
|
136
|
+
response = client.traces.with_raw_response.create(...)
|
|
137
|
+
print(response.headers) # access the response headers
|
|
138
|
+
print(response.data) # access the underlying object
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Retries
|
|
142
|
+
|
|
143
|
+
The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long
|
|
144
|
+
as the request is deemed retryable and the number of retry attempts has not grown larger than the configured
|
|
145
|
+
retry limit (default: 2).
|
|
146
|
+
|
|
147
|
+
A request is deemed retryable when any of the following HTTP status codes is returned:
|
|
148
|
+
|
|
149
|
+
- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout)
|
|
150
|
+
- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests)
|
|
151
|
+
- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors)
|
|
152
|
+
|
|
153
|
+
Use the `max_retries` request option to configure this behavior.
|
|
154
|
+
|
|
155
|
+
```python
|
|
156
|
+
client.traces.create(..., request_options={
|
|
157
|
+
"max_retries": 1
|
|
158
|
+
})
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Timeouts
|
|
162
|
+
|
|
163
|
+
The SDK defaults to a 60 second timeout. You can configure this with a timeout option at the client or request level.
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
|
|
167
|
+
from mirascope.api._generated import Mirascope
|
|
168
|
+
|
|
169
|
+
client = Mirascope(
|
|
170
|
+
...,
|
|
171
|
+
timeout=20.0,
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
# Override timeout for a specific method
|
|
176
|
+
client.traces.create(..., request_options={
|
|
177
|
+
"timeout_in_seconds": 1
|
|
178
|
+
})
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Custom Client
|
|
182
|
+
|
|
183
|
+
You can override the `httpx` client to customize it for your use-case. Some common use-cases include support for proxies
|
|
184
|
+
and transports.
|
|
185
|
+
|
|
186
|
+
```python
|
|
187
|
+
import httpx
|
|
188
|
+
from mirascope.api._generated import Mirascope
|
|
189
|
+
|
|
190
|
+
client = Mirascope(
|
|
191
|
+
...,
|
|
192
|
+
httpx_client=httpx.Client(
|
|
193
|
+
proxies="http://my.test.proxy.example.com",
|
|
194
|
+
transport=httpx.HTTPTransport(local_address="0.0.0.0"),
|
|
195
|
+
),
|
|
196
|
+
)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Contributing
|
|
200
|
+
|
|
201
|
+
While we value open-source contributions to this SDK, this library is generated programmatically.
|
|
202
|
+
Additions made directly to this library would have to be moved over to our generation code,
|
|
203
|
+
otherwise they would be overwritten upon the next generated release. Feel free to open a PR as
|
|
204
|
+
a proof of concept, but know that we will not be able to merge it as-is. We suggest opening
|
|
205
|
+
an issue first to discuss with us!
|
|
206
|
+
|
|
207
|
+
On the other hand, contributions to the README are always very welcome!
|