Files
NovalRedot/backend/app/models.py
ROOG 20c759150a 新增角色管理、世界观设定、章节管理和AI工具调用功能
- 角色管理:CRUD API + 卡片网格UI,每个角色约200字描述
- 世界观设定:单篇长文编辑器,建议500字以上
- 章节管理:CRUD + 排序 API,左右分栏编辑器,单章5000字上限
- AI工具调用:支持工具审批流程和结构化工具调用
- 小说详情页新增章节、角色、世界观入口按钮

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 13:58:17 +08:00

84 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from datetime import datetime, timezone
from typing import Optional
from sqlmodel import SQLModel, Field
def _now_utc() -> datetime:
return datetime.now(timezone.utc)
class Novel(SQLModel, table=True):
"""小说主表"""
id: Optional[int] = Field(default=None, primary_key=True)
title: str = Field(max_length=200, index=True)
description: str = Field(default="", max_length=2000)
created_at: datetime = Field(default_factory=_now_utc)
updated_at: datetime = Field(default_factory=_now_utc)
class AIConfig(SQLModel, table=True):
"""AI服务配置单行表"""
id: Optional[int] = Field(default=None, primary_key=True)
provider: str = Field(default="openai") # "openai" | "anthropic"
base_url: str = Field(default="https://api.openai.com/v1")
api_key: str = Field(default="")
model: str = Field(default="gpt-4o")
updated_at: datetime = Field(default_factory=_now_utc)
class ChatMessage(SQLModel, table=True):
"""聊天消息"""
id: Optional[int] = Field(default=None, primary_key=True)
novel_id: Optional[int] = Field(default=None, foreign_key="novel.id", index=True)
role: str = Field(max_length=20) # "user" | "assistant"
content: str = Field(default="")
created_at: datetime = Field(default_factory=_now_utc)
class Outline(SQLModel, table=True):
"""大纲表,属于小说的子资源"""
id: Optional[int] = Field(default=None, primary_key=True)
novel_id: int = Field(foreign_key="novel.id", index=True)
sort_order: int = Field(default=0)
summary: str = Field(max_length=200)
detail: str = Field(default="", max_length=1000)
created_at: datetime = Field(default_factory=_now_utc)
updated_at: datetime = Field(default_factory=_now_utc)
class Character(SQLModel, table=True):
"""角色表,属于小说的子资源"""
id: Optional[int] = Field(default=None, primary_key=True)
novel_id: int = Field(foreign_key="novel.id", index=True)
name: str = Field(max_length=100)
description: str = Field(default="", max_length=1000)
created_at: datetime = Field(default_factory=_now_utc)
updated_at: datetime = Field(default_factory=_now_utc)
class Chapter(SQLModel, table=True):
"""章节表,属于小说的子资源"""
id: Optional[int] = Field(default=None, primary_key=True)
novel_id: int = Field(foreign_key="novel.id", index=True)
sort_order: int = Field(default=0)
title: str = Field(max_length=200)
content: str = Field(default="", max_length=5000)
created_at: datetime = Field(default_factory=_now_utc)
updated_at: datetime = Field(default_factory=_now_utc)
class WorldSetting(SQLModel, table=True):
"""世界观设定,每部小说一条记录"""
id: Optional[int] = Field(default=None, primary_key=True)
novel_id: int = Field(foreign_key="novel.id", index=True, unique=True)
content: str = Field(default="", max_length=5000)
created_at: datetime = Field(default_factory=_now_utc)
updated_at: datetime = Field(default_factory=_now_utc)