@oyasmi/pipiclaw 0.5.2 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/README.md +308 -209
  2. package/dist/agent/channel-runner.d.ts +3 -2
  3. package/dist/agent/channel-runner.js +22 -14
  4. package/dist/{command-extension.d.ts → agent/command-extension.d.ts} +0 -1
  5. package/dist/{command-extension.js → agent/command-extension.js} +1 -2
  6. package/dist/{commands.d.ts → agent/commands.d.ts} +0 -1
  7. package/dist/{commands.js → agent/commands.js} +0 -1
  8. package/dist/agent/index.d.ts +0 -1
  9. package/dist/agent/index.js +0 -1
  10. package/dist/agent/progress-formatter.d.ts +0 -1
  11. package/dist/agent/progress-formatter.js +0 -1
  12. package/dist/{prompt-builder.d.ts → agent/prompt-builder.d.ts} +1 -2
  13. package/dist/{prompt-builder.js → agent/prompt-builder.js} +0 -1
  14. package/dist/agent/run-queue.d.ts +0 -1
  15. package/dist/agent/run-queue.js +0 -1
  16. package/dist/agent/runner-factory.d.ts +0 -1
  17. package/dist/agent/runner-factory.js +0 -1
  18. package/dist/agent/session-events.d.ts +0 -1
  19. package/dist/agent/session-events.js +0 -1
  20. package/dist/agent/session-resource-gate.d.ts +10 -0
  21. package/dist/agent/session-resource-gate.js +44 -0
  22. package/dist/agent/type-guards.d.ts +0 -1
  23. package/dist/agent/type-guards.js +1 -2
  24. package/dist/agent/types.d.ts +1 -2
  25. package/dist/agent/types.js +0 -1
  26. package/dist/{config-loader.d.ts → agent/workspace-resources.d.ts} +3 -10
  27. package/dist/{config-loader.js → agent/workspace-resources.js} +3 -19
  28. package/dist/index.d.ts +9 -9
  29. package/dist/index.js +9 -9
  30. package/dist/log.d.ts +0 -1
  31. package/dist/log.js +0 -1
  32. package/dist/main.d.ts +0 -1
  33. package/dist/main.js +0 -1
  34. package/dist/memory/bootstrap.d.ts +0 -1
  35. package/dist/memory/bootstrap.js +0 -1
  36. package/dist/memory/candidates.d.ts +0 -1
  37. package/dist/memory/candidates.js +0 -1
  38. package/dist/memory/chinese-words.d.ts +0 -1
  39. package/dist/memory/chinese-words.js +64 -1
  40. package/dist/memory/consolidation.d.ts +0 -1
  41. package/dist/memory/consolidation.js +2 -3
  42. package/dist/memory/files.d.ts +0 -1
  43. package/dist/memory/files.js +0 -1
  44. package/dist/memory/lifecycle.d.ts +1 -2
  45. package/dist/memory/lifecycle.js +0 -1
  46. package/dist/memory/recall.d.ts +1 -1
  47. package/dist/memory/recall.js +77 -11
  48. package/dist/memory/session.d.ts +0 -1
  49. package/dist/memory/session.js +2 -3
  50. package/dist/{sidecar-worker.d.ts → memory/sidecar-worker.d.ts} +0 -1
  51. package/dist/{sidecar-worker.js → memory/sidecar-worker.js} +1 -2
  52. package/dist/models/api-keys.d.ts +7 -0
  53. package/dist/models/api-keys.js +16 -0
  54. package/dist/{model-utils.d.ts → models/utils.d.ts} +1 -2
  55. package/dist/{model-utils.js → models/utils.js} +0 -1
  56. package/dist/paths.d.ts +0 -1
  57. package/dist/paths.js +0 -1
  58. package/dist/runtime/bootstrap.d.ts +0 -1
  59. package/dist/runtime/bootstrap.js +2 -3
  60. package/dist/runtime/delivery.d.ts +0 -1
  61. package/dist/runtime/delivery.js +0 -1
  62. package/dist/runtime/dingtalk.d.ts +0 -1
  63. package/dist/runtime/dingtalk.js +1 -2
  64. package/dist/runtime/events.d.ts +0 -1
  65. package/dist/runtime/events.js +0 -1
  66. package/dist/runtime/store.d.ts +0 -1
  67. package/dist/runtime/store.js +0 -1
  68. package/dist/sandbox.d.ts +0 -1
  69. package/dist/sandbox.js +1 -2
  70. package/dist/{context.d.ts → settings.d.ts} +1 -2
  71. package/dist/{context.js → settings.js} +1 -2
  72. package/dist/{llm-json.d.ts → shared/llm-json.d.ts} +0 -1
  73. package/dist/{llm-json.js → shared/llm-json.js} +0 -1
  74. package/dist/shared/markdown-sections.d.ts +0 -1
  75. package/dist/shared/markdown-sections.js +0 -1
  76. package/dist/{shell-escape.d.ts → shared/shell-escape.d.ts} +0 -1
  77. package/dist/{shell-escape.js → shared/shell-escape.js} +0 -1
  78. package/dist/shared/text-utils.d.ts +0 -1
  79. package/dist/shared/text-utils.js +0 -1
  80. package/dist/shared/type-guards.d.ts +0 -1
  81. package/dist/shared/type-guards.js +0 -1
  82. package/dist/shared/types.d.ts +0 -1
  83. package/dist/shared/types.js +0 -1
  84. package/dist/subagents/discovery.d.ts +0 -1
  85. package/dist/subagents/discovery.js +1 -2
  86. package/dist/subagents/tool.d.ts +1 -2
  87. package/dist/subagents/tool.js +1 -2
  88. package/dist/tools/attach.d.ts +0 -1
  89. package/dist/tools/attach.js +0 -1
  90. package/dist/tools/bash.d.ts +0 -1
  91. package/dist/tools/bash.js +0 -1
  92. package/dist/tools/edit.d.ts +0 -1
  93. package/dist/tools/edit.js +1 -2
  94. package/dist/tools/index.d.ts +1 -2
  95. package/dist/tools/index.js +0 -1
  96. package/dist/tools/read.d.ts +0 -1
  97. package/dist/tools/read.js +1 -2
  98. package/dist/tools/truncate.d.ts +0 -1
  99. package/dist/tools/truncate.js +0 -1
  100. package/dist/tools/write-content.d.ts +0 -1
  101. package/dist/tools/write-content.js +1 -2
  102. package/dist/tools/write.d.ts +0 -1
  103. package/dist/tools/write.js +0 -1
  104. package/package.json +9 -3
  105. package/CHANGELOG.md +0 -47
  106. package/dist/agent/channel-runner.d.ts.map +0 -1
  107. package/dist/agent/channel-runner.js.map +0 -1
  108. package/dist/agent/index.d.ts.map +0 -1
  109. package/dist/agent/index.js.map +0 -1
  110. package/dist/agent/progress-formatter.d.ts.map +0 -1
  111. package/dist/agent/progress-formatter.js.map +0 -1
  112. package/dist/agent/run-queue.d.ts.map +0 -1
  113. package/dist/agent/run-queue.js.map +0 -1
  114. package/dist/agent/runner-factory.d.ts.map +0 -1
  115. package/dist/agent/runner-factory.js.map +0 -1
  116. package/dist/agent/session-events.d.ts.map +0 -1
  117. package/dist/agent/session-events.js.map +0 -1
  118. package/dist/agent/type-guards.d.ts.map +0 -1
  119. package/dist/agent/type-guards.js.map +0 -1
  120. package/dist/agent/types.d.ts.map +0 -1
  121. package/dist/agent/types.js.map +0 -1
  122. package/dist/agent.d.ts +0 -3
  123. package/dist/agent.d.ts.map +0 -1
  124. package/dist/agent.js +0 -2
  125. package/dist/agent.js.map +0 -1
  126. package/dist/command-extension.d.ts.map +0 -1
  127. package/dist/command-extension.js.map +0 -1
  128. package/dist/commands.d.ts.map +0 -1
  129. package/dist/commands.js.map +0 -1
  130. package/dist/config-loader.d.ts.map +0 -1
  131. package/dist/config-loader.js.map +0 -1
  132. package/dist/context.d.ts.map +0 -1
  133. package/dist/context.js.map +0 -1
  134. package/dist/index.d.ts.map +0 -1
  135. package/dist/index.js.map +0 -1
  136. package/dist/llm-json.d.ts.map +0 -1
  137. package/dist/llm-json.js.map +0 -1
  138. package/dist/log.d.ts.map +0 -1
  139. package/dist/log.js.map +0 -1
  140. package/dist/main.d.ts.map +0 -1
  141. package/dist/main.js.map +0 -1
  142. package/dist/memory/bootstrap.d.ts.map +0 -1
  143. package/dist/memory/bootstrap.js.map +0 -1
  144. package/dist/memory/candidates.d.ts.map +0 -1
  145. package/dist/memory/candidates.js.map +0 -1
  146. package/dist/memory/chinese-words.d.ts.map +0 -1
  147. package/dist/memory/chinese-words.js.map +0 -1
  148. package/dist/memory/consolidation.d.ts.map +0 -1
  149. package/dist/memory/consolidation.js.map +0 -1
  150. package/dist/memory/files.d.ts.map +0 -1
  151. package/dist/memory/files.js.map +0 -1
  152. package/dist/memory/lifecycle.d.ts.map +0 -1
  153. package/dist/memory/lifecycle.js.map +0 -1
  154. package/dist/memory/recall.d.ts.map +0 -1
  155. package/dist/memory/recall.js.map +0 -1
  156. package/dist/memory/session.d.ts.map +0 -1
  157. package/dist/memory/session.js.map +0 -1
  158. package/dist/model-utils.d.ts.map +0 -1
  159. package/dist/model-utils.js.map +0 -1
  160. package/dist/paths.d.ts.map +0 -1
  161. package/dist/paths.js.map +0 -1
  162. package/dist/prompt-builder.d.ts.map +0 -1
  163. package/dist/prompt-builder.js.map +0 -1
  164. package/dist/runtime/bootstrap.d.ts.map +0 -1
  165. package/dist/runtime/bootstrap.js.map +0 -1
  166. package/dist/runtime/delivery.d.ts.map +0 -1
  167. package/dist/runtime/delivery.js.map +0 -1
  168. package/dist/runtime/dingtalk.d.ts.map +0 -1
  169. package/dist/runtime/dingtalk.js.map +0 -1
  170. package/dist/runtime/events.d.ts.map +0 -1
  171. package/dist/runtime/events.js.map +0 -1
  172. package/dist/runtime/store.d.ts.map +0 -1
  173. package/dist/runtime/store.js.map +0 -1
  174. package/dist/sandbox.d.ts.map +0 -1
  175. package/dist/sandbox.js.map +0 -1
  176. package/dist/shared/markdown-sections.d.ts.map +0 -1
  177. package/dist/shared/markdown-sections.js.map +0 -1
  178. package/dist/shared/text-utils.d.ts.map +0 -1
  179. package/dist/shared/text-utils.js.map +0 -1
  180. package/dist/shared/type-guards.d.ts.map +0 -1
  181. package/dist/shared/type-guards.js.map +0 -1
  182. package/dist/shared/types.d.ts.map +0 -1
  183. package/dist/shared/types.js.map +0 -1
  184. package/dist/shell-escape.d.ts.map +0 -1
  185. package/dist/shell-escape.js.map +0 -1
  186. package/dist/sidecar-worker.d.ts.map +0 -1
  187. package/dist/sidecar-worker.js.map +0 -1
  188. package/dist/subagents/discovery.d.ts.map +0 -1
  189. package/dist/subagents/discovery.js.map +0 -1
  190. package/dist/subagents/tool.d.ts.map +0 -1
  191. package/dist/subagents/tool.js.map +0 -1
  192. package/dist/tools/attach.d.ts.map +0 -1
  193. package/dist/tools/attach.js.map +0 -1
  194. package/dist/tools/bash.d.ts.map +0 -1
  195. package/dist/tools/bash.js.map +0 -1
  196. package/dist/tools/edit.d.ts.map +0 -1
  197. package/dist/tools/edit.js.map +0 -1
  198. package/dist/tools/index.d.ts.map +0 -1
  199. package/dist/tools/index.js.map +0 -1
  200. package/dist/tools/read.d.ts.map +0 -1
  201. package/dist/tools/read.js.map +0 -1
  202. package/dist/tools/truncate.d.ts.map +0 -1
  203. package/dist/tools/truncate.js.map +0 -1
  204. package/dist/tools/write-content.d.ts.map +0 -1
  205. package/dist/tools/write-content.js.map +0 -1
  206. package/dist/tools/write.d.ts.map +0 -1
  207. package/dist/tools/write.js.map +0 -1
  208. package/docs/memory-audit.md +0 -330
  209. package/docs/memory-optimization-round2.md +0 -319
  210. package/docs/specs/001-implement-memory/memory-rfc.md +0 -297
  211. package/docs/specs/002-subagent/pi-subagent-analyse.txt +0 -190
  212. package/docs/specs/002-subagent/pi-subagent-design.txt +0 -266
  213. package/docs/specs/002-subagent/pi-subagent-phase1-plan.txt +0 -529
  214. package/docs/specs/003-improve-memory/design.md +0 -537
  215. package/docs/specs/003-improve-memory/interfaces-and-tests.md +0 -473
  216. package/docs/specs/003-improve-memory/spec.md +0 -357
package/README.md CHANGED
@@ -1,52 +1,126 @@
1
1
  # Pipiclaw
2
2
 
3
- Pipiclaw 是一个面向钉钉的 AI coding assistant runtime。它基于 [`@mariozechner/pi-coding-agent`](https://www.npmjs.com/package/@mariozechner/pi-coding-agent) SDK,补上了实际团队环境里更关键的几层能力:钉钉渠道、过程性 AI Card、子代理、分层记忆、定时事件和可持续运行的 channel workspace
3
+ Pipiclaw 是一个 AI 助手运行时(AI assistant runtime),以 [`pi-coding-agent`](https://www.npmjs.com/package/@mariozechner/pi-coding-agent) 为核心,补齐了作为工作助手长期使用时最需要的几层能力:钉钉接入、AI Card 过程展示、子代理、分层记忆、定时事件,以及按会话通道持久化的工作区(workspace)。
4
4
 
5
- 如果你想要的是一个能在钉钉里长期工作的工程助手,而不是一个只能单轮问答的机器人,Pipiclaw 的设计目标就是这个。
5
+ 如果你希望 AI 助手不只是聊天,而是能在钉钉里持续工作、保留上下文、执行任务,并且实时告知你它正在做什么,那么 Pipiclaw 就是你需要的。
6
6
 
7
7
  npm package: [`@oyasmi/pipiclaw`](https://www.npmjs.com/package/@oyasmi/pipiclaw)
8
8
 
9
- ## Why Pipiclaw
9
+ 文档入口:
10
10
 
11
- - 钉钉优先:原生支持 DingTalk Stream Mode,不需要自己再包一层消息桥
12
- - 过程可见:思考、工具执行和状态更新可以持续流式展示到 AI Card
13
- - 任务不中断:忙碌时支持 steer、follow-up 和 stop,而不是简单丢弃新消息
14
- - 有记忆,但不过载:`SESSION.md` / `MEMORY.md` / `HISTORY.md` 分层管理,避免上下文无限膨胀
15
- - 支持子代理:主代理可以把 review、research、planning 等任务委派给独立上下文的 sub-agent
16
- - 适合长期运行:每个私聊和群聊都有稳定的 channel workspace、日志和事件目录
17
- - 保持可编排:模型、技能、workspace 文件和事件都可以通过普通文件管理
11
+ - 配置手册:[docs/configuration.md](./docs/configuration.md)
12
+ - 事件与子代理使用指南:[docs/events-and-sub-agents.md](./docs/events-and-sub-agents.md)
13
+ - 部署与运维指南:[docs/deployment-and-operations.md](./docs/deployment-and-operations.md)
18
14
 
19
- ## Highlights
15
+ ## 功能特性(Features)
20
16
 
21
- - DingTalk AI Card 流式过程输出,最终答复独立发送
22
- - 内置 slash commands:`/help`、`/new`、`/compact`、`/session`、`/model`
23
- - 忙碌时普通消息默认作为 steer 注入当前任务,也支持显式 `/steer`、`/followup`、`/stop`
24
- - workspace `SOUL.md`、`AGENTS.md`、`MEMORY.md`
25
- - channel `SESSION.md`、`MEMORY.md`、`HISTORY.md`、`skills/`
26
- - 预定义 sub-agent 和临时 inline sub-agent
27
- - immediate / one-shot / periodic 事件调度
28
- - 自定义 provider / model 配置
29
- - host / docker 两种工具执行环境
17
+ - 原生支持钉钉 Stream Mode,不需要消息中转服务,不需要公网IP
18
+ - 支持 AI Card 过程展示,思考、工具执行和状态更新可以持续流式呈现
19
+ - 支持 `/help`、`/new`、`/compact`、`/session`、`/model`
20
+ - 忙碌时可继续接收 `/steer`、`/followup`、`/stop`
21
+ - 按工作区 / 会话通道(workspace / channel)分层管理 `SOUL.md`、`AGENTS.md`、`SESSION.md`、`MEMORY.md`、`HISTORY.md`
22
+ - 支持预定义子代理(sub-agent)和临时内联子代理(inline sub-agent
23
+ - 支持立即、单次、周期三类事件调度
24
+ - 支持自定义模型提供方(provider)和模型(model)配置
30
25
 
31
- ## Quickstart
26
+ ## 快速开始(Quickstart
32
27
 
33
- 下面这套流程的目标是:从零开始,让 Pipiclaw 在你的钉钉里成功回复第一条消息。
28
+ 从零开始,让 Pipiclaw 在你的钉钉里成功回复第一条消息。可以直接让Agent帮你完成。如果你希望自己逐步操作,再看后面的“自己动手安装”。
34
29
 
35
- ### 1. Requirements
30
+ ### AI Agent 的安装说明(For AI Agent)
31
+
32
+ 可以让 AI Agent 直接帮你完成安装、初始化、配置和启动,把下面整段文字复制给你常用的 AI Agent (如 Claude Code、Codex、OpenCode 等):
33
+
34
+ ```text
35
+ 请帮我在这台机器上安装并初始化 Pipiclaw,并尽量把它配置到“可以开始使用”的状态。按下面要求执行:
36
+
37
+ 1. 先检查 Node.js 是否可用,版本必须 >= 22。
38
+ - 如果未安装,或版本低于 22,不要继续安装 Pipiclaw,直接告诉我需要先安装或切换到 Node.js 22+。
39
+
40
+ 2. 安装 Pipiclaw:
41
+ - 优先执行:npm install -g @oyasmi/pipiclaw
42
+ - 如果全局安装因为权限失败,不要默认使用 sudo。
43
+ - 先把报错告诉我,再询问我希望怎么处理。
44
+
45
+ 3. 安装完成后,执行一次 pipiclaw,让它初始化默认目录:
46
+ - ~/.pi/pipiclaw/
47
+ - ~/.pi/pipiclaw/workspace/
48
+
49
+ 4. 继续帮我完成基础配置,但先逐项询问我是否愿意现在提供这些信息:
50
+ - 钉钉应用的 clientId
51
+ - 钉钉应用的 clientSecret
52
+ - AI Card 的 cardTemplateId
53
+ - 模型接入方式:Anthropic,或自定义 provider
54
+
55
+ 5. 关于钉钉配置:
56
+ - AI Card 是推荐配置,不是可有可无的装饰。正常使用时建议配上。
57
+ - 如果我愿意提供 clientId、clientSecret、cardTemplateId,就直接帮我写入 ~/.pi/pipiclaw/channel.json
58
+ - robotCode 可以先留空
59
+ - allowFrom 可以先设为 []
60
+ - 如果我暂时不提供 cardTemplateId,也可以先留空,但最后要明确提醒我后续补上
61
+ - 不要把 any your-* placeholder 保留在最终文件里
62
+
63
+ 6. 关于模型配置:
64
+ - 先问我使用哪种方式:
65
+ - Anthropic 默认模型
66
+ - 自定义 provider
67
+ - 如果我选择 Anthropic,再询问我是否愿意现在提供 ANTHROPIC_API_KEY
68
+ - 如果我提供,就按我当前环境和你的能力,帮我配置到可用
69
+ - 如果我不提供,就不要编造值;保留默认空 models.json,并在最后告诉我需要自己补 ~/.pi/pipiclaw/auth.json 或环境变量
70
+ - 如果我选择自定义 provider,至少询问这些信息:
71
+ - provider 名称
72
+ - baseUrl
73
+ - api 类型
74
+ - apiKey
75
+ - 至少一个 model id
76
+ - 如果我提供了这些值,就帮我写好 ~/.pi/pipiclaw/models.json
77
+ - 如果我不提供,就不要编造值;最后明确告诉我需要自己补 ~/.pi/pipiclaw/models.json
78
+ - 如果服务是 OpenAI-compatible,优先使用 openai-completions,并默认加上 compat:
79
+ - supportsDeveloperRole: false
80
+ - supportsReasoningEffort: false
81
+
82
+ 7. 配置完成后,分两种情况处理:
83
+ - 如果还缺关键配置,就不要假装已经可用:
84
+ - 明确列出还缺什么
85
+ - 明确指出应该修改哪个文件
86
+ - 提醒我补完后再运行 pipiclaw
87
+ - 如果关键参数已经齐全,不要只告诉我如何启动;先询问我是否需要你现在直接帮我启动 Pipiclaw
88
+ - 如果我同意,你就直接启动 pipiclaw
89
+ - 启动后要检查输出,告诉我是启动成功,还是遇到了问题
90
+ - 如果遇到问题,要把问题类型、关键信息和下一步解决建议说清楚
91
+ - 如果启动成功,要提醒我去钉钉里先发送 /model 验证模型是否可见,再发送一条普通消息做首次验证
92
+ - 如果我不同意立即启动,就告诉我后续该如何手动启动
93
+
94
+ 8. 如果我选择“先安装,稍后自己改配置”,你就完成安装和初始化即可,但最后必须明确告诉我下一步至少要改这些文件中的哪些:
95
+ - ~/.pi/pipiclaw/channel.json
96
+ - ~/.pi/pipiclaw/auth.json
97
+ - ~/.pi/pipiclaw/models.json
98
+ - ~/.pi/pipiclaw/settings.json(如果需要固定默认模型)
99
+
100
+ 9. 整个过程中不要假装已经成功。
101
+ - 做过的操作和写过的文件要明确告诉我
102
+ - 如果某一步无法继续,要直接说明卡在哪里
103
+ ```
104
+
105
+ ### 自己动手安装(For Human)
106
+
107
+ 如果你希望自己逐步完成安装和配置,可以按下面步骤操作。
108
+
109
+ #### 1. 环境要求(Requirements)
36
110
 
37
111
  - Node.js `>= 22`
38
112
  - 一个可用的钉钉企业内部应用
39
- - 至少一个可用的模型认证方式
40
- - 环境变量,例如 `ANTHROPIC_API_KEY`
41
- - `~/.pi/pipiclaw/auth.json`
113
+ - 至少一种可用的模型接入方式
114
+ - 直接使用 Anthropic 默认模型
115
+ - 或在 `models.json` 中配置自定义模型提供方(provider)
42
116
 
43
- ### 2. Install
117
+ #### 2. 安装(Install
44
118
 
45
119
  ```bash
46
120
  npm install -g @oyasmi/pipiclaw
47
121
  ```
48
122
 
49
- ### 3. First Run
123
+ #### 3. 初始化(Initialize)
50
124
 
51
125
  第一次运行会自动初始化配置目录:
52
126
 
@@ -71,18 +145,18 @@ pipiclaw
71
145
  └── sub-agents/
72
146
  ```
73
147
 
74
- 如果 `channel.json` 还是占位模板,程序会提示你先填配置,然后退出。这是预期行为。
148
+ 如果 `channel.json` 仍然是初始化模板,程序会提示你补全配置后再启动。这是正常行为。
75
149
 
76
- ### 4. Create A DingTalk App
150
+ #### 4. 创建钉钉应用(Create a DingTalk App
77
151
 
78
- 在 [钉钉开放平台](https://open-dev.dingtalk.com/) 创建企业内部应用,并完成这些步骤:
152
+ 在 [钉钉开放平台](https://open-dev.dingtalk.com/) 创建企业内部应用,并完成下面几项:
79
153
 
80
- 1. 创建应用,拿到 `Client ID` 和 `Client Secret`
154
+ 1. 创建应用,获取 `Client ID` 和 `Client Secret`
81
155
  2. 开启机器人能力
82
156
  3. 启用 Stream Mode
83
- 4. 如果你要过程性流式展示,再创建一个 AI Card 模板并拿到 `Card Template ID`
157
+ 4. 建议一并创建 AI Card 模板并获取 `Card Template ID`
84
158
 
85
- ### 5. Fill `channel.json`
159
+ #### 5. 填写 `channel.json`(Fill `channel.json`)
86
160
 
87
161
  编辑 `~/.pi/pipiclaw/channel.json`:
88
162
 
@@ -90,13 +164,15 @@ pipiclaw
90
164
  {
91
165
  "clientId": "your-dingtalk-client-id",
92
166
  "clientSecret": "your-dingtalk-client-secret",
93
- "robotCode": "your-robot-code",
94
- "cardTemplateId": "your-card-template-id",
167
+ "robotCode": "",
168
+ "cardTemplateId": "",
95
169
  "cardTemplateKey": "content",
96
- "allowFrom": ["your-staff-id"]
170
+ "allowFrom": []
97
171
  }
98
172
  ```
99
173
 
174
+ 为了让第一轮接入更稳,上面的示例先把 `cardTemplateId` 留空;如果你已经准备好 AI Card 模板,推荐直接填入真实值。
175
+
100
176
  最少只需要:
101
177
 
102
178
  - `clientId`
@@ -107,13 +183,27 @@ pipiclaw
107
183
  - `robotCode`
108
184
  留空时会回退到 `clientId`
109
185
  - `cardTemplateId`
110
- 留空时不启用 AI Card 流式输出
186
+ 建议配置;留空时表示暂不启用 AI Card
111
187
  - `allowFrom`
112
- 设置为 `[]` 或删除时表示允许所有人
188
+ 设为 `[]` 或删除时表示允许所有人
189
+
190
+ 推荐把 AI Card 一起配上,这样在钉钉里能直接看到过程更新。只有在排查接入链路时,才建议临时把 `cardTemplateId` 留空。
113
191
 
114
- ### 6. Provide Model Credentials
192
+ #### 6. 配置模型(Configure Models)
115
193
 
116
- 最简单的方式是直接用环境变量:
194
+ Pipiclaw 启动后要想真正生成回复,还需要有可用模型。这里通常有两种接入方式。
195
+
196
+ #### 方案 A:使用内置 Anthropic 默认模型(Option A: Use the Built-in Anthropic Default)
197
+
198
+ 如果你直接使用 Anthropic,`models.json` 可以保持默认内容:
199
+
200
+ ```json
201
+ {
202
+ "providers": {}
203
+ }
204
+ ```
205
+
206
+ 然后提供 Anthropic 凭据即可。最简单的是环境变量:
117
207
 
118
208
  ```bash
119
209
  export ANTHROPIC_API_KEY=sk-ant-...
@@ -123,33 +213,95 @@ export ANTHROPIC_API_KEY=sk-ant-...
123
213
 
124
214
  ```json
125
215
  {
126
- "anthropic": "your-anthropic-api-key"
216
+ "anthropic": {
217
+ "type": "api_key",
218
+ "key": "sk-ant-..."
219
+ }
127
220
  }
128
221
  ```
129
222
 
130
- 如果你需要自定义 provider / model,可以编辑 `~/.pi/pipiclaw/models.json`。如果不需要,这个文件可以保持:
223
+ #### 方案 B:添加自定义模型提供方(Option B: Add a Custom Provider)
224
+
225
+ 如果你使用的是 OpenAI-compatible 网关、代理、自建服务或聚合平台,可以在 `~/.pi/pipiclaw/models.json` 里添加一个自定义模型提供方(provider)。
226
+
227
+ 一个可以直接改名替换后使用的最小示例:
131
228
 
132
229
  ```json
133
230
  {
134
- "providers": {}
231
+ "providers": {
232
+ "my-gateway": {
233
+ "baseUrl": "https://llm.example.com/v1",
234
+ "api": "openai-completions",
235
+ "apiKey": "your-api-key",
236
+ "compat": {
237
+ "supportsDeveloperRole": false,
238
+ "supportsReasoningEffort": false
239
+ },
240
+ "models": [
241
+ {
242
+ "id": "gpt-4.1"
243
+ }
244
+ ]
245
+ }
246
+ }
135
247
  }
136
248
  ```
137
249
 
138
- ### 7. Start Pipiclaw
250
+ 这个例子里最关键的四项是:
139
251
 
140
- ```bash
141
- pipiclaw
252
+ - `baseUrl`
253
+ - `api`
254
+ - `apiKey`
255
+ - `models`
256
+
257
+ 说明:
258
+
259
+ - `apiKey` 可以直接写真实 key
260
+ - 也可以写环境变量名,或 `!command`
261
+ - 很多 OpenAI-compatible 服务不支持 `developer` role / `reasoning_effort`
262
+ 如果遇到请求兼容性问题,先保留上面的 `compat`
263
+
264
+ 如果你不想把凭据直接写进 `models.json`,也可以改成同名模型提供方(provider)的 `auth.json` 配置,例如:
265
+
266
+ ```json
267
+ {
268
+ "my-gateway": {
269
+ "type": "api_key",
270
+ "key": "your-api-key"
271
+ }
272
+ }
142
273
  ```
143
274
 
144
- 如果你希望工具运行在 Docker 容器里:
275
+ 同时把 `models.json` 中的 `apiKey` 改成同一个值,或者改成环境变量名。完整配置手册见 [docs/configuration.md](./docs/configuration.md)。
276
+
277
+ #### 7. 可选:设置默认模型(Optional: Set a Default Model)
278
+
279
+ 如果你希望固定默认模型,可以编辑 `~/.pi/pipiclaw/settings.json`:
280
+
281
+ ```json
282
+ {
283
+ "defaultProvider": "my-gateway",
284
+ "defaultModel": "gpt-4.1"
285
+ }
286
+ ```
287
+
288
+ 如果不设置,Pipiclaw 会使用当前可用模型列表里的第一个。
289
+
290
+ #### 8. 启动 Pipiclaw(Start Pipiclaw)
145
291
 
146
292
  ```bash
147
- pipiclaw --sandbox=docker:your-container
293
+ pipiclaw
148
294
  ```
149
295
 
150
- ### 8. Send The First Message
296
+ #### 9. 在钉钉中验证(Verify in DingTalk)
151
297
 
152
- 给机器人发一条普通消息,例如:
298
+ 建议先给机器人发送:
299
+
300
+ ```text
301
+ /model
302
+ ```
303
+
304
+ 确认当前可见模型和默认模型都符合预期后,再发送一条普通消息,例如:
153
305
 
154
306
  ```text
155
307
  请介绍一下你自己,并说明你现在能做什么
@@ -157,62 +309,71 @@ pipiclaw --sandbox=docker:your-container
157
309
 
158
310
  如果一切正常:
159
311
 
160
- - 你会在钉钉里看到 AI Card 的过程更新,或普通文本回退
161
- - Pipiclaw 会在本地创建对应 channel 目录
162
- - 后续会话会复用该 channel 的工作空间与记忆文件
312
+ - 如果已经配置 AI Card,你会在钉钉里看到过程更新;这也是推荐的使用方式
313
+ - 如果暂时没有配置 AI Card,机器人会直接发送普通消息
314
+ - Pipiclaw 会在本地创建对应的会话通道目录
315
+ - 后续会话会复用该会话通道的工作区(workspace)与记忆文件
163
316
 
164
- ## Configuration
317
+ ## 配置(Configuration
165
318
 
166
- ### Config Files
319
+ 配置与使用相关的文档建议按下面顺序阅读:
167
320
 
168
- Pipiclaw 默认使用下面这些文件:
321
+ | 文档 | 适合什么场景 |
322
+ |------|--------------|
323
+ | [docs/configuration.md](./docs/configuration.md) | 查配置项、字段含义、模型与钉钉配置 |
324
+ | [docs/events-and-sub-agents.md](./docs/events-and-sub-agents.md) | 配置并使用定时事件、预定义子代理 |
325
+ | [docs/deployment-and-operations.md](./docs/deployment-and-operations.md) | 长期运行、升级、日志、备份与排障 |
169
326
 
170
- | File | Purpose |
171
- |------|---------|
327
+ ### 配置文件(Config Files)
328
+
329
+ | 文件 | 用途 |
330
+ |------|------|
172
331
  | `~/.pi/pipiclaw/channel.json` | 钉钉应用配置 |
173
332
  | `~/.pi/pipiclaw/auth.json` | 模型认证信息 |
174
- | `~/.pi/pipiclaw/models.json` | 自定义 provider model |
175
- | `~/.pi/pipiclaw/settings.json` | 默认模型和运行时设置 |
333
+ | `~/.pi/pipiclaw/models.json` | 自定义模型提供方 / 模型,或覆盖内置模型提供方 |
334
+ | `~/.pi/pipiclaw/settings.json` | 默认模型提供方 / 模型和运行时设置 |
176
335
 
177
- ### Environment Variables
336
+ ### 环境变量(Environment Variables
178
337
 
179
- | Variable | Purpose |
180
- |----------|---------|
181
- | `ANTHROPIC_API_KEY` | Anthropic API key |
182
- | `PIPICLAW_DEBUG` | 打开调试模式,把上下文写到 `last_prompt.json` |
338
+ | 变量 | 用途 |
339
+ |----------|------|
340
+ | `ANTHROPIC_API_KEY` | Anthropic API Key |
341
+ | `PIPICLAW_DEBUG` | 调试模式,会把上下文写到 `last_prompt.json` |
183
342
  | `DINGTALK_FORCE_PROXY` | 设为 `true` 时保留 axios 代理设置 |
184
343
 
185
- ## Commands
344
+ ## 命令(Commands
186
345
 
187
346
  Pipiclaw 有两层命令。
188
347
 
189
- ### Transport Commands
348
+ ### 传输层命令(Transport Commands
190
349
 
191
- 这些命令由 DingTalk runtime 直接处理:
350
+ 这些命令由钉钉运行时(DingTalk runtime)直接处理:
192
351
 
193
- - `/help`
194
- - `/stop`
195
- - `/steer <message>`
196
- - `/followup <message>`
352
+ | 命令 | 说明 |
353
+ |------|------|
354
+ | `/help` | 查看内置命令帮助 |
355
+ | `/stop` | 停止当前正在执行的任务 |
356
+ | `/steer <message>` | 在当前任务继续执行时追加新的引导信息 |
357
+ | `/followup <message>` | 把新的请求排队,等当前任务结束后再执行 |
197
358
 
198
359
  忙碌时,普通消息默认等价于 `/steer <message>`。
199
360
 
200
- ### Session Commands
361
+ ### 会话层命令(Session Commands
201
362
 
202
- 这些命令由 `AgentSession` extension command 立即执行,不作为普通 prompt 发给模型:
363
+ 这些命令由 `AgentSession` 扩展命令(extension command)立即执行,不会作为普通 prompt 发给模型:
203
364
 
204
- - `/new`
205
- - `/compact [instructions]`
206
- - `/session`
207
- - `/model [provider/modelId|modelId]`
365
+ | 命令 | 说明 |
366
+ |------|------|
367
+ | `/new` | 开启一个新的会话 |
368
+ | `/compact [instructions]` | 手动压缩当前会话上下文,可附带额外说明 |
369
+ | `/session` | 查看当前会话状态、消息统计、token 使用量和当前模型 |
370
+ | `/model [provider/modelId|modelId]` | 查看当前模型,或切换到指定模型 |
208
371
 
209
372
  `/model` 只支持精确匹配切换。
210
373
 
211
- ## Workspace Model
212
-
213
- Pipiclaw 的核心不是“一个机器人实例”,而是一组长期存在的 workspace 文件。
374
+ ## 工作区结构(Workspace Layout)
214
375
 
215
- ### Workspace Layout
376
+ Pipiclaw 的核心不是一个临时机器人实例,而是一组长期存在的工作区(workspace)文件。
216
377
 
217
378
  ```text
218
379
  ~/.pi/pipiclaw/
@@ -240,142 +401,105 @@ Pipiclaw 的核心不是“一个机器人实例”,而是一组长期存在
240
401
  └── ...
241
402
  ```
242
403
 
243
- ### What Gets Loaded Into Context
404
+ 其中:
244
405
 
245
- 默认直接进入 session 上下文的内容:
406
+ - `SOUL.md`
407
+ 定义助手身份、语气和回复风格
408
+ - `AGENTS.md`
409
+ 定义工作规则和行为约束
410
+ - `SESSION.md`
411
+ 当前工作态
412
+ - `MEMORY.md`
413
+ 稳定事实、决策和偏好
414
+ - `HISTORY.md`
415
+ 更早上下文的摘要
246
416
 
247
- - pi 默认 system prompt
248
- - workspace 级 `SOUL.md`
249
- - workspace 级 `AGENTS.md`
250
- - workspace 级 sub-agent 摘要
251
- - 工具说明
252
- - workspace 和 channel 两层 skills 摘要
417
+ ## 记忆模型(Memory Model)
253
418
 
254
- 默认不会直接注入上下文的内容:
419
+ Pipiclaw 不会把所有历史对话无上限地塞进 prompt,而是按层管理:
255
420
 
256
421
  - `workspace/MEMORY.md`
422
+ 工作区级稳定背景
257
423
  - `<channel>/SESSION.md`
424
+ 当前任务和短期上下文
258
425
  - `<channel>/MEMORY.md`
426
+ 会话通道级 durable facts、decisions、preferences
259
427
  - `<channel>/HISTORY.md`
260
- - `<channel>/log.jsonl`
261
- - `<channel>/context.jsonl`
428
+ 更早会话的摘要历史
262
429
 
263
- 这意味着 Pipiclaw 的记忆策略是“按需读取”,而不是把所有历史永远塞进 prompt。
264
-
265
- 不过,运行时现在会在当前轮明显需要时,自动从 `SESSION.md` / `MEMORY.md` / `HISTORY.md` 里挑出少量相关片段,作为一个很小的 runtime context 注入当前请求。这不是整文件预加载,而是受限的 relevant-memory prefetch。
266
-
267
- ## Memory Model
268
-
269
- Pipiclaw 把记忆分成四层:
270
-
271
- - `<channel>/SESSION.md`
272
- 当前工作态。放现在正在做什么、最近卡点、下一步、活跃文件和短期约束。它是 runtime-managed working memory。
273
-
274
- - `workspace/MEMORY.md`
275
- 稳定的全局背景,适合放团队长期约定和共享知识
276
- - `<channel>/MEMORY.md`
277
- channel 级 durable facts、decisions、preferences、medium-horizon open loops
278
- - `<channel>/HISTORY.md`
279
- 更老上下文的摘要历史
280
-
281
- 运行时行为分成两条线:
430
+ 运行时主要做两件事:
282
431
 
283
432
  - relevant recall
284
- 每轮可按需从 `SESSION.md` / `MEMORY.md` / `HISTORY.md` 里挑出少量最相关片段,预先送进当前 prompt
433
+ 按当前请求从 `SESSION.md` / `MEMORY.md` / `HISTORY.md` 里挑少量相关片段注入当前 prompt
285
434
  - consolidation
286
- 在 compaction 或 session trimming 前刷新 `SESSION.md`,并把值得长期保留的内容沉淀到 `MEMORY.md` / `HISTORY.md`
435
+ 在 compaction 或 session trimming 前刷新 `SESSION.md`,并把值得保留的信息沉淀到 `MEMORY.md` / `HISTORY.md`
287
436
 
288
- consolidation 会做这些事:
437
+ ## 事件与子代理(Events and Sub-Agents)
289
438
 
290
- - 从对话中提取值得保留的 memory entries
291
- - 更新 `SESSION.md` 中的当前工作态
292
- - 把旧对话块折叠进 `HISTORY.md`
293
- - 在必要时压缩过长的 memory/history 文件
439
+ `workspace/events/` 和 `workspace/sub-agents/` Pipiclaw 非常重要的两类长期能力:
294
440
 
295
- 一个简单原则:
441
+ - 定时事件适合做提醒、巡检、定期回顾和固定流程触发
442
+ - 预定义子代理适合把 reviewer、researcher、planner 这类角色沉淀为可复用能力
296
443
 
297
- - 现在正在做什么,看 `SESSION.md`
298
- - 稳定事实和决策,看 `MEMORY.md`
299
- - 更老的脉络和叙事,看 `HISTORY.md`
444
+ 这两部分更接近“日常使用”而不是基础配置,单独整理在 [docs/events-and-sub-agents.md](./docs/events-and-sub-agents.md)。
300
445
 
301
- ## Sub-Agents
446
+ ## 故障排查(Troubleshooting)
302
447
 
303
- Pipiclaw 支持两种 sub-agent 用法:
448
+ ### `pipiclaw` 首次启动即退出(`pipiclaw` Exits on First Run)
304
449
 
305
- - 预定义 sub-agent:放到 `~/.pi/pipiclaw/workspace/sub-agents/*.md`
306
- - 临时 inline sub-agent:由主代理在一次 `subagent` 工具调用里直接构造
450
+ 通常是因为 `channel.json` 仍然保留了初始化占位值。
307
451
 
308
- 推荐先使用预定义 sub-agent,因为更容易复用、审查和调试。
452
+ 优先检查这些字段:
309
453
 
310
- ### Example
454
+ - `clientId`
455
+ - `clientSecret`
456
+ - `robotCode`
457
+ - `cardTemplateId`
458
+ - `allowFrom`
311
459
 
312
- 文件:`~/.pi/pipiclaw/workspace/sub-agents/reviewer.md`
460
+ 第一次接通时,最省事的做法是:
313
461
 
314
- ```md
315
- ---
316
- name: reviewer
317
- description: Review code changes for correctness, regressions, and missing tests
318
- model: anthropic/claude-sonnet-4-5
319
- tools: read,bash
320
- contextMode: contextual
321
- memory: relevant
322
- paths:
323
- - src/
324
- - test/
325
- maxTurns: 24
326
- maxToolCalls: 48
327
- maxWallTimeSec: 300
328
- bashTimeoutSec: 120
329
- ---
462
+ - 把 `robotCode` 设为空字符串
463
+ - 把 `cardTemplateId` 设为空字符串
464
+ - 把 `allowFrom` 设为 `[]`
330
465
 
331
- You are a focused code reviewer.
466
+ 确认链路正常后,建议尽快把 AI Card 配上。
332
467
 
333
- Review the code or task given to you.
334
- Prioritize correctness issues, regressions, risky assumptions, and missing tests.
335
- Keep findings concise and actionable.
336
- ```
468
+ ### 机器人已启动,但第一次模型调用失败(The Bot Starts but the First Model Call Fails)
337
469
 
338
- 几个关键规则:
470
+ 优先检查:
339
471
 
340
- - sub-agent 没有 `subagent` 工具,所以不能继续创建孙代理
341
- - sub-agent 隔离的是 LLM 对话上下文,不隔离文件系统
342
- - 运行摘要会记录到 `<channel>/subagent-runs.jsonl`
343
- - 如果后续启用 contextual sub-agent,runtime 还会把 relevant memory 和 `SESSION.md` 摘要按角色需要带给子代理,而不是只给它一个裸任务
472
+ - 如果 `models.json` 为空,是否已经提供可用的 Anthropic 凭据
473
+ - 如果使用自定义模型提供方,`models.json` 是否包含 `baseUrl`、`api`、`apiKey`、`models`
474
+ - `auth.json` 是否使用了对象格式,而不是直接写成字符串
475
+ - 如果是 OpenAI-compatible 服务,是否需要:
476
+ - `"supportsDeveloperRole": false`
477
+ - `"supportsReasoningEffort": false`
478
+ - 给机器人发送 `/model`,确认当前可见模型和默认模型是否正确
344
479
 
345
- 几个常用 frontmatter:
480
+ ### 机器人能收到消息,但没有回复(The Bot Receives Messages but Does Not Reply)
346
481
 
347
- - `contextMode: contextual`
348
- 让 runtime 在任务前自动注入受限的上下文块
349
- - `memory: session`
350
- 只带 `SESSION.md` 的关键工作态
351
- - `memory: relevant`
352
- 带 `SESSION.md` 关键工作态,再加少量从 `MEMORY.md` / `HISTORY.md` / workspace memory 里召回的相关片段
353
- - `paths`
354
- 给子代理一个明确的关注范围,既帮助它聚焦,也会参与 recall
482
+ 优先检查:
355
483
 
356
- ## Scheduled Events
484
+ - 模型认证是否可用
485
+ - `models.json` 是否声明了你要使用的模型提供方 / 模型
486
+ - `allowFrom` 是否把你的账号挡住了
487
+ - 钉钉机器人 Stream Mode 是否已开启
488
+ - 如果配置了 `cardTemplateId`,该模板是否有效
357
489
 
358
- `~/.pi/pipiclaw/workspace/events/` 放置 JSON 文件,可以创建三类事件:
490
+ 如果只是想先验证链路,可以临时把 `cardTemplateId` 留空;正常使用时仍然建议启用 AI Card。
359
491
 
360
- - `immediate`
361
- - `one-shot`
362
- - `periodic`
492
+ ### 需要查看精确提示词(Need to Inspect the Exact Prompt)
363
493
 
364
- 示例:
494
+ 设置:
365
495
 
366
- ```json
367
- {
368
- "type": "periodic",
369
- "channelId": "dm_your-staff-id",
370
- "text": "Review your MEMORY.md files. Remove outdated entries, merge duplicates, ensure well-organized.",
371
- "schedule": "0 3 * * 0",
372
- "timezone": "Asia/Shanghai"
373
- }
496
+ ```bash
497
+ export PIPICLAW_DEBUG=1
374
498
  ```
375
499
 
376
- 一个典型用法是让 Pipiclaw 每周回顾自己的记忆文件,或者做固定时间的巡检和提醒。
500
+ 之后运行时会在对应的会话通道目录下写出 `last_prompt.json`。
377
501
 
378
- ## Development
502
+ ## 开发(Development
379
503
 
380
504
  ```bash
381
505
  npm install
@@ -385,35 +509,10 @@ npm run check
385
509
 
386
510
  常用脚本:
387
511
 
388
- - `npm run build`
512
+ - `npm run typecheck`
389
513
  - `npm run test`
390
514
  - `npm run check`
391
515
 
392
- ## Troubleshooting
393
-
394
- ### First run exits immediately
395
-
396
- 通常是因为 `channel.json` 还停留在模板占位符状态。把真实的 `clientId` / `clientSecret` 填进去即可。
397
-
398
- ### Bot receives messages but does not answer
399
-
400
- 优先检查:
401
-
402
- - 模型认证是否可用
403
- - `allowFrom` 是否把你的账号挡住了
404
- - 钉钉机器人 Stream Mode 是否已开启
405
- - `cardTemplateId` 是否有效;如果无效,先留空验证普通文本回退链路
406
-
407
- ### Need to inspect the exact prompt
408
-
409
- 设置:
410
-
411
- ```bash
412
- export PIPICLAW_DEBUG=1
413
- ```
414
-
415
- 之后运行时会在 channel 目录下写出 `last_prompt.json`。
416
-
417
- ## License
516
+ ## 许可证(License)
418
517
 
419
518
  Apache License 2.0. See [LICENSE](./LICENSE).