Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Timeflys2018/pyclaw

Repository files navigation

🐍 PyClaw

生产级 Python AI Agent 框架 — 4 层持久化记忆 · Hook 驱动架构 · 存算分离

中文(当前) · English · 📚 公众号 Time留痕 文章合集 →

License Python Tests Memory FTS5 Channels OpenAI Compat


PyClaw Web Channel


🎯 定位

团队自己的 AI Agent — 住在你团队聊天的地方,有可复利的记忆,有可衡量的进化,有企业级的隔离。

大多数 AI agent 每次对话都从空白起步:用户不停重复上下文、重复约定、重复工具栈。PyClaw 押注相反方向:一个嵌入团队沟通平台的 agent,跨周记忆,自动学会团队反复执行的 playbook,按团队的审批流程运行。

四条设计承诺

  • 🧠 记忆是 tier-zero,不是插件。 会话、事实、流程、向量归档 — 四层 L1-L4 记忆,全部进 agent 主循环,每轮都检索。中文 FTS5 + jieba 分词原生支持,30 天预警 + 90 天归档生命周期由 Curator 异步执行,分布式安全。少了这一层,剩下的只是套壳。
  • 📈 agent 越用越有用**,不是越用越话多。** 成功会话自动抽取 SOP;高频 SOP 自动毕业为可复用 SKILL.md(v2 支持版本演进,旧版进 skill_history/);过时的由 agent 主动 forget。无需微调,无 vendor lock。14 个 byte-stability 测试为"90%+ prompt cache 命中"背书,不只是宣传。
  • 💬 群内原生,不是 IDE 原生。 飞书 CardKit + Web React SPA 共用同一个 agent 内核,Session Affinity Gateway 支持 active-active 多 worker 水平扩展(Redis 亲和注册 + PubSub 跨 worker 转发,3-worker 真机 smoke 验证通过)。设计师、PM、运维跟工程师对同一个 agent,不切换 surface。
  • 🛡 企业级治理是地板,不是 enterprise 加价项。 三档权限(read-only / approval / yolo)+ per-user profile + Anthropic srt 真 OS 沙箱(macOS Seatbelt / Linux bubblewrap+seccomp,8 条架构不变量 + fail-closed)+ 结构化 JSON 审计 + 飞书 originator-only CardKit。开箱即用,第一天就能跑。

PyClaw 在 agent 版图里的位置 — 以及不在的位置

2026 年的 agent 版图分化为四条路径,各自押注不同象限:

路径 代表项目 优化目标 致命短板
IDE 编程 agent Claude Code · Cursor · OpenCode · Aider 单个开发者 + 单个编辑器 + 深度代码理解 没有团队记忆,没有审批
OAuth 个人助手 OpenHuman (21k★, 3 个月) 100+ OAuth 预接入服务把冷启动时间压到几分钟 desktop-only,无 server 形态,企业 IT 不允许接 118 个外部 OAuth
自我进化学习型 agent Hermes (Nous Research, 160k★) agent 持续重写自己的 skill 库(自我进化最深) 单 gateway 假设,没有 server 多 worker 水平扩展
团队级企业 agent PyClaw 团队累积 institutional memory,沙箱 + 审计 + 多 channel 开箱即用 冷启动靠对话积累(不接 OAuth),自我进化深度不及 Hermes

PyClaw 走第 4 条路。 我们不跟 Claude Code 比 IDE 抛光、不跟 OpenHuman 比 OAuth 数量、不跟 LangGraph 比 graph-state runtime。我们竞争一句话:团队有自己的 institutional memory,agent 是这个团队的一员。

反向校准 — PyClaw 已经领先的六个维度

调研完 OpenClaw / Hermes / OpenHuman 三家后的诚实结论(详见 B1 公众号文章对比表):

维度 OpenClaw Hermes OpenHuman PyClaw
多 worker 水平扩展 ✅ 多实例 ❌ 单 gateway ❌ desktop-only ✅ Session Affinity Gateway + PubSub 转发
企业级 OS 沙箱 ❌ 无内置 ⚠️ container ⚠️ Landlock + bwrap ✅ Anthropic srt + 8 条不变量 + fail-closed
中文 FTS ✅ FTS5 + jieba + 停用词 + trigram→jieba 自动迁移
企业工具审批 ✅ CardKit ⚠️ command list ❌ 仅桌面弹窗 ✅ Web modal + 飞书 CardKit + originator-only + 三档权限
跨生态 Skill 发现 ⚠️ 自家 ✅ agentskills.io ⚠️ 自家 + QuickJS ✅ 7 层 discovery(跨读 Claude Code / OpenCode / Crush / Cursor 等)
测试规模 N/A ⚠️ 部分 e2e ⚠️ 部分 e2e 2749 单元/集成 + 13 真 LLM E2E

适合 / 不适合

  • 适合你:住在飞书或 Web console 的工程 / 运维 / 产品团队,每周重复某些工作流,需要一个用越久越懂团队、不会跨租户泄露秘密、有审计可追溯的 agent。
  • 不是你的工具:单兵开发者想要最深的 IDE 集成(用 Claude Code / Cursor);想要第一天就懂你邮件 / 日历的个人助手(用 OpenHuman);任意 multi-agent DAG 编排框架(用 LangGraph)。

四条路径的 6,000 字深度对比(含源码级证据 + 5 个借鉴招式 + 反向校准)见公众号文章:OpenClaw / Hermes / OpenHuman / PyClaw 四种 Agent 架构路径


✨ 为什么做 PyClaw?

OpenClaw 是一个优秀的多通道 AI 助手 — 但它的 TypeScript 单体(17,000+ 文件)将计算和存储紧耦合,且缺少生产级的记忆系统。PyClaw 用 Python 从头重写,定位 记忆优先 · Hook 驱动 · 水平可扩展:

  • 🧠 4 层记忆系统 — L1 Redis 热索引 → L2 事实 → L3 流程 → L4 向量归档。生产级,已完整集成到 Agent 主循环。
  • 🔄 自我进化 — 自动从会话中提取 SOP、生命周期管理(30 天预警 / 90 天归档)、Agent 可主动遗忘过时流程、高频 SOP 自动毕业为 Skill。Skill graduation v2 让改进版 SOP 可以原子替换旧的 auto_generated SKILL.md(旧版备份到 skill_history/)。无需微调。
  • 🪝 Hook 驱动架构 — 记忆注入、Working Memory、Nudge 提醒、工具审批、输出压缩 — 全部以 Hook 形式接入。可自定义扩展,不动核心。
  • ☁️ 存算分离 — 计算层完全无状态,可水平扩展。Session 在 Redis,记忆在 SQLite/Redis,向量经 litellm。
  • 🌐 多渠道接入 — 飞书 WebSocket 集群 + Web 渠道(React SPA + OpenAI 兼容 /v1/chat/completions SSE)。
  • 🚦 Session 亲和网关 — Active-active 多 worker 水平扩展,Redis 亲和注册 + PubSub 跨 worker 转发。同一 session 永远落同一 worker,不论飞书/LB 怎么 dispatch。Worker 死亡时通过 TTL + PUBLISH-0 检测自动 failover。
  • 🇨🇳 中文优化 — FTS5 + jieba 分词,支持中文全文检索。停用词过滤,trigram → jieba 自动迁移。
  • 🎯 Prompt 预算工程 — Frozen Prefix(可缓存)+ Per-Turn Suffix(动态)+ Dynamic Zone(按 prompt 检索)。14 个 byte-stability invariant 测试证明"90%+ prompt 缓存命中"是可验证事实,不是宣传(OpenHuman KV-cache invariant 的 clean-room 借鉴)。
  • 🗜 工具输出压缩器 — 在 tool result 进入 LLM history 之前用 4 策略管线(strip_ansi / regex_replace / collapse_whitespace / head_tail)规则压缩。8 条 builtin 规则覆盖 git diff/log/status / pytest / npm/pip install / docker / web_fetch。bash-heavy session 节省 ~30-50% 输入 token。借鉴 OpenHuman TokenJuice(clean-room 重实现,OpenHuman 是 GPL-3.0)。
  • 🛡 智能审批(无审批疲劳)bash_approval_mode: "smart" 自动放行 cat/ls/git status/python -c 等 ~50 个 read 命令,写命令仍然弹审批。审批是 UX 层,不是安全层;安全由 srt 沙箱兜底。
  • 🤖 Sub-Agent 系统 — Markdown manifest + isolated executor + 8 条架构不变量(沙箱/tier/abort/workspace/memory 继承是结构性的,不是 runtime 检查)。5 层 discovery,license-clean(零 bundled persona),用户自带。omit_memory_context / omit_skills_catalog / omit_working_memory toggle 让 token-economy 专用 agent(如 summarizerreviewer)省 token。

🚀 快速开始

超出 2 分钟上手范围? 跳到 § 配置 & 部署 查阅完整指南:本地 dev、单实例 Docker、3-worker active-active、多用户隔离、沙箱、MCP 服务器、工具审批。

作为飞书机器人 — 2 分钟

git clone https://github.com/Timeflys2018/pyclaw.git && cd pyclaw
python3.12 -m venv .venv && .venv/bin/pip install -e ".[dev]"
# 在 configs/pyclaw.json 配置飞书 App 凭证
./scripts/start.sh

📖 更多:完整 pyclaw.json schema 见 配置参考, 或直接复制 configs/pyclaw.example.json。生产单实例部署:部署指南 § 单 Docker

作为 Web Agent — 2 分钟

./scripts/start.sh # 启动后端 + 自动构建 React 前端
open http://localhost:8000 # 登录(默认 admin / changeme)

Web 渠道开箱即用:流式聊天(含执行轨迹面板:工具调用 + 记忆命中 + token 用量) · 多模态输入(粘贴 / 拖拽 / 选择图片) · ⌘K 命令面板 · 全局快捷键 · 会话重命名 + 删除 · 双主题(明暗) · 工具审批 UI · OpenAI 兼容 API(可对接第三方客户端)。

📖 更多:调整三档权限模型(read-only / approval / yolo)见 权限指南。挂 MCP 服务器(GitHub、filesystem 等)见 MCP 指南。多用户团队部署 + per-user tier 隔离见 多用户部署

作为库使用

from pyclaw.core.agent.factory import build_agent_runner
from pyclaw.infra.settings import load_settings
settings = load_settings("configs/pyclaw.json")
runner = build_agent_runner(settings)
async for event in runner.run("帮我看一下这个 Python 报错..."):
 print(event)

📖 更多:Settings 类型、Hook、Agent 主循环 API 见 架构决策(D1–D26)和 Context Engine


🧠 记忆系统(核心特性)

记忆系统是一个 4 层流水线,集成到每一次 Prompt 拼装:

flowchart LR
 User["用户提问"] --> L1["L1: Redis<br/>Working Memory<br/>(按 session)"]
 User --> L2["L2: SQLite + FTS5<br/>事实<br/>(jieba 分词)"]
 User --> L3["L3: SQLite + FTS5<br/>流程 / SOP"]
 User --> L4["L4: SQLite + sqlite-vec<br/>会话归档"]
 L1 -.snapshot.-> Prompt["Frozen Prefix"]
 L2 -.facts ≤3.-> Dynamic["Dynamic Zone"]
 L3 -.procedures ≤2.-> Dynamic
 L4 -.语义检索.-> Dynamic
 Prompt --> Agent[Agent 主循环]
 Dynamic --> Agent
 style L1 fill:#fff3e0,stroke:#e65100
 style L2 fill:#e8f5e9,stroke:#2e7d32
 style L3 fill:#e8f5e9,stroke:#2e7d32
 style L4 fill:#e3f2fd,stroke:#1565c0
Loading

驱动它的 Hook(不修改 LLM 侧):

Hook 作用
WorkingMemoryHook 每轮注入 <working_memory> XML(按 session 的 Redis KV)
MemoryNudgeHook 每 10 轮提醒 Agent:"考虑使用 memorize"。使用后计数器归零
archive_session_background /new 时把旧 session 异步归档到 L4 + 向量化(不阻塞)
ContextEngine.assemble 按用户提问检索 L2/L3,注入 Top-K 事实 + 流程

Agent 自己调用的工具:

  • memorize — 持久化到 L2(事实)或 L3(流程)。"无执行不写入"原则。
  • forget — 归档过时/失败的 SOP。Agent 主动的生命周期管理。
  • update_working_memory — 按 session 的临时记事本(1024 字符上限,7 天 TTL,FIFO 淘汰)。
  • skill_view — 渐进式披露:按需加载完整 SKILL.md 内容。

🔄 自我进化(新功能!)

PyClaw 的 Agent 能自我改进 — 无需微调、无需重训:

flowchart LR
 subgraph Extract["1. 提取"]
 A[任务] --> B[Tracker Hook]
 B --> C{Session 结束?}
 C -->|阈值满足| D[LLM 提取]
 D --> E[去重 + 写入 L3]
 end
 subgraph Curate["2. 维护"]
 E --> F[Search 命中<br/>递增计数]
 F --> G{90天未用?}
 G -->|是| H[归档]
 I[forget 工具] --> H
 end
 subgraph Graduate["3. 毕业"]
 F --> J{计数 ≥ 5<br/>存活 ≥ 7天?}
 J -->|是| K[SKILL.md]
 K --> L[skill_view]
 end
 style Extract fill:#e8f5e9,stroke:#2e7d32
 style Curate fill:#fff3e0,stroke:#e65100
 style Graduate fill:#e3f2fd,stroke:#1565c0
Loading

进化时间线:

时间 发生什么
第 1 天 Agent 正常执行任务
第 7 天 从成功会话中自动提取可复用 SOP
第 30 天 未使用的 SOP 标记为 stale(仍可用,CLI 可见)
第 60 天 Agent 发现过时 SOP 时主动调 forget 归档
第 90 天 Curator 自动归档仍未使用的 SOP
第 90+ 天 高频 SOP 毕业为 SKILL.md(渐进式披露加载)

核心设计思想:

  • 严格拒绝 — 宁可不学也不学错
  • stale 是计算属性 — 不写 DB,search 逆转完全自动
  • 确定性 + Agent 驱动 — Curator 管时间衰减;forget 管质量判断
  • 分布式安全 — Redis SETNX 保证多实例只有一个 Curator 运行

🏛 架构图

graph TB
 subgraph Channels["🌐 通道"]
 CH[飞书 WebSocket · Web WS · OpenAI SSE]
 end
 subgraph Compute["☁️ 计算层 — 无状态 Worker"]
 direction TB
 Runner["Agent Runner · ~1100 行单循环<br/>Frozen Prefix · Per-Turn Suffix · Prompt 预算"]
 Tools["工具: bash · read · write · edit · grep · glob · web_fetch<br/>memorize · forget · update_working_memory · skill_view"]
 Hooks["Hook: WorkingMemory · MemoryNudge · ToolApproval · SopTracker"]
 CE["Context Engine: assemble + 记忆检索 + compact"]
 Infra["基础设施: TaskManager · Curator · Skill Graduation · Settings"]
 end
 subgraph Storage["💾 存储层"]
 direction TB
 Redis[("Redis<br/>Sessions · 分布式锁 · L1 索引 · Working Memory")]
 Memory[("SQLite + FTS5 + jieba<br/>L2 事实 · L3 流程")]
 Vec[("sqlite-vec<br/>L4 会话归档")]
 Embed["Embedding API · litellm"]
 end
 CH --> Runner
 Runner --> Tools
 Runner --> Hooks
 Runner --> CE
 Hooks --> Redis
 CE --> Memory
 CE --> Vec
 CE --> Embed
 Infra --> Redis
 style Channels fill:#e3f2fd,stroke:#1565c0
 style Compute fill:#f3e5f5,stroke:#6a1b9a
 style Storage fill:#e8f5e9,stroke:#2e7d32
Loading

📊 当前状态

模块 状态 亮点
Agent Core ~1100 行单循环、11 个内置工具(Tier 2:web_fetch / grep / glob)、Hook 系统、5 文件压缩子系统、frozen-prefix byte-stability invariant
记忆系统 4 层(L1/L2/L3/L4)、FTS5 + jieba、sqlite-vec、trigram → jieba 自动迁移
上下文引擎 Frozen/Per-Turn 拆分、记忆检索、L1 snapshot、Prompt 预算
会话存储 Redis(生产)+ InMemory(开发)、SessionKey/SessionId 轮换、DAG 树
飞书渠道 WebSocket 集群(最多 50 worker)、CardKit 流式、斜杠命令
Web 渠道 React 19 SPA · Linear/Cursor 视觉 · 执行轨迹 · 多模态 · ⌘K 命令面板 · 键盘快捷键 · 会话 CRUD · OpenAI 兼容 SSE · JWT 认证 · 工具审批 modal + 三档权限 (read-only / approval / yolo)
工具审批 端到端接通: WebToolApprovalHook + 飞书 CardKit 交互卡片 (originator-only 授权) · per-turn 切档 · 结构化 JSON audit log。见权限指南
MCP 客户端 stdio 服务器 · {server}:{tool} 命名空间 · 信任级别映射含 operator override(仅可降级)· /mcp list / restart / logs · 非阻塞启动 + /health advisory · {env:VAR} 密钥占位符。见 MCP 指南
Skill Hub ClawHub 兼容、渐进式披露、7 层目录发现(含 .claude/skills/ 跨生态读)pyclaw-skill CLI。见 skill-hub-compatibility.md
内置 Tier 2 工具 进程内 web_fetch(httpx + markdownify)、grep(Python re,沙箱友好)、glob(按 mtime 排序)、可选 fetch_mcp_resource。全部 tool_class="read",在 bash 被拒的 tier=read-only 下仍能用。见 builtin-tools.md
Prompt 工程 PromptBudgetConfig、Frozen 缓存、优先级截断
TaskManager 集中式异步任务生命周期、K8s 级优雅关闭
自我进化 SOP 提取 + Curator 生命周期(30d/90d)+ ForgetTool + Skill Graduation v2 (可版本演进) + CLI
Session 亲和网关 Active-active 多 worker 水平扩展、Redis 亲和注册 + PubSub 转发、PUBLISH-0 检测自动 failover
子代理系统 5 层 discovery、.md + frontmatter 清单、独立上下文窗口、tier/sandbox/memory 继承、depth-1 限制、/agents 斜杠命令。MIT 许可清洁(零打包 persona)。omit_memory_context / omit_skills_catalog / omit_working_memory toggle 用于 token-economy 专用。见子代理指南
工具输出压缩器 4 策略管线(strip_ansi / regex_replace / collapse_whitespace / head_tail),8 条 builtin 规则覆盖 git/pytest/npm/pip/docker/web_fetch。enable_output_compression: true 默认开启,bash-heavy session 节省 ~30-50% 输入 token。借鉴 OpenHuman TokenJuice (clean-room)。
智能审批 (UX 层) bash_approval_mode: "smart" 自动放行 ~50 个 read 命令(cat/ls/git status/python -c/...);写命令仍走审批 modal/CardKit。Audit log 记 decided_by="auto:bash-smart-read"。消除审批疲劳但不削弱沙箱。
Frozen Prefix 字节稳定 14 个测试证明"90%+ prompt 缓存命中"声明可验证。OpenHuman KV-cache invariant 的 clean-room 借鉴。
Multi-Agent Delegate (V1.5 Phase 1 + Phase 2) Phase 1: 并行 fan-out (主代理同 turn N 个 sub_agent tool_call → asyncio.gather 并发) + progress_batch_id audit 关联 + fail-soft + max_parallel_per_turn (默认 5) + reduce_subagent_results 4 strategy + supervisor advisory。Phase 2 (streaming sub-agent output): 三点 emit (turn-start / per-tool-start / per-tool-end) + 6-state 状态机 (thinkingtool_callingtool_runningcompleted/failed/aborted) + 250ms cross-sibling batching + Web SPA 5-color 调色板 + 飞书 CardKit subagents_status 元素 + omit_streaming_progress manifest toggle。8 V1 + 4 Phase 1 invariants + OH-2 14 byte-stability 全保留; V1 single-spawn (N=1) byte-identical。Phase 3 (cross-agent handoff) 等触发条件。显式不做:LangGraph DAG runtime、Hermes RPC mesh、token-by-token streaming。
Dreaming 引擎 🔲 规划中:Light/Deep/REM 三阶段记忆整理

测试统计: 2923 单元/集成测试 + 16 E2E (3 Phase 3 gated) · ~16K 行 Python · ~120 个源文件(截至 2026年05月29日 V1.5 Phase 3 ship)


🎬 特性详解

4 层记忆 + 中文 FTS5

# L2/L3 检索命中 → 注入到 Prompt 的 Dynamic Zone 作为 <facts> / <procedures> XML
# 每轮 4 层都被检索,结果按优先级混合
# 中文查询直接可用
agent.run("帮我看一下飞书 streaming 模块的 token 限流策略")
# → FTS5 通过 jieba.cut_for_search 匹配 "飞书"+"streaming"+"token"+"限流"
# → Top procedures 被注入 Prompt

Hook 驱动的记忆流水线

class MyCustomHook(AgentHook):
 async def before_prompt_build(self, ctx):
 ctx.append_dynamic("<custom>...自定义内容...</custom>")
 async def after_response(self, ctx, response):
 # 每次回复后自动抽取事实
 ...
agent.hooks.register(MyCustomHook())

Frozen / Per-Turn 三段式 Prompt

graph LR
 subgraph Frozen["❄️ Frozen Prefix(缓存,命中率 90%+)"]
 F[identity · tools · skills · L1 snapshot]
 end
 subgraph Suffix["🔄 Per-Turn Suffix(每轮重建)"]
 S[runtime · working_memory · nudge]
 end
 subgraph Dynamic["🔍 Dynamic Zone(记忆检索)"]
 D[facts · procedures with entry_id]
 end
 Frozen ~~~ Suffix ~~~ Dynamic
 style Frozen fill:#e3f2fd,stroke:#1565c0
 style Suffix fill:#fff3e0,stroke:#e65100
 style Dynamic fill:#e8f5e9,stroke:#2e7d32
Loading

OpenAI 兼容 API

curl http://localhost:8000/v1/chat/completions \
 -H "Authorization: Bearer $TOKEN" \
 -d '{"model":"pyclaw","messages":[{"role":"user","content":"hi"}],"stream":true}'

可对接 OpenWebUI / Lobe / NextChat 等任意 OpenAI 兼容客户端。

多实例生产部署

# docker-compose.yml
services:
 pyclaw:
 deploy: { replicas: 3 } # 3 个 active-active worker
 environment:
 PYCLAW_AFFINITY_ENABLED: "true"
 redis:
 image: redis:7-alpine # 共享状态 + 亲和注册表
 nginx:
 image: nginx:alpine # ip_hash 反向代理
 volumes: [./deploy/nginx.conf:/etc/nginx/conf.d/default.conf]
 ports: ["80:80"]

双层 stickiness 设计:

  • Layer 1 — Nginx ip_hash:同一客户端 IP 固定路由到同一 worker(减少 forward 流量)
  • Layer 2 — Session 亲和网关:Redis 维护 session_key → worker_id 映射,保证同一 session 永远在同一 worker 处理。Nginx(或飞书 cluster mode)即使把消息分发到别的 worker,亲和层会通过 Redis PubSub 转发到 owner。Worker 死亡时通过 TTL 过期 + force_claim 自动接管。

本地 dev 反向代理(统一入口 localhost:9000 → 3 个 worker):

make worker1 # terminal 1: PORT=8000
make worker2 # terminal 2: PORT=8001
make worker3 # terminal 3: PORT=8002
make nginx-start # 反向代理 :9000
make affinity-status # 任意时刻查 Redis 亲和状态

详情参见 make helpreports/affinity-gateway-smoke-2026年05月15日.md(真机 smoke 测试报告)。


📚 深度文章(公众号 Time留痕)

📖 完整文章合集 →

系列 标题 主题
A1 从 TypeScript 单体到存算分离 为什么重写 OpenClaw — 三条原则
A2 从 6000 行包装到 645 行单循环:我如何重写 OpenClaw 的 Agent 内核 六大 Agent 框架源码级对比(Claude Code / OpenClaw / OpenCode / DeerFlow / GenericAgent / Hermes)
D0 AI Agent 记忆系统的四种流派 Karpathy / 火山 / Shopify / YC 四家记忆思路对比
D1 你的 AI Agent 为什么总是"失忆"? PyClaw 的 4 层记忆架构设计
D2 给 AI Agent 的记忆系统通上电 工具设计 + Hook 驱动 + APSW/jieba FTS5 修复
E1 给 Agent 加一个"心脏起搏器":TaskManager 设计 异步任务生命周期管理
E11 Slash 命令系统:4 层分工驯服 21 个命令 CommandRegistry + ProtocolOp + Hook 多层分工
E12 Session Affinity Gateway:N worker 水平扩展 Affinity 双层 stickiness + (N-1)/N 转发
E17 权限系统:4 层 tier ×ばつ per-user ×ばつ per-MCP-server 工具审批系统四阶段演化
E18 运行时沙箱:基于 Anthropic srt 的系统实现 8 条架构不变量 + SandboxPolicy Protocol 三件套
E21 Sub-Agent 系统的 8 条架构不变量 Markdown manifest → isolated executor 全景
F13 stub-and-revert 测试方法论 unit + e2e 全绿不代表无错
B1 四种 Agent 架构路径:OpenClaw / Hermes / OpenHuman / PyClaw 四方对比 + 5 个借鉴招式 + 反向校准

系列代号:A(项目认知)· B(竞品解析)· C(上下文)· D(记忆+进化)· E(架构+安全)· F(方法论)


⚙️ 配置 & 部署

PyClaw 用单个 pyclaw.json 描述所有运行时配置,按 ./pyclaw.jsonconfigs/pyclaw.json~/.openclaw/pyclaw.json 顺序查找。配置参考文档按 5 个使用场景组织:本地开发、生产单实例、多实例 active-active、Feishu 机器人、记忆 + 自演化。

配置与运维:

安全与集成:


🛠 CLI 工具

# Skill 管理
pyclaw-skill list # 列出已发现的技能
pyclaw-skill search github # 搜索 ClawHub 市场
pyclaw-skill install github # 安装技能
pyclaw-skill check # 资格检查(bins / env / OS)
# SOP 生命周期管理(Curator)
pyclaw-skill curator list --auto # 活跃的自动提取 SOP
pyclaw-skill curator list --stale # 30+ 天未使用(预警)
pyclaw-skill curator list --archived # 已归档 SOP(含原因)
pyclaw-skill curator restore <id> # 恢复已归档的 SOP
pyclaw-skill curator graduate --preview # 预览毕业候选
pyclaw-skill curator graduate # 执行毕业
pyclaw-skill curator graduate --id <id> # 指定 ID 强制毕业
# 实时记忆观测
.venv/bin/python scripts/verify_memory_live.py # L1/L2/L3/L4 实时监控

🧪 测试

# 单元 + 集成(无外部依赖)
.venv/bin/pytest tests/ --ignore=tests/e2e
# 含真实 Redis
PYCLAW_TEST_REDIS_HOST=localhost .venv/bin/pytest tests/integration/
# 真实 LLM E2E
PYCLAW_LLM_API_KEY=sk-... .venv/bin/pytest tests/e2e/

2923 单元/集成测试 · 16 真 LLM E2E(3 Phase 3 gated) · ~16K 行代码 · ~120 个源文件(截至 2026年05月29日 V1.5 Phase 3 ship)。


📁 项目结构

src/pyclaw/
├── core/ # 计算层(无状态)
│ ├── agent/
│ │ ├── runner.py # ~1100 行单循环
│ │ ├── system_prompt.py # Frozen + Per-Turn 构建器
│ │ ├── tools/ # bash, read, write, edit, grep, glob, web_fetch, memorize, forget, update_working_memory, skill_view (+ fetch_mcp_resource opt-in)
│ │ ├── hooks/ # WorkingMemoryHook, MemoryNudgeHook
│ │ ├── compaction/ # 压缩子系统(planning, dedup, hardening, checkpoint, reasons)
│ │ └── factory.py # 自动装配记忆工具 + Hook
│ ├── context_engine.py # Bootstrap + 记忆检索 + assemble
│ ├── curator.py # 后台 SOP 生命周期管理(扫描 → 归档 → 毕业)
│ ├── sop_extraction.py # LLM SOP 提取(per-session)
│ ├── skill_graduation.py # 高频 SOP 毕业为 SKILL.md
│ ├── memory_archive.py # /new 时后台 L4 归档
│ └── hooks.py # AgentHook / ToolApprovalHook / SkillProvider Protocol
├── storage/
│ ├── memory/ # 4 层记忆(composite, sqlite, redis_index, jieba_tokenizer, embedding)
│ ├── session/ # Redis + InMemory session
│ ├── workspace/ # File + Redis workspace
│ └── lock/ # Redis 分布式锁
├── channels/
│ ├── feishu/ # WS receiver、CardKit 流式、斜杠命令
│ ├── web/ # WebSocket + REST + OpenAI SSE + React SPA + admin
│ └── session_router.py # SessionKey → SessionId 路由
├── skills/ # Skill Hub(parser, discovery, eligibility, prompt, clawhub_client, installer)
├── infra/
│ ├── task_manager.py # 集中式异步生命周期(spawn/cancel/drain)
│ ├── settings.py # MemorySettings, EmbeddingSettings, PromptBudgetConfig
│ └── redis_client.py
├── cli/skills.py # pyclaw-skill CLI
└── app.py # FastAPI 入口 + lifespan

🛡 安全与隔离

PyClaw 当前的隔离模型是单租户或可信团队 — Session 数据、Redis 键、飞书 Workspace、记忆存储按用户隔离, 但同一份部署内不同团队之间没有租户边界。适用场景: 一个团队跑自己的实例, 或者一份共享实例服务可信内部用户。Web 渠道为信任用户设计(Tool Approval Hook 管控高风险操作)。多租户 SaaS 部署需要走下面的升级路径。

详见 D26: 用户隔离模型 — 隔离边界、已知限制、多租户升级路径。


📖 文档

上手与运维

  • 配置参考 — 所有 Settings 字段,按场景组织
  • 部署指南 — 本地 dev / 单实例 Docker / 多实例 active-active

架构与设计

英文文档:docs/en/


🗺 路线图

最近 ship(Sprint 6 / 7 / 8)

  • 工具输出压缩器(OH-1) — 4 策略规则管线,bash-heavy session 节省 ~30-50% 输入 token(Sprint 6,2026年05月20日 ship)
  • Frozen Prefix 字节稳定不变量(OH-2) — 14 个测试证明"90%+ prompt 缓存命中"在跨 turn / 跨 section / dict 排序 / budget 截断后均成立(Sprint 6,2026年05月20日 ship)
  • 子代理 omit toggles(OH-3)omit_memory_context / omit_skills_catalog / omit_working_memory token-economy 专用(Sprint 6,2026年05月20日 ship)
  • Skill Graduation v2(Follow-up B) — auto_generated SKILL.md 可被改进版 SOP 原子替换;旧版备份到 skill_history/<timestamp>(Sprint 7,2026年05月20日 ship)
  • S3 安全三件套 — env deny-floor 扩展(DATABASE_URL/REDIS_URL/DOCKER_HOST/VAULT_TOKEN/VAULT_ADDR)+ srt 版本检查(< 1.0.0 警告;production_require_sandbox=true fail-closed)+ Settings _comment_* 字段 strip(Sprint 7,2026年05月20日 ship)
  • WebSocket 鉴权失败循环修复 — close code 4001/4002/4003 触发 logout() + 跳转登录页,不再无限重连(Sprint 6.1,2026年05月20日 ship)
  • 智能审批(TA1, bash_approval_mode) — read 命令白名单自动放行,消除审批疲劳但不削弱沙箱(Sprint 8,2026年05月20日 ship)
  • S3- deferred 清理(8 fix + advisory + 3 核查后关闭非真问题)* — A13 srt 运行时 fallback / A7 zero-admin / F8 forward-compat / F4 source-grep→behavioral / F2 Windows 路径 / F5 inspect.signature / F7 fixture / B1B2 / E4 / F3+A14 advisory;A8/A11/A12 核查为非真问题(Sprint 9,2026年05月21日 ship)

早期(Sprint 1–5)

  • ✅ 记忆存储 — 4 层 SQLite-vec + FTS5 + jieba
  • ✅ Web 渠道 — 多路复用 WebSocket、OpenAI 兼容 SSE、React SPA
  • ✅ Skill Hub — ClawHub SKILL.md 解析、渐进式披露
  • ✅ TaskManager — 集中式异步任务生命周期
  • ✅ 自我进化 — SOP 提取 + Curator 生命周期 + ForgetTool
  • Session 亲和网关 — Active-active 多 worker、Redis 亲和注册 + PubSub 转发(2026年05月14日 真机 smoke 验证通过)
  • Web UI MVP — Linear/Cursor 风视觉重构(2026年05月15日 ship)
  • MCP 客户端 — Anthropic Model Context Protocol 集成(Sprint 2)
  • 用户隔离 + srt 沙箱 — Per-user tier profile + 角色权限 + Anthropic srt + 11 条架构不变量(Sprint 3,2026年05月16日 ship)
  • Tier 2 内置工具 — 进程内 web_fetch / grep / glob.claude/skills/ 跨生态 7 源发现(Sprint 4',2026年05月18日 ship)
  • Sub-Agent 系统 (A') — Markdown + YAML frontmatter、5 层 discovery、depth-1、license-clean MIT 分发(Sprint 5,2026年05月18日 上线)

调研中(active)

  • Multi-Agent Delegate V1.5 Phase 1 ship 2026年05月22日 — 并行 fan-out + audit batch_id + fail-soft + reducer (4 strategy) + supervisor advisory + max_parallel rate limit。8 V1 不变量保留。Ship report: reports/multi-agent-delegate-v15-phase1-ship-2026年05月22日.md
  • Multi-Agent Delegate V1.5 Phase 2 ship 2026年05月22日 — streaming sub-agent output: 三点 emit + 250ms 跨兄弟 batching + 6-state 状态机 + Web SPA 5-color 调色板 + 飞书 CardKit subagents_status 元素 + omit_streaming_progress toggle + SubagentProgressEmitter (race-safe _dirty ordering) + Decision 9 sink-bypass-runner 架构。10 commits, 2694→2749 (+55 tests), 0 regression。8 V1 + 4 Phase 1 invariants + OH-2 14 byte-stability 全保留; N=1 byte-identical。Ship report: reports/multi-agent-delegate-v15-phase2-ship-2026年05月22日.md
  • Multi-Agent Delegate V1.5 Phase 3 ship 2026年05月29日 — supervisor-mediated 跨代理 handoff: 内置 request_handoff tool(sub-agent-only) + AgentManifest.can_handoff_to 二态 hybrid 白名单 + session-keyed Redis-persisted pending_handoffs (sha256-hashed key 防注入) + 确定性 LCS 匹配(NFC + 4-decimal round)+ effective_hop_index 关闭 reducer-merge cap bypass + 4 个 advisory 变体 (A/B/C/D) + 6 个新 audit event 类型。15 commits, 2760→2923 (+163 tests), 0 regression。8 V1 + 9 Phase 1 + 8 Phase 2 + 20 Phase 3 = 51 invariants 全保留。Ship report: reports/multi-agent-delegate-v15-phase3-ship-2026年05月29日.md

规划中

  • 🔲 Dreaming 引擎 — Light/Deep/REM 三阶段记忆整理(提取 → 聚类 → 图谱)
  • 🔲 PostgreSQL + pgvector — 生产级记忆后端(多 pod K8s 部署)
  • 🔲 pyclaw migrate-from-openclaw — 给 OpenClaw 用户的迁移工具(对标 Hermes hermes claw migrate)
  • 🔲 Plugin 平台 (B) — 跨 5 类注册表的统一扩展协议;V2+ backlog,触发条件 ≥3 个第三方 plugin 需求 或 PyClaw 用户数 ≥ 10k("marketplace 基建 < 10k 用户 premature")

上面列表是高层 mirror。详细的 sprint 状态、依赖图、ship 报告、活跃 proposal 由维护者私下追踪;对外可见的架构变更通过 pull request 和公众号文章发布(公众号合集)。


🤝 与 OpenClaw 的关系

PyClaw 受 OpenClaw 启发,并设计为与其技能生态兼容。PyClaw 是独立的 Python 重新实现,不是 fork。它继承了领域模型(Session、Channel、Skill),但以记忆为一等公民重新设计了架构。


🧩 姊妹项目:KnowMe / 知我(暂未发布)

PyClaw 和 KnowMe / 知我 是同一作者的姊妹项目,命名都遵循「拼音 + 技术词」模式。两者解决的是 agent-memory 故事的互补两半:

  • PyClawAgent 运行时(本仓):多通道(飞书 / Web)、4 层 L1-L4 记忆、Sub-agent 系统、沙箱、MCP client。
  • KnowMeMCP-native 本地优先知识库:SQLite + jieba FTS5、Markdown、Obsidian 兼容,对外暴露 5 个只读 MCP tool。

说明:KnowMe 目前是私有仓库(未发布),公开发布预计跟着 v1 ship(约 2026-07)。公开后本节会补上仓库链接。在那之前,把 KnowMe 当作 PyClaw MCP-extension 路线的架构上下文来看就行。

两者怎么协作(KnowMe 公开 + 在 pyclaw.json 里启用之后):

PyClaw agent ──MCP 查询──▶ KnowMe vault (今天已通,只读,
 内部冒烟通过)
 ◀──MCP 写入── KnowMe (规划中,KnowMe v1.5+)
 ─memorize─▶ PyClaw L4 写到 KnowMe vault (规划中)

PyClaw 今天就支持把 KnowMe 当 MCP server 接 — 接线骨架在 configs/pyclaw.jsonmcp.servers.knowme(schema 见 configs/pyclaw.example.json),默认注释掉 / 关闭,等 KnowMe 公开后启用。内部冒烟(2026年05月18日):list_pages 返已索引 wiki 页、search "pyclaw" 返 jieba 分词后的全文命中。

边界契约(两个项目独立 ship):

  • PyClaw 的 MCP client 把 KnowMe 当作有版本号的外部依赖 —— KnowMe tool schema 任何破坏性变更必须先公示再做破坏性提交,changelog 会随 KnowMe 仓公开发布。
  • 反向(PyClaw 把自己包装成 MCP server,让 KnowMe 未来的 agent panel 可以调 PyClaw)是一个待立项的 PyClaw OpenSpec change —— 内部跟踪为 pyclaw-mcp-server-package,还没启动。

为什么是这个架构:KB 能力原本是 PyClaw 的 Sprint 4,2026年05月18日 改交给 KnowMe,让 PyClaw 专注 agent runtime、KnowMe 专注 vault,MCP 是两者之间的协议。


📡 关注我们

微信公众号:Time留痕 — 持续分享 PyClaw 开发历程、AI Agent 架构设计、记忆系统、上下文工程。


🤝 参与贡献

欢迎 PR。openspec/ 目录跟踪所有架构变更 — 提交大型 PR 前请阅读活跃的提案。小型 PR(拼写、bug 修复)随时欢迎。


📜 许可证

MIT License — 自由使用、修改、分发,包括商业用途。

About

A production-grade Python AI Agent framework with persistent memory, hooks-driven architecture, and compute-storage separation.

Topics

Resources

License

Stars

Watchers

Forks

Packages

Contributors

AltStyle によって変換されたページ (->オリジナル) /