feat: system prompt 注入 task 预选 skill 提示 + imagegen 加 BLOCKING 等 prompt 确认硬约束
1) core/agent_builder.py::_build_system_prompt 加 task_skill 参数,非空时在
「工作目录与 task 上下文」段加一行 "- **task 预选 skill**: `<name>`",空
字符串走老路径 prompt 字节级一致。LLM 拿到事实 + general_v1.md 已有
"对应 skill 领域先 load_skill" 规则自然组合 → 主动 load。否决"完整
SKILL.md 预注入 prompt"方案(会把 tasks.skill 升格成 binding,投入产出
比不划算)。
2) imagegen SKILL.md 加 ⛔ 调 seedream tool 前必须把最终 prompt 贴给用户看
+ BLOCKING 等明确确认硬约束:① 顶部流程加确认步骤;② 新增「调 tool 前
的强制门(铁律)」段定义回复分类(可以/OK/画吧/嗯 算确认;改 X → 重贴
重等;沉默 → 继续等;模棱两可 → 追问到明确);③ 新增「调 tool 前再过
一道」段给具体贴 prompt 的对话格式;④ 调用范式段加"前置条件已确认才调";
⑤ 反模式加两条(没贴就调 / 模棱两可当确认)。本质是把模型脑内装配摊
到对话层,装配 ≠ 授权调用。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
02307a08d1
commit
468cef5fcc
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
> 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9`。
|
||||
|
||||
最后更新:2026-05-21(imagegen skill 补图片比例引导维度 + 修掉之前臆造的"只能正方形")
|
||||
最后更新:2026-05-21(system prompt 注入 task 预选 skill 提示)
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -23,7 +23,8 @@
|
|||
|
||||
### 2026-05-21
|
||||
|
||||
- **imagegen skill 补「比例」维度 + 修掉臆造的"只能正方形"**:用户反馈 skill 缺图片比例引导。原 SKILL 里 size 表写"比例只能正方形"是基于 doubao.yaml + tool 参数描述只列三个正方形例子的间接推断,无验证。改:① 诊断五维 → 六维,加"比例/尺寸"(ppt 16:9 / 海报 9:16 / 头像 1:1 / 公众号 2.35:1 / 书籍 3:4);② 一次性追问范式加比例项,上下文推断里给"做 ppt/海报/公众号/学术示意"四种用途的默认比例;③ size 参数表重写成"按用途选比例,再选分辨率",列常见 size 参考值 + 明确"非方形是按比例算的参考值,豆包是否原生支持需首次小调用验证";④ 失败解药表加比例错(改 size 不动 prompt)+ API 报错回退默认两条;⑤ 反模式加"不问比例就默认走 yaml 1:1"。承认 unknown:豆包 5.0 实际支持哪些非方形 size 没验证,首次用错就回退默认 + 让用户协商,不臆造。:两根因 —— ① `general_v1.md` 「媒体生成工具」段把 `seedream` 写成一级直觉(列了"画/出/来张"等关键词 + 直接调 tool 的 how-to),压过 skill discovery block 的微弱声音;② imagegen description 关键词覆盖窄(没有"画/绘制/艺术图/图片"等朴素词)。修法:system prompt 那段改成"调 seedream 前**必须先 `load_skill('imagegen')`**",细节判断全移到 skill 里,只留 ¥0.22 计费 + 不装饰生成 + 不连发三条兜底硬约束;imagegen description 扩 17 个触发词(画/绘制/出图/来张/艺术图/写实图/场景图...)。两层联动:一级 prompt 指引到 skill,二级 description 提匹配概率。
|
||||
- **system prompt 注入 task 预选 skill 提示**:`core/agent_builder.py::_build_system_prompt` 加 `task_skill` 参数,非空时在"工作目录与 task 上下文"段加一行 `- **task 预选 skill**: \`<name>\` — 用户创建时声明的主 skill`;空字符串走老路径,prompt 字节级一致。LLM 拿到这条事实 + `general_v1.md:17-23` 已有的"对应 skill 领域先 load_skill" 规则自然组合 → 主动 load。否决"直接把完整 SKILL.md 预注入 prompt"方案 —— 那会把 `tasks.skill` 从 metadata 升格成 binding,需要同步改 DESIGN.md / 想清楚 PATCH 改 skill 的语义,投入产出比不划算;轻量提示保渐进披露三层架构不动。
|
||||
- **imagegen skill 加 ⛔ 调 tool 前必须贴 prompt 给用户 + BLOCKING 等确认硬约束**:用户反馈之前流程"模糊就问"不够,清楚的描述也可能模型脑里和用户脑里对不上,事后看图才发现白烧 ¥0.22。改:① 顶部流程一句话加"⛔ 把 prompt 完整贴给用户看 + 问改不改 → 用户明确确认后 → 调 seedream"步骤;② 加「调 tool 前的强制门(铁律)」段定义回复分类(可以/OK/画吧/嗯 算确认;改 X → 重贴重等;沉默/追问别的 → 继续等;模棱两可 → 追问到明确);③ 加「调 tool 前再过一道」段给具体贴 prompt 的对话格式(代码块 + 参数清单 + 预计花费 + 一句"开烧?改什么?");④ 调用范式段加"前置条件:已拿到明确确认才调";⑤ 反模式加两条(没贴就调 / 模棱两可当确认)。本质是把"模型脑内装配"摊到对话层让用户最后过一眼,装配 ≠ 授权调用。:用户反馈 skill 缺图片比例引导。原 SKILL 里 size 表写"比例只能正方形"是基于 doubao.yaml + tool 参数描述只列三个正方形例子的间接推断,无验证。改:① 诊断五维 → 六维,加"比例/尺寸"(ppt 16:9 / 海报 9:16 / 头像 1:1 / 公众号 2.35:1 / 书籍 3:4);② 一次性追问范式加比例项,上下文推断里给"做 ppt/海报/公众号/学术示意"四种用途的默认比例;③ size 参数表重写成"按用途选比例,再选分辨率",列常见 size 参考值 + 明确"非方形是按比例算的参考值,豆包是否原生支持需首次小调用验证";④ 失败解药表加比例错(改 size 不动 prompt)+ API 报错回退默认两条;⑤ 反模式加"不问比例就默认走 yaml 1:1"。承认 unknown:豆包 5.0 实际支持哪些非方形 size 没验证,首次用错就回退默认 + 让用户协商,不臆造。:两根因 —— ① `general_v1.md` 「媒体生成工具」段把 `seedream` 写成一级直觉(列了"画/出/来张"等关键词 + 直接调 tool 的 how-to),压过 skill discovery block 的微弱声音;② imagegen description 关键词覆盖窄(没有"画/绘制/艺术图/图片"等朴素词)。修法:system prompt 那段改成"调 seedream 前**必须先 `load_skill('imagegen')`**",细节判断全移到 skill 里,只留 ¥0.22 计费 + 不装饰生成 + 不连发三条兜底硬约束;imagegen description 扩 17 个触发词(画/绘制/出图/来张/艺术图/写实图/场景图...)。两层联动:一级 prompt 指引到 skill,二级 description 提匹配概率。
|
||||
- **新增 imagegen skill(引导用户说清楚生图需求)**:`skills/imagegen/SKILL.md` 单文件(参考 coding skill 范式无 scripts/references)。核心是"先诊断模糊度 → 一次性给推断 + 待确认项 → 用户拍板 → 装配 prompt → 调 `seedream` tool"五步法,防止用户一句"画个 XX"就直接烧 ¥0.22。五维清单(主体/场景/风格/构图/光线)缺 2 维以上就先问;mermaid vs seedream 选型给"默认倾向 mermaid + 反向选 seedream 信号 + 模糊时主动一句话问用户"三段式(没在 system prompt 那段流程图优先 mermaid 上一刀切,留 skill 层细化判断);size/watermark/search 默认值取舍 + 失败不复发的解药表 + 8 条反模式。`seedream` tool 本身不动,skill 仅是流程引导层。
|
||||
- **登录页加"+ 管理员添加用户"入口 + 删 chat meta 条/tok 显示**:`web/auth.py` 加 `create_user()` helper(CLI/web 共用,避免漂移)+ `AuthConfig.admin_token` 从 `ZCBOT_ADMIN_TOKEN` env 读(未设 → None);`web/app.py` 加 `POST /v1/auth/admin/create_user` 校验共享口令后落库(503/403/400/409 分支);前端 `dev.html` 登录卡片右下加 ghost link + 弹窗(email/密码/管理员口令),成功后回填邮箱到登录表单提示"已创建请登录",不自动登录;同时删 chat 顶栏 `${n_messages} 条 · ${tokens} tok` 一行(与左 task 列表重复)。否决"User 表加 is_admin 列 + 管理员 JWT"方案 —— 开发期成本不划算,env 共享口令(类 PLATFORM_KEY 范式)够用。
|
||||
- **新增 documents skill(内部材料学科知识库 document_search API)**:`skills/documents/{SKILL.md, client.py}`,四函数 `list_kb / search / download / health`;走 `https://ai.ctc-zc.com:8100/api` Bearer 认证,env `DOCUMENT_SEARCH_API_KEY` + `DOCUMENT_SEARCH_URL`(可覆盖);search 默认返 `md_content`(整篇 Markdown 50K-200K 字符级),SKILL.md 反模式约束"只 print 前 300 字"防爆上下文;smoke 验证发现库实质是 7 个材料学科预收的英文学术论文(胶凝/陶瓷/玻璃/晶体/复合/耐火/检验检测,21W+ 文件)+ 跨语言语义检索,SKILL.md 据此校准(原写"主语料中文"是错的);与 research(OpenAlex)互补,documents 已 Markdown 化对 LLM 更友好,但仅覆盖材料领域。
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@ def _build_system_prompt(
|
|||
user_id: UUID,
|
||||
task_id: UUID,
|
||||
task_name: str,
|
||||
task_skill: str = "",
|
||||
) -> str:
|
||||
"""拼 system prompt: 模板 + skill 列表 + memory + 工作目录段 + task 上下文 + 命名约定。
|
||||
|
||||
|
|
@ -162,13 +163,19 @@ def _build_system_prompt(
|
|||
today = datetime.now().strftime("%Y-%m-%d")
|
||||
tname = task_name or "<未指定>"
|
||||
short_id = task_id.hex[:8]
|
||||
skill_line = (
|
||||
f"- **task 预选 skill**: `{task_skill}` — 用户创建时声明的主 skill\n"
|
||||
if task_skill else ""
|
||||
)
|
||||
prompt += (
|
||||
f"\n\n## 工作目录与 task 上下文\n"
|
||||
f"- cwd(用户启动时所在目录,只读用): `{tool_base}`\n"
|
||||
f"- **task_dir(所有产物写到这里)**: `{wd_abs}`\n"
|
||||
f"- **task_short_id**(永不变,「宪法」文件主锚): `{short_id}`\n"
|
||||
f"- **task_name**(可变,写进文件名作人类可读说明): `{tname}`\n"
|
||||
f"- **today**(当前日期,用于「宪法」文件命名): `{today}`\n\n"
|
||||
f"- **today**(当前日期,用于「宪法」文件命名): `{today}`\n"
|
||||
f"{skill_line}"
|
||||
f"\n"
|
||||
f"SKILL 文档里出现的 `<task_dir>` 占位符,一律指上面这个绝对路径。"
|
||||
f"普通产物(sections / slides / 终稿 .docx/.pptx)按 SKILL 文档落路径;"
|
||||
f"「宪法」性文件(spec 等)按下面《task 级「宪法」文件命名约定》拼路径。\n"
|
||||
|
|
@ -307,7 +314,7 @@ def build_agent(
|
|||
|
||||
system_prompt = _build_system_prompt(
|
||||
cfg, skills, workspace_dir, tool_base, working_dir_path, uid,
|
||||
task_id, task_state.name,
|
||||
task_id, task_state.name, task_state.skill,
|
||||
)
|
||||
|
||||
meta = {
|
||||
|
|
|
|||
|
|
@ -5,9 +5,22 @@ description: 用豆包 Seedream 5.0 生图(`seedream` tool)。**任何生图任
|
|||
|
||||
# Imagegen
|
||||
|
||||
把"我想要张图"变成一张能用的图。**先诊断模糊度 → 一次性给推断 + 待确认项 → 用户拍板 → 装配 prompt → 调 `seedream`**。
|
||||
把"我想要张图"变成一张能用的图。流程:
|
||||
|
||||
每次 `seedream` 调用 **¥0.22**(`search=true` 加 ¥0.05),3-5 秒出图。**模糊就问,不要赌**。
|
||||
**诊断模糊度 → 一次性给推断 + 待确认项 → 用户拍板维度 → 装配最终 prompt → ⛔ 把 prompt 完整贴给用户看 + 问改不改 → 用户明确确认后 → 调 `seedream`**
|
||||
|
||||
每次 `seedream` 调用 **¥0.22**(`search=true` 加 ¥0.05),3-5 秒出图。**模糊就问;清楚也要把 prompt 给用户最后过一眼再烧钱**。
|
||||
|
||||
## ⛔ 调 tool 前的强制门(铁律)
|
||||
|
||||
**任何情况下,在 `seedream` tool call 发出去之前,都必须先把最终装配好的 prompt(包括 size / watermark / search 参数)用对话消息明文展示给用户,然后问"这样画?要改什么?"并 ⛔ BLOCKING 等用户明确回复。**
|
||||
|
||||
- 用户回复 "可以" / "OK" / "就这样" / "对" / "嗯" / "画吧" / 简单确认 → 可以调 tool
|
||||
- 用户回复 "把 X 改成 Y" / "再加 Z" / "风格换成 W" → 改完后**再次贴最终 prompt + 再次等确认**(可能改后又有新疑问)
|
||||
- 用户**沉默 / 长时间不回 / 追问别的事** → 不算确认,**继续等**,不要自作主张
|
||||
- 用户回 "看起来不错" / "差不多" / 模棱两可 → **主动追问一句"这就开烧 ¥0.22?"**,拿到明确"是"再调
|
||||
|
||||
**为什么强制**:这个 skill 之前实测过被绕过 —— 模型看到用户描述就一通推断装 prompt 然后直接 tool call,用户看到生成结果才发现 prompt 跟自己脑里想的不一样,白烧 ¥0.22。一次"贴出来 + 等确认"成本是零(对话往返),换避免一次错图代价(¥0.22 + 时间)非常划算。**装配 prompt 不等于授权调用**。
|
||||
|
||||
## 何时用本 skill
|
||||
|
||||
|
|
@ -78,9 +91,9 @@ description: 用豆包 Seedream 5.0 生图(`seedream` tool)。**任何生图任
|
|||
- 做公众号头图 → 2.35:1 横长条
|
||||
- 用户没明示用途 → **必须问一句**,默认 1:1 大概率不对
|
||||
|
||||
## 装配 prompt — 用户确认后
|
||||
## 装配 prompt — 用户拍板维度后
|
||||
|
||||
用户拍板后,**把前 5 维拼成自然中文 prompt 文本**,**第 6 维(比例)走 `size` 参数**:
|
||||
用户拍板六维后,**把前 5 维拼成自然中文 prompt 文本**,**第 6 维(比例)走 `size` 参数**:
|
||||
|
||||
```
|
||||
施工中正在浇筑的现代混凝土楼板,工地俯视视角,远处有塔吊,
|
||||
|
|
@ -93,6 +106,29 @@ description: 用豆包 Seedream 5.0 生图(`seedream` tool)。**任何生图任
|
|||
- **不要写否定提示词**("not blurry"、"no watermark")—— Seedream 不支持 negative prompt,这些会被当正向词吃进去反而坏事
|
||||
- 主体放最前,风格 / 光线放后
|
||||
|
||||
## ⛔ 调 tool 前再过一道:把最终 prompt 贴给用户
|
||||
|
||||
装配完后**立即**用对话消息把最终结果贴出来 + 等用户明确确认。**装配 ≠ 授权调用**。
|
||||
|
||||
格式建议(代码块包起来,清晰可读):
|
||||
|
||||
> 我准备调 seedream,参数如下:
|
||||
>
|
||||
> ````
|
||||
> prompt: 施工中正在浇筑的现代混凝土楼板,工地俯视视角,远处有塔吊,
|
||||
> 写实工程摄影,质感细腻,广角俯视,正午阳光,清晰阴影
|
||||
> size: 1920x1080(16:9 ppt 横版)
|
||||
> watermark: false
|
||||
> search: false
|
||||
> 预计花费: ¥0.22
|
||||
> ````
|
||||
>
|
||||
> 这样开烧?要改什么?(改 prompt 文字 / 改比例 / 加水印 / 启用联网搜索)
|
||||
|
||||
然后 ⛔ **BLOCKING:等用户明确回复**(参见上节铁律的回复分类规则)。
|
||||
|
||||
**为什么强调** —— 装配阶段是模型脑内运算,用户没法看。把"模型脑里那串文字"摊到对话里给用户最后过一眼,是用户对 ¥0.22 这一笔实际授权的唯一窗口。没这一步用户只能事后看图反推 prompt 错在哪。
|
||||
|
||||
## 参数取舍
|
||||
|
||||
### `size`(决定比例和分辨率)
|
||||
|
|
@ -121,6 +157,8 @@ description: 用豆包 Seedream 5.0 生图(`seedream` tool)。**任何生图任
|
|||
|
||||
## 调用范式
|
||||
|
||||
**前置条件**:用户已经看过最终 prompt + size 等参数,明确回复 "可以" / "OK" / "画吧" 之类(参见上面两条 ⛔ 铁律)。**没看到这个确认就不要调**。
|
||||
|
||||
`seedream` 是 tool 不是 skill 函数,**直接调,不要 `run_python` 包一层**:
|
||||
|
||||
```
|
||||
|
|
@ -162,6 +200,8 @@ seedream(
|
|||
|
||||
## 反模式
|
||||
|
||||
- ❌ **没把最终 prompt 贴给用户看就直接 tool call** —— skill 的核心铁律,违反 = 白烧 ¥0.22 大概率事件
|
||||
- ❌ **用户回"看起来不错"就当确认调 tool** —— 模棱两可必须追问到明确"是 / OK / 画吧"
|
||||
- ❌ 用户没主动要图就装饰性生成(system prompt 红线)
|
||||
- ❌ 用户说"画个 XX" 直接拿这 4 个字当 prompt 调用 —— 六维清单至少先问 1 轮
|
||||
- ❌ 一个个问"什么主体?""什么风格?" —— 一次性摆推断 + 让用户改
|
||||
|
|
|
|||
Loading…
Reference in New Issue