Files
ALwrity/backend/api/content_planning/services/content_strategy/autofill/schema.py

47 lines
1.7 KiB
Python

from typing import Any, Dict
REQUIRED_TOP_LEVEL_KEYS = {
'fields': dict,
'sources': dict,
'quality_scores': dict,
'confidence_levels': dict,
'data_freshness': dict,
'input_data_points': dict,
}
def validate_output(payload: Dict[str, Any]) -> None:
# Top-level keys and types
for key, typ in REQUIRED_TOP_LEVEL_KEYS.items():
if key not in payload:
raise ValueError(f"Autofill payload missing key: {key}")
if not isinstance(payload[key], typ):
raise ValueError(f"Autofill payload key '{key}' must be {typ.__name__}")
fields = payload['fields']
if not isinstance(fields, dict):
raise ValueError("fields must be an object")
# Allow empty fields, but validate structure when present
for field_id, spec in fields.items():
if not isinstance(spec, dict):
raise ValueError(f"Field '{field_id}' must be an object")
for k in ('value', 'source', 'confidence'):
if k not in spec:
raise ValueError(f"Field '{field_id}' missing '{k}'")
if spec['source'] not in (
'website_analysis',
'research_preferences',
'api_keys_data',
'onboarding_session',
'persona_data',
'competitor_analysis',
'analytics_data'
):
raise ValueError(f"Field '{field_id}' has invalid source: {spec['source']}")
try:
c = float(spec['confidence'])
except Exception:
raise ValueError(f"Field '{field_id}' confidence must be numeric")
if c < 0.0 or c > 1.0:
raise ValueError(f"Field '{field_id}' confidence must be in [0,1]")