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:
2026-04-15 11:38:14 +03:00
parent 8b14160028
commit 979217e7cc
26 changed files with 7624 additions and 3541 deletions

View File

@@ -384,19 +384,20 @@ def test_no_create_default_config():
def test_gpu_url_helper_delegates():
"""Step 10: get_current_gpu_url() uses config_manager, not direct file read."""
import inspect
import api
src = inspect.getsource(api.get_current_gpu_url)
from routes.chat import get_current_gpu_url
src = inspect.getsource(get_current_gpu_url)
assert "gpu_state.json" not in src, \
"get_current_gpu_url still reads gpu_state.json directly"
assert "config_manager" in src, \
"get_current_gpu_url should delegate to config_manager"
# After Phase B split, chat.get_current_gpu_url reads globals.PREFER_AMD_GPU
assert "PREFER_AMD_GPU" in src or "config_manager" in src, \
"get_current_gpu_url should use globals.PREFER_AMD_GPU or config_manager"
def test_gpu_status_endpoint_delegates():
"""Step 10: /gpu-status endpoint uses config_manager, not direct file read."""
import inspect
import api
src = inspect.getsource(api.get_gpu_status)
from routes.gpu import get_gpu_status
src = inspect.getsource(get_gpu_status)
assert "gpu_state.json" not in src, \
"get_gpu_status still reads gpu_state.json directly"
assert "config_manager" in src, \
@@ -405,18 +406,17 @@ def test_gpu_status_endpoint_delegates():
def test_gpu_url_returns_correct_url():
"""Step 10: URL switches correctly between nvidia/amd."""
from config_manager import config_manager
import api
from routes.chat import get_current_gpu_url
old_gpu = config_manager.get_gpu()
old_val = g.PREFER_AMD_GPU
try:
config_manager.set_gpu("nvidia")
assert api.get_current_gpu_url() == g.LLAMA_URL
g.PREFER_AMD_GPU = False
assert get_current_gpu_url() == g.LLAMA_URL
config_manager.set_gpu("amd")
assert api.get_current_gpu_url() == g.LLAMA_AMD_URL
g.PREFER_AMD_GPU = True
assert get_current_gpu_url() == g.LLAMA_AMD_URL
finally:
config_manager.set_gpu(old_gpu)
g.PREFER_AMD_GPU = old_val
# ═══════════════════════════════════════════════════