@zihanw/pi-forge 0.3.2 → 0.4.0
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/CHANGELOG.md +196 -0
- package/PUBLIC_API.md +5 -0
- package/README.md +93 -478
- package/README.zh-CN.md +88 -461
- package/SUBAGENT_ADAPTER_CONTRACT.md +5 -0
- package/dist/agent-profile.d.ts +71 -0
- package/dist/agent-profile.d.ts.map +1 -0
- package/dist/agent-profile.js +303 -0
- package/dist/agent-profile.js.map +1 -0
- package/dist/forge-config.d.ts +88 -0
- package/dist/forge-config.d.ts.map +1 -0
- package/dist/forge-config.js +290 -0
- package/dist/forge-config.js.map +1 -0
- package/dist/forge-extensions.d.ts.map +1 -1
- package/dist/forge-extensions.js +19 -3
- package/dist/forge-extensions.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +97 -358
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +11 -3
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +90 -4
- package/dist/lifecycle.js.map +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +116 -5
- package/dist/loader.js.map +1 -1
- package/dist/payload-capture.d.ts.map +1 -1
- package/dist/payload-capture.js +27 -0
- package/dist/payload-capture.js.map +1 -1
- package/dist/payload-command.d.ts +3 -3
- package/dist/payload-command.d.ts.map +1 -1
- package/dist/payload-command.js.map +1 -1
- package/dist/preview.d.ts +2 -2
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +2 -3
- package/dist/preview.js.map +1 -1
- package/dist/profile-command.d.ts +12 -0
- package/dist/profile-command.d.ts.map +1 -0
- package/dist/profile-command.js +291 -0
- package/dist/profile-command.js.map +1 -0
- package/dist/profile-service.d.ts +103 -0
- package/dist/profile-service.d.ts.map +1 -0
- package/dist/profile-service.js +220 -0
- package/dist/profile-service.js.map +1 -0
- package/dist/runtime/profile-runtime.d.ts +13 -0
- package/dist/runtime/profile-runtime.d.ts.map +1 -0
- package/dist/runtime/profile-runtime.js +47 -0
- package/dist/runtime/profile-runtime.js.map +1 -0
- package/dist/runtime/prompt-stack-runtime.d.ts +22 -0
- package/dist/runtime/prompt-stack-runtime.d.ts.map +1 -0
- package/dist/runtime/prompt-stack-runtime.js +104 -0
- package/dist/runtime/prompt-stack-runtime.js.map +1 -0
- package/dist/runtime/subagent-runtime.d.ts +45 -0
- package/dist/runtime/subagent-runtime.d.ts.map +1 -0
- package/dist/runtime/subagent-runtime.js +335 -0
- package/dist/runtime/subagent-runtime.js.map +1 -0
- package/dist/runtime/tool-policy-runtime.d.ts +15 -0
- package/dist/runtime/tool-policy-runtime.d.ts.map +1 -0
- package/dist/runtime/tool-policy-runtime.js +170 -0
- package/dist/runtime/tool-policy-runtime.js.map +1 -0
- package/dist/runtime/web-editor-runtime.d.ts +9 -0
- package/dist/runtime/web-editor-runtime.d.ts.map +1 -0
- package/dist/runtime/web-editor-runtime.js +131 -0
- package/dist/runtime/web-editor-runtime.js.map +1 -0
- package/dist/runtime-state.d.ts +4 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +2 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/storage.d.ts +4 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +24 -1
- package/dist/storage.js.map +1 -1
- package/dist/subagent/canonical.d.ts +22 -0
- package/dist/subagent/canonical.d.ts.map +1 -0
- package/dist/subagent/canonical.js +24 -0
- package/dist/subagent/canonical.js.map +1 -0
- package/dist/subagent/context.d.ts +8 -0
- package/dist/subagent/context.d.ts.map +1 -0
- package/dist/subagent/context.js +125 -0
- package/dist/subagent/context.js.map +1 -0
- package/dist/subagent/contract.d.ts +10 -0
- package/dist/subagent/contract.d.ts.map +1 -0
- package/dist/subagent/contract.js +10 -0
- package/dist/subagent/contract.js.map +1 -0
- package/dist/subagent/index.d.ts +14 -0
- package/dist/subagent/index.d.ts.map +1 -0
- package/dist/subagent/index.js +14 -0
- package/dist/subagent/index.js.map +1 -0
- package/dist/subagent/plan.d.ts +18 -0
- package/dist/subagent/plan.d.ts.map +1 -0
- package/dist/subagent/plan.js +157 -0
- package/dist/subagent/plan.js.map +1 -0
- package/dist/subagent/preflight.d.ts +4 -0
- package/dist/subagent/preflight.d.ts.map +1 -0
- package/dist/subagent/preflight.js +108 -0
- package/dist/subagent/preflight.js.map +1 -0
- package/dist/subagent/request.d.ts +4 -0
- package/dist/subagent/request.d.ts.map +1 -0
- package/dist/subagent/request.js +122 -0
- package/dist/subagent/request.js.map +1 -0
- package/dist/subagent/response.d.ts +8 -0
- package/dist/subagent/response.d.ts.map +1 -0
- package/dist/subagent/response.js +155 -0
- package/dist/subagent/response.js.map +1 -0
- package/dist/subagent/tools.d.ts +4 -0
- package/dist/subagent/tools.d.ts.map +1 -0
- package/dist/subagent/tools.js +42 -0
- package/dist/subagent/tools.js.map +1 -0
- package/dist/subagent/types.d.ts +268 -0
- package/dist/subagent/types.d.ts.map +1 -0
- package/dist/subagent/types.js +3 -0
- package/dist/subagent/types.js.map +1 -0
- package/dist/subagent/validation.d.ts +35 -0
- package/dist/subagent/validation.d.ts.map +1 -0
- package/dist/subagent/validation.js +314 -0
- package/dist/subagent/validation.js.map +1 -0
- package/dist/subagent-command.d.ts +4 -0
- package/dist/subagent-command.d.ts.map +1 -0
- package/dist/subagent-command.js +246 -0
- package/dist/subagent-command.js.map +1 -0
- package/dist/subagent-host.d.ts +44 -0
- package/dist/subagent-host.d.ts.map +1 -0
- package/dist/subagent-host.js +292 -0
- package/dist/subagent-host.js.map +1 -0
- package/dist/subagent-profile-tool.d.ts +49 -0
- package/dist/subagent-profile-tool.d.ts.map +1 -0
- package/dist/subagent-profile-tool.js +124 -0
- package/dist/subagent-profile-tool.js.map +1 -0
- package/dist/subagent-tool.d.ts +53 -0
- package/dist/subagent-tool.d.ts.map +1 -0
- package/dist/subagent-tool.js +456 -0
- package/dist/subagent-tool.js.map +1 -0
- package/dist/web-editor/client-script.d.ts +2 -0
- package/dist/web-editor/client-script.d.ts.map +1 -0
- package/dist/web-editor/client-script.generated.d.ts +2 -0
- package/dist/web-editor/client-script.generated.d.ts.map +1 -0
- package/dist/web-editor/client-script.generated.js +3 -0
- package/dist/web-editor/client-script.generated.js.map +1 -0
- package/dist/web-editor/client-script.js +2 -0
- package/dist/web-editor/client-script.js.map +1 -0
- package/dist/web-editor/client-styles.d.ts +2 -0
- package/dist/web-editor/client-styles.d.ts.map +1 -0
- package/dist/web-editor/client-styles.generated.d.ts +2 -0
- package/dist/web-editor/client-styles.generated.d.ts.map +1 -0
- package/dist/web-editor/client-styles.generated.js +3 -0
- package/dist/web-editor/client-styles.generated.js.map +1 -0
- package/dist/web-editor/client-styles.js +2 -0
- package/dist/web-editor/client-styles.js.map +1 -0
- package/dist/web-editor/page.d.ts +2 -0
- package/dist/web-editor/page.d.ts.map +1 -1
- package/dist/web-editor/page.js +14 -3319
- package/dist/web-editor/page.js.map +1 -1
- package/dist/web-editor/server.d.ts.map +1 -1
- package/dist/web-editor/server.js +148 -0
- package/dist/web-editor/server.js.map +1 -1
- package/dist/web-editor/styles.d.ts +2 -0
- package/dist/web-editor/styles.d.ts.map +1 -0
- package/dist/web-editor/styles.js +1053 -0
- package/dist/web-editor/styles.js.map +1 -0
- package/dist/web-editor/types.d.ts +79 -0
- package/dist/web-editor/types.d.ts.map +1 -1
- package/dist/web-host.d.ts +16 -5
- package/dist/web-host.d.ts.map +1 -1
- package/dist/web-host.js +307 -0
- package/dist/web-host.js.map +1 -1
- package/docs/README.md +41 -0
- package/docs/concepts/agent-profiles.md +60 -0
- package/docs/concepts/prompt-stacks.md +90 -0
- package/docs/design/README.md +17 -0
- package/docs/design/roadmap-0.4-archive.md +216 -0
- package/docs/design/subagents/design-review.md +220 -0
- package/docs/design/subagents/interface-design.md +274 -0
- package/docs/design/subagents/sdk-spike-findings.md +117 -0
- package/docs/development/complexity-review.md +86 -0
- package/docs/development/release.md +31 -0
- package/docs/development/roadmap.md +42 -0
- package/docs/development/setup.md +75 -0
- package/docs/getting-started.md +93 -0
- package/docs/guides/custom-macros-and-slots.md +68 -0
- package/docs/guides/debugging.md +39 -0
- package/docs/guides/delegation.md +99 -0
- package/docs/guides/sillytavern-import.md +47 -0
- package/docs/guides/use-cases.md +65 -0
- package/docs/guides/web-editor.md +75 -0
- package/docs/reference/commands.md +60 -0
- package/docs/reference/configuration.md +64 -0
- package/docs/reference/features.md +279 -0
- package/docs/reference/macros-and-slots.md +82 -0
- package/docs/reference/public-api.md +28 -0
- package/docs/reference/stack-schema.md +167 -0
- package/docs/reference/subagent-adapter.md +204 -0
- package/docs/zh-CN/README.md +37 -0
- package/docs/zh-CN/concepts/agent-profiles.md +44 -0
- package/docs/zh-CN/concepts/prompt-stacks.md +40 -0
- package/docs/zh-CN/getting-started.md +79 -0
- package/docs/zh-CN/guides/delegation.md +66 -0
- package/docs/zh-CN/guides/web-editor.md +45 -0
- package/docs/zh-CN/reference/commands.md +58 -0
- package/package.json +55 -13
- package/src/compiler.ts +0 -578
- package/src/extension-registry.ts +0 -33
- package/src/forge-extensions.ts +0 -223
- package/src/index.ts +0 -445
- package/src/lifecycle.ts +0 -171
- package/src/loader.ts +0 -394
- package/src/macro-engine.ts +0 -358
- package/src/payload-capture.ts +0 -85
- package/src/payload-command.ts +0 -138
- package/src/policy.ts +0 -42
- package/src/preset-command.ts +0 -280
- package/src/preview.ts +0 -226
- package/src/regex.ts +0 -500
- package/src/render-helpers.ts +0 -169
- package/src/runtime-state.ts +0 -40
- package/src/sillytavern-importer/items.ts +0 -98
- package/src/sillytavern-importer/macros.ts +0 -159
- package/src/sillytavern-importer/prompt-order.ts +0 -54
- package/src/sillytavern-importer/regex.ts +0 -270
- package/src/sillytavern-importer/report.ts +0 -202
- package/src/sillytavern-importer/types.ts +0 -120
- package/src/sillytavern-importer.ts +0 -152
- package/src/slot-renderers.ts +0 -414
- package/src/stack-migration.ts +0 -159
- package/src/storage.ts +0 -45
- package/src/types.ts +0 -209
- package/src/web-editor/index.ts +0 -2
- package/src/web-editor/page.ts +0 -3330
- package/src/web-editor/server.ts +0 -294
- package/src/web-editor/types.ts +0 -98
- package/src/web-host.ts +0 -232
package/README.zh-CN.md
CHANGED
|
@@ -1,523 +1,150 @@
|
|
|
1
1
|
# pi-forge
|
|
2
2
|
|
|
3
|
-
[English](README.md) | [简体中文](README.zh-CN.md)
|
|
3
|
+
[English](README.md) | [简体中文](README.zh-CN.md) · [中文文档](docs/zh-CN/README.md)
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
|
|
7
|
-
**pi-forge** 让你自定义 Pi
|
|
7
|
+
**pi-forge** 让你自定义 [Pi](https://github.com/badlogic/pi-mono) 的思考方式和行为。Prompt stack(提示栈)负责 prompt 组合和工具策略;agent profile(agent 配置预设)可以一次性应用模型、思考等级和提示栈。
|
|
8
8
|
|
|
9
|
-
可以把它理解为 AI agent
|
|
9
|
+
可以把它理解为 AI agent 的角色卡和工作台。
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## 主要能力
|
|
12
12
|
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
13
|
+
- 把 system prompt、聊天历史、工具、skills、项目上下文和运行时数据组合成可排序的 block 和 slot。
|
|
14
|
+
- 用一条命令切换编程、审查、写作、角色扮演和翻译模式。
|
|
15
|
+
- 保存并应用完整的模型/思考等级/提示栈预设。
|
|
16
|
+
- 按栈严格限制工具,并过滤模型可见的 skills。
|
|
17
|
+
- 使用静态、轮次和会话变量,以及支持嵌套的模板宏。
|
|
18
|
+
- 对发给模型的 prompt 或最终 assistant 消息执行确定性 regex 转换。
|
|
19
|
+
- 导入 SillyTavern 预设并检查迁移报告。
|
|
20
|
+
- 在本地 Web 编辑器中管理 stack/profile,并检查实际 provider payload。
|
|
21
|
+
- 用明确启用的 profile 运行实验性、需要审批的前台 subagent。
|
|
21
22
|
|
|
22
|
-
##
|
|
23
|
+
## 安装
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
pi-forge 需要 Node.js 22.19 或更高版本。
|
|
25
26
|
|
|
26
27
|
```bash
|
|
27
28
|
pi install npm:@zihanw/pi-forge
|
|
28
29
|
```
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
安装或更新后请重启 Pi。运行中的 Pi host 会向 extension 提供 SDK package;pi-forge 只在开发和测试中固定精确版本,以保证结果可复现,不会用 peer dependency 锁死 Pi 频繁发布的版本。兼容策略见[开发与兼容性](docs/development/setup.md#pi-compatibility)(英文)。
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
## 五分钟上手
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
### 1. 创建 prompt stack
|
|
36
|
+
|
|
37
|
+
从 [默认 Pi mirror](examples/default-prompt-stack.json) 创建 `.pi/forge/prompt-stacks/default.json`:
|
|
35
38
|
|
|
36
39
|
```bash
|
|
37
40
|
mkdir -p .pi/forge/prompt-stacks
|
|
38
|
-
|
|
41
|
+
cp examples/default-prompt-stack.json .pi/forge/prompt-stacks/default.json
|
|
39
42
|
```
|
|
40
43
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
搞定。重启 Pi 或执行 `/preset reload`。如果当前没有选中其他栈,`default.json` 会自动启用;如果你之前执行过 `/preset use none` 或选择了别的栈,请执行 `/preset use default`。
|
|
44
|
+
如果你通过 npm 安装而不是 clone 仓库,请直接打开 `/preset ui` 新建 stack;编辑器使用相同的 Pi mirror 布局。
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
不想手写 JSON?pi-forge 内置了 Web 编辑器:
|
|
46
|
+
重启 Pi,或执行:
|
|
48
47
|
|
|
48
|
+
```text
|
|
49
|
+
/preset reload
|
|
50
|
+
/preset use default
|
|
49
51
|
```
|
|
50
|
-
/preset ui
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
拖拽、新建、编辑、校验、查看完整预览和捕获的 payload、用 tabs 管理变量/context/regex 规则、切换深色模式、通过原始 stack JSON 修复高级字段、导入、导出、fork、删除栈 —— 全在浏览器里完成。新栈会从默认 Pi prompt mirror 布局开始。Stack metadata 可以折叠,方便把当前编辑区留在屏幕内。Policy tab 会显示已注册工具和已加载 skills,并提供已选 pattern chips 和过滤输入,方便用精确名称编写 allow/deny 规则,同时保留通配符写法。
|
|
54
|
-
|
|
55
|
-
导入支持原生 pi-forge stack JSON,也支持 SillyTavern 预设 JSON。SillyTavern 预设会自动转换成 prompt stack;如果一个预设里有多个 `character_id` 配置,编辑器会询问要使用哪一个。
|
|
56
|
-
|
|
57
|
-
编辑器默认运行在一个可用的 `127.0.0.1` 端口,并带有会话 token,所以多个 Pi 实例可以同时打开各自的编辑器。如果 Pi 在 session navigation 或新会话后重新初始化扩展,同一项目中的 `/preset ui` 会复用已有编辑器 URL,不会遗留旧 server 后再开一个新端口。写入需要项目被信任,且只会写入 prompt-stack 存储目录。新建的栈会写入 `.pi/forge/prompt-stacks`;旧的 `.pi/prompt-stacks` 栈仍然可读取和编辑。保存、导入、fork、删除成功后会重新加载到当前 Pi 会话。需要时可以用 `/preset ui restart` 或 `/preset ui stop`。
|
|
58
|
-
|
|
59
|
-
要把旧栈复制到新位置,执行 `/preset migrate-stacks`。加 `--dry-run` 可先预览,加 `--overwrite` 可覆盖目标文件,加 `--delete-legacy` 会在复制成功后删除旧文件。
|
|
60
|
-
|
|
61
|
-
如果想优先使用某个端口,可以创建 `.pi/forge/config.json`。如果该端口被占用,pi-forge 会回退到其他可用端口,并显示实际 URL:
|
|
62
|
-
|
|
63
|
-
```json
|
|
64
|
-
{
|
|
65
|
-
"webEditor": {
|
|
66
|
-
"port": 41738
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## 使用场景
|
|
72
52
|
|
|
73
|
-
|
|
53
|
+
没有其他 stack 或已恢复 session 选择优先时,`default.json` 会自动启用。
|
|
74
54
|
|
|
75
|
-
|
|
55
|
+
### 2. 打开可视化编辑器
|
|
76
56
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
- 把 Pi 运行时上下文(工具、技能、项目)放在 `user` slot。
|
|
80
|
-
- 把 `chat-history` slot 设为跳过最新用户消息。
|
|
81
|
-
- 在最后加一个带 `{{lastUserMessage}}` 的 `user` block。
|
|
82
|
-
|
|
83
|
-
这样最新请求会更清晰,也不会重复出现。
|
|
84
|
-
|
|
85
|
-
如果想先从一个基线栈 fork 再改成角色,可以从 [examples/default-prompt-stack.json](examples/default-prompt-stack.json) 开始。
|
|
86
|
-
|
|
87
|
-
### 🧑💻 专注代码审查
|
|
88
|
-
|
|
89
|
-
创建一个 `reviewer.json` 栈,加入严格的审查规则,例如“优先检查正确性、回归风险、安全问题和缺失测试”。保留 `tools`、`project-context`、`variables` 和 `chat-history` slot,这样 Pi 仍然能检查仓库并看到你暴露的模板变量。
|
|
90
|
-
|
|
91
|
-
如果你想保留 Pi 原本的编程行为,只额外加上更严格的审查视角,可以使用 `mode: "append"`。
|
|
92
|
-
|
|
93
|
-
### 🌐 翻译模式
|
|
94
|
-
|
|
95
|
-
创建一个小型 `translator.json` 栈,用一个 system block 指定语气和目标语言,再保留 `chat-history` 和 `{{lastUserMessage}}` 的布局。这样可以在双语润色、直译、产品本地化审查之间快速切换,而不影响默认助手。
|
|
96
|
-
|
|
97
|
-
### 🔀 多模式切换
|
|
98
|
-
|
|
99
|
-
为不同任务创建独立的栈:
|
|
100
|
-
|
|
101
|
-
```
|
|
102
|
-
.pi/forge/prompt-stacks/
|
|
103
|
-
coder.json # 严格编程助手
|
|
104
|
-
writer.json # 创意写作搭档
|
|
105
|
-
translator.json # 双语翻译
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
用 `/preset use coder`、`/preset use writer` 等命令切换。
|
|
109
|
-
|
|
110
|
-
### 🧪 展示 pi-forge 特性的预设
|
|
111
|
-
|
|
112
|
-
- **Pi mirror** — 从 [examples/default-prompt-stack.json](examples/default-prompt-stack.json) 开始。它保留 Pi 的默认行为,同时把每个运行时区块变成可移动、可检查的 slot。
|
|
113
|
-
- **Focused reviewer** — 见 [examples/reviewer-prompt-stack.json](examples/reviewer-prompt-stack.json)。它禁用写文件工具,把旧聊天历史包裹成背景上下文,从 history 中移除最新用户消息,再用 `{{lastUserMessage}}` 作为明确的 review target 插入。
|
|
114
|
-
- **SillyTavern DM writer** — 见 [examples/sillytavern-dm-writer-prompt-stack.json](examples/sillytavern-dm-writer-prompt-stack.json)。它用 `{{char}}` / `{{user}}` 定义 Dungeon Master 角色,包裹旧冒险历史,把 `{{lastUserMessage}}` 作为当前玩家行动重新插入,并用 regex 清理 OOC 注释、暗骰标记、骰子写法和 `Player:` 前缀。
|
|
115
|
-
|
|
116
|
-
### 🔧 模板变量
|
|
117
|
-
|
|
118
|
-
定义稳定的 prompt 常量:
|
|
119
|
-
|
|
120
|
-
```json
|
|
121
|
-
"variables": {
|
|
122
|
-
"char": "Konata",
|
|
123
|
-
"user": "User"
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
在 prompt 文本里用 ST 风格宏做局部变量读写:
|
|
128
|
-
|
|
129
|
-
```
|
|
130
|
-
{{setvar::mood::focused}}
|
|
131
|
-
{{getvar::mood}}
|
|
132
|
-
{{setsessionvar::topic::compiler cleanup}}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
需要长期保存的项目记忆请写入仓库文件,而不是 pi-forge prompt 变量。
|
|
136
|
-
|
|
137
|
-
### 📦 SillyTavern 迁移
|
|
138
|
-
|
|
139
|
-
把 ST 预设导入 Pi:
|
|
140
|
-
|
|
141
|
-
```
|
|
142
|
-
/preset import-silly ~/SillyTavern/presets/my-preset.json
|
|
57
|
+
```text
|
|
58
|
+
/preset ui
|
|
143
59
|
```
|
|
144
60
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
可安全表示的 SillyTavern `promptOnly` regex 脚本会作为 history 阶段规则转换成 pi-forge `regex.rules`,包括 full-match token 转换、trim strings、depth 字段和明确的 user/assistant placement。Display-only、prompt/display 混合、DOM/browser、CSS/HTML 美化、JavaScript、不支持的 placement 和无效 regex 脚本会保留为报告项,供手动检查。
|
|
61
|
+
本地编辑器可以新建、fork、校验、预览、导入、导出和删除 prompt stack。切换到 **Agent profiles** 可以管理一次性模型/思考等级/stack 预设,以及实验性 delegation 配置。写入操作要求项目已被信任。
|
|
148
62
|
|
|
149
|
-
###
|
|
63
|
+
### 3. 保存 profile
|
|
150
64
|
|
|
151
|
-
|
|
65
|
+
先正常配置 Pi,然后捕获当前设置:
|
|
152
66
|
|
|
153
|
-
```
|
|
154
|
-
/
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
或者打开 `/preset ui`,点击 **Arm payload**,发送下一条 Pi prompt,然后在浏览器里查看脱敏后的 provider payload。
|
|
158
|
-
|
|
159
|
-
或者不发送只预览编译结果:
|
|
160
|
-
|
|
161
|
-
```
|
|
162
|
-
/preset preview
|
|
67
|
+
```text
|
|
68
|
+
/profile save reviewer
|
|
69
|
+
/profile use reviewer
|
|
163
70
|
```
|
|
164
71
|
|
|
165
|
-
|
|
72
|
+
Profile 只应用一次。之后手动修改模型或思考等级会被保留,直到再次应用 profile;当前 prompt stack 的工具策略则会在启用期间持续执行。
|
|
166
73
|
|
|
167
|
-
|
|
74
|
+
## 基本概念
|
|
168
75
|
|
|
169
|
-
|
|
170
|
-
|------|------|
|
|
171
|
-
| **Block** | 在指定位置插入的静态文本(系统提示词、用户消息、助手消息) |
|
|
172
|
-
| **Slot** | 来自 Pi 运行时的动态内容 —— 工具、技能、对话历史、日期、项目上下文等 |
|
|
76
|
+
Prompt stack 是一个有序 JSON 文档,包含:
|
|
173
77
|
|
|
174
|
-
|
|
78
|
+
| 类型 | 用途 |
|
|
79
|
+
|---|---|
|
|
80
|
+
| **Block** | 固定的 `system`、`user`、`assistant` 或隐藏 `custom` 文本 |
|
|
81
|
+
| **Slot** | 工具、skills、项目上下文、变量、日期/cwd、聊天历史等运行时内容 |
|
|
175
82
|
|
|
176
|
-
|
|
177
|
-
2. 在对话历史周围插入 `user`/`assistant` 角色的 block 和 slot。
|
|
178
|
-
3. 展开 `{{宏}}`,如 `{{lastUserMessage}}`、`{{date}}` 和自定义变量。
|
|
179
|
-
4. 将 stack 的工具策略应用到 Pi 当前 active tools,并过滤 pi-forge 渲染的 tool/skill slot。
|
|
180
|
-
5. 应用已启用的 `history` 和 `compiled` 阶段 outgoing regex 规则。
|
|
181
|
-
6. 可选地在 assistant 消息结束时应用破坏性的 `finalize` regex 规则。
|
|
83
|
+
Stack 可以 `replace`、`append` 或 `prepend` Pi 的基础 system prompt。编译时,pi-forge 会展开宏、插入对话、执行工具策略、过滤自己渲染的 skill 列表,并应用已启用的 regex 规则。
|
|
182
84
|
|
|
183
|
-
|
|
85
|
+
Agent profile 是项目级预设,引用精确 provider/model、思考等级和 prompt stack。它不会重复保存工具或 skill 策略;被引用的 stack 始终是唯一来源。
|
|
184
86
|
|
|
185
|
-
|
|
186
|
-
|------|-----------|
|
|
187
|
-
| `chat-history` | 当前对话 |
|
|
188
|
-
| `tools` | 可用工具及其描述 |
|
|
189
|
-
| `tool-guidelines` | 工具使用指导 |
|
|
190
|
-
| `skills` | 已加载的 Pi 技能 |
|
|
191
|
-
| `project-context` | 项目指令和上下文文件 |
|
|
192
|
-
| `variables` | 静态/会话/轮次模板变量 |
|
|
193
|
-
| `date` / `cwd` / `date-cwd` | 当前日期、可选当前时间和工作目录 |
|
|
194
|
-
| `active-model` | 当前使用的模型 |
|
|
195
|
-
| `append-system-prompt` | 用户追加的系统提示词 |
|
|
196
|
-
| `pi-docs` | Pi 文档指导 |
|
|
87
|
+
推荐从这些示例开始:
|
|
197
88
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
-
|
|
201
|
-
-
|
|
202
|
-
- **prepend** — 你的栈插入在 Pi 默认系统提示词之前。
|
|
89
|
+
- [默认 Pi mirror](examples/default-prompt-stack.json):保留 Pi 默认行为,同时让所有区域都可移动。
|
|
90
|
+
- [专注代码审查](examples/reviewer-prompt-stack.json):只读工具策略、背景历史和明确的最新用户目标。
|
|
91
|
+
- [SillyTavern DM writer](examples/sillytavern-dm-writer-prompt-stack.json):角色、变量、历史布局和 regex 清理。
|
|
92
|
+
- [自定义 system-status extension](examples/custom-system-status-extension/README.md):注册可信 macro 和 slot。
|
|
203
93
|
|
|
204
94
|
## 常用命令
|
|
205
95
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
|
209
|
-
|
|
210
|
-
| `/preset
|
|
211
|
-
| `/preset
|
|
212
|
-
| `/preset
|
|
213
|
-
| `/preset
|
|
214
|
-
| `/
|
|
215
|
-
| `/
|
|
216
|
-
| `/
|
|
217
|
-
| `/
|
|
218
|
-
| `/
|
|
219
|
-
| `/preset ui [stop\|restart]` | 打开、停止或重启 Web 编辑器 |
|
|
220
|
-
|
|
221
|
-
### 导入 & 调试
|
|
222
|
-
|
|
223
|
-
| 命令 | 作用 |
|
|
224
|
-
|------|------|
|
|
225
|
-
| `/preset import-silly <path>` | 导入 SillyTavern 预设 |
|
|
226
|
-
| `/intercept` | 显示下一条 provider payload |
|
|
227
|
-
| `/payload next [save=<path>]` | 显示并可保存下一条 payload |
|
|
228
|
-
|
|
229
|
-
## 常用宏
|
|
230
|
-
|
|
231
|
-
在 block 内容中使用这些宏来插入动态值:
|
|
232
|
-
|
|
233
|
-
| 宏 | 展开为 |
|
|
234
|
-
|----|--------|
|
|
235
|
-
| `{{lastUserMessage}}` | 用户最新消息 |
|
|
236
|
-
| `{{date}}` | 当前日期 (YYYY-MM-DD) |
|
|
237
|
-
| `{{time}}` | 当前时间 (HH:MM:SS) |
|
|
238
|
-
| `{{cwd}}` | 当前工作目录 |
|
|
239
|
-
| `{{tools}}` | 逗号分隔的工具名 |
|
|
240
|
-
| `{{selectedTools}}` | 所选工具名的别名 |
|
|
241
|
-
| `{{activeModel}}` | 当前模型 (provider/id) |
|
|
242
|
-
| `{{char}}` / `{{user}}` | 栈中定义的自定义变量 |
|
|
243
|
-
|
|
244
|
-
### 变量宏
|
|
245
|
-
|
|
246
|
-
```
|
|
247
|
-
{{setvar::name::value}} 设置轮次变量(每条消息清空)
|
|
248
|
-
{{setsessionvar::name::value}} 设置会话变量(持久化)
|
|
249
|
-
{{setvar::session::name::value}} 也可设置会话变量
|
|
250
|
-
{{getvar::name}} 读取变量(轮次 → 会话 → 静态)
|
|
251
|
-
{{getturnvar::name}} 只读取轮次变量
|
|
252
|
-
{{getsessionvar::name}} 只读取会话变量
|
|
253
|
-
{{clearvar::name}} 清除变量
|
|
254
|
-
{{clearturnvar::name}} 清除轮次变量
|
|
255
|
-
{{clearsessionvar::name}} 清除会话变量
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
### 过滤和条件宏
|
|
259
|
-
|
|
260
|
-
宏支持嵌套,`::` 分隔符只会在当前宏深度拆分。
|
|
261
|
-
|
|
262
|
-
| 宏 | 展开为 |
|
|
263
|
-
|----|--------|
|
|
264
|
-
| `{{trim::value}}` | 去掉首尾空白后的 `value` |
|
|
265
|
-
| `{{upper::value}}` | 大写 `value` |
|
|
266
|
-
| `{{lower::value}}` | 小写 `value` |
|
|
267
|
-
| `{{json::value}}` | `value` 的 JSON 字符串字面量 |
|
|
268
|
-
| `{{xml::value}}` | XML 转义后的 `value` |
|
|
269
|
-
| `{{ifvar::name::then::else}}` | 变量存在时输出 `then`,否则输出 `else` |
|
|
270
|
-
| `{{ifeq::name::expected::then::else}}` | 变量等于 `expected` 时输出 `then`,否则输出 `else` |
|
|
271
|
-
| `{{iftools::tool::then::else}}` | 当前工具列表包含 `tool` 时输出 `then`,否则输出 `else` |
|
|
272
|
-
| `{{ifslot::slot::then::else}}` | 启用的 stack 条目包含 `slot` 时输出 `then`,否则输出 `else` |
|
|
273
|
-
|
|
274
|
-
条件宏是 lazy 的:只有选中的分支会展开,所以被跳过的分支不会设置或清除变量。最后的 `else` 参数可省略,默认输出空文本。
|
|
275
|
-
|
|
276
|
-
### 可信自定义宏和 slot
|
|
277
|
-
|
|
278
|
-
自定义宏和 slot 由可信扩展代码注册,不把可执行代码写进 prompt-stack JSON。项目本地自定义代码放在 `.pi/forge/extensions/`。机器级个人自定义代码放在 `~/.pi/forge/extensions/`。pi-forge 会在项目受信任后、stack 校验前先加载全局模块,再加载项目本地模块;两个位置都会在 `/preset reload` 时重新加载。
|
|
279
|
-
|
|
280
|
-
这些模块会从 pi-forge 接收注册 API,所以不需要 import `@zihanw/pi-forge`,也不需要知道 pi-forge 安装在哪里。
|
|
281
|
-
|
|
282
|
-
```ts
|
|
283
|
-
// .pi/forge/extensions/ticket-context.ts
|
|
284
|
-
export default function register(api) {
|
|
285
|
-
api.registerMacro({
|
|
286
|
-
name: "ticketId",
|
|
287
|
-
description: "从会话变量读取当前 ticket id。",
|
|
288
|
-
render: (ctx) => ctx.variables.toMacroText(ctx.variables.get("ticket.id")),
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
api.registerSlot({
|
|
292
|
-
name: "ticket-context",
|
|
293
|
-
description: "渲染当前任务的 ticket 上下文。",
|
|
294
|
-
options: {
|
|
295
|
-
heading: { type: "string", default: "Ticket context" },
|
|
296
|
-
},
|
|
297
|
-
render: (ctx) => [
|
|
298
|
-
String(ctx.options.heading ?? "Ticket context") + ":",
|
|
299
|
-
"- Ticket: " + ctx.variables.toMacroText(ctx.variables.get("ticket.id")),
|
|
300
|
-
"- Project: " + ctx.helpers.normalizePath(ctx.runtime.options.cwd),
|
|
301
|
-
].join("\n"),
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
支持 `.ts`、`.js`、`.mjs`、`.cjs` 文件,也支持子目录里的 `index.*`。TypeScript 模块应使用 Node 运行时可直接 strip 的语法;如果需要更复杂的构建,使用 `.js` / `.mjs`。模块可以导出 `default function register(api)`,也可以导出具名 `register(api)`。注册的宏和 slot 名称必须在内置项、全局扩展、项目扩展之间唯一;重复名称会显示为扩展加载 warning。
|
|
96
|
+
| 命令 | 用途 |
|
|
97
|
+
|---|---|
|
|
98
|
+
| `/preset ui [stop\|restart]` | 打开或管理 Web 编辑器 |
|
|
99
|
+
| `/preset list` | 列出 prompt stack |
|
|
100
|
+
| `/preset use <id\|none>` | 选择或禁用 stack |
|
|
101
|
+
| `/preset preview [id]` | 编译 stack,但不发送请求 |
|
|
102
|
+
| `/preset validate [id]` | 校验一个或全部 stack |
|
|
103
|
+
| `/preset diagnostics` | 查看运行时和 extension 诊断 |
|
|
104
|
+
| `/profile list` | 列出并 preflight profile |
|
|
105
|
+
| `/profile save <id> [--overwrite]` | 把当前运行时保存为 profile |
|
|
106
|
+
| `/profile use <id>` | preflight 后一次性应用 profile |
|
|
107
|
+
| `/profile status` | 查看上次应用 provenance 和当前 drift |
|
|
108
|
+
| `/payload next [save=<path>]` | 检查下一个经过脱敏的 provider payload |
|
|
307
109
|
|
|
308
|
-
|
|
110
|
+
完整列表见[命令参考](docs/zh-CN/reference/commands.md)。
|
|
309
111
|
|
|
310
|
-
|
|
112
|
+
## 实验性前台 delegation
|
|
311
113
|
|
|
312
|
-
|
|
114
|
+
pi-forge 可以把明确授权的 profile 作为干净、前台运行的 Pi 子进程。模型通过 `forge_subagent_profiles` 发现可用 profile,再用 `forge_subagent` 调用;用户可以使用 `/forge-agent plan` 和 `/forge-agent run`。
|
|
313
115
|
|
|
314
|
-
|
|
116
|
+
此功能仍是**实验性功能**,profile 默认不能委派。请在受信任项目的 `.pi/forge/config.json` 或 Web 编辑器 delegation 卡片中逐个启用。除非项目明确授权无人值守的模型调用,否则执行前会显示与不可变计划绑定的审批界面。
|
|
315
117
|
|
|
316
|
-
|
|
118
|
+
> **安全边界:** 当前 backend 是 shared-user 进程,不是操作系统沙箱。“只读”只描述模型可见工具策略。Child 仍有启动用户的 OS 读取权限;可读内容可能发送给所选 provider,并保留在 Pi session 数据中。Timeout 和取消仅为 best effort,`/tree` 不能撤销 provider 请求、计费或外部影响。
|
|
317
119
|
|
|
318
|
-
|
|
120
|
+
启用前必须阅读[前台 delegation 与安全模型](docs/zh-CN/guides/delegation.md)。
|
|
319
121
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
```json
|
|
323
|
-
{
|
|
324
|
-
"kind": "block",
|
|
325
|
-
"id": "unique-id",
|
|
326
|
-
"name": "可读标签",
|
|
327
|
-
"enabled": true,
|
|
328
|
-
"role": "system",
|
|
329
|
-
"content": "你的文本。用 {{宏}} 插入动态内容。"
|
|
330
|
-
}
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
有效角色:`system`、`user`、`assistant`、`custom`。
|
|
334
|
-
|
|
335
|
-
**Slot:**
|
|
336
|
-
|
|
337
|
-
```json
|
|
338
|
-
{
|
|
339
|
-
"kind": "slot",
|
|
340
|
-
"id": "unique-id",
|
|
341
|
-
"name": "对话历史",
|
|
342
|
-
"enabled": true,
|
|
343
|
-
"role": "user",
|
|
344
|
-
"slot": "chat-history",
|
|
345
|
-
"options": {
|
|
346
|
-
"includeLastUserMessage": false
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
### Chat history 选项
|
|
352
|
-
|
|
353
|
-
```json
|
|
354
|
-
"options": {
|
|
355
|
-
"includeLastUserMessage": false,
|
|
356
|
-
"stripAssistantThinking": true,
|
|
357
|
-
"includeSummaries": true,
|
|
358
|
-
"toolMode": "keep",
|
|
359
|
-
"roles": ["user", "assistant"],
|
|
360
|
-
"maxMessages": 40,
|
|
361
|
-
"maxChars": 20000
|
|
362
|
-
}
|
|
363
|
-
```
|
|
122
|
+
## 文档导航
|
|
364
123
|
|
|
365
|
-
|
|
124
|
+
### 学习
|
|
366
125
|
|
|
367
|
-
|
|
126
|
+
- [快速上手](docs/zh-CN/getting-started.md)
|
|
127
|
+
- [Prompt stack 概念](docs/zh-CN/concepts/prompt-stacks.md)
|
|
128
|
+
- [Agent profile 概念](docs/zh-CN/concepts/agent-profiles.md)
|
|
129
|
+
- [Web 编辑器](docs/zh-CN/guides/web-editor.md)
|
|
130
|
+
- [前台 delegation](docs/zh-CN/guides/delegation.md)
|
|
368
131
|
|
|
369
|
-
|
|
132
|
+
### 参考
|
|
370
133
|
|
|
371
|
-
|
|
134
|
+
- [命令](docs/zh-CN/reference/commands.md)
|
|
135
|
+
- [英文 stack schema](docs/reference/stack-schema.md)
|
|
136
|
+
- [英文 macros 与 slots](docs/reference/macros-and-slots.md)
|
|
137
|
+
- [英文配置参考](docs/reference/configuration.md)
|
|
372
138
|
|
|
373
|
-
|
|
139
|
+
完整英文文档从 [docs/README.md](docs/README.md) 开始。
|
|
374
140
|
|
|
375
|
-
|
|
141
|
+
## 兼容性原则
|
|
376
142
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
"kind": "slot",
|
|
382
|
-
"id": "tools",
|
|
383
|
-
"enabled": true,
|
|
384
|
-
"role": "system",
|
|
385
|
-
"slot": "tools",
|
|
386
|
-
"options": {
|
|
387
|
-
"format": "plain"
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
默认 Pi mirror 示例还会用到几个额外 slot 选项:
|
|
393
|
-
|
|
394
|
-
```json
|
|
395
|
-
{
|
|
396
|
-
"slot": "tools",
|
|
397
|
-
"options": {
|
|
398
|
-
"format": "plain",
|
|
399
|
-
"onlyWithSnippets": true
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
`tools.onlyWithSnippets` 会像 Pi 默认 prompt 一样,只显示带 prompt snippet 的工具。`tool-guidelines.heading`、`tool-guidelines.includePiDefaultGuidelines` 和 `tool-guidelines.piStyle` 用来匹配 Pi 默认的 guidelines 标题和条目。`skills.requireReadTool` 会在 read 工具未启用时隐藏 skills,和 Pi 默认行为一致。
|
|
405
|
-
|
|
406
|
-
### 工具和技能策略
|
|
407
|
-
|
|
408
|
-
Prompt stack 可以用栈级 `allow` 或 `deny` 列表限制工具和技能。模式默认精确匹配,也支持 `*` 通配符。
|
|
409
|
-
|
|
410
|
-
```json
|
|
411
|
-
{
|
|
412
|
-
"tools": {
|
|
413
|
-
"allow": ["read", "bash"]
|
|
414
|
-
},
|
|
415
|
-
"skills": {
|
|
416
|
-
"deny": ["browser-danger"]
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
使用 `allow` 时,只有匹配的工具或技能保持启用。使用 `deny` 时,除匹配项以外的工具或技能保持启用。同一个资源策略不能同时包含非空 `allow` 和 `deny` 列表;混用会产生 validation error。
|
|
422
|
-
|
|
423
|
-
工具策略会在栈激活期间通过 Pi 的 active tool list 强制执行。pi-forge 会记住之前的 active tools,并在禁用 prompt stack 或切换到没有工具策略的 stack 时恢复。
|
|
424
|
-
|
|
425
|
-
技能策略会过滤 pi-forge `skills` slot 渲染出的技能。如果 stack 使用 `mode: "append"` 或 `"prepend"`,Pi base prompt 里可能已经包含未过滤的技能;需要控制技能可见性时请使用 `mode: "replace"`。
|
|
426
|
-
|
|
427
|
-
### Regex 转换
|
|
428
|
-
|
|
429
|
-
Prompt stack 可以对发给模型的 prompt 文本执行确定性的 regex 替换,也可以选择清理已结束的 assistant 消息。Outgoing 规则支持 `history` 和 `compiled` 阶段。破坏性的最终消息清理使用 `stage: "compiled"`、`effect: "finalize"` 和 `messages` target。真正的 display-only streaming 转换和 provider-payload 重写还不会生效。
|
|
430
|
-
|
|
431
|
-
```json
|
|
432
|
-
"regex": {
|
|
433
|
-
"schemaVersion": 1,
|
|
434
|
-
"rules": [
|
|
435
|
-
{
|
|
436
|
-
"id": "trim-ooc",
|
|
437
|
-
"enabled": true,
|
|
438
|
-
"stage": "history",
|
|
439
|
-
"effect": "outgoing",
|
|
440
|
-
"pattern": "\\(OOC:[^)]+\\)",
|
|
441
|
-
"flags": "gi",
|
|
442
|
-
"replace": "",
|
|
443
|
-
"roles": ["assistant"],
|
|
444
|
-
"maxMessages": 20
|
|
445
|
-
}
|
|
446
|
-
]
|
|
447
|
-
}
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
使用 `stage: "history"` 可以转换 `chat-history` slot 插入的消息。使用 `stage: "compiled"` 并可选配置 `targets: ["system"]`、`["messages"]` 或两者,可以转换最终编译后的 prompt。消息规则可以用 `roles`、`maxMessages`、`maxChars`、`minDepth` 和 `maxDepth` 限制范围,其中 depth `0` 是最新消息。Replacement 使用 JavaScript 语法(`$&` 表示完整匹配,`$1` 表示捕获组;`$0` 也作为完整匹配的别名,`$$` 转义字面 `$`)。`trimStrings` 会从展开后的 replacement match/capture 中移除字面量字符串,对应 SillyTavern 的 Trim Out 行为。支持的 regex flags 是 `g`、`i`、`m`、`s` 和 `u`。
|
|
451
|
-
|
|
452
|
-
要在 streaming 结束后清理一条 assistant 消息,使用 `effect: "finalize"`:
|
|
453
|
-
|
|
454
|
-
```json
|
|
455
|
-
{
|
|
456
|
-
"id": "finalize-ooc",
|
|
457
|
-
"enabled": true,
|
|
458
|
-
"stage": "compiled",
|
|
459
|
-
"effect": "finalize",
|
|
460
|
-
"targets": ["messages"],
|
|
461
|
-
"roles": ["assistant"],
|
|
462
|
-
"pattern": "\\s*\\(OOC:[^)]+\\)",
|
|
463
|
-
"flags": "gi",
|
|
464
|
-
"replace": ""
|
|
465
|
-
}
|
|
466
|
-
```
|
|
467
|
-
|
|
468
|
-
警告:`finalize` 在 `message_end` 运行,TUI 可能已经显示过原始 streaming 输出。它会把清理后的 replacement message 交回 Pi,因此 transcript 中不会保留模型原始输出。
|
|
469
|
-
|
|
470
|
-
`effect: "outgoing"` 改变发给模型的输入。`effect: "finalize"` 改变已结束的 assistant transcript 内容。`effect: "display"` 和 `"both"` 会通过校验并产生 warning,但在真正的 display transforms 实现前运行时会忽略。
|
|
471
|
-
|
|
472
|
-
SillyTavern 导入会把确定性的 prompt-only `{{match}}` / `$0` full-match replacement 转成 JavaScript `$&`(`$0` 和 `$&` 在 pi-forge 中都可以用),在 `source.sillytavern` 中保留原始 regex 元数据,并作为 history 阶段规则运行以保持 depth 相对 chat。display-only、browser、unsupported-placement 脚本保留为 report-only。Web 编辑器提供结构化 Regex 对话框来编辑这些规则字段,并会保留需要通过 raw JSON 编辑的高级未知字段。
|
|
473
|
-
|
|
474
|
-
### Variables slot 选项
|
|
475
|
-
|
|
476
|
-
```json
|
|
477
|
-
{
|
|
478
|
-
"kind": "slot",
|
|
479
|
-
"id": "variables",
|
|
480
|
-
"enabled": true,
|
|
481
|
-
"role": "user",
|
|
482
|
-
"slot": "variables",
|
|
483
|
-
"options": {
|
|
484
|
-
"includeStatic": true,
|
|
485
|
-
"includeSession": true,
|
|
486
|
-
"includeTurn": false,
|
|
487
|
-
"format": "xml"
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
## 开发环境搭建
|
|
493
|
-
|
|
494
|
-
```bash
|
|
495
|
-
git clone <repo>
|
|
496
|
-
cd pi-forge
|
|
497
|
-
npm install
|
|
498
|
-
npm run build
|
|
499
|
-
# .pi/settings.json 已指向包根目录
|
|
500
|
-
pi # 启动 Pi,信任项目,必要时 /reload
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
运行测试:
|
|
504
|
-
|
|
505
|
-
```bash
|
|
506
|
-
npm test
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
类型检查:
|
|
510
|
-
|
|
511
|
-
```bash
|
|
512
|
-
npm run typecheck
|
|
513
|
-
```
|
|
514
|
-
|
|
515
|
-
构建 package 输出:
|
|
516
|
-
|
|
517
|
-
```bash
|
|
518
|
-
npm run build
|
|
519
|
-
```
|
|
143
|
+
- npm 安装不会要求用户跟随某个精确 Pi patch 版本。
|
|
144
|
+
- Release 会分别记录实际测试过的 Pi 最低版本和当前版本。
|
|
145
|
+
- 如果实验性 subagent 依赖的 host capability 不存在,它应在 provider transport 前明确报错并 fail closed。
|
|
146
|
+
- 普通 prompt stack 和 profile 使用不应因为可选 delegation backend 不兼容而失效。
|
|
520
147
|
|
|
521
148
|
## License
|
|
522
149
|
|
|
523
|
-
MIT
|
|
150
|
+
[MIT](LICENSE)
|