Files
my-v0-server/app/schemas/conversation.py
T

57 lines
1.6 KiB
Python

"""会话及对话轮次,用于多轮上下文和后续持久化"""
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 影响),管理页翻页用