OpenClaw ๆ ธๅฟๆถๆ็ๆ็ฎๅค็ฐ๏ผ็จไบๅญฆไน AI Agent ็็ณป็ป็บง่ฎพ่ฎกใ
"ๆฒกๆ่ฎฐๅฟ็ AI ๅชๆฏๅฝๆฐๆ ๅฐ๏ผๆ่ฎฐๅฟ + ไธปๅจๅค้็ AI๏ผๆๆฏไผๆผๅ็'็ๅฝ็ณป็ป'"
็ฝไธๅคงๅคๆฐ Agent ๆ็จๅช่ฎฒ Agent Loop๏ผ
while tool_calls:
response = llm.generate(messages)
for tool in tools:
result = tool.execute()
messages.append(result)่ฟไธๆฏ็ๆญฃ็ Agent ๆถๆใ ไธไธช็ไบง็บง Agent ้่ฆ็ๆฏ"็ณป็ป็บงๆไฝณๅฎ่ทต"ใ
OpenClaw ๆฏไธไธช80w่ก็ๅคๆAgent ็ณป็ป๏ผๆฌ้กน็ฎไปไธญๆ็ผๅบๆ ธๅฟ่ฎพ่ฎกไธๆๅฐๅฎ็ฐ๏ผๅธฎๅฉไฝ ็่งฃ๏ผ
- ไธบไปไน้่ฆ้ฟๆ่ฎฐๅฟ๏ผ
- ๅฆไฝๅฎ็ฐๆ้ไธไธๆๅ ่ฝฝ๏ผ
- ๅฆไฝๅไธไธๆ็ฎก็ไธๅ็ผฉ๏ผ่ฃๅช + ๆ่ฆ๏ผ๏ผ
- ๆ่ฝ็ณป็ปๆไน่ฎพ่ฎกๆ่ฝๆฉๅฑ๏ผ
- ไธปๅจๅค้ๆบๅถ็็ๅฎๅฎ็ฐๆฏไปไน๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ OpenClaw Mini โ
โ (ๆฌ้กน็ฎ ยท ็ฒพ็ฎๆ ธๅฟ็) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Context โ โ Skills โ โ Heartbeat โ โ
โ โ Loader โ โ Manager โ โ Manager โ โ
โ โ โ โ โ โ โโโโโโโโโโโโโโโโโโโ โ โ
โ โ AGENTS.md โ โ SKILL.md โ โ โ HeartbeatWake โ โ โ
โ โ SOUL.md โ โ ่งฆๅ่ฏๅน้
โ โ โ (่ฏทๆฑๅๅนถๅฑ) โ โ โ
โ โ TOOLS.md... โ โ ๅ
็ฝฎ+่ชๅฎไน โ โ โโโโโโโโโโฌโโโโโโโโโ โ โ
โ โโโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโ โ โ โ โ
โ โ โ โ โโโโโโโโโโผโโโโโโโโโ โ โ
โ โ โ โ โ HeartbeatRunner โ โ โ
โ โ โ โ โ (่ฐๅบฆๅฑ) โ โ โ
โ โ โ โ โโโโโโโโโโฌโโโโโโโโโ โ โ
โ โ โ โโโโโโโโโโโโโผโโโโโโโโโโโโโโ โ
โ โ โ โ โ
โ โผ โผ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Agent Loop โ โ
โ โ โ โ
โ โ while (tool_calls) { โ โ
โ โ response = llm.generate(system_prompt + messages) โ โ
โ โ for (tool of tools) { result = tool.execute() } โ โ
โ โ messages.push(result) โ โ
โ โ } โ โ
โ โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ โ
โ โผ โผ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ Session โ โ Memory โ โ
โ โ Manager โ โ Manager โ โ
โ โ (JSONL) โ โ (ๅ
ณ้ฎ่ฏๆฃ็ดข) โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| ๅญ็ณป็ป | ๆฌ้กน็ฎ | OpenClaw ๆบ็ | ๆ ธๅฟ่่ดฃ |
|---|---|---|---|
| Session | session.ts |
src/agents/session-manager.ts |
ไผ่ฏๆไน ๅ (JSONL)ใๅๅฒ็ฎก็ |
| Memory | memory.ts |
src/memory/manager.ts (76KB) |
้ฟๆ่ฎฐๅฟใ่ฏญไนๆฃ็ดข |
| Context | context/loader.ts |
src/agents/bootstrap-files.ts |
ๆ้ๅ ่ฝฝ AGENTS/SOUL/TOOLS/IDENTITY/USER/HEARTBEAT/BOOTSTRAP/MEMORY |
| Skills | skills.ts |
src/agents/skills/ |
ๅฏๆฉๅฑๆ่ฝใ่งฆๅ่ฏๅน้ |
| Heartbeat | heartbeat.ts |
src/infra/heartbeat-runner.tssrc/infra/heartbeat-wake.ts |
ไธปๅจๅค้ใไบไปถ้ฉฑๅจ่ฐๅบฆ |
้ฎ้ข๏ผAgent ้ๅฏๅๅฆไฝๆขๅคๅฏน่ฏไธไธๆ๏ผ
OpenClaw ๆนๆก๏ผ
- JSONL ๆ ผๅผๅญๅจ๏ผๆฏ่กไธๆกๆถๆฏ๏ผ่ฟฝๅ ๅๅ ฅ๏ผ
- ๅๅธๅผ้้ฒๆญขๅนถๅๅๅ ฅ
- ่ชๅจ compaction ๅ็ผฉๅๅฒ
ๆฌ้กน็ฎๅฎ็ฐ (session.ts:45-62)๏ผ
async append(sessionId: string, message: Message): Promise<void> {
const filePath = this.getFilePath(sessionId);
await fs.mkdir(path.dirname(filePath), { recursive: true });
await fs.appendFile(filePath, JSON.stringify(message) + "\n");
}้ฎ้ข๏ผๅฆไฝ่ฎฉ Agent "่ฎฐไฝ"่ทจไผ่ฏ็ไฟกๆฏ๏ผ
OpenClaw ๆนๆก (src/memory/manager.ts)๏ผ
- SQLite-vec ๅ้ๆฐๆฎๅบๅ่ฏญไนๆ็ดข
- BM25 ๅๅ ณ้ฎ่ฏๆ็ดข
- ๆททๅๆๅบ (Hybrid Search)
ๆฌ้กน็ฎ็ฎๅ (memory.ts:85-118)๏ผ
async search(query: string, limit = 5): Promise<MemorySearchResult[]> {
const queryTerms = query.toLowerCase().split(/\s+/);
for (const entry of this.entries) {
let score = 0;
// ๅ
ณ้ฎ่ฏๅน้
ๅพๅ
for (const term of queryTerms) {
if (text.includes(term)) score += 1;
if (entry.tags.some(t => t.includes(term))) score += 0.5;
}
// ๆถ้ด่กฐๅ๏ผ่ถๆฐ็่ฎฐๅฟๅๆฐ่ถ้ซ
const recencyBoost = Math.max(0, 1 - ageHours / (24 * 30));
score += recencyBoost * 0.3;
}
}้ฎ้ข๏ผๅฆไฝๆณจๅ ฅ้กน็ฎ็บง่ง่่ไธๆฑกๆๆฏๆฌกๅฏน่ฏ๏ผ
OpenClaw ๆนๆก (src/agents/bootstrap-files.ts)๏ผ
AGENTS.md / SOUL.md / TOOLS.md / IDENTITY.md / USER.md / HEARTBEAT.md / BOOTSTRAP.mdMEMORY.md๏ผๆmemory.md๏ผไฝไธบ่ฎฐๅฟ่กฅๅ- ๅญไปฃ็ไป
ๅ
่ฎธ
AGENTS.md+TOOLS.md่ฟๅ ฅไธไธๆ - ่ถ ้ฟๆไปถๆ head+tail ๆชๆญๅนถๅ ๆ ่ฎฐ
ๆฌ้กน็ฎๅฎ็ฐ (context/loader.ts)๏ผ
async buildContextPrompt(params?: { sessionKey?: string }): Promise<string> {
const files = await this.loadBootstrapFiles(params);
const contextFiles = buildBootstrapContextFiles(files, { maxChars: this.maxChars });
// Project Context ่พๅบ๏ผๅซ SOUL.md ็นๆฎๆ็คบ๏ผ
}OpenClaw ๆนๆก๏ผ
src/agents/pi-extensions/context-pruning/*๏ผ่ฃๅชๅทฅๅ ท็ปๆใไฟ็ๆ่ฟไธไธๆsrc/agents/compaction.ts๏ผ่ถ ้ฟๅๅฒๆ่ฆๅ็ผฉ
ๆฌ้กน็ฎๅฎ็ฐ๏ผ
context/pruning.ts๏ผ่ฝฏ่ฃๅช tool_result + ไฟ็ๆ่ฟ assistantcontext/compaction.ts๏ผ่งฆๅ้ๅผๅ็ๆโๅๅฒๆ่ฆโๅนถๆณจๅ ฅ
้ฎ้ข๏ผๅฆไฝ่ฎฉ็จๆท่ชๅฎไน Agent ่ฝๅ๏ผ
OpenClaw ๆนๆก (src/agents/skills/types.ts)๏ผ
- SKILL.md frontmatter ๅฎไนๅ ๆฐๆฎ
- ๆฏๆ่งฆๅๆกไปถใๅฎ่ฃ ่ๆฌใๅๆฐๆ ก้ช
- ่ฟ่กๆถๅจๆๅ ่ฝฝ
ๆฌ้กน็ฎๅฎ็ฐ (skills.ts:125-170)๏ผ
// SKILL.md ๆ ผๅผ
// ---
// id: deploy
// name: ้จ็ฝฒๅฉๆ
// triggers: ["/deploy", "้จ็ฝฒ"]
// ---
// Prompt ๅ
ๅฎน...
async match(input: string): Promise<SkillMatch | null> {
for (const skill of this.skills.values()) {
for (const trigger of skill.triggers) {
if (input.startsWith(trigger)) {
return { skill, matchedTrigger: trigger };
}
}
}
}้ฎ้ข๏ผAgent ๅฆไฝ"ไธปๅจ"ๅทฅไฝ๏ผ่ไธๅชๆฏ่ขซๅจๅๅบ๏ผ
OpenClaw ๆนๆก (src/infra/heartbeat-runner.ts, src/infra/heartbeat-wake.ts)๏ผ
่ฟๆฏๆๅคๆ็ๅญ็ณป็ป๏ผๅ ๅซไธคๅฑๆถๆ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ HeartbeatWake (่ฏทๆฑๅๅนถๅฑ) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ ๅคๆฅๆบ่งฆๅ: โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ interval โ โ cron โ โ exec โ โ requestedโ โ
โ โ (ๅฎๆถๅจ) โ โ (ไปปๅกๅฎๆ)โ โ (ๅฝไปคๅฎๆ)โ โ (ๆๅจ) โ โ
โ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โ
โ โ โ โ โ โ
โ โโโโโโโโโโโโโโโดโโโโโโโฌโโโโโโโดโโโโโโโโโโโโโโ โ
โ โผ โ
โ request({ reason }) โ
โ โ โ
โ โโโโโโโโโผโโโโโโโโ โ
โ โ ๅๅ ไผๅ
็บงๅๅนถ โ โ
โ โ exec > cron โ โ
โ โ > interval โ โ
โ โโโโโโโโโฌโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโผโโโโโโโโ โ
โ โ schedule(250ms)โ โโโ ๅๅนถ็ชๅฃ โ
โ โโโโโโโโโฌโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ โ
โ โ if running: โ else: โ โ
โ โ scheduled= โ setTimeout โ โ
โ โ true (ๆ้) โ execute() โ โ
โ โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ HeartbeatRunner (่ฐๅบฆๅฑ) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ runOnce(request): โ
โ โ
โ 1. isWithinActiveHours() โโโ ๆดป่ทๆถ้ด็ชๅฃๆฃๆฅ โ
โ โ (08:00-22:00, ๆฏๆๆถๅบ) โ
โ โผ โ
โ 2. parseTasks() โโโ HEARTBEAT.md ่งฃๆ โ
โ โ โ
โ โผ โ
โ 3. ็ฉบๅ
ๅฎนๆฃๆต โโโ ๆ ไปปๅกๆถ่ทณ่ฟ API ่ฐ็จ โ
โ โ (exec ไบไปถ้คๅค) โ
โ โผ โ
โ 4. ๆง่กๅ่ฐ โโโ Agent ๅค็ไปปๅก โ
โ โ โ
โ โผ โ
โ 5. isDuplicateMessage() โโโ 24h ๅ
้ๅคๆถๆฏๆๅถ โ
โ โ โ
โ โผ โ
โ 6. scheduleNext() โโโ setTimeout ็ฒพ็กฎ่ฐๅบฆ โ
โ (lastRunAt + intervalMs) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ๅ ณ้ฎ่ฎพ่ฎกๅณ็ญ๏ผ
| ่ฎพ่ฎก็น | ไธบไปไน่ฟๆ ทๅ |
|---|---|
| setTimeout ่้ setInterval | ็ฒพ็กฎ่ฎก็ฎไธๆฌก่ฟ่กๆถ้ด๏ผ้ฟๅ ๆผ็งป |
| 250ms ๅๅนถ็ชๅฃ | ้ฒๆญขๅคไธชไบไปถๅๆถ่งฆๅๅฏผ่ด็"ๅผๅธๆฅไฟ" |
| ๅ้็ผๅฒ | ่ฟ่กไธญๆถๅฐๆฐ่ฏทๆฑไธไธขๅคฑ๏ผๅฎๆๅ็ซๅณๅค็ |
| ็ฉบๅ ๅฎนๆฃๆต | ๆ ไปปๅกๆถ่ทณ่ฟ LLM ่ฐ็จ๏ผ่็ๆๆฌ |
| ้ๅคๆๅถ | 24h ๅ ็ธๅๆถๆฏไธ้ๅคๅ้๏ผ้ฒๆญข"็บ ็ผ " |
| ๆดป่ทๆถ้ด็ชๅฃ | ้ฟๅ ๅๅคๆๆฐ็จๆท |
ๆฌ้กน็ฎๅฎ็ฐ (heartbeat.ts:147-160)๏ผ
private schedule(delayMs: number): void {
// ๅฆๆๅทฒๅจ่ฟ่ก๏ผๆ ่ฎฐไธบๅทฒๆ้๏ผๅ้็ผๅฒ๏ผ
if (this.state.running) {
this.state.scheduled = true;
return;
}
// ๅฆๆๅทฒๆๅฎๆถๅจ๏ผไธ้ๅค่ฎพ็ฝฎ๏ผๅๅนถ๏ผ
if (this.state.timer) {
return;
}
this.state.timer = setTimeout(() => this.execute(), delayMs);
}| ๆฌ้กน็ฎๆไปถ | OpenClaw ๅฏนๅบๆไปถ | ่ฏดๆ |
|---|---|---|
agent.ts |
src/agents/pi-embedded-runner/run.ts |
Agent Loop + run ็ๅฝๅจๆ |
session.ts |
src/agents/session-manager.ts |
JSONL ไผ่ฏๆไน ๅ |
memory.ts |
src/memory/manager.ts |
่ฎฐๅฟๆฃ็ดขๆ ธๅฟๆ่ทฏ |
context/loader.ts |
src/agents/bootstrap-files.ts |
Bootstrap ๆไปถๅ ่ฝฝ |
context/pruning.ts |
src/agents/pi-extensions/context-pruning/pruner.ts |
ไธไธๆ่ฃๅช |
context/compaction.ts |
src/agents/compaction.ts |
ๅๅฒๆ่ฆๅ็ผฉ |
skills.ts |
src/agents/skills/ |
ๆ่ฝ็ณป็ป |
heartbeat.ts |
src/infra/heartbeat-runner.tssrc/infra/heartbeat-wake.ts |
ไธปๅจๅค้ |
tools/*.ts |
src/tools/ |
ๅ ็ฝฎๅทฅๅ ทๆ ทไพ |
# ่ฟๅ
ฅ็ฎๅฝ
cd examples/openclaw-mini
# ๅฎ่ฃ
ไพ่ต
pnpm install
# ่ฎพ็ฝฎ API Key
export ANTHROPIC_API_KEY=sk-xxx
# ๅฏ้๏ผๆๅฎ agentId
export OPENCLAW_MINI_AGENT_ID=main
# ๅฏๅจไบคไบๅผๅฏน่ฏ
pnpm dev chatๆจกๆฟๆพๅจ examples/openclaw-mini/workspace-templates/๏ผๅ
ๅฎนๅ่ docs/reference/templates/ ็่ฎพ่ฎก๏ผ๏ผ่ฟ่กๆถไผไปๅฝๅๅทฅไฝๅบๆ น็ฎๅฝ่ฏปๅ่ฟไบๆไปถใ
้่ฆ็ๆๆถ๏ผๆๆจกๆฟๅคๅถๅฐๅทฅไฝๅบๆ น็ฎๅฝๅณๅฏ๏ผ
cp examples/openclaw-mini/workspace-templates/* examples/openclaw-mini/import { Agent } from "openclaw-mini";
const agent = new Agent({
apiKey: process.env.ANTHROPIC_API_KEY,
agentId: "main",
workspaceDir: process.cwd(),
enableMemory: true, // ้ฟๆ่ฎฐๅฟ
enableContext: true, // ไธไธๆๅ ่ฝฝ
enableSkills: true, // ๆ่ฝ็ณป็ป
enableHeartbeat: false, // ไธปๅจๅค้๏ผ้ป่ฎคๅ
ณ้ญ๏ผ
// ๅทฅๅ
ท็ญ็ฅไธๆฒ็ฎฑ๏ผ็คบๆ๏ผ
toolPolicy: { deny: ["exec"] },
sandbox: { enabled: true, allowExec: false, allowWrite: true },
});
// ๅบๆฌๅฏน่ฏ๏ผไผ ๅ
ฅ sessionId๏ผไผ่ชๅจ่กฅๅ
จไธบ sessionKey๏ผ
const result = await agent.run("session-1", "่ฏทๅๅบๅฝๅ็ฎๅฝ็ๆไปถ");
// ไฝฟ็จๆ่ฝ
const review = await agent.run("session-1", "/review src/agent.ts");
// ไนๅฏไปฅ็ดๆฅไฝฟ็จ sessionKey
const result2 = await agent.run("agent:main:session-1", "็ปง็ปญๅๆ็ไปปๅก");
// ๅฏๅจไธปๅจๅค้
agent.startHeartbeat((tasks, request) => {
console.log(`[${request.reason}] ๆฃๆตๅฐ ${tasks.length} ไธชๅพ
ๅไปปๅก`);
});่ฎฐๅฟไฝฟ็จๆ็คบ๏ผmini ็ๆนไธบโๅทฅๅ ทๅ่ฎฐๅฟโ๏ผๅจ็ณป็ปๆ็คบไธญๅผๅฏผๆจกๅๅ ่ฐ็จ
memory_searchๅmemory_getๆๅ็ป่ใ
ๅญไปฃ็๏ผๅฏ้่ฟ
sessions_spawnๅทฅๅ ทๅฏๅจๅๅฐๅญไปฃ็๏ผๅฎๆๅไผๅจ CLI ่พๅบๆ่ฆ๏ผๅนถๅๅ ฅ็ถไผ่ฏ่ฎฐๅฝใ
- ๅ
่ฏป
agent.ts๏ผ็่งฃ Agent Loop ๅๅญ็ณป็ปๆดๅ - ๅ่ฏป
heartbeat.ts๏ผ่ฟๆฏๆๅคๆ็้จๅ๏ผ็่งฃไบไปถ้ฉฑๅจๆถๆ - ๅฏน็ ง OpenClaw ๆบ็ ๏ผ้ช่ฏ็ฎๅ็ๆฏๅฆๆไฝไบๆ ธๅฟ
- ๅฐ่ฏๆฉๅฑ๏ผๆทปๅ ๆฐ็ๆ่ฝใๅทฅๅ ทใๆๆน่ฟ่ฎฐๅฟๆฃ็ดข
-
ไธไธๆ็ๆไปถๅ็ปๆ
- OpenClaw๏ผ
src/agents/workspace.ts๏ผbootstrap ๆไปถๆธ ๅ๏ผ - Mini๏ผ
openclaw-mini/src/context/bootstrap.ts
- OpenClaw๏ผ
-
็ปไธๆณจๅ ฅ้พ่ทฏ๏ผProject Context๏ผ
- OpenClaw๏ผ
src/agents/system-prompt.ts - Mini๏ผ
openclaw-mini/src/context/loader.ts
- OpenClaw๏ผ
-
่งๆจกๆงๅถ๏ผๆชๆญ + ่ฃๅช๏ผ
- OpenClaw๏ผ
src/agents/pi-embedded-helpers/bootstrap.ts+src/agents/pi-extensions/context-pruning/pruner.ts - Mini๏ผ
openclaw-mini/src/context/bootstrap.ts+openclaw-mini/src/context/pruning.ts
- OpenClaw๏ผ
-
ๅ็ผฉ็ปงๆฟ๏ผๆ่ฆ๏ผ
- OpenClaw๏ผ
src/agents/compaction.ts - Mini๏ผ
openclaw-mini/src/context/compaction.ts
- OpenClaw๏ผ
MIT