feat:意图识别优化
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
"""当前后端能力边界的单一来源,接入新能力时只改这里,提示词和校验自动同步"""
|
||||
|
||||
# 数据源绑定尚未接入,新增组件只能使用物料自带的示例数据
|
||||
DATA_BINDING_SUPPORTED = False
|
||||
|
||||
# 写进提示词的能力说明,避免各节点各写一套
|
||||
DATA_BINDING_GUIDE = (
|
||||
""
|
||||
if DATA_BINDING_SUPPORTED
|
||||
else "目前尚未接入数据源绑定,组件只使用物料自带的示例数据,不生成 dataId;"
|
||||
"用户提到具体数据源时,不视为必须满足的需求,在 assumptions 中说明使用示例数据,不向用户提供数据源选项"
|
||||
)
|
||||
|
||||
# 校验不通过时返回的说明
|
||||
DATA_BINDING_ERROR = "当前尚未接入数据绑定,不能生成 dataId,请使用物料示例数据"
|
||||
|
||||
# 面向用户的失败说明,不暴露内部校验术语
|
||||
USER_FAILURE_MESSAGE = "抱歉,这次没能完成修改,请换个说法或稍后再试"
|
||||
@@ -0,0 +1,45 @@
|
||||
"""需求操作名词表的单一来源,需求协议、提示词、能力检查和范围校验都引用这里"""
|
||||
|
||||
# 模型可能使用的同义操作名,统一成词表中的标准名称;新增别名只改这里
|
||||
OPERATION_ALIASES: dict[str, str] = {"restyle": "update"}
|
||||
|
||||
# 直接修改已有组件支持的操作,每一项都要有对应的动作规则
|
||||
NODE_OPERATIONS: tuple[str, ...] = ("move", "resize", "update", "delete")
|
||||
|
||||
# 直接修改画布支持的操作,最终都转换为 update_canvas 动作
|
||||
CANVAS_OPERATIONS: tuple[str, ...] = ("update", "resize", "update_canvas")
|
||||
|
||||
# 规划路径中,对已有组件做调整的操作;reflow、layout 表示整体重排,只走规划
|
||||
PLAN_ADJUST_OPERATIONS: tuple[str, ...] = (
|
||||
"move",
|
||||
"resize",
|
||||
"update",
|
||||
"reflow",
|
||||
"layout",
|
||||
)
|
||||
|
||||
# 写进协议描述和提示词的操作说明,词表变化时自动同步
|
||||
OPERATION_GUIDE = (
|
||||
f"修改已有组件用 {'、'.join(NODE_OPERATIONS)},"
|
||||
"修改画布用 update 或 resize,新增用 add;"
|
||||
"颜色、背景、文字等样式和属性修改统一用 update,具体内容写入 parameters"
|
||||
)
|
||||
|
||||
|
||||
def normalize_operation(operation: str) -> str:
|
||||
"""把同义操作名转换成标准名称,未登记的名称原样返回"""
|
||||
return OPERATION_ALIASES.get(operation, operation)
|
||||
|
||||
|
||||
def is_direct_operation(target_scope: str, operation: str) -> bool:
|
||||
"""判断是否为无需规划即可直接转换为动作的操作"""
|
||||
if target_scope == "nodes":
|
||||
return operation in NODE_OPERATIONS
|
||||
if target_scope == "canvas":
|
||||
return operation in CANVAS_OPERATIONS
|
||||
return False
|
||||
|
||||
|
||||
def is_canvas_operation(target_scope: str, operation: str) -> bool:
|
||||
"""判断是否为画布属性修改"""
|
||||
return target_scope == "canvas" and operation in CANVAS_OPERATIONS
|
||||
@@ -2,9 +2,10 @@
|
||||
|
||||
from typing import Literal, Self
|
||||
|
||||
from pydantic import Field, model_validator
|
||||
from pydantic import Field, field_validator, model_validator
|
||||
|
||||
from .base import ExtensibleModel, JsonObject, NonBlankString
|
||||
from .operations import OPERATION_GUIDE, normalize_operation
|
||||
|
||||
Intent = Literal["create_screen", "modify_screen", "qa", "unclear"]
|
||||
TargetScope = Literal["nodes", "canvas", "screen", "unresolved"]
|
||||
@@ -22,14 +23,18 @@ class RequirementChange(ExtensibleModel):
|
||||
target_description: NonBlankString | None = Field(
|
||||
default=None, description="目标的自然语言描述,例如右侧区域、用户所说的那个图"
|
||||
)
|
||||
operation: NonBlankString = Field(
|
||||
description="需求操作,例如 move、resize、add、delete、restyle;允许后续扩展"
|
||||
)
|
||||
operation: NonBlankString = Field(description=f"需求操作。{OPERATION_GUIDE}")
|
||||
parameters: JsonObject = Field(
|
||||
default_factory=dict,
|
||||
description="需求参数,例如 delta_x=50;保留用户要求的单位与相对变化语义",
|
||||
)
|
||||
|
||||
@field_validator("operation")
|
||||
@classmethod
|
||||
def normalize_operation_name(cls, value: str) -> str:
|
||||
# 在协议层统一同义操作名,模型输出、测试构造和检查点恢复都经过这里
|
||||
return normalize_operation(value)
|
||||
|
||||
@model_validator(mode="after")
|
||||
def validate_target(self) -> Self:
|
||||
if len(self.target_ids) != len(set(self.target_ids)):
|
||||
|
||||
Reference in New Issue
Block a user