Skip to content

Commit b1f2ffe

Browse files
isaacwang-sentryclaude
authored andcommitted
feat(autofix): Thread insert_index through explorer API for step retry (#112287)
Thread `insert_index` through the explorer autofix API so the frontend can request a retry-from-step that truncates all downstream blocks. When provided, Seer does `blocks = blocks[:insert_index]` before re-running the step, ensuring downstream sections (e.g. Code Changes after retrying Plan) are properly removed. Changes: - Add `insert_index` field to `ExplorerAutofixRequestSerializer` - Pass it through `trigger_autofix_explorer()` → `client.continue_run()` A follow-up frontend PR (#112290) adds retry buttons that use this parameter. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1de7eee commit b1f2ffe

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

src/sentry/seer/autofix/autofix_agent.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ def trigger_autofix_explorer(
230230
stopping_point: AutofixStoppingPoint | None = None,
231231
intelligence_level: Literal["low", "medium", "high"] = "low",
232232
user_context: str | None = None,
233+
insert_index: int | None = None,
233234
) -> int:
234235
"""
235236
Start or continue an Explorer-based autofix run.
@@ -287,6 +288,7 @@ def trigger_autofix_explorer(
287288
prompt_metadata=prompt_metadata,
288289
artifact_key=artifact_key,
289290
artifact_schema=artifact_schema,
291+
insert_index=insert_index,
290292
)
291293

292294
payload = {

src/sentry/seer/endpoints/group_ai_autofix.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,10 @@ class ExplorerAutofixRequestSerializer(CamelSnakeSerializer):
129129
required=False,
130130
help_text="Optional repository name for which to create the pull request. Do not pass a repository name to create pull requests in all relevant repositories.",
131131
)
132+
insert_index = serializers.IntegerField(
133+
required=False,
134+
help_text="Block index to insert at. When provided, truncates blocks after this point for retry-from-step.",
135+
)
132136

133137
def validate(self, data: dict[str, Any]) -> dict[str, Any]:
134138
stopping_point = data.get("stopping_point", None)
@@ -289,6 +293,7 @@ def _post_explorer(self, request: Request, group: Group) -> Response:
289293
run_id=run_id,
290294
intelligence_level=data["intelligence_level"],
291295
user_context=data.get("user_context"),
296+
insert_index=data.get("insert_index"),
292297
)
293298
return Response({"run_id": run_id}, status=status.HTTP_202_ACCEPTED)
294299
except SeerPermissionError as e:

tests/sentry/seer/endpoints/test_group_ai_autofix.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,35 @@ def test_stopping_point(self, mock_trigger_explorer):
940940
run_id=None,
941941
intelligence_level="low",
942942
user_context=None,
943+
insert_index=None,
944+
)
945+
946+
@patch("sentry.seer.endpoints.group_ai_autofix.trigger_autofix_explorer")
947+
def test_insert_index_passed_through(self, mock_trigger_explorer):
948+
"""POST passes insert_index to trigger_autofix_explorer for retry-from-step."""
949+
for flag in EXPLORER_FLAGS:
950+
mock_trigger_explorer.reset_mock()
951+
group = self.create_group()
952+
mock_trigger_explorer.return_value = 123
953+
954+
self.login_as(user=self.user)
955+
with self.feature(flag):
956+
response = self.client.post(
957+
self._get_url(group.id, mode="explorer"),
958+
data={"step": "solution", "run_id": 42, "insert_index": 3},
959+
format="json",
960+
)
961+
962+
assert response.status_code == 202, f"Failed for {flag}: {response.data}"
963+
mock_trigger_explorer.assert_called_once_with(
964+
group=group,
965+
step=AutofixStep.SOLUTION,
966+
referrer=AutofixReferrer.GROUP_AUTOFIX_ENDPOINT,
967+
stopping_point=None,
968+
run_id=42,
969+
intelligence_level="low",
970+
user_context=None,
971+
insert_index=3,
943972
)
944973

945974
@patch("sentry.seer.autofix.autofix._call_autofix")

0 commit comments

Comments
 (0)