-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathwebsite.html
More file actions
377 lines (369 loc) · 25 KB
/
Copy pathwebsite.html
File metadata and controls
377 lines (369 loc) · 25 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
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>BaiLongma | 持续运行的 AI Agent</title>
<meta
name="description"
content="BaiLongma 是一个持续运行的 AI Agent 实验框架,具备 Tick 驱动、任务持久化、记忆注入、工具调用与可视化监控能力。"
>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&family=Noto+Serif+SC:wght@500;700&display=swap" rel="stylesheet">
<style>
:root {
--paper: #f4efe3;
--sand: #e6dcc5;
--ink: #17221c;
--muted: #526155;
--line: rgba(23, 34, 28, 0.12);
--forest: #1f5a43;
--forest-deep: #0d2c22;
--copper: #b6643c;
--gold: #c4a85a;
--card: rgba(255, 251, 243, 0.72);
--shadow: 0 30px 80px rgba(16, 30, 25, 0.14);
--max: 1180px;
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
color: var(--ink);
font-family: "IBM Plex Sans", "PingFang SC", "Microsoft YaHei", sans-serif;
background:
radial-gradient(circle at top left, rgba(196, 168, 90, 0.24), transparent 26%),
radial-gradient(circle at 82% 14%, rgba(182, 100, 60, 0.16), transparent 24%),
linear-gradient(180deg, #f8f3e8 0%, #f4efe3 42%, #ece4d4 100%);
min-height: 100vh;
}
a { color: inherit; text-decoration: none; }
.page-shell { position: relative; overflow: hidden; }
.grain, .orbit, .beam { pointer-events: none; position: fixed; inset: 0; z-index: 0; }
.grain {
opacity: 0.08;
background-image:
linear-gradient(rgba(20, 30, 24, 0.05) 1px, transparent 1px),
linear-gradient(90deg, rgba(20, 30, 24, 0.05) 1px, transparent 1px);
background-size: 22px 22px;
mask-image: radial-gradient(circle at center, black 54%, transparent 100%);
}
.orbit::before, .orbit::after { content: ""; position: absolute; border-radius: 999px; border: 1px solid rgba(31, 90, 67, 0.10); }
.orbit::before { width: 58vw; height: 58vw; max-width: 760px; max-height: 760px; right: -16vw; top: -10vw; transform: rotate(-12deg); }
.orbit::after { width: 40vw; height: 40vw; max-width: 520px; max-height: 520px; left: -12vw; top: 18vh; transform: rotate(18deg); }
.beam::before {
content: "";
position: absolute;
width: 42vw;
min-width: 320px;
max-width: 620px;
height: 120vh;
right: -8vw;
top: -10vh;
background: linear-gradient(180deg, rgba(31, 90, 67, 0.14), rgba(31, 90, 67, 0));
filter: blur(40px);
transform: rotate(18deg);
}
.container { width: min(var(--max), calc(100vw - 40px)); margin: 0 auto; position: relative; z-index: 1; }
.nav { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 24px 0; }
.brand { display: inline-flex; align-items: center; gap: 14px; }
.brand-mark {
width: 44px; height: 44px; border-radius: 16px;
background: radial-gradient(circle at 30% 28%, #f5edd8 0 20%, transparent 21%), linear-gradient(145deg, var(--forest), var(--forest-deep));
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.18), 0 12px 30px rgba(13, 44, 34, 0.25);
position: relative;
}
.brand-mark::after { content: ""; position: absolute; inset: 10px; border: 1px solid rgba(255, 245, 225, 0.38); border-radius: 12px; }
.brand-copy { display: grid; gap: 2px; }
.brand-name { font-size: 18px; font-weight: 700; letter-spacing: 0.04em; }
.brand-sub { font-size: 12px; color: var(--muted); letter-spacing: 0.16em; text-transform: uppercase; font-family: "IBM Plex Mono", monospace; }
.nav-links { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; justify-content: flex-end; }
.pill-link, .button { border-radius: 999px; transition: transform 180ms ease, background 180ms ease, color 180ms ease, border-color 180ms ease; }
.pill-link { padding: 10px 14px; border: 1px solid var(--line); color: var(--muted); background: rgba(255, 255, 255, 0.36); backdrop-filter: blur(8px); }
.pill-link:hover, .button:hover { transform: translateY(-1px); }
.hero { display: grid; grid-template-columns: 1.16fr 0.84fr; gap: 28px; align-items: stretch; padding: 22px 0 34px; }
.hero-main, .hero-side, .panel, .feature-card, .timeline-card, .code-block {
border: 1px solid rgba(23, 34, 28, 0.10);
background: var(--card);
backdrop-filter: blur(14px);
box-shadow: var(--shadow);
}
.hero-main { border-radius: 34px; padding: 34px; position: relative; overflow: hidden; }
.hero-main::after { content: ""; position: absolute; inset: auto auto -80px -30px; width: 260px; height: 260px; border-radius: 50%; background: radial-gradient(circle, rgba(196, 168, 90, 0.22), transparent 66%); }
.eyebrow {
display: inline-flex; align-items: center; gap: 10px; padding: 9px 14px; border-radius: 999px;
border: 1px solid rgba(31, 90, 67, 0.18); color: var(--forest); background: rgba(31, 90, 67, 0.06);
font-family: "IBM Plex Mono", monospace; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase;
}
.eyebrow::before { content: ""; width: 8px; height: 8px; border-radius: 999px; background: var(--copper); box-shadow: 0 0 0 6px rgba(182, 100, 60, 0.10); }
h1 { margin: 20px 0 14px; font-family: "Noto Serif SC", serif; font-size: clamp(38px, 5vw, 68px); line-height: 1.06; letter-spacing: -0.02em; }
.hero-lead { max-width: 700px; margin: 0; font-size: 18px; line-height: 1.75; color: var(--muted); }
.hero-actions { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 28px; }
.button { display: inline-flex; align-items: center; justify-content: center; gap: 10px; padding: 14px 20px; font-weight: 600; border: 1px solid transparent; }
.button-primary { color: #f8f3e8; background: linear-gradient(135deg, var(--forest), var(--forest-deep)); }
.button-secondary { color: var(--ink); background: rgba(255, 255, 255, 0.5); border-color: var(--line); }
.hero-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-top: 30px; }
.mini-stat { padding: 16px; border-radius: 18px; background: rgba(255, 255, 255, 0.42); border: 1px solid rgba(23, 34, 28, 0.08); }
.mini-stat-label { font-family: "IBM Plex Mono", monospace; font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.08em; }
.mini-stat-value { margin-top: 10px; font-size: 22px; font-weight: 700; }
.mini-stat-note { margin-top: 6px; font-size: 13px; line-height: 1.6; color: var(--muted); }
.hero-side { border-radius: 30px; padding: 24px; display: grid; gap: 18px; align-content: start; }
.hero-card-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.hero-card-title { font-size: 15px; font-weight: 700; }
.hero-card-tag { padding: 6px 10px; border-radius: 999px; background: rgba(182, 100, 60, 0.12); color: var(--copper); font-family: "IBM Plex Mono", monospace; font-size: 11px; }
.flow { display: grid; gap: 12px; }
.flow-step { padding: 14px 16px; border-radius: 18px; background: rgba(255, 255, 255, 0.48); border: 1px solid rgba(23, 34, 28, 0.08); }
.flow-step span { display: block; margin-bottom: 6px; color: var(--forest); font-family: "IBM Plex Mono", monospace; font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; }
.flow-step strong { display: block; margin-bottom: 5px; font-size: 16px; }
.flow-step p { margin: 0; color: var(--muted); line-height: 1.7; font-size: 14px; }
.section { padding: 34px 0; }
.section-head { display: flex; align-items: end; justify-content: space-between; gap: 18px; margin-bottom: 22px; }
.section-head h2 { margin: 0; font-family: "Noto Serif SC", serif; font-size: clamp(28px, 3vw, 42px); line-height: 1.15; }
.section-head p { margin: 0; max-width: 520px; color: var(--muted); line-height: 1.75; }
.feature-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; }
.feature-card { border-radius: 24px; padding: 22px; position: relative; overflow: hidden; }
.feature-card::before { content: ""; position: absolute; inset: auto -20px -24px auto; width: 120px; height: 120px; border-radius: 50%; background: radial-gradient(circle, rgba(31, 90, 67, 0.12), transparent 72%); }
.feature-kicker { font-family: "IBM Plex Mono", monospace; font-size: 11px; color: var(--copper); letter-spacing: 0.08em; text-transform: uppercase; }
.feature-card h3 { margin: 12px 0 10px; font-size: 21px; }
.feature-card p { margin: 0; color: var(--muted); line-height: 1.78; }
.feature-list { margin-top: 16px; padding-left: 18px; color: var(--ink); }
.feature-list li + li { margin-top: 8px; }
.architecture { display: grid; grid-template-columns: 0.92fr 1.08fr; gap: 20px; }
.panel { border-radius: 28px; padding: 24px; }
.stack { display: grid; gap: 12px; }
.stack-row { display: grid; grid-template-columns: 118px 1fr; gap: 14px; align-items: start; padding: 14px 0; border-top: 1px solid var(--line); }
.stack-row:first-child { border-top: 0; padding-top: 0; }
.stack-label { font-family: "IBM Plex Mono", monospace; font-size: 11px; text-transform: uppercase; color: var(--forest); letter-spacing: 0.08em; }
.stack-row strong { display: block; margin-bottom: 4px; font-size: 18px; }
.stack-row p { margin: 0; color: var(--muted); line-height: 1.75; }
.timeline { display: grid; gap: 14px; }
.timeline-card { border-radius: 24px; padding: 18px 18px 18px 20px; display: grid; grid-template-columns: auto 1fr; gap: 14px; align-items: start; }
.timeline-index { width: 36px; height: 36px; border-radius: 12px; background: linear-gradient(135deg, rgba(31, 90, 67, 0.14), rgba(182, 100, 60, 0.14)); color: var(--forest); display: grid; place-items: center; font-family: "IBM Plex Mono", monospace; font-weight: 600; }
.timeline-card h3 { margin: 2px 0 8px; font-size: 18px; }
.timeline-card p { margin: 0; line-height: 1.75; color: var(--muted); }
.quickstart { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.code-block { border-radius: 26px; padding: 22px; overflow: hidden; }
.code-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
.code-head h3 { margin: 0; font-size: 18px; }
.code-head span { font-family: "IBM Plex Mono", monospace; font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.08em; }
pre { margin: 0; overflow-x: auto; white-space: pre; font-family: "IBM Plex Mono", monospace; font-size: 13px; line-height: 1.8; color: #f8f3e8; background: linear-gradient(180deg, #16382d, #10281f); border-radius: 18px; padding: 18px; box-shadow: inset 0 0 0 1px rgba(255, 244, 224, 0.08); }
code { font-family: "IBM Plex Mono", monospace; }
.quote { padding: 24px; border-radius: 26px; background: linear-gradient(135deg, rgba(31, 90, 67, 0.08), rgba(182, 100, 60, 0.08)); border: 1px solid rgba(31, 90, 67, 0.12); }
.quote p { margin: 0; font-family: "Noto Serif SC", serif; font-size: clamp(22px, 2.4vw, 30px); line-height: 1.55; }
.quote small { display: block; margin-top: 12px; color: var(--muted); font-family: "IBM Plex Mono", monospace; letter-spacing: 0.08em; text-transform: uppercase; }
.cta { padding-bottom: 54px; }
.cta-shell { display: grid; grid-template-columns: 1.08fr 0.92fr; gap: 20px; align-items: stretch; padding: 26px; border-radius: 32px; background: linear-gradient(135deg, rgba(17, 56, 43, 0.95), rgba(15, 35, 28, 0.94)); color: #f8f3e8; box-shadow: 0 34px 90px rgba(11, 29, 22, 0.28); }
.cta-shell h2 { margin: 0 0 12px; font-family: "Noto Serif SC", serif; font-size: clamp(30px, 3.4vw, 48px); line-height: 1.12; }
.cta-shell p { margin: 0; color: rgba(248, 243, 232, 0.76); line-height: 1.8; }
.cta-links { display: flex; align-items: center; justify-content: flex-end; gap: 12px; flex-wrap: wrap; }
.cta .button-secondary { color: #f8f3e8; background: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.18); }
.footer { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 0 0 34px; color: var(--muted); font-size: 14px; }
.footer code { background: rgba(255, 255, 255, 0.46); padding: 3px 8px; border-radius: 999px; }
@media (max-width: 1080px) {
.hero, .architecture, .quickstart, .cta-shell { grid-template-columns: 1fr; }
.feature-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.cta-links { justify-content: flex-start; }
}
@media (max-width: 720px) {
.container { width: min(var(--max), calc(100vw - 24px)); }
.hero-main, .hero-side, .panel, .feature-card, .code-block, .cta-shell { padding: 20px; }
.feature-grid, .hero-grid { grid-template-columns: 1fr; }
.stack-row { grid-template-columns: 1fr; gap: 8px; }
.nav { flex-direction: column; align-items: flex-start; }
.nav-links, .hero-actions, .footer { width: 100%; }
.footer { flex-direction: column; align-items: flex-start; }
}
</style>
</head>
<body>
<div class="page-shell">
<div class="grain"></div>
<div class="orbit"></div>
<div class="beam"></div>
<div class="container">
<header class="nav">
<a class="brand" href="#top" aria-label="BaiLongma">
<span class="brand-mark" aria-hidden="true"></span>
<span class="brand-copy">
<span class="brand-name">BaiLongma</span>
<span class="brand-sub">Continuous Agent Framework</span>
</span>
</a>
<nav class="nav-links">
<a class="pill-link" href="#features">能力</a>
<a class="pill-link" href="#architecture">架构</a>
<a class="pill-link" href="#quickstart">开始使用</a>
<a class="pill-link" href="https://github.com/xiaoyuanda666-ship-it/BaiLongma" target="_blank" rel="noreferrer">GitHub</a>
</nav>
</header>
<main id="top">
<section class="hero">
<div class="hero-main">
<div class="eyebrow">Tick-Driven • Memory-Injected • Tool-Acting</div>
<h1>不是一问一答,<br>而是持续运行的 AI Agent。</h1>
<p class="hero-lead">BaiLongma 是一个围绕“持续意识流”构建的 AI Agent 实验框架。它会在 <strong>TICK</strong> 驱动下继续运行,在有消息时优先响应,在空闲时继续基于任务、记忆与上下文推进下一步动作。</p>
<div class="hero-actions">
<a class="button button-primary" href="https://github.com/xiaoyuanda666-ship-it/BaiLongma" target="_blank" rel="noreferrer">查看 GitHub</a>
<a class="button button-secondary" href="/brain-ui">打开 Brain UI</a>
<a class="button button-secondary" href="#quickstart">快速启动</a>
</div>
<div class="hero-grid">
<div class="mini-stat">
<div class="mini-stat-label">运行方式</div>
<div class="mini-stat-value">Continuous Loop</div>
<div class="mini-stat-note">不是请求式聊天,而是一个持续运行的主循环。</div>
</div>
<div class="mini-stat">
<div class="mini-stat-label">核心能力</div>
<div class="mini-stat-value">Memory + Tools</div>
<div class="mini-stat-note">支持记忆注入、任务状态、工具执行与恢复。</div>
</div>
<div class="mini-stat">
<div class="mini-stat-label">可视化</div>
<div class="mini-stat-value">Brain UI</div>
<div class="mini-stat-note">内置 HTTP API、SSE 事件流与监控界面。</div>
</div>
</div>
</div>
<aside class="hero-side">
<div class="hero-card-top">
<div class="hero-card-title">Runtime Pulse</div>
<div class="hero-card-tag">Agent</div>
</div>
<div class="flow">
<div class="flow-step"><span>01</span><strong>接收消息</strong><p>外部消息进入队列后,会打断当前思考并立刻切回响应路径。</p></div>
<div class="flow-step"><span>02</span><strong>记忆注入</strong><p>对话窗口、人物记忆、任务知识、行为约束会按需装配进系统提示。</p></div>
<div class="flow-step"><span>03</span><strong>工具执行</strong><p>支持发消息、读写文件、执行命令、抓网页、提醒调度等动作。</p></div>
<div class="flow-step"><span>04</span><strong>持续推进</strong><p>空闲时继续 TICK,自适应节奏,重启后还能恢复任务状态。</p></div>
</div>
</aside>
</section>
<section class="section" id="features">
<div class="section-head">
<div><h2>一个 Agent,不止会“回答”。</h2></div>
<p>BaiLongma 的重点不是把模型包成聊天框,而是把长期运行、工具行动、任务持久化和记忆结构真正组合起来。</p>
</div>
<div class="feature-grid">
<article class="feature-card">
<div class="feature-kicker">Core Loop</div>
<h3>持续意识流</h3>
<p>项目以 TICK 机制驱动,不依赖单次请求存活。消息、空闲、任务、限流与提醒状态都会影响下一次调度。</p>
<ul class="feature-list">
<li>消息到达立即打断当前处理</li>
<li>空闲时继续执行 L2 TICK</li>
<li>支持动态 tick interval</li>
</ul>
</article>
<article class="feature-card">
<div class="feature-kicker">Memory System</div>
<h3>记忆写入与注入</h3>
<p>内置记忆识别器、记忆检索器和人物根节点记忆,让 Agent 能在后续轮次里继续“带着过去”工作。</p>
<ul class="feature-list">
<li>SQLite + FTS5 持久化</li>
<li>人物记忆、任务知识、行为约束</li>
<li>支持主动 recall</li>
</ul>
</article>
<article class="feature-card">
<div class="feature-kicker">Action Layer</div>
<h3>工具调用闭环</h3>
<p>模型不只是生成文本,还能真实地采取动作。工具调用结果会回流给模型,并写入行动日志。</p>
<ul class="feature-list">
<li><code>send_message</code> / <code>fetch_url</code></li>
<li><code>read_file</code> / <code>write_file</code></li>
<li><code>exec_command</code> / reminders</li>
</ul>
</article>
<article class="feature-card">
<div class="feature-kicker">Task State</div>
<h3>任务可恢复</h3>
<p>通过 <code>[SET_TASK]</code> 与 <code>[CLEAR_TASK]</code> 协议跟踪任务进度,重启后仍能恢复当前执行中的任务。</p>
</article>
<article class="feature-card">
<div class="feature-kicker">Observability</div>
<h3>可视化监控</h3>
<p>项目内置 HTTP API、SSE 事件流、Brain UI 与状态接口,方便观察 Agent 的思考、动作与记忆状态。</p>
</article>
<article class="feature-card">
<div class="feature-kicker">Provider Layer</div>
<h3>多模型与扩展能力</h3>
<p>支持 OpenAI、DeepSeek、MiniMax,并把语音、音乐、歌词等能力独立成 provider 层,便于继续扩展。</p>
</article>
</div>
</section>
<section class="section" id="architecture">
<div class="section-head">
<div><h2>围绕“持续运行”组织起来的 Agent 架构。</h2></div>
<p>这不是一个把 prompt 塞给模型的薄壳,而是一条清晰的运行链路:消息输入、记忆注入、上下文补采集、工具执行、识别写回、下一轮继续。</p>
</div>
<div class="architecture">
<div class="panel">
<div class="stack">
<div class="stack-row"><div class="stack-label">Input</div><div><strong>Queue + Interrupt</strong><p>消息进入队列后打断当前处理,保持“像即时通信一样”的响应体验。</p></div></div>
<div class="stack-row"><div class="stack-label">Context</div><div><strong>Injector + Gatherer</strong><p>对话窗口、人物记忆、任务知识与补充上下文一起决定当前轮次看到的世界。</p></div></div>
<div class="stack-row"><div class="stack-label">Action</div><div><strong>Tool-Calling Loop</strong><p>模型可以多轮调用工具,直到真正完成动作,而不是一次性吐出答案就结束。</p></div></div>
<div class="stack-row"><div class="stack-label">Memory</div><div><strong>Recognizer + SQLite</strong><p>把值得长期保留的事实、人物、对象与经验写回数据库,供后续继续使用。</p></div></div>
<div class="stack-row"><div class="stack-label">Observe</div><div><strong>API + SSE + Brain UI</strong><p>把 Agent 的内部状态暴露为可以看见、可以调试、可以继续扩展的界面与接口。</p></div></div>
</div>
</div>
<div class="timeline">
<div class="timeline-card"><div class="timeline-index">1</div><div><h3>主循环启动</h3><p>初始化数据库、恢复任务状态、启动 HTTP API 与 TUI,然后进入第一轮调度。</p></div></div>
<div class="timeline-card"><div class="timeline-index">2</div><div><h3>按需装配上下文</h3><p>先注入记忆,再根据当前任务判断上下文是否充分,不够就继续读文件或搜记忆。</p></div></div>
<div class="timeline-card"><div class="timeline-index">3</div><div><h3>模型驱动行动</h3><p>输出文本、触发工具、消费工具结果、追加行动日志,然后决定下一轮要不要继续。</p></div></div>
<div class="timeline-card"><div class="timeline-index">4</div><div><h3>记忆落库</h3><p>识别值得长期保留的知识与关系,去重后写入持久层,形成可继续积累的 Agent 历史。</p></div></div>
</div>
</div>
</section>
<section class="section" id="quickstart">
<div class="section-head">
<div><h2>几分钟内把它跑起来。</h2></div>
<p>BaiLongma 的定位是本地可运行、可观察、可继续改造的 Agent 实验框架。你可以先跑起来,再按自己的方向继续扩展它。</p>
</div>
<div class="quickstart">
<div class="code-block">
<div class="code-head"><h3>Quick Start</h3><span>Terminal</span></div>
<pre><code>git clone https://github.com/xiaoyuanda666-ship-it/BaiLongma.git
cd BaiLongma
npm install
# .env
LLM_PROVIDER=openai
OPENAI_API_KEY=your_key_here
npm start</code></pre>
</div>
<div class="code-block">
<div class="code-head"><h3>Open Interfaces</h3><span>Runtime</span></div>
<pre><code>http://127.0.0.1:3721/site
http://127.0.0.1:3721/brain-ui
http://127.0.0.1:3721/events
http://127.0.0.1:3721/status
http://127.0.0.1:3721/memories?limit=20</code></pre>
</div>
</div>
<div class="quote" style="margin-top: 20px;">
<p>如果你想做的不是一个“会聊天的壳”,而是一个能持续存在、能记住、能行动、能继续推进任务的 Agent,BaiLongma 是一个很好的起点。</p>
<small>Built Around Continuous Agent Runtime</small>
</div>
</section>
<section class="section cta">
<div class="cta-shell">
<div>
<h2>把你的 Agent 从“回答器”,推进成“持续系统”。</h2>
<p>现在就去看源码、跑起来,或者直接打开 Brain UI 感受它的运行状态。这个项目最有趣的地方,不是它已经完成了什么,而是它已经具备了继续长成一个更完整 Agent 的骨架。</p>
</div>
<div class="cta-links">
<a class="button button-primary" href="https://github.com/xiaoyuanda666-ship-it/BaiLongma" target="_blank" rel="noreferrer">Star on GitHub</a>
<a class="button button-secondary" href="/brain-ui">Open Brain UI</a>
<a class="button button-secondary" href="/status">View Status API</a>
</div>
</div>
</section>
</main>
<footer class="footer">
<div>BaiLongma · 持续运行的 AI Agent 实验框架</div>
<div>Official site route: <code>/site</code></div>
</footer>
</div>
</div>
</body>
</html>