Skip to content

[AI Run] 발화문 분석과 누락 정보 API·실행 이력 구현 - #82

Open
hywznn wants to merge 7 commits into
mainfrom
feat/77-ai-run-demo
Open

[AI Run] 발화문 분석과 누락 정보 API·실행 이력 구현#82
hywznn wants to merge 7 commits into
mainfrom
feat/77-ai-run-demo

Conversation

@hywznn

@hywznn hywznn commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

왜 필요한가요?

Refs #77
Refs #24

프론트가 자연어 업무 요청을 보내도 이를 접수·조회하거나, Agent가 요청한 DB Slot을 보충한 뒤 HR의 추가 답변을 다시 전달할 API와 영속 리소스가 없었습니다.

무엇이 바뀌나요?

  • POST /api/v1/ai-runs: 단일 instructionIdempotency-Key를 받아 202로 접수합니다.
  • GET /api/v1/ai-runs/{aiRunId}: 실행 상태, 분석 결과, 질문, 후보를 조회합니다.
  • POST /api/v1/ai-runs/{aiRunId}/answers: HR 답변을 저장하고 새 AiAttempt로 ANALYZE를 재호출합니다.
  • V12: ai_run, ai_attempt, ai_question, ai_candidate와 tenant-aware FK·UNIQUE를 추가합니다.
  • V14: PostgreSQL RLS 정책을 준비합니다. V13feat: 근로자 보안 링크(Worker Link) 발급, 안내, 문서제출, 응답제출 구현 #76 Worker Link가 소유합니다.
  • PLAN → CONTEXT_REQUIRED → Server Slot 조회 → ANALYZE → NEEDS_INFO/REVIEW_REQUIRED 흐름을 연결합니다.
  • 같은 사업장·같은 Idempotency-Key·같은 발화문은 기존 Run을 반환하고, 다른 발화문이면 409를 반환합니다.
  • 생성과 답변 제출은 감사로그에 기록합니다.

Intent 입력 계약

  • 빠른 선택 태그는 Client 입력창에 예시 문구를 채우는 UI 기능으로만 사용합니다.
  • Client는 사용자가 최종 작성한 발화문만 instruction으로 전송합니다.
  • intentHint 필드와 , EXPIRY_RENEWAL 같은 Intent 접미사는 사용하지 않습니다.
  • Server는 Intent를 추가하거나 별도로 판정하지 않고 같은 instruction을 AI Runtime에 전달합니다.
  • 최종 Intent는 Runtime 응답의 detectedIntent를 저장·반환합니다.
  • POST /api/v1/ai-runs의 외부 API 구조는 변경되지 않습니다.
{
  "instruction": "응웬반안 체류연장 준비해줘"
}

데모 범위와 후속 작업

현재 PR은 대표 흐름을 빠르게 검증하기 위한 최소 세로 구현입니다. DB transaction을 닫은 뒤 Runtime을 호출하지만, 호출 완료 후 202를 반환하는 동기식 demo runner입니다. 서버 재시작에도 자동 복구되는 durable worker·retry·candidate decision은 #24 후속 범위로 남깁니다.

실제 AI Runtime은 아직 AI #6의 최소 camelCase 계약을 구현하지 않아 현재 422를 반환합니다. Server fixture 기반 왕복은 통과했으며 AI #6 반영 후 실제 Runtime smoke test를 다시 수행합니다.

검증

  • ./gradlew clean test — BUILD SUCCESSFUL
  • 원문 instruction 전달과 intentHint 미전송 확인
  • 태그 없는 발화문에도 Runtime의 detectedIntent가 최종 Intent로 저장되는지 확인
  • PostgreSQL 17에서 전체 테스트 — BUILD SUCCESSFUL
  • 단일 근로자 3 Attempt 대표 흐름 검증
  • 멱등성 재요청 및 payload 충돌 검증
  • 타 사업장 AiRun 404 검증
  • 감사로그와 PostgreSQL schema·tenant 격리·RLS 계약 검증

브라우저 통합 검증

  • 실제 Client 요청에서 Idempotency-Key CORS preflight 차단을 발견했습니다.
  • CorsConfig 허용 헤더와 OPTIONS 통합 테스트를 추가했습니다.
  • Client → Server → AiRun 저장 → 실제 AI Runtime 호출 → 실패 결과 화면 표시까지 확인했습니다.
  • 현재 실제 Runtime은 AI [Task Workflow] 업무카드·체크리스트·상태 전이 구현 #6 미반영으로 INVALID_REQUEST_CONTRACT를 반환합니다.
  • 성공 질문·답변·후보 흐름은 AiRunApiIntegrationTest와 Client 테스트로 검증했습니다.

병합 전 확인

hywznn added 3 commits August 4, 2026 10:40
AiRun, AiAttempt, Question, Candidate를 V12에 추가하고 사업장 격리 정책과 JDBC 저장소를 구현합니다. 멱등성 키는 원문 대신 SHA-256 hash를 저장하며 AI 버전과 지연 시간도 Attempt별로 추적합니다.
POST·GET·answers API를 추가하고 PLAN에서 사업장 범위 Slot을 해결한 뒤 ANALYZE로 이어지는 실행 흐름을 연결합니다. 요청과 답변 변경은 감사로그에 남기고 Runtime HTTP 호출 전후의 DB transaction을 분리합니다.
PLAN, Slot 조회, NEEDS_INFO, HR 답변, REVIEW_REQUIRED까지 세 Attempt가 남는 대표 흐름을 검증합니다. 멱등성 재요청, 타 사업장 404, 감사로그와 PostgreSQL schema 계약도 함께 확인합니다.
@hywznn
hywznn requested review from chaeliki and krestar August 4, 2026 01:42
@hywznn hywznn added area:server Spring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외 area:ai-integration Server ↔ AI Runtime 내부 계약·Client·검증·trace 연동 영역; Prompt·모델·Provider 구현은 ai 저장소 소유 priority:P0 MVP 진행을 막는 최우선 핵심 작업 type:feature 사용자 또는 Agent가 사용하는 기능 개발 labels Aug 4, 2026
hywznn and others added 2 commits August 4, 2026 16:14
빠른 선택 태그와 Intent 코드를 instruction에 덧붙이지 않도록 문서와 테스트 Fixture를 수정합니다. 최종 Intent는 AI Runtime이 반환한 detectedIntent를 사용하는 흐름을 검증합니다.
@hywznn
hywznn marked this pull request as ready for review August 4, 2026 08:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:ai-integration Server ↔ AI Runtime 내부 계약·Client·검증·trace 연동 영역; Prompt·모델·Provider 구현은 ai 저장소 소유 area:server Spring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외 priority:P0 MVP 진행을 막는 최우선 핵심 작업 type:feature 사용자 또는 Agent가 사용하는 기능 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants