40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
|
|
"""
|
|||
|
|
统一场景 DSL(阶段 3):场景可编程输入契约,供入口 / 模板 / 外部系统对齐。
|
|||
|
|
"""
|
|||
|
|
from typing import Any, Dict, List, Tuple
|
|||
|
|
|
|||
|
|
from pydantic import BaseModel, Field
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ScenarioDSL(BaseModel):
|
|||
|
|
"""标准输入:目标、约束、产物、验收 + 业务载荷。"""
|
|||
|
|
|
|||
|
|
version: str = "1"
|
|||
|
|
scene: str = Field(default="", description="场景标识,如 customer_service / dev_codegen")
|
|||
|
|
goal: str = Field(default="", description="业务目标")
|
|||
|
|
constraints: List[str] = Field(default_factory=list, description="硬约束")
|
|||
|
|
deliverables: List[str] = Field(default_factory=list, description="期望产出")
|
|||
|
|
acceptance: List[str] = Field(default_factory=list, description="验收标准")
|
|||
|
|
payload: dict[str, Any] = Field(default_factory=dict, description="扩展键值")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def validate_scenario_dsl(raw: Any) -> Tuple[bool, List[str]]:
|
|||
|
|
"""
|
|||
|
|
校验场景 DSL。根须为 object,字段通过 Pydantic 校验。
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
(是否通过, 错误文案列表)
|
|||
|
|
"""
|
|||
|
|
if not isinstance(raw, dict):
|
|||
|
|
return False, ["DSL 根须为 JSON object"]
|
|||
|
|
try:
|
|||
|
|
ScenarioDSL.model_validate(raw)
|
|||
|
|
except Exception as e:
|
|||
|
|
return False, [str(e)]
|
|||
|
|
return True, []
|
|||
|
|
|
|||
|
|
|
|||
|
|
def normalize_scenario_dsl(raw: dict) -> Dict[str, Any]:
|
|||
|
|
"""校验后得到规范 dict,便于写入节点上下文。"""
|
|||
|
|
return ScenarioDSL.model_validate(raw).model_dump()
|