LightRAG/service/app/api/routes.py

72 lines
3.1 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from typing import List
from uuid import UUID
from app.api.dependencies import get_db
from app.services.history_manager import HistoryManager
from app.services.chat_service import ChatService
from app.models.schemas import (
SessionCreate, SessionResponse, ChatMessageRequest, ChatMessageResponse
)
router = APIRouter()
@router.post("/sessions", response_model=SessionResponse, status_code=status.HTTP_201_CREATED)
def create_session(session_in: SessionCreate, db: Session = Depends(get_db)):
# For now, we assume a default user or handle auth separately.
# Using a hardcoded user ID for demonstration if no auth middleware.
# In production, get user_id from current_user.
import uuid
# Placeholder user ID. In real app, ensure user exists.
# We might need to create a default user if not exists or require auth.
# For this task, we'll create a dummy user if needed or just use a random UUID
# but that might fail FK constraint if user doesn't exist.
# Let's assume we need to create a user first or use an existing one.
# For simplicity, we'll generate a UUID but this will fail FK.
# So we should probably have a "get_or_create_default_user" helper.
# Quick fix: Create a default user if table is empty or just use a fixed ID
# and ensure it exists in startup event.
# For now, let's just use a fixed UUID and assume the user exists or we create it.
# Actually, let's just create a user on the fly for this session if we don't have auth.
manager = HistoryManager(db)
# Check if we have any user, if not create one.
from app.models.models import User
user = db.query(User).first()
if not user:
user = User(username="default_user", email="default@example.com")
db.add(user)
db.commit()
db.refresh(user)
session = manager.create_session(
user_id=user.id,
title=session_in.title,
rag_config=session_in.rag_config
)
return session
@router.get("/sessions", response_model=List[SessionResponse])
def list_sessions(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
manager = HistoryManager(db)
# Again, need user_id. Using the default user strategy.
from app.models.models import User
user = db.query(User).first()
if not user:
return []
sessions = manager.list_sessions(user_id=user.id, skip=skip, limit=limit)
return sessions
@router.get("/sessions/{session_id}/history")
def get_session_history(session_id: UUID, db: Session = Depends(get_db)):
manager = HistoryManager(db)
# This returns context format, might need a different schema for full history display
# For now reusing get_conversation_context logic but maybe we want full objects.
# Let's just return the raw messages for now or map to a schema.
# The requirement said "Get full history".
from app.models.models import ChatMessage
messages = db.query(ChatMessage).filter(ChatMessage.session_id == session_id).order_by(ChatMessage.created_at.asc()).all()
return messages