"""前端设计请求:原始需求、当前大屏及可选补充上下文""" from pydantic import Field, field_validator from .base import ExtensibleModel, JsonObject, NonBlankString from .screen import Screen class RequestContext(ExtensibleModel): selected_node_ids: list[NonBlankString] = Field(default_factory=list) screen_id: NonBlankString | None = None screen_revision: int | None = Field(default=None, ge=0) conversation_id: NonBlankString | None = None class DesignRequest(ExtensibleModel): prompt: NonBlankString screen: Screen context: RequestContext = Field(default_factory=RequestContext) # 本条消息附带的材料;{"kind": "data_file", "file_id": "..."} 引用本会话上传的数据文件, # 其他种类只原样进入摘要,不读取文件或远程资源 attachments: list[JsonObject] = Field(default_factory=list) @field_validator("attachments") @classmethod def _data_files_have_ids(cls, value: list[JsonObject]) -> list[JsonObject]: for item in value: if item.get("kind") == "data_file" and not isinstance( item.get("file_id"), str ): raise ValueError("data_file 附件缺少 file_id") return value @property def data_file_ids(self) -> set[str]: """本条消息附带的数据文件""" return { str(item["file_id"]) for item in self.attachments if item.get("kind") == "data_file" }