mirror of
https://github.com/snailyp/gemini-balance.git
synced 2026-05-11 18:09:55 +08:00
增强文档: 在 README.md 文件中,新增了“特别鸣谢”部分,以感谢 PicGo、SM.MS 和 CloudFlare-ImgBed 为本项目提供的图床服务。同时,添加了“⭐ Star History”部分,用于展示项目的 Star 历史,增强了文档的信息量和项目展示效果。
配置更正: 在配置编辑器 config_editor.html 中,更正了 Cloudflare 图床的 provider 名称。将原先的 cloudflare 更正为 cloudflare_imgbed,确保配置项名称的准确性和一致性。
484 lines
34 KiB
HTML
484 lines
34 KiB
HTML
{% extends "base.html" %}
|
||
|
||
{% block title %}配置编辑器 - Gemini Balance{% endblock %}
|
||
|
||
{% block head_extra_styles %}
|
||
<style>
|
||
/* config_editor.html specific styles */
|
||
/* Animations (already in base.html, but keep fade-in class usage) */
|
||
.fade-in {
|
||
animation: fadeIn 0.3s ease forwards;
|
||
}
|
||
/* Modal specific styles (already in base.html) */
|
||
.array-container {
|
||
max-height: 300px;
|
||
overflow-y: auto;
|
||
padding-right: 5px; /* Keep specific padding if needed */
|
||
}
|
||
#API_KEYS_container { /* Keep specific ID styling if needed */
|
||
max-height: 300px;
|
||
overflow-y: auto;
|
||
}
|
||
.config-section {
|
||
display: none;
|
||
}
|
||
.config-section.active {
|
||
display: block;
|
||
animation: fadeIn 0.3s ease forwards; /* Use base animation */
|
||
}
|
||
.provider-config {
|
||
display: none;
|
||
}
|
||
.provider-config.active {
|
||
display: block;
|
||
}
|
||
/* Tailwind Toggle Switch Helper CSS */
|
||
.toggle-checkbox:checked {
|
||
@apply: right-0 border-primary-600;
|
||
right: 0;
|
||
border-color: #4F46E5;
|
||
}
|
||
.toggle-checkbox:checked + .toggle-label {
|
||
@apply: bg-primary-600;
|
||
background-color: #4F46E5;
|
||
}
|
||
/* 统一通知样式为黑色半透明,确保与 keys_status 一致 */
|
||
.notification {
|
||
background: rgba(0,0,0,0.8) !important;
|
||
color: #fff !important;
|
||
}
|
||
</style>
|
||
{% endblock %}
|
||
|
||
{% block content %}
|
||
<div class="container max-w-4xl mx-auto px-4">
|
||
<div class="glass-card rounded-2xl shadow-xl p-6 md:p-8">
|
||
<button class="absolute top-6 right-6 bg-white bg-opacity-20 hover:bg-opacity-30 rounded-full w-8 h-8 flex items-center justify-center text-primary-600 transition-all duration-300" onclick="refreshPage(this)">
|
||
<i class="fas fa-sync-alt"></i>
|
||
</button>
|
||
|
||
<h1 class="text-3xl font-extrabold text-center text-transparent bg-clip-text bg-gradient-to-r from-primary-600 to-primary-700 mb-4">
|
||
<img src="/static/icons/logo.png" alt="Gemini Balance Logo" class="h-9 inline-block align-middle mr-2">
|
||
Gemini Balance - 配置编辑
|
||
</h1>
|
||
|
||
<!-- Navigation Tabs -->
|
||
<div class="flex justify-center mb-8 overflow-x-auto pb-2 gap-2">
|
||
<a href="/config" class="whitespace-nowrap flex items-center justify-center gap-2 px-6 py-3 font-medium rounded-lg bg-primary-600 text-white shadow-md">
|
||
<i class="fas fa-cog"></i> 配置编辑
|
||
</a>
|
||
<a href="/keys" class="whitespace-nowrap flex items-center justify-center gap-2 px-6 py-3 font-medium rounded-lg bg-white bg-opacity-50 hover:bg-opacity-70 text-gray-700 transition-all duration-200">
|
||
<i class="fas fa-tachometer-alt"></i> 监控面板
|
||
</a>
|
||
<a href="/logs" class="whitespace-nowrap flex items-center justify-center gap-2 px-6 py-3 font-medium rounded-lg bg-white bg-opacity-50 hover:bg-opacity-70 text-gray-700 transition-all duration-200">
|
||
<i class="fas fa-exclamation-triangle"></i> 错误日志
|
||
</a>
|
||
</div>
|
||
|
||
<!-- Config Tabs -->
|
||
<div class="flex justify-center mb-6 flex-wrap gap-2">
|
||
<button class="tab-btn bg-primary-600 text-white px-5 py-2 rounded-full shadow-md font-medium text-sm" data-tab="api">
|
||
API配置
|
||
</button>
|
||
<button class="tab-btn bg-white bg-opacity-50 text-gray-700 px-5 py-2 rounded-full font-medium text-sm hover:bg-opacity-70 transition-all duration-200" data-tab="model">
|
||
模型配置
|
||
</button>
|
||
<button class="tab-btn bg-white bg-opacity-50 text-gray-700 px-5 py-2 rounded-full font-medium text-sm hover:bg-opacity-70 transition-all duration-200" data-tab="image">
|
||
图像生成
|
||
</button>
|
||
<button class="tab-btn bg-white bg-opacity-50 text-gray-700 px-5 py-2 rounded-full font-medium text-sm hover:bg-opacity-70 transition-all duration-200" data-tab="stream">
|
||
流式输出
|
||
</button>
|
||
<button class="tab-btn bg-white bg-opacity-50 text-gray-700 px-5 py-2 rounded-full font-medium text-sm hover:bg-opacity-70 transition-all duration-200" data-tab="scheduler">
|
||
定时任务
|
||
</button>
|
||
</div>
|
||
|
||
<!-- Save Status Banner (Removed - using notification component now) -->
|
||
|
||
<!-- Configuration Form -->
|
||
<form id="configForm" class="mt-6">
|
||
<!-- API 相关配置 -->
|
||
<div class="config-section active bg-white bg-opacity-70 rounded-xl p-6 mb-6 shadow-lg" id="api-section">
|
||
<h2 class="text-xl font-bold mb-6 pb-3 border-b border-gray-200 flex items-center gap-2">
|
||
<i class="fas fa-key text-primary-600"></i> API相关配置
|
||
</h2>
|
||
|
||
<!-- API密钥列表 -->
|
||
<div class="mb-6">
|
||
<label for="API_KEYS" class="block font-semibold mb-2 text-gray-700">API密钥列表</label>
|
||
<div class="mb-2">
|
||
<input type="search" id="apiKeySearchInput" placeholder="搜索密钥..." class="w-full px-4 py-2 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
</div>
|
||
<div class="array-container bg-white rounded-lg border border-gray-200 p-4 mb-2" id="API_KEYS_container">
|
||
<!-- 数组项将在这里动态添加 -->
|
||
</div>
|
||
<div class="flex justify-end gap-2">
|
||
<button type="button" class="bg-danger-600 hover:bg-danger-700 text-white px-4 py-2 rounded-lg font-medium transition-all duration-200 flex items-center gap-2" id="bulkDeleteApiKeyBtn">
|
||
<i class="fas fa-trash-alt"></i> 删除密钥
|
||
</button>
|
||
<button type="button" class="bg-primary-600 hover:bg-primary-700 text-white px-4 py-2 rounded-lg font-medium transition-all duration-200 flex items-center gap-2" id="addApiKeyBtn">
|
||
<i class="fas fa-plus"></i> 添加密钥
|
||
</button>
|
||
</div>
|
||
<small class="text-gray-500 mt-1 block">Gemini API密钥列表,每行一个</small>
|
||
</div>
|
||
|
||
<!-- 允许的令牌列表 -->
|
||
<div class="mb-6">
|
||
<label for="ALLOWED_TOKENS" class="block font-semibold mb-2 text-gray-700">允许的令牌列表</label>
|
||
<div class="array-container bg-white rounded-lg border border-gray-200 p-4 mb-2" id="ALLOWED_TOKENS_container">
|
||
<!-- 数组项将在这里动态添加 -->
|
||
</div>
|
||
<div class="flex justify-end">
|
||
<button type="button" class="bg-primary-600 hover:bg-primary-700 text-white px-4 py-2 rounded-lg font-medium transition-all duration-200 flex items-center gap-2" onclick="addArrayItem('ALLOWED_TOKENS')">
|
||
<i class="fas fa-plus"></i> 添加令牌
|
||
</button>
|
||
</div>
|
||
<small class="text-gray-500 mt-1 block">允许访问API的令牌列表</small>
|
||
</div>
|
||
|
||
<!-- 认证令牌 -->
|
||
<div class="mb-6">
|
||
<label for="AUTH_TOKEN" class="block font-semibold mb-2 text-gray-700">认证令牌</label>
|
||
<div class="flex items-center">
|
||
<div class="flex items-center flex-grow border border-gray-300 rounded-md focus-within:border-primary-500 focus-within:ring focus-within:ring-primary-200 focus-within:ring-opacity-50">
|
||
<input type="text" id="AUTH_TOKEN" name="AUTH_TOKEN" placeholder="默认使用ALLOWED_TOKENS中的第一个" class="array-input flex-grow px-3 py-2 border-none rounded-l-md focus:outline-none">
|
||
<button type="button" id="generateAuthTokenBtn" class="generate-btn px-2 py-2 text-gray-500 hover:text-primary-600 focus:outline-none rounded-r-md bg-gray-100 hover:bg-gray-200 transition-colors" title="生成随机令牌">
|
||
<i class="fas fa-dice"></i>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<small class="text-gray-500 mt-1 block">用于API认证的令牌</small>
|
||
</div>
|
||
|
||
<!-- API基础URL -->
|
||
<div class="mb-6">
|
||
<label for="BASE_URL" class="block font-semibold mb-2 text-gray-700">API基础URL</label>
|
||
<input type="text" id="BASE_URL" name="BASE_URL" placeholder="https://generativelanguage.googleapis.com/v1beta" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">Gemini API的基础URL</small>
|
||
</div>
|
||
|
||
<!-- 最大失败次数 -->
|
||
<div class="mb-6">
|
||
<label for="MAX_FAILURES" class="block font-semibold mb-2 text-gray-700">最大失败次数</label>
|
||
<input type="number" id="MAX_FAILURES" name="MAX_FAILURES" min="1" max="100" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">API密钥失败后标记为无效的次数</small>
|
||
</div>
|
||
|
||
<!-- 请求超时时间 -->
|
||
<div class="mb-6">
|
||
<label for="TIME_OUT" class="block font-semibold mb-2 text-gray-700">请求超时时间(秒)</label>
|
||
<input type="number" id="TIME_OUT" name="TIME_OUT" min="1" max="600" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">API请求的超时时间</small>
|
||
</div>
|
||
|
||
<!-- 最大重试次数 -->
|
||
<div class="mb-6">
|
||
<label for="MAX_RETRIES" class="block font-semibold mb-2 text-gray-700">最大重试次数</label>
|
||
<input type="number" id="MAX_RETRIES" name="MAX_RETRIES" min="0" max="10" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">API请求失败后的最大重试次数</small>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 模型相关配置 -->
|
||
<div class="config-section bg-white bg-opacity-70 rounded-xl p-6 mb-6 shadow-lg" id="model-section">
|
||
<h2 class="text-xl font-bold mb-6 pb-3 border-b border-gray-200 flex items-center gap-2">
|
||
<i class="fas fa-robot text-primary-600"></i> 模型相关配置
|
||
</h2>
|
||
|
||
<!-- 测试模型 -->
|
||
<div class="mb-6">
|
||
<label for="TEST_MODEL" class="block font-semibold mb-2 text-gray-700">测试模型</label>
|
||
<input type="text" id="TEST_MODEL" name="TEST_MODEL" placeholder="gemini-1.5-flash" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">用于测试API密钥的模型</small>
|
||
</div>
|
||
|
||
<!-- 图像模型列表 -->
|
||
<div class="mb-6">
|
||
<label for="IMAGE_MODELS" class="block font-semibold mb-2 text-gray-700">图像模型列表</label>
|
||
<div class="array-container bg-white rounded-lg border border-gray-200 p-4 mb-2" id="IMAGE_MODELS_container">
|
||
<!-- 数组项将在这里动态添加 -->
|
||
</div>
|
||
<div class="flex justify-end">
|
||
<button type="button" class="bg-primary-600 hover:bg-primary-700 text-white px-4 py-2 rounded-lg font-medium transition-all duration-200 flex items-center gap-2" onclick="addArrayItem('IMAGE_MODELS')">
|
||
<i class="fas fa-plus"></i> 添加模型
|
||
</button>
|
||
</div>
|
||
<small class="text-gray-500 mt-1 block">支持图像处理的模型列表</small>
|
||
</div>
|
||
|
||
<!-- 搜索模型列表 -->
|
||
<div class="mb-6">
|
||
<label for="SEARCH_MODELS" class="block font-semibold mb-2 text-gray-700">搜索模型列表</label>
|
||
<div class="array-container bg-white rounded-lg border border-gray-200 p-4 mb-2" id="SEARCH_MODELS_container">
|
||
<!-- 数组项将在这里动态添加 -->
|
||
</div>
|
||
<div class="flex justify-end">
|
||
<button type="button" class="bg-primary-600 hover:bg-primary-700 text-white px-4 py-2 rounded-lg font-medium transition-all duration-200 flex items-center gap-2" onclick="addArrayItem('SEARCH_MODELS')">
|
||
<i class="fas fa-plus"></i> 添加模型
|
||
</button>
|
||
</div>
|
||
<small class="text-gray-500 mt-1 block">支持搜索功能的模型列表</small>
|
||
</div>
|
||
|
||
<!-- 过滤模型列表 -->
|
||
<div class="mb-6">
|
||
<label for="FILTERED_MODELS" class="block font-semibold mb-2 text-gray-700">过滤模型列表</label>
|
||
<div class="array-container bg-white rounded-lg border border-gray-200 p-4 mb-2" id="FILTERED_MODELS_container">
|
||
<!-- 数组项将在这里动态添加 -->
|
||
</div>
|
||
<div class="flex justify-end">
|
||
<button type="button" class="bg-primary-600 hover:bg-primary-700 text-white px-4 py-2 rounded-lg font-medium transition-all duration-200 flex items-center gap-2" onclick="addArrayItem('FILTERED_MODELS')">
|
||
<i class="fas fa-plus"></i> 添加模型
|
||
</button>
|
||
</div>
|
||
<small class="text-gray-500 mt-1 block">需要过滤的模型列表</small>
|
||
</div>
|
||
|
||
<!-- 启用代码执行工具 -->
|
||
<div class="mb-6 flex items-center justify-between">
|
||
<label for="TOOLS_CODE_EXECUTION_ENABLED" class="font-semibold text-gray-700">启用代码执行工具</label>
|
||
<div class="relative inline-block w-10 mr-2 align-middle select-none transition duration-200 ease-in">
|
||
<input type="checkbox" name="TOOLS_CODE_EXECUTION_ENABLED" id="TOOLS_CODE_EXECUTION_ENABLED" class="toggle-checkbox absolute block w-6 h-6 rounded-full bg-white border-4 appearance-none cursor-pointer"/>
|
||
<label for="TOOLS_CODE_EXECUTION_ENABLED" class="toggle-label block overflow-hidden h-6 rounded-full bg-gray-300 cursor-pointer"></label>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 显示搜索链接 -->
|
||
<div class="mb-6 flex items-center justify-between">
|
||
<label for="SHOW_SEARCH_LINK" class="font-semibold text-gray-700">显示搜索链接</label>
|
||
<div class="relative inline-block w-10 mr-2 align-middle select-none transition duration-200 ease-in">
|
||
<input type="checkbox" name="SHOW_SEARCH_LINK" id="SHOW_SEARCH_LINK" class="toggle-checkbox absolute block w-6 h-6 rounded-full bg-white border-4 appearance-none cursor-pointer"/>
|
||
<label for="SHOW_SEARCH_LINK" class="toggle-label block overflow-hidden h-6 rounded-full bg-gray-300 cursor-pointer"></label>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 显示思考过程 -->
|
||
<div class="mb-6 flex items-center justify-between">
|
||
<label for="SHOW_THINKING_PROCESS" class="font-semibold text-gray-700">显示思考过程</label>
|
||
<div class="relative inline-block w-10 mr-2 align-middle select-none transition duration-200 ease-in">
|
||
<input type="checkbox" name="SHOW_THINKING_PROCESS" id="SHOW_THINKING_PROCESS" class="toggle-checkbox absolute block w-6 h-6 rounded-full bg-white border-4 appearance-none cursor-pointer"/>
|
||
<label for="SHOW_THINKING_PROCESS" class="toggle-label block overflow-hidden h-6 rounded-full bg-gray-300 cursor-pointer"></label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 图像生成相关配置 -->
|
||
<div class="config-section bg-white bg-opacity-70 rounded-xl p-6 mb-6 shadow-lg" id="image-section">
|
||
<h2 class="text-xl font-bold mb-6 pb-3 border-b border-gray-200 flex items-center gap-2">
|
||
<i class="fas fa-image text-primary-600"></i> 图像生成配置
|
||
</h2>
|
||
|
||
<!-- 付费API密钥 -->
|
||
<div class="mb-6">
|
||
<label for="PAID_KEY" class="block font-semibold mb-2 text-gray-700">付费API密钥</label>
|
||
<input type="text" id="PAID_KEY" name="PAID_KEY" placeholder="AIzaSyxxxxxxxxxxxxxxxxxxx" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">用于图像生成的付费API密钥</small>
|
||
</div>
|
||
|
||
<!-- 图像生成模型 -->
|
||
<div class="mb-6">
|
||
<label for="CREATE_IMAGE_MODEL" class="block font-semibold mb-2 text-gray-700">图像生成模型</label>
|
||
<input type="text" id="CREATE_IMAGE_MODEL" name="CREATE_IMAGE_MODEL" placeholder="imagen-3.0-generate-002" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">用于图像生成的模型</small>
|
||
</div>
|
||
|
||
<!-- 上传提供商 -->
|
||
<div class="mb-6">
|
||
<label for="UPLOAD_PROVIDER" class="block font-semibold mb-2 text-gray-700">上传提供商</label>
|
||
<select id="UPLOAD_PROVIDER" name="UPLOAD_PROVIDER" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50 bg-white">
|
||
<option value="smms" selected>SM.MS</option>
|
||
<option value="picgo">PicGo</option>
|
||
<option value="cloudflare_imgbed">Cloudflare</option>
|
||
</select>
|
||
<small class="text-gray-500 mt-1 block">图片上传服务提供商</small>
|
||
</div>
|
||
|
||
<!-- SM.MS密钥 -->
|
||
<div class="mb-6 provider-config active" data-provider="smms">
|
||
<label for="SMMS_SECRET_TOKEN" class="block font-semibold mb-2 text-gray-700">SM.MS密钥</label>
|
||
<input type="text" id="SMMS_SECRET_TOKEN" name="SMMS_SECRET_TOKEN" placeholder="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">SM.MS图床的密钥</small>
|
||
</div>
|
||
|
||
<!-- PicGo API密钥 -->
|
||
<div class="mb-6 provider-config" data-provider="picgo">
|
||
<label for="PICGO_API_KEY" class="block font-semibold mb-2 text-gray-700">PicGo API密钥</label>
|
||
<input type="text" id="PICGO_API_KEY" name="PICGO_API_KEY" placeholder="xxxx" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">PicGo的API密钥</small>
|
||
</div>
|
||
|
||
<!-- Cloudflare图床URL -->
|
||
<div class="mb-6 provider-config" data-provider="cloudflare_imgbed">
|
||
<label for="CLOUDFLARE_IMGBED_URL" class="block font-semibold mb-2 text-gray-700">Cloudflare图床URL</label>
|
||
<input type="text" id="CLOUDFLARE_IMGBED_URL" name="CLOUDFLARE_IMGBED_URL" placeholder="https://xxxxxxx.pages.dev/upload" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">Cloudflare图床的URL</small>
|
||
</div>
|
||
|
||
<!-- Cloudflare认证码 -->
|
||
<div class="mb-6 provider-config" data-provider="cloudflare_imgbed">
|
||
<label for="CLOUDFLARE_IMGBED_AUTH_CODE" class="block font-semibold mb-2 text-gray-700">Cloudflare认证码</label>
|
||
<input type="text" id="CLOUDFLARE_IMGBED_AUTH_CODE" name="CLOUDFLARE_IMGBED_AUTH_CODE" placeholder="xxxxxxxxx" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">Cloudflare图床的认证码</small>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 流式输出优化器配置 -->
|
||
<div class="config-section bg-white bg-opacity-70 rounded-xl p-6 mb-6 shadow-lg" id="stream-section">
|
||
<h2 class="text-xl font-bold mb-6 pb-3 border-b border-gray-200 flex items-center gap-2">
|
||
<i class="fas fa-stream text-primary-600"></i> 流式输出优化器
|
||
</h2>
|
||
|
||
<!-- 启用流式输出优化 -->
|
||
<div class="mb-6 flex items-center justify-between">
|
||
<label for="STREAM_OPTIMIZER_ENABLED" class="font-semibold text-gray-700">启用流式输出优化</label>
|
||
<div class="relative inline-block w-10 mr-2 align-middle select-none transition duration-200 ease-in">
|
||
<input type="checkbox" name="STREAM_OPTIMIZER_ENABLED" id="STREAM_OPTIMIZER_ENABLED" class="toggle-checkbox absolute block w-6 h-6 rounded-full bg-white border-4 appearance-none cursor-pointer"/>
|
||
<label for="STREAM_OPTIMIZER_ENABLED" class="toggle-label block overflow-hidden h-6 rounded-full bg-gray-300 cursor-pointer"></label>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 最小延迟 -->
|
||
<div class="mb-6">
|
||
<label for="STREAM_MIN_DELAY" class="block font-semibold mb-2 text-gray-700">最小延迟(秒)</label>
|
||
<input type="number" id="STREAM_MIN_DELAY" name="STREAM_MIN_DELAY" min="0" max="1" step="0.001" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">流式输出的最小延迟时间</small>
|
||
</div>
|
||
|
||
<!-- 最大延迟 -->
|
||
<div class="mb-6">
|
||
<label for="STREAM_MAX_DELAY" class="block font-semibold mb-2 text-gray-700">最大延迟(秒)</label>
|
||
<input type="number" id="STREAM_MAX_DELAY" name="STREAM_MAX_DELAY" min="0" max="1" step="0.001" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">流式输出的最大延迟时间</small>
|
||
</div>
|
||
|
||
<!-- 短文本阈值 -->
|
||
<div class="mb-6">
|
||
<label for="STREAM_SHORT_TEXT_THRESHOLD" class="block font-semibold mb-2 text-gray-700">短文本阈值</label>
|
||
<input type="number" id="STREAM_SHORT_TEXT_THRESHOLD" name="STREAM_SHORT_TEXT_THRESHOLD" min="1" max="100" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">短文本的字符阈值</small>
|
||
</div>
|
||
|
||
<!-- 长文本阈值 -->
|
||
<div class="mb-6">
|
||
<label for="STREAM_LONG_TEXT_THRESHOLD" class="block font-semibold mb-2 text-gray-700">长文本阈值</label>
|
||
<input type="number" id="STREAM_LONG_TEXT_THRESHOLD" name="STREAM_LONG_TEXT_THRESHOLD" min="1" max="1000" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">长文本的字符阈值</small>
|
||
</div>
|
||
|
||
<!-- 分块大小 -->
|
||
<div class="mb-6">
|
||
<label for="STREAM_CHUNK_SIZE" class="block font-semibold mb-2 text-gray-700">分块大小</label>
|
||
<input type="number" id="STREAM_CHUNK_SIZE" name="STREAM_CHUNK_SIZE" min="1" max="100" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">流式输出的分块大小</small>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 定时任务配置 -->
|
||
<div class="config-section bg-white bg-opacity-70 rounded-xl p-6 mb-6 shadow-lg" id="scheduler-section">
|
||
<h2 class="text-xl font-bold mb-6 pb-3 border-b border-gray-200 flex items-center gap-2">
|
||
<i class="fas fa-clock text-primary-600"></i> 定时任务配置
|
||
</h2>
|
||
|
||
<!-- 检查间隔 -->
|
||
<div class="mb-6">
|
||
<label for="CHECK_INTERVAL_HOURS" class="block font-semibold mb-2 text-gray-700">检查间隔(小时)</label>
|
||
<input type="number" id="CHECK_INTERVAL_HOURS" name="CHECK_INTERVAL_HOURS" min="1" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">定时检查密钥状态的间隔时间(单位:小时)</small>
|
||
</div>
|
||
|
||
<!-- 时区 -->
|
||
<div class="mb-6">
|
||
<label for="TIMEZONE" class="block font-semibold mb-2 text-gray-700">时区</label>
|
||
<input type="text" id="TIMEZONE" name="TIMEZONE" placeholder="例如: Asia/Shanghai" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50">
|
||
<small class="text-gray-500 mt-1 block">定时任务使用的时区,格式如 "Asia/Shanghai" 或 "UTC"</small>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Action Buttons -->
|
||
<div class="flex flex-col md:flex-row justify-center gap-4 mt-8">
|
||
<button type="button" id="saveBtn" class="bg-gradient-to-r from-primary-600 to-primary-700 text-white px-8 py-3 rounded-xl font-semibold transition-all duration-300 transform hover:-translate-y-1 hover:shadow-lg flex items-center justify-center gap-2">
|
||
<i class="fas fa-save"></i> 保存配置
|
||
</button>
|
||
<button type="button" id="resetBtn" class="bg-gradient-to-r from-gray-400 to-gray-500 text-white px-8 py-3 rounded-xl font-semibold transition-all duration-300 transform hover:-translate-y-1 hover:shadow-lg flex items-center justify-center gap-2">
|
||
<i class="fas fa-undo"></i> 重置配置
|
||
</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Scroll buttons are now in base.html -->
|
||
<div class="scroll-buttons">
|
||
<button class="scroll-button" onclick="scrollToTop()" title="回到顶部">
|
||
<i class="fas fa-chevron-up"></i>
|
||
</button>
|
||
<button class="scroll-button" onclick="scrollToBottom()" title="滚动到底部">
|
||
<i class="fas fa-chevron-down"></i>
|
||
</button>
|
||
</div>
|
||
|
||
<!-- Notification component is now in base.html -->
|
||
<div id="notification" class="notification"></div>
|
||
<!-- Footer is now in base.html -->
|
||
|
||
<!-- API Key Add Modal -->
|
||
<div id="apiKeyModal" class="modal">
|
||
<div class="w-full max-w-lg mx-auto bg-white rounded-2xl shadow-2xl overflow-hidden animate-fade-in">
|
||
<div class="p-6">
|
||
<div class="flex justify-between items-center mb-4">
|
||
<h2 class="text-xl font-bold text-gray-800">批量添加 API 密钥</h2>
|
||
<button id="closeApiKeyModalBtn" class="text-gray-400 hover:text-gray-600 text-xl">×</button>
|
||
</div>
|
||
<p class="text-gray-600 mb-4">每行粘贴一个或多个密钥,将自动提取有效密钥并去重。</p>
|
||
<textarea id="apiKeyBulkInput" rows="10" placeholder="在此处粘贴 API 密钥..." class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-primary-500 focus:ring focus:ring-primary-200 focus:ring-opacity-50 font-mono text-sm"></textarea>
|
||
<div class="flex justify-end gap-3 mt-6">
|
||
<button type="button" id="confirmAddApiKeyBtn" class="bg-primary-600 hover:bg-primary-700 text-white px-6 py-2 rounded-lg font-medium transition">确认添加</button>
|
||
<button type="button" id="cancelAddApiKeyBtn" class="bg-gray-200 hover:bg-gray-300 text-gray-700 px-6 py-2 rounded-lg font-medium transition">取消</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Bulk Delete API Key Modal -->
|
||
<div id="bulkDeleteApiKeyModal" class="modal">
|
||
<div class="w-full max-w-lg mx-auto bg-white rounded-2xl shadow-2xl overflow-hidden animate-fade-in">
|
||
<div class="p-6">
|
||
<div class="flex justify-between items-center mb-4">
|
||
<h2 class="text-xl font-bold text-gray-800">批量删除 API 密钥</h2>
|
||
<button id="closeBulkDeleteModalBtn" class="text-gray-400 hover:text-gray-600 text-xl">×</button>
|
||
</div>
|
||
<p class="text-gray-600 mb-4">每行粘贴一个或多个密钥,将自动提取有效密钥并从列表中删除。</p>
|
||
<textarea id="bulkDeleteApiKeyInput" rows="10" placeholder="在此处粘贴要删除的 API 密钥..." class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-danger-500 focus:ring focus:ring-danger-200 focus:ring-opacity-50 font-mono text-sm"></textarea>
|
||
<div class="flex justify-end gap-3 mt-6">
|
||
<button type="button" id="confirmBulkDeleteApiKeyBtn" class="bg-danger-600 hover:bg-danger-700 text-white px-6 py-2 rounded-lg font-medium transition">确认删除</button>
|
||
<button type="button" id="cancelBulkDeleteApiKeyBtn" class="bg-gray-200 hover:bg-gray-300 text-gray-700 px-6 py-2 rounded-lg font-medium transition">取消</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<!-- Reset Confirmation Modal -->
|
||
<div id="resetConfirmModal" class="modal">
|
||
<div class="w-full max-w-md mx-auto bg-white rounded-2xl shadow-2xl overflow-hidden animate-fade-in">
|
||
<div class="p-6">
|
||
<div class="flex justify-between items-center mb-4">
|
||
<h2 class="text-xl font-bold text-gray-800">确认重置配置</h2>
|
||
<button id="closeResetModalBtn" class="text-gray-400 hover:text-gray-600 text-xl">×</button>
|
||
</div>
|
||
<p class="text-gray-600 mb-6">确定要重置所有配置吗?<br>这将恢复到默认值,此操作不可撤销。</p>
|
||
<div class="flex justify-end gap-3">
|
||
<button type="button" id="confirmResetBtn" class="bg-red-500 hover:bg-red-600 text-white px-6 py-2 rounded-lg font-medium transition">确认重置</button>
|
||
<button type="button" id="cancelResetBtn" class="bg-primary-600 hover:bg-primary-700 text-white px-6 py-2 rounded-lg font-medium transition">取消</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{% endblock %}
|
||
|
||
{% block body_scripts %}
|
||
<script src="/static/js/config_editor.js"></script>
|
||
<!-- Add any other page-specific JS initialization here if needed -->
|
||
{% endblock %}
|