OpenClaw 核心运行流程


一、全局总览

Memory 管理

Pi Coding Agent

Queue 并发控制

Session Store

Channel (以 Telegram 为例)

StartGatewayServer: httpServer + WebSocketServer

true

false

bot.on('message')

bot.api.sendMessage

format message

register

deliverReplies

dispatchTelegramMessage

loadSessionStore(sessionKey)

isCliProvider?

runCliAgent
(such as claude code)

runEmbeddedPiAgent

enqueueCommandInLane

runEmbeddedAttempt

Agent Session

变更触发 sync

indexFile

混合检索 hybrid search


二、会话管理 (Session Management)

会话是 Agent 与用户交互的持久化单元,一个 sessionKey 对应一个 session 文件。

Session 文件存储 (src/config/sessions/paths.ts)

sessionKey 生成规则 (src/routing/session-key.ts)

update session

Session 更新机制

产生新的sessionId

配置变更触发清场

Session Store 缓存 TTL: 45秒
(DEFAULT_SESSION_STORE_TTL_MS)

Agent Loop (单次会话)

UserMessage
我要查今天各地天气

Tool Call
weather(杭州)

AI Message
杭州的天气是...

UserMessage
今天风大吗...

AI Message
今天风挺大...

私聊: agent:{agentId}:{mainKey}

群聊: agent:{agentId}:{channel}:{peerKind}:{peerId}

子Agent: 含 :subagent: 前缀标记

~/.openclaw/agents/{agentId}/sessions/

sessions.json
(sessionKey → SessionEntry)

{sessionId}.jsonl
每个session的Agent对话, 工具调用数据

sessionKey 格式src/routing/session-key.ts:127buildAgentPeerSessionKey()):

dmScope格式
mainagent:{agentId}:main
per-peeragent:{agentId}:direct:{peerId}
per-channel-peeragent:{agentId}:{channel}:direct:{peerId}
per-account-channel-peeragent:{agentId}:{channel}:{accountId}:direct:{peerId}
群聊agent:{agentId}:{channel}:{peerKind}:{peerId}

文件路径src/config/sessions/paths.ts):

  • sessions.json(第 34 行 resolveDefaultSessionStorePath()):sessionKey → SessionEntry 映射
  • {sessionId}.jsonl(第 248 行):每个 session 的完整 Agent 对话和工具调用数据

三、Session Store 与执行分叉

true (claude-cli, codex-cli
或自定义 cliBackends)

false

Session Store 本地持久化

~/.openclaw/agents/{agentId}/sessions/

sessions.json

{sessionId}.jsonl

sessionKey → sessionId 映射

loadSessionStore(sessionKey)
src/config/sessions/store.ts:195

isCliProvider?
src/agents/model-selection.ts:76

runCliAgent
src/agents/cli-runner.ts

runEmbeddedPiAgent
src/agents/pi-embedded.ts

enqueueCommandInLane
src/process/command-queue.ts:168

runEmbeddedAttempt
src/agents/pi-embedded-runner/run/attempt.ts

代码映射

  • loadSessionStore()src/config/sessions/store.ts:195,返回 Record<string, SessionEntry>,带 45 秒 TTL 缓存
  • isCliProvider()src/agents/model-selection.ts:76,检查 claude-clicodex-cli 或自定义 cliBackends
  • 分叉判断 → src/agents/agent-command.ts:357

四、Queue 并发控制

Queue 解决并发消息处理问题。session 并发度为 1(maxConcurrent: 1),全局并发度默认为 4。

Queue mode: steer

转向(steer)消息插入

UserMessage
查询杭州天气

LLM

Tool Call
weather(杭州)

UserMessage
买了一下天津

Tool Call
weather(上海)

AI Message
上海天气是...

Queue mode: collect/followup

UserMessage 查询杭州天气

UserMessage 买了一下天津

UserMessage 再查一下天津

LLM

Tool Call
weather(杭州)

AI Message
杭州的天气是...

UserMessage
买了
买一下天津

LLM

Tool Call
weather(天津)

AI Message
天津天气是...

消息排队/收集

QueueSettings (src/auto-reply/reply/queue/types.ts:13)

mode: QueueMode

debounceMs: 可选, 默认1000ms

cap: 队列长度限制

dropPolicy: 'old' | 'new' | 'summarize'

Queue Modes (src/auto-reply/reply/queue/types.ts:9)

collect: 把所有排队的message合成一个

followup: 等上一个消息处理完毕

steer: 在工具调用之间, 插入新消息

steer-backlog: 立即注入 + 保留后续

interrupt: 中断当前运行

queue: 标准排队

代码映射

  • enqueueCommandInLane()src/process/command-queue.ts:168
  • QueueSettingssrc/auto-reply/reply/queue/types.ts:13
  • Session 并发度 → src/process/command-queue.ts:71maxConcurrent: 1
  • 全局并发度 → setCommandLaneConcurrency()src/process/command-queue.ts:161,默认 4)

五、Pi Coding Agent (Agent Session)

Agent Session

输入

Skills (仓库根目录 skills/)

github

discord

coding-agent

canvas

clawhub

... (55+ skills)

Tools Policy 逐层策略 (src/agents/pi-tools.policy.ts:233-350)

1. profile (minimal/coding/messaging/full)

2. global (cfg.tools)

3. agent (cfg.agents[id].tools)

4. provider (per-provider config)

5. group/peer

6. sandbox (subagent)

Tools 工具分类 (src/agents/tool-catalog.ts:27-251)

fs: read, write, edit, apply_patch

runtime: exec, process

web: web_search, web_fetch

memory: memory_search, memory_get

sessions: sessions_list, sessions_history,
sessions_send, sessions_spawn, subagents

ui: browser, canvas

messaging: message

automation: cron, gateway

media: image, image_generate, tts

plugin tools / channel tools

输出 (src/agents/pi-embedded-subscribe.types.ts)

Query

onToolResult

onBlockReply

onPartialReply

onReasoningStream / onReasoningEnd

onAgentEvent

runEmbeddedAttempt
src/agents/pi-embedded-runner/run/attempt.ts

Agent Session
(@mariozechner/pi-coding-agent)

prompt()

subscribeEmbeddedPiSession()
src/agents/pi-embedded-subscribe.ts:34

Tools

Skills

SystemPrompt

LLM

Tools Output

代码映射

  • runEmbeddedAttemptsrc/agents/pi-embedded-runner/run/attempt.ts
  • createOpenClawCodingTools()src/agents/pi-tools.ts:198
  • buildEmbeddedSystemPrompt()src/agents/pi-embedded-runner/system-prompt.ts
  • subscribeEmbeddedPiSession()src/agents/pi-embedded-subscribe.ts:34(独立函数,非 session 方法)
  • 回调类型 → src/agents/pi-embedded-subscribe.types.ts:20-31
  • 工具目录 → src/agents/tool-catalog.ts:27-251(10 大类,25+ 工具)
  • 策略解析 → src/agents/pi-tools.policy.ts:233-350(6 层逐级覆盖)
  • Skills 目录 → 仓库根目录 skills/,扩展级 extensions/*/skills/

六、Memory 管理

写入 SQLite 表 (manager-embedding-ops.ts:875-920)

索引流水线 (src/memory/manager-embedding-ops.ts:803)

Sync 操作 (src/memory/manager-sync-ops.ts)

true

true

分块配置

chunkTokens: 默认400 (tokens × 4 = maxChars)

chunkOverlap: 默认80 tokens

embedding_cache表缓存避免重复计算

emitSessionTranscriptUpdate
(src/sessions/transcript-events.ts:16)

Session更新 → 同步通知所有监听器

函数本身无debounce, 同步执行
Memory watch debounce: 1500ms
(DEFAULT_WATCH_DEBOUNCE_MS)

Memory 写入机制 (src/auto-reply/reply/memory-flush.ts)

shouldRunMemoryFlush() :170
(session 自动压缩时触发)

prompt: 记忆块, 过往历史, 今天日期, 分类
agent使用read_file, write_file保存记忆
sessionFlush: /new 时session提取存储

resolveMemoryFlushRelativePathForRun() :59
→ memory/{YYYY-MM-DD}.md

MEMORY.md + memory/*.md

MEMORY.md

memory/{YYYY-MM-DD}.md

变更触发 sync (src/agents/memory-search.ts:55-66)

onSessionStart

onSearch

watch (文件系统监听)

sessions.deltaBytes / sessions.deltaMessages
(变更字节数或消息数超过阈值)

syncMemoryFiles() :696

syncSessionFiles() :787

sources.has('memory')

sources.has('sessions')

indexFile() :803

计算文件hash判断是否变更
(manager-sync-ops.ts:740 record?.hash === entry.hash)
Session: 只保留role=user和role=assistant的消息

chunkMarkdown()
src/memory/internal.ts:334

embedChunksWithBatch()
src/memory/manager-embedding-ops.ts:268

清除已删除文件的数据

chunks 表 :875
(原文 + embedding JSON)

chunks_vec 表 :902
(sqlite-vec 向量索引)

chunks_fts 表 :907
(FTS5 全文索引)

代码映射

  • syncMemoryFiles()src/memory/manager-sync-ops.ts:696
  • syncSessionFiles()src/memory/manager-sync-ops.ts:787
  • indexFile()src/memory/manager-embedding-ops.ts:803(非 manager-sync-ops.ts)
  • chunkMarkdown()src/memory/internal.ts:334
  • embedChunksWithBatch()src/memory/manager-embedding-ops.ts:268(按提供商路由:OpenAI/Gemini/Voyage/通用批处理)
  • 写入 3 张表:chunks(第 875 行)、chunks_vec(第 902 行)、chunks_fts(第 907 行)

七、混合检索 (Hybrid Search)

SQLite 表结构 (src/memory/memory-schema.ts)

memoryTools (src/agents/tools/memory-tool.ts)

MemoryGet 工具 (src/agents/tools/memory-tool.ts:135)

memory_get(path, from, lines)

readFile

text.slice(startLine, endLine)
可根据需要get到完整chunk

向量检索 (src/memory/manager-search.ts:20-94)

语义检索, 查询chunks_vec

vec_distance_cosine() 余弦距离
降级: 内存逐一计算

关键词检索 (src/memory/manager-search.ts:136-191)

精确搜索: W1 AND W2...
buildFtsQuery() Unicode分词

查询chunks_fts表
bm25计算分数 → bm25RankToScore()

memory_search :86
search(query)

embedQuery(query)

memory_get :135
获取完整记忆文本

table: files

table: chunks

table: chunks_vec
(sqlite-vec 虚拟表)

table: chunks_fts
(FTS5 虚拟表)

table: embedding_cache

searchKeyword()
src/memory/manager.ts:395

searchVector()
src/memory/manager.ts:369

mergeHybridResults()
src/memory/hybrid.ts:57-155

hybridScore = vectorWeight * vectorScore
+ textWeight * textScore
(默认 0.7 / 0.3)

可选后处理:
MMR多样性重排 (src/memory/mmr.ts)
时间衰减 (src/memory/temporal-decay.ts)

过滤: minScore=0.35, maxResults=6

返回结果:
path, startLine, endLine,
score, snippet, source

代码映射

  • memory_search 工具 → src/agents/tools/memory-tool.ts:86
  • memory_get 工具 → src/agents/tools/memory-tool.ts:135
  • searchKeyword()src/memory/manager.ts:395(调用 manager-search.ts:136
  • searchVector()src/memory/manager.ts:369(调用 manager-search.ts:20
  • mergeHybridResults()src/memory/hybrid.ts:57
  • 融合公式:hybridScore = vectorWeight × vectorScore + textWeight × textScore(默认 0.7 / 0.3)
  • 可选后处理:MMR(src/memory/mmr.ts)、时间衰减(src/memory/temporal-decay.ts
  • 默认阈值:minScore = 0.35maxResults = 6

八、完整调用链路一览

从一条 Telegram 消息到 AI 回复,完整经过以下环节:

1. Telegram
bot.on('message')

2. Gateway
format + register

3. Session Store
loadSessionStore

4. Queue
enqueueCommandInLane

5. Agent
runEmbeddedAttempt

6. Pi Agent
prompt() → LLM

7. Tools/Skills
exec, search, etc.

8. Memory
memory_search

9. Reply
onBlockReply

10. Deliver
deliverOutboundPayloads

步骤文件函数
1. Channel 接收extensions/telegram/src/monitor.tsmonitorTelegramProvider()
2. Gateway 分发src/gateway/server.impl.tsstartGatewayServer()
3. Session 加载src/config/sessions/store.ts:195loadSessionStore()
4. Queue 入队src/process/command-queue.ts:168enqueueCommandInLane()
5. Agent 执行src/agents/pi-embedded-runner/run/attempt.tsrunEmbeddedAttempt()
6. LLM 调用@mariozechner/pi-coding-agentactiveSession.prompt()
7. 工具执行src/agents/pi-tools.ts:198createOpenClawCodingTools()
8. 记忆检索src/memory/manager.ts:259search()mergeHybridResults()
9. 回复分发src/auto-reply/reply/reply-dispatcher.ts:113createReplyDispatcher()
10. 出站投递src/infra/outbound/deliver.ts:479deliverOutboundPayloads()

九、源码验证勘误表

以下为原图与实际代码的差异,已在本文档中修正:

原图内容实际代码验证位置
session.jsonsessions.json(复数)src/config/sessions/paths.ts:34
debounceMs: 60Session Store TTL = 45 秒src/config/sessions/store.ts:52
subagents session: 60秒子 Agent 使用 :subagent: 前缀,未找到 60 秒值src/sessions/session-key-utils.ts:77
session_deltasessions.deltaBytes + sessions.deltaMessagessrc/agents/memory-search.ts:62-63
sources.has('session')sources.has('sessions')(复数)src/memory/manager-sync-ops.ts:435
subscribe()subscribeEmbeddedPiSession()(独立函数)src/agents/pi-embedded-subscribe.ts:34
emitSessionTranscriptUpdate debounceMs: 1500函数同步无 debounce;1500 是 memory watch 的 debouncesrc/sessions/transcript-events.ts:16
indexFile 在 manager-sync-ops实际在 manager-embedding-ops.ts:803src/memory/manager-embedding-ops.ts
Queue 3 种模式实际 6 种:collect/followup/steer/steer-backlog/interrupt/queuesrc/auto-reply/reply/queue/types.ts:9
Tools Policy 5 层实际 6 层:增加 provider 层src/agents/pi-tools.policy.ts:253-262
openclaw/skills仓库根目录 skills/(55+ skills)skills/ 目录
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐