|
from fastapi import APIRouter, HTTPException, BackgroundTasks |
|
from typing import List, Optional |
|
from datetime import datetime |
|
from src.llm.models.schemas import ConversationResponse, SessionData |
|
from src.llm.utils.logging import TheryBotLogger |
|
from src.llm.memory.history import RedisHistory |
|
from src.llm.memory.memory_manager import RedisMemoryManager |
|
from src.llm.memory.session_manager import SessionManager |
|
from src.llm.agents.conversation_agent import ConversationAgent |
|
|
|
router = APIRouter( |
|
prefix="/api/v1", |
|
tags=["TheryAI Core Services"], |
|
responses={500: {"description": "Internal Server Error"}} |
|
) |
|
|
|
|
|
session_manager = SessionManager() |
|
memory_manager = RedisMemoryManager() |
|
history = RedisHistory() |
|
logger = TheryBotLogger() |
|
conversation_agent = ConversationAgent() |
|
|
|
@router.post("/users", response_model=dict) |
|
async def create_user(): |
|
"""Create a new user ID""" |
|
try: |
|
user_id, _ = session_manager.generate_ids() |
|
return {"user_id": user_id} |
|
except Exception as e: |
|
logger.error(f"User creation failed: {str(e)}") |
|
raise HTTPException(500, "User creation failed") |
|
|
|
@router.post("/sessions", response_model=SessionData) |
|
async def create_session(user_id: str): |
|
"""Create a new session ID for a user""" |
|
try: |
|
_, session_id = session_manager.generate_ids(existing_user_id=user_id) |
|
return SessionData( |
|
user_id=user_id, |
|
session_id=session_id, |
|
is_new_user=False, |
|
is_new_session=True |
|
) |
|
except Exception as e: |
|
logger.error(f"Session creation failed: {str(e)}") |
|
raise HTTPException(500, "Session creation failed") |
|
|
|
@router.get("/sessions/{session_id}/messages", response_model=List[ConversationResponse]) |
|
async def get_messages(session_id: str, limit: int = 50): |
|
"""Get message history for a session""" |
|
try: |
|
if not session_manager.validate_session(session_id): |
|
raise HTTPException(404, "Session not found") |
|
|
|
messages = history.get_conversation_history(session_id, limit=limit) |
|
return [msg["response"] for msg in messages] |
|
except Exception as e: |
|
logger.error(f"Message retrieval failed: {str(e)}") |
|
raise HTTPException(500, "Message retrieval failed") |
|
|
|
@router.post("/sessions/{session_id}/messages", response_model=ConversationResponse) |
|
async def create_message( |
|
session_id: str, |
|
message: str, |
|
background_tasks: BackgroundTasks |
|
): |
|
"""Process and store a new message""" |
|
try: |
|
user_id = session_manager.validate_session(session_id) |
|
if not user_id: |
|
raise HTTPException(404, "Invalid session") |
|
|
|
response = await conversation_agent.process_async( |
|
query=message, |
|
session_data=SessionData( |
|
user_id=user_id, |
|
session_id=session_id, |
|
is_new_user=False, |
|
is_new_session=False |
|
) |
|
) |
|
|
|
background_tasks.add_task( |
|
memory_manager.store_conversation, |
|
session_id, |
|
datetime.now().isoformat(), |
|
response |
|
) |
|
|
|
return response |
|
except Exception as e: |
|
logger.error(f"Message processing failed: {str(e)}") |
|
raise HTTPException(500, "Message processing failed") |