From 05b8b8ab32f402c328413ec51c3e9040baa4cba3 Mon Sep 17 00:00:00 2001 From: "Armen Zambrano G." <44410+armenzg@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:38:01 -0500 Subject: [PATCH 1/4] Replace local code review models with sentry-seer-types imports This change replaces all the local Pydantic model definitions in src/sentry/seer/code_review/models.py with imports from the sentry-seer-types package, using the new v1.code_review module path. Changes: - Add sentry-seer-types>=0.1.0 dependency to pyproject.toml - Replace ~170 lines of local model definitions with imports from sentry_seer_types.v1.code_review - Maintain backward compatibility via aliased imports - Use Pydantic v1 compatible models from sentry-seer-types Benefits: - Single source of truth for code review models shared with Seer - Eliminates duplicate model definitions - Ensures type consistency across Sentry and Seer Note: This depends on the restructured sentry-seer-types package with models under the code_review/ subdirectory. Co-authored-by: Cursor --- pyproject.toml | 1 + src/sentry/seer/code_review/models.py | 194 ++++---------------------- 2 files changed, 28 insertions(+), 167 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 363075019afdf3..7c1ec28d40c18c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -89,6 +89,7 @@ dependencies = [ "sentry-redis-tools>=0.5.0", "sentry-relay>=0.9.22", "sentry-sdk[http2]>=2.47.0", + "sentry-seer-types>=0.1.0", "sentry-usage-accountant>=0.0.10", # remove once there are no unmarked transitive dependencies on setuptools "setuptools>=70.0.0", diff --git a/src/sentry/seer/code_review/models.py b/src/sentry/seer/code_review/models.py index 8b6eb040dc1f94..6496a4e3a76e17 100644 --- a/src/sentry/seer/code_review/models.py +++ b/src/sentry/seer/code_review/models.py @@ -1,171 +1,31 @@ from __future__ import annotations from datetime import datetime -from enum import StrEnum -from typing import Literal -from pydantic import BaseModel, Field - -from sentry.seer.models import SeerRepoDefinition - -# ============================================================================= -# Code Review Models (ported from Seer) -# ============================================================================= - - -class CommentSeverity(StrEnum): - LOW = "low" - MEDIUM = "medium" - HIGH = "high" - CRITICAL = "critical" - - -class SeerCodeReviewFeature(StrEnum): - BUG_PREDICTION = "bug_prediction" - - -class SeerCodeReviewTrigger(StrEnum): - UNKNOWN = "unknown" - ON_COMMAND_PHRASE = "on_command_phrase" - ON_READY_FOR_REVIEW = "on_ready_for_review" - ON_NEW_COMMIT = "on_new_commit" - - @classmethod - def _missing_(cls: type[SeerCodeReviewTrigger], value: object) -> SeerCodeReviewTrigger: - return cls.UNKNOWN - - -class SeerCodeReviewRequestType(StrEnum): - """Request type for Seer code review requests.""" - - PR_REVIEW = "pr-review" - PR_CLOSED = "pr-closed" - - -class SeerCodeReviewConfig(BaseModel): - features: dict[SeerCodeReviewFeature, bool] = Field(default_factory=lambda: {}) - trigger: SeerCodeReviewTrigger - trigger_comment_id: int | None = None - trigger_comment_type: Literal["issue_comment"] | None = None - trigger_user: str | None = None - trigger_user_id: int | None = None - trigger_at: datetime | None = None # When the trigger event occurred on GitHub - sentry_received_trigger_at: datetime | None = None # When Sentry received the webhook - - def is_feature_enabled(self, feature: SeerCodeReviewFeature) -> bool: - return self.features.get(feature, False) - - def get_minimum_severity_for_feature(self, feature: SeerCodeReviewFeature) -> CommentSeverity: - return CommentSeverity.MEDIUM - - -class BugPredictionSpecificInformation(BaseModel): - """Information specific to bug prediction feature.""" - - organization_id: int - organization_slug: str - - -# ============================================================================= -# Code Review Repo Definition Models -# ============================================================================= - - -class SeerCodeReviewRepoDefinition(BaseModel): - """ - Repo definition for code review with required fields for Sentry. - - This is a "shortened" version of SeerRepoDefinition that only includes - the fields actually sent by Sentry for code review requests. - """ - - provider: str - owner: str - name: str - external_id: str - base_commit_sha: str - # Optional in base, overridden in subclasses based on request type - organization_id: int | None = None - integration_id: str | None = None - - -class SeerCodeReviewRepoForPrReview(SeerCodeReviewRepoDefinition): - """ - Repo definition for PR review requests. - - organization_id and integration_id are optional for PR review requests, - though organization_id is typically included. - """ - - pass # Inherits optional fields from base - - -class SeerCodeReviewRepoForPrClosed(SeerCodeReviewRepoDefinition): - """ - Repo definition for PR closed requests. - - organization_id and integration_id are required for PR closed requests - to support metrics and dashboarding. - """ - - organization_id: int # Override to make required - integration_id: str # Override to make required - - -# ============================================================================= -# Code Review Request Models -# ============================================================================= - - -class SeerCodeReviewBaseRequest(BaseModel): - repo: SeerRepoDefinition - pr_id: int - more_readable_repos: list[SeerRepoDefinition] = Field(default_factory=list) - - -class SeerCodeReviewRequest(SeerCodeReviewBaseRequest): - bug_prediction_specific_information: BugPredictionSpecificInformation - config: SeerCodeReviewConfig | None = None - - -class SeerCodeReviewRequestForPrReview(BaseModel): - """Request model for PR review with optional organization_id and integration_id.""" - - repo: SeerCodeReviewRepoForPrReview - pr_id: int - more_readable_repos: list[SeerCodeReviewRepoForPrReview] = Field(default_factory=list) - bug_prediction_specific_information: BugPredictionSpecificInformation - config: SeerCodeReviewConfig | None = None - experiment_enabled: bool = False - - -class SeerCodeReviewRequestForPrClosed(BaseModel): - """Request model for PR closed with required organization_id and integration_id.""" - - repo: SeerCodeReviewRepoForPrClosed - pr_id: int - more_readable_repos: list[SeerCodeReviewRepoForPrClosed] = Field(default_factory=list) - bug_prediction_specific_information: BugPredictionSpecificInformation - config: SeerCodeReviewConfig | None = None - - -class SeerCodeReviewTaskRequest(BaseModel): - data: SeerCodeReviewRequest - external_owner_id: str - request_type: SeerCodeReviewRequestType - - -class SeerCodeReviewTaskRequestForPrReview(BaseModel): - """Task request wrapper for PR review.""" - - data: SeerCodeReviewRequestForPrReview - external_owner_id: str - request_type: SeerCodeReviewRequestType - - -class SeerCodeReviewTaskRequestForPrClosed(BaseModel): - """Task request wrapper for PR closed.""" - - data: SeerCodeReviewRequestForPrClosed - external_owner_id: str - request_type: SeerCodeReviewRequestType +# Import shared models from sentry-seer-types package (v1 for Pydantic v1 compatibility) +from sentry_seer_types.v1.code_review import ( + BugPredictionSpecificInformation, + CodegenPrReviewRequest as SeerCodeReviewRequestForPrReview, + CodeReviewTaskRequest as SeerCodeReviewTaskRequestForPrReview, + CommentSeverity, + PrReviewConfig as SeerCodeReviewConfig, + PrReviewFeature as SeerCodeReviewFeature, + PrReviewTrigger as SeerCodeReviewTrigger, + RequestType as SeerCodeReviewRequestType, +) + +# Re-export for backward compatibility +__all__ = [ + "CommentSeverity", + "SeerCodeReviewFeature", + "SeerCodeReviewTrigger", + "SeerCodeReviewRequestType", + "SeerCodeReviewConfig", + "BugPredictionSpecificInformation", + "SeerCodeReviewRequestForPrReview", + "SeerCodeReviewTaskRequestForPrReview", +] + + +# Note: The sentry-seer-types package provides dual Pydantic v1/v2 support. +# We import from v1.code_review since Sentry uses Pydantic v1. From bd217f2323536c85cee3e26c6d5391eb22e2b511 Mon Sep 17 00:00:00 2001 From: "Armen Zambrano G." <44410+armenzg@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:45:29 -0500 Subject: [PATCH 2/4] Update sentry-seer-types imports to use Seer-prefixed names Updates imports from sentry-seer-types to use the new Seer-prefixed class names directly, removing the need for "import as" aliases. The sentry-seer-types package now exports models with their final names (e.g., SeerCodeReviewConfig, SeerCodeReviewRequestForPrReview) making the integration cleaner and more explicit. Co-authored-by: Cursor --- src/sentry/seer/code_review/models.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/sentry/seer/code_review/models.py b/src/sentry/seer/code_review/models.py index 6496a4e3a76e17..3d7fbc7b6b00df 100644 --- a/src/sentry/seer/code_review/models.py +++ b/src/sentry/seer/code_review/models.py @@ -1,17 +1,15 @@ from __future__ import annotations -from datetime import datetime - # Import shared models from sentry-seer-types package (v1 for Pydantic v1 compatibility) from sentry_seer_types.v1.code_review import ( BugPredictionSpecificInformation, - CodegenPrReviewRequest as SeerCodeReviewRequestForPrReview, - CodeReviewTaskRequest as SeerCodeReviewTaskRequestForPrReview, CommentSeverity, - PrReviewConfig as SeerCodeReviewConfig, - PrReviewFeature as SeerCodeReviewFeature, - PrReviewTrigger as SeerCodeReviewTrigger, - RequestType as SeerCodeReviewRequestType, + SeerCodeReviewConfig, + SeerCodeReviewFeature, + SeerCodeReviewRequestForPrReview, + SeerCodeReviewRequestType, + SeerCodeReviewTaskRequestForPrReview, + SeerCodeReviewTrigger, ) # Re-export for backward compatibility From 9db59627303c86e9c98155ac189ebc2d43583f4b Mon Sep 17 00:00:00 2001 From: "Armen Zambrano G." <44410+armenzg@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:51:34 -0500 Subject: [PATCH 3/4] fix: Import missing PrClosed models from sentry-seer-types Adds imports for SeerCodeReviewRequestForPrClosed and SeerCodeReviewTaskRequestForPrClosed models that were being used in webhooks/task.py but were missing from the imports. These models are now available in sentry-seer-types v0.1.0. Changes: - Add SeerCodeReviewRequestForPrClosed to imports - Add SeerCodeReviewTaskRequestForPrClosed to imports - Update __all__ exports (alphabetically sorted) Co-authored-by: Cursor --- src/sentry/seer/code_review/models.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/sentry/seer/code_review/models.py b/src/sentry/seer/code_review/models.py index 3d7fbc7b6b00df..6ac37b505ba50f 100644 --- a/src/sentry/seer/code_review/models.py +++ b/src/sentry/seer/code_review/models.py @@ -6,22 +6,26 @@ CommentSeverity, SeerCodeReviewConfig, SeerCodeReviewFeature, + SeerCodeReviewRequestForPrClosed, SeerCodeReviewRequestForPrReview, SeerCodeReviewRequestType, + SeerCodeReviewTaskRequestForPrClosed, SeerCodeReviewTaskRequestForPrReview, SeerCodeReviewTrigger, ) # Re-export for backward compatibility __all__ = [ + "BugPredictionSpecificInformation", "CommentSeverity", - "SeerCodeReviewFeature", - "SeerCodeReviewTrigger", - "SeerCodeReviewRequestType", "SeerCodeReviewConfig", - "BugPredictionSpecificInformation", + "SeerCodeReviewFeature", + "SeerCodeReviewRequestForPrClosed", "SeerCodeReviewRequestForPrReview", + "SeerCodeReviewRequestType", + "SeerCodeReviewTaskRequestForPrClosed", "SeerCodeReviewTaskRequestForPrReview", + "SeerCodeReviewTrigger", ] From c462b85f1297b46625c34d05a7c8d62e9844f5c6 Mon Sep 17 00:00:00 2001 From: "Armen Zambrano G." <44410+armenzg@users.noreply.github.com> Date: Thu, 5 Feb 2026 12:03:43 -0500 Subject: [PATCH 4/4] refactor: Remove unused CommentSeverity import Removes CommentSeverity from imports as it was removed from sentry-seer-types (not used by Sentry's code_review module). Co-authored-by: Cursor --- src/sentry/seer/code_review/models.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/sentry/seer/code_review/models.py b/src/sentry/seer/code_review/models.py index 6ac37b505ba50f..42072f956d1d41 100644 --- a/src/sentry/seer/code_review/models.py +++ b/src/sentry/seer/code_review/models.py @@ -3,7 +3,6 @@ # Import shared models from sentry-seer-types package (v1 for Pydantic v1 compatibility) from sentry_seer_types.v1.code_review import ( BugPredictionSpecificInformation, - CommentSeverity, SeerCodeReviewConfig, SeerCodeReviewFeature, SeerCodeReviewRequestForPrClosed, @@ -17,7 +16,6 @@ # Re-export for backward compatibility __all__ = [ "BugPredictionSpecificInformation", - "CommentSeverity", "SeerCodeReviewConfig", "SeerCodeReviewFeature", "SeerCodeReviewRequestForPrClosed",