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).
2026-04-15 11:38:14 +03:00
|
|
|
"""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 = ""
|
2026-04-30 12:07:28 +03:00
|
|
|
topic: str = "" # Optional: custom argument topic (overrides random topic selection)
|
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).
2026-04-15 11:38:14 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|