"""Validate a staged release, then upload only its manifest-listed files.""" import argparse import os from pathlib import Path from scripts.release import validate_release def modelscope_access(config, owner): token = os.environ.get('MODELSCOPE_API_TOKEN') if token: return token # ModelScopeConfig.get_token() holds a Git access credential, not an SDK/API token. if not config.get_cookies(): raise RuntimeError('No valid ModelScope API login. Log in locally with a fresh SDK token.') user = config.get_user_info() if not user or user[0] != owner: raise ValueError('Authenticated ModelScope account differs from requested account') return None # Let HubApi use its authenticated cached cookies. def main(): ap = argparse.ArgumentParser() ap.add_argument('platform', choices=['huggingface', 'modelscope']) ap.add_argument('--folder') ap.add_argument('--repo-id') ap.add_argument('--dry-run', action='store_true') args = ap.parse_args() folder = Path(args.folder or f'release/{args.platform}') repo_id = args.repo_id or ('ixim/Image21-INT8' if args.platform == 'huggingface' else 'iximbox/Image21-INT8') owner = 'ixim' if args.platform == 'huggingface' else 'iximbox' if repo_id.split('/')[0] != owner or len(repo_id.split('/')) != 2: raise ValueError(f'Expected the requested {owner} namespace') rows = validate_release(folder) names = [r['path'] for r in rows] + ['MANIFEST.json'] print(f'Validated {len(rows)} files for {args.platform}:{repo_id}', flush=True) if args.dry_run: print('Dry run: no network mutation performed.') return if args.platform == 'huggingface': from huggingface_hub import HfApi, get_token token = get_token() if not token: raise RuntimeError('No HF credentials. Run hf auth login with this project HF_HOME first.') api = HfApi(token=token) if api.whoami()['name'] != owner: raise ValueError('Authenticated Hugging Face account differs from requested account') api.create_repo(repo_id=repo_id, repo_type='model', private=False, exist_ok=True) result = api.upload_folder(repo_id=repo_id, repo_type='model', folder_path=folder, allow_patterns=names, commit_message='Release verified Image21-INT8 conversion') print(result) else: from modelscope.hub.api import HubApi, ModelScopeConfig from modelscope.hub.errors import NotExistError from requests.exceptions import HTTPError api = HubApi() token = modelscope_access(ModelScopeConfig, owner) # Inspect the target first. Do not catch authentication/network errors as a missing repo. try: api.get_model(repo_id) except HTTPError as exc: if exc.response is None or exc.response.status_code != 404: raise api.create_model(repo_id, visibility=5, license='other', original_model_id='Qwen/Qwen-Image-2.1', token=token) except NotExistError: api.create_model(repo_id, visibility=5, license='other', original_model_id='Qwen/Qwen-Image-2.1', token=token) result = api.upload_folder(repo_id=repo_id, folder_path=str(folder), token=token, allow_patterns=names, max_workers=4, commit_message='Release verified Image21-INT8 conversion') print(result) if __name__ == '__main__': main()