TL;DR
KSEL 7-KPI 평가용 풀스택 모놀리식 PoC. FastAPI 백엔드 + React 19 SPA + nginx 정적 + Claude Agent SDK 통합. 단일 EC2 (t4g.xlarge AL2023) · alpha push → GitHub Actions → rsync → Infisical export → rolling restart → smoke (deploy_id 일치 검증). 3-tier requirements (vercel stub / EC2 real / dev) 로 250MB Vercel 제약과 ~7GB HF 모델 풀파이프라인을 같은 코드베이스에서 처리. 7개 KPI 각각의 모델 어댑터 · stub fallback · 측정 결과 ndjson · 단위/통합 테스트가 갖춰져 있어 KSEL 검토자가 시연·검증·증빙을 한 화면에서 끝낼 수 있는 구조.
총 코드~ 1.7 MB
백엔드 Pythonsrc 48 + api 9
프론트엔드React 19 + Vite 6 + TS 5.6
테스트pytest 31 files · 3,289 LOC
데이터셋23 files · 10 MB · 15,050 sample
KPI7개 (목표 71.07~99 사이)
API 라우트30+
Agent 도구8
1. 레포 개요
1.1 디렉터리 분포
| 경로 | 파일 | 용량 | 역할 |
src/ | 48 | 404 KB | 도메인 · KPI 구현 · 모델 어댑터 · 메트릭 · Agent |
api/ | 9 | 92 KB | FastAPI 진입점 · chat · agent · ksel 라우터 |
frontend/ | 55 | 524 KB | React 19 SPA · 4 페이지 · 측정 패널 |
deploy/ | 5 | 20 KB | Caddyfile · setup-ec2.sh · 대체 compose |
scripts/ | 14 | 96 KB | build_datasets/ · deploy.sh · export csv |
tests/ | 31 | 172 KB | pytest 단위/통합 · KPI contract · 메트릭별 |
datasets/ | 23 | 10 MB | KPI 평가 데이터셋 (jsonl + csv 쌍) |
evidence/ | 5 | 252 KB | KSEL 시험의뢰서 · 기술 PDF |
public/ | 16 | 2.8 MB | 정적 자산 |
notebooks/ | 1* | 4 KB | 실제로는 비어있음 — KSEL 녹화용 예정 |
1.2 운영 토폴로지 (한 줄)
Cloudflare (orange-cloud, WAF/CDN) → EC2 t4g.xlarge AL2023
├─ nginx (80/443, origin TLS) → /api/* proxy → fingu-tips-api:8001
├─ fingu-tips-web (nginx + SPA build, 128 MB)
└─ fingu-tips-api (Python 3.12 + FastAPI + Uvicorn, 6 GB limit)
└─ HF cache volume + Infisical-pulled .env
1.3 분기 / 운영 환경
alpha — 운영 배포 단일 브랜치. push 시 GitHub Actions 자동 CD.
main/master — 미사용. 모든 통합이 alpha 직행.
- Vercel — 초기 시연용 stub.
ENABLE_REAL_PIPELINE=false 만으로 동일 코드베이스 동작.
- 현재 alpha HEAD = 운영 deploy_id (
f531aa5...) 일치 확인됨.
2. 백엔드 (Python · FastAPI)
2.1 진입점 & 부트스트랩
- FastAPI app
src/api.py:235 — FastAPI(title="TIPS R&D KPI Evaluation API", version="0.6.0")
- Vercel 진입
api/index.py — Vercel builder 가 app 심볼 인식
- 로컬 실행
uvicorn src.api:app --host 0.0.0.0 --port 8000
- 환경 정규화
- import 시점에
ENABLE_REAL_PIPELINE, ENABLE_API_PIPELINE, ENABLE_FINETUNED_PIPELINE 정규화 (src/api.py:53~72)
- 전역 시드
SEED=20260514 — KPI별 KPI{n}_STUB_SEED 로 분기. 모든 stub 측정 재현 가능
- 미들웨어
x-request-id 자동 주입 · CORS (PUBLIC_ORIGIN + localhost) · 구조화 로깅 ContextVar
2.2 7 개 KPI 구현 — 모듈 / 데이터셋 / 메트릭 / 합격선
| KPI | 모듈 | 데이터셋 | 어댑터 | 메트릭 | 합격선 |
| ① 재무 F1 | src/kpi/kpi1_finance_qa.py | kpi1_financial_qa.jsonl 1,050 | pipelines/agents.py:classify_scenario() — 16개 시나리오 | metrics/f1_score.py macro | 71.07 |
| ② 텍스트 분류 | src/kpi/kpi2_text_classification.py | kpi2_text_classification.jsonl 1,000 | pipelines/thread_titles.py:classify_intent() | metrics/accuracy.py | 99.0 % |
| ③ BLEU (FT) | src/kpi/kpi3_translation.py | kpi3_finetune_qa.jsonl 500 | pipelines/finetune_inference.py:generate() — vLLM + Qwen-ORPO · stub fallback | metrics/bleu.py char-level | 78.0 |
| ④ 처리속도 | src/kpi/kpi4_throughput.py | kpi4_throughput_payloads.jsonl 10,000 (라벨 무) | pipelines/data_augmentation.py:augment_record() | metrics/throughput.py — 1분×5회 · SHA-256 무결성 | 500/min + 99.9 % |
| ⑤ 개인화 추천 | src/kpi/kpi5_personalized_recommendation.py | kpi5_personalized_recommendation.jsonl 500 | pipelines/recommendations.py:score_personalization() — 4 단계 Rec-Prompt | metrics/llm_rec_score.py | 0.31 |
| ⑥ NQ 검색 | src/kpi/kpi6_finance_search.py | kpi6_nq_finance.jsonl 1,000 | pipelines/search.py:search_top_k() — Pinecone/Faiss + sentence-transformers · BM25 fallback | metrics/nq_em.py Recall@5/10 | 64.06 |
| ⑦ 상품추천 F1 | src/kpi/kpi7_product_recommendation.py | kpi7_product_recommendation.jsonl 1,000 + 카탈로그 | pipelines/recommendations.py:recommend_top_k() | per-user F1@10 | 86.0 |
2.3 AI 모델 어댑터 레이어 (src/ai_clients/)
| 클라이언트 | generate | embed | 비고 |
| AnthropicClient | O (Claude) | X (raise) | 기본 claude-sonnet-4-6 |
| OpenAIClient | O | O | OPENAI_API_KEY |
| EmbeddingClient | X | O | sentence-transformers · HF API |
| LocalModelClient | O (vLLM) | — | FINETUNED_*_API_URL 3종 |
| GeminiClient | O | — | Google Gemini |
공통 베이스: src/ai_clients/_base.py::BaseClient (ABC). 모듈 import는 SDK 없이도 성공, 호출 시점에만 NotImplementedError. _errors.py에 ConfigError/ProviderError/UnsupportedOperationError 정의.
2.4 Claude Agent (/api/chat, /api/agent/*)
- 구현체
src/agents/financial_agent.py::FinancialAgent
- 기본 모델
claude-opus-4-7 · max_tokens 4096 · effort "high" · max_turns 6
- Prompt caching
- 시스템 프롬프트 + 8 도구 정의에
cache_control={"type":"ephemeral"} — 캐시 히트로 ~10× 절감
- 스트리밍
client.messages.stream() — text / thinking / tool_use 이벤트 SSE 전달
- Fallback 체인
- Claude Agent → OpenAI gpt-4o-mini → canned 응답 (
api/chat.py)
등록 8 도구 (src/agents/tools.py)
get_portfolio_overview — 페르소나 자산/부채/지출
get_recent_transactions — N건 + 카테고리 합계
classify_intent — 8 의도 + 신뢰도 (KPI ②)
recommend_products — Top-K 상품 (KPI ⑦)
simulate_financial_plan — N년 시뮬
search_finance_knowledge — RAG (KPI ⑥)
calculate_dti_ltv — DTI/LTV
classify_finance_scenario — 시나리오 → 16 도구 (KPI ①)
2.5 측정 결과 & 로깅
- 결과 파일:
RESULTS_DIR=/app/results · {kpi_id}_{UTC}.json · OS 권한 에러는 silent skip (read-only FS 호환)
- NDJSON 옵션:
KPI_NDJSON_DUMP=1 시 /tmp/results/runs/{run_id}.ndjson · NdjsonRunSink 컨텍스트 매니저
- SSE 스트림 기록:
src/api.py:1140~1149 — run_context + sink 동시 진행
- 로깅 포맷:
JsonFormatter 한 줄 JSON · ContextVar 자동 전파 (request_id/run_id/kpi)
- 이벤트 분류:
api.boot, api.request.done, kpi.bulk.{start,progress,done}, kpi.single.measured, kpi.suite.{start,done}, result.saved
- 핫패스 보호: per-loop 로그는 DEBUG (
isEnabledFor 체크) — 운영에서 no-op
2.6 페르소나 fixture (api/personas_data.py:22~107)
| ID | 나이 | 직업 | 자산 | 위험도 |
| jiyu | 25 | 스타트업 마케터 | 1,200만 | high |
| minjae | 35 | IT 부장 | 8,500만 | mid |
| eunyoung | 62 | 은퇴 | 4억 | low |
| soyeon | 28 | 프리랜서 디자이너 | 1,800만 | high |
| junho | 38 | 개업 의사 | 1.5억 | mid |
| jaesung | 55 | 공무원 | 2.5억 | low |
12개월 자산 추이 · 카테고리별 지출 % · 자산 클래스 비중 · 부채 유형별 분해 등 모두 random.Random(seed) 로 재현 가능.
3. 프론트엔드 (React 19 SPA)
3.1 빌드 스택
- 프레임워크
- React 19.0.0
- 빌드
- Vite 6.0.0 · pnpm 10.20.0
- 언어
- TypeScript 5.6.0
- 라우팅
- react-router-dom 7.1.0
- 상태
- React Context × 3 + TanStack Query 5.59
- 스타일
- Tailwind CSS 4.0 (Vite plugin)
- 차트
- recharts 3.8.1
- CSV
- papaparse 5.5.3
- 마크다운
- react-markdown + remark-gfm
- 호스팅
- nginx 정적 SPA · dev proxy
/api → :8001
3.2 라우트 (4 페이지)
| 경로 | 역할 | KPI 연결 |
/ | 대시보드 — 페르소나별 자산·거래·차트 | — |
/chat | AI 어시스턴트 — 채팅 + 우측 측정 패널 + CSV 배치 | ①②③⑤⑥ 통합 |
/recommend | Top-10 추천 + 적합도 ring + 인사이트 | ⑦ |
/analysis | 10/15/20년 재무 시뮬 + 처리속도 정밀 검증 | ④ (1분 × 5회) |
/admin/logs | KSEL 검토자용 실시간 로그 뷰어 · SSE · CSV/JSONL 다운로드 | 전체 |
3.3 측정 UI 아키텍처
/chat 우측 패널
- EmbeddedMeasurementPanel — KPI ①②③⑤⑥ 5개 동시 누적 평균
- KpiHistoryPanel — 대화 ID별 측정 히스토리 (in-memory 최대 500)
- AdvancedKpiPanel — CSV 업로드 → 5건 병렬 worker (Promise.all) → 라이브 평균
/recommend
- SingleShotKpi7Result — 페르소나별 F1@10 단건 시연
- Kpi7MeasurementMode — CSV 업로드 (
id, user_id, expected)
- 페르소나 → user_id 매핑
jiyu→user_0000, soyeon→user_0050, ...
/analysis · ThroughputVerifyCard
- 1분 × 5 회 자동 루프 (
Kpi4MeasurementContext)
- 회차별 — 처리속도(건/min) · Integrity · Security pass rate
- App 레벨 컨텍스트 → 페이지 이동해도 백그라운드 측정 지속
- 250 ms 틱으로 경과시간 갱신
/admin/logs
ADMIN_LOG_TOKEN 검증 + localStorage 캐싱
- SSE 실시간 + auto-scroll (하단 50px 이내일 때만)
- 레벨별 컬러 / KPI · run_id 필터 / CSV · JSONL 다운로드
- 서버 측 PII 마스킹 (input/expected/prompt redacted)
3.4 페르소나 컨텍스트 (3개)
| Context | scope | 특징 |
| PersonaContext | App | localStorage 영속 + StorageEvent 멀티탭 동기화 + UI 이벤트 로깅 |
| KpiHistoryContext | App | 대화별 KPI ①②③⑤⑥ 누적 (~500건 ≈ 0.5MB) · 새로고침 시 초기화 |
| Kpi4MeasurementContext | App | 1분 × 5회 정밀 검증 백그라운드 상태 보존 (페이지 이동 무관) |
3.5 SSE 구현
EventSource 미사용 — POST + ReadableStream 직접 파싱 (AbortController 호환). 이벤트 타입: text_delta · thinking_delta · tool_use_start · tool_use_done · done. frontend/src/api/agent.ts, measurement.ts 참조.
4. 인프라 · CI/CD
4.1 GitHub Actions (.github/workflows/)
| 워크플로 | 트리거 | 역할 |
ci-cd-alpha.yml | alpha push | EC2 자동 배포 · concurrency: deploy-alpha · cancel-in-progress: false (직렬화) |
ci.yml | PR / push | 경로 필터 분기 — API pytest · Frontend tsc+build · Docker 이미지 캐시 |
4.2 배포 흐름 (deploy.sh, ~1.5 KB)
- SSH 키 로드 (
webfactory/ssh-agent)
rsync 동기화 — .git, node_modules, __pycache__, .env* 제외
- 원격에서
infisical export --env=beta --path=/fingu-tips --format=dotenv → .env 생성
DEPLOY_ID=${{github.sha}} 를 .env 끝에 append → compose 컨테이너 주입
docker compose build --quiet → rolling restart (api healthcheck wait → web)
- 외부 smoke —
/api/health.deploy_id == github.sha · /healthz == "ok" · 5회 지수백오프 (2/4/6/8/10초)
4.3 컨테이너 (운영 docker-compose.yml)
| 서비스 | 이미지 | 포트 | 리소스 | 헬스 |
| api | Dockerfile.api · Python 3.12-slim · uvicorn 1 worker · --no-access-log | 8001 (expose) | mem 6 GB / res 256 MB | /api/health 30s |
| web | Dockerfile.frontend · nginx 1.27-alpine (multi-stage build) | 80, 443 | mem 128 MB | /healthz 30s |
api 의 --no-access-log는 uvicorn raw access log 가 query string 노출 위험이 있어 비활성 — 자체 api.request.done 구조화 로그로 대체.
4.4 nginx 리버스 프록시 (nginx.conf)
- HTTP/2 활성 · 자체 서명 + Cloudflare Origin Certificate (
/etc/nginx/certs/origin.{crt,key}) TLS 1.2/1.3
- access log masked —
$request 대신 $request_method $uri $server_protocol (token 류 query 유출 차단)
/api/ → http://fingu_api:8001 · X-Real-IP/X-Forwarded-* 전달 · keepalive 32 · read/send timeout 90 s
- 정적 자산 —
Cache-Control: public, max-age=604800, immutable
/healthz — access log off · 항상 200 ok
try_files $uri $uri/ /index.html — SPA fallback
4.5 EC2 부트스트랩 (deploy/setup-ec2.sh)
- Docker + docker-compose 설치
git clone -b alpha https://github.com/FINGU-GRINDA/fingu-tips-rnd-evaluation.git
.env 생성 (OPENAI_API_KEY · HF_TOKEN · DOMAIN 입력)
docker compose -f deploy/docker-compose.yml up -d --build
4.6 Requirements 3-tier
| 파일 | 용도 | 크기 | 주요 추가 의존성 |
requirements.txt | Vercel stub | ~ 250 MB | fastapi, uvicorn, anthropic |
requirements-real.txt | EC2 real pipeline | > 7 GB | + torch (CPU wheel), transformers, sentence-transformers, openai |
requirements-test.txt | CI unit | compact | + pytest, pytest-mock (torch 제외) |
requirements-dev.txt | 로컬 | full | + sklearn, rouge-score, faiss-cpu, pinecone |
4.7 scripts/ 14 파일 분포
| 분류 | 파일 |
| 운영 | deploy.sh |
| 데이터셋 빌드 | build_datasets/kpi1~7.py · 각 150~300 LOC · _common.py (OpenAI 클라이언트 · CostTracker · resumable writer) |
| 변환 | export_datasets_csv.py (JSONL → CSV · KSEL 친화) · md_to_pdf.py |
4.8 보안
- 시크릿 분리 — GH Actions secrets (SSH 키 · Infisical 토큰) + Infisical (런타임 시크릿) 이중화
.env rsync 제외 + .gitignore
- nginx access log 마스킹 · uvicorn raw log 비활성
- TLS 1.2/1.3 · HIGH 암호화 · Cloudflare 전단 (WAF · DDoS)
- 메모리 격리 — api 6 GB OOM 시 컨테이너만 종료 · web 128 MB
- CORS 명시 origin/methods/headers
5. 테스트 · 증빙 · 데이터셋
5.1 pytest 구성
- 파일
- 31 개 · 3,289 LOC
- conftest
- autouse fixture
_clear_ai_secrets — 실수 API 호출 방지 위해 모든 테스트에서 SECRET_ENV_KEYS 제거
- contract test
test_kpi_contract.py — 7개 KPI parametrize · load_test_set/call_model/evaluate/main 존재 + MIN_SAMPLES KSEL 기준 일치 검증
- 메트릭 단위
test_f1_score.py · test_bleu.py · test_nq_em.py · test_llm_rec_score.py · test_throughput.py
- KPI 세부
test_kpi5_breakdown.py (per_user_category) · test_kpi7_breakdown.py (per_product_category)
- CI
pytest tests/ -q --timeout=30 · 빠른 반복 위해 30 s 타임아웃
5.2 데이터셋 분포 (JSONL · CSV 쌍)
| KPI | 파일 | 줄수 | 용량 | 출처 | 라이선스 | 라벨 |
| 1 | kpi1_financial_qa.jsonl | 1,050 | 302 KB | GPT-4o-mini 합성 | OpenAI 약관 | O |
| 2 | kpi2_text_classification.jsonl | 1,000 | 234 KB | GPT-4o-mini | OpenAI 약관 | O |
| 3 | kpi3_finetune_qa.jsonl | 500 | 352 KB | 출처 문서 참조 | 출처 문서 참조 | O |
| 4 | kpi4_throughput_payloads.jsonl | 10,000 | 3.2 MB | Faker (seed 20260514) | MIT | X · 의도 |
| 5 | kpi5_personalized_recommendation.jsonl | 500 | 359 KB | 출처 문서 참조 | 출처 문서 참조 | 참고용 |
| 6 | kpi6_nq_finance.jsonl | 1,000 | 294 KB | GPT-4o-mini | OpenAI 약관 | O |
| 7 | kpi7_product_recommendation.jsonl + 카탈로그 | 1,000 | 554 KB | Faker | MIT | O |
각 KPI별 _source.md 메타 문서로 출처 · 생성 스크립트 · 라이선스 · 라벨 분포 · 재현 명령 기록. CSV는 KSEL 검토 친화 형태 (헤더 포함).
5.3 evidence/ 5 파일
| 파일 | 크기 | 용도 | 상태 |
| Technical-overview-of-data-collection-and-model-fine-tuning.pdf | 211 KB | 기술 설명서 5 페이지 · 데이터 수집 · 파인튜닝 | 제출용 |
| KSEL_시험의뢰서_2026-05-08.docx | 21 KB | KSEL 공식 시험 의뢰서 | 제출 완료 |
| TIPS_성능평가_의뢰서_참고자료_2026-05-08.docx | 15 KB | TIPS 참고 자료 | 제출용 |
| ksel/ | — | KSEL 결과 보관 예정 | 대기 |
| kolas/ | — | KOLAS 표준 활용 예정 | 대기 |
5.4 측정 결과 스키마 (src/kpi/_common.py::save_result)
{
"kpi": "kpi1_finance_qa",
"metric": "f1",
"score": 71.07,
"target": 71.07,
"verdict": "pass|conditional|fail",
"details": { ... },
"timestamp": "2026-05-19T15:30:45Z",
"n_samples": 1050,
"duration_sec": 12.34
}
5.5 주의 사항
- KPI ⑤ ground_truth 라벨 부재 — LLM 기반 점수, 전략(
Basic/Recommendation Driven/Engagement Guided/Rec+Engagement)별 비교만 가능
- KPI ④ 라벨 부재는 의도 — 처리량(throughput)·무결성(SHA-256)·보안만 측정
notebooks/ 빈 디렉터리 — KSEL 화면 녹화 진행 시 생성 예정
- KPI ④ throughput 구현은 pure-Python — JMeter/Spark 대체
6. KSEL 검토 체크포인트
| 항목 | 상태 | 근거 |
| CI/CD 완전 자동화 | 충족 | alpha push → 5분 이내 운영 |
| 배포 진실성 검증 | 충족 | github.sha → /api/health.deploy_id 일치 (현재 f531aa5) |
| 시크릿 관리 | 충족 | Infisical + GH secrets 이중화 |
| 인프라 재현성 | 충족 | docker-compose · setup-ec2.sh · 3-tier requirements |
| 로깅 보안 | 충족 | nginx mask + uvicorn raw 비활성 + 구조화 JSON |
| 측정 재현성 | 충족 | 전역 시드 20260514 · 결정적 random |
| 실시간 가시화 | 충족 | SSE 측정 패널 + /admin/logs 라이브 뷰 |
| KPI ④ 1분 × 5회 정밀 | 충족 | App 레벨 컨텍스트로 백그라운드 유지 |
| KPI ⑤ 라벨 부재 | 주의 | 전략별 비교만 가능 — 시험 절차 문서로 보완 필요 |
| notebooks 비어 있음 | 주의 | KSEL 녹화 진행 시 7 KPI별 노트북 생성 필요 |
| SSM Agent 미설치 | 참고 | SSH 외 통제 채널 없음 (별도 PR 권장) |
| SG 22 0.0.0.0/0 | 주의 | 본인 IP/32 또는 VPN 으로 축소 권장 |
7. 부록
7.1 API 라우트 전체
| 메서드 | 경로 | 핸들러 (path:line) |
| GET | /api/health | src/api.py:358 |
| GET | /api/kpi | src/api.py:386 |
| GET | /api/kpi/{n}/dataset | src/api.py:417 |
| POST | /api/kpi/{n}/evaluate | src/api.py:442 |
| POST | /api/kpi/4/evaluate?run=N | src/api.py:504 |
| POST | /api/kpi/measure-all | src/api.py:579 |
| GET | /api/kpi/{n}/results | src/api.py:768 |
| GET | /api/kpi-summary | src/api.py:784 |
| POST | /api/kpi/{n}/dataset/upload | src/api.py:668 |
| POST | /api/kpi/{n}/evaluate/with-dataset | src/api.py:717 |
| GET | /api/kpi/{n}/dataset/sample | src/api.py:751 |
| POST | /api/kpi/{n}/sample | src/api.py:978 |
| POST | /api/kpi/4/evaluate/stream | src/api.py:1022 (SSE) |
| POST | /api/kpi/{n}/evaluate/stream | src/api.py:1105 (SSE) |
| GET | /api/personas | src/api.py:856 |
| GET | /api/personas/{id} | src/api.py:862 |
| GET | /api/personas/{id}/portfolio | src/api.py:874 |
| GET | /api/personas/{id}/recommendations | src/api.py:919 |
| GET | /api/personas/{id}/recommendations/shuffle | src/api.py:927 |
| POST | /api/chat | src/api.py:899 |
| POST | /api/analysis/simulate | src/api.py:1260 |
| GET | /api/agent/health | api/agent.py:34 |
| GET | /api/agent/tools | api/agent.py:69 |
| POST | /api/agent/tools/{name} | api/agent.py:91 |
| POST | /api/agent/converse | api/agent.py:113 |
| POST | /api/agent/converse/stream | SSE |
7.2 환경변수 전체
| 변수 | 기본 | 설명 |
ENABLE_REAL_PIPELINE | false | 실모델 호출 vs stub |
ENABLE_API_PIPELINE | false | API 기반 어댑터 활성화 |
ENABLE_FINETUNED_PIPELINE | false | vLLM 미세조정 모델 |
FINETUNED_KPI2_API_URL | — | KPI2 vLLM 엔드포인트 |
FINETUNED_KPI3_API_URL | — | KPI3 vLLM 엔드포인트 |
FINETUNED_API_URL | — | 공통 vLLM fallback |
ANTHROPIC_API_KEY | — | Claude Agent |
ANTHROPIC_AGENT_MODEL | claude-opus-4-7 | Agent 모델 |
ANTHROPIC_AGENT_EFFORT | high | 추론 노력 수준 |
OPENAI_API_KEY | — | fallback chat / KPI4 augment |
HF_TOKEN | — | gated HF 모델 |
PINECONE_API_KEY | — | 벡터DB |
KPI_LOG_LEVEL | INFO | 로깅 수준 |
KPI_NDJSON_DUMP | 0 | NDJSON 기록 |
KPI4_STUB_LATENCY_MS | 3 | 처리 지연 stub |
KPI3_STUB_TARGET | 0.90 | reference 반환 확률 |
KPI3_STUB_KEEP_RATIO | 0.3 | mangling 보존 비율 |
PUBLIC_ORIGIN | — | CORS 운영 도메인 |
SEED | 20260514 | 전역 시드 prefix |
KPI{1..7}_STUB_SEED | 같음 | KPI별 시드 |
DEPLOY_ID | local | 배포 ID (github.sha) |
ADMIN_LOG_TOKEN | — | /admin/logs 보호 |
VERCEL | — | Vercel 런타임 감지 |
7.3 운영 헬스체크 응답 실측 (2026-05-19 04:51 UTC)
{
"status": "ok",
"kpi_count": 7,
"results_dir": "/app/results",
"results_dir_writable": false,
"enable_real_pipeline": "true",
"enable_api_pipeline": "false",
"enable_finetuned_pipeline": "true",
"finetuned_kpi2_url_set": true,
"finetuned_kpi3_url_set": true,
"deploy_id": "f531aa5a2e3715c81406e8b1c4f340e74f1644b0",
"agent_available": true,
"agent_model": "claude-sonnet-4-5"
}