新增前后端AI聊天模块,包括流式对话、配置管理和UI组件优化。

This commit is contained in:
2026-03-19 01:35:13 +08:00
commit ba6ceb94c8
66 changed files with 8631 additions and 0 deletions

105
backend/app/schemas.py Normal file
View File

@@ -0,0 +1,105 @@
from datetime import datetime
from pydantic import BaseModel, Field
class NovelCreate(BaseModel):
title: str = Field(min_length=1, max_length=200)
description: str = Field(default="", max_length=2000)
class NovelUpdate(BaseModel):
title: str | None = Field(default=None, min_length=1, max_length=200)
description: str | None = Field(default=None, max_length=2000)
class NovelRead(BaseModel):
id: int
title: str
description: str
created_at: datetime
updated_at: datetime
class NovelList(BaseModel):
items: list[NovelRead]
total: int
# ── 大纲 ──
class OutlineCreate(BaseModel):
summary: str = Field(min_length=1, max_length=200)
detail: str = Field(default="", max_length=1000)
class OutlineUpdate(BaseModel):
summary: str | None = Field(default=None, min_length=1, max_length=200)
detail: str | None = Field(default=None, max_length=1000)
sort_order: int | None = None
class OutlineRead(BaseModel):
id: int
novel_id: int
sort_order: int
summary: str
detail: str
created_at: datetime
updated_at: datetime
class OutlineList(BaseModel):
items: list[OutlineRead]
total: int
class OutlineReorder(BaseModel):
"""排序请求按顺序传入大纲id列表"""
ordered_ids: list[int]
# ── AI配置 ──
class AIConfigSave(BaseModel):
provider: str = Field(default="openai")
base_url: str = Field(default="https://api.openai.com/v1")
api_key: str = Field(min_length=1)
model: str = Field(default="gpt-4o")
class AIConfigRead(BaseModel):
id: int
provider: str
base_url: str
api_key_masked: str # 脱敏后的key
model: str
updated_at: datetime
# ── 聊天 ──
class ChatMessageInput(BaseModel):
role: str
content: str
class ChatRequest(BaseModel):
messages: list[ChatMessageInput]
novel_id: int | None = None
class ChatMessageRead(BaseModel):
id: int
novel_id: int | None
role: str
content: str
created_at: datetime
class ChatMessageList(BaseModel):
items: list[ChatMessageRead]
total: int