"""FastAPI 의존성 — 요청에서 테넌트 엔진을 해석한다 (계획서 B). 미들웨어가 검증/주입한 request.state.tenant_id 로 레지스트리에서 엔진을 가져온다. 요청 본문엔 tenant 가 없다(위조 방지) — 항상 헤더 경로로만 결정된다. """ from fastapi import Request from common.enums import EXCEPTION_TENANT_HEADER_MISSING, EXCEPTION_TENANT_NOT_REGISTERED from tenancy.registry import TenantEngine, tenant_registry async def get_tenant_engine(request: Request) -> TenantEngine: tenant_id = getattr(request.state, "tenant_id", None) if not tenant_id: raise EXCEPTION_TENANT_HEADER_MISSING try: return await tenant_registry.get_engine(tenant_id) except KeyError: raise EXCEPTION_TENANT_NOT_REGISTERED def new_episode_state(): """요청 스코프 EpisodeState 생성 (정책 인스턴스에 두지 않기 위함).""" from negotiation.policies.base import EpisodeState return EpisodeState()