refactor: split api.py monolith into 19 route modules (Phase B)
Split 3,598-line api.py into thin orchestrator (128 lines) + 19 route modules in bot/routes/: core.py (7 routes), mood.py (10), language.py (3), evil_mode.py (6), bipolar_mode.py (9), gpu.py (2), bot_actions.py (4), autonomous.py (13), profile_picture.py (26), manual_send.py (3), servers.py (6), figurines.py (5), dms.py (18), image_generation.py (4), chat.py (1), config.py (7), logging_config.py (9), voice.py (3), memory.py (10) All 146 routes verified present via test_route_split.py (149 tests). 21/21 regression tests (test_config_state.py) pass. Monolith backup: bot/api_monolith_backup.py (revert: cp it to api.py).
This commit is contained in:
100
bot/routes/models.py
Normal file
100
bot/routes/models.py
Normal file
@@ -0,0 +1,100 @@
|
||||
"""Shared Pydantic request/response models used across route modules."""
|
||||
|
||||
from typing import List, Optional
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class MoodSetRequest(BaseModel):
|
||||
mood: str
|
||||
|
||||
|
||||
class ConversationResetRequest(BaseModel):
|
||||
user_id: str
|
||||
|
||||
|
||||
class CustomPromptRequest(BaseModel):
|
||||
prompt: str
|
||||
|
||||
|
||||
class ServerConfigRequest(BaseModel):
|
||||
guild_id: int
|
||||
guild_name: str
|
||||
autonomous_channel_id: int
|
||||
autonomous_channel_name: str
|
||||
bedtime_channel_ids: List[int] = None
|
||||
enabled_features: List[str] = None
|
||||
|
||||
|
||||
class EvilMoodSetRequest(BaseModel):
|
||||
mood: str
|
||||
|
||||
|
||||
class LogConfigUpdateRequest(BaseModel):
|
||||
component: Optional[str] = None
|
||||
enabled: Optional[bool] = None
|
||||
enabled_levels: Optional[List[str]] = None
|
||||
|
||||
|
||||
class LogFilterUpdateRequest(BaseModel):
|
||||
exclude_paths: Optional[List[str]] = None
|
||||
exclude_status: Optional[List[int]] = None
|
||||
include_slow_requests: Optional[bool] = True
|
||||
slow_threshold_ms: Optional[int] = 1000
|
||||
|
||||
|
||||
class BipolarTriggerRequest(BaseModel):
|
||||
channel_id: str # String to handle large Discord IDs from JS
|
||||
message_id: str = None # Optional: starting message ID (string)
|
||||
context: str = ""
|
||||
|
||||
|
||||
class ManualCropRequest(BaseModel):
|
||||
x: int
|
||||
y: int
|
||||
width: int
|
||||
height: int
|
||||
|
||||
|
||||
class DescriptionUpdateRequest(BaseModel):
|
||||
description: str
|
||||
|
||||
|
||||
class AlbumCropRequest(BaseModel):
|
||||
x: int
|
||||
y: int
|
||||
width: int
|
||||
height: int
|
||||
|
||||
|
||||
class AlbumDescriptionRequest(BaseModel):
|
||||
description: str
|
||||
|
||||
|
||||
class BulkDeleteRequest(BaseModel):
|
||||
entry_ids: List[str]
|
||||
|
||||
|
||||
class ChatMessage(BaseModel):
|
||||
message: str
|
||||
model_type: str = "text" # "text" or "vision"
|
||||
use_system_prompt: bool = True
|
||||
image_data: Optional[str] = None # Base64 encoded image for vision model
|
||||
conversation_history: Optional[List[dict]] = None # Previous messages in conversation
|
||||
mood: str = "neutral" # Miku's mood for this conversation
|
||||
|
||||
|
||||
class MemoryDeleteRequest(BaseModel):
|
||||
confirmation: str
|
||||
|
||||
|
||||
class MemoryEditRequest(BaseModel):
|
||||
content: str
|
||||
metadata: Optional[dict] = None
|
||||
|
||||
|
||||
class MemoryCreateRequest(BaseModel):
|
||||
content: str
|
||||
collection: str # 'declarative' or 'episodic'
|
||||
user_id: Optional[str] = None
|
||||
source: Optional[str] = None
|
||||
metadata: Optional[dict] = None
|
||||
Reference in New Issue
Block a user