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
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
"""Tracing decorators for `mirascope.ops`."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
from collections.abc import Generator
|
|
7
|
+
from contextlib import contextmanager
|
|
8
|
+
from dataclasses import dataclass, field
|
|
9
|
+
from typing import Any, Generic, Literal, TypeVar
|
|
10
|
+
|
|
11
|
+
from opentelemetry.util.types import AttributeValue
|
|
12
|
+
|
|
13
|
+
from ..._utils import copy_function_metadata
|
|
14
|
+
from ...api.client import get_async_client, get_sync_client
|
|
15
|
+
from ...llm.context import Context, DepsT
|
|
16
|
+
from ...llm.responses.root_response import RootResponse
|
|
17
|
+
from .instrumentation.llm.serialize import attach_mirascope_response
|
|
18
|
+
from .protocols import (
|
|
19
|
+
AsyncContextFunction,
|
|
20
|
+
AsyncFunction,
|
|
21
|
+
AsyncSpanFunction,
|
|
22
|
+
SyncContextFunction,
|
|
23
|
+
SyncFunction,
|
|
24
|
+
SyncSpanFunction,
|
|
25
|
+
)
|
|
26
|
+
from .spans import Span
|
|
27
|
+
from .types import Jsonable, P, R
|
|
28
|
+
from .utils import (
|
|
29
|
+
PrimitiveType,
|
|
30
|
+
extract_arguments,
|
|
31
|
+
get_original_fn,
|
|
32
|
+
get_qualified_name,
|
|
33
|
+
json_dumps,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
FunctionT = TypeVar(
|
|
37
|
+
"FunctionT",
|
|
38
|
+
bound="SyncFunction[..., Any] | AsyncFunction[..., Any]",
|
|
39
|
+
covariant=True,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def record_result_to_span(span: Span, result: object) -> None:
|
|
44
|
+
"""Records the function result in the given span.
|
|
45
|
+
|
|
46
|
+
This is a shared helper function used by all traced function classes
|
|
47
|
+
to record results consistently.
|
|
48
|
+
"""
|
|
49
|
+
if result is None:
|
|
50
|
+
return # NOTE: we treat `None` valued results as such through omission.
|
|
51
|
+
elif isinstance(result, PrimitiveType):
|
|
52
|
+
output: str | int | float | bool = result
|
|
53
|
+
elif isinstance(result, RootResponse):
|
|
54
|
+
output = result.pretty()
|
|
55
|
+
attach_mirascope_response(span, result)
|
|
56
|
+
else:
|
|
57
|
+
try:
|
|
58
|
+
output = json_dumps(result)
|
|
59
|
+
except (TypeError, ValueError):
|
|
60
|
+
output = repr(result)
|
|
61
|
+
span.set(**{"mirascope.trace.output": output})
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@dataclass(kw_only=True, frozen=True)
|
|
65
|
+
class _BaseTrace(Generic[R]):
|
|
66
|
+
"""Base class for trace results with shared functionality."""
|
|
67
|
+
|
|
68
|
+
result: R
|
|
69
|
+
"""Return value produced by the traced call."""
|
|
70
|
+
|
|
71
|
+
span: Span
|
|
72
|
+
"""Span associated with the traced call."""
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def span_id(self) -> str | None:
|
|
76
|
+
"""Returns the ID of the span for the trace."""
|
|
77
|
+
return self.span.span_id
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def trace_id(self) -> str | None:
|
|
81
|
+
"""Returns the ID of the trace."""
|
|
82
|
+
return self.span.trace_id
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@dataclass(kw_only=True, frozen=True)
|
|
86
|
+
class Trace(_BaseTrace[R]):
|
|
87
|
+
"""Result container returned by traced function calls.
|
|
88
|
+
|
|
89
|
+
Provides access to the function result and trace span metadata,
|
|
90
|
+
as well as per-call operations for annotation, tagging, and assignment.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
def annotate(
|
|
94
|
+
self,
|
|
95
|
+
*,
|
|
96
|
+
label: Literal["pass", "fail"],
|
|
97
|
+
reasoning: str | None = None,
|
|
98
|
+
metadata: dict[str, Jsonable] | None = None,
|
|
99
|
+
) -> None:
|
|
100
|
+
"""Annotates the current trace span."""
|
|
101
|
+
if self.span.span_id is None or self.span.trace_id is None:
|
|
102
|
+
return
|
|
103
|
+
|
|
104
|
+
get_sync_client().annotations.create(
|
|
105
|
+
otel_span_id=self.span.span_id,
|
|
106
|
+
otel_trace_id=self.span.trace_id,
|
|
107
|
+
label=label,
|
|
108
|
+
reasoning=reasoning,
|
|
109
|
+
metadata=metadata,
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
def tag(self, *tags: str) -> None:
|
|
113
|
+
"""Adds given tags to the current trace span."""
|
|
114
|
+
raise NotImplementedError("Trace.tag not yet implemented")
|
|
115
|
+
|
|
116
|
+
def assign(self, *emails: str) -> None:
|
|
117
|
+
"""Assigns the trace to users with the given emails."""
|
|
118
|
+
raise NotImplementedError("Trace.assign not yet implemented")
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
@dataclass(kw_only=True, frozen=True)
|
|
122
|
+
class AsyncTrace(_BaseTrace[R]):
|
|
123
|
+
"""Result container returned by async traced function calls.
|
|
124
|
+
|
|
125
|
+
Provides access to the function result and trace span metadata,
|
|
126
|
+
as well as per-call operations for annotation, tagging, and assignment.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
async def annotate(
|
|
130
|
+
self,
|
|
131
|
+
*,
|
|
132
|
+
label: Literal["pass", "fail"],
|
|
133
|
+
reasoning: str | None = None,
|
|
134
|
+
metadata: dict[str, Jsonable] | None = None,
|
|
135
|
+
) -> None:
|
|
136
|
+
"""Annotates the current trace span."""
|
|
137
|
+
if self.span.span_id is None or self.span.trace_id is None:
|
|
138
|
+
return
|
|
139
|
+
|
|
140
|
+
await get_async_client().annotations.create(
|
|
141
|
+
otel_span_id=self.span.span_id,
|
|
142
|
+
otel_trace_id=self.span.trace_id,
|
|
143
|
+
label=label,
|
|
144
|
+
reasoning=reasoning,
|
|
145
|
+
metadata=metadata,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
async def tag(self, *tags: str) -> None:
|
|
149
|
+
"""Adds given tags to the current trace span."""
|
|
150
|
+
raise NotImplementedError("AsyncTrace.tag not yet implemented")
|
|
151
|
+
|
|
152
|
+
async def assign(self, *emails: str) -> None:
|
|
153
|
+
"""Assigns the trace to users with the given emails."""
|
|
154
|
+
raise NotImplementedError("AsyncTrace.assign not yet implemented")
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
@dataclass(kw_only=True)
|
|
158
|
+
class _BaseFunction(Generic[P, R, FunctionT], ABC):
|
|
159
|
+
"""Abstract base class for base functions to be traced."""
|
|
160
|
+
|
|
161
|
+
fn: FunctionT
|
|
162
|
+
"""The function being traced."""
|
|
163
|
+
|
|
164
|
+
tags: tuple[str, ...]
|
|
165
|
+
"""Tags to be associated with the trace span."""
|
|
166
|
+
|
|
167
|
+
metadata: dict[str, str] = field(default_factory=dict)
|
|
168
|
+
"""Arbitrary key-value pairs for additional metadata."""
|
|
169
|
+
|
|
170
|
+
_qualified_name: str = field(init=False)
|
|
171
|
+
"""Fully qualified name of the wrapped function."""
|
|
172
|
+
|
|
173
|
+
_module_name: str = field(init=False)
|
|
174
|
+
"""Module name of the wrapped function."""
|
|
175
|
+
|
|
176
|
+
_is_async: bool = field(init=False)
|
|
177
|
+
"""Whether the wrapped function is asynchronous."""
|
|
178
|
+
|
|
179
|
+
__name__: str = field(init=False, repr=False, default="")
|
|
180
|
+
"""The name of the underlying function (preserved for decorator stacking)."""
|
|
181
|
+
|
|
182
|
+
def __post_init__(self) -> None:
|
|
183
|
+
"""Initialize additional attributes after dataclass init."""
|
|
184
|
+
self._qualified_name = get_qualified_name(self.fn)
|
|
185
|
+
original_fn = get_original_fn(self.fn)
|
|
186
|
+
self._module_name = getattr(original_fn, "__module__", "")
|
|
187
|
+
copy_function_metadata(self, original_fn)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
@dataclass(kw_only=True)
|
|
191
|
+
class _BaseTracedFunction(_BaseFunction[P, R, FunctionT]):
|
|
192
|
+
"""Abstract base class for traced function wrappers."""
|
|
193
|
+
|
|
194
|
+
@contextmanager
|
|
195
|
+
def _span(self, *args: P.args, **kwargs: P.kwargs) -> Generator[Span, None, None]:
|
|
196
|
+
"""Returns a span context manager populated with call attributes."""
|
|
197
|
+
arg_types, arg_values = extract_arguments(self.fn, *args, **kwargs)
|
|
198
|
+
with Span(self._qualified_name) as span:
|
|
199
|
+
attributes: dict[str, AttributeValue] = {
|
|
200
|
+
"mirascope.type": "trace",
|
|
201
|
+
"mirascope.fn.qualname": self._qualified_name,
|
|
202
|
+
"mirascope.fn.module": self._module_name,
|
|
203
|
+
"mirascope.fn.is_async": self._is_async,
|
|
204
|
+
"mirascope.trace.arg_types": json_dumps(arg_types),
|
|
205
|
+
"mirascope.trace.arg_values": json_dumps(arg_values),
|
|
206
|
+
}
|
|
207
|
+
if self.tags:
|
|
208
|
+
attributes["mirascope.trace.tags"] = list(self.tags)
|
|
209
|
+
if self.metadata:
|
|
210
|
+
attributes["mirascope.trace.metadata"] = json_dumps(self.metadata)
|
|
211
|
+
span.set(**attributes)
|
|
212
|
+
yield span
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
@dataclass(kw_only=True)
|
|
216
|
+
class BaseSyncTracedFunction(_BaseTracedFunction[P, R, SyncFunction[P, R]]):
|
|
217
|
+
"""Abstract base class for synchronous traced function wrappers."""
|
|
218
|
+
|
|
219
|
+
_is_async: bool = field(default=False, init=False)
|
|
220
|
+
"""Whether the wrapped function is asynchronous."""
|
|
221
|
+
|
|
222
|
+
@abstractmethod
|
|
223
|
+
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
224
|
+
"""Returns the result of the traced function directly."""
|
|
225
|
+
...
|
|
226
|
+
|
|
227
|
+
@abstractmethod
|
|
228
|
+
def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> Trace[R]:
|
|
229
|
+
"""Returns the trace containing the function result and span info."""
|
|
230
|
+
...
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
@dataclass(kw_only=True)
|
|
234
|
+
class TracedFunction(BaseSyncTracedFunction[P, R]):
|
|
235
|
+
"""Wrapper for synchronous functions with tracing capabilities.
|
|
236
|
+
|
|
237
|
+
Provides traced execution of synchronous functions, returning Trace
|
|
238
|
+
with access to span information.
|
|
239
|
+
"""
|
|
240
|
+
|
|
241
|
+
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
242
|
+
"""Returns the result of the traced function directly."""
|
|
243
|
+
with self._span(*args, **kwargs) as span:
|
|
244
|
+
result = self.fn(*args, **kwargs)
|
|
245
|
+
record_result_to_span(span, result)
|
|
246
|
+
return result
|
|
247
|
+
|
|
248
|
+
def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> Trace[R]:
|
|
249
|
+
"""Returns the trace containing the function result and span info."""
|
|
250
|
+
with self._span(*args, **kwargs) as span:
|
|
251
|
+
result = self.fn(*args, **kwargs)
|
|
252
|
+
record_result_to_span(span, result)
|
|
253
|
+
return Trace(result=result, span=span)
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
@dataclass(kw_only=True)
|
|
257
|
+
class BaseAsyncTracedFunction(_BaseTracedFunction[P, R, AsyncFunction[P, R]]):
|
|
258
|
+
"""Abstract base class for asynchronous traced function wrappers."""
|
|
259
|
+
|
|
260
|
+
_is_async: bool = field(default=True, init=False)
|
|
261
|
+
"""Whether the wrapped function is asynchronous."""
|
|
262
|
+
|
|
263
|
+
@abstractmethod
|
|
264
|
+
async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
265
|
+
"""Returns the result of the traced function directly."""
|
|
266
|
+
...
|
|
267
|
+
|
|
268
|
+
@abstractmethod
|
|
269
|
+
async def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> AsyncTrace[R]:
|
|
270
|
+
"""Returns the trace containing the function result and span info."""
|
|
271
|
+
...
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
@dataclass(kw_only=True)
|
|
275
|
+
class AsyncTracedFunction(BaseAsyncTracedFunction[P, R]):
|
|
276
|
+
"""Wrapper for asynchronous functions with tracing capabilities.
|
|
277
|
+
|
|
278
|
+
Provides traced execution of asynchronous functions, returning AsyncTrace
|
|
279
|
+
with access to span information.
|
|
280
|
+
"""
|
|
281
|
+
|
|
282
|
+
async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
283
|
+
"""Returns the result of the traced function directly."""
|
|
284
|
+
with self._span(*args, **kwargs) as span:
|
|
285
|
+
result = await self.fn(*args, **kwargs)
|
|
286
|
+
record_result_to_span(span, result)
|
|
287
|
+
return result
|
|
288
|
+
|
|
289
|
+
async def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> AsyncTrace[R]:
|
|
290
|
+
"""Returns the trace containing the function result and span info."""
|
|
291
|
+
with self._span(*args, **kwargs) as span:
|
|
292
|
+
result = await self.fn(*args, **kwargs)
|
|
293
|
+
record_result_to_span(span, result)
|
|
294
|
+
return AsyncTrace(result=result, span=span)
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
@dataclass(kw_only=True)
|
|
298
|
+
class _BaseTracedContextFunction(
|
|
299
|
+
_BaseFunction[P, R, FunctionT], Generic[P, DepsT, R, FunctionT]
|
|
300
|
+
):
|
|
301
|
+
"""Abstract base class for traced function wrappers."""
|
|
302
|
+
|
|
303
|
+
_is_async: bool = field(default=False, init=False)
|
|
304
|
+
"""Whether the wrapped function is asynchronous."""
|
|
305
|
+
|
|
306
|
+
@contextmanager
|
|
307
|
+
def _span(
|
|
308
|
+
self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
309
|
+
) -> Generator[Span, None, None]:
|
|
310
|
+
"""Returns a span context manager populated with call attributes."""
|
|
311
|
+
arg_types, arg_values = extract_arguments(self.fn, ctx, *args, **kwargs)
|
|
312
|
+
with Span(name=self._qualified_name) as span:
|
|
313
|
+
attributes: dict[str, AttributeValue] = {
|
|
314
|
+
"mirascope.type": "trace",
|
|
315
|
+
"mirascope.fn.qualname": self._qualified_name,
|
|
316
|
+
"mirascope.fn.module": self.fn.__module__,
|
|
317
|
+
"mirascope.fn.is_async": self._is_async,
|
|
318
|
+
"mirascope.trace.arg_types": json_dumps(arg_types),
|
|
319
|
+
"mirascope.trace.arg_values": json_dumps(arg_values),
|
|
320
|
+
}
|
|
321
|
+
if self.tags:
|
|
322
|
+
attributes["mirascope.trace.tags"] = list(self.tags)
|
|
323
|
+
if self.metadata:
|
|
324
|
+
attributes["mirascope.trace.metadata"] = json_dumps(self.metadata)
|
|
325
|
+
span.set(**attributes)
|
|
326
|
+
yield span
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
@dataclass(kw_only=True)
|
|
330
|
+
class BaseTracedSyncContextFunction(
|
|
331
|
+
_BaseTracedContextFunction[P, DepsT, R, SyncContextFunction[P, DepsT, R]]
|
|
332
|
+
):
|
|
333
|
+
"""Abstract base class for synchronous traced function wrappers."""
|
|
334
|
+
|
|
335
|
+
_is_async: bool = field(default=False, init=False)
|
|
336
|
+
"""Whether the wrapped function is asynchronous."""
|
|
337
|
+
|
|
338
|
+
@abstractmethod
|
|
339
|
+
def __call__(self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs) -> R:
|
|
340
|
+
"""Returns the result of the traced function directly."""
|
|
341
|
+
...
|
|
342
|
+
|
|
343
|
+
@abstractmethod
|
|
344
|
+
def wrapped(
|
|
345
|
+
self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
346
|
+
) -> Trace[R]:
|
|
347
|
+
"""Returns the trace containing the function result and span info."""
|
|
348
|
+
...
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
@dataclass(kw_only=True)
|
|
352
|
+
class TracedContextFunction(BaseTracedSyncContextFunction[P, DepsT, R]):
|
|
353
|
+
"""Wrapper for synchronous context functions with tracing capabilities.
|
|
354
|
+
|
|
355
|
+
Provides traced execution of synchronous functions that take a Context parameter,
|
|
356
|
+
returning Trace with access to span information.
|
|
357
|
+
"""
|
|
358
|
+
|
|
359
|
+
def __call__(self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs) -> R:
|
|
360
|
+
"""Returns the result of the traced function directly."""
|
|
361
|
+
with self._span(ctx, *args, **kwargs) as span:
|
|
362
|
+
result = self.fn(ctx, *args, **kwargs)
|
|
363
|
+
record_result_to_span(span, result)
|
|
364
|
+
return result
|
|
365
|
+
|
|
366
|
+
def wrapped(
|
|
367
|
+
self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
368
|
+
) -> Trace[R]:
|
|
369
|
+
"""Returns the trace containing the function result and span info."""
|
|
370
|
+
with self._span(ctx, *args, **kwargs) as span:
|
|
371
|
+
result = self.fn(ctx, *args, **kwargs)
|
|
372
|
+
record_result_to_span(span, result)
|
|
373
|
+
return Trace(result=result, span=span)
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
@dataclass(kw_only=True)
|
|
377
|
+
class BaseTracedAsyncContextFunction(
|
|
378
|
+
_BaseTracedContextFunction[P, DepsT, R, AsyncContextFunction[P, DepsT, R]]
|
|
379
|
+
):
|
|
380
|
+
"""Abstract base class for synchronous traced function wrappers."""
|
|
381
|
+
|
|
382
|
+
_is_async: bool = field(default=True, init=False)
|
|
383
|
+
"""Whether the wrapped function is asynchronous."""
|
|
384
|
+
|
|
385
|
+
@abstractmethod
|
|
386
|
+
async def __call__(
|
|
387
|
+
self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
388
|
+
) -> R:
|
|
389
|
+
"""Returns the result of the traced function directly."""
|
|
390
|
+
...
|
|
391
|
+
|
|
392
|
+
@abstractmethod
|
|
393
|
+
async def wrapped(
|
|
394
|
+
self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
395
|
+
) -> AsyncTrace[R]:
|
|
396
|
+
"""Returns the trace containing the function result and span info."""
|
|
397
|
+
...
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
@dataclass(kw_only=True)
|
|
401
|
+
class AsyncTracedContextFunction(BaseTracedAsyncContextFunction[P, DepsT, R]):
|
|
402
|
+
"""Wrapper for asynchronous context functions with tracing capabilities.
|
|
403
|
+
|
|
404
|
+
Provides traced execution of asynchronous functions that take a Context parameter,
|
|
405
|
+
returning AsyncTrace with access to span information.
|
|
406
|
+
"""
|
|
407
|
+
|
|
408
|
+
async def __call__(
|
|
409
|
+
self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
410
|
+
) -> R:
|
|
411
|
+
"""Returns the result of the traced function directly."""
|
|
412
|
+
with self._span(ctx, *args, **kwargs) as span:
|
|
413
|
+
result = await self.fn(ctx, *args, **kwargs)
|
|
414
|
+
record_result_to_span(span, result)
|
|
415
|
+
return result
|
|
416
|
+
|
|
417
|
+
async def wrapped(
|
|
418
|
+
self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
419
|
+
) -> AsyncTrace[R]:
|
|
420
|
+
"""Returns the trace containing the function result and span info."""
|
|
421
|
+
with self._span(ctx, *args, **kwargs) as span:
|
|
422
|
+
result = await self.fn(ctx, *args, **kwargs)
|
|
423
|
+
record_result_to_span(span, result)
|
|
424
|
+
return AsyncTrace(result=result, span=span)
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
@dataclass(kw_only=True)
|
|
428
|
+
class BaseSyncTracedSpanFunction(_BaseTracedFunction[P, R, SyncSpanFunction[P, R]]):
|
|
429
|
+
"""Abstract base class for synchronous traced span function wrappers."""
|
|
430
|
+
|
|
431
|
+
_is_async: bool = field(default=False, init=False)
|
|
432
|
+
"""Whether the wrapped function is asynchronous."""
|
|
433
|
+
|
|
434
|
+
@abstractmethod
|
|
435
|
+
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
436
|
+
"""Returns the result of the traced function directly."""
|
|
437
|
+
...
|
|
438
|
+
|
|
439
|
+
@abstractmethod
|
|
440
|
+
def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> Trace[R]:
|
|
441
|
+
"""Returns the trace containing the function result and span info."""
|
|
442
|
+
...
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
@dataclass(kw_only=True)
|
|
446
|
+
class TracedSpanFunction(BaseSyncTracedSpanFunction[P, R]):
|
|
447
|
+
"""Wrapper for synchronous functions that receive Span as first parameter.
|
|
448
|
+
|
|
449
|
+
The external interface does NOT include `trace_ctx` - it is injected
|
|
450
|
+
automatically by the decorator when calling the inner function.
|
|
451
|
+
|
|
452
|
+
Example:
|
|
453
|
+
```python
|
|
454
|
+
@ops.trace
|
|
455
|
+
def my_fn(trace_ctx: Span, arg: str) -> str:
|
|
456
|
+
trace_ctx.info(f"Processing: {arg}")
|
|
457
|
+
return arg.upper()
|
|
458
|
+
|
|
459
|
+
# Call without trace_ctx - it's injected
|
|
460
|
+
result = my_fn("hello") # Returns "HELLO"
|
|
461
|
+
```
|
|
462
|
+
"""
|
|
463
|
+
|
|
464
|
+
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
465
|
+
"""Returns the result of the traced function directly."""
|
|
466
|
+
with self._span(*args, **kwargs) as span:
|
|
467
|
+
result = self.fn(span, *args, **kwargs)
|
|
468
|
+
record_result_to_span(span, result)
|
|
469
|
+
return result
|
|
470
|
+
|
|
471
|
+
def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> Trace[R]:
|
|
472
|
+
"""Returns the trace containing the function result and span info."""
|
|
473
|
+
with self._span(*args, **kwargs) as span:
|
|
474
|
+
result = self.fn(span, *args, **kwargs)
|
|
475
|
+
record_result_to_span(span, result)
|
|
476
|
+
return Trace(result=result, span=span)
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
@dataclass(kw_only=True)
|
|
480
|
+
class BaseAsyncTracedSpanFunction(_BaseTracedFunction[P, R, AsyncSpanFunction[P, R]]):
|
|
481
|
+
"""Abstract base class for asynchronous traced span function wrappers."""
|
|
482
|
+
|
|
483
|
+
_is_async: bool = field(default=True, init=False)
|
|
484
|
+
"""Whether the wrapped function is asynchronous."""
|
|
485
|
+
|
|
486
|
+
@abstractmethod
|
|
487
|
+
async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
488
|
+
"""Returns the result of the traced function directly."""
|
|
489
|
+
...
|
|
490
|
+
|
|
491
|
+
@abstractmethod
|
|
492
|
+
async def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> AsyncTrace[R]:
|
|
493
|
+
"""Returns the trace containing the function result and span info."""
|
|
494
|
+
...
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
@dataclass(kw_only=True)
|
|
498
|
+
class AsyncTracedSpanFunction(BaseAsyncTracedSpanFunction[P, R]):
|
|
499
|
+
"""Wrapper for asynchronous functions that receive Span as first parameter.
|
|
500
|
+
|
|
501
|
+
The external interface does NOT include `trace_ctx` - it is injected
|
|
502
|
+
automatically by the decorator when calling the inner function.
|
|
503
|
+
|
|
504
|
+
Example:
|
|
505
|
+
```python
|
|
506
|
+
@ops.trace
|
|
507
|
+
async def my_fn(trace_ctx: Span, arg: str) -> str:
|
|
508
|
+
trace_ctx.info(f"Processing: {arg}")
|
|
509
|
+
return arg.upper()
|
|
510
|
+
|
|
511
|
+
# Call without trace_ctx - it's injected
|
|
512
|
+
result = await my_fn("hello") # Returns "HELLO"
|
|
513
|
+
```
|
|
514
|
+
"""
|
|
515
|
+
|
|
516
|
+
async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
517
|
+
"""Returns the result of the traced function directly."""
|
|
518
|
+
with self._span(*args, **kwargs) as span:
|
|
519
|
+
result = await self.fn(span, *args, **kwargs)
|
|
520
|
+
record_result_to_span(span, result)
|
|
521
|
+
return result
|
|
522
|
+
|
|
523
|
+
async def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> AsyncTrace[R]:
|
|
524
|
+
"""Returns the trace containing the function result and span info."""
|
|
525
|
+
with self._span(*args, **kwargs) as span:
|
|
526
|
+
result = await self.fn(span, *args, **kwargs)
|
|
527
|
+
record_result_to_span(span, result)
|
|
528
|
+
return AsyncTrace(result=result, span=span)
|