Spaces:
Sleeping
Sleeping
from flask import Blueprint, request, jsonify | |
from functools import wraps | |
from huggingface_hub import HfApi | |
from config import API_KEY | |
api = Blueprint('api', __name__, url_prefix='/api/v1') | |
def require_api_key(f): | |
def decorated(*args, **kwargs): | |
auth_header = request.headers.get('Authorization') | |
if not auth_header: | |
return jsonify({'error': 'No Authorization header'}), 401 | |
try: | |
scheme, token = auth_header.split() | |
if scheme.lower() != 'bearer': | |
return jsonify({'error': 'Invalid authorization scheme'}), 401 | |
if token != API_KEY: | |
return jsonify({'error': 'Invalid API key'}), 401 | |
except ValueError: | |
return jsonify({'error': 'Invalid Authorization header format'}), 401 | |
return f(*args, **kwargs) | |
return decorated | |
def list_spaces(token): | |
"""列出所有空间""" | |
try: | |
hf_api = HfApi(token=token) | |
# 验证token | |
try: | |
user_info = hf_api.whoami() | |
username = user_info["name"] | |
except Exception: | |
return jsonify({'error': 'Invalid HuggingFace token'}), 401 | |
spaces = list(hf_api.list_spaces(author=username)) | |
space_list = [] | |
for space in spaces: | |
try: | |
space_info = hf_api.space_info(repo_id=space.id) | |
space_list.append(space_info.id) | |
except Exception as e: | |
continue | |
return jsonify({ | |
'spaces': space_list, | |
'total': len(space_list) | |
}) | |
except Exception as e: | |
return jsonify({'error': str(e)}), 500 | |
def get_space_info(token, space_id): | |
"""获取特定空间信息""" | |
try: | |
hf_api = HfApi(token=token) | |
try: | |
space_info = hf_api.space_info(repo_id=space_id) | |
except Exception: | |
return jsonify({'error': 'Space not found'}), 404 | |
# 获取运行状态 | |
status = "未知状态" | |
if space_info.runtime: | |
status = space_info.runtime.stage if hasattr(space_info.runtime, 'stage') else "未知状态" | |
return jsonify({ | |
'id': space_info.id, | |
'status': status, | |
'last_modified': space_info.lastModified.isoformat() if space_info.lastModified else None, | |
'created_at': space_info.created_at.isoformat() if space_info.created_at else None, | |
'sdk': space_info.sdk, | |
'tags': space_info.tags, | |
'private': space_info.private | |
}) | |
except Exception as e: | |
return jsonify({'error': str(e)}), 500 | |
def restart_space(token, space_id): | |
"""重启空间""" | |
try: | |
hf_api = HfApi(token=token) | |
try: | |
hf_api.restart_space(repo_id=space_id) | |
return jsonify({ | |
'success': True, | |
'message': f'Space {space_id} restart initiated successfully' | |
}) | |
except Exception as e: | |
return jsonify({ | |
'success': False, | |
'error': str(e) | |
}), 400 | |
except Exception as e: | |
return jsonify({ | |
'success': False, | |
'error': str(e) | |
}), 500 | |
def rebuild_space(token, space_id): | |
"""重建空间""" | |
try: | |
hf_api = HfApi(token=token) | |
try: | |
hf_api.restart_space(repo_id=space_id, factory_reboot=True) | |
return jsonify({ | |
'success': True, | |
'message': f'Space {space_id} rebuild initiated successfully' | |
}) | |
except Exception as e: | |
return jsonify({ | |
'success': False, | |
'error': str(e) | |
}), 400 | |
except Exception as e: | |
return jsonify({ | |
'success': False, | |
'error': str(e) | |
}), 500 | |