lily_fast_api / lily_llm_api /api /routers /context_router.py
gbrabbit's picture
Auto commit at 23-2025-08 10:05:36
84635f1
"""
Context management router for Lily LLM API
"""
from fastapi import APIRouter, HTTPException, Form
from typing import Optional
import logging
from ...models.schemas import (
ContextStatusResponse, ContextHistoryResponse,
AutoCleanupConfigResponse, AutoCleanupConfigRequest
)
logger = logging.getLogger(__name__)
router = APIRouter()
@router.get("/context/status", response_model=ContextStatusResponse)
async def get_context_status():
"""์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž ์ƒํƒœ ํ™•์ธ"""
try:
try:
from lily_llm_core.context_manager import context_manager
if not context_manager:
return ContextStatusResponse(
status="error",
context_manager_available=False,
total_sessions=0,
sessions={},
max_tokens=0,
max_turns=0,
strategy="unknown",
message="Context manager not available"
)
# ์„ธ์…˜๋ณ„ ์ •๋ณด ์ˆ˜์ง‘
session_info = {}
for session_id, conversation in context_manager.session_conversations.items():
session_info[session_id] = {
"turns": len(conversation),
"user_messages": len([t for t in conversation if t.role == "user"]),
"assistant_messages": len([t for t in conversation if t.role == "assistant"])
}
return ContextStatusResponse(
status="success",
context_manager_available=True,
total_sessions=len(context_manager.session_conversations),
sessions=session_info,
max_tokens=getattr(context_manager, 'max_tokens', 0),
max_turns=getattr(context_manager, 'max_turns', 0),
strategy=getattr(context_manager, 'strategy', 'unknown')
)
except ImportError:
return ContextStatusResponse(
status="error",
context_manager_available=False,
total_sessions=0,
sessions={},
max_tokens=0,
max_turns=0,
strategy="unknown",
message="Context manager import failed"
)
except Exception as e:
logger.error(f"์ปจํ…์ŠคํŠธ ์ƒํƒœ ํ™•์ธ ์‹คํŒจ: {e}")
return ContextStatusResponse(
status="error",
context_manager_available=False,
total_sessions=0,
sessions={},
max_tokens=0,
max_turns=0,
strategy="unknown",
message=str(e)
)
@router.get("/context/history", response_model=ContextHistoryResponse)
async def get_context_history(session_id: str = None):
"""์ปจํ…์ŠคํŠธ ํžˆ์Šคํ† ๋ฆฌ ์กฐํšŒ"""
try:
try:
from lily_llm_core.context_manager import context_manager
if not context_manager:
return ContextHistoryResponse(
status="error",
context="",
history_length=0,
message="Context manager not available"
)
if session_id:
# ํŠน์ • ์„ธ์…˜์˜ ์ปจํ…์ŠคํŠธ๋งŒ ์กฐํšŒ
context = context_manager.get_context(include_system=True, max_length=4000, session_id=session_id)
session_summary = context_manager.get_context_summary(session_id)
return ContextHistoryResponse(
status="success",
session_id=session_id,
context=context,
history_length=session_summary.get("total_turns", 0),
session_summary=session_summary
)
else:
# ์ „์ฒด ์ปจํ…์ŠคํŠธ ์กฐํšŒ
context = context_manager.get_context(include_system=True, max_length=4000)
return ContextHistoryResponse(
status="success",
context=context,
history_length=len(context_manager.conversation_history),
all_sessions=True
)
except ImportError:
return ContextHistoryResponse(
status="error",
context="",
history_length=0,
message="Context manager import failed"
)
except Exception as e:
logger.error(f"์ปจํ…์ŠคํŠธ ํžˆ์Šคํ† ๋ฆฌ ์กฐํšŒ ์‹คํŒจ: {e}")
return ContextHistoryResponse(
status="error",
context="",
history_length=0,
message=str(e)
)
@router.get("/context/auto-cleanup", response_model=AutoCleanupConfigResponse)
async def get_auto_cleanup_config():
"""์ž๋™ ์ •๋ฆฌ ์„ค์ • ์กฐํšŒ"""
try:
try:
from lily_llm_core.context_manager import context_manager
if not context_manager:
return AutoCleanupConfigResponse(
status="error",
auto_cleanup_config={},
message="Context manager not available"
)
config = context_manager.get_auto_cleanup_config()
return AutoCleanupConfigResponse(
status="success",
auto_cleanup_config=config
)
except ImportError:
return AutoCleanupConfigResponse(
status="error",
auto_cleanup_config={},
message="Context manager import failed"
)
except Exception as e:
logger.error(f"์ž๋™ ์ •๋ฆฌ ์„ค์ • ์กฐํšŒ ์‹คํŒจ: {e}")
return AutoCleanupConfigResponse(
status="error",
auto_cleanup_config={},
message=str(e)
)
@router.post("/context/auto-cleanup")
async def set_auto_cleanup_config(
enabled: bool = Form(True),
interval_turns: int = Form(8),
interval_time: int = Form(300),
strategy: str = Form("smart")
):
"""์ž๋™ ์ •๋ฆฌ ์„ค์ • ๋ณ€๊ฒฝ"""
try:
try:
from lily_llm_core.context_manager import context_manager
if not context_manager:
raise HTTPException(status_code=500, detail="Context manager not available")
success = context_manager.set_auto_cleanup_config(
enabled=enabled,
interval_turns=interval_turns,
interval_time=interval_time,
strategy=strategy
)
if success:
return {"status": "success", "message": "์ž๋™ ์ •๋ฆฌ ์„ค์ • ๋ณ€๊ฒฝ ์™„๋ฃŒ"}
else:
raise HTTPException(status_code=500, detail="์ž๋™ ์ •๋ฆฌ ์„ค์ • ๋ณ€๊ฒฝ ์‹คํŒจ")
except ImportError:
raise HTTPException(status_code=500, detail="Context manager import failed")
except Exception as e:
logger.error(f"์ž๋™ ์ •๋ฆฌ ์„ค์ • ๋ณ€๊ฒฝ ์‹คํŒจ: {e}")
raise HTTPException(status_code=500, detail=f"์ž๋™ ์ •๋ฆฌ ์„ค์ • ๋ณ€๊ฒฝ ์‹คํŒจ: {str(e)}")
@router.post("/context/cleanup")
async def cleanup_context(session_id: str = Form(None)):
"""์ปจํ…์ŠคํŠธ ์ •๋ฆฌ"""
try:
try:
from lily_llm_core.context_manager import context_manager
if not context_manager:
raise HTTPException(status_code=500, detail="Context manager not available")
if session_id:
# ํŠน์ • ์„ธ์…˜ ์ •๋ฆฌ
success = context_manager.cleanup_session(session_id)
if success:
return {"status": "success", "message": f"์„ธ์…˜ {session_id} ์ •๋ฆฌ ์™„๋ฃŒ"}
else:
raise HTTPException(status_code=500, detail=f"์„ธ์…˜ {session_id} ์ •๋ฆฌ ์‹คํŒจ")
else:
# ์ „์ฒด ์ปจํ…์ŠคํŠธ ์ •๋ฆฌ
success = context_manager.cleanup_context()
if success:
return {"status": "success", "message": "์ „์ฒด ์ปจํ…์ŠคํŠธ ์ •๋ฆฌ ์™„๋ฃŒ"}
else:
raise HTTPException(status_code=500, detail="์ „์ฒด ์ปจํ…์ŠคํŠธ ์ •๋ฆฌ ์‹คํŒจ")
except ImportError:
raise HTTPException(status_code=500, detail="Context manager import failed")
except Exception as e:
logger.error(f"์ปจํ…์ŠคํŠธ ์ •๋ฆฌ ์‹คํŒจ: {e}")
raise HTTPException(status_code=500, detail=f"์ปจํ…์ŠคํŠธ ์ •๋ฆฌ ์‹คํŒจ: {str(e)}")
@router.post("/context/summary")
async def generate_context_summary(session_id: str = Form(...)):
"""์ปจํ…์ŠคํŠธ ์š”์•ฝ ์ƒ์„ฑ"""
try:
try:
from lily_llm_core.context_manager import context_manager
if not context_manager:
raise HTTPException(status_code=500, detail="Context manager not available")
summary = context_manager.generate_summary(session_id)
if summary:
return {"status": "success", "summary": summary}
else:
raise HTTPException(status_code=500, detail="์ปจํ…์ŠคํŠธ ์š”์•ฝ ์ƒ์„ฑ ์‹คํŒจ")
except ImportError:
raise HTTPException(status_code=500, detail="Context manager import failed")
except Exception as e:
logger.error(f"์ปจํ…์ŠคํŠธ ์š”์•ฝ ์ƒ์„ฑ ์‹คํŒจ: {e}")
raise HTTPException(status_code=500, detail=f"์ปจํ…์ŠคํŠธ ์š”์•ฝ ์ƒ์„ฑ ์‹คํŒจ: {str(e)}")
@router.delete("/context/session/{session_id}")
async def delete_session(session_id: str):
"""ํŠน์ • ์„ธ์…˜ ์‚ญ์ œ"""
try:
try:
from lily_llm_core.context_manager import context_manager
if not context_manager:
raise HTTPException(status_code=500, detail="Context manager not available")
success = context_manager.delete_session(session_id)
if success:
return {"status": "success", "message": f"์„ธ์…˜ {session_id} ์‚ญ์ œ ์™„๋ฃŒ"}
else:
raise HTTPException(status_code=500, detail=f"์„ธ์…˜ {session_id} ์‚ญ์ œ ์‹คํŒจ")
except ImportError:
raise HTTPException(status_code=500, detail="Context manager import failed")
except Exception as e:
logger.error(f"์„ธ์…˜ ์‚ญ์ œ ์‹คํŒจ: {e}")
raise HTTPException(status_code=500, detail=f"์„ธ์…˜ ์‚ญ์ œ ์‹คํŒจ: {str(e)}")
@router.get("/context/sessions")
async def list_sessions():
"""์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„ธ์…˜ ๋ชฉ๋ก"""
try:
try:
from lily_llm_core.context_manager import context_manager
if not context_manager:
raise HTTPException(status_code=500, detail="Context manager not available")
sessions = list(context_manager.session_conversations.keys())
return {"status": "success", "sessions": sessions}
except ImportError:
raise HTTPException(status_code=500, detail="Context manager import failed")
except Exception as e:
logger.error(f"์„ธ์…˜ ๋ชฉ๋ก ์กฐํšŒ ์‹คํŒจ: {e}")
raise HTTPException(status_code=500, detail=f"์„ธ์…˜ ๋ชฉ๋ก ์กฐํšŒ ์‹คํŒจ: {str(e)}")