ruvnet/RuView · warning · HTTPException

min_confidence must be between 0.0 and 1.0

Error message

min_confidence must be between 0.0 and 1.0

What it means

Raised as HTTP 400 by the QueryFilters dependency at dependencies.py:388 when min_confidence is supplied outside the closed interval [0.0, 1.0]. Confidence is a probability fraction in this system, not a percentage; None (parameter omitted) skips the check entirely.

Source

Thrown at archive/v1/src/api/dependencies.py:388

class QueryFilters:
    """Common query filters."""
    
    def __init__(
        self,
        start_time: Optional[str] = None,
        end_time: Optional[str] = None,
        min_confidence: Optional[float] = None,
        activity: Optional[str] = None
    ):
        self.start_time = start_time
        self.end_time = end_time
        self.min_confidence = min_confidence
        self.activity = activity
        
        # Validate confidence
        if min_confidence is not None:
            if not 0.0 <= min_confidence <= 1.0:
                raise HTTPException(
                    status_code=status.HTTP_400_BAD_REQUEST,
                    detail="min_confidence must be between 0.0 and 1.0"
                )


def get_query_filters(
    start_time: Optional[str] = None,
    end_time: Optional[str] = None,
    min_confidence: Optional[float] = None,
    activity: Optional[str] = None
) -> QueryFilters:
    """Get query filters."""
    return QueryFilters(
        start_time=start_time,
        end_time=end_time,
        min_confidence=min_confidence,
        activity=activity
    )

View on GitHub (pinned to 4685618388)

Solutions

  1. Convert percentages to fractions before sending (80 percent becomes 0.8)
  2. Clamp the value client-side to [0.0, 1.0]
  3. Omit min_confidence entirely when no filtering is wanted — None is accepted

Example fix

# before
params = {'min_confidence': slider_percent}

# after
params = {'min_confidence': slider_percent / 100.0}
Defensive patterns

Strategy: validation

Validate before calling

def to_confidence(value):
    c = float(value) / 100.0 if float(value) > 1.0 else float(value)
    return round(min(1.0, max(0.0, c)), 4)

params = {'min_confidence': to_confidence(slider_percent)}

Type guard

def is_valid_confidence(c) -> bool:
    return c is None or (isinstance(c, (int, float)) and 0.0 <= c <= 1.0)

Try / catch

resp = await client.get('/api/v1/detections', params=params)
if resp.status_code == 400 and 'min_confidence' in resp.json().get('detail', ''):
    params.pop('min_confidence', None)  # drop the filter and retry unfiltered
    resp = await client.get('/api/v1/detections', params=params)

Prevention

When it happens

Trigger: A filtered listing endpoint called with ?min_confidence=1.2, ?min_confidence=-0.1, or a percentage like ?min_confidence=80 (anything not in [0.0, 1.0]).

Common situations: A 0-100 UI slider value is sent without dividing by 100; a caller sends 5 meaning '5 percent'; a NaN serializes to an out-of-range float.

Related errors


AI-assisted analysis of ruvnet/RuView@4685618388 (2026-08-16). Data as JSON: /api/errors/7c17dcffeee2e4c7. Report an issue: GitHub.