"""世界模型 API schema(河图枢运行时,api-spec §12)。""" from typing import Any from pydantic import BaseModel, Field class WorldEntityCreateRequest(BaseModel): character_id: str | None = Field(default=None, description="所属人物;省略时用当前激活人物。") type: str = Field(default="concept", description="实体类型,取值见契约字典 §11.1。") name: str = Field(min_length=1, description="实体名称。") attributes: dict[str, Any] = Field(default_factory=dict, description="实体属性集合。") state_type: str = Field(default="inference", description="状态类型,取值见契约字典 §11.2。") confidence: float = Field(default=0.5, ge=0.0, le=1.0, description="置信度。") evidence_ids: list[str] = Field(default_factory=list, description="证据 ID 列表。") sources: list[str] = Field(default_factory=list, description="来源标识列表。") class WorldEntityResponse(BaseModel): id: str = Field(description="实体 ID,前缀 world_entity_。") character_id: str = Field(description="所属人物 ID。") type: str = Field(description="实体类型。") name: str = Field(description="实体名称。") attributes: dict[str, Any] = Field(description="实体属性集合。") state_type: str = Field(description="状态类型。") status: str = Field(description="审核状态:pending/confirmed/rejected。") confidence: float = Field(description="置信度。") evidence_ids: list[str] = Field(description="证据 ID 列表。") sources: list[str] = Field(description="来源标识列表。") created_at: str = Field(description="创建时间,UTC ISO 8601 字符串。") updated_at: str = Field(description="更新时间,UTC ISO 8601 字符串。") class WorldRelationCreateRequest(BaseModel): character_id: str | None = Field(default=None, description="所属人物;省略时用当前激活人物。") subject_id: str = Field(description="关系主体实体 ID。") predicate: str = Field( min_length=1, description="关系谓词(自由字符串,如「位于」「依赖」「协助」)。" ) object_id: str = Field(description="关系客体实体 ID。") confidence: float = Field(default=0.5, ge=0.0, le=1.0) evidence_ids: list[str] = Field(default_factory=list) class WorldRelationResponse(BaseModel): id: str = Field(description="关系 ID,前缀 world_relation_。") character_id: str = Field(description="所属人物 ID。") subject_id: str = Field(description="关系主体实体 ID。") predicate: str = Field(description="关系谓词。") object_id: str = Field(description="关系客体实体 ID。") confidence: float = Field(description="置信度。") evidence_ids: list[str] = Field(description="证据 ID 列表。") created_at: str = Field(description="创建时间,UTC ISO 8601 字符串。") updated_at: str = Field(description="更新时间,UTC ISO 8601 字符串。") class WorldGraphResponse(BaseModel): """世界图谱数据:所有节点与边,供前端 D3/Force 图谱渲染。""" nodes: list[WorldEntityResponse] = Field(description="图谱节点(世界实体)。") edges: list[WorldRelationResponse] = Field(description="图谱边(实体间关系)。")