edit prediction: Report early-rejected predictions and fix cancel bug (#43585)

Many prediction requests end up being rejected early without ever being
set as the current prediction. Before this change, those cases weren’t
reported as rejections because the `request_prediction_with_*` functions
simply returned `Ok(None)`.

With this update, whenever we get a successful response from the
provider, we will return at least the `id`, allowing it to be properly
reported. The request now also includes a “reject reason,” since the
different variants carry distinct implications for prediction quality.

All of these scenarios are now covered by tests. While adding them, I
also found and fixed a bug where some cancelled predictions were
incorrectly being set as the current one.

Release Notes:

- N/A

---------

Co-authored-by: MrSubidubi <dev@bahn.sh>
This commit is contained in:
Agus Zubiaga
2025-11-26 20:15:05 +00:00
committed by GitHub
co-authored by MrSubidubi
parent 61a414df77
commit f89e5308e3
8 changed files with 845 additions and 182 deletions
@@ -200,12 +200,31 @@ pub struct RejectEditPredictionsBody {
pub rejections: Vec<EditPredictionRejection>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct EditPredictionRejection {
pub request_id: String,
#[serde(default)]
pub reason: EditPredictionRejectReason,
pub was_shown: bool,
}
#[derive(Default, Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
pub enum EditPredictionRejectReason {
/// New requests were triggered before this one completed
Canceled,
/// No edits returned
Empty,
/// Edits returned, but none remained after interpolation
InterpolatedEmpty,
/// The new prediction was preferred over the current one
Replaced,
/// The current prediction was preferred over the new one
CurrentPreferred,
/// The current prediction was discarded
#[default]
Discarded,
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CompletionMode {