feat: add thinking mode support with configurable output formats

This commit is contained in:
Quorinex
2026-02-04 17:42:30 +08:00
parent c9891b60fd
commit 01e9d0577c
9 changed files with 877 additions and 113 deletions

View File

@@ -191,6 +191,31 @@
</div>
<button class="btn btn-primary" onclick="saveSettings()">保存设置</button>
</div>
<div class="card">
<div class="card-header"><span class="card-title">Thinking 模式设置</span></div>
<div class="form-group">
<label>触发后缀</label>
<input type="text" id="thinkingSuffix" placeholder="-thinking">
<small style="color:#64748b;font-size:12px;margin-top:4px;display:block">模型名称加此后缀即启用思考模式,如 claude-sonnet-4.5-thinking</small>
</div>
<div class="form-group">
<label>OpenAI API 输出格式</label>
<select id="openaiThinkingFormat">
<option value="reasoning_content">reasoning_content (DeepSeek 兼容)</option>
<option value="thinking">&lt;thinking&gt; 标签 (Claude 原生)</option>
<option value="think">&lt;think&gt; 标签 (OpenAI 原生)</option>
</select>
</div>
<div class="form-group">
<label>Claude API 输出格式</label>
<select id="claudeThinkingFormat">
<option value="thinking">&lt;thinking&gt; 标签 (Claude 原生)</option>
<option value="think">&lt;think&gt; 标签</option>
<option value="reasoning_content">直接输出 (无标签)</option>
</select>
</div>
<button class="btn btn-primary" onclick="saveThinkingConfig()">保存 Thinking 设置</button>
</div>
<div class="card">
<div class="card-header"><span class="card-title">管理密码</span></div>
<div class="form-group">
@@ -477,6 +502,29 @@
const d = await res.json();
document.getElementById('requireApiKey').checked = d.requireApiKey;
document.getElementById('apiKeyInput').value = d.apiKey || '';
// 加载 thinking 配置
loadThinkingConfig();
}
async function loadThinkingConfig() {
const res = await fetch('/admin/api/thinking', { headers: { 'X-Admin-Password': password } });
const d = await res.json();
document.getElementById('thinkingSuffix').value = d.suffix || '-thinking';
document.getElementById('openaiThinkingFormat').value = d.openaiFormat || 'reasoning_content';
document.getElementById('claudeThinkingFormat').value = d.claudeFormat || 'thinking';
}
async function saveThinkingConfig() {
const res = await fetch('/admin/api/thinking', {
method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Admin-Password': password },
body: JSON.stringify({
suffix: document.getElementById('thinkingSuffix').value || '-thinking',
openaiFormat: document.getElementById('openaiThinkingFormat').value,
claudeFormat: document.getElementById('claudeThinkingFormat').value
})
});
const d = await res.json();
if (d.success) { alert('Thinking 设置已保存'); } else { alert('保存失败: ' + d.error); }
}
async function saveSettings() {