Treat audio validation failures as non-retryable input errors (#58434)

## What changed

Map audio size, data, format, and sample-rate validation failures to `InvalidAudioInput` for HTTP 400 responses and streamed errors. Preserve the provider's message, falling back to `Invalid audio input.` when it is absent or blank.

Classify these errors as non-retryable and expose them as `BadRequest`. Redact their messages in doctor diagnostics and group them as invalid requests in telemetry.

## Testing

Add coverage for all six audio validation codes across HTTP errors, streamed `error` events, and `response.failed` events, checking error classification, message preservation, and the absence of retries. Extend doctor diagnostic redaction coverage for `InvalidAudioInput`.

GitOrigin-RevId: 0a59964bcabd83997bdb32fc9318a5482dac33b0
This commit is contained in:
Hung
2026-10-30 21:01:23 +00:00
committed by copyberry
parent 2546265e3e
commit 5a7353f040
8 changed files with 80 additions and 5 deletions
@@ -53,7 +53,9 @@ pub(super) fn sampler_failure_reason(error: &LunaSamplerError) -> &'static str {
ApiError::Retryable { .. } => "retryable_api_error",
ApiError::RateLimitExceeded { .. } | ApiError::RateLimit(_) => "rate_limit",
ApiError::ModelNotFound { .. } => "model_not_found",
ApiError::InvalidRequest { .. } | ApiError::InvalidPrompt { .. } => "invalid_request",
ApiError::InvalidRequest { .. }
| ApiError::InvalidAudioInput { .. }
| ApiError::InvalidPrompt { .. } => "invalid_request",
ApiError::CyberPolicy { .. }
| ApiError::BioPolicy { .. }
| ApiError::MisalignmentPolicyViolation { .. } => "policy_error",
@@ -158,6 +158,7 @@ impl SamplingExecution {
| ApiError::UsageNotIncluded
| ApiError::RateLimit(_)
| ApiError::InvalidRequest { .. }
| ApiError::InvalidAudioInput { .. }
| ApiError::ModelNotFound { .. }
| ApiError::InvalidPrompt { .. }
| ApiError::MisalignmentPolicyViolation { .. }