from flask import Flask, render_template, request, jsonify import requests import os from collections import Counter app = Flask(__name__) # 1) 트렌딩 모델을 가져오는 함수 def fetch_trending_models(offset=0, limit=72): try: url = "https://huggingface.co/api/models" params = {"limit": 10000} # 많은 모델을 가져옴 response = requests.get(url, params=params, timeout=30) if response.status_code == 200: models = response.json() # 필터링 filtered = [ m for m in models if m.get('owner') != 'None' and m.get('id', '').split('/', 1)[0] != 'None' ] start = min(offset, len(filtered)) end = min(offset + limit, len(filtered)) print(f"Fetched {len(filtered)} models, returning {end - start} from {start} to {end}.") return { 'models': filtered[start:end], 'total': len(filtered), 'offset': offset, 'limit': limit, 'all_models': filtered } else: # 오류 응답 시 더미 모델 print(f"Error fetching models: {response.status_code}") return { 'models': generate_dummy_models(limit), 'total': 200, 'offset': offset, 'limit': limit, 'all_models': generate_dummy_models(500) } except Exception as e: print("Exception when fetching models:", e) return { 'models': generate_dummy_models(limit), 'total': 200, 'offset': offset, 'limit': limit, 'all_models': generate_dummy_models(500) } # 2) 더미 모델 생성 함수(오류시 사용) def generate_dummy_models(count): dummy_list = [] for i in range(count): dummy_list.append({ 'id': f'dummy/model-{i}', 'owner': 'dummy', 'title': f'Example Model {i+1}', 'likes': 100 - i, 'downloads': 9999 - i, # 임의의 다운로드 수 'createdAt': '2023-01-01T00:00:00.000Z', 'tags': ['dummy', 'fallback'] }) return dummy_list # 3) 모델 URL 생성 def transform_url(owner, name): name = name.replace('.', '-').replace('_', '-').lower() owner = owner.lower() return f"https://huggingface.co/{owner}/{name}" # 4) 모델 상세정보 가공 def get_model_details(model_data, index, offset): try: if '/' in model_data.get('id', ''): owner, name = model_data['id'].split('/', 1) else: owner = model_data.get('owner', '') name = model_data.get('id', '') if owner == 'None' or name == 'None': return None original_url = f"https://huggingface.co/{owner}/{name}" embed_url = transform_url(owner, name) # 다운로드, 좋아요 likes_count = model_data.get('likes', 0) downloads_count = model_data.get('downloads', 0) # 다운로드 수 추가 title = model_data.get('title', name) tags = model_data.get('tags', []) return { 'url': original_url, 'embedUrl': embed_url, 'title': title, 'owner': owner, 'name': name, 'likes_count': likes_count, 'downloads_count': downloads_count, # 다운로드 수 'tags': tags, 'rank': offset + index + 1 } except Exception as e: print("Error processing model data:", e) return { 'url': 'https://huggingface.co', 'embedUrl': 'https://huggingface.co', 'title': 'Error Loading Model', 'owner': 'huggingface', 'name': 'error', 'likes_count': 0, 'downloads_count': 0, 'tags': [], 'rank': offset + index + 1 } # 5) 오너 통계 (Top 30) def get_owner_stats(all_models): owners = [] for m in all_models: if '/' in m.get('id', ''): o, _ = m['id'].split('/', 1) else: o = m.get('owner', '') if o != 'None': owners.append(o) c = Counter(owners) return c.most_common(30) @app.route('/') def home(): return render_template('index.html') # 6) 트렌딩 모델 API @app.route('/api/trending-models', methods=['GET']) def trending_models(): search_query = request.args.get('search', '').lower() offset = int(request.args.get('offset', 0)) limit = int(request.args.get('limit', 72)) data = fetch_trending_models(offset, limit) results = [] for index, md in enumerate(data['models']): info = get_model_details(md, index, offset) if not info: continue if search_query: title_l = info['title'].lower() owner_l = info['owner'].lower() url_l = info['url'].lower() tags_l = ' '.join(t.lower() for t in info['tags']) # 검색 조건에 없으면 pass if (search_query not in title_l and search_query not in owner_l and search_query not in url_l and search_query not in tags_l): continue results.append(info) top_owners = get_owner_stats(data['all_models']) return jsonify({ 'models': results, 'total': data['total'], 'offset': offset, 'limit': limit, 'top_owners': top_owners }) if __name__ == '__main__': # 템플릿 폴더 생성 os.makedirs('templates', exist_ok=True) # index.html 생성 with open('templates/index.html', 'w', encoding='utf-8') as f: f.write(""" Huggingface Models Gallery
Huggingface Explorer

HF Model Leaderboard

Discover the top trending models from Huggingface

Owner Statistics
Top 30 Creators by Number of Models
Loading amazing models...
If this takes too long, try refreshing the page.
""") app.run(host='0.0.0.0', port=7860)