Source code for veupath_chatbot.transport.http.routers.chat
"""Chat endpoint — starts a background chat operation."""
from fastapi import APIRouter, Request
from fastapi.responses import JSONResponse
from veupath_chatbot.platform.security import limiter
from veupath_chatbot.services.chat.orchestrator import start_chat_stream
from veupath_chatbot.transport.http.deps import (
CurrentUser,
StreamRepo,
UserRepo,
)
from veupath_chatbot.transport.http.schemas import ChatRequest
router = APIRouter(prefix="/api/v1", tags=["chat"])
[docs]
@router.post("/chat", status_code=202)
@limiter.limit("30/minute")
async def chat(
request: Request,
body: ChatRequest,
user_repo: UserRepo,
stream_repo: StreamRepo,
user_id: CurrentUser,
) -> JSONResponse:
"""Start a chat operation and return its operation ID.
The client subscribes to GET /operations/{operationId}/subscribe for SSE events.
"""
operation_id, strategy_id = await start_chat_stream(
message=body.message,
site_id=body.site_id,
strategy_id=body.strategy_id,
user_id=user_id,
user_repo=user_repo,
stream_repo=stream_repo,
provider_override=body.provider,
model_override=body.model_id,
reasoning_effort=body.reasoning_effort,
mentions=[m.model_dump(by_alias=True) for m in body.mentions]
if body.mentions
else None,
disable_rag=body.disable_rag,
disabled_tools=body.disabled_tools,
temperature=body.temperature,
seed=body.seed,
context_size=body.context_size,
response_tokens=body.response_tokens,
reasoning_budget=body.reasoning_budget,
)
return JSONResponse(
{"operationId": operation_id, "strategyId": strategy_id},
status_code=202,
)