ZhuLinsen/daily_stock_analysis · warning · HTTPException
validation_failed
validation_failed
Error message
System configuration validation failed
What it means
Raised by POST /system/config/generation-backends/status/preview when service.preview_generation_backend_status raises ConfigValidationError while checking unsaved draft values. Returns 400 'validation_failed' with the structured exc.issues list attached — this is a functional validation response, not a server fault.
Source
Thrown at api/v1/endpoints/system_config.py:247
400: {"description": "Validation failed", "model": SystemConfigValidationErrorResponse},
500: {"description": "Internal server error", "model": ErrorResponse},
},
summary="Preview generation backend status",
description="Run a side-effect-free cheap check against unsaved settings draft values.",
)
def preview_generation_backend_status(
request: GenerationBackendStatusPreviewRequest,
service: SystemConfigService = Depends(get_system_config_service),
) -> GenerationBackendStatusResponse:
"""Return generation backend status for unsaved draft values."""
try:
payload = service.preview_generation_backend_status(
items=[item.model_dump() for item in request.items],
mask_token=request.mask_token,
)
return GenerationBackendStatusResponse.model_validate(payload)
except ConfigValidationError as exc:
raise HTTPException(
status_code=400,
detail={
"error": "validation_failed",
"message": "System configuration validation failed",
"issues": exc.issues,
},
)
except Exception as exc:
logger.error("Failed to preview generation backend status: %s", exc, exc_info=True)
raise HTTPException(
status_code=500,
detail={
"error": "internal_error",
"message": "Failed to preview generation backend status",
},
)
View on GitHub (pinned to 5159bd72e8)
Solutions
- Read the 'issues' array in the 400 body — each entry identifies which draft item field failed
- Fix the flagged fields in the request items and re-POST the preview
- Do not treat this as retryable; it is deterministic input validation
Example fix
// before
const res = await fetch(url, {method:'POST', body: JSON.stringify({items: [{backend_id: '', ...}]})});
// after
const res = await fetch(url, {method:'POST', body: JSON.stringify({items: [{backend_id: 'openai', ...}]})});
if (res.status === 400) { const {detail} = await res.json(); showIssues(detail.issues); } Defensive patterns
Strategy: validation
Validate before calling
// Validate drafts minimally client-side before preview: items.every(i => i.backend_id && typeof i === 'object')
Type guard
function hasValidationIssues(d) {
return d?.detail?.error === 'validation_failed' && Array.isArray(d.detail.issues);
} Try / catch
const body = await res.json();
if (res.status === 400 && body.detail?.error === 'validation_failed') {
showIssues(body.detail.issues); // structured, per-field
} Prevention
- Always render the issues array instead of a generic message
- Run preview before save/smoke-test to catch invalid drafts cheaply
When it happens
Trigger: Submitting draft generation backend items (e.g. a backend entry with an empty API key, invalid model name, or unknown backend_id) to the preview endpoint; the service validates drafts before computing status.
Common situations: User editing backend config in the settings UI and previewing before save; automation posting incomplete draft payloads; masked token misuse (wrong mask_token) when editing secrets.
Related errors
- unsupported_period
- internal_error
- capability_unsupported
- Responses API surface requires a normalized openai/<model> r
- LLM route aliases cannot mix API surfaces: {sorted(surface_c
AI-assisted analysis of ZhuLinsen/daily_stock_analysis@5159bd72e8 (2026-08-15).
Data as JSON: /api/errors/ec019805ed6a15ba.
Report an issue: GitHub.