新增角色管理、世界观设定、章节管理和AI工具调用功能

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

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-21 13:58:17 +08:00
parent 580dc8be52
commit 20c759150a
34 changed files with 3495 additions and 127 deletions

View File

@@ -60,6 +60,82 @@ class OutlineReorder(BaseModel):
ordered_ids: list[int]
# ── 角色 ──
class CharacterCreate(BaseModel):
name: str = Field(min_length=1, max_length=100)
description: str = Field(default="", max_length=1000)
class CharacterUpdate(BaseModel):
name: str | None = Field(default=None, min_length=1, max_length=100)
description: str | None = Field(default=None, max_length=1000)
class CharacterRead(BaseModel):
id: int
novel_id: int
name: str
description: str
created_at: datetime
updated_at: datetime
class CharacterList(BaseModel):
items: list[CharacterRead]
total: int
# ── 章节 ──
class ChapterCreate(BaseModel):
title: str = Field(min_length=1, max_length=200)
content: str = Field(default="", max_length=5000)
class ChapterUpdate(BaseModel):
title: str | None = Field(default=None, min_length=1, max_length=200)
content: str | None = Field(default=None, max_length=5000)
sort_order: int | None = None
class ChapterRead(BaseModel):
id: int
novel_id: int
sort_order: int
title: str
content: str
created_at: datetime
updated_at: datetime
class ChapterList(BaseModel):
items: list[ChapterRead]
total: int
class ChapterReorder(BaseModel):
"""排序请求按顺序传入章节id列表"""
ordered_ids: list[int]
# ── 世界观 ──
class WorldSettingUpdate(BaseModel):
content: str = Field(default="", max_length=5000)
class WorldSettingRead(BaseModel):
id: int
novel_id: int
content: str
created_at: datetime
updated_at: datetime
# ── AI配置 ──
@@ -87,9 +163,21 @@ class ChatMessageInput(BaseModel):
content: str
class PendingToolCall(BaseModel):
"""待审批的工具调用"""
id: str
name: str
arguments: dict
class ChatRequest(BaseModel):
messages: list[ChatMessageInput]
novel_id: int | None = None
page_context: str | None = None # 用户当前所在页面,如 "大纲页" "世界观页"
tools_enabled: bool = True # 是否启用工具调用
# 工具审批续传
pending_tool_calls: list[PendingToolCall] | None = None
assistant_text: str | None = None # LLM 在工具调用前输出的文本
class ChatMessageRead(BaseModel):