"""Check external assets required by the SFT launcher, without loading a model.""" import json import os from pathlib import Path root = Path(__file__).resolve().parents[1] model = Path(os.environ.get('SKINGPT_MODEL_DIR', root / 'external/base_model')) dataset = Path(os.environ.get('SKINGPT_DATASET_DIR', root / 'data')) images = Path(os.environ.get('SKINGPT_IMAGE_ROOT', root / 'external/images')) features = Path(os.environ.get('SKINGPT_FEATURE_ROOT', root / 'external/teacher_features')) errors = [] for label, path in [('base model config', model / 'config.json'), ('dataset registry', dataset / 'dataset_info.json')]: if not path.is_file(): errors.append(f'Missing {label}: {path}') for label, path in [('images', images), ('teacher features', features)]: if not path.is_dir(): errors.append(f'Missing {label} directory: {path}') if (dataset / 'dataset_info.json').is_file(): entries = json.loads((dataset / 'dataset_info.json').read_text()) expected = json.loads((root / 'data/dataset_info.json').read_text()) for name, registration in expected.items(): path = dataset / registration['file_name'] if not path.is_file(): errors.append(f'Missing training file: {path}') if entries.get(name) != registration: errors.append(f'Dataset registration differs from the registered SFT mapping: {name}') if errors: raise SystemExit('External training assets must be supplied:\n- ' + '\n- '.join(errors)) print('External asset locations are present. This check does not validate every image, feature, or model weight.')