Files
writer-ide/backend/models/ai.py
T
admin 46af290db3
Build and Push Docker Images / build-and-push (push) Failing after 3m33s
initial commit
2026-11-07 16:39:43 +03:00

96 lines
2.6 KiB
Python

from typing import Any, Dict, List, Literal, Optional
from pydantic import BaseModel
from models.bible import StoryBible
class GenerateRequest(BaseModel):
prompt: str
provider: Literal["ollama", "openrouter"] = "ollama"
model: Optional[str] = None
api_key: Optional[str] = None # Опционально, обычно берется из .env
preset: Literal["creative_draft", "editor", "brainstorm"] = "creative_draft"
options: Optional[Dict[str, Any]] = None
story_bible: Optional[StoryBible] = None # Story Bible для контекста
selected_text: Optional[str] = None # Текст, который будет обрабатываться
class GenerateResponse(BaseModel):
generated_text: str
provider: str
model: str
preset: str
class ExtractedEntities(BaseModel):
new_characters: List[Dict[str, Any]] = []
new_locations: List[Dict[str, Any]] = []
new_events: List[Dict[str, Any]] = []
updated_traits: List[Dict[str, Any]] = []
class ExtractEntitiesRequest(BaseModel):
text: str
existing_bible: Optional[StoryBible] = None
task_type: str = "background"
class ExtractEntitiesResponse(BaseModel):
entities: ExtractedEntities
model_used: str
provider: str
class AutoUpdateBibleRequest(BaseModel):
project_id: str
scene_text: str
auto_update_enabled: bool = True
class AutoUpdateBibleResponse(BaseModel):
updated: bool
new_characters: int = 0
new_locations: int = 0
new_events: int = 0
message: str = ""
class CleanupDuplicatesResponse(BaseModel):
removed_characters: int = 0
removed_locations: int = 0
removed_events: int = 0
message: str = ""
class PreviewContextRequest(BaseModel):
text: str
story_bible: StoryBible
class PreviewContextResponse(BaseModel):
context_string: str
mentioned_characters: List[str]
mentioned_locations: List[str]
mentioned_events: List[str]
class GenerateImageRequest(BaseModel):
prompt: str
project_id: str
document_id: str # ID документа (книги или главы)
document_type: str # 'book' или 'chapter'
model: Optional[str] = None
size: str = "1024x1024"
class GenerateImageResponse(BaseModel):
image_id: str
filename: str
path: str
prompt: str
model: str
data_url: str # base64 изображение для немедленного отображения
document_id: str # ID документа, к которому привязано изображение
document_type: str # 'book' или 'chapter'