Source code for api_gateway.routers.conversations
"""Conversation history proxy endpoints — list / messages / delete."""
import logging
import httpx
from api_gateway.deps import extract_user_id, get_runtime_config
from fastapi import APIRouter, HTTPException, Request
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/v1", tags=["conversations"])
[docs]
@router.get("/conversations")
async def list_conversations(request: Request):
"""List conversations for the authenticated user."""
rag_service_url, timeout = get_runtime_config(request)
user_id = extract_user_id(request)
try:
async with httpx.AsyncClient(timeout=timeout) as client:
params = {"user_id": user_id} if user_id else {}
resp = await client.get(
f"{rag_service_url}/conversations",
params=params,
)
if resp.status_code != 200:
logger.error("RAG service conversations error (status=%d): %s", resp.status_code, resp.text)
status = resp.status_code if resp.status_code < 500 else 502
raise HTTPException(status_code=status, detail="Unable to retrieve conversations")
return resp.json()
except httpx.RequestError as e:
logger.error("RAG service conversations connection failed: %s", e)
raise HTTPException(status_code=503, detail="Service temporarily unavailable")
[docs]
@router.get("/conversations/{conversation_id}/messages")
async def get_conversation_messages(conversation_id: str, request: Request):
"""Get messages for a conversation."""
rag_service_url, timeout = get_runtime_config(request)
user_id = extract_user_id(request)
try:
async with httpx.AsyncClient(timeout=timeout) as client:
params = {"user_id": user_id} if user_id else {}
resp = await client.get(
f"{rag_service_url}/conversations/{conversation_id}/messages",
params=params,
)
if resp.status_code != 200:
logger.error("RAG service conversation messages error (status=%d): %s", resp.status_code, resp.text)
status = resp.status_code if resp.status_code < 500 else 502
raise HTTPException(status_code=status, detail="Unable to retrieve conversation messages")
return resp.json()
except httpx.RequestError as e:
logger.error("RAG service conversation messages connection failed: %s", e)
raise HTTPException(status_code=503, detail="Service temporarily unavailable")
[docs]
@router.delete("/conversations/{conversation_id}")
async def delete_conversation(conversation_id: str, request: Request):
"""Delete a conversation."""
rag_service_url, timeout = get_runtime_config(request)
user_id = extract_user_id(request)
try:
async with httpx.AsyncClient(timeout=timeout) as client:
params = {"user_id": user_id} if user_id else {}
resp = await client.delete(
f"{rag_service_url}/conversations/{conversation_id}",
params=params,
)
if resp.status_code != 200:
logger.error("RAG service delete conversation error (status=%d): %s", resp.status_code, resp.text)
status = resp.status_code if resp.status_code < 500 else 502
raise HTTPException(status_code=status, detail="Unable to delete conversation")
return resp.json()
except httpx.RequestError as e:
logger.error("RAG service delete conversation connection failed: %s", e)
raise HTTPException(status_code=503, detail="Service temporarily unavailable")