From ee8523e8227f834e38e19f185e8ef16d91ac0bf8 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 19 Feb 2026 18:15:21 +0000 Subject: [PATCH 1/2] ref(seer): Remove shared pydantic models for code review The overwatch-request endpoint handles both PR code review requests and PR closed cases. This commit removes the old shared pydantic models (SeerCodeReviewBaseRequest, SeerCodeReviewRequest, and SeerCodeReviewTaskRequest) in favor of specific models for each use case: - SeerCodeReviewRequestForPrReview / SeerCodeReviewTaskRequestForPrReview - SeerCodeReviewRequestForPrClosed / SeerCodeReviewTaskRequestForPrClosed This separation ensures proper validation of required fields (e.g., organization_id and integration_id are required for PR closed but optional for PR review). Also updated docstrings to reflect the current model names and remove references to old shared models. Fixes CW-838 Co-authored-by: Armen Zambrano G. --- src/sentry/seer/code_review/models.py | 17 ----------------- src/sentry/seer/code_review/utils.py | 11 +++++++---- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/sentry/seer/code_review/models.py b/src/sentry/seer/code_review/models.py index db8d54f821a325..9ebfdcd5a6810b 100644 --- a/src/sentry/seer/code_review/models.py +++ b/src/sentry/seer/code_review/models.py @@ -118,17 +118,6 @@ class SeerCodeReviewRepoForPrClosed(SeerCodeReviewRepoDefinition): # ============================================================================= -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.""" @@ -150,12 +139,6 @@ class SeerCodeReviewRequestForPrClosed(BaseModel): 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.""" diff --git a/src/sentry/seer/code_review/utils.py b/src/sentry/seer/code_review/utils.py index ddfc71d781fff1..e1c4232856a556 100644 --- a/src/sentry/seer/code_review/utils.py +++ b/src/sentry/seer/code_review/utils.py @@ -205,7 +205,7 @@ def transform_webhook_to_codegen_request( target_commit_sha: str, ) -> dict[str, Any] | None: """ - Transform a GitHub webhook payload into SeerCodeReviewRequest format for Seer. + Transform a GitHub webhook payload into a code review request format for Seer. Args: github_event: The GitHub webhook event type @@ -216,7 +216,8 @@ def transform_webhook_to_codegen_request( target_commit_sha: The target commit SHA for PR review (head of the PR at the time of webhook event) Returns: - Dictionary in SeerCodeReviewRequest format with request_type, data, and external_owner_id, + Dictionary with request_type, data, and external_owner_id that matches either + SeerCodeReviewTaskRequestForPrReview or SeerCodeReviewTaskRequestForPrClosed format, or None if the event is not PR-related (e.g., issue_comment on regular issues) """ payload = None @@ -268,7 +269,9 @@ def transform_issue_comment_to_codegen_request( target_commit_sha: str, ) -> dict[str, Any] | None: """ - Transform an issue comment on a PR into a CodecovTaskRequest for Seer. + Transform an issue comment on a PR into a code review request for Seer. + + Returns a dictionary matching SeerCodeReviewTaskRequestForPrReview format. """ payload = _common_codegen_request_payload( SeerCodeReviewRequestType.PR_REVIEW, # An issue comment on a PR is a PR review request @@ -333,7 +336,7 @@ def transform_pull_request_to_codegen_request( def _build_repo_definition(repo: Repository, target_commit_sha: str) -> dict[str, Any]: """ - Build the repository definition for the CodecovTaskRequest. + Build the repository definition for code review requests. """ # Extract owner and repo name from full repository name (format: "owner/repo") repo_name_sections = repo.name.split("/") From 2bafdb46e0e8462fa1d071bed4554515ee6c01a2 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 19 Feb 2026 18:19:57 +0000 Subject: [PATCH 2/2] fix: Remove unused import and fix formatting - Remove unused SeerRepoDefinition import (identified by Bugbot) - Fix whitespace in docstring (ruff W293) Co-authored-by: Armen Zambrano G. --- src/sentry/seer/code_review/models.py | 2 -- src/sentry/seer/code_review/utils.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sentry/seer/code_review/models.py b/src/sentry/seer/code_review/models.py index 9ebfdcd5a6810b..4c092123203d96 100644 --- a/src/sentry/seer/code_review/models.py +++ b/src/sentry/seer/code_review/models.py @@ -6,8 +6,6 @@ from pydantic import BaseModel, Field -from sentry.seer.models import SeerRepoDefinition - # ============================================================================= # Code Review Models (ported from Seer) # ============================================================================= diff --git a/src/sentry/seer/code_review/utils.py b/src/sentry/seer/code_review/utils.py index e1c4232856a556..b4ab27e65cfd70 100644 --- a/src/sentry/seer/code_review/utils.py +++ b/src/sentry/seer/code_review/utils.py @@ -270,7 +270,7 @@ def transform_issue_comment_to_codegen_request( ) -> dict[str, Any] | None: """ Transform an issue comment on a PR into a code review request for Seer. - + Returns a dictionary matching SeerCodeReviewTaskRequestForPrReview format. """ payload = _common_codegen_request_payload(