feat: NanoClaude 프로덕션 통합 — Docker, Caddy, aiosqlite 로깅
- docker-compose에 nanoclaude 서비스 추가 (포트 8100) - Caddy /nano/* → nanoclaude 리버스 프록시 (SSE flush) - aiosqlite 요청/응답 로깅 (request_logs 테이블) - .env.example, CLAUDE.md 업데이트 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4,7 +4,10 @@ from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
from time import time
|
||||
|
||||
from config import settings
|
||||
from db.database import log_completion, log_request
|
||||
from models.schemas import JobStatus
|
||||
from services.exaone_adapter import stream_chat
|
||||
from services.job_manager import Job, job_manager
|
||||
@@ -18,6 +21,14 @@ HEARTBEAT_INTERVAL = 4.0
|
||||
|
||||
async def run(job: Job) -> None:
|
||||
"""EXAONE 호출 → SSE 이벤트 발행."""
|
||||
start_time = time()
|
||||
|
||||
# DB 로깅: 요청 기록
|
||||
try:
|
||||
await log_request(job.id, job.message, settings.exaone_model, job.created_at)
|
||||
except Exception:
|
||||
logger.warning("Failed to log request for job %s", job.id, exc_info=True)
|
||||
|
||||
try:
|
||||
# --- ACK ---
|
||||
await state_stream.push(job.id, "ack", {"message": "요청을 확인했습니다. 분석을 시작합니다."})
|
||||
@@ -50,9 +61,19 @@ async def run(job: Job) -> None:
|
||||
if not collected:
|
||||
job_manager.set_status(job.id, JobStatus.failed)
|
||||
await state_stream.push(job.id, "error", {"message": "EXAONE으로부터 응답을 받지 못했습니다."})
|
||||
status = "failed"
|
||||
else:
|
||||
job_manager.set_status(job.id, JobStatus.completed)
|
||||
await state_stream.push(job.id, "done", {"message": "완료"})
|
||||
status = "completed"
|
||||
|
||||
# DB 로깅: 완료 기록
|
||||
latency_ms = (time() - start_time) * 1000
|
||||
response_text = "".join(collected)
|
||||
try:
|
||||
await log_completion(job.id, status, len(response_text), latency_ms, time())
|
||||
except Exception:
|
||||
logger.warning("Failed to log completion for job %s", job.id, exc_info=True)
|
||||
|
||||
except asyncio.CancelledError:
|
||||
job_manager.set_status(job.id, JobStatus.cancelled)
|
||||
|
||||
Reference in New Issue
Block a user