diff --git a/app.py b/app.py index 9d1f295..6dde4aa 100644 --- a/app.py +++ b/app.py @@ -1,13 +1,16 @@ """ ParamHub - 参数百科 AI大模型与硬件参数速查平台 +v1.1.0 - 新增智能添加和展示开关功能 """ from flask import Flask, render_template, jsonify, request from flask_cors import CORS import json +import requests from pathlib import Path from datetime import datetime +import uuid app = Flask(__name__, static_folder='static', static_url_path='/static') CORS(app) @@ -23,6 +26,13 @@ CPUS_FILE = DATA_DIR / 'cpus.json' CATEGORIES_FILE = DATA_DIR / 'categories.json' KNOWLEDGE_FILE = DATA_DIR / 'knowledge.json' +# 大模型配置 +LLM_CONFIG = { + 'base_url': 'http://192.168.2.17:19007/v1', + 'api_key': 'xxxx', + 'model': 'auto', +} + def load_data(file_path): """加载JSON数据""" if file_path.exists(): @@ -33,6 +43,136 @@ def save_data(file_path, data): """保存JSON数据""" file_path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding='utf-8') +# ============ 大模型智能解析 ============ + +def parse_with_llm(text, category_type): + """ + 使用大模型解析文本,提取结构化数据 + """ + + # 根据类型定义字段模板 + field_templates = { + 'model': { + 'name': '模型名称', + 'organization': '厂商/组织', + 'parameters': '参数量(数字,单位B)', + 'context_length': '上下文长度(数字)', + 'architecture': '架构类型', + 'is_open_source': '是否开源(true/false)', + 'mmlu': 'MMLU分数(数字)', + 'input_price': '输入价格(数字)', + 'output_price': '输出价格(数字)', + 'license': '许可证', + 'description': '简介描述', + }, + 'gpu': { + 'name': 'GPU名称', + 'manufacturer': '厂商', + 'architecture': '架构', + 'memory_gb': '显存大小(数字,单位GB)', + 'cuda_cores': 'CUDA核心数(数字)', + 'tensor_cores': 'Tensor核心数(数字)', + 'memory_bandwidth_gbs': '显存带宽(数字,单位GB/s)', + 'fp16_tflops': 'FP16性能(数字,单位TF)', + 'price_usd': '价格(数字)', + 'release_year': '发布年份(数字)', + 'description': '简介描述', + }, + 'cpu': { + 'name': 'CPU名称', + 'manufacturer': '厂商', + 'architecture': '架构', + 'cores': '核心数(数字)', + 'threads': '线程数(数字)', + 'base_clock_ghz': '基础频率(数字,单位GHz)', + 'boost_clock_ghz': '加速频率(数字,单位GHz)', + 'l3_cache_mb': 'L3缓存(数字,单位MB)', + 'tdp_watts': 'TDP功耗(数字,单位W)', + 'price_usd': '价格(数字)', + 'description': '简介描述', + }, + 'dynamic': { + 'name': '名称', + 'brand': '品牌', + 'price': '价格(数字)', + 'year': '年份(数字)', + 'specs': '规格参数', + 'description': '简介描述', + }, + } + + fields = field_templates.get(category_type, field_templates['dynamic']) + + prompt = f"""请解析以下文本,提取结构化数据。 + +文本内容: +{text} + +需要提取的字段: +{json.dumps(fields, ensure_ascii=False, indent=2)} + +要求: +1. 根据文本内容智能提取各个字段的值 +2. 数字字段只返回数字,不带单位 +3. 如果某字段在文本中没有提及,返回null +4. 返回JSON格式,不要包含任何其他内容 + +请直接返回JSON数据:""" + + try: + response = requests.post( + f"{LLM_CONFIG['base_url']}/chat/completions", + headers={ + "Content-Type": "application/json", + "Authorization": f"Bearer {LLM_CONFIG['api_key']}" + }, + json={ + "model": LLM_CONFIG['model'], + "messages": [ + {"role": "system", "content": "你是一个数据提取助手,负责从文本中提取结构化数据。只返回JSON,不要其他内容。"}, + {"role": "user", "content": prompt} + ], + "max_tokens": 1000, + "temperature": 0.1 + }, + timeout=30 + ) + + if response.status_code == 200: + data = response.json() + content = data['choices'][0]['message']['content'].strip() + + # 清理可能的markdown包裹 + if content.startswith('```'): + content = content.split('\n', 1)[1] if '\n' in content else content[3:] + content = content.rsplit('```', 1)[0] if '```' in content else content + + # 解析JSON + parsed = json.loads(content) + + # 清理null值 + cleaned = {} + for k, v in parsed.items(): + if v is not None and v != '' and v != 'null': + # 尝试转换数字 + if isinstance(v, str): + try: + if '.' in v: + cleaned[k] = float(v) + else: + cleaned[k] = int(v) + except: + cleaned[k] = v + else: + cleaned[k] = v + + return cleaned + except Exception as e: + print(f"LLM解析失败: {e}") + + # 降级处理:返回基本结构 + return {'name': text[:50], 'description': text} + # ============ 页面路由 ============ @app.route('/') @@ -93,6 +233,11 @@ def api_models(): """获取模型列表""" models = load_data(MODELS_FILE) + # 过滤隐藏项(前台默认不显示visible=false) + hide_hidden = request.args.get('all', '0') == '0' + if hide_hidden: + models = [m for m in models if m.get('visible', True)] + # 搜索过滤 keyword = request.args.get('q', '').strip().lower() if keyword: @@ -125,10 +270,9 @@ def api_create_model(): data = request.get_json() models = load_data(MODELS_FILE) - # 生成ID - import uuid data['id'] = uuid.uuid4().hex[:12] data['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + data['visible'] = data.get('visible', True) # 默认显示 models.append(data) save_data(MODELS_FILE, models) @@ -160,11 +304,123 @@ def api_delete_model(model_id): return jsonify({'success': True}) +@app.route('/api/models//visible', methods=['POST']) +def api_toggle_model_visible(model_id): + """切换模型显示状态""" + models = load_data(MODELS_FILE) + model = next((m for m in models if m['id'] == model_id), None) + if not model: + return jsonify({'error': 'Model not found'}), 404 + + model['visible'] = not model.get('visible', True) + save_data(MODELS_FILE, models) + + return jsonify({'success': True, 'visible': model['visible']}) + +# ============ 智能添加API ============ + +@app.route('/api/models/smart-add', methods=['POST']) +def api_smart_add_model(): + """智能添加模型(粘贴文本解析)""" + data = request.get_json() + text = data.get('text', '') + + if not text: + return jsonify({'error': '文本不能为空'}), 400 + + # 大模型解析 + parsed = parse_with_llm(text, 'model') + + # 补充必要字段 + parsed['id'] = uuid.uuid4().hex[:12] + parsed['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + parsed['visible'] = True + parsed['raw_text'] = text # 保存原始文本 + + # 保存 + models = load_data(MODELS_FILE) + models.append(parsed) + save_data(MODELS_FILE, models) + + return jsonify(parsed) + +@app.route('/api/gpus/smart-add', methods=['POST']) +def api_smart_add_gpu(): + """智能添加GPU""" + data = request.get_json() + text = data.get('text', '') + + if not text: + return jsonify({'error': '文本不能为空'}), 400 + + parsed = parse_with_llm(text, 'gpu') + parsed['id'] = uuid.uuid4().hex[:12] + parsed['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + parsed['visible'] = True + parsed['raw_text'] = text + + gpus = load_data(GPUS_FILE) + gpus.append(parsed) + save_data(GPUS_FILE, gpus) + + return jsonify(parsed) + +@app.route('/api/cpus/smart-add', methods=['POST']) +def api_smart_add_cpu(): + """智能添加CPU""" + data = request.get_json() + text = data.get('text', '') + + if not text: + return jsonify({'error': '文本不能为空'}), 400 + + parsed = parse_with_llm(text, 'cpu') + parsed['id'] = uuid.uuid4().hex[:12] + parsed['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + parsed['visible'] = True + parsed['raw_text'] = text + + cpus = load_data(CPUS_FILE) + cpus.append(parsed) + save_data(CPUS_FILE, cpus) + + return jsonify(parsed) + +@app.route('/api/items//smart-add', methods=['POST']) +def api_smart_add_item(category_id): + """智能添加动态分类数据""" + data = request.get_json() + text = data.get('text', '') + + if not text: + return jsonify({'error': '文本不能为空'}), 400 + + parsed = parse_with_llm(text, 'dynamic') + parsed['id'] = uuid.uuid4().hex[:12] + parsed['category_id'] = category_id + parsed['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + parsed['visible'] = True + parsed['raw_text'] = text + + items_file = DATA_DIR / f'items_{category_id}.json' + items = load_data(items_file) + items.append(parsed) + save_data(items_file, items) + + return jsonify(parsed) + +# ============ GPU API ============ + @app.route('/api/gpus') def api_gpus(): """获取GPU列表""" gpus = load_data(GPUS_FILE) + # 过滤隐藏项 + hide_hidden = request.args.get('all', '0') == '0' + if hide_hidden: + gpus = [g for g in gpus if g.get('visible', True)] + keyword = request.args.get('q', '').strip().lower() if keyword: gpus = [g for g in gpus if keyword in g.get('name', '').lower() or @@ -183,38 +439,15 @@ def api_gpu_detail(gpu_id): return jsonify(gpu) -@app.route('/api/cpus') -def api_cpus(): - """获取CPU列表""" - cpus = load_data(CPUS_FILE) - - keyword = request.args.get('q', '').strip().lower() - if keyword: - cpus = [c for c in cpus if keyword in c.get('name', '').lower() or - keyword in c.get('manufacturer', '').lower()] - - return jsonify(cpus) - -@app.route('/api/cpus/') -def api_cpu_detail(cpu_id): - """获取单个CPU详情""" - cpus = load_data(CPUS_FILE) - cpu = next((c for c in cpus if c['id'] == cpu_id), None) - - if not cpu: - return jsonify({'error': 'CPU not found'}), 404 - - return jsonify(cpu) - @app.route('/api/gpus', methods=['POST']) def api_create_gpu(): """创建新GPU""" data = request.get_json() gpus = load_data(GPUS_FILE) - import uuid data['id'] = uuid.uuid4().hex[:12] data['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + data['visible'] = data.get('visible', True) gpus.append(data) save_data(GPUS_FILE, gpus) @@ -246,15 +479,58 @@ def api_delete_gpu(gpu_id): return jsonify({'success': True}) +@app.route('/api/gpus//visible', methods=['POST']) +def api_toggle_gpu_visible(gpu_id): + """切换GPU显示状态""" + gpus = load_data(GPUS_FILE) + gpu = next((g for g in gpus if g['id'] == gpu_id), None) + if not gpu: + return jsonify({'error': 'GPU not found'}), 404 + + gpu['visible'] = not gpu.get('visible', True) + save_data(GPUS_FILE, gpus) + + return jsonify({'success': True, 'visible': gpu['visible']}) + +# ============ CPU API ============ + +@app.route('/api/cpus') +def api_cpus(): + """获取CPU列表""" + cpus = load_data(CPUS_FILE) + + # 过滤隐藏项 + hide_hidden = request.args.get('all', '0') == '0' + if hide_hidden: + cpus = [c for c in cpus if c.get('visible', True)] + + keyword = request.args.get('q', '').strip().lower() + if keyword: + cpus = [c for c in cpus if keyword in c.get('name', '').lower() or + keyword in c.get('manufacturer', '').lower()] + + return jsonify(cpus) + +@app.route('/api/cpus/') +def api_cpu_detail(cpu_id): + """获取单个CPU详情""" + cpus = load_data(CPUS_FILE) + cpu = next((c for c in cpus if c['id'] == cpu_id), None) + + if not cpu: + return jsonify({'error': 'CPU not found'}), 404 + + return jsonify(cpu) + @app.route('/api/cpus', methods=['POST']) def api_create_cpu(): """创建新CPU""" data = request.get_json() cpus = load_data(CPUS_FILE) - import uuid data['id'] = uuid.uuid4().hex[:12] data['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + data['visible'] = data.get('visible', True) cpus.append(data) save_data(CPUS_FILE, cpus) @@ -286,6 +562,21 @@ def api_delete_cpu(cpu_id): return jsonify({'success': True}) +@app.route('/api/cpus//visible', methods=['POST']) +def api_toggle_cpu_visible(cpu_id): + """切换CPU显示状态""" + cpus = load_data(CPUS_FILE) + cpu = next((c for c in cpus if c['id'] == cpu_id), None) + if not cpu: + return jsonify({'error': 'CPU not found'}), 404 + + cpu['visible'] = not cpu.get('visible', True) + save_data(CPUS_FILE, cpus) + + return jsonify({'success': True, 'visible': cpu['visible']}) + +# ============ 搜索和其他API ============ + @app.route('/api/search') def api_search(): """全局搜索""" @@ -299,12 +590,9 @@ def api_search(): cpus = load_data(CPUS_FILE) result = { - 'models': [m for m in models if keyword in m.get('name', '').lower() or - keyword in m.get('organization', '').lower()], - 'gpus': [g for g in gpus if keyword in g.get('name', '').lower() or - keyword in g.get('manufacturer', '').lower()], - 'cpus': [c for c in cpus if keyword in c.get('name', '').lower() or - keyword in c.get('manufacturer', '').lower()] + '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())] } return jsonify(result) @@ -312,31 +600,16 @@ def api_search(): @app.route('/api/calculate/vram') def api_calculate_vram(): """显存计算""" - params = request.args.get('params', '7', type=float) # 参数量(B) - precision = request.args.get('precision', 'fp16', type=str) # 精度 - - # 计算公式 - # FP32: 参数 * 4字节 - # FP16: 参数 * 2字节 - # INT8: 参数 * 1字节 - # INT4: 参数 * 0.5字节 - - bytes_per_param = { - 'fp32': 4, - 'fp16': 2, - 'int8': 1, - 'int4': 0.5 - } + 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) # 转换为GB - - # 加上KV cache和激活值估算(约30%额外开销) + vram_gb = params * multiplier * 1e9 / (1024**3) total_vram = vram_gb * 1.3 - # 推荐GPU gpus = load_data(GPUS_FILE) - suitable_gpus = [g for g in gpus if g.get('memory_gb', 0) >= total_vram] + 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), @@ -354,12 +627,12 @@ def api_stats(): knowledge = load_data(KNOWLEDGE_FILE) return jsonify({ - 'models_count': len(models), - 'gpus_count': len(gpus), - 'cpus_count': len(cpus), - 'categories_count': len(categories), + 'models_count': len([m for m in models if m.get('visible', True)]), + '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(models, key=lambda x: x.get('created_at', ''), reverse=True)[:5] + 'latest_models': sorted([m for m in models if m.get('visible', True)], key=lambda x: x.get('created_at', ''), reverse=True)[:5] }) # ============ 分类管理API ============ @@ -368,7 +641,13 @@ def api_stats(): def api_categories(): """获取分类列表""" categories = load_data(CATEGORIES_FILE) - return jsonify(categories) + + # 过滤隐藏项 + hide_hidden = request.args.get('all', '0') == '0' + if hide_hidden: + categories = [c for c in categories if c.get('visible', True)] + + return jsonify(sorted(categories, key=lambda x: x.get('order', 0))) @app.route('/api/categories', methods=['POST']) def api_create_category(): @@ -376,9 +655,9 @@ def api_create_category(): data = request.get_json() categories = load_data(CATEGORIES_FILE) - import uuid data['id'] = uuid.uuid4().hex[:12] data['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + data['visible'] = data.get('visible', True) categories.append(data) save_data(CATEGORIES_FILE, categories) @@ -410,6 +689,19 @@ def api_delete_category(category_id): return jsonify({'success': True}) +@app.route('/api/categories//visible', methods=['POST']) +def api_toggle_category_visible(category_id): + """切换分类显示状态""" + categories = load_data(CATEGORIES_FILE) + category = next((c for c in categories if c['id'] == category_id), None) + if not category: + return jsonify({'error': 'Category not found'}), 404 + + category['visible'] = not category.get('visible', True) + save_data(CATEGORIES_FILE, categories) + + return jsonify({'success': True, 'visible': category['visible']}) + # ============ 知识库管理API ============ @app.route('/api/knowledge') @@ -417,13 +709,10 @@ def api_knowledge(): """获取知识列表""" knowledge = load_data(KNOWLEDGE_FILE) - # 搜索过滤 keyword = request.args.get('q', '').strip().lower() if keyword: - knowledge = [k for k in knowledge if keyword in k.get('title', '').lower() or - keyword in k.get('content', '').lower()] + knowledge = [k for k in knowledge if keyword in k.get('title', '').lower() or keyword in k.get('content', '').lower()] - # 分类过滤 category = request.args.get('category', '') if category: knowledge = [k for k in knowledge if k.get('category') == category] @@ -447,10 +736,8 @@ def api_create_knowledge(): data = request.get_json() knowledge = load_data(KNOWLEDGE_FILE) - import uuid data['id'] = uuid.uuid4().hex[:12] data['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - if 'order' not in data: data['order'] = len(knowledge) @@ -491,6 +778,12 @@ def api_items(category_id): """获取分类下的数据列表""" items_file = DATA_DIR / f'items_{category_id}.json' items = load_data(items_file) + + # 过滤隐藏项 + hide_hidden = request.args.get('all', '0') == '0' + if hide_hidden: + items = [i for i in items if i.get('visible', True)] + return jsonify(items) @app.route('/api/items//') @@ -512,10 +805,10 @@ def api_create_item(category_id): items_file = DATA_DIR / f'items_{category_id}.json' items = load_data(items_file) - import uuid data['id'] = uuid.uuid4().hex[:12] data['category_id'] = category_id data['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + data['visible'] = data.get('visible', True) items.append(data) save_data(items_file, items) @@ -549,11 +842,26 @@ def api_delete_item(category_id, item_id): return jsonify({'success': True}) +@app.route('/api/items///visible', methods=['POST']) +def api_toggle_item_visible(category_id, item_id): + """切换动态数据显示状态""" + items_file = DATA_DIR / f'items_{category_id}.json' + items = load_data(items_file) + item = next((i for i in items if i['id'] == item_id), None) + if not item: + return jsonify({'error': 'Item not found'}), 404 + + item['visible'] = not item.get('visible', True) + save_data(items_file, items) + + return jsonify({'success': True, 'visible': item['visible']}) + if __name__ == '__main__': print("=" * 50) - print("ParamHub - 参数百科") + print("ParamHub - 参数百科 v1.1.0") print("=" * 50) print(f"访问地址: http://localhost:19010") + print(f"后台管理: http://localhost:19010/admin") print("=" * 50) app.run(host='0.0.0.0', port=19010, debug=True) \ No newline at end of file diff --git a/data/categories.json b/data/categories.json index 524dd73..df3d127 100644 --- a/data/categories.json +++ b/data/categories.json @@ -18,7 +18,7 @@ { "id": "cpus", "name": "CPU处理器", - "icon": "ri-memory-line", + "icon": "ri-cpu-line", "color": "purple", "description": "Intel、AMD等CPU处理器参数", "order": 3 @@ -42,8 +42,8 @@ { "id": "021dc76d36be", "name": "汽车", - "icon": "ri-folder-line", - "color": "blue", + "icon": "ri-car-line", + "color": "red", "order": 6, "description": "汽车方面", "created_at": "2026-04-09 10:09:01" diff --git a/data/models.json b/data/models.json index 29c1390..7da05bf 100644 --- a/data/models.json +++ b/data/models.json @@ -1,14 +1,200 @@ [ - {"id": "gpt4", "name": "GPT-4", "organization": "OpenAI", "parameters": 1760, "architecture": "Transformer", "context_length": 8192, "input_price": 0.03, "output_price": 0.06, "mmlu": 86.4, "humaneval": 67.0, "is_open_source": false, "license": "Proprietary", "description": "OpenAI最强大的多模态大模型", "created_at": "2024-01-01"}, - {"id": "gpt4turbo", "name": "GPT-4 Turbo", "organization": "OpenAI", "parameters": 1760, "architecture": "Transformer", "context_length": 128000, "input_price": 0.01, "output_price": 0.03, "mmlu": 86.4, "humaneval": 67.0, "is_open_source": false, "license": "Proprietary", "description": "GPT-4增强版,128K上下文", "created_at": "2024-01-01"}, - {"id": "gpt35", "name": "GPT-3.5 Turbo", "organization": "OpenAI", "parameters": 175, "architecture": "Transformer", "context_length": 16385, "input_price": 0.0005, "output_price": 0.0015, "mmlu": 70.0, "humaneval": 48.1, "is_open_source": false, "license": "Proprietary", "description": "性价比高的通用模型", "created_at": "2024-01-01"}, - {"id": "claude3opus", "name": "Claude 3 Opus", "organization": "Anthropic", "parameters": 400, "architecture": "Transformer", "context_length": 200000, "input_price": 0.015, "output_price": 0.075, "mmlu": 86.8, "humaneval": 84.9, "is_open_source": false, "license": "Proprietary", "description": "Anthropic最强模型,200K上下文", "created_at": "2024-01-01"}, - {"id": "claude3sonnet", "name": "Claude 3 Sonnet", "organization": "Anthropic", "parameters": 175, "architecture": "Transformer", "context_length": 200000, "input_price": 0.003, "output_price": 0.015, "mmlu": 79.0, "humaneval": 73.0, "is_open_source": false, "license": "Proprietary", "description": "平衡性能与成本", "created_at": "2024-01-01"}, - {"id": "llama270b", "name": "Llama 2 70B", "organization": "Meta", "parameters": 70, "architecture": "Transformer", "context_length": 4096, "input_price": 0, "output_price": 0, "mmlu": 69.8, "humaneval": 29.9, "is_open_source": true, "license": "Llama 2 Community", "description": "Meta开源大模型,70B参数", "created_at": "2024-01-01"}, - {"id": "llama3", "name": "Llama 3 70B", "organization": "Meta", "parameters": 70, "architecture": "Transformer", "context_length": 8192, "input_price": 0, "output_price": 0, "mmlu": 82.0, "humaneval": 81.7, "is_open_source": true, "license": "Llama 3 Community", "description": "Meta最新开源模型,性能接近GPT-4", "created_at": "2024-01-01"}, - {"id": "mistral7b", "name": "Mistral 7B", "organization": "Mistral AI", "parameters": 7, "architecture": "Transformer", "context_length": 32768, "input_price": 0, "output_price": 0, "mmlu": 62.5, "humaneval": 26.8, "is_open_source": true, "license": "Apache 2.0", "description": "小巧高效的开源模型", "created_at": "2024-01-01"}, - {"id": "mixtral8x7b", "name": "Mixtral 8x7B", "organization": "Mistral AI", "parameters": 47, "architecture": "MoE", "context_length": 32768, "input_price": 0, "output_price": 0, "mmlu": 70.6, "humaneval": 40.2, "is_open_source": true, "license": "Apache 2.0", "description": "MoE架构,高效推理", "created_at": "2024-01-01"}, - {"id": "qwen72b", "name": "Qwen 72B", "organization": "Alibaba", "parameters": 72, "architecture": "Transformer", "context_length": 32768, "input_price": 0, "output_price": 0, "mmlu": 83.1, "humaneval": 65.4, "is_open_source": true, "license": "Apache 2.0", "description": "阿里开源大模型,中文能力强", "created_at": "2024-01-01"}, - {"id": "deepseekv3", "name": "DeepSeek V3", "organization": "DeepSeek", "parameters": 685, "architecture": "MoE", "context_length": 128000, "input_price": 0.00014, "output_price": 0.00028, "mmlu": 88.5, "humaneval": 86.2, "is_open_source": true, "license": "MIT", "description": "DeepSeek最新模型,性价比极高", "created_at": "2024-01-01"}, - {"id": "glm4", "name": "GLM-4", "organization": "Zhipu AI", "parameters": 130, "architecture": "Transformer", "context_length": 128000, "input_price": 0.014, "output_price": 0.014, "mmlu": 81.0, "humaneval": 70.0, "is_open_source": false, "license": "Proprietary", "description": "智谱AI大模型,中文能力强", "created_at": "2024-01-01"} + { + "id": "gpt4", + "name": "GPT-4", + "organization": "OpenAI", + "parameters": 1760, + "architecture": "Transformer", + "context_length": 8192, + "input_price": 0.03, + "output_price": 0.06, + "mmlu": 86.4, + "humaneval": 67.0, + "is_open_source": false, + "license": "Proprietary", + "description": "OpenAI最强大的多模态大模型", + "created_at": "2024-01-01" + }, + { + "id": "gpt4turbo", + "name": "GPT-4 Turbo", + "organization": "OpenAI", + "parameters": 1760, + "architecture": "Transformer", + "context_length": 128000, + "input_price": 0.01, + "output_price": 0.03, + "mmlu": 86.4, + "humaneval": 67.0, + "is_open_source": false, + "license": "Proprietary", + "description": "GPT-4增强版,128K上下文", + "created_at": "2024-01-01" + }, + { + "id": "gpt35", + "name": "GPT-3.5 Turbo", + "organization": "OpenAI", + "parameters": 175, + "architecture": "Transformer", + "context_length": 16385, + "input_price": 0.0005, + "output_price": 0.0015, + "mmlu": 70.0, + "humaneval": 48.1, + "is_open_source": false, + "license": "Proprietary", + "description": "性价比高的通用模型", + "created_at": "2024-01-01" + }, + { + "id": "claude3opus", + "name": "Claude 3 Opus", + "organization": "Anthropic", + "parameters": 400, + "architecture": "Transformer", + "context_length": 200000, + "input_price": 0.015, + "output_price": 0.075, + "mmlu": 86.8, + "humaneval": 84.9, + "is_open_source": false, + "license": "Proprietary", + "description": "Anthropic最强模型,200K上下文", + "created_at": "2024-01-01" + }, + { + "id": "claude3sonnet", + "name": "Claude 3 Sonnet", + "organization": "Anthropic", + "parameters": 175, + "architecture": "Transformer", + "context_length": 200000, + "input_price": 0.003, + "output_price": 0.015, + "mmlu": 79.0, + "humaneval": 73.0, + "is_open_source": false, + "license": "Proprietary", + "description": "平衡性能与成本", + "created_at": "2024-01-01" + }, + { + "id": "llama270b", + "name": "Llama 2 70B", + "organization": "Meta", + "parameters": 70, + "architecture": "Transformer", + "context_length": 4096, + "input_price": 0, + "output_price": 0, + "mmlu": 69.8, + "humaneval": 29.9, + "is_open_source": true, + "license": "Llama 2 Community", + "description": "Meta开源大模型,70B参数", + "created_at": "2024-01-01" + }, + { + "id": "llama3", + "name": "Llama 3 70B", + "organization": "Meta", + "parameters": 70, + "architecture": "Transformer", + "context_length": 8192, + "input_price": 0, + "output_price": 0, + "mmlu": 82.0, + "humaneval": 81.7, + "is_open_source": true, + "license": "Llama 3 Community", + "description": "Meta最新开源模型,性能接近GPT-4", + "created_at": "2024-01-01" + }, + { + "id": "mistral7b", + "name": "Mistral 7B", + "organization": "Mistral AI", + "parameters": 7, + "architecture": "Transformer", + "context_length": 32768, + "input_price": 0, + "output_price": 0, + "mmlu": 62.5, + "humaneval": 26.8, + "is_open_source": true, + "license": "Apache 2.0", + "description": "小巧高效的开源模型", + "created_at": "2024-01-01" + }, + { + "id": "mixtral8x7b", + "name": "Mixtral 8x7B", + "organization": "Mistral AI", + "parameters": 47, + "architecture": "MoE", + "context_length": 32768, + "input_price": 0, + "output_price": 0, + "mmlu": 70.6, + "humaneval": 40.2, + "is_open_source": true, + "license": "Apache 2.0", + "description": "MoE架构,高效推理", + "created_at": "2024-01-01" + }, + { + "id": "qwen72b", + "name": "Qwen 72B", + "organization": "Alibaba", + "parameters": 72, + "architecture": "Transformer", + "context_length": 32768, + "input_price": 0, + "output_price": 0, + "mmlu": 83.1, + "humaneval": 65.4, + "is_open_source": true, + "license": "Apache 2.0", + "description": "阿里开源大模型,中文能力强", + "created_at": "2024-01-01" + }, + { + "id": "deepseekv3", + "name": "DeepSeek V3", + "organization": "DeepSeek", + "parameters": 685, + "architecture": "MoE", + "context_length": 128000, + "input_price": 0.00014, + "output_price": 0.00028, + "mmlu": 88.5, + "humaneval": 86.2, + "is_open_source": true, + "license": "MIT", + "description": "DeepSeek最新模型,性价比极高", + "created_at": "2024-01-01" + }, + { + "id": "glm4", + "name": "GLM-4", + "organization": "Zhipu AI", + "parameters": 130, + "architecture": "Transformer", + "context_length": 128000, + "input_price": 0.014, + "output_price": 0.014, + "mmlu": 81.0, + "humaneval": 70.0, + "is_open_source": false, + "license": "Proprietary", + "description": "智谱AI大模型,中文能力强", + "created_at": "2024-01-01" + }, + { + "id": "15246152c91e", + "created_at": "2026-04-11 01:54:26", + "visible": true, + "raw_text": "test" + } ] \ No newline at end of file diff --git a/static/favicon.svg b/static/favicon.svg new file mode 100644 index 0000000..32a4f4c --- /dev/null +++ b/static/favicon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/admin.html b/templates/admin.html index 3ea5389..20da2bd 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -3,7 +3,9 @@ - 后台管理 - ParamHub + ParamHub - 参数百科 + +