diff --git a/static/app/components/events/interfaces/performance/spanEvidenceKeyValueList.tsx b/static/app/components/events/interfaces/performance/spanEvidenceKeyValueList.tsx
index 19c1642e37ca40..425a150b18f8ed 100644
--- a/static/app/components/events/interfaces/performance/spanEvidenceKeyValueList.tsx
+++ b/static/app/components/events/interfaces/performance/spanEvidenceKeyValueList.tsx
@@ -347,6 +347,25 @@ function DBQueryInjectionVulnerabilityEvidence({
);
}
+function AIDetectedSpanEvidence({
+ event,
+ organization,
+ location,
+ projectSlug,
+}: SpanEvidenceKeyValueListProps) {
+ const evidenceData = event?.occurrence?.evidenceData ?? {};
+ return (
+
+ );
+}
+
const PREVIEW_COMPONENTS: Partial<
Record React.ReactElement | null>
> = {
@@ -368,6 +387,7 @@ const PREVIEW_COMPONENTS: Partial<
[IssueType.PROFILE_FUNCTION_REGRESSION]: RegressionEvidence,
[IssueType.QUERY_INJECTION_VULNERABILITY]: DBQueryInjectionVulnerabilityEvidence,
[IssueType.WEB_VITALS]: WebVitalsEvidence,
+ [IssueType.LLM_DETECTED_EXPERIMENTAL]: AIDetectedSpanEvidence,
};
export function SpanEvidenceKeyValueList({
@@ -401,7 +421,6 @@ export function SpanEvidenceKeyValueList({
/>
);
}
-
const Component = PREVIEW_COMPONENTS[issueType] ?? DefaultSpanEvidence;
return (
diff --git a/static/app/types/group.tsx b/static/app/types/group.tsx
index 65b1c40078a7d5..0d97d15dcc3c7e 100644
--- a/static/app/types/group.tsx
+++ b/static/app/types/group.tsx
@@ -103,6 +103,8 @@ export enum IssueCategory {
HTTP_CLIENT = 'http_client',
DB_QUERY = 'db_query',
MOBILE = 'mobile',
+
+ AI_DETECTED = 'ai_detected',
}
/**
@@ -133,6 +135,7 @@ export const ISSUE_CATEGORY_TO_DESCRIPTION: Record = {
[IssueCategory.CRON]: '',
[IssueCategory.REPLAY]: '',
[IssueCategory.UPTIME]: '',
+ [IssueCategory.AI_DETECTED]: t('AI detected issues.'),
};
export enum IssueType {
@@ -179,10 +182,14 @@ export enum IssueType {
// Insights Web Vitals
WEB_VITALS = 'web_vitals',
+
+ LLM_DETECTED_EXPERIMENTAL = 'llm_detected_experimental',
}
// Update this if adding an issue type that you don't want to show up in search!
-export const VISIBLE_ISSUE_TYPES = Object.values(IssueType);
+export const VISIBLE_ISSUE_TYPES = Object.values(IssueType).filter(
+ type => ![IssueType.LLM_DETECTED_EXPERIMENTAL].includes(type)
+);
export enum IssueTitle {
ERROR = 'Error',
@@ -226,6 +233,8 @@ export enum IssueTitle {
// Insights Web Vitals
WEB_VITALS = 'Web Vitals',
+
+ LLM_DETECTED_EXPERIMENTAL = 'LLM Detected Issue',
}
export const ISSUE_TYPE_TO_ISSUE_TITLE = {
@@ -263,6 +272,8 @@ export const ISSUE_TYPE_TO_ISSUE_TITLE = {
uptime_domain_failure: IssueTitle.UPTIME_DOMAIN_FAILURE,
web_vitals: IssueTitle.WEB_VITALS,
+
+ llm_detected_experimental: IssueTitle.LLM_DETECTED_EXPERIMENTAL,
};
export function getIssueTitleFromType(issueType: string): IssueTitle | undefined {
@@ -295,6 +306,7 @@ const OCCURRENCE_TYPE_TO_ISSUE_TYPE = {
2007: IssueType.PROFILE_REGEX_MAIN_THREAD,
2008: IssueType.PROFILE_FRAME_DROP,
2010: IssueType.PROFILE_FUNCTION_REGRESSION,
+ 3501: IssueType.LLM_DETECTED_EXPERIMENTAL,
10001: IssueType.WEB_VITALS,
};
diff --git a/static/app/utils/issueTypeConfig/aiDetectedConfig.tsx b/static/app/utils/issueTypeConfig/aiDetectedConfig.tsx
new file mode 100644
index 00000000000000..f8ead2154a1b5a
--- /dev/null
+++ b/static/app/utils/issueTypeConfig/aiDetectedConfig.tsx
@@ -0,0 +1,47 @@
+import {t} from 'sentry/locale';
+import type {IssueCategoryConfigMapping} from 'sentry/utils/issueTypeConfig/types';
+import {Tab} from 'sentry/views/issueDetails/types';
+
+const aiDetectedConfig: IssueCategoryConfigMapping = {
+ _categoryDefaults: {
+ actions: {
+ archiveUntilOccurrence: {enabled: true},
+ delete: {
+ enabled: true,
+ },
+ deleteAndDiscard: {
+ enabled: false,
+ disabledReason: t('Not yet supported for performance issues'),
+ },
+ merge: {
+ enabled: false,
+ disabledReason: t('Not yet supported for performance issues'),
+ },
+ ignore: {enabled: true},
+ resolve: {enabled: true},
+ resolveInRelease: {enabled: true},
+ share: {enabled: true},
+ },
+ pages: {
+ landingPage: Tab.DETAILS,
+ events: {enabled: true},
+ openPeriods: {enabled: false},
+ checkIns: {enabled: false},
+ uptimeChecks: {enabled: false},
+ attachments: {enabled: false},
+ userFeedback: {enabled: false},
+ replays: {enabled: false},
+ tagsTab: {enabled: false},
+ },
+ autofix: false,
+ mergedIssues: {enabled: false},
+ similarIssues: {enabled: false},
+ stacktrace: {enabled: false},
+ spanEvidence: {enabled: true},
+ evidence: null,
+ usesIssuePlatform: true,
+ issueSummary: {enabled: false},
+ },
+};
+
+export default aiDetectedConfig;
diff --git a/static/app/utils/issueTypeConfig/index.tsx b/static/app/utils/issueTypeConfig/index.tsx
index 067ecceb11abb6..7c9d8fe934057c 100644
--- a/static/app/utils/issueTypeConfig/index.tsx
+++ b/static/app/utils/issueTypeConfig/index.tsx
@@ -1,6 +1,7 @@
import {t} from 'sentry/locale';
import {IssueCategory, IssueType} from 'sentry/types/group';
import type {Project} from 'sentry/types/project';
+import aiDetectedConfig from 'sentry/utils/issueTypeConfig/aiDetectedConfig';
import cronConfig from 'sentry/utils/issueTypeConfig/cronConfig';
import dbQueryConfig from 'sentry/utils/issueTypeConfig/dbQueryConfig';
import {
@@ -102,6 +103,7 @@ const issueTypeConfig: Config = {
[IssueCategory.DB_QUERY]: dbQueryConfig,
[IssueCategory.MOBILE]: mobileConfig,
[IssueCategory.METRIC]: metricConfig,
+ [IssueCategory.AI_DETECTED]: aiDetectedConfig,
};
/**