@oyasmi/pipiclaw 0.5.2 → 0.5.3
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.
- package/README.md +308 -209
- package/dist/agent/channel-runner.d.ts +2 -1
- package/dist/agent/channel-runner.js +15 -8
- package/dist/agent/index.d.ts +0 -1
- package/dist/agent/index.js +0 -1
- package/dist/agent/progress-formatter.d.ts +0 -1
- package/dist/agent/progress-formatter.js +0 -1
- package/dist/agent/run-queue.d.ts +0 -1
- package/dist/agent/run-queue.js +0 -1
- package/dist/agent/runner-factory.d.ts +0 -1
- package/dist/agent/runner-factory.js +0 -1
- package/dist/agent/session-events.d.ts +0 -1
- package/dist/agent/session-events.js +0 -1
- package/dist/agent/session-resource-gate.d.ts +10 -0
- package/dist/agent/session-resource-gate.js +44 -0
- package/dist/agent/type-guards.d.ts +0 -1
- package/dist/agent/type-guards.js +0 -1
- package/dist/agent/types.d.ts +0 -1
- package/dist/agent/types.js +0 -1
- package/dist/agent.d.ts +0 -1
- package/dist/agent.js +0 -1
- package/dist/command-extension.d.ts +0 -1
- package/dist/command-extension.js +0 -1
- package/dist/commands.d.ts +0 -1
- package/dist/commands.js +0 -1
- package/dist/config-loader.d.ts +0 -1
- package/dist/config-loader.js +1 -2
- package/dist/context.d.ts +0 -1
- package/dist/context.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/log.d.ts +0 -1
- package/dist/log.js +0 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.js +0 -1
- package/dist/memory/bootstrap.d.ts +0 -1
- package/dist/memory/bootstrap.js +0 -1
- package/dist/memory/candidates.d.ts +0 -1
- package/dist/memory/candidates.js +0 -1
- package/dist/memory/chinese-words.d.ts +0 -1
- package/dist/memory/chinese-words.js +64 -1
- package/dist/memory/consolidation.d.ts +0 -1
- package/dist/memory/consolidation.js +1 -2
- package/dist/memory/files.d.ts +0 -1
- package/dist/memory/files.js +0 -1
- package/dist/memory/lifecycle.d.ts +0 -1
- package/dist/memory/lifecycle.js +0 -1
- package/dist/memory/recall.d.ts +1 -1
- package/dist/memory/recall.js +76 -10
- package/dist/memory/session.d.ts +0 -1
- package/dist/memory/session.js +1 -2
- package/dist/model-utils.d.ts +0 -1
- package/dist/model-utils.js +0 -1
- package/dist/paths.d.ts +0 -1
- package/dist/paths.js +0 -1
- package/dist/prompt-builder.d.ts +0 -1
- package/dist/prompt-builder.js +0 -1
- package/dist/runtime/bootstrap.d.ts +0 -1
- package/dist/runtime/bootstrap.js +0 -1
- package/dist/runtime/delivery.d.ts +0 -1
- package/dist/runtime/delivery.js +0 -1
- package/dist/runtime/dingtalk.d.ts +0 -1
- package/dist/runtime/dingtalk.js +0 -1
- package/dist/runtime/events.d.ts +0 -1
- package/dist/runtime/events.js +0 -1
- package/dist/runtime/store.d.ts +0 -1
- package/dist/runtime/store.js +0 -1
- package/dist/sandbox.d.ts +0 -1
- package/dist/sandbox.js +1 -2
- package/dist/{llm-json.d.ts → shared/llm-json.d.ts} +0 -1
- package/dist/{llm-json.js → shared/llm-json.js} +0 -1
- package/dist/shared/markdown-sections.d.ts +0 -1
- package/dist/shared/markdown-sections.js +0 -1
- package/dist/{shell-escape.d.ts → shared/shell-escape.d.ts} +0 -1
- package/dist/{shell-escape.js → shared/shell-escape.js} +0 -1
- package/dist/shared/text-utils.d.ts +0 -1
- package/dist/shared/text-utils.js +0 -1
- package/dist/shared/type-guards.d.ts +0 -1
- package/dist/shared/type-guards.js +0 -1
- package/dist/shared/types.d.ts +0 -1
- package/dist/shared/types.js +0 -1
- package/dist/sidecar-worker.d.ts +0 -1
- package/dist/sidecar-worker.js +0 -1
- package/dist/subagents/discovery.d.ts +0 -1
- package/dist/subagents/discovery.js +0 -1
- package/dist/subagents/tool.d.ts +0 -1
- package/dist/subagents/tool.js +0 -1
- package/dist/tools/attach.d.ts +0 -1
- package/dist/tools/attach.js +0 -1
- package/dist/tools/bash.d.ts +0 -1
- package/dist/tools/bash.js +0 -1
- package/dist/tools/edit.d.ts +0 -1
- package/dist/tools/edit.js +1 -2
- package/dist/tools/index.d.ts +0 -1
- package/dist/tools/index.js +0 -1
- package/dist/tools/read.d.ts +0 -1
- package/dist/tools/read.js +1 -2
- package/dist/tools/truncate.d.ts +0 -1
- package/dist/tools/truncate.js +0 -1
- package/dist/tools/write-content.d.ts +0 -1
- package/dist/tools/write-content.js +1 -2
- package/dist/tools/write.d.ts +0 -1
- package/dist/tools/write.js +0 -1
- package/package.json +9 -3
- package/CHANGELOG.md +0 -47
- package/dist/agent/channel-runner.d.ts.map +0 -1
- package/dist/agent/channel-runner.js.map +0 -1
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/index.js.map +0 -1
- package/dist/agent/progress-formatter.d.ts.map +0 -1
- package/dist/agent/progress-formatter.js.map +0 -1
- package/dist/agent/run-queue.d.ts.map +0 -1
- package/dist/agent/run-queue.js.map +0 -1
- package/dist/agent/runner-factory.d.ts.map +0 -1
- package/dist/agent/runner-factory.js.map +0 -1
- package/dist/agent/session-events.d.ts.map +0 -1
- package/dist/agent/session-events.js.map +0 -1
- package/dist/agent/type-guards.d.ts.map +0 -1
- package/dist/agent/type-guards.js.map +0 -1
- package/dist/agent/types.d.ts.map +0 -1
- package/dist/agent/types.js.map +0 -1
- package/dist/agent.d.ts.map +0 -1
- package/dist/agent.js.map +0 -1
- package/dist/command-extension.d.ts.map +0 -1
- package/dist/command-extension.js.map +0 -1
- package/dist/commands.d.ts.map +0 -1
- package/dist/commands.js.map +0 -1
- package/dist/config-loader.d.ts.map +0 -1
- package/dist/config-loader.js.map +0 -1
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/llm-json.d.ts.map +0 -1
- package/dist/llm-json.js.map +0 -1
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js.map +0 -1
- package/dist/main.d.ts.map +0 -1
- package/dist/main.js.map +0 -1
- package/dist/memory/bootstrap.d.ts.map +0 -1
- package/dist/memory/bootstrap.js.map +0 -1
- package/dist/memory/candidates.d.ts.map +0 -1
- package/dist/memory/candidates.js.map +0 -1
- package/dist/memory/chinese-words.d.ts.map +0 -1
- package/dist/memory/chinese-words.js.map +0 -1
- package/dist/memory/consolidation.d.ts.map +0 -1
- package/dist/memory/consolidation.js.map +0 -1
- package/dist/memory/files.d.ts.map +0 -1
- package/dist/memory/files.js.map +0 -1
- package/dist/memory/lifecycle.d.ts.map +0 -1
- package/dist/memory/lifecycle.js.map +0 -1
- package/dist/memory/recall.d.ts.map +0 -1
- package/dist/memory/recall.js.map +0 -1
- package/dist/memory/session.d.ts.map +0 -1
- package/dist/memory/session.js.map +0 -1
- package/dist/model-utils.d.ts.map +0 -1
- package/dist/model-utils.js.map +0 -1
- package/dist/paths.d.ts.map +0 -1
- package/dist/paths.js.map +0 -1
- package/dist/prompt-builder.d.ts.map +0 -1
- package/dist/prompt-builder.js.map +0 -1
- package/dist/runtime/bootstrap.d.ts.map +0 -1
- package/dist/runtime/bootstrap.js.map +0 -1
- package/dist/runtime/delivery.d.ts.map +0 -1
- package/dist/runtime/delivery.js.map +0 -1
- package/dist/runtime/dingtalk.d.ts.map +0 -1
- package/dist/runtime/dingtalk.js.map +0 -1
- package/dist/runtime/events.d.ts.map +0 -1
- package/dist/runtime/events.js.map +0 -1
- package/dist/runtime/store.d.ts.map +0 -1
- package/dist/runtime/store.js.map +0 -1
- package/dist/sandbox.d.ts.map +0 -1
- package/dist/sandbox.js.map +0 -1
- package/dist/shared/markdown-sections.d.ts.map +0 -1
- package/dist/shared/markdown-sections.js.map +0 -1
- package/dist/shared/text-utils.d.ts.map +0 -1
- package/dist/shared/text-utils.js.map +0 -1
- package/dist/shared/type-guards.d.ts.map +0 -1
- package/dist/shared/type-guards.js.map +0 -1
- package/dist/shared/types.d.ts.map +0 -1
- package/dist/shared/types.js.map +0 -1
- package/dist/shell-escape.d.ts.map +0 -1
- package/dist/shell-escape.js.map +0 -1
- package/dist/sidecar-worker.d.ts.map +0 -1
- package/dist/sidecar-worker.js.map +0 -1
- package/dist/subagents/discovery.d.ts.map +0 -1
- package/dist/subagents/discovery.js.map +0 -1
- package/dist/subagents/tool.d.ts.map +0 -1
- package/dist/subagents/tool.js.map +0 -1
- package/dist/tools/attach.d.ts.map +0 -1
- package/dist/tools/attach.js.map +0 -1
- package/dist/tools/bash.d.ts.map +0 -1
- package/dist/tools/bash.js.map +0 -1
- package/dist/tools/edit.d.ts.map +0 -1
- package/dist/tools/edit.js.map +0 -1
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/read.d.ts.map +0 -1
- package/dist/tools/read.js.map +0 -1
- package/dist/tools/truncate.d.ts.map +0 -1
- package/dist/tools/truncate.js.map +0 -1
- package/dist/tools/write-content.d.ts.map +0 -1
- package/dist/tools/write-content.js.map +0 -1
- package/dist/tools/write.d.ts.map +0 -1
- package/dist/tools/write.js.map +0 -1
- package/docs/memory-audit.md +0 -330
- package/docs/memory-optimization-round2.md +0 -319
- package/docs/specs/001-implement-memory/memory-rfc.md +0 -297
- package/docs/specs/002-subagent/pi-subagent-analyse.txt +0 -190
- package/docs/specs/002-subagent/pi-subagent-design.txt +0 -266
- package/docs/specs/002-subagent/pi-subagent-phase1-plan.txt +0 -529
- package/docs/specs/003-improve-memory/design.md +0 -537
- package/docs/specs/003-improve-memory/interfaces-and-tests.md +0 -473
- 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
|
|
3
|
+
Pipiclaw 是一个 AI 助手运行时(AI assistant runtime),以 [`pi-coding-agent`](https://www.npmjs.com/package/@mariozechner/pi-coding-agent) 为核心,补齐了作为工作助手长期使用时最需要的几层能力:钉钉接入、AI Card 过程展示、子代理、分层记忆、定时事件,以及按会话通道持久化的工作区(workspace)。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
如果你希望 AI 助手不只是聊天,而是能在钉钉里持续工作、保留上下文、执行任务,并且实时告知你它正在做什么,那么 Pipiclaw 就是你需要的。
|
|
6
6
|
|
|
7
7
|
npm package: [`@oyasmi/pipiclaw`](https://www.npmjs.com/package/@oyasmi/pipiclaw)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
文档入口:
|
|
10
10
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
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
|
-
##
|
|
15
|
+
## 功能特性(Features)
|
|
20
16
|
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
- channel
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
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
|
-
|
|
28
|
+
从零开始,让 Pipiclaw 在你的钉钉里成功回复第一条消息。可以直接让Agent帮你完成。如果你希望自己逐步操作,再看后面的“自己动手安装”。
|
|
34
29
|
|
|
35
|
-
###
|
|
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
|
-
-
|
|
41
|
-
-
|
|
113
|
+
- 至少一种可用的模型接入方式
|
|
114
|
+
- 直接使用 Anthropic 默认模型
|
|
115
|
+
- 或在 `models.json` 中配置自定义模型提供方(provider)
|
|
42
116
|
|
|
43
|
-
|
|
117
|
+
#### 2. 安装(Install)
|
|
44
118
|
|
|
45
119
|
```bash
|
|
46
120
|
npm install -g @oyasmi/pipiclaw
|
|
47
121
|
```
|
|
48
122
|
|
|
49
|
-
|
|
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
|
-
|
|
150
|
+
#### 4. 创建钉钉应用(Create a DingTalk App)
|
|
77
151
|
|
|
78
|
-
在 [钉钉开放平台](https://open-dev.dingtalk.com/)
|
|
152
|
+
在 [钉钉开放平台](https://open-dev.dingtalk.com/) 创建企业内部应用,并完成下面几项:
|
|
79
153
|
|
|
80
|
-
1.
|
|
154
|
+
1. 创建应用,获取 `Client ID` 和 `Client Secret`
|
|
81
155
|
2. 开启机器人能力
|
|
82
156
|
3. 启用 Stream Mode
|
|
83
|
-
4.
|
|
157
|
+
4. 建议一并创建 AI Card 模板并获取 `Card Template ID`
|
|
84
158
|
|
|
85
|
-
|
|
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": "
|
|
94
|
-
"cardTemplateId": "
|
|
167
|
+
"robotCode": "",
|
|
168
|
+
"cardTemplateId": "",
|
|
95
169
|
"cardTemplateKey": "content",
|
|
96
|
-
"allowFrom": [
|
|
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
|
-
|
|
186
|
+
建议配置;留空时表示暂不启用 AI Card
|
|
111
187
|
- `allowFrom`
|
|
112
|
-
|
|
188
|
+
设为 `[]` 或删除时表示允许所有人
|
|
189
|
+
|
|
190
|
+
推荐把 AI Card 一起配上,这样在钉钉里能直接看到过程更新。只有在排查接入链路时,才建议临时把 `cardTemplateId` 留空。
|
|
113
191
|
|
|
114
|
-
|
|
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":
|
|
216
|
+
"anthropic": {
|
|
217
|
+
"type": "api_key",
|
|
218
|
+
"key": "sk-ant-..."
|
|
219
|
+
}
|
|
127
220
|
}
|
|
128
221
|
```
|
|
129
222
|
|
|
130
|
-
|
|
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
|
-
|
|
250
|
+
这个例子里最关键的四项是:
|
|
139
251
|
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
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
|
|
293
|
+
pipiclaw
|
|
148
294
|
```
|
|
149
295
|
|
|
150
|
-
|
|
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
|
-
-
|
|
161
|
-
-
|
|
162
|
-
-
|
|
312
|
+
- 如果已经配置 AI Card,你会在钉钉里看到过程更新;这也是推荐的使用方式
|
|
313
|
+
- 如果暂时没有配置 AI Card,机器人会直接发送普通消息
|
|
314
|
+
- Pipiclaw 会在本地创建对应的会话通道目录
|
|
315
|
+
- 后续会话会复用该会话通道的工作区(workspace)与记忆文件
|
|
163
316
|
|
|
164
|
-
## Configuration
|
|
317
|
+
## 配置(Configuration)
|
|
165
318
|
|
|
166
|
-
|
|
319
|
+
配置与使用相关的文档建议按下面顺序阅读:
|
|
167
320
|
|
|
168
|
-
|
|
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
|
-
|
|
171
|
-
|
|
327
|
+
### 配置文件(Config Files)
|
|
328
|
+
|
|
329
|
+
| 文件 | 用途 |
|
|
330
|
+
|------|------|
|
|
172
331
|
| `~/.pi/pipiclaw/channel.json` | 钉钉应用配置 |
|
|
173
332
|
| `~/.pi/pipiclaw/auth.json` | 模型认证信息 |
|
|
174
|
-
| `~/.pi/pipiclaw/models.json` |
|
|
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
|
-
|
|
|
180
|
-
|
|
181
|
-
| `ANTHROPIC_API_KEY` | Anthropic API
|
|
182
|
-
| `PIPICLAW_DEBUG` |
|
|
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
|
-
|
|
350
|
+
这些命令由钉钉运行时(DingTalk runtime)直接处理:
|
|
192
351
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
|
363
|
+
这些命令由 `AgentSession` 扩展命令(extension command)立即执行,不会作为普通 prompt 发给模型:
|
|
203
364
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
365
|
+
| 命令 | 说明 |
|
|
366
|
+
|------|------|
|
|
367
|
+
| `/new` | 开启一个新的会话 |
|
|
368
|
+
| `/compact [instructions]` | 手动压缩当前会话上下文,可附带额外说明 |
|
|
369
|
+
| `/session` | 查看当前会话状态、消息统计、token 使用量和当前模型 |
|
|
370
|
+
| `/model [provider/modelId|modelId]` | 查看当前模型,或切换到指定模型 |
|
|
208
371
|
|
|
209
372
|
`/model` 只支持精确匹配切换。
|
|
210
373
|
|
|
211
|
-
## Workspace
|
|
212
|
-
|
|
213
|
-
Pipiclaw 的核心不是“一个机器人实例”,而是一组长期存在的 workspace 文件。
|
|
374
|
+
## 工作区结构(Workspace Layout)
|
|
214
375
|
|
|
215
|
-
|
|
376
|
+
Pipiclaw 的核心不是一个临时机器人实例,而是一组长期存在的工作区(workspace)文件。
|
|
216
377
|
|
|
217
378
|
```text
|
|
218
379
|
~/.pi/pipiclaw/
|
|
@@ -240,142 +401,105 @@ Pipiclaw 的核心不是“一个机器人实例”,而是一组长期存在
|
|
|
240
401
|
└── ...
|
|
241
402
|
```
|
|
242
403
|
|
|
243
|
-
|
|
404
|
+
其中:
|
|
244
405
|
|
|
245
|
-
|
|
406
|
+
- `SOUL.md`
|
|
407
|
+
定义助手身份、语气和回复风格
|
|
408
|
+
- `AGENTS.md`
|
|
409
|
+
定义工作规则和行为约束
|
|
410
|
+
- `SESSION.md`
|
|
411
|
+
当前工作态
|
|
412
|
+
- `MEMORY.md`
|
|
413
|
+
稳定事实、决策和偏好
|
|
414
|
+
- `HISTORY.md`
|
|
415
|
+
更早上下文的摘要
|
|
246
416
|
|
|
247
|
-
|
|
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
|
-
|
|
261
|
-
- `<channel>/context.jsonl`
|
|
428
|
+
更早会话的摘要历史
|
|
262
429
|
|
|
263
|
-
|
|
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
|
-
|
|
433
|
+
按当前请求从 `SESSION.md` / `MEMORY.md` / `HISTORY.md` 里挑少量相关片段注入当前 prompt
|
|
285
434
|
- consolidation
|
|
286
|
-
在 compaction 或 session trimming 前刷新 `SESSION.md
|
|
435
|
+
在 compaction 或 session trimming 前刷新 `SESSION.md`,并把值得保留的信息沉淀到 `MEMORY.md` / `HISTORY.md`
|
|
287
436
|
|
|
288
|
-
|
|
437
|
+
## 事件与子代理(Events and Sub-Agents)
|
|
289
438
|
|
|
290
|
-
-
|
|
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
|
-
-
|
|
298
|
-
- 稳定事实和决策,看 `MEMORY.md`
|
|
299
|
-
- 更老的脉络和叙事,看 `HISTORY.md`
|
|
444
|
+
这两部分更接近“日常使用”而不是基础配置,单独整理在 [docs/events-and-sub-agents.md](./docs/events-and-sub-agents.md)。
|
|
300
445
|
|
|
301
|
-
##
|
|
446
|
+
## 故障排查(Troubleshooting)
|
|
302
447
|
|
|
303
|
-
|
|
448
|
+
### `pipiclaw` 首次启动即退出(`pipiclaw` Exits on First Run)
|
|
304
449
|
|
|
305
|
-
|
|
306
|
-
- 临时 inline sub-agent:由主代理在一次 `subagent` 工具调用里直接构造
|
|
450
|
+
通常是因为 `channel.json` 仍然保留了初始化占位值。
|
|
307
451
|
|
|
308
|
-
|
|
452
|
+
优先检查这些字段:
|
|
309
453
|
|
|
310
|
-
|
|
454
|
+
- `clientId`
|
|
455
|
+
- `clientSecret`
|
|
456
|
+
- `robotCode`
|
|
457
|
+
- `cardTemplateId`
|
|
458
|
+
- `allowFrom`
|
|
311
459
|
|
|
312
|
-
|
|
460
|
+
第一次接通时,最省事的做法是:
|
|
313
461
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
|
|
466
|
+
确认链路正常后,建议尽快把 AI Card 配上。
|
|
332
467
|
|
|
333
|
-
|
|
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
|
-
-
|
|
341
|
-
-
|
|
342
|
-
-
|
|
343
|
-
-
|
|
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
|
-
|
|
480
|
+
### 机器人能收到消息,但没有回复(The Bot Receives Messages but Does Not Reply)
|
|
346
481
|
|
|
347
|
-
|
|
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
|
-
|
|
484
|
+
- 模型认证是否可用
|
|
485
|
+
- `models.json` 是否声明了你要使用的模型提供方 / 模型
|
|
486
|
+
- `allowFrom` 是否把你的账号挡住了
|
|
487
|
+
- 钉钉机器人 Stream Mode 是否已开启
|
|
488
|
+
- 如果配置了 `cardTemplateId`,该模板是否有效
|
|
357
489
|
|
|
358
|
-
|
|
490
|
+
如果只是想先验证链路,可以临时把 `cardTemplateId` 留空;正常使用时仍然建议启用 AI Card。
|
|
359
491
|
|
|
360
|
-
|
|
361
|
-
- `one-shot`
|
|
362
|
-
- `periodic`
|
|
492
|
+
### 需要查看精确提示词(Need to Inspect the Exact Prompt)
|
|
363
493
|
|
|
364
|
-
|
|
494
|
+
设置:
|
|
365
495
|
|
|
366
|
-
```
|
|
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
|
-
|
|
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
|
|
512
|
+
- `npm run typecheck`
|
|
389
513
|
- `npm run test`
|
|
390
514
|
- `npm run check`
|
|
391
515
|
|
|
392
|
-
##
|
|
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).
|