Files
writing-agent/docs/worker-skill-format.md
2026-07-10 08:31:27 +08:00

280 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Worker Skill 格式
## 1. 定位
**Worker Skill** 服务 **Worker Agent**:规定 **读哪些 tag、写哪些 tag、怎么做** 本阶段产出。
Worker **从属于某一个总管 Skill 包**,不与其它 skill 共享。
```text
总管run_worker(write-rules)
→ Runtime 读 workers/write-rules/SKILL.md 的 inputTags / outputTags
→ 从黑板取匹配条目 → Worker 执行 → 写回 outputTags
```
规格背景见 `docs/tag-blackboard.md``docs/context-assembly.md`
---
## 2. 存储位置
```text
skills/novel/weird-rules-short/
├── orchestrator.md
└── workers/
├── write-rules/SKILL.md
└── review-infer/SKILL.md
```
- 目录名 = 包内 **worker id**
- 文件统一 **`SKILL.md`**。
- **没有** 全局共享 worker 目录。
---
## 3. Frontmatter
```yaml
---
id: write-rules
skill: weird-rules-short
name: 规则与解析创作
description: >-
从 需求.核心要点 推演内部核心,产出规则与说明。
version: 1
inputTags:
- "需求.核心要点"
- "验收.读者视角.记录"
- "验收.作者视角.记录"
- "用户.修改说明"
outputTags:
- "核心.危险.隐藏"
- "规则.草稿"
- "规则.说明.草稿"
inputMerge: latest
---
```
| 字段 | 用途 |
|------|------|
| `id` | 包内 skill id与 manifest 注册表一致 |
| `skill` | 所属 orchestrator 包 name |
| `inputTags` | Runtime 从黑板取数的 tag精确或 `前缀.*` |
| `outputTags` | 允许写回的 tagRuntime 校验 |
| `inputMerge` | 可选,`latest`(默认)或 `concat` |
| `contextSegments` | 可选,上下文拼接:上半 static、下半 dynamic见 §3.1 |
| `contextIsolation` | 可选:`none` \| `role_pov` \| `blind_review` |
### 3.1 contextSegments上下文拼接
`docs/context-assembly.md`。示例:
```yaml
contextSegments:
- id: brief
tier: static
tags: ["book.brief"]
label: "## 创作需求"
- id: history
tier: dynamic
tags: ["运行.事件流"]
policy: tail_lines_80
- id: turn
tier: dynamic
tags: ["可见信息", "用户.最新输入"]
label: "## 本轮"
```
未声明时 Runtime 回退为 JSON `inputs`(当前实现)。
**review-infer 示例**(不得读隐藏核心):
```yaml
inputTags:
- "需求.核心要点"
- "规则.草稿"
- "规则.说明.草稿"
outputTags:
- "验收.读者视角.记录"
```
**review-author 示例**(可读隐藏核心):
```yaml
inputTags:
- "需求.核心要点"
- "核心.危险.隐藏"
- "规则.草稿"
- "规则.说明.草稿"
outputTags:
- "验收.作者视角.记录"
```
---
## 4. 正文章节
```markdown
# 标题
## 角色与口吻
## 能力范围 # 能做什么 / 不能做什么
## 思维链与自检
## 上下文用法 # 各 inputTag 如何使用(不重复 frontmatter 列表)
## 输出格式 # 各 outputTag 的 content 格式
## 示例 # 可选
```
正文中用 **tag 名** 指代上下文,例如「读 `需求.核心要点`」而非旧 key `book.brief`
### 评估类 Worker
总管 orchestrator 只写:`rules 确认后 → run review-infer`
本 SKILL 写 **评估怎么做**、verdict 写入 `验收.*.记录` 的 JSON 形状等。
### 用户回合 workeruser-turn
**用途:** 该环节 **完全由用户输入** 组成LLM 不替用户选行动21 点玩家、线下人类一方等)。
**与 role-decide 的区别:**
| | role-decide | user-turn |
|--|-------------|-----------|
| 决策 | LLM 产出 `.思考` + `.行动` | 用户经 ask_user 提供worker **只**写 `.行动` |
| LLM | 需要 | 仅需展示/校验/格式化(可无生成模型) |
**frontmatter 示例:**
```yaml
id: user-turn
skill: blackjack-roleplay
name: 用户回合
description: 展示局面,收集用户合法行动,写入角色.用户.行动
inputTags:
- "角色.用户.可见信息"
- "场景.公开叙述"
outputTags:
- "角色.用户.行动"
```
**SKILL 正文要点:**
```markdown
## 角色
你是 **用户操作的采集器**,不是玩家 AI。禁止替用户选择行动。
## 执行
1. 读可见信息与合法行动集
2. ask_user简短展示局面 + 列出可选行动
3. 校验用户输入是否在合法集内;不合法则再问
4.`角色.用户.行动`(行动选择 + 可选说话)
## 禁止
- 调用 LLM 模拟用户策略
- 写入 `.思考`(用户无内心 tag或仅 UI 留空)
```
编排:总管在轮到用户时 `run_worker(user-turn)`world-engine 与 role-decide **同一套**`.行动` 规则。
---
## 5. 运行时输出协议
Worker LLM 返回 JSONPhase APhase B 改为 tool call。语义不变
```json
{
"outputs": {
"规则.草稿": "...",
"规则.说明.草稿": "..."
},
"summary": "50字以内摘要",
"askUser": null
}
```
- `outputs` 的 key 必须是 **outputTags 中的 tag**(或与 tag 一一映射的别名,由 Runtime 归一化)。
- 缺信息时 `askUser` 提问,不臆造。
Runtime 写黑板:
```ts
{
id: "...",
tag: "规则.草稿",
content: "...",
source: "write-rules",
}
```
---
## 6. ask_user
任何 worker 可中途提问。Runtime 暂停并保存 `resumeContext`workerId 等);恢复时 **重新** 从 SKILL 读 inputTags不依赖总管。
---
## 7. 命名原则
Worker id 按 **本包流程职责** 命名,包内唯一:
| 包 | worker id | 职责 |
|----|-----------|------|
| weird-rules-short | write-rules | 写规则 |
| weird-rules-short | review-infer | 读者视角验收 |
| novel-standard | outline | 大纲 |
不要设计全局共享 worker id。
---
## 8. 与代码的关系
| 文档 | 代码 |
|------|------|
| frontmatter inputTags / outputTags | `src/skills/loader.ts``ParsedWorkerSkill` |
| 运行时取数 | `src/worker/executor.ts` |
| 角色 worker 独立 LLM | `llmProfileId` / `llm-bindings.yaml` | `src/skills/worker-llm.ts` |
当前代码仍为旧 `inputKeys` / `outputKeys` 模型;迁移以 `tag-blackboard.md` 为准。
---
## 9. Worker 独立 LLM可选预留多 AI 博弈)
默认worker 与会话 **同一 ApiProfile**(设置页当前选中的 profile
### 9.1 Worker SKILL frontmatter
```yaml
llmProfileId: "<profiles.json 中的 ApiProfile.id>"
```
省略 = 走 skill 包 `llm-bindings.yaml` 或会话默认。
### 9.2 Skill 包 llm-bindings.yaml
```yaml
defaultProfileId: null # null = 会话默认
workers:
world-engine: {}
role-decide:
byRole:
A: "<profile-id-1>"
B: "<profile-id-2>"
```
Runtime 解析顺序见 `src/skills/worker-llm.ts`
`role-decide``slots.世界.当前角色.id` 匹配 `byRole`
### 9.3 设计意图
- 配置仍在 **profiles.json**(或 .env不在 SKILL 里写密钥
- 同一 skill 可让不同角色用不同模型/API实现真实多 agent 博弈
- 总管 LLM 不受 worker 绑定影响(始终会话默认)
---