from typing import Literal, Optional from pydantic import BaseModel from sqlalchemy import Column, ForeignKey from sqlmodel import Field, Relationship, SQLModel from ..config import config_manager class Chatroom(SQLModel, table=True): """ 聊天室 表结构。 聊天室是供剧本演出的场所。在聊天室中,由用户选定剧本模板、决定剧本走向,AI 按照剧本进行演出。 我们规定 script 是故事脚本设定,content 是故事正片,script template 是脚本模板。 规定 creator_id 为 0 的聊天室为公共聊天室,其权限由配置文件决定。 """ id: int | None = Field(default=None, primary_key=True) name: str description: str feature_image: str = Field( default=f"{config_manager.get('site_url', 'http://localhost:9000')}/nyahome/normal-thumbnail.png" ) content: str script: str script_template_id: int | None = Field( default=None, sa_column=Column(ForeignKey("scripttemplate.id", name="fk_chatroom_script_template")) ) script_template_version: str | None script_template: "ScriptTemplate" = Relationship() creator_id: int = Field(sa_column=Column(ForeignKey("modeluser.id", name="fk_chatroom_creator"))) creator: Optional["ModelUser"] = Relationship(back_populates="chatrooms") class ChatroomPublic(BaseModel): id: int | None = None name: str description: str feature_image: str script_template_id: int | None = None script_template_version: str | None class ScriptTemplate(SQLModel, table=True): """ 剧本模板 表结构。 聊天室通过加载剧本模板来开始演绎一个剧本。 【开发中】 """ id: int | None = Field(default=None, primary_key=True) name: str description: str version: str origin_url: str script: str class ScriptWordBook(BaseModel): key_word: str message: str class ChatScript(BaseModel): """ 剧本(提示词与世界书)。 """ main_prompt: str user_prefix: str user_suffix: str world_books: list[ScriptWordBook] class ChatroomChat(BaseModel): """ 聊天室的 chat 端点接收的数据结构,作为用户输入。 """ message: str prefix: str mode: Literal["continue", "expand"] model_id: int class ChatroomChatAccept(BaseModel): user_message: str aii_message: str mode: Literal["continue", "expand"] class ChatroomChatEdit(BaseModel): old_message: str new_message: str change: Literal["user", "aii"] class ChatroomChatDelete(BaseModel): message: str change: Literal["user", "aii"] from .model_user import ModelUser # noqa: E402