完成衍生资产tool
This commit is contained in:
parent
12337f55d6
commit
ff048f0c3e
@ -11,10 +11,15 @@ description: 短剧漫剧制作决策层。负责分析用户需求、制定执
|
||||
|
||||
| 工具 | 说明 |
|
||||
|------|------|
|
||||
| `get_project_info` | 获取当前项目信息(名称、风格、类型、描述、集数进度等) |
|
||||
| `get_state` | 获取当前执行状态,用于了解已完成的工作 |
|
||||
| `read_skill_file` | 读取技能参考资料文件 |
|
||||
| `execution` | 执行层工具,传入任务计划文本,由执行层完成具体工作 |
|
||||
| `activate_skill` | 激活技能,加载完整指令和资源列表到上下文 |
|
||||
| `read_skill_file` | 读取已激活技能目录下的参考资料文件 |
|
||||
| `deepRetrieve` | 深度检索记忆,通过关键词回忆历史对话详情 |
|
||||
| `run_sub_agent` | 启动子Agent执行任务(可用:`executionAI`、`supervisionAI`) |
|
||||
| `get_flowData` | 获取工作区数据(key: `script` 剧本 / `assets` 资产列表) |
|
||||
| `get_flowData_schema` | 获取工作区数据的类型结构 |
|
||||
| `set_flowData` | 保存数据到工作区(lodash 路径) |
|
||||
| `generate_assets_images` | 生成衍生资产图片(传入资产 id 列表) |
|
||||
| `generate_storyboard_images` | 生成分镜图(传入剧本文本) |
|
||||
|
||||
## 核心工作流程(必须严格遵循)
|
||||
|
||||
@ -30,22 +35,22 @@ description: 短剧漫剧制作决策层。负责分析用户需求、制定执
|
||||
|
||||
### 阶段一:收集信息(仅新任务触发)
|
||||
|
||||
1. 调用 `get_project_info` 获取项目基本信息
|
||||
2. 调用 `get_state` 了解当前已完成的工作进度
|
||||
1. 调用 `get_flowData` 获取当前工作区的剧本和资产数据,了解项目现状
|
||||
2. 调用 `deepRetrieve` 检索相关历史记忆,了解已完成的工作进度
|
||||
3. 使用 `read_skill_file` 加载 `references/plan.md` 获取计划制定规范
|
||||
|
||||
### 阶段二:制定计划并确认
|
||||
|
||||
1. 结合项目信息、当前状态和用户需求,按照 `plan.md` 的规范生成**结构化执行计划**
|
||||
1. 结合工作区数据、历史记忆和用户需求,按照 `plan.md` 的规范生成**结构化执行计划**
|
||||
2. **将计划回复给用户**,请求确认
|
||||
3. 如果用户要求调整,修改计划后重新回复,直到用户确认
|
||||
4. 输出计划后**停止并等待用户回复**,不要自行继续
|
||||
|
||||
### 阶段三:按计划执行(仅用户确认后触发)
|
||||
|
||||
用户确认后,按步骤顺序逐步调用 `execution` 工具:
|
||||
用户确认后,按步骤顺序逐步调用 `run_sub_agent` 工具:
|
||||
|
||||
1. 每次调用 `execution` 时,将当前步骤的任务描述作为 `taskDescription` 参数传入
|
||||
1. 每次调用 `run_sub_agent` 时,选择 `executionAI` 作为子Agent,将当前步骤的任务描述作为 `prompt` 参数传入
|
||||
2. 检查返回结果是否符合预期,不符合则调整指令重试
|
||||
3. 将上一步的输出作为上下文传入下一步(如有依赖)
|
||||
4. 全部步骤完成后,向用户汇报整体结果
|
||||
@ -55,7 +60,8 @@ description: 短剧漫剧制作决策层。负责分析用户需求、制定执
|
||||
- 根据项目类型(短剧/漫剧)和风格调整策略
|
||||
- 复杂任务拆分为可独立执行的小步骤
|
||||
- 关注步骤间的依赖关系,确保顺序合理
|
||||
- 利用 `get_state` 避免重复已完成的工作
|
||||
- 利用 `deepRetrieve` 检索历史记忆,避免重复已完成的工作
|
||||
- **提取衍生资产后**:计划中必须包含"询问用户是否生成资产图片"步骤。若用户确认,执行层将调用 `generate_assets_images` 工具批量生成衍生资产图片
|
||||
|
||||
## 参考资料
|
||||
|
||||
|
||||
@ -2,14 +2,14 @@
|
||||
|
||||
## 计划制定规范
|
||||
|
||||
根据 `get_project_info` 返回的项目信息和用户需求,按以下规范生成执行计划。
|
||||
根据 `get_flowData` 返回的工作区数据和用户需求,按以下规范生成执行计划。
|
||||
|
||||
## 计划结构
|
||||
|
||||
### 1. 任务总览
|
||||
|
||||
一段话概述:
|
||||
- 项目名称和类型(来自项目信息)
|
||||
- 当前工作区状态(剧本、资产情况)
|
||||
- 用户本次的核心需求
|
||||
- 预期最终产出
|
||||
|
||||
@ -21,11 +21,11 @@
|
||||
|------|------|
|
||||
| 步骤编号 | 从 1 开始 |
|
||||
| 步骤名称 | 简明标题 |
|
||||
| 具体内容 | 要做什么(需足够详细,可直接作为 `execution` 工具的 `plan` 参数) |
|
||||
| 具体内容 | 要做什么(需足够详细,可直接作为 `run_sub_agent` 工具的 `prompt` 参数) |
|
||||
| 预期输出 | 完成后应产出什么 |
|
||||
| 依赖步骤 | 前置步骤编号(无依赖填"无") |
|
||||
|
||||
**关键要求**:每个步骤的"具体内容"必须是一段完整的任务描述文本,能够独立传给 `execution` 工具执行,不能是模糊的一句话。
|
||||
**关键要求**:每个步骤的"具体内容"必须是一段完整的任务描述文本,能够独立传给 `run_sub_agent` 工具执行,不能是模糊的一句话。
|
||||
|
||||
### 3. 执行顺序
|
||||
|
||||
@ -36,7 +36,6 @@
|
||||
```
|
||||
## 📋 执行计划
|
||||
|
||||
**项目**:[项目名称] · [项目类型]
|
||||
**目标**:[一句话描述本次目标]
|
||||
**预计步骤**:[N] 步
|
||||
|
||||
@ -58,8 +57,8 @@
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 步骤粒度适中:每步对应一次 `execution` 调用
|
||||
- 结合项目当前进度(`get_state`),跳过已完成的工作
|
||||
- 步骤粒度适中:每步对应一次 `run_sub_agent` 调用
|
||||
- 利用 `deepRetrieve` 检索历史记忆,跳过已完成的工作
|
||||
- 考虑用户已有的素材和资源,避免重复
|
||||
- 每个步骤的内容描述要包含足够上下文,使执行层无需额外信息即可工作
|
||||
|
||||
|
||||
@ -17,24 +17,21 @@ description: >
|
||||
|
||||
## 工作指引
|
||||
|
||||
### 拆分剧本流程
|
||||
|
||||
- 当执行拆分剧本任务的时候,你需要先调用 `get_flowData` 获取原始剧本
|
||||
- 根据[剧本拆分]文档中的拆分原则和示例,将剧本拆分成视频模型能够处理的片段
|
||||
- 将拆分后的剧本片段必须使用 `set_flowData` 工具保存(key 为 `"script"`),然后仅需告知用户拆分完成
|
||||
|
||||
### 提取衍生资产流程
|
||||
|
||||
1. 调用 `get_flowData` 分别获取 `script`(剧本)和 `assets`(现有资产列表)
|
||||
2. 根据[衍生资产提取](references/derive-assets-extraction.md)文档中的提取原则,分析剧本内容,为每个角色资产识别出关联的衍生资产(道具、服饰、法器、座驾、场景物件等)
|
||||
3. 对每个有衍生状态的资产调用 `set_flowData({ key: "assets[N].derive", value: derive数组 })` 逐个保存
|
||||
4. 告知用户提取完成,列出为每个角色提取的衍生资产概要,等待用户确认
|
||||
4. 告知用户提取完成,列出为每个角色提取的衍生资产概要
|
||||
5. **询问用户是否需要生成衍生资产图片**:
|
||||
- 如果用户确认需要,收集所有需要生成图片的资产 id,调用 `generate_assets_images({ ids: [资产id列表] })` 生成图片
|
||||
- 如果用户拒绝,跳过此步骤,流程结束
|
||||
- 生成图片为异步操作,可以先回复用户"正在生成图片,稍后会自动更新",等图片生成完成后再通知用户查看
|
||||
|
||||
## 参考资料
|
||||
|
||||
本技能附带以下参考资料,根据任务需要使用 `read_skill_file` 工具按需加载:
|
||||
|
||||
- [剧本拆分](references/script-splitting.md) — 将剧本拆分成视频模型能够处理的片段,包含拆分原则和示例
|
||||
- [衍生资产提取](references/derive-assets-extraction.md) — 从剧本和角色资产中提取衍生资产的原则和示例
|
||||
|
||||
**注意**:根据用户当前任务选择性加载对应参考资料,不要一次性全部加载。
|
||||
|
||||
@ -1,39 +0,0 @@
|
||||
# 剧本拆分(仅原始文本切割,输出 string[])
|
||||
|
||||
本指南只做一件事:
|
||||
把一份长剧本原文切成多个文本片段,输出 `string[]`。
|
||||
|
||||
不做结构化字段提取,不输出 JSON 对象,不附加角色卡、锚点、分镜元数据。
|
||||
|
||||
## 1. 输入与输出
|
||||
|
||||
### 输入
|
||||
|
||||
- 一段完整长剧本文本(字符串)
|
||||
|
||||
### 输出
|
||||
|
||||
- `string[]`
|
||||
- 数组每个元素是“原始剧本的一段子串”
|
||||
- 拼接后应可还原原文语义顺序(允许空白规范化差异)
|
||||
- 开头必须是**喵,**
|
||||
|
||||
示例:
|
||||
|
||||
```ts
|
||||
[
|
||||
"喵,第一段原文...",
|
||||
"喵,第二段原文...",
|
||||
"喵,第三段原文..."
|
||||
]
|
||||
```
|
||||
|
||||
可能输出:
|
||||
|
||||
```ts
|
||||
[
|
||||
"喵,场景1:雨夜街道。林夏快步穿过巷口。",
|
||||
"喵,场景2:天台。她停下,回头看向门口。",
|
||||
"喵,场景3:脚步声逼近。她握紧手机。"
|
||||
]
|
||||
```
|
||||
@ -5,11 +5,27 @@ import { Socket } from "socket.io";
|
||||
|
||||
const deriveSchema = z.object({ name: z.string().min(1).max(20), desc: z.string().min(1).max(100) });
|
||||
const assetSchema = z.object({ assetsId: z.string(), name: z.string(), desc: z.string(), src: z.string(), derive: z.array(deriveSchema).optional() });
|
||||
const flowDataSchema = z.object({ script: z.string(), assets: z.array(assetSchema) });
|
||||
const storyboardTableSchema = z.array(
|
||||
z.object({
|
||||
id: z.number(),
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
camera: z.string(),
|
||||
duration: z.number(),
|
||||
frameMode: z.enum(["firstFrame", "endFrame", "linesSoundEffects"]),
|
||||
lines: z.string().nullable(),
|
||||
sound: z.string().nullable(),
|
||||
associateAssetsIds: z.array(z.number()),
|
||||
}),
|
||||
);
|
||||
const flowDataSchema = z.object({ script: z.string(), assets: z.array(assetSchema), storyboardTable: storyboardTableSchema });
|
||||
|
||||
type FlowData = z.infer<typeof flowDataSchema>;
|
||||
|
||||
const keySchema = z.object({ key: z.enum(["script", "assets"]).describe("script=剧本,assets=资产列表") });
|
||||
const valueSchema = z.union([z.string(), z.array(assetSchema), assetSchema, z.array(deriveSchema)]).describe("路径对应的值");
|
||||
const keySchema = z.object({ key: z.enum(["script", "assets", "storyboardTable"]).describe("script=剧本,assets=资产列表,storyboardTable=分镜表") });
|
||||
const valueSchema = z
|
||||
.union([z.string(), z.array(assetSchema), assetSchema, z.array(deriveSchema), z.array(storyboardTableSchema)])
|
||||
.describe("路径对应的值");
|
||||
|
||||
export default (socket: Socket, toolsNames?: string[]) => {
|
||||
const tools: Record<string, Tool> = {
|
||||
@ -50,6 +66,22 @@ export default (socket: Socket, toolsNames?: string[]) => {
|
||||
return true;
|
||||
},
|
||||
}),
|
||||
generate_assets_images: tool({
|
||||
description: "生成衍生资产的图片",
|
||||
inputSchema: z.object({ ids: z.array(z.string()).describe("需要生成的资产id列表") }),
|
||||
execute: async ({ ids }) => {
|
||||
console.log("[tools] generated_assets", ids);
|
||||
return new Promise((resolve) => socket.emit("generatedAssets", { ids }, (res: any) => resolve(res)));
|
||||
},
|
||||
}),
|
||||
generate_storyboard_images: tool({
|
||||
description: "生成分镜图",
|
||||
inputSchema: z.object({ script: z.string().describe("剧本文本") }),
|
||||
execute: async ({ script }) => {
|
||||
console.log("[tools] generate_storyboard_images", script);
|
||||
return new Promise((resolve) => socket.emit("generateStoryboardImages", { script }, (res: any) => resolve(res)));
|
||||
},
|
||||
}),
|
||||
};
|
||||
|
||||
return toolsNames ? Object.fromEntries(Object.entries(tools).filter(([n]) => toolsNames.includes(n))) : tools;
|
||||
|
||||
@ -89,13 +89,13 @@ class Logger {
|
||||
(console as any)[level] = (...args: unknown[]) => {
|
||||
this.writing = true;
|
||||
try {
|
||||
// this.write(level, args);
|
||||
this.write(level, args);
|
||||
} catch (err) {
|
||||
this.originalConsole.error?.("[Logger Error]", err);
|
||||
}
|
||||
this.writing = false;
|
||||
|
||||
this.originalConsole[level]!(...args);
|
||||
this.writing = false;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user