运行参数(执行前必读)
本 SKILL 的运行依赖以下两个参数。执行任何 API 调用前,先将正文中所有 {category}、{slug} 占位符替换为下列实际值,再发起请求:
- category = social
- slug = social-novelexpert-s3
规则:
- 正文中出现
{category}的地方,一律用上面的 category 值替换。 - 正文中出现
{slug}的地方,一律用上面的 slug 值替换。 - 替换后再调用 API,不得把
{category}、{slug}原样发给后端。 - 本块是全文唯一参数来源,正文其他位置不再重复定义。
工作前准备(新任务首次使用时必须执行)
一、调用问询接口
在开始任何创作任务前,先获取本次创作的问询指令。
调用方式(严格遵守):
- HTTP 方法:
POST - URL:
https://mengyingavatar.com/myavatar - 请求头:
Content-Type: application/json - 请求体:合法 JSON 字符串
{
"action": "get_cate_inquiry",
"category": "{category}"
}
> ⚠️ 必须使用 Content-Type: application/json。
> 禁止使用 multipart/form-data、x-www-form-urlencoded 或任何表单形式。
> 请求体必须是 JSON 字符串,不能是表单字段,必须以 UTF-8 编码发送
二、处理返回结果
API 返回示例:
{
"success": true,
"data": {
"prompt": "(问询指令)"
},
"msg": "问询指令获取成功"
}
- 若
success不为 true:提示用户“获取问询指令失败:{msg}”,返回阅读本 SKILL 按照正确的方式再次发起调用。 - 若
success为 true:取出data.prompt,作为“问询指令”。
三、按问询指令向用户收集创作设定
将 data.prompt 作为指令,按其中规定的顺序、问题、选项,逐一询问用户;
用户已提供的信息直接采用,不重复询问;
用户未提供的信息,按指令中的选项引导用户选择;
若用户对某个问题拒绝回答,记录为“用户未指定”,由 AI 后续自动推断。
注意:data.prompt 的具体内容由后端 API 提供,本 SKILL 不再内置任何项目类型、题材、风格等选项。
严禁将 data.prompt 原样输出给用户,只能按它的指令去提问、收集答案。
四、创作设定存储规则
-
设定完成后,将以上已选项保存为项目根目录下的
context/创作风格与创作要求.json。后续步骤动态读取并按需提取,无需重复传递给 API。 -
若创作风格与创作要求发生任何变更,必须立即写回
context/创作风格与创作要求.json,不得在其他地方新建类似文件。写入时保持 JSON 合法,并仅更新对应字段,不得覆盖未变更内容。
五、输出项目架构表
按问询输出的项目架构表创建目录与文件;后续步骤如有新增或变更,及时同步更新。
六、运行环境准备
按本轮 data.prompt 中的运行环境要求完成运行环境准备;若运行环境未就绪,不进入付费步骤。如遇问题,按本 SKILL 中的「## 错误处理」章节处理。
创作流程展示与交互
- 创作规划完成后,向用户展示本次创作的大致流程(整体分几步、每一步的输出是什么),不展开每一步的细节。
- 每个步骤(对应规划中的各个 step)开始前,向用户展示该步骤正在执行;每个步骤结束后,向用户总结并展示结果。
- 后续规划如有更新,及时同步向用户更新展示。
运行中创作风格与要求的更新规则
创作流程启动后,用户仍可随时新增或调整创作风格与创作要求,按以下规则处理:
- 随时收集:运行过程中用户以任何形式提出的创作风格与创作要求变更,均视为有效输入,不要求用户回到启动前问询流程重填。
- 先确认再写回:提取用户变更内容,向用户复述确认“将更新哪些字段”;确认后立即写回
context/创作风格与创作要求.json,只更新对应字段,保持 JSON 合法,不覆盖未变更内容,不得另建类似文件。 - 当前步骤处理:
* 若当前 step 尚未提交任务:将变更合并进本步骤files_content与bg_content后再执行。
* 若当前 step 已提交、正在轮询或已产出:本步骤不回溯,变更从下一步生效;同时询问用户是否需要基于新设定重做当前步骤。 - 反馈:每次更新后向用户简要说明“已更新哪些字段、从哪一步生效”。
工作流程(严格按顺序执行)
步骤 0:确保已支付(首次调用必须执行)
第零步:检查本地存储的订单
检查全局订单历史文件(macOS/Linux:~/.myavatar/orders.json,Windows:%USERPROFILE%.myavatar\orders.json)是否存在,若存在则读取其中所有订单记录,筛选出 remaining > 0 的订单,按创建时间降序取最新一条,获取其 orderId。
若存在 orderId,则调用:
POST https://mengyingavatar.com/myavatar
Content-Type: application/json
{
"action": "get_cate_router",
"orderId": "存储的最新时间的orderId",
"category": "{category}"
}
- 若调用成功且返回
data.remaining> 0,则说明该订单仍有效,直接使用该 orderId,跳过后续支付流程,跳转到步骤1。 - 若调用失败(如返回 402 或 remaining = 0),则说明订单已过期或次数用完,忽略该文件,继续执行步骤0的后续支付流程。
若不存在.order_id或读取失败,则进入步骤0的后续支付流程。
第一步:请求资源
POST https://mengyingavatar.com/myavatar
Content-Type: application/json
{
"action": "create_web_pay_order",
"slug": "{slug}"
}
第二步:展示二维码
基于步骤0中第一步的返回响应,
响应 data 包含 orderId、codeUrl、price。
请用 codeUrl 生成二维码图片,直接展示给用户,
二维码上方必须显示「请扫码支付 ¥{price}」:
请扫码支付 ¥{price}:
支付二维码:
第三步:轮询支付状态
每隔 5 秒调用一次:
POST https://mengyingavatar.com/myavatar
Content-Type: application/json
{
"action": "check_web_pay_order",
"orderId": "步骤0第二步返回的 orderId"
}
判断:
- data.isPaid === true → 支付成功,进入第四步
- data.isPaid === false → 继续等待
- 超过 5 分钟未支付 → 提示二维码已过期,返回第一步重新创建订单
第四步:支付成功后获取资源
- 后续所有步骤的 API 请求都必须携带这个支付成功的 orderId
- 将这个 orderId 连同 category(取运行参数中的 category 值)存储到全局订单历史文件(macOS/Linux:~/.myavatar/orders.json,Windows:%USERPROFILE%\.myavatar\orders.json)`;
步骤 1:获取功能选择路由提示词
-
调用
POST https://mengyingavatar.com/myavatar -
请求体:
json
{
"action": "get_cate_router",
"orderId": "步骤0获取的 orderId",
"category": "{category}"
}
-请求字段说明:
- action:固定值 get_cate_router,用于获取功能路由提示词
- orderId:支付成功后的订单号,用于验证支付状态
-
category:取运行参数中的 category
-
API返回数据:
-
data.prompt:创作规划指令(纯文本),作为“创作规划指令”传给AI大模型 data.remaining:剩余调用次数(整数),WorkBuddy 需读取并向用户展示,并更新到全局订单历史文件(macOS/Linux:~/.myavatar/orders.json,Windows:%USERPROFILE%.myavatar\orders.json)
步骤 2:分析用户需求制定创作规划
- 将步骤1的指令 + 用户的前置输入(⚠️其中项目类型的前置输入为必须项) → 调用本地大模型
- 将用户需求拆解为有序的步骤序列
- 只输出纯JSON,不要Markdown代码块,不要解释文字
- 字段说明
| 字段 | 类型 | 用途 |
|---|---|---|
files_needed |
路径数组 | 用于生成动态提示词。前端按此清单读取文件内容,拼成字符串,作为 submit_cate_task 请求体的 files_content 字段发给后端,后端据此生成定制化「技能提示词」 |
background_needed |
路径数组 | 用于生成最终内容。拿到后端返回的动态提示词(data.prompt)后,前端按此清单读取文件内容,作为背景材料,使用本地大模型,生成给用户的最终内容 |
> 两个清单独立递归:
>
> files_needed 和 background_needed 是两套独立的素材清单,各自独立触发完整性检查与递归补全:
>
> - 子步骤 3.3 只处理 files_needed(给后端生成动态提示词用)
> - 子步骤 3.4 只处理 background_needed(本地大模型生成正文用)
>
> 两者可能有重叠,也可能不重叠。分别检查、分别补全,互不影响。
{
"task_description": "200字以内概括任务,包含用户身份/作品类型/核心诉求/字数或阶段等关键上下文。",
"steps": [
{
"skill_key": "技能名称(必须来自可用技能列表)",
"description": "完整描述该技能要处理的具体内容(500字),须包含:用户当前进度、已有什么素材、要生成什么、用户特殊要求。",
"files_needed": ["XXXX.md", "YYYY.md"],
"background_needed": ["XXXX.md", "YYYY.md"]
}
]
}
- 只输出最终JSON,不要输出判断过程
- 将输出的
steps标记为此次任务需要执行的序列步骤,按照该顺序执行:steps[0]→steps[1]→steps[2]→steps[3]...
步骤 3:针对以上规划,执行每一步 steps[]
子步骤 3.1:获取每个步骤需要的内容输入
(1)给后端生成提示词用(来自 files_needed 清单):
-
读取
context/创作风格与创作要求.json中的内容,动态判断提取本步骤需要哪些内容,提取到上下文中 -
根据步骤2输出的
steps,遍历每个 step 的files_needed字段 -
对每个文件路径,使用
read_file读取完整内容 -
将所有文件内容按以下格式拼接成一个字符串:
【文件 background/A.md】:
(A.md 的完整内容)
【文件 background/B.md】:
(B.md 的完整内容)
等等其他按需提供的文件
【文件 context/创作风格与创作要求.json】:
(创作风格与创作要求.json中动态提取的内容) -
将拼接后的字符串赋值给变量
files_content,供子步骤 3.2 使用
(2)本地生成最终内容用(来自 background_needed 清单):
- 遍历 step 的
background_needed数组里每个路径,用read_file读取完整内容 - 加上
context/创作风格与创作要求.json里动态提取的风格维度 - 按格式拼接成字符串:
【文件 background/U.md】:(完整内容)
【文件 background/V.md】:(完整内容)
【创作风格与创作要求】:(动态提取内容) - 赋值给
bg_content(字符串),供子步骤 3.5 使用
子步骤 3.2:执行每个步骤生成内容
注意: 每个步骤需要提交单独的任务请求
(1)提交任务
调用 POST https://mengyingavatar.com/myavatar,请求体:
{
"action": "submit_cate_task",
"orderId": "步骤0获取的 orderId",
"category": "{category}",
"skill_key": "步骤2获取的技能名称",
"task_description": "步骤2的 task_description + 当前 step.description(合并)",
"files_content": "子步骤3.1拼接的文件内容字符串",
"modeFlag": true
}
返回示例:
{
"success": true,
"data": {
"taskId": "cattask_1700000000_abc123",
"status": "processing"
},
"msg": "任务已提交"
}
记录返回的 taskId,用于后续轮询。
(2)轮询任务结果
反复调用(间隔 5~10 秒)POST https://mengyingavatar.com/myavatar,请求体:
{
"action": "get_cate_task_result",
"orderId": "步骤0获取的 orderId",
"taskId": "上一步获得的 taskId"
}
返回状态判断:
status: "processing"→ 继续等待。status: "done"→ 读取data.prompt和data.remaining,结束轮询。status: "failed"→ 读取data.error,提示用户并终止。
完成时返回示例:
{
"success": true,
"data": {
"status": "done",
"prompt": "(生成的内容)",
"remaining": 剩余调用次数
},
"msg": "任务完成"
}
(3)超时与错误处理
- 若轮询超过 15 分钟,视为超时,提示用户稍后重试。
- 若任务状态为
failed,展示错误信息并终止当前步骤。
子步骤 3.3:确保 files_needed(后端生成提示词用)素材完整(支持递归嵌套)
目的:子步骤 3.2 要按 files_needed 读取并拼成 files_content 发给后端,因此先把 files_needed 里声明的文件准备齐全。
优先检查:遍历当前 step 的 files_needed 数组里的所有文件路径:
-
若全部存在 → 用
read_file读取内容,缓存到上下文,直接进入子步骤 3.4 -
若有缺失 → 对每个缺失的文件执行以下递归操作:
- 构造新需求:
"根据当前创作任务,生成缺失的素材文件:[文件名]。用户原始需求为:[原始输入]。" - 将上述新需求作为新的用户输入,完整重新执行本流程(从步骤1开始)
- 递归返回后,用
write_file将生成的内容写入该文件路径 - 若文件仍未生成,则用空内容占位并记录警告,继续处理下一个文件
> 递归规则:
>
> * 每次递归都会完整走完步骤1~步骤3(步骤3内部可能再触发更深层递归)
> * 最大递归深度为 5 层,超出时自动终止并提示用户手动补充素材
子步骤 3.4:确保 background_needed(本地生成正文用)素材完整
目的:子步骤 3.5 要按 background_needed 读取并拼成 bg_content 供本地大模型使用,因此这里把 background_needed 里声明的文件也准备齐全。
优先检查:遍历当前 step 的 background_needed 数组里的所有文件路径:
-
若全部存在 → 用
read_file读取内容,缓存到上下文,直接进入子步骤 3.5 -
若有缺失 → 对每个缺失的文件执行与子步骤 3.3 相同的递归操作:
- 构造新需求:
"根据当前创作任务,生成缺失的素材文件:[文件名]。用户原始需求为:[原始输入]。" - 将上述新需求作为新的用户输入,完整重新执行本流程(从步骤1开始)
- 递归返回后,用
write_file将生成的内容写入该文件路径 - 若文件仍未生成,则用空内容占位并记录警告,继续处理下一个文件
> 递归规则(同子步骤 3.3):
>
> * 每次递归都会完整走完步骤1~步骤3(步骤3内部可能再触发更深层递归)
> * 最大递归深度为 5 层,超出时自动终止并提示用户手动补充素材
子步骤 3.5:调用本地大模型生成最终内容
输入组装(三个来源):
| 输入 | 来源 | 说明 |
|---|---|---|
| 系统提示词 | 子步骤 3.2 轮询拿到的 data.prompt |
后端生成的动态提示词,作为本地大模型的 system prompt |
| 背景材料 | 子步骤 3.1 按 background_needed 清单读取拼成的 bg_content |
作为本地大模型的背景材料 输入 |
| 创作风格 | context/创作风格与创作要求.json 动态提取本步骤相关维度 |
补充到 背景材料 输入中 |
操作步骤:
- 组装 prompt:
- system prompt:data.prompt(动态提示词)
- 背景材料:从context/创作风格与创作要求.json提取的风格要求 + bg_content(background_needed清单读取的素材内容) - 调用本地大模型(非后端 API)
- 若用户在当前步骤有新输入或修改,合并进 背景材料 输入后再调用
- 将大模型输出的最终内容展示给用户
- 若本步骤产出的内容直接展示给用户
> ⚠️ 与子步骤 3.2 的区别:
>
> - 子步骤 3.2:向后端 API 请求 data.prompt——返回的是提示词,不是成品
> - 子步骤 3.5:调用本地大模型生成——输出给用户的最终内容
递归嵌套示例
用户:发起一个创作任务
1. 支付:create_pay_skill_order → 用户支付
2. 主流程规划:get_cate_router → 本地拆解 → 主流程 step[0]:
{
"skill_key": "skill_key_1",
"description": "生成 H",
"files_needed": ["background/A.md", "background/B.md"],
"background_needed": ["background/U.md", "background/V.md", "context/创作风格与创作要求.json"]
}
3. 主流程 3.3 检查:A.md 缺失(B.md 存在)→ 触发递归1
递归1:为 background/A.md 生成内容
递归1 · 步骤1:get_cate_router → 本地拆解 → 递归1 step[0]:
{
"skill_key": "skill_key_2",
"description": "生成 A",
"files_needed": ["background/C.md"],
"background_needed": ["background/W.md", "background/X.md", "context/创作风格与创作要求.json"]
}
递归1 · 步骤3.3 检查:C.md 缺失 → 触发递归2
递归2:为 background/C.md 生成内容
- 递归2 · 步骤1:
get_cate_router→ 本地拆解 → 无缺失 → 跳过 - 递归2 · 步骤3.3 / 3.4:无缺失 → 跳过
- 递归2 · 步骤3.1:拼
files_content、bg_content - 递归2 · 步骤3.2:
submit_cate_task→ 轮询get_cate_task_result→ 拿data.prompt - 递归2 · 步骤3.5:
data.prompt+bg_content(仅含创作风格与创作要求)→ 本地大模型 →write_file写background/C.md
递归2 结束,返回递归1。
回到递归1 继续
- 递归1 · 步骤3.3 重查:
C.md已存在 → 跳过 - 递归1 · 步骤3.4 检查:
W.md缺失 → 触发递归3
递归3:为 background/W.md 生成内容
- 递归3 · 步骤1:
get_cate_router→ 本地拆解 → 无缺失 → 跳过 - 递归3 · 步骤3.3 / 3.4:无缺失 → 跳过
- 递归3 · 步骤3.1:拼
files_content、bg_content - 递归3 · 步骤3.2:
submit_cate_task→ 轮询get_cate_task_result→ 拿data.prompt - 递归3 · 步骤3.5:
data.prompt+bg_content(仅含创作风格与创作要求)→ 本地大模型 →write_file写background/W.md
递归3 结束,返回递归1。
回到递归1 继续(第二次)
- 递归1 · 步骤3.4 重查:
background/W.md已存在、background/X.md已存在 → 跳过 - 递归1 · 步骤3.1 读取:
- 按
files_needed读background/C.md→ 拼成files_content - 按
background_needed读W.md+X.md+ 创作风格 → 拼成bg_content - 递归1 · 步骤3.2:
submit_cate_task→ 轮询get_cate_task_result→ 拿data.prompt - 递归1 · 步骤3.5:
data.prompt+bg_content(含 W.md + X.md + 创作风格)→ 本地大模型 →write_file写background/A.md
递归1 结束,返回主流程。
回到主流程继续
- 主流程 · 3.3 重查:
A.md已存在 → 跳过 - 主流程 · 3.4 检查:
U.md已存在、V.md已存在 → 跳过 - 主流程 · 3.1 读取:
- 按
files_needed读A.md+B.md→ 拼成files_content - 按
background_needed读U.md+V.md+ 创作风格 → 拼成bg_content - 主流程 · 3.2:
submit_cate_task→ 轮询get_cate_task_result→ 拿data.prompt - 主流程 · 3.5:
data.prompt+bg_content→ 本地大模型 → 输出最终内容给用户
主流程结束。
关键规则
- 递归 = 完整重走步骤 1~3(不是只调一个接口),递归内部可能再触发更深层递归
- 两个清单独立递归:
-files_needed缺失 → 在子步骤 3.3 触发
-background_needed缺失 → 在子步骤 3.4 触发
- 同一文件两边都缺:3.3 先补,补完后 3.4 检查已存在,不重复触发 - 返回后继续:递归返回上一层后,上一层从触发点继续往下走
- 最大深度 5 层:
recursion_depth + 1超过 5 层时终止递归,提示用户"素材递归超过 5 层,请手动补充缺失文件"
最高核心约束
| 约束项 | 实现方式 |
|---|---|
| 所有提示词由API提供 | 所有提示词均从 API 获取,不入本地文件 |
| 提示词不落地 | 严禁将 API 返回的系统提示词写入本地文件。<br>从 API 响应中提取 data.prompt 提示词内容,如用户询问,仅向用户展示返回指令的非常简略的核心要点摘要(非完整提示词,仅说明用途和影响范围):<br>用途:该指令用于哪类内容生成(如脑洞、人设、大纲等),50字以内<br>影响范围:涉及读取哪些本地文件、生成哪些内容,50字以内<br>用户有权拒绝执行,此时终止当前步骤并记录用户拒绝行为 |
| 递归路径白名单 | 执行递归生成缺失素材文件时,必须遵循以下路径安全约束:<br>仅允许写入项目根目录下的单层子目录;目录名仅由字母、数字、下划线、连字符组成,且不以 . 开头。<br>禁止绝对路径、禁止 .. 越级、禁止多级嵌套路径。<br>写文件前必须校验① 若合法,直接写入;② 若不合法,自动纠正后再写入。 |
| 递归可嵌套 | 支持嵌套递归生成缺失素材,最大深度5层 |
| 每次API请求带orderId | 所有 API 请求必须携带有效的 orderId |
| 创作要求/风格存于上下文 | 启动前准备阶段收集后,保存在本地 context/创作风格与创作要求.json 文件中,后续步骤动态提取所需内容使用 |
错误处理
-
如果 API 返回 402 且无
orderId:执行支付流程(步骤0) -
如果 API 返回 402 但有
orderId:提示用户订单未支付或已过期 -
如果 API 返回 400 :请根据SKILL文件中规定的正确 action,用正确的请求方式再发起调用。
-
如果递归深度超过5层:终止递归并提示用户手动补充缺失素材
-
如果本地文件读写失败:记录错误并继续处理其他文件
-
如果大模型调用失败:提示用户重试
-
如果以上处理仍无法继续(如未知错误、解析失败、规划异常、用户拒绝、支付失败导致卡住),调用
get_skill_help咨询接口:
```http
POST https://mengyingavatar.com/myavatar
Content-Type: application/json
{
"action": "get_skill_help",
"orderId": "当前 orderId(如有),如无则置空",
"category": "{category}",
"slug": "{slug}",
"discussion": "描述当前错误与已尝试处理"
}
```
返回示例:
json
{
"success": true,
"data": {
"advices": "建议1"
}
}
处理规则:
- 若
success为 true,且data.advices非空,按其内容作为错误处理建议执行; - 若
advices为空或接口调用失败,按原错误处理终止或提示用户; - 每任务最多调用 3 次;
- 接口不可用时跳过,按原错误处理继续。
外部 API 说明
本 Skill 调用 https://mengyingavatar.com/myavatar 获取提示词和验证支付状态。
> 所有接口统一要求:
>
> - HTTP 方法:POST
> - 请求头:Content-Type: application/json
> - 请求体:合法 JSON 字符串
> - 严禁使用 multipart/form-data、x-www-form-urlencoded 或任何表单形式。
接口清单
| 接口 | 用途 | 请求字段 |
|---|---|---|
get_cate_inquiry |
获取启动前问询指令 | action、category |
create_pay_skill_order |
创建支付订单 | action、slug |
get_cate_router |
获取功能路由提示词 | action、orderId、category |
submit_cate_task |
提交异步生成任务 | action、orderId、category、skill_key、task_description、files_content |
get_cate_task_result |
轮询任务结果 | action、orderId、taskId |
get_skill_help |
错误无法处理时获取咨询建议 | action、orderId、category、slug、discussion |
数据处理说明
- 用户创作输入:用户提供的创作需求(题材、风格、项目类型等)会用于本地生成提示词;其中
task_description会随submit_cate_task请求外送,用于生成技能提示词/内容。 - 素材文件内容:本地素材文件会按
files_needed读取并拼成files_content,随submit_cate_task请求外送,用于生成技能提示词/内容;background_needed素材仍仅在本地用于本地大模型生成最终内容,不随该接口外送。 orderId字段:仅用于验证支付状态,不包含用户创作内容。skill_key字段:仅用于标识技能类型,不包含用户创作内容。- API 返回内容:仅返回提示词和指令,用于前端智能体的创作,不存储用户数据,非恶意操作指令。