분석
목적
analysis-svc는 구조화된 통계로부터 시험 코멘터리와 학생별 피드백을 생성하는 워커입니다. grading과 report와 달리 큐 기반이 아닙니다. 호출자가 HTTP 요청을 보내면 생성된 텍스트 응답을 즉시 받습니다.
리포지토리 전반의 워커 모델은 워커 개요를 참조하세요.
소스 경로
| 경로 | 역할 |
|---|---|
lumie-worker/services/analysis/main.py | FastAPI 앱, lifespan, 라우트 핸들러, 메트릭 마운트 |
lumie-worker/services/analysis/src/schema.py | 외부 입출력 요청 및 응답 모델 |
lumie-worker/services/analysis/src/usecase.py | LLM 호출 오케스트레이션과 metric |
lumie-worker/services/analysis/src/domain/prompts.py | 한국어 프롬프트 템플릿과 프롬프트 빌더 |
lumie-worker/services/analysis/src/adapters/llm.py | AsyncOpenAI 클라이언트 어댑터 |
lumie-worker/services/analysis/src/joossameng/router.py | Joossameng 전용 AI 리포트 HTTP 라우트 |
lumie-worker/services/analysis/src/joossameng/service.py | AI 리포트 배치 오케스트레이션과 ZIP 조립 |
lumie-worker/services/analysis/src/joossameng/renderer.py | Joossameng AI 리포트 PDF용 ReportLab 렌더러 |
lumie-worker/services/analysis/assets/fonts/ | AI 리포트 PDF가 사용하는 번들 Noto Sans KR 폰트 |
lumie-worker/services/analysis/src/config.py | LLM_*와 OTel 설정 |
lumie-worker/services/analysis/tests/test_analysis_usecase.py | 유스케이스 동작 테스트 |
lumie-worker/services/analysis/tests/test_joossameng_renderer.py | AI report 폰트, 줄바꿈, pagination 테스트 |
lumie-worker/services/analysis/tests/test_joossameng_service.py | AI report job 오케스트레이션 테스트 |
lumie-worker/services/analysis/tests/test_observability.py | 메트릭 및 tracing smoke 테스트 |
공개 표면
라우트:
GET /GET /healthGET /metricsPOST /api/analysis/exam-commentaryPOST /api/analysis/student-feedbackPOST /api/joossameng/ai-reports/exams/{exam_id}/batchGET /api/joossameng/ai-reports/jobs/{job_id}GET /api/joossameng/ai-reports/jobs/{job_id}/download
두 생성 라우트는 lumie-worker/services/analysis/src/schema.py의
GenerationResponse를 lumie-worker/services/analysis/main.py에서 응답
모델로 사용합니다.
{
"content": "..."
}
joossameng AI 리포트 라우트는 tenant가 제한된 확장 경로입니다. 이 라우트는
X-Tenant-Slug: joossameng이 필요합니다. 다른 tenant는 작업 생성 또는 조회
전에 worker 라우트에서 403을 받습니다.
요청 모델
/api/analysis/exam-commentary는 다음과 같은 집계 수준 시험 데이터를 받습니다.
- 시험 이름
- 응시자 수
- 평균, 최고, 최저 점수
- 등급 분포
- 문제별 정답률 통계
/api/analysis/student-feedback는 다음과 같은 학생 수준 데이터를 받습니다.
- 학생 이름과 시험 이름
- 총점, 등급, 시험 평균
- 선택 답안과 정답이 포함된 오답 문제
- 문제 유형별 성취도
요청 및 응답 계약은 services/analysis/src/schema.py에 있으며, wire 형식에 대해 직접 Pydantic 검증을 사용합니다.
이 스키마는 백엔드와 프론트엔드 호출자가 이미 camelCase JSON을 사용하므로 alias 없이 의도적으로 camelCase 필드를 사용합니다. 모든 호출자를 같은 변경에서 함께 마이그레이션하지 않는 한 이 모델을 snake_case로 바꾸지 마세요.
Joossameng AI 리포트 배치 라우트는
lumie-worker/services/analysis/src/joossameng/router.py의
AiReportBatchRequest에 정의된 studentIds 목록만 받습니다.
{
"studentIds": [101, 102]
}
이 라우트는 워커 내부 작업 id를 반환합니다. 상태 라우트는 처리, 성공, 실패
건수를 보고하며, 다운로드 라우트는 작업이 COMPLETED에 도달한 뒤 ZIP을
반환합니다.