Files
miku-discord/bot/routes/language.py
koko210Serve edc9f27925 feat: add proper HTTP status codes to all API error responses
- 217 error returns across 18 route files + api.py now use JSONResponse
  with appropriate HTTP status codes instead of returning HTTP 200
- Status code distribution: 500 (121), 400 (39), 503 (28), 404 (24), 409 (3), 502 (2)
- Fixed language.py tuple-return bug (was serializing as JSON array)
- Fixed bare except clauses in bipolar_mode.py and voice.py
- Body-level error schemas preserved (status/error + success/error patterns)
  so web UI continues working without changes
- chat.py (SSE) unchanged: errors sent within stream protocol
- All 170 tests pass
2026-04-15 15:43:18 +03:00

76 lines
2.5 KiB
Python

"""Language mode routes."""
from fastapi import APIRouter
from fastapi.responses import JSONResponse
import globals
from utils.logger import get_logger
logger = get_logger('api')
router = APIRouter()
@router.get("/language")
def get_language_mode():
"""Get current language mode (english or japanese)"""
return {
"language_mode": globals.LANGUAGE_MODE,
"available_languages": ["english", "japanese"],
"current_model": globals.JAPANESE_TEXT_MODEL if globals.LANGUAGE_MODE == "japanese" else globals.TEXT_MODEL
}
@router.post("/language/toggle")
def toggle_language_mode():
"""Toggle between English and Japanese modes"""
if globals.LANGUAGE_MODE == "english":
globals.LANGUAGE_MODE = "japanese"
new_mode = "japanese"
model_used = globals.JAPANESE_TEXT_MODEL
logger.info("Switched to Japanese mode (using Llama 3.1 Swallow)")
else:
globals.LANGUAGE_MODE = "english"
new_mode = "english"
model_used = globals.TEXT_MODEL
logger.info("Switched to English mode (using default model)")
# Persist via config manager
try:
from config_manager import config_manager
config_manager.set("discord.language_mode", new_mode, persist=True)
logger.info(f"💾 Language mode persisted to config_runtime.yaml")
except Exception as e:
logger.warning(f"Failed to persist language mode: {e}")
return {
"status": "ok",
"language_mode": new_mode,
"model_now_using": model_used,
"message": f"Miku is now speaking in {new_mode.upper()}!"
}
@router.post("/language/set")
def set_language_mode(language: str = "english"):
"""Set language mode to either 'english' or 'japanese'"""
if language.lower() not in ["english", "japanese"]:
return JSONResponse(status_code=400, content={"status": "error", "message": f"Invalid language mode '{language}'. Use 'english' or 'japanese'."})
globals.LANGUAGE_MODE = language.lower()
model_used = globals.JAPANESE_TEXT_MODEL if language.lower() == "japanese" else globals.TEXT_MODEL
logger.info(f"Language mode set to {language.lower()} (using {model_used})")
# Persist so it survives restarts
try:
from config_manager import config_manager
config_manager.set("discord.language_mode", language.lower(), persist=True)
except Exception:
pass
return {
"status": "ok",
"language_mode": language.lower(),
"model_now_using": model_used,
"message": f"Miku is now speaking in {language.upper()}!"
}