index.html 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1" />
  6. <title>史观交锋 · 多角色历史辩论</title>
  7. <link rel="preconnect" href="https://fonts.googleapis.com" />
  8. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  9. <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,600;0,9..40,700;1,9..40,400&family=Noto+Serif+SC:wght@400;600;700&display=swap" rel="stylesheet" />
  10. <link rel="stylesheet" href="/static/style.css" />
  11. </head>
  12. <body>
  13. <div class="grain" aria-hidden="true"></div>
  14. <header class="site-header">
  15. <div class="brand">
  16. <span class="brand-mark" aria-hidden="true">史</span>
  17. <div>
  18. <h1>史观交锋</h1>
  19. <p class="tagline">官修≠真相 · 野史与边缘叙事 · 政治与权力语境 · 域外之镜 · 蹊跷与阴谋论辨析 → 怀疑中综合</p>
  20. </div>
  21. </div>
  22. <button type="button" class="btn ghost" id="btn-toggle-config" aria-expanded="true">收起配置</button>
  23. </header>
  24. <div class="layout">
  25. <aside class="panel config-panel" id="config-panel">
  26. <h2 class="panel-title">模型与运行配置</h2>
  27. <p class="hint">以下配置可在浏览器内保存(本地 <code>localStorage</code>),不会自动写入服务器 <code>.env</code>。</p>
  28. <label class="field">
  29. <span>OpenRouter API Key</span>
  30. <input type="password" id="cfg-api-key" autocomplete="off" placeholder="sk-or-v1-… 或留空用服务端环境变量" />
  31. </label>
  32. <label class="field">
  33. <span>Base URL</span>
  34. <input type="url" id="cfg-base-url" placeholder="https://openrouter.ai/api/v1" />
  35. </label>
  36. <label class="field">
  37. <span>模型 ID</span>
  38. <input type="text" id="cfg-model" placeholder="openai/gpt-4o-mini" />
  39. </label>
  40. <div class="field-row">
  41. <label class="field compact">
  42. <span>辩论温度</span>
  43. <input type="number" id="cfg-debate-temp" min="0" max="2" step="0.01" value="0.72" />
  44. </label>
  45. <label class="field compact">
  46. <span>综合温度</span>
  47. <input type="number" id="cfg-synth-temp" min="0" max="2" step="0.01" value="0.22" />
  48. </label>
  49. </div>
  50. <div class="field-row">
  51. <label class="field compact">
  52. <span>Max tokens</span>
  53. <input type="number" id="cfg-max-tokens" min="256" max="128000" step="256" value="4096" />
  54. </label>
  55. <label class="field compact">
  56. <span>请求超时(s)</span>
  57. <input type="number" id="cfg-timeout" min="30" max="600" step="10" value="180" />
  58. </label>
  59. </div>
  60. <label class="check">
  61. <input type="checkbox" id="cfg-use-evidence" checked />
  62. <span>启用维基 + DuckDuckGo 考据附录</span>
  63. </label>
  64. <label class="check">
  65. <input type="checkbox" id="cfg-remember" />
  66. <span>记住配置到本机浏览器(含 API Key,请勿在公共电脑勾选)</span>
  67. </label>
  68. <div class="btn-row">
  69. <button type="button" class="btn secondary" id="btn-save-config">保存配置</button>
  70. <button type="button" class="btn ghost" id="btn-clear-config">清除本地配置</button>
  71. </div>
  72. </aside>
  73. <main class="panel main-panel">
  74. <h2 class="panel-title">议题</h2>
  75. <textarea id="topic-input" rows="5" placeholder="例如:靖康之变中主流叙事与常见阴谋论说法,哪些较可信?需要哪些史料才能定论?"></textarea>
  76. <div class="btn-row main-actions">
  77. <button type="button" class="btn primary" id="btn-run">开始辩论</button>
  78. <span class="status" id="status-text"></span>
  79. </div>
  80. <section class="progress-section" id="progress-section" aria-live="polite">
  81. <h2 class="panel-title">进行状态</h2>
  82. <div class="progress-track" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" id="progress-track">
  83. <div class="progress-fill" id="progress-fill"></div>
  84. </div>
  85. <p class="progress-meta" id="progress-meta">就绪</p>
  86. <div class="progress-log" id="progress-log"></div>
  87. </section>
  88. <section class="output-section" aria-live="polite">
  89. <h2 class="panel-title">辩论正文(随步骤追加)</h2>
  90. <div id="output-error" class="error-banner hidden" role="alert"></div>
  91. <article id="output-md" class="markdown-body"></article>
  92. </section>
  93. </main>
  94. </div>
  95. <footer class="site-footer">
  96. <p>输出仅供思辨与学习;密钥请勿提交到 Git。流式展示进度;完整流程约 12 次模型调用(五角色两轮 + 秘书 + 终局),请勿关闭标签页。</p>
  97. </footer>
  98. <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
  99. <script src="https://cdn.jsdelivr.net/npm/dompurify@3.1.6/dist/purify.min.js"></script>
  100. <script src="/static/app.js"></script>
  101. </body>
  102. </html>