File size: 3,511 Bytes
8bf4d58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"""API routes."""

import logging
from typing import Optional
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from src.core.orchestrator import get_orchestrator
from src.memory.long_term_memory import LongTermMemory

logger = logging.getLogger(__name__)

router = APIRouter()


# Request/Response models
class QueryRequest(BaseModel):
    """Query request model."""
    query: str
    tier: str = "basic"  # "basic", "agent", or "advanced"
    session_id: Optional[str] = None


class QueryResponse(BaseModel):
    """Query response model."""
    success: bool
    answer: Optional[str] = None
    tier: str
    error: Optional[str] = None
    sources: Optional[list] = None
    model: Optional[str] = None
    agent: Optional[str] = None


class HealthResponse(BaseModel):
    """Health check response."""
    status: str
    version: str


@router.get("/health", response_model=HealthResponse)
async def health_check():
    """Health check endpoint."""
    return {
        "status": "healthy",
        "version": "1.0.0",
    }


@router.post("/query", response_model=QueryResponse)
async def query(request: QueryRequest):
    """
    Main query endpoint supporting all tiers.

    - **basic**: Simple RAG (retrieval + generation)
    - **agent**: Agent with tools (calculator, web search, database)
    - **advanced**: Multi-agent system with MCP servers
    """
    try:
        orchestrator = get_orchestrator()
        response = await orchestrator.process_query(
            query=request.query,
            tier=request.tier,
            session_id=request.session_id,
        )

        return QueryResponse(**response)

    except Exception as e:
        logger.error(f"Error processing query: {e}")
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/agents")
async def get_agents():
    """Get status of all agents."""
    try:
        orchestrator = get_orchestrator()
        status = orchestrator.get_agent_status()
        return status
    except Exception as e:
        logger.error(f"Error getting agent status: {e}")
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/system")
async def get_system_info():
    """Get system information."""
    try:
        orchestrator = get_orchestrator()
        info = orchestrator.get_system_info()
        return info
    except Exception as e:
        logger.error(f"Error getting system info: {e}")
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/memory/{session_id}")
async def get_memory(session_id: str):
    """Get memory for a session."""
    try:
        long_term_memory = LongTermMemory()
        memories = long_term_memory.get_session_memories(session_id, limit=50)
        return {
            "session_id": session_id,
            "memories": memories,
            "count": len(memories),
        }
    except Exception as e:
        logger.error(f"Error getting memory: {e}")
        raise HTTPException(status_code=500, detail=str(e))


@router.delete("/memory/{session_id}")
async def delete_memory(session_id: str):
    """Delete memory for a session."""
    try:
        long_term_memory = LongTermMemory()
        deleted_count = long_term_memory.delete_session_memories(session_id)
        return {
            "session_id": session_id,
            "deleted": deleted_count,
        }
    except Exception as e:
        logger.error(f"Error deleting memory: {e}")
        raise HTTPException(status_code=500, detail=str(e))