Skip to content

feat(prompt): 攻击提示词按运动拓扑分四支 - #320

Merged
minorcell merged 1 commit into
1024XEngineer:mainfrom
johnnyzhang-eng:feat/attack-archetypes-v2
Aug 18, 2026
Merged

feat(prompt): 攻击提示词按运动拓扑分四支#320
minorcell merged 1 commit into
1024XEngineer:mainfrom
johnnyzhang-eng:feat/attack-archetypes-v2

Conversation

@johnnyzhang-eng

@johnnyzhang-eng johnnyzhang-eng commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

close #310

问题

attack.md 里三处措辞合起来断言了角色的身体构造和手里拿的东西:

  • the leading arm —— 断言有手臂,且发力主语是手臂
  • downward crescent arc —— 断言挥动轨迹是弧线
  • broad side facing the viewer —— 断言手里那件东西有"宽面"

三条合起来 = "双足 + 有手臂 + 手握一件有宽面的长条物"。喂法杖 / 空手 / 四足角色时,
图文矛盾会被模型自己调和掉,凭空补出那件宽面长条物。#195 那次修复只清了装备名词
(the weapon / the sword),没清装备形状先验,所以同一个坑从名词层退到了形状层。

改法

身体怎么发力分四支运动拓扑,而不是按手里拿什么分:

拓扑 适用 起手
sweep 长条持物:横挥 / 下劈 横向蓄力,发力侧拉到身后腰际
thrust 短持物或空手:直出 / 戳刺 低位蓄力,发力侧收在腰际待发
project 远程:身体前压、送到位、终态保持 双脚站定,双手收在胸前
lunge 非双足:整体前扑,头部 / 前肢领先 四肢收在身下,胸压低

attack.md 拆成 <拓扑>.<朝向> 八节,master_poses.md 的 attack 节同步拆成四节。
母版姿态必须跟着拆:四支的起手姿态互不兼容 —— 拿横挥蓄力母版跑直刺,模型会先把收在
腰际的那侧重新抡起来再做。所以 ATTACK_MASTER_POSES 不放行空值,缺一支就炸,不退回
中性站立。

build_attack_promptarchetype 关键字参数,默认 THRUST:四支里只有 SWEEP
要求手里有一件有宽面的长条物,拿它当默认等于对每个未知角色继续断言持械。
ActionSpec.archetype 是可选字段,非攻击动作带它会被 validator 拒收(它只被攻击提示词
消费,传了不生效,静默忽略比报错更坏)。缺省值只在 build_attack_prompt 定义一处,
ActionSpec 侧留 None,避免同一个缺省两处各写一份后各自漂移。

顺带把构图约束抽进 prompt/_framing.py,由代码统一追加到 walk / jump / idle / attack /
custom 五个动作,不再抄进每份 md —— 同一条约束抄 N 份会各自漂移。只写正向计数句
("恰好一个角色在画面里"),不写否定句:该 i2v 接口没有 negative_prompt,否定句里的名词
会被 latch 进画面。

怎么验证的

新增 backend/tests/test_attack_archetypes.py(57 个用例),按结构性质断言而不是背文案:

  • 八个 拓扑×朝向 组合都解析到真正文,两两互不相同
  • 每一支都不含形状先验词(crescent / broad side / blade / shaft 等),母版姿态同样查
  • 每一支的发力主语是身体部位不是 the leading arm
  • 每一支都写了整体位移(whole body / torso / hips)—— i2v 强跟身体、弱跟持物
  • 默认支是 THRUST 不是 SWEEP;非法拓扑当场抛错,不静默落到某一支
  • ActionSpec 对非攻击动作拒收 archetype;派生层真的把 archetype 传下去了

本地闸门(backend/):

uv run ruff check .    All checks passed
uv run lint-imports    Contracts: 2 kept, 0 broken
uv run pytest -q       740 passed, 14 skipped

没跑任何付费生成,断言都是纯文本结构检查。

范围

只含后端。_framing.py 会被后续几个动作相关 PR 共用,但本 PR 自带完整实现,可独立合入。

attack.md 拆成 sweep/thrust/project/lunge × side/front 八节,去掉 crescent /
broad side 这类形状先验 —— 它们等于断言角色手握一件有宽面的长条物,喂法杖 /
空手 / 四足角色时模型会凭空补出那件东西(1024XEngineer#195 只清了装备名词,没清形状先验)。

build_attack_prompt 新增 archetype(默认 THRUST,SWEEP 是唯一要求持有长条物的
一支),ActionSpec 加同名字段并对非攻击动作拒收;母版姿态同步分四支。
构图约束抽到 _framing 由代码统一追加到五个动作,只写正向计数句。

Refs 1024XEngineer#310
@vercel

vercel Bot commented Aug 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
windup Ignored Ignored Preview Aug 14, 2026 9:50am

@codecov

codecov Bot commented Aug 14, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review conclusion

我检查了请求入口 → ActionSpec → 攻击提示词,以及拓扑对应母版姿态这两条契约。提示词八分支本身结构一致,但当前生产调用链没有把拓扑选择送进来,新增的四套母版姿态也没有进入任何生成路径,因此除默认 thrust 外的行为尚未真正落地。GitHub 的 lint-and-test 已通过;当前沙箱缺少 uv/pytest,未能本地复跑测试。

View job run

Comment thread backend/packages/ai_engine/src/windup_ai_engine/master_prep.py
@minorcell

Copy link
Copy Markdown
Member

@johnnyzhang-eng 跟进下哦

@minorcell minorcell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@minorcell
minorcell merged commit 7e02ae2 into 1024XEngineer:main Aug 18, 2026
7 checks passed
johnnyzhang-eng added a commit to johnnyzhang-eng/game-asset-character that referenced this pull request Aug 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(prompt): 攻击提示词含装备形状先验

2 participants