"""chat 라우터 (대화형 협상, P7 슬라이스). 엔진 주입(헤더→레지스트리) → ChatService.""" from fastapi import APIRouter, Depends from router.deps import get_tenant_engine from router.v1.chat.protocol import Req_Chat, Res_Chat, Res_ChatSession from services.chat_service import ChatService from tenancy.registry import TenantEngine router = APIRouter(prefix="/v1/chat", tags=["Chat (negotiation)"], responses={404: {"description": "Not found"}}) @router.post( path="", response_model=Res_Chat, summary="협상 대화 한 턴", description="session_id 없으면 새 협상 시작. user_input 으로 진행(버튼 텍스트/가격). X-Tenant-ID 헤더 필수.", ) async def chat( req: Req_Chat, engine: TenantEngine = Depends(get_tenant_engine), service: ChatService = Depends(), ): return await service.chat(engine, req) @router.get( path="/sessions/{session_id}", response_model=Res_ChatSession, summary="세션 상태 조회 (desync 리싱크)", description="agent 세션의 현재 step/ended 를 반환한다. backend 가 타임아웃·재진입 시 정합을 맞출 때 사용. X-Tenant-ID 헤더 필수.", ) async def get_session( session_id: str, engine: TenantEngine = Depends(get_tenant_engine), service: ChatService = Depends(), ): return await service.get_session_state(engine, session_id)