80 lines
2.8 KiB
Python
80 lines
2.8 KiB
Python
"""会话及对话轮次,用于多轮上下文和后续持久化"""
|
|
|
|
from datetime import datetime
|
|
from typing import Annotated, Literal
|
|
|
|
from pydantic import BaseModel, Field, StringConstraints
|
|
|
|
from .base import JsonObject, NonBlankString
|
|
|
|
Title = Annotated[
|
|
str, StringConstraints(strip_whitespace=True, min_length=1, max_length=100)
|
|
]
|
|
|
|
|
|
class TurnChange(BaseModel):
|
|
"""本轮交付的一处修改,同一组件的多个动作合并成一条;记的是交付了,不是前端已执行"""
|
|
|
|
node_id: str # 画布写 "canvas"
|
|
type: str # 组件类型,画布写 "canvas"
|
|
title: str | None = None # 交付时画面上的名字或内容,删除的组件取原始大屏上的
|
|
change: Literal["added", "modified", "deleted"]
|
|
|
|
|
|
class TurnQuery(BaseModel):
|
|
"""问答里成功执行的一次查询:只存 SQL 和结果的形状,不存结果"""
|
|
|
|
sql: str
|
|
columns: list[str]
|
|
rows: int # 返回的行数
|
|
truncated: bool # 结果超过返回上限,只返回了一部分
|
|
|
|
|
|
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
|
|
# 轮次记录:由代码从运行结果推出,不经过模型;只有完成的轮次才有 changes、queries
|
|
changes: list[TurnChange] = Field(default_factory=list) # 交付的修改
|
|
queries: list[TurnQuery] = Field(default_factory=list) # 问答查询,按执行顺序
|
|
# 本任务里追问过的问题和用户的回答(含选中的选项);恢复后整轮被覆盖,问答记在这里
|
|
clarifications: list[JsonObject] = Field(default_factory=list)
|
|
|
|
|
|
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 影响),管理页翻页用
|