"""会话及对话轮次,用于多轮上下文和后续持久化""" from datetime import datetime from typing import Annotated, Literal from pydantic import BaseModel, StringConstraints from .base import NonBlankString Title = Annotated[ str, StringConstraints(strip_whitespace=True, min_length=1, max_length=100) ] class Turn(BaseModel): """一次任务对应一轮对话,同一个 thread_id 多次写入时覆盖同一轮""" conversation_id: str thread_id: str message_id: str prompt: str # 用户原始输入 outcome: Literal["completed", "waiting_for_input", "failed", "cancelled"] summary: str # 助手一侧的完整回复(回答、追问或失败说明),不截断;不代表前端已执行 created_at: datetime class ConversationCreate(BaseModel): # 会话归属的大屏;不传则不归属任何大屏(兼容旧调用) screen_id: NonBlankString | None = None class ConversationRename(BaseModel): title: Title class ConversationCreated(BaseModel): conversation_id: str class ConversationDetail(BaseModel): conversation_id: str turns: list[Turn] class ConversationSummary(BaseModel): """历史会话列表项,只包含已产生对话的会话""" conversation_id: str title: str # 用户改过名用改的,否则取自首轮用户输入,过长时截断 screen_id: str | None = None updated_at: datetime # 最近一轮对话的创建时间 class ConversationList(BaseModel): conversations: list[ConversationSummary] total: int # 符合条件的会话总数(不受 limit / offset 影响),管理页翻页用