Files
param-auto-manager/templates/index.html
T
hz4th_coder 23991c3552 v2.0.0 大模型驱动版:移除智能体,直接调用大模型接口
- 核心改造:不再使用 openclaw 智能体执行处理步骤,改为直接调用大模型接口
- 新增 services/llm_client.py:OpenAI 兼容接口客户端,支持多模型配置管理
- 步骤4/5 由大模型直接完成(提取产品数据、填充字段)
- 步骤6 改为直接调用 ParamHub API 提交审核
- 新增 llm_configs 数据库表,默认配置 unsloth/Qwen3.6-27B-Q4_K_M (262144上下文)
- 新增 /api/llm 配置管理 API:增删改查、切换激活、测试连接
- 前端首页新增「大模型配置」面板,可随时新增/切换模型
- 处理步骤名称更新为「大模型」版
2026-08-13 17:15:53 +08:00

443 lines
20 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>参数数据自动化管理系统</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/remixicon@3.5.0/fonts/remixicon.css">
</head>
<body>
<div class="container">
<!-- 头部 -->
<header class="header">
<h1><i class="ri-robot-line"></i> 参数数据自动化管理系统</h1>
<div class="header-actions">
<a href="/process" class="btn btn-primary">
<i class="ri-cpu-line"></i> 处理监控
</a>
<button onclick="refreshData()" class="btn btn-secondary">
<i class="ri-refresh-line"></i> 刷新数据
</button>
<div class="status-badge">
<span id="system-status" class="status-dot"></span>
<span id="status-text">系统正常</span>
</div>
</div>
</header>
<!-- 统计卡片 -->
<div class="stats-grid">
<div class="stat-card">
<div class="stat-icon"><i class="ri-file-list-3-line"></i></div>
<div class="stat-content">
<div class="stat-label">内容库文章</div>
<div class="stat-value" id="articles-count">0</div>
</div>
</div>
<div class="stat-card">
<div class="stat-icon"><i class="ri-time-line"></i></div>
<div class="stat-content">
<div class="stat-label">待处理产品</div>
<div class="stat-value" id="pending-count">0</div>
</div>
</div>
<div class="stat-card">
<div class="stat-icon processing"><i class="ri-loader-4-line"></i></div>
<div class="stat-content">
<div class="stat-label">处理中</div>
<div class="stat-value" id="processing-count">0</div>
</div>
</div>
<div class="stat-card">
<div class="stat-icon success"><i class="ri-check-line"></i></div>
<div class="stat-content">
<div class="stat-label">最近成功</div>
<div class="stat-value" id="success-count">0</div>
</div>
</div>
<div class="stat-card">
<div class="stat-icon error"><i class="ri-close-circle-line"></i></div>
<div class="stat-content">
<div class="stat-label">最近失败</div>
<div class="stat-value" id="failed-count">0</div>
</div>
</div>
</div>
<!-- 主内容区域 -->
<div class="main-content">
<!-- 左侧:待处理产品 -->
<div class="panel">
<div class="panel-header">
<h2><i class="ri-list-check-2"></i> 待处理产品列表</h2>
<div class="panel-actions">
<button onclick="showAddProductModal()" class="btn btn-primary">
<i class="ri-add-line"></i> 添加产品
</button>
<button onclick="processBatch()" class="btn btn-success">
<i class="ri-play-line"></i> 批量处理
</button>
</div>
</div>
<div class="panel-body">
<table class="data-table">
<thead>
<tr>
<th>产品名称</th>
<th>分类</th>
<th>子分类</th>
<th>优先级</th>
<th>来源</th>
<th>添加时间</th>
<th>操作</th>
</tr>
</thead>
<tbody id="pending-table">
<tr><td colspan="7" class="empty-text">暂无待处理产品</td></tr>
</tbody>
</table>
</div>
</div>
<!-- 右侧:内容库和搜索入口 -->
<div class="panel">
<div class="panel-header">
<h2><i class="ri-folder-line"></i> 内容库</h2>
<a href="/library" class="btn btn-primary btn-sm">
<i class="ri-external-link-line"></i> 进入
</a>
</div>
<div class="panel-body">
<div class="quick-stats">
<div class="quick-stat-item">
<span class="quick-stat-value" id="quick-articles-count">-</span>
<span class="quick-stat-label">篇文章</span>
</div>
<div class="quick-stat-item">
<span class="quick-stat-value" id="quick-categories-count">-</span>
<span class="quick-stat-label">个分类</span>
</div>
<div class="quick-stat-item">
<span class="quick-stat-value" id="quick-today-count">-</span>
<span class="quick-stat-label">今日新增</span>
</div>
</div>
</div>
</div>
<div class="panel">
<div class="panel-header">
<h2><i class="ri-search-line"></i> 互联网搜索</h2>
<a href="/search" class="btn btn-primary btn-sm">
<i class="ri-external-link-line"></i> 进入
</a>
</div>
<div class="panel-body">
<div class="quick-stats">
<div class="quick-stat-item">
<span class="quick-stat-value" id="quick-failed-count">-</span>
<span class="quick-stat-label">抓取失败</span>
</div>
<div class="quick-stat-item">
<span class="quick-stat-label">支持引擎</span>
<span class="quick-stat-value">Bing/百度/Google</span>
</div>
</div>
<div class="search-quick-info">
<small>支持一键保存所有结果到内容库</small>
</div>
</div>
</div>
</div>
<!-- 处理历史 -->
<div class="panel full-width">
<div class="panel-header">
<h2><i class="ri-history-line"></i> 处理历史</h2>
<button onclick="loadHistory()" class="btn btn-secondary btn-sm">
<i class="ri-refresh-line"></i>
</button>
</div>
<div class="panel-body">
<table class="data-table">
<thead>
<tr>
<th>产品名称</th>
<th>分类</th>
<th>子分类</th>
<th>状态</th>
<th>审核ID</th>
<th>提交时间</th>
<th>详情</th>
</tr>
</thead>
<tbody id="history-table">
<tr><td colspan="7" class="empty-text">暂无处理历史</td></tr>
</tbody>
</table>
</div>
</div>
<!-- 系统配置 -->
<div class="panel full-width">
<div class="panel-header">
<h2><i class="ri-settings-3-line"></i> 系统配置</h2>
<button onclick="saveConfig()" class="btn btn-primary btn-sm">
<i class="ri-save-line"></i> 保存配置
</button>
</div>
<div class="panel-body">
<div class="config-form">
<div class="config-item">
<label>自动处理</label>
<select id="auto-process-enabled">
<option value="true">启用</option>
<option value="false">禁用</option>
</select>
</div>
<div class="config-item">
<label>处理间隔(秒)</label>
<input type="number" id="process-interval" value="300" min="60" max="3600">
</div>
<div class="config-item">
<label>批量处理数量</label>
<input type="number" id="batch-size" value="5" min="1" max="20">
</div>
</div>
</div>
</div>
<!-- 大模型配置 -->
<div class="panel full-width">
<div class="panel-header">
<h2><i class="ri-openai-line"></i> 大模型配置</h2>
<div class="panel-actions">
<span class="active-model-badge" id="active-model-badge">
<span class="status-dot green"></span>
<span id="active-model-name">加载中...</span>
</span>
<button onclick="showAddLlmModal()" class="btn btn-primary btn-sm">
<i class="ri-add-line"></i> 新增大模型
</button>
</div>
</div>
<div class="panel-body">
<p class="llm-tip"><i class="ri-information-line"></i> 系统所有智能体任务(提取数据、填充字段等)均由当前激活的大模型直接完成,可在下方随时切换或新增。</p>
<table class="data-table">
<thead>
<tr>
<th>名称</th>
<th>接口地址</th>
<th>模型名称</th>
<th>上下文窗口</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="llm-config-table">
<tr><td colspan="6" class="empty-text">暂无大模型配置</td></tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- 添加产品模态框 -->
<div id="add-product-modal" class="modal">
<div class="modal-content">
<div class="modal-header">
<h3><i class="ri-add-circle-line"></i> 添加待处理产品</h3>
<button onclick="closeModal('add-product-modal')" class="close-btn">
<i class="ri-close-line"></i>
</button>
</div>
<div class="modal-body">
<form id="add-product-form">
<div class="form-group">
<label>产品名称 *</label>
<input type="text" id="product-name" required placeholder="例如:GPT-4o">
</div>
<div class="form-group">
<label>分类</label>
<input type="text" id="product-category" placeholder="例如:AI模型">
</div>
<div class="form-group">
<label>子分类</label>
<input type="text" id="product-subcategory" placeholder="例如:model">
</div>
<div class="form-group">
<label>优先级</label>
<input type="number" id="product-priority" value="5" min="0" max="100">
</div>
<div class="form-group">
<label>批量添加(JSON格式)</label>
<textarea id="batch-products" rows="5" placeholder='[{"product_name":"产品1"},{"product_name":"产品2"}]'></textarea>
<small class="hint">批量添加时,单产品字段将被忽略</small>
</div>
</form>
</div>
<div class="modal-footer">
<button onclick="closeModal('add-product-modal')" class="btn btn-secondary">取消</button>
<button onclick="addProduct()" class="btn btn-primary">添加</button>
</div>
</div>
</div>
<!-- 添加文章模态框 -->
<div id="add-article-modal" class="modal">
<div class="modal-content large">
<div class="modal-header">
<h3><i class="ri-file-add-line"></i> 添加文章到内容库</h3>
<button onclick="closeModal('add-article-modal')" class="close-btn">
<i class="ri-close-line"></i>
</button>
</div>
<div class="modal-body">
<form id="add-article-form">
<div class="form-row">
<div class="form-group">
<label>产品名称 *(多个用逗号分隔)</label>
<input type="text" id="article-products" required placeholder="GPT-4o, Claude 3">
</div>
<div class="form-group">
<label>分类</label>
<input type="text" id="article-category" placeholder="AI模型">
</div>
</div>
<div class="form-group">
<label>关键词(多个用逗号分隔)</label>
<input type="text" id="article-keywords" placeholder="大模型, 多模态, 推理">
</div>
<div class="form-group">
<label>摘要总结 *</label>
<textarea id="article-summary" rows="3" required placeholder="文章简要总结..."></textarea>
</div>
<div class="form-group">
<label>具体内容 *</label>
<textarea id="article-content" rows="10" required placeholder="文章详细内容..."></textarea>
</div>
<div class="form-row">
<div class="form-group">
<label>来源 *</label>
<input type="text" id="article-source" required placeholder="官方网站/新闻">
</div>
<div class="form-group">
<label>URL</label>
<input type="url" id="article-url" placeholder="https://...">
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button onclick="closeModal('add-article-modal')" class="btn btn-secondary">取消</button>
<button onclick="addArticle()" class="btn btn-primary">添加</button>
</div>
</div>
</div>
<!-- 搜索结果详情模态框 -->
<div id="search-result-modal" class="modal">
<div class="modal-content large">
<div class="modal-header">
<h3><i class="ri-external-link-line"></i> 搜索结果详情</h3>
<button onclick="closeModal('search-result-modal')" class="close-btn">
<i class="ri-close-line"></i>
</button>
</div>
<div class="modal-body" id="search-result-body">
</div>
<div class="modal-footer">
<button onclick="closeModal('search-result-modal')" class="btn btn-secondary">关闭</button>
<button onclick="saveSearchResultToLibrary()" class="btn btn-success">
<i class="ri-save-line"></i> 保存到内容库
</button>
</div>
</div>
</div>
<!-- 文章详情模态框 -->
<div id="article-detail-modal" class="modal">
<div class="modal-content large">
<div class="modal-header">
<h3><i class="ri-file-text-line"></i> 文章详情</h3>
<button onclick="closeModal('article-detail-modal')" class="close-btn">
<i class="ri-close-line"></i>
</button>
</div>
<div class="modal-body" id="article-detail-body">
</div>
<div class="modal-footer">
<button onclick="closeModal('article-detail-modal')" class="btn btn-secondary">关闭</button>
<button onclick="deleteArticle()" class="btn btn-danger">删除</button>
</div>
</div>
</div>
<!-- 处理详情模态框 -->
<div id="process-detail-modal" class="modal">
<div class="modal-content">
<div class="modal-header">
<h3><i class="ri-information-line"></i> 处理详情</h3>
<button onclick="closeModal('process-detail-modal')" class="close-btn">
<i class="ri-close-line"></i>
</button>
</div>
<div class="modal-body" id="process-detail-body">
</div>
<div class="modal-footer">
<button onclick="closeModal('process-detail-modal')" class="btn btn-secondary">关闭</button>
</div>
</div>
</div>
<!-- 新增大模型模态框 -->
<div id="add-llm-modal" class="modal">
<div class="modal-content">
<div class="modal-header">
<h3><i class="ri-openai-line"></i> 新增大模型配置</h3>
<button onclick="closeModal('add-llm-modal')" class="close-btn">
<i class="ri-close-line"></i>
</button>
</div>
<div class="modal-body">
<form id="add-llm-form">
<div class="form-group">
<label>配置名称 *</label>
<input type="text" id="llm-name" required placeholder="例如:本地Qwen3.6">
</div>
<div class="form-group">
<label>接口地址 Base URL *</label>
<input type="text" id="llm-base-url" required placeholder="http://192.168.2.7:18003/v1">
<small class="hint">OpenAI 兼容接口地址,以 /v1 结尾</small>
</div>
<div class="form-group">
<label>API Key</label>
<input type="text" id="llm-api-key" placeholder="sk-xxxx">
</div>
<div class="form-group">
<label>模型名称 *</label>
<input type="text" id="llm-model-name" required placeholder="unsloth/Qwen3.6-27B-Q4_K_M">
</div>
<div class="form-group">
<label>最大上下文窗口</label>
<input type="number" id="llm-max-context" value="262144" min="4096" step="1024">
</div>
</form>
</div>
<div class="modal-footer">
<button onclick="testLlmConnection()" class="btn btn-secondary" id="llm-test-btn">
<i class="ri-connection-line"></i> 测试连接
</button>
<button onclick="closeModal('add-llm-modal')" class="btn btn-secondary">取消</button>
<button onclick="addLlmConfig()" class="btn btn-primary">添加</button>
</div>
</div>
</div>
<!-- 提示消息 -->
<div id="toast" class="toast"></div>
<script src="/static/js/app.js"></script>
</body>
</html>