diff --git a/modules/routes/api_search.py b/modules/routes/api_search.py new file mode 100644 index 0000000..e3fbded --- /dev/null +++ b/modules/routes/api_search.py @@ -0,0 +1,66 @@ +""" +搜索/计算/统计 API +""" +from flask import Blueprint, request, jsonify +from config import MODELS_FILE, GPUS_FILE, CPUS_FILE, CATEGORIES_FILE, KNOWLEDGE_FILE +from utils import load_data + +search_bp = Blueprint('api_search', __name__) + + +@search_bp.route('/api/search') +def api_search(): + keyword = request.args.get('q', '').strip().lower() + if not keyword: + return jsonify({'models': [], 'gpus': [], 'cpus': []}) + models = load_data(MODELS_FILE) + gpus = load_data(GPUS_FILE) + cpus = load_data(CPUS_FILE) + return jsonify({ + 'models': [m for m in models if m.get('visible', True) and + (keyword in m.get('name', '').lower() or + keyword in m.get('organization', '').lower())], + 'gpus': [g for g in gpus if g.get('visible', True) and + (keyword in g.get('name', '').lower() or + keyword in g.get('manufacturer', '').lower())], + 'cpus': [c for c in cpus if c.get('visible', True) and + (keyword in c.get('name', '').lower() or + keyword in c.get('manufacturer', '').lower())] + }) + + +@search_bp.route('/api/calculate/vram') +def api_calculate_vram(): + params = request.args.get('params', '7', type=float) + precision = request.args.get('precision', 'fp16', type=str) + bytes_per_param = {'fp32': 4, 'fp16': 2, 'int8': 1, 'int4': 0.5} + multiplier = bytes_per_param.get(precision, 2) + vram_gb = params * multiplier * 1e9 / (1024**3) + total_vram = vram_gb * 1.3 + gpus = load_data(GPUS_FILE) + suitable_gpus = [g for g in gpus if g.get('visible', True) and + g.get('memory_gb', 0) >= total_vram] + return jsonify({ + 'model_vram': round(vram_gb, 2), + 'total_vram': round(total_vram, 2), + 'suitable_gpus': suitable_gpus + }) + + +@search_bp.route('/api/stats') +def api_stats(): + models = load_data(MODELS_FILE) + gpus = load_data(GPUS_FILE) + cpus = load_data(CPUS_FILE) + categories = load_data(CATEGORIES_FILE) + knowledge = load_data(KNOWLEDGE_FILE) + visible_models = [m for m in models if m.get('visible', True)] + return jsonify({ + 'models_count': len(visible_models), + 'gpus_count': len([g for g in gpus if g.get('visible', True)]), + 'cpus_count': len([c for c in cpus if c.get('visible', True)]), + 'categories_count': len([c for c in categories if c.get('visible', True)]), + 'knowledge_count': len(knowledge), + 'latest_models': sorted(visible_models, + key=lambda x: x.get('created_at', ''), reverse=True)[:5] + })