"""Record数据结构"""
import uuid
from datetime import UTC, datetime
from typing import Any, Literal
from pydantic import BaseModel, Field
from apps.schemas.collection import (
Document,
)
from apps.schemas.enum_var import CommentType, FlowStatus, StepStatus
class RecordDocument(Document):
"""GET /api/record/{conversation_id} Result中的document数据结构"""
id: str = Field(alias="_id", default="")
order: int = Field(default=0, description="文档顺序")
abstract: str = Field(default="", description="文档摘要")
user_sub: None = None
author: str = Field(default="", description="文档作者")
associated: Literal["question", "answer"]
class Config:
"""配置"""
populate_by_name = True
class RecordFlowStep(BaseModel):
"""Record表子项:flow的单步数据结构"""
step_id: str = Field(alias="stepId")
step_name: str = Field(alias="stepName", default="")
step_status: StepStatus = Field(alias="stepStatus")
input: dict[str, Any]
output: dict[str, Any]
ex_data: dict[str, Any] | None = Field(default=None, alias="exData")
class RecordFlow(BaseModel):
"""Flow的执行信息"""
id: str
record_id: str = Field(alias="recordId")
flow_id: str = Field(alias="flowId")
flow_name: str = Field(alias="flowName", default="")
flow_status: StepStatus = Field(alias="flowStatus", default=StepStatus.SUCCESS)
step_num: int = Field(alias="stepNum")
steps: list[RecordFlowStep]
class RecordContent(BaseModel):
"""Record表子项:Record加密前的数据结构"""
question: str
answer: str
data: dict[str, Any] = {}
facts: list[str] = Field(description="[运行后修改]与Record关联的事实信息", default=[])
class FootNoteMetaData(BaseModel):
"""Record表子项:Record的脚注元信息"""
releated_id: str = Field(default="", description="相关ID", alias="releatedId")
insert_position: int = Field(default=0, description="插入位置", alias="insertPosition")
foot_source: str = Field(default="", description="脚注来源", alias="footSource")
foot_type: str = Field(default="", description="脚注类型", alias="footType")
class RecordMetadata(BaseModel):
"""Record表子项:Record的元信息"""
input_tokens: int = Field(default=0, alias="inputTokens")
output_tokens: int = Field(default=0, alias="outputTokens")
time_cost: float = Field(default=0, alias="timeCost")
feature: dict[str, Any] = {}
foot_note_metadata_list: list[FootNoteMetaData] = Field(
default=[], alias="footNoteMetadataList", description="脚注元信息列表")
class RecordComment(BaseModel):
"""Record表子项:Record的评论信息"""
comment: CommentType = Field(default=CommentType.NONE)
feedback_type: list[str] = Field(default=[], alias="dislike_reason")
feedback_link: str = Field(default="", alias="reason_link")
feedback_content: str = Field(default="", alias="reason_description")
feedback_time: float = Field(default_factory=lambda: round(datetime.now(tz=UTC).timestamp(), 3))
class RecordData(BaseModel):
"""GET /api/record/{conversation_id} Result内元素数据结构"""
id: str
group_id: str = Field(alias="groupId")
conversation_id: str = Field(alias="conversationId")
task_id: str | None = Field(default=None, alias="taskId")
document: list[RecordDocument] = []
flow: RecordFlow | None = None
content: RecordContent
metadata: RecordMetadata
comment: CommentType = Field(default=CommentType.NONE)
created_at: float = Field(alias="createdAt")
class RecordGroupDocument(BaseModel):
"""RecordGroup关联的文件"""
id: str = Field(default_factory=lambda: str(uuid.uuid4()), alias="_id")
order: int = Field(default=0, description="文档顺序")
author: str = Field(default="", description="文档作者")
name: str = Field(default="", description="文档名称")
abstract: str = Field(default="", description="文档摘要")
extension: str = Field(default="", description="文档扩展名")
size: int = Field(default=0, description="文档大小,单位是KB")
associated: Literal["question", "answer"]
created_at: float = Field(default=0.0, description="文档创建时间")
class FlowHistory(BaseModel):
"""Flow执行历史"""
flow_id: str = Field(default_factory=lambda: str(uuid.uuid4()), alias="_id")
flow_name: str = Field(default="", description="Flow名称")
flow_staus: FlowStatus = Field(default=FlowStatus.SUCCESS, description="Flow执行状态")
history_ids: list[str] = Field(default=[], description="Flow执行历史ID列表")
class Record(RecordData):
"""问答,用于保存在MongoDB中"""
user_sub: str
key: dict[str, Any] = {}
task_id: str | None = Field(default=None, description="任务ID")
content: str = Field(default="", description="Record内容,已加密")
comment: RecordComment = Field(default=RecordComment())
flow: FlowHistory = Field(
default=FlowHistory(), description="Flow执行历史信息")
class RecordGroup(BaseModel):
"""
问答组
多次重新生成的问答都是一个问答组
Collection: record_group
外键:record_group - document
"""
id: str = Field(default_factory=lambda: str(uuid.uuid4()), alias="_id")
user_sub: str
records: list[Record] = []
docs: list[RecordGroupDocument] = []
conversation_id: str
created_at: float = Field(default_factory=lambda: round(datetime.now(tz=UTC).timestamp(), 3))