新增前后端AI聊天模块,包括流式对话、配置管理和UI组件优化。
This commit is contained in:
105
backend/app/schemas.py
Normal file
105
backend/app/schemas.py
Normal 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
|
||||
Reference in New Issue
Block a user