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,82 @@
|
|
|
1
|
+
"""OpenTelemetry instrumentation for OpenAI SDK."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from opentelemetry.instrumentation.openai_v2 import OpenAIInstrumentor
|
|
8
|
+
|
|
9
|
+
from .base import BaseInstrumentation, ContentCaptureMode
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from opentelemetry.trace import TracerProvider
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class OpenAIInstrumentation(BaseInstrumentation[OpenAIInstrumentor]):
|
|
16
|
+
"""Manages OpenTelemetry instrumentation lifecycle for the OpenAI SDK."""
|
|
17
|
+
|
|
18
|
+
def _create_instrumentor(self) -> OpenAIInstrumentor:
|
|
19
|
+
"""Create a new OpenAI instrumentor instance."""
|
|
20
|
+
return OpenAIInstrumentor()
|
|
21
|
+
|
|
22
|
+
def _configure_capture_content(self, capture_content: ContentCaptureMode) -> None:
|
|
23
|
+
"""Configure environment variables for OpenAI content capture."""
|
|
24
|
+
if capture_content == "enabled":
|
|
25
|
+
self._set_env_var(
|
|
26
|
+
"OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT", "true"
|
|
27
|
+
)
|
|
28
|
+
elif capture_content == "disabled":
|
|
29
|
+
self._set_env_var(
|
|
30
|
+
"OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT", "false"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def instrument_openai(
|
|
35
|
+
*,
|
|
36
|
+
tracer_provider: TracerProvider | None = None,
|
|
37
|
+
capture_content: ContentCaptureMode = "default",
|
|
38
|
+
) -> None:
|
|
39
|
+
"""Enable OpenTelemetry instrumentation for the OpenAI Python SDK.
|
|
40
|
+
|
|
41
|
+
Uses the provided tracer_provider or the global OpenTelemetry tracer provider.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
tracer_provider: Optional tracer provider to use. If not provided,
|
|
45
|
+
uses the global OpenTelemetry tracer provider.
|
|
46
|
+
capture_content: Controls whether to capture message content in spans.
|
|
47
|
+
- "enabled": Capture message content
|
|
48
|
+
- "disabled": Do not capture message content
|
|
49
|
+
- "default": Use the library's default behavior
|
|
50
|
+
|
|
51
|
+
Example:
|
|
52
|
+
|
|
53
|
+
Enable instrumentation with Mirascope Cloud:
|
|
54
|
+
```python
|
|
55
|
+
from mirascope import ops
|
|
56
|
+
|
|
57
|
+
ops.configure()
|
|
58
|
+
ops.instrument_openai()
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Enable instrumentation with content capture:
|
|
62
|
+
```python
|
|
63
|
+
from mirascope import ops
|
|
64
|
+
|
|
65
|
+
ops.configure()
|
|
66
|
+
ops.instrument_openai(capture_content="enabled")
|
|
67
|
+
```
|
|
68
|
+
"""
|
|
69
|
+
OpenAIInstrumentation().instrument(
|
|
70
|
+
tracer_provider=tracer_provider,
|
|
71
|
+
capture_content=capture_content,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def uninstrument_openai() -> None:
|
|
76
|
+
"""Disable previously configured OpenAI instrumentation."""
|
|
77
|
+
OpenAIInstrumentation().uninstrument()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def is_openai_instrumented() -> bool:
|
|
81
|
+
"""Return whether OpenAI instrumentation is currently active."""
|
|
82
|
+
return OpenAIInstrumentation().is_instrumented
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""Context propagation utilities for distributed tracing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
from collections.abc import Mapping, MutableMapping
|
|
8
|
+
from typing import Literal, TypeAlias
|
|
9
|
+
|
|
10
|
+
from opentelemetry import propagate
|
|
11
|
+
from opentelemetry.context import Context
|
|
12
|
+
from opentelemetry.propagators.b3 import B3MultiFormat, B3SingleFormat
|
|
13
|
+
from opentelemetry.propagators.composite import CompositePropagator
|
|
14
|
+
from opentelemetry.propagators.jaeger import JaegerPropagator
|
|
15
|
+
from opentelemetry.propagators.textmap import Setter, TextMapPropagator
|
|
16
|
+
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
|
|
17
|
+
|
|
18
|
+
from ..exceptions import ConfigurationError
|
|
19
|
+
from .session import SESSION_HEADER_NAME, current_session
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
PropagatorFormat: TypeAlias = Literal[
|
|
24
|
+
"tracecontext", "b3", "b3multi", "jaeger", "composite"
|
|
25
|
+
]
|
|
26
|
+
CarrierValue: TypeAlias = str | list[str]
|
|
27
|
+
|
|
28
|
+
# Environment variable names
|
|
29
|
+
ENV_PROPAGATOR_FORMAT = "MIRASCOPE_PROPAGATOR"
|
|
30
|
+
ENV_PROPAGATOR_SET_GLOBAL = "_MIRASCOPE_PROPAGATOR_SET_GLOBAL"
|
|
31
|
+
|
|
32
|
+
_PROPAGATOR: ContextPropagator | None = None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class _StrSetter(Setter[MutableMapping[str, str]]):
|
|
36
|
+
"""Setter that writes string header values into the carrier."""
|
|
37
|
+
|
|
38
|
+
def set(self, carrier: MutableMapping[str, str], key: str, value: str) -> None:
|
|
39
|
+
"""Set a single header value on the carrier."""
|
|
40
|
+
carrier[key] = value
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
_STR_SETTER = _StrSetter()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ContextPropagator:
|
|
47
|
+
"""Manages OpenTelemetry context propagation across service boundaries."""
|
|
48
|
+
|
|
49
|
+
_propagator: TextMapPropagator
|
|
50
|
+
|
|
51
|
+
def __init__(self, *, set_global: bool = True) -> None:
|
|
52
|
+
"""Initialize propagator and optionally set as global.
|
|
53
|
+
|
|
54
|
+
Propagator format is determined by MIRASCOPE_PROPAGATOR environment variable.
|
|
55
|
+
Defaults to "tracecontext" if not set.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
set_global: Whether to set this propagator as the global textmap propagator.
|
|
59
|
+
|
|
60
|
+
Raises:
|
|
61
|
+
ConfigurationError: If the propagator format is invalid.
|
|
62
|
+
"""
|
|
63
|
+
env_format = os.environ.get(ENV_PROPAGATOR_FORMAT, "tracecontext")
|
|
64
|
+
propagator_name: PropagatorFormat
|
|
65
|
+
if env_format in ("tracecontext", "b3", "b3multi", "jaeger", "composite"):
|
|
66
|
+
propagator_name = env_format
|
|
67
|
+
else:
|
|
68
|
+
error_message = (
|
|
69
|
+
f"Invalid propagator format: {env_format}. "
|
|
70
|
+
f"Valid options: tracecontext, b3, b3multi, jaeger, composite"
|
|
71
|
+
)
|
|
72
|
+
logger.error(error_message)
|
|
73
|
+
raise ConfigurationError(error_message)
|
|
74
|
+
logger.debug(f"Initializing ContextPropagator with format: {propagator_name}")
|
|
75
|
+
|
|
76
|
+
match propagator_name:
|
|
77
|
+
case "tracecontext":
|
|
78
|
+
self._propagator = TraceContextTextMapPropagator()
|
|
79
|
+
case "b3":
|
|
80
|
+
self._propagator = B3SingleFormat()
|
|
81
|
+
case "b3multi":
|
|
82
|
+
self._propagator = B3MultiFormat()
|
|
83
|
+
case "jaeger":
|
|
84
|
+
self._propagator = JaegerPropagator()
|
|
85
|
+
case "composite":
|
|
86
|
+
propagators: list[TextMapPropagator] = [
|
|
87
|
+
TraceContextTextMapPropagator(),
|
|
88
|
+
B3SingleFormat(),
|
|
89
|
+
B3MultiFormat(),
|
|
90
|
+
JaegerPropagator(),
|
|
91
|
+
]
|
|
92
|
+
self._propagator = CompositePropagator(propagators)
|
|
93
|
+
|
|
94
|
+
if set_global:
|
|
95
|
+
should_set_global = os.environ.get(ENV_PROPAGATOR_SET_GLOBAL, "true")
|
|
96
|
+
if should_set_global.lower() == "true":
|
|
97
|
+
propagate.set_global_textmap(self._propagator)
|
|
98
|
+
logger.debug(f"Set {propagator_name} as global textmap propagator")
|
|
99
|
+
|
|
100
|
+
def extract_context(self, carrier: Mapping[str, CarrierValue]) -> Context:
|
|
101
|
+
"""Extract OTEL context from carrier headers.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
carrier: Dictionary containing HTTP headers or similar carrier data.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
Extracted OpenTelemetry context. Returns empty context if extraction fails.
|
|
108
|
+
"""
|
|
109
|
+
try:
|
|
110
|
+
context = self._propagator.extract(carrier=carrier)
|
|
111
|
+
logger.debug("Successfully extracted context from carrier")
|
|
112
|
+
return context
|
|
113
|
+
except Exception as exception:
|
|
114
|
+
logger.debug(
|
|
115
|
+
f"Failed to extract context from carrier: {type(exception).__name__}: {exception}"
|
|
116
|
+
)
|
|
117
|
+
return Context()
|
|
118
|
+
|
|
119
|
+
def inject_context(
|
|
120
|
+
self,
|
|
121
|
+
carrier: MutableMapping[str, str],
|
|
122
|
+
context: Context | None = None,
|
|
123
|
+
) -> None:
|
|
124
|
+
"""Inject current OTEL context into carrier headers.
|
|
125
|
+
|
|
126
|
+
This method also injects session context if one is active, adding the
|
|
127
|
+
SESSION_HEADER_NAME header to the carrier.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
carrier: Mutable mapping (e.g., HTTP headers dict) to inject context into.
|
|
131
|
+
context: Optional specific context to inject. If None, uses current context.
|
|
132
|
+
"""
|
|
133
|
+
try:
|
|
134
|
+
self._propagator.inject(
|
|
135
|
+
carrier=carrier, context=context, setter=_STR_SETTER
|
|
136
|
+
)
|
|
137
|
+
logger.debug("Successfully injected context into carrier")
|
|
138
|
+
except Exception as exception:
|
|
139
|
+
logger.debug(
|
|
140
|
+
f"Failed to inject context into carrier: {type(exception).__name__}: {exception}"
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
session_ctx = current_session()
|
|
144
|
+
if session_ctx is not None:
|
|
145
|
+
carrier[SESSION_HEADER_NAME] = session_ctx.id
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def get_propagator() -> ContextPropagator:
|
|
149
|
+
"""Get or create the singleton ContextPropagator instance.
|
|
150
|
+
|
|
151
|
+
Reads propagator format from MIRASCOPE_PROPAGATOR environment variable.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
The global ContextPropagator instance.
|
|
155
|
+
"""
|
|
156
|
+
global _PROPAGATOR
|
|
157
|
+
if _PROPAGATOR is None:
|
|
158
|
+
_PROPAGATOR = ContextPropagator()
|
|
159
|
+
return _PROPAGATOR
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def reset_propagator() -> None:
|
|
163
|
+
"""Reset the singleton ContextPropagator instance.
|
|
164
|
+
|
|
165
|
+
This is primarily useful for testing to ensure a clean state between tests.
|
|
166
|
+
The next call to get_propagator() will create a new instance.
|
|
167
|
+
"""
|
|
168
|
+
global _PROPAGATOR
|
|
169
|
+
_PROPAGATOR = None
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def extract_context(carrier: Mapping[str, CarrierValue]) -> Context:
|
|
173
|
+
"""Extract OTEL context from carrier headers using the global propagator.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
carrier: Dictionary containing HTTP headers or similar carrier data.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Extracted OpenTelemetry context.
|
|
180
|
+
"""
|
|
181
|
+
return get_propagator().extract_context(carrier)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def inject_context(
|
|
185
|
+
carrier: MutableMapping[str, str],
|
|
186
|
+
*,
|
|
187
|
+
context: Context | None = None,
|
|
188
|
+
) -> None:
|
|
189
|
+
"""Inject current OTEL context into carrier headers using the global propagator.
|
|
190
|
+
|
|
191
|
+
This function also injects session context if one is active, adding the
|
|
192
|
+
SESSION_HEADER_NAME header to the carrier.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
carrier: Mutable mapping (e.g., HTTP headers dict) to inject context into.
|
|
196
|
+
context: Optional specific context to inject. If None, uses current context.
|
|
197
|
+
"""
|
|
198
|
+
get_propagator().inject_context(carrier, context)
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"""Call protocol helpers for ops.tracing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
from typing import TYPE_CHECKING, Protocol
|
|
7
|
+
from typing_extensions import TypeIs
|
|
8
|
+
|
|
9
|
+
from ...llm.context import Context, DepsT
|
|
10
|
+
from .types import P, R
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from .spans import Span
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SyncFunction(Protocol[P, R]):
|
|
17
|
+
"""Protocol for synchronous callable functions."""
|
|
18
|
+
|
|
19
|
+
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
20
|
+
"""The function required a synchronous call method."""
|
|
21
|
+
... # pragma: no cover
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class AsyncFunction(Protocol[P, R]):
|
|
25
|
+
"""Protocol for asynchronous callable functions."""
|
|
26
|
+
|
|
27
|
+
async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
28
|
+
"""The function's required asynchronous call method."""
|
|
29
|
+
... # pragma: no cover
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SyncSpanFunction(Protocol[P, R]):
|
|
33
|
+
"""Protocol for synchronous functions that receive injected Span.
|
|
34
|
+
|
|
35
|
+
Functions matching this protocol have `trace_ctx: Span` as their first
|
|
36
|
+
parameter. The trace decorator will inject the span automatically.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __call__(self, trace_ctx: Span, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
40
|
+
"""The function receives a Span as first parameter."""
|
|
41
|
+
... # pragma: no cover
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class AsyncSpanFunction(Protocol[P, R]):
|
|
45
|
+
"""Protocol for asynchronous functions that receive injected Span.
|
|
46
|
+
|
|
47
|
+
Functions matching this protocol have `trace_ctx: Span` as their first
|
|
48
|
+
parameter. The trace decorator will inject the span automatically.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
async def __call__(self, trace_ctx: Span, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
52
|
+
"""The function receives a Span as first parameter."""
|
|
53
|
+
... # pragma: no cover
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class SyncContextFunction(Protocol[P, DepsT, R]):
|
|
57
|
+
"""Protocol for synchronous callable functions with Context parameter."""
|
|
58
|
+
|
|
59
|
+
def __call__(self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs) -> R:
|
|
60
|
+
"""The function required a synchronous call method with context."""
|
|
61
|
+
... # pragma: no cover
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class AsyncContextFunction(Protocol[P, DepsT, R]):
|
|
65
|
+
"""Protocol for asynchronous callable functions with Context parameter."""
|
|
66
|
+
|
|
67
|
+
async def __call__(
|
|
68
|
+
self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
69
|
+
) -> R:
|
|
70
|
+
"""The function's required asynchronous call method with context."""
|
|
71
|
+
... # pragma: no cover
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def fn_is_async(
|
|
75
|
+
fn: SyncFunction[P, R] | AsyncFunction[P, R],
|
|
76
|
+
) -> TypeIs[AsyncFunction[P, R]]:
|
|
77
|
+
"""Type check to determine if a given function is asynchronous."""
|
|
78
|
+
return inspect.iscoroutinefunction(fn) or inspect.isasyncgenfunction(fn)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def fn_wants_span(
|
|
82
|
+
fn: (
|
|
83
|
+
SyncFunction[P, R]
|
|
84
|
+
| AsyncFunction[P, R]
|
|
85
|
+
| SyncSpanFunction[P, R]
|
|
86
|
+
| AsyncSpanFunction[P, R]
|
|
87
|
+
),
|
|
88
|
+
) -> TypeIs[SyncSpanFunction[P, R] | AsyncSpanFunction[P, R]]:
|
|
89
|
+
"""Check if function wants Span injection as first parameter.
|
|
90
|
+
|
|
91
|
+
Returns True if the function has a first parameter named `trace_ctx`
|
|
92
|
+
with type annotation `Span`.
|
|
93
|
+
"""
|
|
94
|
+
# Import here to avoid circular imports
|
|
95
|
+
from .spans import Span
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
sig = inspect.signature(fn)
|
|
99
|
+
except (ValueError, TypeError):
|
|
100
|
+
return False
|
|
101
|
+
|
|
102
|
+
params = list(sig.parameters.values())
|
|
103
|
+
if not params:
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
first_param = params[0]
|
|
107
|
+
if first_param.name != "trace_ctx":
|
|
108
|
+
return False
|
|
109
|
+
|
|
110
|
+
# Check annotation
|
|
111
|
+
annotation = first_param.annotation
|
|
112
|
+
if annotation is inspect.Parameter.empty:
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
# Handle string annotations (forward references)
|
|
116
|
+
# The annotation could be "Span", "ops.Span", "mirascope.ops.Span", etc.
|
|
117
|
+
if isinstance(annotation, str):
|
|
118
|
+
return annotation == "Span" or annotation.endswith(".Span")
|
|
119
|
+
|
|
120
|
+
# Check by identity first
|
|
121
|
+
if annotation is Span:
|
|
122
|
+
return True
|
|
123
|
+
|
|
124
|
+
# Fallback: check by class name and module for robustness
|
|
125
|
+
# This handles cases where the same class might have different identities
|
|
126
|
+
# due to module reloading or import issues in test environments
|
|
127
|
+
if isinstance(annotation, type):
|
|
128
|
+
return (
|
|
129
|
+
annotation.__name__ == "Span"
|
|
130
|
+
and annotation.__module__ == "mirascope.ops._internal.spans"
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
return False
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"""Session context helpers for grouping traces."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import uuid
|
|
6
|
+
from collections.abc import Iterator, Mapping
|
|
7
|
+
from contextlib import contextmanager
|
|
8
|
+
from contextvars import ContextVar, Token
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
|
|
11
|
+
from mirascope.ops._internal.types import Jsonable
|
|
12
|
+
|
|
13
|
+
SESSION_HEADER_NAME = "Mirascope-Session-Id"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
SESSION_CONTEXT: ContextVar[SessionContext | None] = ContextVar(
|
|
17
|
+
"MIRASCOPE_SESSION_CONTEXT", default=None
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(slots=True)
|
|
22
|
+
class SessionContext:
|
|
23
|
+
"""Represents a session context for grouping related spans."""
|
|
24
|
+
|
|
25
|
+
id: str = field(default_factory=lambda: str(uuid.uuid4()))
|
|
26
|
+
"""Unique identifier for the session. Auto-generated if not provided."""
|
|
27
|
+
|
|
28
|
+
attributes: Mapping[str, Jsonable] | None = None
|
|
29
|
+
"""Optional JSON-serializable metadata associated with the session."""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@contextmanager
|
|
33
|
+
def session(
|
|
34
|
+
*, id: str | None = None, attributes: Mapping[str, Jsonable] | None = None
|
|
35
|
+
) -> Iterator[SessionContext]:
|
|
36
|
+
"""Context manager for setting session context.
|
|
37
|
+
|
|
38
|
+
Sessions are used to group related traces together. The session ID and
|
|
39
|
+
optional attributes are automatically propagated to all spans created
|
|
40
|
+
within the session context and are included in outgoing HTTP requests.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
id: Unique identifier for the session. If not provided, a UUID will be
|
|
44
|
+
automatically generated.
|
|
45
|
+
attributes: Optional dictionary of JSON-serializable attributes to
|
|
46
|
+
attach to the session.
|
|
47
|
+
|
|
48
|
+
Example:
|
|
49
|
+
```python
|
|
50
|
+
# With explicit ID
|
|
51
|
+
with mirascope.ops.session(id="user-123") as ctx:
|
|
52
|
+
print(ctx.id) # "user-123"
|
|
53
|
+
result = requests.get("https://api.example.com")
|
|
54
|
+
|
|
55
|
+
# With auto-generated ID
|
|
56
|
+
with mirascope.ops.session() as ctx:
|
|
57
|
+
print(ctx.id) # Auto-generated UUID
|
|
58
|
+
result = requests.get("https://api.example.com")
|
|
59
|
+
|
|
60
|
+
# Nested sessions override parent session
|
|
61
|
+
with mirascope.ops.session(id="1"):
|
|
62
|
+
# Session ID: 1
|
|
63
|
+
with mirascope.ops.session(id="2"):
|
|
64
|
+
# Session ID: 2
|
|
65
|
+
# Session ID: 1
|
|
66
|
+
```
|
|
67
|
+
"""
|
|
68
|
+
if id is not None:
|
|
69
|
+
session_ctx = SessionContext(id=id, attributes=attributes)
|
|
70
|
+
else:
|
|
71
|
+
session_ctx = SessionContext(attributes=attributes)
|
|
72
|
+
token: Token[SessionContext | None] = SESSION_CONTEXT.set(session_ctx)
|
|
73
|
+
try:
|
|
74
|
+
yield session_ctx
|
|
75
|
+
finally:
|
|
76
|
+
SESSION_CONTEXT.reset(token)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def current_session() -> SessionContext | None:
|
|
80
|
+
"""Get the current session context if one is active.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
The active SessionContext or None if no session is active.
|
|
84
|
+
|
|
85
|
+
Example:
|
|
86
|
+
```python
|
|
87
|
+
with mirascope.ops.session(id="user-123"):
|
|
88
|
+
ctx = mirascope.ops.current_session()
|
|
89
|
+
print(ctx.id) # "user-123"
|
|
90
|
+
|
|
91
|
+
ctx = mirascope.ops.current_session()
|
|
92
|
+
print(ctx) # None
|
|
93
|
+
```
|
|
94
|
+
"""
|
|
95
|
+
return SESSION_CONTEXT.get()
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def extract_session_id(headers: Mapping[str, str | list[str]]) -> str | None:
|
|
99
|
+
"""Extract session ID from carrier headers.
|
|
100
|
+
|
|
101
|
+
Performs case-insensitive header name matching and handles both string
|
|
102
|
+
and list[str] header values.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
headers: Dictionary of HTTP headers or similar carrier data.
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
The extracted session ID or None if not present.
|
|
109
|
+
|
|
110
|
+
Example:
|
|
111
|
+
```python
|
|
112
|
+
headers = {"mirascope-session-id": "session-123"}
|
|
113
|
+
session_id = extract_session_id(headers)
|
|
114
|
+
print(session_id) # "session-123"
|
|
115
|
+
```
|
|
116
|
+
"""
|
|
117
|
+
normalized_headers = {key.lower(): value for key, value in headers.items()}
|
|
118
|
+
header_name_lower = SESSION_HEADER_NAME.lower()
|
|
119
|
+
|
|
120
|
+
if header_name_lower not in normalized_headers:
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
value = normalized_headers[header_name_lower]
|
|
124
|
+
|
|
125
|
+
if isinstance(value, list):
|
|
126
|
+
if len(value) > 0:
|
|
127
|
+
return value[0]
|
|
128
|
+
return None
|
|
129
|
+
|
|
130
|
+
return value if value else None
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
__all__ = [
|
|
134
|
+
"SESSION_HEADER_NAME",
|
|
135
|
+
"SessionContext",
|
|
136
|
+
"current_session",
|
|
137
|
+
"extract_session_id",
|
|
138
|
+
"session",
|
|
139
|
+
]
|