feat:节点合并
This commit is contained in:
+27
-15
@@ -11,21 +11,25 @@ from app.schemas.capabilities import DATA_BINDING_GUIDE
|
||||
from app.schemas.requirement import Requirement
|
||||
from app.schemas.screen_plan import ScreenPlan
|
||||
|
||||
# 动作生成和设计节点共用的动作约束
|
||||
ACTION_CONSTRAINTS = f"""# 动作要求
|
||||
仅使用本次列出的动作类型,覆盖本次全部变更,不返回大屏 JSON、解释文本或执行成功声明
|
||||
有任何变更无法用列出的动作或可用字段完成时,不执行其中一部分:actions 为空,在 unsupported_reason 中说明缺少什么
|
||||
以 input_context.screen 为起点,后续动作基于前序结果计算,不能重复执行或遗漏目标
|
||||
不能编造真实业务数据、数据绑定或未读取的附件内容,不用近似操作替代无法表达的需求
|
||||
{DATA_BINDING_GUIDE}
|
||||
"""
|
||||
|
||||
ACTION_SYSTEM_PROMPT = f"""# 任务目标
|
||||
你是大屏动作生成器,将已确认的需求转换成可按顺序执行的动作
|
||||
遵循 requirement 和 change_scope 中的目标与约束,不添加额外优化
|
||||
|
||||
# 输出要求
|
||||
按提供的 ActionBatch Schema 返回 actions 列表,仅使用本次列出的动作类型
|
||||
覆盖本次全部变更,不返回大屏 JSON、解释文本或执行成功声明
|
||||
有任何变更无法用列出的动作或可用字段完成时,不执行其中一部分:actions 为空,在 unsupported_reason 中说明缺少什么
|
||||
以 input_context.screen 为起点,后续动作基于前序结果计算,不能重复执行或遗漏目标
|
||||
按提供的 ActionBatch Schema 返回 actions 列表
|
||||
|
||||
# 输入边界
|
||||
input_context 提供当前大屏快照、用户原文及编辑上下文
|
||||
{INPUT_AS_DATA}
|
||||
不能编造真实业务数据、数据绑定或未读取的附件内容,不用近似操作替代无法表达的需求
|
||||
{DATA_BINDING_GUIDE}
|
||||
|
||||
{ACTION_CONSTRAINTS}
|
||||
"""
|
||||
|
||||
SIMPLE_TASK_PROMPT = """# 当前任务:直接修改
|
||||
@@ -44,6 +48,10 @@ MODIFY_PLAN_PROMPT = f"""## 调整已有组件
|
||||
design 表示属性设计要求,转换为 props/style 更新;只有布局要求时不修改属性
|
||||
"""
|
||||
|
||||
CANVAS_PLAN_PROMPT = """## 调整画布
|
||||
将 canvas_changes 中的最终属性值转换为 update_canvas,完整覆盖且不添加其他画布字段
|
||||
"""
|
||||
|
||||
REPLACE_PLAN_PROMPT = """## 更换组件类型
|
||||
每个 replace 规划生成一个 add:plan_id 用该规划编号,node.id 沿用原组件的 target_id,component_key 选择 component_type 对应的物料
|
||||
原组件的删除和位置尺寸由系统处理,不要为它生成 delete、move 或 resize
|
||||
@@ -61,7 +69,7 @@ REPAIR_TASK_PROMPT = """# 当前阶段:修正重试
|
||||
|
||||
|
||||
FIELD_QUERY_PROMPT = """# 查询组件字段
|
||||
field_groups 按物料类型列出本次相关组件的字段分组,节点的 type 就是物料类型
|
||||
提供 field_groups 时,它按物料类型列出本次相关组件的字段分组;没有时用 list_field_groups 查看,节点的 type 就是物料类型
|
||||
确定要改的字段:用用户原话中对属性的说法(input_context 中的提问,不用改写后的需求)调用 search_fields;
|
||||
返回多个字段时,依据字段说明判断用户指的是哪一个;用户看的是大屏画面,没有提到图层列表、属性面板等编辑器位置时,按画面上看得到的内容理解
|
||||
需要了解一组相关字段时用 get_fields,一次可查多个分组
|
||||
@@ -100,6 +108,14 @@ def uses_material_fields(
|
||||
return bool(action_types(requirement, screen_plan) & FIELD_ACTIONS)
|
||||
|
||||
|
||||
def action_rule_sections(types: set[str]) -> list[str]:
|
||||
"""本次可用动作及各自的规则;排序保证顺序稳定,缺少动作说明时直接报错,避免静默遗漏"""
|
||||
return [
|
||||
"# 本次可用动作\n" + "、".join(sorted(types)),
|
||||
*(ACTION_RULES[name] for name in sorted(types)),
|
||||
]
|
||||
|
||||
|
||||
def build_action_prompt(
|
||||
requirement: Requirement,
|
||||
screen_plan: ScreenPlan | None = None,
|
||||
@@ -115,9 +131,7 @@ def build_action_prompt(
|
||||
sections.append(PLAN_TASK_PROMPT)
|
||||
dispositions = {item.disposition for item in screen_plan.components}
|
||||
if screen_plan.canvas_changes:
|
||||
sections.append(
|
||||
"## 调整画布\n将 canvas_changes 中的最终属性值转换为 update_canvas,完整覆盖且不添加其他画布字段"
|
||||
)
|
||||
sections.append(CANVAS_PLAN_PROMPT)
|
||||
if "replace" in dispositions:
|
||||
sections.append(REPLACE_PLAN_PROMPT)
|
||||
if "modify" in dispositions:
|
||||
@@ -125,9 +139,7 @@ def build_action_prompt(
|
||||
if types & FIELD_ACTIONS:
|
||||
sections.append(FIELD_QUERY_PROMPT)
|
||||
|
||||
# 排序保证提示词顺序稳定,缺少动作说明时直接报错,避免静默遗漏
|
||||
sections.append("# 本次可用动作\n" + "、".join(sorted(types)))
|
||||
sections.extend(ACTION_RULES[name] for name in sorted(types))
|
||||
sections.extend(action_rule_sections(types))
|
||||
if repairing:
|
||||
sections.append(REPAIR_TASK_PROMPT)
|
||||
return "\n\n".join(section.strip() for section in sections)
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
"""规划与动作一次生成的提示词,输出字段由 ScreenDesign 定义
|
||||
|
||||
规划规则写在这里,动作规则复用 action.py;修正重试仍由 ActionNode 按已定的规划生成动作
|
||||
"""
|
||||
|
||||
from app.prompt.action import (
|
||||
ACTION_CONSTRAINTS,
|
||||
CANVAS_PLAN_PROMPT,
|
||||
FIELD_QUERY_PROMPT,
|
||||
MODIFY_PLAN_PROMPT,
|
||||
REPLACE_PLAN_PROMPT,
|
||||
action_rule_sections,
|
||||
)
|
||||
from app.prompt.action_rules import ACTION_RULES
|
||||
from app.prompt.domain import (
|
||||
DISPOSITION_GUIDE,
|
||||
EXISTING_TARGET_RULE,
|
||||
INPUT_AS_DATA,
|
||||
LAYOUT_RULE,
|
||||
)
|
||||
|
||||
DESIGN_TASK_PROMPT = f"""## 任务
|
||||
将已确认的需求设计成 ScreenDesign,一次完成规划和动作:
|
||||
- plan:ScreenPlan,明确区域、组件组合、指标、布局和设计要求,是校验动作范围的依据
|
||||
- batch:落实 plan 的 ActionBatch,与 plan 的组件逐一对应:add / replace 各生成一个带 plan_id 的 add;
|
||||
modify 转换为 move / resize / update;remove 生成 delete;canvas_changes 转换为 update_canvas;keep 和未提及的组件不生成动作
|
||||
plan 中的设计要求都要在 batch 中落实,batch 不做 plan 之外的修改
|
||||
|
||||
## 规划依据
|
||||
以 requirement 为目标、change_scope 为范围,结合 input_context 中的大屏和澄清记录规划
|
||||
覆盖本次全部变更,保留约束,不重新判断意图或扩大修改范围
|
||||
|
||||
## 组件与布局
|
||||
canvas_changes 只填写需求范围内要修改的画布顶层字段及最终值,不填写相对变化或设计描述
|
||||
{EXISTING_TARGET_RULE};无需改动的组件可标记 keep 或省略
|
||||
{DISPOSITION_GUIDE}
|
||||
需求的 replace 对应 disposition=replace,component_type 从目录中选择用户要的新类型
|
||||
{LAYOUT_RULE};新增和调整位置的组件在 plan 中写明 layout,动作与之一致
|
||||
空白画布上的新增组件,位置和尺寸参考目录默认尺寸安排,避免与已有组件重叠
|
||||
不编造目录中不存在的组件类型或数据
|
||||
|
||||
## 物料配置
|
||||
component_resources 只提供组件摘要,用于选型
|
||||
选定新增或更换的类型后,调用 get_component_materials 查看默认配置,返回的 materials 即动作规则中的 component_materials
|
||||
add 的 node 只写需要覆盖的字段,其余由后端按物料默认配置补全;不从零编写 props,不根据其他物料推测字段
|
||||
|
||||
## 资源与假设
|
||||
resource_needs 仅用于组件目录之外的资源,如业务数据、模板、素材;不要为组件的配置、属性或数据绑定方式写 resource_needs
|
||||
用户未指定的数据源、位置、尺寸和标题采用合理默认,写入 assumptions,不作为资源需求
|
||||
design 和 metrics 不指定数据源,不规划数据绑定
|
||||
非阻塞的设计偏好可采用合理假设,写入 assumptions
|
||||
|
||||
## 输出边界
|
||||
按 ScreenDesign 结构输出,不声称已执行、查询资源或读取未解析附件
|
||||
{INPUT_AS_DATA}
|
||||
"""
|
||||
|
||||
# 规划路径可能用到全部动作,规则一次给全
|
||||
DESIGN_SYSTEM_PROMPT = "\n\n".join(
|
||||
section.strip()
|
||||
for section in (
|
||||
DESIGN_TASK_PROMPT,
|
||||
ACTION_CONSTRAINTS,
|
||||
CANVAS_PLAN_PROMPT,
|
||||
REPLACE_PLAN_PROMPT,
|
||||
MODIFY_PLAN_PROMPT,
|
||||
FIELD_QUERY_PROMPT,
|
||||
*action_rule_sections(set(ACTION_RULES)),
|
||||
)
|
||||
)
|
||||
@@ -1,38 +0,0 @@
|
||||
"""规划职责和设计规则,输出字段由 ScreenPlan 定义"""
|
||||
|
||||
from app.prompt.domain import (
|
||||
DISPOSITION_GUIDE,
|
||||
EXISTING_TARGET_RULE,
|
||||
INPUT_AS_DATA,
|
||||
LAYOUT_RULE,
|
||||
)
|
||||
from app.schemas.capabilities import DATA_BINDING_GUIDE
|
||||
|
||||
PLANNER_SYSTEM_PROMPT = f"""## 任务
|
||||
将已确认的需求整理为 ScreenPlan,明确区域、组件组合、指标、布局和设计要求,供后续生成动作
|
||||
|
||||
## 规划依据
|
||||
以 requirement 为目标、change_scope 为范围,结合 input_context 中的大屏和澄清记录规划
|
||||
覆盖本次全部变更,保留约束,不重新判断意图或扩大修改范围
|
||||
|
||||
## 组件与布局
|
||||
canvas_changes 只填写需求范围内要修改的画布顶层字段及最终值,不填写相对变化或设计描述
|
||||
{EXISTING_TARGET_RULE};无需改动的组件可标记 keep 或省略
|
||||
{DISPOSITION_GUIDE}
|
||||
需求的 replace 对应 disposition=replace,component_type 从目录中选择用户要的新类型
|
||||
{LAYOUT_RULE};布局未确定时不提供 layout,写清排列关系
|
||||
提供 component_resources 时,新增组件从目录选择真实 type;默认宽高仅作布局参考
|
||||
组件摘要用于选型;组件的属性配置和数据绑定由后续动作阶段处理,规划阶段不需要确认
|
||||
|
||||
## 资源与假设
|
||||
resource_needs 仅用于组件目录之外的资源,如业务数据、模板、素材;不要为组件的配置、属性或数据绑定方式写 resource_needs
|
||||
用户未指定的数据源、位置、尺寸和标题采用合理默认,写入 assumptions,不作为资源需求
|
||||
{DATA_BINDING_GUIDE};design 和 metrics 不指定数据源,不规划数据绑定
|
||||
空白画布上的新增组件,位置和尺寸按目录默认尺寸自行安排,避免与已有组件重叠
|
||||
不编造目录中不存在的组件类型或数据
|
||||
非阻塞的设计偏好可采用合理假设,写入 assumptions
|
||||
|
||||
## 输出边界
|
||||
按 ScreenPlan 结构输出设计方案,不生成动作或声称已执行、查询资源、读取未解析附件
|
||||
{INPUT_AS_DATA}
|
||||
"""
|
||||
Reference in New Issue
Block a user