diff --git a/src/sentry/seer/agent/client_models.py b/src/sentry/seer/agent/client_models.py index eb46d25cdb53..ff3d0998f254 100644 --- a/src/sentry/seer/agent/client_models.py +++ b/src/sentry/seer/agent/client_models.py @@ -264,6 +264,7 @@ class SeerRunState(BaseModel): blocks: list[MemoryBlock] status: Literal["processing", "completed", "error", "awaiting_user_input"] updated_at: str + failure_reason: str | None = None owner_user_id: int | None = None pending_user_input: PendingUserInput | None = None repo_pr_states: dict[str, RepoPRState] = Field(default_factory=dict) diff --git a/tests/sentry/seer/endpoints/test_organization_seer_agent_chat.py b/tests/sentry/seer/endpoints/test_organization_seer_agent_chat.py index 303ab4bb3988..8c06cb71b3eb 100644 --- a/tests/sentry/seer/endpoints/test_organization_seer_agent_chat.py +++ b/tests/sentry/seer/endpoints/test_organization_seer_agent_chat.py @@ -58,6 +58,23 @@ def test_get_with_run_id_calls_client(self, mock_client_class: MagicMock) -> Non assert response.data["sentry_run_id"] is None mock_client.get_run.assert_called_once_with(run_id=123) + @patch("sentry.seer.endpoints.organization_seer_agent_chat.SeerAgentClient") + def test_get_includes_failure_reason(self, mock_client_class: MagicMock) -> None: + mock_client = MagicMock() + mock_client.get_run.return_value = SeerRunState( + run_id=123, + blocks=[], + status="error", + updated_at="2024-01-01T00:00:00Z", + failure_reason="provider_unavailable", + ) + mock_client_class.return_value = mock_client + + response = self.client.get(f"{self.url}123/") + + assert response.status_code == 200 + assert response.data["session"]["failure_reason"] == "provider_unavailable" + @patch("sentry.seer.endpoints.organization_seer_agent_chat.SeerAgentClient") def test_get_excludes_private_fields(self, mock_client_class: MagicMock) -> None: mock_state = SeerRunState(