Repository navigation
Conversation
Return a 402 before sending a chat message when a token-billed org does not have enough Seer credits. Dashboard generation runs are not gated. can_run_seer_operation now passes orgs that are not token-billed. Refs CW-3061
Token-billed orgs are checked for Seer credits before each Autofix step and before opening a PR, and get SeerOutOfCreditsException when they can't pay. Other orgs keep the seat-based quota check. Agentic triage runs are not gated. Refs CW-3061
Autofix billing checks the token-billed flag itself, so it only needs the credit check.
…tofix-gating # Conflicts: # src/sentry/seer/credits.py
Sentry Snapshot Testing
|
…gent-chat # Conflicts: # src/sentry/seer/endpoints/organization_seer_agent_chat.py
…tofix-gating # Conflicts: # src/sentry/seer/autofix/feature/dispatch.py # tests/sentry/seer/autofix/feature/test_dispatch.py
Chat replies to single runs continue the run through continue_single_run, which skipped billing. The run's own referrer decides, so agentic triage runs stay free.
…gent-chat # Conflicts: # src/sentry/seer/endpoints/organization_seer_agent_chat.py
…tofix-gating Check the credit check flag before the token-billed flag. has_enough_seer_credits no longer checks the flag; its callers do.
Cover orgs that aren't token-billed, group the chat credit tests after the access tests, and match the neighboring tests' names and setup.
…utofix-gating # Conflicts: # src/sentry/seer/credits.py
Single runs are behind organizations:autofix-single-run and need their own estimate, so they're out of scope here.
Agentic triage runs skip the Seer credit check, and the Autofix endpoint accepted any referrer from the request body. Treat a client-supplied agentic triage referrer as unknown.
Restores the single run reply check, using the placeholder estimate for now.
| if referrer == AutofixReferrer.AGENTIC_TRIAGE: | ||
| logger.warning("group_ai_autofix.internal_referrer", extra={"referrer": raw}) | ||
| return AutofixReferrer.UNKNOWN |
There was a problem hiding this comment.
Make sure people can't spoof AT referrer and skip getting billed. AT is not exposed via API.
| check_autofix_billing( | ||
| group, | ||
| SeerOperation.AUTOFIX_SINGLE_RUN_REPLY, | ||
| agent_run.run.referrer, | ||
| is_new_run=False, | ||
| ) |
There was a problem hiding this comment.
🤖 AI-assisted review, posted on behalf of @billyvg.
Should a user's reply to an agentic triage run skip the credit check? continue_single_run only runs when a user replies in Seer chat. agent_run.run.referrer is the run's original referrer, though, and SeerRun.referrer is set when the run starts and never updated. So every reply on a run that agentic triage started skips the check. A reply can write code and open a PR, which means a user on a token-billed org with no credits left can keep driving an agentic triage run indefinitely.
Continuing a step-based agentic triage run from the issue page does get checked, because trigger_autofix_agent passes the caller's referrer. If only agentic triage's own automated work is meant to be free, passing the reply's referrer here would match that path.
| check_autofix_billing( | ||
| group, | ||
| SeerOperation.AUTOFIX_OPEN_PR, | ||
| seer_run.referrer if seer_run else None, | ||
| is_new_run=False, | ||
| ) |
There was a problem hiding this comment.
🤖 AI-assisted review, posted on behalf of @billyvg.
Same question for Open PR. When a user clicks Open PR (issue page or Slack) on a run that agentic triage started, this skips the credit check, because the run's referrer is night_shift. A user continuing a step on that same run is checked under their own referrer, though. The completion hook's automatic push for agentic triage runs does need the run's referrer to stay free. If user-triggered pushes should be checked, one option is to use the run's referrer only when referrer == AutofixReferrer.ON_COMPLETION_HOOK, and the caller's referrer otherwise.
Co-Authored-By: Sofia Rest <sofia.rest@sentry.io>
sehr-m
left a comment
There was a problem hiding this comment.
okay wait i think i get the operations for estimate gating, but a few qs for changes :))
| def check_autofix_billing( | ||
| group: Group, | ||
| operation: SeerOperation, | ||
| referrer: str | None, |
There was a problem hiding this comment.
don't love us gating on referrer- these are not standardized and currently there is no plan to standardize them
trigger_autofix_agent checked billing, then called trigger_autofix_feature, which checked it again with the same arguments. Keep only the dispatch check, and test a token-billed org with credit checks off.
…tion (#130463) relates to CW-2332 depends on #129563, #130283, #130284 The chat's credit check only runs when the panel opens or the window regains focus. If credits run out partway through a conversation, the message box stays enabled and the next send fails with a generic error. This rechecks credits when: - Seer stops a reply for credits (`failure_reason: out_of_credits`) - a send comes back 402 so the out-of-credits notice and disabled message box show right away. A 402 no longer shows "There was an error sending your message"; the recheck brings up the notice instead. The recheck invalidates the credit check query, like `useExplorerAutofix` does. That needed `useSeerCreditCheck` to turn off with `enabled` instead of `skipToken`, so the key is the same either way. Example (it would show any intermediate thinking as well): <img width="402" height="615" alt="× Seer Agent I" src="https://github.com/user-attachments/assets/c7e056e8-73a7-4a5a-be32-62bcb80e1609" /> --------- Co-authored-by: Billy Vong <billy@sentry.io> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Credit checks no longer skip runs by referrer. Agentic triage runs are checked like any other until a follow-up marks them by feature instead. Credit checks are behind seer-credit-checks, so nothing changes in production. Refs CW-3061
|
I'm going to drop agentic triage gating from this PR, wiring this feature through and gating only manual iterations on AT is a bit more complicated than I thought and deserves its own PR |
Relates to CW-3061
Adds
check_autofix_billing, called from all autofix entrypoints:trigger_autofix_agent,trigger_autofix_feature,trigger_push_changesandcontinue_single_run.SeerOutOfCreditsExceptionif they can't pay. All credit checks are also separately feature-flagged.Autofix single run replies get their own billable operation with a placeholder estimate.
WIP followup to handle the out of credits exceptions: #130284