Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
524 lines (495 loc) · 27.4 KB
/
Copy pathindex.html
File metadata and controls
524 lines (495 loc) · 27.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
<!DOCTYPE html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SciFlow · 本地优先的科研全流程 AI 助手</title>
<meta property="og:title" content="SciFlow · 本地优先的科研全流程 AI 助手">
<meta property="og:description" content="本地优先、单机部署的科研 AI 助手:多智能体流水线覆盖文献调研→写作→质量门→投稿全生命周期,SQLite 单文件开箱即跑,零外部依赖。">
<meta property="og:type" content="website">
<meta name="description" content="SciFlow 是一个本地优先、单机部署的科研 AI 助手:多智能体流水线完成文献调研→写作→质量门→投稿全生命周期,SQLite 单文件开箱即跑。">
<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2064%2064%27%3E%3Cdefs%3E%3ClinearGradient%20id%3D%27g%27%20x1%3D%270%27%20y1%3D%271%27%20x2%3D%271%27%20y2%3D%270%27%3E%3Cstop%20offset%3D%270%27%20stop-color%3D%27%230f9e94%27%2F%3E%3Cstop%20offset%3D%27.55%27%20stop-color%3D%27%230b8fb4%27%2F%3E%3Cstop%20offset%3D%271%27%20stop-color%3D%27%230b6fc4%27%2F%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Cpath%20d%3D%27M%2046.9%2015.1%20A%2023%2023%200%201%200%2015.1%2046.9%27%20fill%3D%27none%27%20stroke%3D%27url%28%23g%29%27%20stroke-width%3D%272.2%27%20stroke-linecap%3D%27round%27%20opacity%3D%27.32%27%2F%3E%3Cpath%20d%3D%27M%2043.2%2021.4%20A%2011%2011%200%201%200%2032%2032%20A%2011%2011%200%201%201%2020.8%2042.6%27%20fill%3D%27none%27%20stroke%3D%27url%28%23g%29%27%20stroke-width%3D%276.5%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%2F%3E%3Ccircle%20cx%3D%2747.4%27%20cy%3D%2713.2%27%20r%3D%273.6%27%20fill%3D%27url%28%23g%29%27%2F%3E%3Ccircle%20cx%3D%2719.4%27%20cy%3D%2744%27%20r%3D%271.9%27%20fill%3D%27url%28%23g%29%27%20opacity%3D%27.75%27%2F%3E%3C%2Fsvg%3E">
<style>
/* ============ 主题变量 ============ */
:root{
--brand1:#0d9488; --brand2:#06b6d4; --brand3:#0ea5e9;
--grad:linear-gradient(120deg,#0d9488 0%,#06b6d4 50%,#0ea5e9 100%);
--maxw:1120px;
--radius:14px;
}
html[data-theme="light"]{
--bg:#f8fafc; --bg-soft:#eef6f7; --surface:#ffffff; --surface-2:#f1f5f9;
--text:#0f172a; --muted:#5b6b7f; --border:#e2e8f0;
--nav-bg:rgba(255,255,255,.78); --shadow:0 8px 30px rgba(2,132,199,.10);
--code-bg:#0b1220; --code-text:#e2e8f0; --chip:rgba(13,148,136,.08);
}
html[data-theme="dark"]{
--bg:#0b1120; --bg-soft:#0f1a2e; --surface:#111c30; --surface-2:#0e1830;
--text:#e6edf6; --muted:#94a6bd; --border:#1f2c44;
--nav-bg:rgba(11,17,32,.78); --shadow:0 8px 30px rgba(0,0,0,.45);
--code-bg:#060b16; --code-text:#dbe7f5; --chip:rgba(6,182,212,.12);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;scroll-padding-top:84px}
body{
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",Roboto,Helvetica,Arial,sans-serif;
background:var(--bg); color:var(--text); line-height:1.7;
-webkit-font-smoothing:antialiased; transition:background .3s ease,color .3s ease;
}
a{color:inherit;text-decoration:none}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 22px}
.grad-text{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
section{padding:74px 0}
h2.sec-title{font-size:clamp(1.5rem,3.4vw,2.15rem);font-weight:800;letter-spacing:-.02em;text-align:center}
.sec-sub{text-align:center;color:var(--muted);max-width:640px;margin:14px auto 0;font-size:1.02rem}
.sec-head{margin-bottom:44px}
/* ============ 顶部导航 ============ */
header.nav{
position:sticky;top:0;z-index:50;background:var(--nav-bg);
backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
border-bottom:1px solid var(--border);
}
.nav-inner{display:flex;align-items:center;justify-content:space-between;height:64px}
.brand{display:flex;align-items:center;gap:10px;font-weight:800;font-size:1.18rem;letter-spacing:-.01em}
.brand .logo{width:30px;height:30px;border-radius:8px;background:var(--grad);display:grid;place-items:center;color:#fff;flex:none}
.brand .logo svg{width:18px;height:18px}
nav.links{display:flex;align-items:center;gap:26px}
nav.links a{color:var(--muted);font-size:.94rem;font-weight:500;transition:color .2s}
nav.links a:hover{color:var(--brand2)}
.nav-actions{display:flex;align-items:center;gap:12px}
.icon-btn{
width:38px;height:38px;border-radius:10px;border:1px solid var(--border);
background:var(--surface);color:var(--text);cursor:pointer;display:grid;place-items:center;
transition:transform .15s,border-color .2s;
}
.icon-btn:hover{transform:translateY(-1px);border-color:var(--brand2)}
.icon-btn svg{width:18px;height:18px}
#menuBtn{display:none}
.theme-icon-sun{display:none}
html[data-theme="dark"] .theme-icon-sun{display:block}
html[data-theme="dark"] .theme-icon-moon{display:none}
/* ============ Hero ============ */
.hero{padding:88px 0 70px;text-align:center;position:relative;overflow:hidden}
.hero::before{
content:"";position:absolute;inset:-40% -20% auto;height:640px;
background:radial-gradient(60% 60% at 50% 0%,rgba(6,182,212,.16),transparent 70%);
pointer-events:none;
}
.hero .eyebrow{
display:inline-flex;align-items:center;gap:8px;font-size:.85rem;font-weight:600;
color:var(--brand1);background:var(--chip);border:1px solid var(--border);
padding:6px 14px;border-radius:999px;margin-bottom:22px;
}
.hero h1{font-size:clamp(2.3rem,6.5vw,4rem);font-weight:900;letter-spacing:-.03em;line-height:1.12}
.hero p.tag{max-width:680px;margin:22px auto 0;color:var(--muted);font-size:clamp(1rem,2vw,1.18rem)}
.badges{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:30px}
.badge{
display:inline-flex;align-items:center;gap:8px;padding:9px 16px;border-radius:12px;
background:var(--surface);border:1px solid var(--border);font-size:.9rem;font-weight:600;
box-shadow:var(--shadow);
}
.badge b{color:var(--brand2)}
.cta-row{display:flex;gap:14px;justify-content:center;margin-top:38px;flex-wrap:wrap}
.btn{
display:inline-flex;align-items:center;gap:8px;padding:12px 24px;border-radius:12px;
font-weight:700;font-size:.96rem;cursor:pointer;border:1px solid transparent;transition:transform .15s,box-shadow .2s;
}
.btn:hover{transform:translateY(-2px)}
.btn-primary{background:var(--grad);color:#fff;box-shadow:0 10px 26px rgba(14,165,233,.32)}
.btn-ghost{background:var(--surface);border-color:var(--border);color:var(--text)}
/* ============ 特性卡片 ============ */
.features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(320px,100%),1fr));gap:20px}
.card{
background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
padding:26px 24px;transition:transform .2s ease,box-shadow .25s ease,border-color .2s;
}
.card:hover{transform:translateY(-5px);box-shadow:var(--shadow);border-color:rgba(6,182,212,.45)}
.card .ic{
width:46px;height:46px;border-radius:12px;background:var(--chip);display:grid;place-items:center;
font-size:1.35rem;margin-bottom:16px;
}
.card h3{font-size:1.13rem;font-weight:750;margin-bottom:8px;letter-spacing:-.01em}
.card p{color:var(--muted);font-size:.93rem}
.card ul{margin-top:10px;display:flex;flex-wrap:wrap;gap:6px}
.card ul li{
list-style:none;font-size:.76rem;font-weight:600;color:var(--brand1);
background:var(--chip);padding:3px 9px;border-radius:999px;
}
/* ============ 架构图 ============ */
.arch{display:flex;flex-direction:column;gap:0;align-items:center}
.arch-layer{
width:100%;max-width:760px;background:var(--surface);border:1px solid var(--border);
border-radius:var(--radius);padding:18px 22px;box-shadow:var(--shadow);
}
.arch-layer .layer-label{font-size:.74rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--brand2);margin-bottom:8px}
.arch-row{display:flex;flex-wrap:wrap;gap:10px;justify-content:center}
.pill{
background:var(--surface-2);border:1px solid var(--border);border-radius:10px;
padding:8px 14px;font-size:.86rem;font-weight:600;
}
.pill.grad{background:var(--grad);color:#fff;border-color:transparent}
.arch-arrow{color:var(--brand2);font-size:1.5rem;line-height:1;padding:6px 0;font-weight:700}
.arch-side{display:flex;gap:16px;flex-wrap:wrap;justify-content:center;margin-top:18px}
.arch-note{font-size:.82rem;color:var(--muted);text-align:center;margin-top:16px}
/* ============ 代码块 ============ */
pre.code{
background:var(--code-bg);color:var(--code-text);border-radius:12px;padding:18px 20px;
overflow-x:auto;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace;
font-size:.86rem;line-height:1.65;border:1px solid #1e293b;
}
pre.code .c{color:#64748b}
pre.code .k{color:#22d3ee}
pre.code .s{color:#86efac}
.code-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr));gap:18px;align-items:start}
.step-label{font-weight:700;font-size:.92rem;margin-bottom:8px;display:flex;align-items:center;gap:8px}
.step-num{width:22px;height:22px;border-radius:50%;background:var(--grad);color:#fff;display:grid;place-items:center;font-size:.78rem;flex:none}
/* ============ 表格 ============ */
.tbl-wrap{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface)}
table{width:100%;border-collapse:collapse;table-layout:fixed;font-size:.9rem}
col.c1{width:22%}col.c2{width:44%}col.c3{width:34%}
th,td{padding:12px 16px;text-align:left;border-bottom:1px solid var(--border);word-break:break-word}
th{background:var(--surface-2);font-size:.8rem;letter-spacing:.03em;color:var(--muted)}
tr:last-child td{border-bottom:none}
td code,p code{font-family:Consolas,Menlo,monospace;font-size:.84em;background:var(--chip);color:var(--brand1);padding:2px 6px;border-radius:6px}
.endpoint-chips{display:flex;flex-wrap:wrap;gap:10px;margin-top:18px}
.endpoint-chips span{
border:1px dashed var(--border);border-radius:999px;padding:6px 14px;font-size:.84rem;color:var(--muted);background:var(--surface)
}
/* ============ 仓库链接 ============ */
.repo-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(240px,100%),1fr));gap:16px}
.repo{
display:flex;align-items:center;gap:14px;padding:18px 20px;border-radius:var(--radius);
background:var(--surface);border:1px solid var(--border);transition:transform .18s,border-color .2s,box-shadow .2s;
}
.repo:hover{transform:translateY(-4px);border-color:rgba(6,182,212,.5);box-shadow:var(--shadow)}
.repo .ric{width:40px;height:40px;border-radius:10px;background:var(--chip);display:grid;place-items:center;font-size:1.2rem;flex:none}
.repo .rn{font-weight:700;font-size:.95rem}
.repo .ru{font-size:.78rem;color:var(--muted)}
/* ============ 页脚 ============ */
footer{border-top:1px solid var(--border);padding:34px 0;text-align:center;color:var(--muted);font-size:.88rem}
footer .flinks{display:flex;gap:18px;justify-content:center;margin-bottom:12px;flex-wrap:wrap}
footer a:hover{color:var(--brand2)}
.license-box{
max-width:620px;margin:0 auto;text-align:center;padding:26px;border:1px solid var(--border);
border-radius:var(--radius);background:var(--surface);
}
.license-box .mit{font-size:1.6rem;font-weight:900;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
/* ============ 移动端 ============ */
@media (max-width:768px){
nav.links{
position:absolute;top:64px;left:0;right:0;flex-direction:column;gap:0;
background:var(--nav-bg);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);
max-height:0;overflow:hidden;transition:max-height .28s ease;
}
nav.links.open{max-height:340px}
nav.links a{padding:14px 22px;width:100%;border-bottom:1px solid var(--border)}
#menuBtn{display:grid}
section{padding:52px 0}
.hero{padding:56px 0 48px}
}
@media (min-width:769px){
nav.links{display:flex !important}
}
</style>
</head>
<body>
<!-- ===== 导航 ===== -->
<header class="nav">
<div class="wrap nav-inner">
<a class="brand" href="#top">
<span class="logo">
<svg viewBox="0 0 24 24" fill="none"><path d="M6 7h8a3.5 3.5 0 0 1 0 7h-4a3.5 3.5 0 0 0 0 7h8" stroke="white" stroke-width="2.2" stroke-linecap="round"/></svg>
</span>
SciFlow
</a>
<nav class="links" id="navLinks">
<a href="#features">特性</a>
<a href="#architecture">架构</a>
<a href="#quickstart">快速开始</a>
<a href="#aiconfig">AI 配置</a>
<a href="#docs">文档</a>
<a href="#license">许可</a>
</nav>
<div class="nav-actions">
<button class="icon-btn" id="themeToggle" title="切换亮 / 暗主题" aria-label="切换主题">
<svg class="theme-icon-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8Z"/></svg>
<svg class="theme-icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg>
</button>
<button class="icon-btn" id="menuBtn" title="菜单" aria-label="菜单">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M4 7h16M4 12h16M4 17h16"/></svg>
</button>
</div>
</div>
</header>
<!-- ===== Hero ===== -->
<section class="hero" id="top">
<div class="wrap">
<span class="eyebrow">Local-First AI Research Workbench · 单用户本地科研智能体工作台</span>
<h1>把科研全流程<br><span class="grad-text">交给本地多智能体</span></h1>
<p class="tag">SciFlow 是本地优先、单机部署的科研全流程 AI 助手:输入一个研究主题,由 LangGraph 编排的多智能体流水线接管,完成文献调研 → 写作 → 质量门 → 投稿辅助的完整生命周期,文献与 Key 全部落本地 SQLite。</p>
<div class="badges">
<span class="badge">🗄️ <b>本地优先</b> SQLite 单文件</span>
<span class="badge">🤖 <b>多智能体</b> 自动流水线</span>
<span class="badge">📊 <b>Recharts + sigma.js</b> 可视化</span>
<span class="badge">🔌 <b>OpenAI 兼容</b> 自配模型 Key</span>
</div>
<div class="cta-row">
<a class="btn btn-primary" href="#quickstart">快速开始</a>
<a class="btn btn-ghost" href="#docs">查看仓库</a>
</div>
</div>
</section>
<!-- ===== 核心特性 ===== -->
<section id="features">
<div class="wrap">
<div class="sec-head">
<h2 class="sec-title">覆盖科研全生命周期的<span class="grad-text">核心能力</span></h2>
<p class="sec-sub">从选题、文献、写作到投稿跟踪,一条本地主干打通,过程资产全部沉淀在你的机器上。</p>
</div>
<div class="features-grid">
<div class="card">
<div class="ic">📝</div>
<h3>写作与定稿</h3>
<p>大纲先行,Markdown 编辑 / 预览 / 分栏三态切换,KaTeX 公式渲染,边写边查的 Agentic RAG。</p>
<ul><li>多版本快照</li><li>版本 diff</li><li>.tex / HTML / Markdown / .docx 导出</li></ul>
</div>
<div class="card">
<div class="ic">📚</div>
<h3>引用与文献</h3>
<p>8 种引用样式,文内 [n] 锚点与文末列表一一对应,著者-年制自动 a/b 重排。</p>
<ul><li>APA/IEEE/Vancouver/GB-T 7714</li><li>BibTeX / RIS 导入导出</li><li>PRISMA 筛选</li><li>力导向引用网络图</li></ul>
</div>
<div class="card">
<div class="ic">🔎</div>
<h3>知识库 RAG</h3>
<p>NotebookLM 式本地检索,BM25 + TF 向量余弦混合,零依赖中文 Bigram 分词。</p>
<ul><li>来源可点回原文</li><li>文献双向绑定</li><li>命中块带来源卡片</li></ul>
</div>
<div class="card">
<div class="ic">🤖</div>
<h3>多智能体流水线</h3>
<p>LangGraph 编排全自动流水线:主题验证 → 文献调研 → 大纲(人工确认)→ 并行分章起草 → 7 维质量门 → 润色 → 引用格式化。</p>
<ul><li>Reflexion 自动回炉</li><li>Checkpoint 断点续跑</li><li>fast / strong 模型路由</li></ul>
</div>
<div class="card">
<div class="ic">✔️</div>
<h3>质量与审稿</h3>
<p>7 维质量评分(文献/逻辑/引用/语言/创新/图表/格式)0–100,不达标自动回炉。</p>
<ul><li>SVG 雷达图</li><li>审稿意见结构化</li><li>逐条回复模板</li></ul>
</div>
<div class="card">
<div class="ic">📮</div>
<h3>投稿跟踪</h3>
<p>选刊匹配 + Cover Letter 生成,13 态投稿状态机,修回截止日倒计时。</p>
<ul><li>手动台账 / 邮件 AI 解析</li><li>周期超期提醒</li><li>转投他刊串联</li></ul>
</div>
<div class="card">
<div class="ic">🧪</div>
<h3>实验沙箱</h3>
<p>后端隔离 spawn 执行本机 Python,stdout / PNG 内联回显,可存为可复现实验记录。</p>
<ul><li>资源上限防护</li><li>可配超时</li><li>降级友好引导</li></ul>
</div>
<div class="card">
<div class="ic">📊</div>
<h3>可视化体系</h3>
<p>Recharts 负责统计图表、sigma.js + graphology(WebGL)负责引用网络;页面按需懒加载,图表包不进首屏。</p>
<ul><li>编码矩阵</li><li>引用网络</li><li>质量雷达</li><li>记忆思维导图</li></ul>
</div>
<div class="card">
<div class="ic">⌨️</div>
<h3>主流交互范式</h3>
<p>贴近现代 AI 工具的操作手感,快捷键直达,复习卡与深色模式齐备。</p>
<ul><li>⌘K 命令面板</li><li>NotebookLM 复习卡</li><li>SSE 流式渲染</li><li>深色模式</li></ul>
</div>
</div>
</div>
</section>
<!-- ===== 架构概览 ===== -->
<section id="architecture" style="background:var(--bg-soft)">
<div class="wrap">
<div class="sec-head">
<h2 class="sec-title">极简<span class="grad-text">本地架构</span></h2>
<p class="sec-sub">React + Vite 前端经 REST / SSE 对接 NestJS 后端模块群,数据落 SQLite;AI 统一经 OpenAI 兼容网关,可一键切本机 mock。</p>
</div>
<div class="arch">
<div class="arch-layer">
<div class="layer-label">前端 · Browser</div>
<div class="arch-row">
<span class="pill grad">React 19 + Vite 6</span>
<span class="pill">Tailwind v4</span>
<span class="pill">react-markdown + KaTeX</span>
<span class="pill">Recharts · sigma.js</span>
</div>
</div>
<div class="arch-arrow">⇅ REST / SSE 流式</div>
<div class="arch-layer">
<div class="layer-label">后端 · NestJS 11(TypeScript strict)</div>
<div class="arch-row">
<span class="pill">projects</span><span class="pill">documents</span><span class="pill">references</span>
<span class="pill">knowledge</span><span class="pill">pipeline</span><span class="pill">orchestrator</span>
<span class="pill">research</span><span class="pill">judgment</span><span class="pill">experiments</span>
<span class="pill">chat (SSE)</span><span class="pill">memory</span><span class="pill">mcp</span><span class="pill">settings</span>
</div>
</div>
<div class="arch-arrow">⇅ Drizzle ORM</div>
<div class="arch-row" style="gap:16px">
<div class="arch-layer" style="max-width:300px">
<div class="layer-label">存储</div>
<div class="arch-row"><span class="pill grad">SQLite(WAL)单文件</span></div>
</div>
<div class="arch-layer" style="max-width:300px">
<div class="layer-label">AI 网关</div>
<div class="arch-row"><span class="pill">mock 网关</span><span class="pill">OpenAI 兼容端点</span></div>
</div>
</div>
<p class="arch-note">单用户本地部署 · 后端默认仅监听 127.0.0.1 · 无多租户 / 无第三方云上传</p>
</div>
</div>
</section>
<!-- ===== 快速开始 ===== -->
<section id="quickstart">
<div class="wrap">
<div class="sec-head">
<h2 class="sec-title">三分钟<span class="grad-text">跑起来</span></h2>
<p class="sec-sub">要求 Node ≥ 20、pnpm ≥ 9。SQLite 首次启动自动建表,零配置开箱即跑。</p>
</div>
<div class="code-grid">
<div>
<div class="step-label"><span class="step-num">1</span>克隆代码</div>
<pre class="code"><span class="c"># 任选一个仓库镜像克隆</span>
git clone https://gitcode.com/badhope/sciflow.git sciflow
cd sciflow</pre>
</div>
<div>
<div class="step-label"><span class="step-num">2</span>安装依赖</div>
<pre class="code">pnpm install
cp apps/server/.env.example apps/server/.env
<span class="c"># 至少填 AI_BASE_URL / AI_API_KEY / AI_MODEL</span></pre>
</div>
<div>
<div class="step-label"><span class="step-num">3</span>构建并运行</div>
<pre class="code">pnpm --filter @sciflow/server build
<span class="c"># 终端 A:后端 :3000</span>
node apps/server/dist/apps/server/src/main.js
<span class="c"># 终端 B:前端 :5173</span>
pnpm --filter @sciflow/web dev
<span class="c"># 浏览器打开 http://localhost:5173</span></pre>
</div>
</div>
</div>
</section>
<!-- ===== AI 配置 ===== -->
<section id="aiconfig" style="background:var(--bg-soft)">
<div class="wrap">
<div class="sec-head">
<h2 class="sec-title">接入<span class="grad-text">你自己的模型</span></h2>
<p class="sec-sub">SciFlow 只走 OpenAI 兼容协议,填 base_url + model + key 即可;未配置 Key 时本地功能照常可用,AI 不返回假数据。</p>
</div>
<div class="code-grid" style="grid-template-columns:1.2fr 1fr;align-items:start">
<div class="tbl-wrap">
<table>
<colgroup><col class="c1"><col class="c2"><col class="c3"></colgroup>
<thead><tr><th>变量</th><th>说明</th><th>示例值(占位)</th></tr></thead>
<tbody>
<tr><td><code>AI_BASE_URL</code></td><td>OpenAI 兼容接口地址</td><td><code>https://api.deepseek.com/v1</code></td></tr>
<tr><td><code>AI_API_KEY</code></td><td>你的 API 密钥</td><td><code>sk-your-api-key-here</code></td></tr>
<tr><td><code>AI_MODEL</code></td><td>默认模型</td><td><code>deepseek-chat</code></td></tr>
<tr><td><code>AI_MODEL_FAST</code></td><td>快档:问答 / 润色 / 翻译</td><td>留空则回落 AI_MODEL</td></tr>
<tr><td><code>AI_MODEL_STRONG</code></td><td>强档:规划 / 长文起草</td><td>留空则回落 AI_MODEL</td></tr>
<tr><td><code>AI_RPM_CAP</code></td><td>每分钟调用上限(令牌桶防 429)</td><td><code>8</code>(长流水线建议 100+)</td></tr>
<tr><td><code>AI_MOCK</code></td><td>设 1 启用本机 mock 网关</td><td><code>1</code>(无 Key 跑全链路)</td></tr>
</tbody>
</table>
</div>
<div>
<pre class="code"><span class="c"># apps/server/.env(占位示例)</span>
AI_BASE_URL=<span class="s">https://api.deepseek.com/v1</span>
AI_MODEL=<span class="s">deepseek-chat</span>
AI_API_KEY=<span class="s">sk-your-api-key-here</span>
AI_MODEL_FAST=<span class="s">deepseek-chat</span>
AI_MODEL_STRONG=<span class="s">deepseek-reasoner</span>
AI_RPM_CAP=<span class="s">8</span></pre>
<div class="endpoint-chips">
<span>火山方舟</span><span>DeepSeek</span><span>豆包</span><span>智谱</span><span>Kimi</span><span>Ollama 本地</span><span>云知声</span>
</div>
</div>
</div>
</div>
</section>
<!-- ===== 文档与仓库 ===== -->
<section id="docs">
<div class="wrap">
<div class="sec-head">
<h2 class="sec-title">多平台<span class="grad-text">开源仓库</span></h2>
<p class="sec-sub">GitHub 三仓运行同一套 CI(lint · typecheck ×2 · vitest ×2 · build ×2 · mock 全量回归 161 项 · promptfoo 契约评估 · Playwright 冒烟);GitCode / Gitee 同步同一发布树(Gitee 当前为私有镜像)。</p>
</div>
<div class="repo-grid">
<a class="repo" href="https://github.com/badhope/sciflow" target="_blank" rel="noopener">
<span class="ric">🐙</span>
<span><div class="rn">GitHub · badhope</div><div class="ru">github.com/badhope/sciflow</div></span>
</a>
<a class="repo" href="https://gitcode.com/badhope/sciflow" target="_blank" rel="noopener">
<span class="ric">⚡</span>
<span><div class="rn">GitCode</div><div class="ru">gitcode.com/badhope/sciflow</div></span>
</a>
<a class="repo" href="https://gitee.com/badhope/sciflow" target="_blank" rel="noopener">
<span class="ric">📦</span>
<span><div class="rn">Gitee</div><div class="ru">gitee.com/badhope/sciflow</div></span>
</a>
<a class="repo" href="https://github.com/X33834/sciflow" target="_blank" rel="noopener">
<span class="ric">🐙</span>
<span><div class="rn">GitHub · X33834</div><div class="ru">github.com/X33834/sciflow</div></span>
</a>
<a class="repo" href="https://github.com/Morningstar202604/sciflow" target="_blank" rel="noopener">
<span class="ric">🌟</span>
<span><div class="rn">GitHub · Morningstar</div><div class="ru">github.com/Morningstar202604/sciflow</div></span>
</a>
</div>
<p class="sec-sub" style="margin-top:22px">📄 产品路线图与能力矩阵见 <code>docs/product-roadmap.md</code>(现状能力矩阵 / 设计原则 / 差距与缺口)。</p>
</div>
</section>
<!-- ===== 许可 ===== -->
<section id="license" style="background:var(--bg-soft)">
<div class="wrap">
<div class="sec-head">
<h2 class="sec-title">开源<span class="grad-text">许可</span></h2>
</div>
<div class="license-box">
<div class="mit">MIT License</div>
<p style="margin-top:10px;color:var(--muted)">SciFlow 以 MIT 协议开源 © 2026 SciFlow Contributors。可自由使用、修改与分发,保留版权声明即可。</p>
</div>
</div>
</section>
<!-- ===== 页脚 ===== -->
<footer>
<div class="wrap">
<div class="flinks">
<a href="#features">特性</a><a href="#architecture">架构</a><a href="#quickstart">快速开始</a>
<a href="#aiconfig">AI 配置</a><a href="#docs">仓库</a><a href="#license">许可</a>
</div>
<div>SciFlow · Local-First AI Research Workbench · MIT License</div>
</div>
</footer>
<script>
(function(){
var root = document.documentElement;
// 主题:优先手动选择,其次跟随系统
function applyTheme(t){ root.setAttribute('data-theme', t); try{ localStorage.setItem('sciflow-theme', t); }catch(e){} }
var saved = null;
try{ saved = localStorage.getItem('sciflow-theme'); }catch(e){}
if(saved){ applyTheme(saved); }
else{ applyTheme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); }
document.getElementById('themeToggle').addEventListener('click', function(){
var cur = root.getAttribute('data-theme');
applyTheme(cur === 'dark' ? 'light' : 'dark');
});
// 移动端菜单
var btn = document.getElementById('menuBtn'), links = document.getElementById('navLinks');
btn.addEventListener('click', function(){ links.classList.toggle('open'); });
links.querySelectorAll('a').forEach(function(a){
a.addEventListener('click', function(){ links.classList.remove('open'); });
});
})();
</script>
</body>
</html>