[AI 연동] AI Runtime HTTP 연결과 장애 격리 구현 - #56
Conversation
표준 Bearer 인증과 요청 추적 헤더를 사용해 versioned internal API를 정확히 한 번 호출합니다. 기본 비활성화 설정, 전체 deadline, 동시 호출 제한, circuit breaker, 응답 크기 및 JSON 검증을 추가합니다.
WireMock standalone으로 인증·추적 헤더, camelCase 요청, strict JSON 응답을 검증합니다. 자동 재시도 금지, deadline, 응답 크기, bulkhead와 circuit breaker 동작을 함께 확인합니다.
초보자도 설정과 장애 코드를 이해할 수 있도록 기본 비활성화 이유, 배포 순서, 오류별 대응을 문서화합니다. ADR에 맞춰 표준 Authorization Bearer 인증과 요청 추적 규칙을 명시합니다.
AI 후보가 요청에 포함된 stay_expiry_date를 다른 값으로 바꾸면 CORE_VALUE_MISMATCH로 거부합니다.
krestar
left a comment
There was a problem hiding this comment.
408 타임아웃이 INVALID_REQUEST_CONTRACT로 처리되는걸로 보이는데, 문제 없을 것 같으면 나머지 리뷰 포인트 2~4번은 적절해보여서 PR 내용 괜찮아 보입니다
analysisInput과 requestedFields 계약을 원격 호출에 반영하고 Server 기준 체류만료일 보존 검증을 유지합니다. V11은 Worker Link 브랜치 소유로 두며 이 PR에는 Flyway migration을 추가하지 않습니다.
리뷰 의견에 따라 HTTP 408을 요청 계약 오류가 아닌 DEADLINE_EXCEEDED로 변환하고 WireMock 회귀 테스트를 추가합니다.
|
참고용 형식 joson |
|
헤더 인증 관련 형식 |
There was a problem hiding this comment.
기존에 커멘트했던 408 응답이 DEADLINE_EXCEEDED로 분리된 것 확인했습니다.
analysisInput.workers[].requestedFields 구조와 camelCase 전송은 현재 Server 문서, fixture 기준으로 적절해 보입니다.
AiRuntimeFailureCode도 #24 진단에 필요한 주요 유형 포함하고 있는 것 같네요.
15초 timeout, 동시 호출 8개, 5회 실패, 30초 차단은 데모 기본값으로 무난하며, 기본 비활성화와 Secret 주입 방식도 적절해 보입니다.
|
PLAN/ANALYZE 통신 계약을 최신 요구사항에 맞춰 추가했습니다.
커밋: 6af9bb6 AI팀에는 fowoco/ai#6 에서 |
|
입력 계약을 단순화했습니다 (
로컬 전체 테스트: |
krestar
left a comment
There was a problem hiding this comment.
확인했습니다
직접 접근 논의 있던걸로 기억하는데, AI 모델이 DB 직접 접근 안하는걸로 반확정 났나보네요
어쩔수없죠 .. 원래는 그게 맞으니까 |
연결
목표
Server가
fowoco/aiRuntime을 REST로 한 번 호출하고, 인증·timeout·응답 검증·장애 격리를 담당합니다.최종 최소 요청 계약
Endpoint:
POST /internal/v1/analysesPLAN
{ "requestId": "10000000-0000-0000-0000-000000000001", "phase": "PLAN", "analysisInput": { "instruction": "응웬반안 체류연장 준비해줘, EXPIRY_RENEWAL" } }ANALYZE 핵심
{ "requestId": "10000000-0000-0000-0000-000000000001", "phase": "ANALYZE", "analysisInput": { "instruction": "응웬반안 체류연장 준비해줘, EXPIRY_RENEWAL", "requestedFieldKeys": ["worker_id", "stay_expiry_date", "due_at"], "workers": [{ "workerRef": "worker-uuid", "requestedFields": { "worker_id": "worker-uuid", "stay_expiry_date": "2026-09-30" } }] } }requestId하나입니다.attemptId, contract/knowledge version, deadline은 Server 내부에서 관리합니다.발화문, INTENT_TAG로instruction에 포함합니다.Server 내부 관리
attemptId: PLAN·ANALYZE·retry 호출을 구분해 [AI Run] 비동기 실행 상태·재시도·멱등성 구현 #24 AiAttempt에 저장RemoteAiRuntimeClient가 Server timeout으로 적용requestId, version, Worker·Workflow·Slot 핵심값을 다시 검증구현 범위
X-Request-Id, 선택적traceparentAI_RUNTIME_ENABLED=false데이터 경계
requestedFields에 전달합니다.검증
./gradlew clean test범위 밖