feat(engine): claude -p 상주 멀티턴 엔진 게이트웨이 + 실동작 검증
- engine_gateway/gateway.py: 회기당 claude -p 상주 프로세스(stream-json), 턴 직렬, budget 제한 - 세션 생성/턴/종료 HTTP API(FastAPI, :9099) - 검증: 멀티턴 컨텍스트 유지 + prompt caching 재사용(턴2 +$0.07) 실동작 확인
This commit is contained in:
parent
d5b86c5f89
commit
84eb6e2173
20 changed files with 2038 additions and 1 deletions
69
apps/api/app/main.py
Normal file
69
apps/api/app/main.py
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
"""Vignette FastAPI 앱 엔트리포인트.
|
||||
|
||||
Dockerfile CMD: uvicorn app.main:app --host 0.0.0.0 --port 8000
|
||||
소유: 상태머신·가드레일·엔진 어댑터 호출부·SSE 스트리머·RBAC (마스터플랜 §5).
|
||||
엔진 게이트웨이(engine_gateway/)는 람다 직접 소유 — 여기선 engine_client 로 호출만.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
from . import __version__
|
||||
from .config import settings
|
||||
from .db import close_pool, healthcheck, init_pool
|
||||
from .engine_client import engine_client
|
||||
from .routes import auth as auth_routes
|
||||
from .routes import sessions as session_routes
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
"""startup: DB 풀 + 엔진 클라이언트 / shutdown: 정리."""
|
||||
await init_pool()
|
||||
await engine_client.startup()
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
await engine_client.shutdown()
|
||||
await close_pool()
|
||||
|
||||
|
||||
app = FastAPI(
|
||||
title="Vignette API",
|
||||
version=__version__,
|
||||
description="상담 시뮬레이션 훈련 플랫폼 백엔드 (FastAPI · 상태머신 · 가드레일 · RBAC)",
|
||||
lifespan=lifespan,
|
||||
)
|
||||
|
||||
# CORS — 정적 프론트(chanpaca.net) + SSE 분리경로(stream.chanpaca.net)
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=settings.cors_origins,
|
||||
allow_credentials=True, # __Host- HttpOnly 쿠키 전송
|
||||
allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
# TODO: Presidio PII 마스킹 미들웨어 (외부 LLM 경로 진입 전 하드 게이트, R7/F-03)
|
||||
|
||||
app.include_router(auth_routes.router)
|
||||
app.include_router(session_routes.router)
|
||||
|
||||
|
||||
@app.get("/health", tags=["meta"])
|
||||
async def health() -> dict[str, object]:
|
||||
"""liveness + DB + 엔진 게이트웨이 readiness."""
|
||||
db_ok = await healthcheck()
|
||||
engine_ok = await engine_client.health()
|
||||
return {
|
||||
"status": "ok" if db_ok else "degraded",
|
||||
"version": __version__,
|
||||
"environment": settings.environment,
|
||||
"db": db_ok,
|
||||
"engine": engine_ok,
|
||||
"engine_mode": settings.engine_mode,
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue