diff --git a/src/sentry/features/temporary.py b/src/sentry/features/temporary.py index 00f103ab2aebce..44f806d1b6d3aa 100644 --- a/src/sentry/features/temporary.py +++ b/src/sentry/features/temporary.py @@ -124,6 +124,8 @@ def register_temporary_features(manager: FeatureManager) -> None: manager.add("organizations:gen-ai-features", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True) # Enable the 'translate' functionality for GenAI on the explore > traces page manager.add("organizations:gen-ai-search-agent-translate", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True) + # Enable AI search bar on the explore > metrics tab + manager.add("organizations:gen-ai-explore-metrics-search", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True) # Enable GenAI consent manager.add("organizations:gen-ai-consent", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True) # Enable increased issue_owners rate limit for auto-assignment diff --git a/src/sentry/seer/endpoints/search_agent_start.py b/src/sentry/seer/endpoints/search_agent_start.py index 4d221cef2fe703..2d34d8c71b9ef8 100644 --- a/src/sentry/seer/endpoints/search_agent_start.py +++ b/src/sentry/seer/endpoints/search_agent_start.py @@ -67,6 +67,7 @@ def send_search_agent_start_request( user_email: str | None = None, timezone: str | None = None, model_name: str | None = None, + metric_context: dict[str, Any] | None = None, viewer_context: SeerViewerContext | None = None, ) -> dict[str, Any]: """ @@ -87,6 +88,8 @@ def send_search_agent_start_request( options: dict[str, Any] = {} if model_name is not None: options["model_name"] = model_name + if metric_context is not None: + options["metric_context"] = metric_context if options: body["options"] = options @@ -129,15 +132,23 @@ def post(self, request: Request, organization: Organization) -> Response: strategy = validated_data.get("strategy", "Traces") options = validated_data.get("options") or {} model_name = options.get("model_name") + metric_context = options.get("metric_context") projects = self.get_projects( request, organization, project_ids=set(validated_data["project_ids"]) ) project_ids = [project.id for project in projects] - if not features.has( + has_feature = features.has( "organizations:gen-ai-search-agent-translate", organization, actor=request.user - ): + ) + if strategy == "Metrics": + has_feature = has_feature and features.has( + "organizations:gen-ai-explore-metrics-search", + organization, + actor=request.user, + ) + if not has_feature: return Response( {"detail": "Feature flag not enabled"}, status=status.HTTP_403_FORBIDDEN, @@ -174,6 +185,7 @@ def post(self, request: Request, organization: Organization) -> Response: user_email=user_email, timezone=timezone, model_name=model_name, + metric_context=metric_context, viewer_context=viewer_context, ) diff --git a/src/sentry/seer/endpoints/search_agent_state.py b/src/sentry/seer/endpoints/search_agent_state.py index 9200eb7c901f73..b685ae7d8fd252 100644 --- a/src/sentry/seer/endpoints/search_agent_state.py +++ b/src/sentry/seer/endpoints/search_agent_state.py @@ -81,9 +81,12 @@ def get(self, request: Request, organization: Organization, run_id: str) -> Resp } } """ - if not features.has( + has_feature = features.has( "organizations:gen-ai-search-agent-translate", organization, actor=request.user - ): + ) or features.has( + "organizations:gen-ai-explore-metrics-search", organization, actor=request.user + ) + if not has_feature: return Response( {"detail": "Feature flag not enabled"}, status=status.HTTP_403_FORBIDDEN,