mirascope 1.22.4__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 +5 -50
- 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 +309 -13
- 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-2.1.1.dist-info/WHEEL +4 -0
- mirascope-2.1.1.dist-info/licenses/LICENSE +21 -0
- mirascope/beta/__init__.py +0 -3
- mirascope/beta/openai/__init__.py +0 -17
- mirascope/beta/openai/realtime/__init__.py +0 -13
- mirascope/beta/openai/realtime/_utils/__init__.py +0 -3
- mirascope/beta/openai/realtime/_utils/_audio.py +0 -74
- mirascope/beta/openai/realtime/_utils/_protocols.py +0 -50
- mirascope/beta/openai/realtime/realtime.py +0 -500
- mirascope/beta/openai/realtime/recording.py +0 -98
- mirascope/beta/openai/realtime/tool.py +0 -113
- mirascope/beta/rag/__init__.py +0 -24
- mirascope/beta/rag/base/__init__.py +0 -22
- mirascope/beta/rag/base/chunkers/__init__.py +0 -2
- mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
- mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
- mirascope/beta/rag/base/config.py +0 -8
- mirascope/beta/rag/base/document.py +0 -11
- mirascope/beta/rag/base/embedders.py +0 -35
- mirascope/beta/rag/base/embedding_params.py +0 -18
- mirascope/beta/rag/base/embedding_response.py +0 -30
- mirascope/beta/rag/base/query_results.py +0 -7
- mirascope/beta/rag/base/vectorstore_params.py +0 -18
- mirascope/beta/rag/base/vectorstores.py +0 -37
- mirascope/beta/rag/chroma/__init__.py +0 -11
- mirascope/beta/rag/chroma/types.py +0 -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 -107
- mirascope/core/anthropic/__init__.py +0 -31
- mirascope/core/anthropic/_call.py +0 -67
- mirascope/core/anthropic/_call_kwargs.py +0 -13
- mirascope/core/anthropic/_utils/__init__.py +0 -16
- mirascope/core/anthropic/_utils/_convert_common_call_params.py +0 -25
- mirascope/core/anthropic/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/anthropic/_utils/_convert_message_params.py +0 -102
- mirascope/core/anthropic/_utils/_get_json_output.py +0 -31
- mirascope/core/anthropic/_utils/_handle_stream.py +0 -113
- mirascope/core/anthropic/_utils/_message_param_converter.py +0 -142
- mirascope/core/anthropic/_utils/_setup_call.py +0 -134
- mirascope/core/anthropic/call_params.py +0 -41
- mirascope/core/anthropic/call_response.py +0 -206
- mirascope/core/anthropic/call_response_chunk.py +0 -132
- mirascope/core/anthropic/dynamic_config.py +0 -40
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -147
- mirascope/core/anthropic/tool.py +0 -101
- mirascope/core/azure/__init__.py +0 -31
- mirascope/core/azure/_call.py +0 -67
- mirascope/core/azure/_call_kwargs.py +0 -13
- mirascope/core/azure/_utils/__init__.py +0 -14
- mirascope/core/azure/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/azure/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/azure/_utils/_convert_message_params.py +0 -121
- mirascope/core/azure/_utils/_get_credential.py +0 -33
- mirascope/core/azure/_utils/_get_json_output.py +0 -27
- mirascope/core/azure/_utils/_handle_stream.py +0 -130
- mirascope/core/azure/_utils/_message_param_converter.py +0 -117
- mirascope/core/azure/_utils/_setup_call.py +0 -183
- mirascope/core/azure/call_params.py +0 -59
- mirascope/core/azure/call_response.py +0 -215
- mirascope/core/azure/call_response_chunk.py +0 -105
- mirascope/core/azure/dynamic_config.py +0 -30
- mirascope/core/azure/py.typed +0 -0
- mirascope/core/azure/stream.py +0 -147
- mirascope/core/azure/tool.py +0 -93
- mirascope/core/base/__init__.py +0 -84
- mirascope/core/base/_call_factory.py +0 -256
- mirascope/core/base/_create.py +0 -253
- mirascope/core/base/_extract.py +0 -175
- mirascope/core/base/_extract_with_tools.py +0 -189
- mirascope/core/base/_partial.py +0 -95
- mirascope/core/base/_utils/__init__.py +0 -92
- mirascope/core/base/_utils/_base_message_param_converter.py +0 -22
- mirascope/core/base/_utils/_base_type.py +0 -26
- mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -48
- mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
- mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -139
- mirascope/core/base/_utils/_convert_messages_to_message_params.py +0 -171
- mirascope/core/base/_utils/_convert_provider_finish_reason_to_finish_reason.py +0 -20
- mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
- mirascope/core/base/_utils/_extract_tool_return.py +0 -42
- mirascope/core/base/_utils/_fn_is_async.py +0 -15
- mirascope/core/base/_utils/_format_template.py +0 -32
- mirascope/core/base/_utils/_get_audio_type.py +0 -18
- mirascope/core/base/_utils/_get_common_usage.py +0 -20
- mirascope/core/base/_utils/_get_create_fn_or_async_create_fn.py +0 -137
- mirascope/core/base/_utils/_get_document_type.py +0 -7
- mirascope/core/base/_utils/_get_dynamic_configuration.py +0 -69
- mirascope/core/base/_utils/_get_fields_from_call_args.py +0 -34
- mirascope/core/base/_utils/_get_fn_args.py +0 -23
- mirascope/core/base/_utils/_get_image_dimensions.py +0 -39
- mirascope/core/base/_utils/_get_image_type.py +0 -26
- mirascope/core/base/_utils/_get_metadata.py +0 -17
- mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
- mirascope/core/base/_utils/_get_prompt_template.py +0 -28
- mirascope/core/base/_utils/_get_template_values.py +0 -51
- mirascope/core/base/_utils/_get_template_variables.py +0 -38
- mirascope/core/base/_utils/_get_unsupported_tool_config_keys.py +0 -10
- mirascope/core/base/_utils/_is_prompt_template.py +0 -24
- mirascope/core/base/_utils/_json_mode_content.py +0 -17
- mirascope/core/base/_utils/_messages_decorator.py +0 -121
- mirascope/core/base/_utils/_parse_content_template.py +0 -321
- mirascope/core/base/_utils/_parse_prompt_messages.py +0 -63
- mirascope/core/base/_utils/_pil_image_to_bytes.py +0 -13
- mirascope/core/base/_utils/_protocols.py +0 -901
- mirascope/core/base/_utils/_setup_call.py +0 -79
- mirascope/core/base/_utils/_setup_extract_tool.py +0 -30
- mirascope/core/base/call_kwargs.py +0 -13
- mirascope/core/base/call_params.py +0 -36
- mirascope/core/base/call_response.py +0 -340
- mirascope/core/base/call_response_chunk.py +0 -130
- mirascope/core/base/dynamic_config.py +0 -82
- mirascope/core/base/from_call_args.py +0 -30
- mirascope/core/base/merge_decorators.py +0 -59
- mirascope/core/base/message_param.py +0 -162
- mirascope/core/base/messages.py +0 -111
- mirascope/core/base/metadata.py +0 -13
- mirascope/core/base/prompt.py +0 -497
- mirascope/core/base/response_model_config_dict.py +0 -9
- mirascope/core/base/stream.py +0 -479
- mirascope/core/base/stream_config.py +0 -11
- mirascope/core/base/structured_stream.py +0 -296
- mirascope/core/base/tool.py +0 -205
- mirascope/core/base/toolkit.py +0 -176
- mirascope/core/base/types.py +0 -344
- mirascope/core/bedrock/__init__.py +0 -34
- mirascope/core/bedrock/_call.py +0 -68
- mirascope/core/bedrock/_call_kwargs.py +0 -12
- mirascope/core/bedrock/_types.py +0 -104
- mirascope/core/bedrock/_utils/__init__.py +0 -14
- mirascope/core/bedrock/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/bedrock/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/bedrock/_utils/_convert_message_params.py +0 -111
- mirascope/core/bedrock/_utils/_get_json_output.py +0 -30
- mirascope/core/bedrock/_utils/_handle_stream.py +0 -104
- mirascope/core/bedrock/_utils/_message_param_converter.py +0 -171
- mirascope/core/bedrock/_utils/_setup_call.py +0 -258
- mirascope/core/bedrock/call_params.py +0 -38
- mirascope/core/bedrock/call_response.py +0 -249
- mirascope/core/bedrock/call_response_chunk.py +0 -111
- mirascope/core/bedrock/dynamic_config.py +0 -37
- mirascope/core/bedrock/py.typed +0 -0
- mirascope/core/bedrock/stream.py +0 -154
- mirascope/core/bedrock/tool.py +0 -96
- mirascope/core/cohere/__init__.py +0 -30
- mirascope/core/cohere/_call.py +0 -67
- mirascope/core/cohere/_call_kwargs.py +0 -11
- mirascope/core/cohere/_types.py +0 -20
- mirascope/core/cohere/_utils/__init__.py +0 -14
- mirascope/core/cohere/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/cohere/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -24
- mirascope/core/cohere/_utils/_convert_message_params.py +0 -32
- mirascope/core/cohere/_utils/_get_json_output.py +0 -30
- mirascope/core/cohere/_utils/_handle_stream.py +0 -35
- mirascope/core/cohere/_utils/_message_param_converter.py +0 -54
- mirascope/core/cohere/_utils/_setup_call.py +0 -150
- mirascope/core/cohere/call_params.py +0 -62
- mirascope/core/cohere/call_response.py +0 -205
- mirascope/core/cohere/call_response_chunk.py +0 -125
- mirascope/core/cohere/dynamic_config.py +0 -32
- mirascope/core/cohere/py.typed +0 -0
- mirascope/core/cohere/stream.py +0 -113
- mirascope/core/cohere/tool.py +0 -93
- mirascope/core/costs/__init__.py +0 -5
- mirascope/core/costs/_anthropic_calculate_cost.py +0 -219
- mirascope/core/costs/_azure_calculate_cost.py +0 -11
- mirascope/core/costs/_bedrock_calculate_cost.py +0 -15
- mirascope/core/costs/_cohere_calculate_cost.py +0 -44
- mirascope/core/costs/_gemini_calculate_cost.py +0 -67
- mirascope/core/costs/_google_calculate_cost.py +0 -427
- mirascope/core/costs/_groq_calculate_cost.py +0 -156
- mirascope/core/costs/_litellm_calculate_cost.py +0 -11
- mirascope/core/costs/_mistral_calculate_cost.py +0 -64
- mirascope/core/costs/_openai_calculate_cost.py +0 -416
- mirascope/core/costs/_vertex_calculate_cost.py +0 -67
- mirascope/core/costs/_xai_calculate_cost.py +0 -104
- mirascope/core/costs/calculate_cost.py +0 -86
- mirascope/core/gemini/__init__.py +0 -40
- mirascope/core/gemini/_call.py +0 -67
- mirascope/core/gemini/_call_kwargs.py +0 -12
- mirascope/core/gemini/_utils/__init__.py +0 -14
- mirascope/core/gemini/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/gemini/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/gemini/_utils/_convert_message_params.py +0 -156
- mirascope/core/gemini/_utils/_get_json_output.py +0 -35
- mirascope/core/gemini/_utils/_handle_stream.py +0 -33
- mirascope/core/gemini/_utils/_message_param_converter.py +0 -209
- mirascope/core/gemini/_utils/_setup_call.py +0 -149
- mirascope/core/gemini/call_params.py +0 -52
- mirascope/core/gemini/call_response.py +0 -216
- mirascope/core/gemini/call_response_chunk.py +0 -100
- mirascope/core/gemini/dynamic_config.py +0 -26
- mirascope/core/gemini/stream.py +0 -120
- mirascope/core/gemini/tool.py +0 -104
- mirascope/core/google/__init__.py +0 -29
- mirascope/core/google/_call.py +0 -67
- mirascope/core/google/_call_kwargs.py +0 -13
- mirascope/core/google/_utils/__init__.py +0 -14
- mirascope/core/google/_utils/_convert_common_call_params.py +0 -38
- mirascope/core/google/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -27
- mirascope/core/google/_utils/_convert_message_params.py +0 -206
- mirascope/core/google/_utils/_get_json_output.py +0 -37
- mirascope/core/google/_utils/_handle_stream.py +0 -35
- mirascope/core/google/_utils/_message_param_converter.py +0 -162
- mirascope/core/google/_utils/_setup_call.py +0 -201
- mirascope/core/google/_utils/_validate_media_type.py +0 -34
- mirascope/core/google/call_params.py +0 -22
- mirascope/core/google/call_response.py +0 -232
- mirascope/core/google/call_response_chunk.py +0 -110
- mirascope/core/google/dynamic_config.py +0 -26
- mirascope/core/google/stream.py +0 -143
- mirascope/core/google/tool.py +0 -146
- mirascope/core/groq/__init__.py +0 -30
- mirascope/core/groq/_call.py +0 -67
- mirascope/core/groq/_call_kwargs.py +0 -13
- mirascope/core/groq/_utils/__init__.py +0 -14
- mirascope/core/groq/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/groq/_utils/_convert_message_params.py +0 -112
- mirascope/core/groq/_utils/_get_json_output.py +0 -27
- mirascope/core/groq/_utils/_handle_stream.py +0 -123
- mirascope/core/groq/_utils/_message_param_converter.py +0 -89
- mirascope/core/groq/_utils/_setup_call.py +0 -132
- mirascope/core/groq/call_params.py +0 -52
- mirascope/core/groq/call_response.py +0 -213
- mirascope/core/groq/call_response_chunk.py +0 -104
- mirascope/core/groq/dynamic_config.py +0 -29
- mirascope/core/groq/py.typed +0 -0
- mirascope/core/groq/stream.py +0 -135
- mirascope/core/groq/tool.py +0 -80
- mirascope/core/litellm/__init__.py +0 -28
- mirascope/core/litellm/_call.py +0 -67
- mirascope/core/litellm/_utils/__init__.py +0 -5
- mirascope/core/litellm/_utils/_setup_call.py +0 -109
- mirascope/core/litellm/call_params.py +0 -10
- mirascope/core/litellm/call_response.py +0 -24
- mirascope/core/litellm/call_response_chunk.py +0 -14
- mirascope/core/litellm/dynamic_config.py +0 -8
- mirascope/core/litellm/py.typed +0 -0
- mirascope/core/litellm/stream.py +0 -86
- mirascope/core/litellm/tool.py +0 -13
- mirascope/core/mistral/__init__.py +0 -36
- mirascope/core/mistral/_call.py +0 -65
- mirascope/core/mistral/_call_kwargs.py +0 -19
- mirascope/core/mistral/_utils/__init__.py +0 -14
- mirascope/core/mistral/_utils/_convert_common_call_params.py +0 -24
- mirascope/core/mistral/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -22
- mirascope/core/mistral/_utils/_convert_message_params.py +0 -122
- mirascope/core/mistral/_utils/_get_json_output.py +0 -34
- mirascope/core/mistral/_utils/_handle_stream.py +0 -139
- mirascope/core/mistral/_utils/_message_param_converter.py +0 -176
- mirascope/core/mistral/_utils/_setup_call.py +0 -154
- mirascope/core/mistral/call_params.py +0 -36
- mirascope/core/mistral/call_response.py +0 -205
- mirascope/core/mistral/call_response_chunk.py +0 -105
- mirascope/core/mistral/dynamic_config.py +0 -33
- mirascope/core/mistral/py.typed +0 -0
- mirascope/core/mistral/stream.py +0 -120
- mirascope/core/mistral/tool.py +0 -80
- mirascope/core/openai/__init__.py +0 -31
- mirascope/core/openai/_call.py +0 -67
- mirascope/core/openai/_call_kwargs.py +0 -13
- mirascope/core/openai/_utils/__init__.py +0 -14
- mirascope/core/openai/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/openai/_utils/_convert_message_params.py +0 -146
- mirascope/core/openai/_utils/_get_json_output.py +0 -31
- mirascope/core/openai/_utils/_handle_stream.py +0 -138
- mirascope/core/openai/_utils/_message_param_converter.py +0 -105
- mirascope/core/openai/_utils/_setup_call.py +0 -155
- mirascope/core/openai/call_params.py +0 -91
- mirascope/core/openai/call_response.py +0 -273
- mirascope/core/openai/call_response_chunk.py +0 -139
- mirascope/core/openai/dynamic_config.py +0 -34
- mirascope/core/openai/py.typed +0 -0
- mirascope/core/openai/stream.py +0 -185
- mirascope/core/openai/tool.py +0 -101
- mirascope/core/py.typed +0 -0
- mirascope/core/vertex/__init__.py +0 -45
- mirascope/core/vertex/_call.py +0 -62
- mirascope/core/vertex/_call_kwargs.py +0 -12
- mirascope/core/vertex/_utils/__init__.py +0 -14
- mirascope/core/vertex/_utils/_convert_common_call_params.py +0 -37
- mirascope/core/vertex/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/vertex/_utils/_convert_message_params.py +0 -171
- mirascope/core/vertex/_utils/_get_json_output.py +0 -36
- mirascope/core/vertex/_utils/_handle_stream.py +0 -33
- mirascope/core/vertex/_utils/_message_param_converter.py +0 -133
- mirascope/core/vertex/_utils/_setup_call.py +0 -160
- mirascope/core/vertex/call_params.py +0 -24
- mirascope/core/vertex/call_response.py +0 -206
- mirascope/core/vertex/call_response_chunk.py +0 -99
- mirascope/core/vertex/dynamic_config.py +0 -28
- mirascope/core/vertex/stream.py +0 -119
- mirascope/core/vertex/tool.py +0 -101
- mirascope/core/xai/__init__.py +0 -28
- mirascope/core/xai/_call.py +0 -67
- mirascope/core/xai/_utils/__init__.py +0 -5
- mirascope/core/xai/_utils/_setup_call.py +0 -113
- mirascope/core/xai/call_params.py +0 -10
- mirascope/core/xai/call_response.py +0 -16
- mirascope/core/xai/call_response_chunk.py +0 -14
- mirascope/core/xai/dynamic_config.py +0 -8
- mirascope/core/xai/py.typed +0 -0
- mirascope/core/xai/stream.py +0 -57
- mirascope/core/xai/tool.py +0 -13
- mirascope/experimental/graphs/__init__.py +0 -5
- mirascope/experimental/graphs/finite_state_machine.py +0 -714
- mirascope/integrations/__init__.py +0 -16
- mirascope/integrations/_middleware_factory.py +0 -403
- mirascope/integrations/langfuse/__init__.py +0 -3
- mirascope/integrations/langfuse/_utils.py +0 -114
- mirascope/integrations/langfuse/_with_langfuse.py +0 -70
- mirascope/integrations/logfire/__init__.py +0 -3
- mirascope/integrations/logfire/_utils.py +0 -225
- mirascope/integrations/logfire/_with_logfire.py +0 -63
- mirascope/integrations/otel/__init__.py +0 -10
- mirascope/integrations/otel/_utils.py +0 -270
- mirascope/integrations/otel/_with_hyperdx.py +0 -60
- mirascope/integrations/otel/_with_otel.py +0 -59
- mirascope/integrations/tenacity.py +0 -14
- mirascope/llm/_call.py +0 -401
- mirascope/llm/_context.py +0 -384
- mirascope/llm/_override.py +0 -3639
- mirascope/llm/_protocols.py +0 -500
- mirascope/llm/_response_metaclass.py +0 -31
- mirascope/llm/call_response.py +0 -167
- mirascope/llm/call_response_chunk.py +0 -66
- mirascope/llm/stream.py +0 -162
- mirascope/llm/tool.py +0 -64
- mirascope/mcp/__init__.py +0 -7
- mirascope/mcp/_utils.py +0 -277
- mirascope/mcp/client.py +0 -167
- mirascope/mcp/server.py +0 -356
- mirascope/mcp/tools.py +0 -110
- mirascope/py.typed +0 -0
- mirascope/retries/__init__.py +0 -11
- mirascope/retries/fallback.py +0 -128
- mirascope/retries/tenacity.py +0 -50
- mirascope/tools/__init__.py +0 -37
- mirascope/tools/base.py +0 -98
- mirascope/tools/system/__init__.py +0 -0
- mirascope/tools/system/_docker_operation.py +0 -166
- mirascope/tools/system/_file_system.py +0 -267
- mirascope/tools/web/__init__.py +0 -0
- mirascope/tools/web/_duckduckgo.py +0 -111
- mirascope/tools/web/_httpx.py +0 -125
- mirascope/tools/web/_parse_url_content.py +0 -94
- mirascope/tools/web/_requests.py +0 -54
- mirascope/v0/__init__.py +0 -43
- mirascope/v0/anthropic.py +0 -54
- mirascope/v0/base/__init__.py +0 -12
- mirascope/v0/base/calls.py +0 -118
- mirascope/v0/base/extractors.py +0 -122
- mirascope/v0/base/ops_utils.py +0 -207
- mirascope/v0/base/prompts.py +0 -48
- mirascope/v0/base/types.py +0 -14
- mirascope/v0/base/utils.py +0 -21
- mirascope/v0/openai.py +0 -54
- mirascope-1.22.4.dist-info/METADATA +0 -169
- mirascope-1.22.4.dist-info/RECORD +0 -377
- mirascope-1.22.4.dist-info/WHEEL +0 -4
- mirascope-1.22.4.dist-info/licenses/LICENSE +0 -21
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""Configuration utilities for Mirascope ops module initialization and setup."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from collections.abc import Iterator
|
|
7
|
+
from contextlib import contextmanager
|
|
8
|
+
from typing import TYPE_CHECKING
|
|
9
|
+
|
|
10
|
+
from opentelemetry import trace as otel_trace
|
|
11
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
12
|
+
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
13
|
+
|
|
14
|
+
from ...api.client import Mirascope
|
|
15
|
+
from ...api.settings import update_settings
|
|
16
|
+
from .exporters import MirascopeOTLPExporter
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from opentelemetry.trace import Tracer
|
|
20
|
+
|
|
21
|
+
DEFAULT_TRACER_NAME = "mirascope.llm"
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
_tracer_provider: TracerProvider | None = None
|
|
26
|
+
_tracer_name: str = DEFAULT_TRACER_NAME
|
|
27
|
+
_tracer_version: str | None = None
|
|
28
|
+
_tracer: Tracer | None = None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _create_mirascope_cloud_provider(
|
|
32
|
+
api_key: str | None = None, base_url: str | None = None
|
|
33
|
+
) -> TracerProvider:
|
|
34
|
+
"""Create a TracerProvider configured for Mirascope Cloud.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
api_key: Optional API key. If not provided, uses MIRASCOPE_API_KEY env var.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
Configured TracerProvider with MirascopeOTLPExporter.
|
|
41
|
+
|
|
42
|
+
Raises:
|
|
43
|
+
RuntimeError: If API key is not available.
|
|
44
|
+
"""
|
|
45
|
+
try:
|
|
46
|
+
client = Mirascope(api_key=api_key, base_url=base_url)
|
|
47
|
+
except (ValueError, RuntimeError) as e:
|
|
48
|
+
raise RuntimeError(
|
|
49
|
+
"Failed to create Mirascope Cloud client. "
|
|
50
|
+
"Set MIRASCOPE_API_KEY environment variable or pass api_key parameter."
|
|
51
|
+
) from e
|
|
52
|
+
|
|
53
|
+
exporter = MirascopeOTLPExporter(client=client)
|
|
54
|
+
provider = TracerProvider()
|
|
55
|
+
provider.add_span_processor(BatchSpanProcessor(exporter))
|
|
56
|
+
|
|
57
|
+
return provider
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def configure(
|
|
61
|
+
*,
|
|
62
|
+
api_key: str | None = None,
|
|
63
|
+
base_url: str | None = None,
|
|
64
|
+
tracer_provider: TracerProvider | None = None,
|
|
65
|
+
tracer_name: str = DEFAULT_TRACER_NAME,
|
|
66
|
+
tracer_version: str | None = None,
|
|
67
|
+
) -> None:
|
|
68
|
+
"""Configure the ops module for tracing.
|
|
69
|
+
|
|
70
|
+
When called without arguments, automatically configures Mirascope Cloud
|
|
71
|
+
using the MIRASCOPE_API_KEY environment variable.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
tracer_provider: Optional custom TracerProvider. If provided, this takes
|
|
75
|
+
precedence over automatic Mirascope Cloud configuration.
|
|
76
|
+
api_key: Optional Mirascope Cloud API key. If not provided, uses
|
|
77
|
+
MIRASCOPE_API_KEY environment variable.
|
|
78
|
+
tracer_name: Tracer name to use when creating a tracer.
|
|
79
|
+
Defaults to "mirascope.llm".
|
|
80
|
+
tracer_version: Optional tracer version.
|
|
81
|
+
|
|
82
|
+
Raises:
|
|
83
|
+
RuntimeError: If no tracer_provider is given and Mirascope Cloud
|
|
84
|
+
cannot be configured (missing API key).
|
|
85
|
+
|
|
86
|
+
Example:
|
|
87
|
+
Simple Mirascope Cloud configuration (recommended):
|
|
88
|
+
```python
|
|
89
|
+
import os
|
|
90
|
+
os.environ["MIRASCOPE_API_KEY"] = "your-api-key"
|
|
91
|
+
|
|
92
|
+
from mirascope import ops
|
|
93
|
+
|
|
94
|
+
ops.configure() # Automatically uses Mirascope Cloud
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
With explicit API key:
|
|
98
|
+
```python
|
|
99
|
+
from mirascope import ops
|
|
100
|
+
|
|
101
|
+
ops.configure(api_key="your-api-key")
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
With custom tracer provider:
|
|
105
|
+
```python
|
|
106
|
+
from mirascope import ops
|
|
107
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
108
|
+
|
|
109
|
+
provider = TracerProvider()
|
|
110
|
+
ops.configure(tracer_provider=provider)
|
|
111
|
+
```
|
|
112
|
+
"""
|
|
113
|
+
global _tracer_provider, _tracer_name, _tracer_version, _tracer
|
|
114
|
+
|
|
115
|
+
# Update settings so get_sync_client/get_async_client can use these values
|
|
116
|
+
if api_key is not None or base_url is not None:
|
|
117
|
+
update_settings(api_key=api_key, base_url=base_url)
|
|
118
|
+
|
|
119
|
+
# If no tracer_provider given, auto-configure Mirascope Cloud
|
|
120
|
+
if tracer_provider is None:
|
|
121
|
+
tracer_provider = _create_mirascope_cloud_provider(
|
|
122
|
+
api_key=api_key, base_url=base_url
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
_tracer_provider = tracer_provider
|
|
126
|
+
otel_trace.set_tracer_provider(tracer_provider)
|
|
127
|
+
|
|
128
|
+
_tracer_name = tracer_name
|
|
129
|
+
_tracer_version = tracer_version
|
|
130
|
+
|
|
131
|
+
_tracer = tracer_provider.get_tracer(_tracer_name, _tracer_version)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def set_tracer(tracer: Tracer | None) -> None:
|
|
135
|
+
"""Set the configured tracer instance."""
|
|
136
|
+
global _tracer
|
|
137
|
+
_tracer = tracer
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def get_tracer() -> Tracer | None:
|
|
141
|
+
"""Return the configured tracer instance."""
|
|
142
|
+
return _tracer
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@contextmanager
|
|
146
|
+
def tracer_context(tracer: Tracer | None) -> Iterator[Tracer | None]:
|
|
147
|
+
"""Context manager for temporarily setting a tracer.
|
|
148
|
+
|
|
149
|
+
Temporarily sets the tracer for the duration of the context and restores
|
|
150
|
+
the previous tracer when the context exits.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
tracer: The tracer to use within the context.
|
|
154
|
+
|
|
155
|
+
Yields:
|
|
156
|
+
The tracer that was set.
|
|
157
|
+
|
|
158
|
+
Example:
|
|
159
|
+
```python
|
|
160
|
+
from mirascope import ops
|
|
161
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
162
|
+
|
|
163
|
+
provider = TracerProvider()
|
|
164
|
+
tracer = provider.get_tracer("my-tracer")
|
|
165
|
+
|
|
166
|
+
with ops.tracer_context(tracer):
|
|
167
|
+
# Use the tracer within this context
|
|
168
|
+
...
|
|
169
|
+
# Previous tracer is restored here
|
|
170
|
+
```
|
|
171
|
+
"""
|
|
172
|
+
previous_tracer = get_tracer()
|
|
173
|
+
set_tracer(tracer)
|
|
174
|
+
try:
|
|
175
|
+
yield tracer
|
|
176
|
+
finally:
|
|
177
|
+
set_tracer(previous_tracer)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Context management utilities for distributed tracing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Iterator, Mapping
|
|
6
|
+
from contextlib import ExitStack, contextmanager
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from opentelemetry import context as otel_context
|
|
10
|
+
from opentelemetry.context import Context
|
|
11
|
+
|
|
12
|
+
from .propagation import extract_context
|
|
13
|
+
from .session import extract_session_id, session
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@contextmanager
|
|
17
|
+
def propagated_context(
|
|
18
|
+
*,
|
|
19
|
+
parent: Context | None = None,
|
|
20
|
+
extract_from: Mapping[str, Any] | None = None,
|
|
21
|
+
) -> Iterator[None]:
|
|
22
|
+
"""Attach a parent context or extract context from carrier headers.
|
|
23
|
+
|
|
24
|
+
This context manager is used to establish trace context continuity,
|
|
25
|
+
typically on the server side when receiving requests. It either extracts
|
|
26
|
+
context from incoming headers or attaches a pre-existing context.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
parent: Pre-existing OTEL context to attach. Mutually exclusive with extract_from.
|
|
30
|
+
extract_from: Dictionary of headers to extract context from (e.g., request.headers).
|
|
31
|
+
Mutually exclusive with parent.
|
|
32
|
+
|
|
33
|
+
Raises:
|
|
34
|
+
ValueError: If both parent and extract_from are provided, or if neither is provided.
|
|
35
|
+
|
|
36
|
+
Example:
|
|
37
|
+
Server-side context extraction from FastAPI request:
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
@app.post("/endpoint")
|
|
41
|
+
async def endpoint(request: Request):
|
|
42
|
+
with propagated_context(extract_from=dict(request.headers)):
|
|
43
|
+
result = process_request()
|
|
44
|
+
return result
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Using a pre-existing context:
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
with propagated_context(parent=existing_context):
|
|
51
|
+
do_work()
|
|
52
|
+
```
|
|
53
|
+
"""
|
|
54
|
+
if parent is not None and extract_from is not None:
|
|
55
|
+
raise ValueError("Cannot specify both 'parent' and 'extract_from' parameters")
|
|
56
|
+
|
|
57
|
+
if parent is None and extract_from is None:
|
|
58
|
+
raise ValueError("Must specify either 'parent' or 'extract_from' parameter")
|
|
59
|
+
|
|
60
|
+
if extract_from is not None:
|
|
61
|
+
with ExitStack() as stack:
|
|
62
|
+
session_id = extract_session_id(extract_from)
|
|
63
|
+
if session_id:
|
|
64
|
+
stack.enter_context(session(id=session_id))
|
|
65
|
+
|
|
66
|
+
extracted_context = extract_context(extract_from)
|
|
67
|
+
token = otel_context.attach(extracted_context)
|
|
68
|
+
stack.callback(otel_context.detach, token)
|
|
69
|
+
|
|
70
|
+
yield
|
|
71
|
+
elif parent is not None:
|
|
72
|
+
token = otel_context.attach(parent)
|
|
73
|
+
try:
|
|
74
|
+
yield
|
|
75
|
+
finally:
|
|
76
|
+
otel_context.detach(token)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""Mirascope OpenTelemetry exporters for two-phase telemetry.
|
|
2
|
+
|
|
3
|
+
This package provides a two-phase export system for OpenTelemetry tracing:
|
|
4
|
+
1. Immediate start event transmission for real-time visibility
|
|
5
|
+
2. Batched end event transmission for efficiency
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .exporters import MirascopeOTLPExporter
|
|
9
|
+
from .processors import MirascopeSpanProcessor
|
|
10
|
+
from .types import (
|
|
11
|
+
Link,
|
|
12
|
+
SpanContextDict,
|
|
13
|
+
SpanEvent,
|
|
14
|
+
SpanEventType,
|
|
15
|
+
Status,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"Link",
|
|
20
|
+
"MirascopeOTLPExporter",
|
|
21
|
+
"MirascopeSpanProcessor",
|
|
22
|
+
"SpanContextDict",
|
|
23
|
+
"SpanEvent",
|
|
24
|
+
"SpanEventType",
|
|
25
|
+
"Status",
|
|
26
|
+
]
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"""Exporter implementation for OpenTelemetry exporters.
|
|
2
|
+
|
|
3
|
+
This module provides the export layer for sending OpenTelemetry span
|
|
4
|
+
events to the Mirascope ingestion endpoint. It wraps the Fern-generated
|
|
5
|
+
Mirascope client to provide the interface needed by OpenTelemetry exporters.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
import time
|
|
12
|
+
from collections.abc import Sequence
|
|
13
|
+
|
|
14
|
+
from opentelemetry.sdk.trace import ReadableSpan
|
|
15
|
+
from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult
|
|
16
|
+
from opentelemetry.util.types import AttributeValue
|
|
17
|
+
|
|
18
|
+
from ....api._generated.traces.types import (
|
|
19
|
+
TracesCreateRequestResourceSpansItem,
|
|
20
|
+
TracesCreateRequestResourceSpansItemResource,
|
|
21
|
+
TracesCreateRequestResourceSpansItemResourceAttributesItem,
|
|
22
|
+
TracesCreateRequestResourceSpansItemResourceAttributesItemValue,
|
|
23
|
+
TracesCreateRequestResourceSpansItemResourceAttributesItemValueArrayValue,
|
|
24
|
+
TracesCreateRequestResourceSpansItemScopeSpansItem,
|
|
25
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemScope,
|
|
26
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemSpansItem,
|
|
27
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItem,
|
|
28
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue,
|
|
29
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValueArrayValue,
|
|
30
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemStatus,
|
|
31
|
+
)
|
|
32
|
+
from ....api.client import Mirascope
|
|
33
|
+
from .utils import to_otlp_any_value
|
|
34
|
+
|
|
35
|
+
logger = logging.getLogger(__name__)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class MirascopeOTLPExporter(SpanExporter):
|
|
39
|
+
"""OTLP/HTTP exporter for completed spans.
|
|
40
|
+
|
|
41
|
+
This exporter implements the OpenTelemetry SpanExporter interface
|
|
42
|
+
for exporting completed spans in OTLP format over HTTP. It's
|
|
43
|
+
designed to work with BatchSpanProcessor for efficient batching.
|
|
44
|
+
|
|
45
|
+
This uses the Fern auto-generated client for sending converted spans.
|
|
46
|
+
|
|
47
|
+
Attributes:
|
|
48
|
+
exporter: Export client for sending events.
|
|
49
|
+
timeout: Request timeout in seconds.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
client: Mirascope,
|
|
55
|
+
timeout: float = 30.0,
|
|
56
|
+
max_retry_attempts: int = 3,
|
|
57
|
+
) -> None:
|
|
58
|
+
"""Initialize the telemetry exporter.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
client: The Fern-generated Mirascope client instance.
|
|
62
|
+
In the future, this will accept the enhanced client from
|
|
63
|
+
mirascope.api.client that provides error handling and caching
|
|
64
|
+
capabilities.
|
|
65
|
+
timeout: Request timeout in seconds for telemetry operations.
|
|
66
|
+
max_retry_attempts: Maximum number of retry attempts for failed exports.
|
|
67
|
+
"""
|
|
68
|
+
self.client = client
|
|
69
|
+
self.timeout = timeout
|
|
70
|
+
self.max_retry_attempts = max_retry_attempts
|
|
71
|
+
self._shutdown = False
|
|
72
|
+
|
|
73
|
+
def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult:
|
|
74
|
+
"""Export a batch of spans to the telemetry endpoint.
|
|
75
|
+
|
|
76
|
+
This is the standard OpenTelemetry export interface.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
spans: Sequence of ReadableSpan objects to export.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
SpanExportResult indicating success or failure.
|
|
83
|
+
"""
|
|
84
|
+
if self._shutdown:
|
|
85
|
+
return SpanExportResult.FAILURE
|
|
86
|
+
|
|
87
|
+
if not spans:
|
|
88
|
+
return SpanExportResult.SUCCESS
|
|
89
|
+
|
|
90
|
+
exceptions: list[Exception] = []
|
|
91
|
+
delay = 0.1
|
|
92
|
+
|
|
93
|
+
for i in range(self.max_retry_attempts):
|
|
94
|
+
if i > 0:
|
|
95
|
+
time.sleep(delay)
|
|
96
|
+
delay = min(delay * 2, 5.0)
|
|
97
|
+
|
|
98
|
+
try:
|
|
99
|
+
otlp_data = self._convert_spans_to_otlp(spans)
|
|
100
|
+
response = self.client.traces.create(resource_spans=otlp_data)
|
|
101
|
+
|
|
102
|
+
if (
|
|
103
|
+
response
|
|
104
|
+
and hasattr(response, "partial_success")
|
|
105
|
+
and response.partial_success
|
|
106
|
+
):
|
|
107
|
+
partial_success = response.partial_success
|
|
108
|
+
if hasattr(partial_success, "rejected_spans"):
|
|
109
|
+
rejected = partial_success.rejected_spans
|
|
110
|
+
if rejected is not None and rejected > 0:
|
|
111
|
+
return SpanExportResult.FAILURE
|
|
112
|
+
|
|
113
|
+
return SpanExportResult.SUCCESS
|
|
114
|
+
|
|
115
|
+
except Exception as e:
|
|
116
|
+
exceptions.append(e)
|
|
117
|
+
logger.warning(
|
|
118
|
+
f"Export attempt {i + 1} failed, retrying in {delay}s: {e}"
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
logger.error(
|
|
122
|
+
f"Failed to export spans after {self.max_retry_attempts} attempts: {exceptions}"
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
return SpanExportResult.FAILURE
|
|
126
|
+
|
|
127
|
+
def _convert_spans_to_otlp(
|
|
128
|
+
self, spans: Sequence[ReadableSpan]
|
|
129
|
+
) -> list[TracesCreateRequestResourceSpansItem]:
|
|
130
|
+
"""Convert OpenTelemetry spans to OTLP format.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
spans: Sequence of ReadableSpan objects.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
List of ResourceSpans in OTLP format.
|
|
137
|
+
"""
|
|
138
|
+
resource_spans_map = {}
|
|
139
|
+
|
|
140
|
+
for span in spans:
|
|
141
|
+
try:
|
|
142
|
+
otlp_span = self._convert_span(span)
|
|
143
|
+
except ValueError as e:
|
|
144
|
+
logger.warning(f"Skipping span due to error: {e}")
|
|
145
|
+
continue
|
|
146
|
+
|
|
147
|
+
resource_key = id(span.resource) if span.resource else "default"
|
|
148
|
+
|
|
149
|
+
if resource_key not in resource_spans_map:
|
|
150
|
+
resource = None
|
|
151
|
+
if span.resource:
|
|
152
|
+
resource_attrs = []
|
|
153
|
+
for key, value in span.resource.attributes.items():
|
|
154
|
+
attr_value = self._convert_resource_attribute_value(value)
|
|
155
|
+
resource_attrs.append(
|
|
156
|
+
TracesCreateRequestResourceSpansItemResourceAttributesItem(
|
|
157
|
+
key=key,
|
|
158
|
+
value=attr_value,
|
|
159
|
+
)
|
|
160
|
+
)
|
|
161
|
+
resource = TracesCreateRequestResourceSpansItemResource(
|
|
162
|
+
attributes=resource_attrs
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
resource_spans_map[resource_key] = {
|
|
166
|
+
"resource": resource,
|
|
167
|
+
"scope_spans": {},
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
scope_key = (
|
|
171
|
+
span.instrumentation_scope.name
|
|
172
|
+
if span.instrumentation_scope
|
|
173
|
+
else "unknown"
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
if scope_key not in resource_spans_map[resource_key]["scope_spans"]:
|
|
177
|
+
scope = None
|
|
178
|
+
if span.instrumentation_scope:
|
|
179
|
+
scope = TracesCreateRequestResourceSpansItemScopeSpansItemScope(
|
|
180
|
+
name=span.instrumentation_scope.name,
|
|
181
|
+
version=span.instrumentation_scope.version,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
resource_spans_map[resource_key]["scope_spans"][scope_key] = {
|
|
185
|
+
"scope": scope,
|
|
186
|
+
"spans": [],
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
resource_spans_map[resource_key]["scope_spans"][scope_key]["spans"].append(
|
|
190
|
+
otlp_span
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
result = []
|
|
194
|
+
for resource_data in resource_spans_map.values():
|
|
195
|
+
scope_spans = []
|
|
196
|
+
for scope_data in resource_data["scope_spans"].values():
|
|
197
|
+
scope_spans.append(
|
|
198
|
+
TracesCreateRequestResourceSpansItemScopeSpansItem(
|
|
199
|
+
scope=scope_data["scope"],
|
|
200
|
+
spans=scope_data["spans"],
|
|
201
|
+
)
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
result.append(
|
|
205
|
+
TracesCreateRequestResourceSpansItem(
|
|
206
|
+
resource=resource_data["resource"],
|
|
207
|
+
scope_spans=scope_spans,
|
|
208
|
+
)
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
return result
|
|
212
|
+
|
|
213
|
+
def _convert_span(
|
|
214
|
+
self, span: ReadableSpan
|
|
215
|
+
) -> TracesCreateRequestResourceSpansItemScopeSpansItemSpansItem:
|
|
216
|
+
"""Convert a single ReadableSpan to OTLP format."""
|
|
217
|
+
context = span.get_span_context()
|
|
218
|
+
if not context or not context.is_valid:
|
|
219
|
+
raise ValueError(f"Cannot export span without valid context: {span.name}")
|
|
220
|
+
|
|
221
|
+
attributes = []
|
|
222
|
+
if span.attributes:
|
|
223
|
+
for key, value in span.attributes.items():
|
|
224
|
+
attr_value = self._convert_attribute_value(value)
|
|
225
|
+
attributes.append(
|
|
226
|
+
TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItem(
|
|
227
|
+
key=key,
|
|
228
|
+
value=attr_value,
|
|
229
|
+
)
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
status = None
|
|
233
|
+
if span.status:
|
|
234
|
+
status = TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemStatus(
|
|
235
|
+
code=span.status.status_code.value,
|
|
236
|
+
message=span.status.description or "",
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
# Convert events
|
|
240
|
+
events = None
|
|
241
|
+
if span.events:
|
|
242
|
+
events = []
|
|
243
|
+
for event in span.events:
|
|
244
|
+
event_attrs: list[dict[str, object]] = []
|
|
245
|
+
if event.attributes:
|
|
246
|
+
for key, value in event.attributes.items():
|
|
247
|
+
# Convert to OTLP attribute format with typed values
|
|
248
|
+
attr_value = self._convert_event_attribute_value(value)
|
|
249
|
+
event_attrs.append({"key": key, "value": attr_value})
|
|
250
|
+
events.append(
|
|
251
|
+
{
|
|
252
|
+
"name": event.name,
|
|
253
|
+
"timeUnixNano": str(event.timestamp)
|
|
254
|
+
if event.timestamp
|
|
255
|
+
else None,
|
|
256
|
+
"attributes": event_attrs if event_attrs else None,
|
|
257
|
+
}
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
trace_id = format(context.trace_id, "032x")
|
|
261
|
+
span_id = format(context.span_id, "016x")
|
|
262
|
+
|
|
263
|
+
# Build kwargs, only including events if present (to avoid sending null)
|
|
264
|
+
kwargs: dict[str, object] = {
|
|
265
|
+
"trace_id": trace_id,
|
|
266
|
+
"span_id": span_id,
|
|
267
|
+
"parent_span_id": (
|
|
268
|
+
format(span.parent.span_id, "016x")
|
|
269
|
+
if span.parent and span.parent.span_id
|
|
270
|
+
else None
|
|
271
|
+
),
|
|
272
|
+
"name": span.name,
|
|
273
|
+
"kind": span.kind.value if span.kind else 0,
|
|
274
|
+
"start_time_unix_nano": str(span.start_time) if span.start_time else "0",
|
|
275
|
+
"end_time_unix_nano": str(span.end_time) if span.end_time else "0",
|
|
276
|
+
"attributes": attributes or None,
|
|
277
|
+
"status": status,
|
|
278
|
+
}
|
|
279
|
+
# Only include events if present (omit entirely to avoid sending null)
|
|
280
|
+
if events:
|
|
281
|
+
kwargs["events"] = events
|
|
282
|
+
|
|
283
|
+
return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItem(**kwargs) # type: ignore[arg-type]
|
|
284
|
+
|
|
285
|
+
def _convert_attribute_value(
|
|
286
|
+
self, value: AttributeValue
|
|
287
|
+
) -> TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue:
|
|
288
|
+
"""Convert OpenTelemetry AttributeValue to Mirascope API's KeyValueValue."""
|
|
289
|
+
match value:
|
|
290
|
+
case str():
|
|
291
|
+
return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue(
|
|
292
|
+
string_value=value
|
|
293
|
+
)
|
|
294
|
+
case bool():
|
|
295
|
+
return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue(
|
|
296
|
+
bool_value=value
|
|
297
|
+
)
|
|
298
|
+
case int():
|
|
299
|
+
return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue(
|
|
300
|
+
int_value=str(value)
|
|
301
|
+
)
|
|
302
|
+
case float():
|
|
303
|
+
return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue(
|
|
304
|
+
double_value=value
|
|
305
|
+
)
|
|
306
|
+
case _:
|
|
307
|
+
return TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValue(
|
|
308
|
+
array_value=TracesCreateRequestResourceSpansItemScopeSpansItemSpansItemAttributesItemValueArrayValue(
|
|
309
|
+
values=[to_otlp_any_value(v) for v in value]
|
|
310
|
+
)
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
def _convert_event_attribute_value(
|
|
314
|
+
self, value: AttributeValue
|
|
315
|
+
) -> dict[str, object]:
|
|
316
|
+
"""Convert OpenTelemetry AttributeValue to OTLP event attribute value format."""
|
|
317
|
+
return to_otlp_any_value(value)
|
|
318
|
+
|
|
319
|
+
def _convert_resource_attribute_value(
|
|
320
|
+
self, value: AttributeValue
|
|
321
|
+
) -> TracesCreateRequestResourceSpansItemResourceAttributesItemValue:
|
|
322
|
+
"""Convert OpenTelemetry AttributeValue to Mirascope API's resource KeyValueValue."""
|
|
323
|
+
match value:
|
|
324
|
+
case str():
|
|
325
|
+
return TracesCreateRequestResourceSpansItemResourceAttributesItemValue(
|
|
326
|
+
string_value=value
|
|
327
|
+
)
|
|
328
|
+
case bool():
|
|
329
|
+
return TracesCreateRequestResourceSpansItemResourceAttributesItemValue(
|
|
330
|
+
bool_value=value
|
|
331
|
+
)
|
|
332
|
+
case int():
|
|
333
|
+
return TracesCreateRequestResourceSpansItemResourceAttributesItemValue(
|
|
334
|
+
int_value=str(value)
|
|
335
|
+
)
|
|
336
|
+
case float():
|
|
337
|
+
return TracesCreateRequestResourceSpansItemResourceAttributesItemValue(
|
|
338
|
+
double_value=value
|
|
339
|
+
)
|
|
340
|
+
case _:
|
|
341
|
+
return TracesCreateRequestResourceSpansItemResourceAttributesItemValue(
|
|
342
|
+
array_value=TracesCreateRequestResourceSpansItemResourceAttributesItemValueArrayValue(
|
|
343
|
+
values=[to_otlp_any_value(v) for v in value]
|
|
344
|
+
)
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
def shutdown(self) -> None:
|
|
348
|
+
"""Shutdown the exporter. Subsequent exports will return FAILURE."""
|
|
349
|
+
self._shutdown = True
|
|
350
|
+
|
|
351
|
+
def force_flush(self, timeout_millis: int = 30000) -> bool:
|
|
352
|
+
"""Force flush any pending data.
|
|
353
|
+
|
|
354
|
+
No-op since this exporter does not buffer data internally.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
timeout_millis: Maximum time to wait in milliseconds (unused).
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
Always True since there is no internal buffer to flush.
|
|
361
|
+
"""
|
|
362
|
+
return True
|