ai-robot-core/ai-service/app/api/mid/messages.py

105 lines
3.1 KiB
Python

"""
Messages Controller for Mid Platform.
[AC-IDMP-08] Message report endpoint: POST /mid/messages/report
"""
import logging
import time
from typing import Annotated, Any
from fastapi import APIRouter, Depends, Request
from fastapi.responses import JSONResponse
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.database import get_session
from app.core.tenant import get_tenant_id
from app.models.mid.schemas import MessageReportRequest
from app.services.memory import MemoryService
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/mid", tags=["Mid Platform Messages"])
@router.post(
"/messages/report",
operation_id="reportMessages",
summary="Report session messages and events",
description="""
[AC-IDMP-08] Report messages from channel to mid platform.
Accepts messages from bot, human, or channel sources for session closure.
Returns 202 Accepted for async processing.
""",
responses={
202: {"description": "Accepted for async processing"},
400: {"description": "Invalid request"},
},
)
async def report_messages(
request: Request,
report_request: MessageReportRequest,
session: Annotated[AsyncSession, Depends(get_session)],
) -> JSONResponse:
"""
[AC-IDMP-08] Report messages from channel.
Accepts and stores messages for session data completeness.
Messages are stored asynchronously without blocking response.
"""
tenant_id = get_tenant_id()
if not tenant_id:
from app.core.exceptions import MissingTenantIdException
raise MissingTenantIdException()
logger.info(
f"[AC-IDMP-08] Message report: tenant={tenant_id}, "
f"session={report_request.session_id}, count={len(report_request.messages)}"
)
try:
memory_service = MemoryService(session)
await memory_service.get_or_create_session(
tenant_id=tenant_id,
session_id=report_request.session_id,
)
messages_to_save = []
for msg in report_request.messages:
role = msg.role
if msg.source == "human":
role = "human"
elif msg.source == "bot":
role = "assistant"
messages_to_save.append({
"role": role,
"content": msg.content,
})
if messages_to_save:
await memory_service.append_messages(
tenant_id=tenant_id,
session_id=report_request.session_id,
messages=messages_to_save,
)
logger.info(
f"[AC-IDMP-08] Messages saved: tenant={tenant_id}, "
f"session={report_request.session_id}, count={len(messages_to_save)}"
)
return JSONResponse(
status_code=202,
content={"status": "accepted", "session_id": report_request.session_id},
)
except Exception as e:
logger.error(f"[AC-IDMP-08] Message report failed: {e}")
return JSONResponse(
status_code=202,
content={"status": "accepted", "warning": str(e)},
)