You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Agent가 요구한 canonical Slot을 현재 사업장의 Worker DB에서 안전하게 조회하고, 같은 분석을 새로운 Attempt로 이어서 호출합니다.
Agent 분석만으로 Task를 자동 생성·승인·발송하지 않습니다.
쉽게 보는 흐름
PLAN: "발화문, INTENT_TAG" 분석
→ CONTEXT_REQUIRED: Agent가 필요한 Slot key 반환
→ Server: 사업장 안에서 근로자 확인 + 허용된 값만 DB 조회
→ ANALYZE: 같은 requestId·instruction으로 Agent 재호출
→ NEEDS_INFO 질문 또는 REVIEW_REQUIRED 후보
Agent는 SQL을 만들거나 Server DB에 직접 접근하지 않습니다.
확정한 계약
통신: Server ↔ AI Runtime은 REST·JSON이며 #56의 AiRuntimeClient만 사용
입력: 태그가 있으면 발화문, INTENT_TAG로 합친 instruction 문자열 하나만 전송
별도 intentHint 필드와 Intent 불일치 필드는 만들지 않음
Runtime 식별자: PLAN과 ANALYZE는 같은 requestId를 전송
Attempt 식별자: Runtime 호출마다 새 attemptId를 Server 내부에 먼저 기록하고 AI JSON에는 넣지 않음
대상: MVP에서는 요청 한 건당 Worker 한 명
이름 규칙: Knowledge required_slots.yaml의 접두사 없는 canonical key 사용
한 줄 목표
Agent가 요구한 canonical Slot을 현재 사업장의 Worker DB에서 안전하게 조회하고, 같은 분석을 새로운 Attempt로 이어서 호출합니다.
Agent 분석만으로 Task를 자동 생성·승인·발송하지 않습니다.
쉽게 보는 흐름
Agent는 SQL을 만들거나 Server DB에 직접 접근하지 않습니다.
확정한 계약
AiRuntimeClient만 사용발화문, INTENT_TAG로 합친instruction문자열 하나만 전송intentHint필드와 Intent 불일치 필드는 만들지 않음requestId를 전송attemptId를 Server 내부에 먼저 기록하고 AI JSON에는 넣지 않음required_slots.yaml의 접두사 없는 canonical key 사용worker_id,stay_expiry_date,contract_end_dateworker.stay_expiry_date, DB column명, SQL 표현식detectedIntent와 활성 Workflow Catalog로 결정202 + aiRunId와 GET polling 사용, SSE는 [AI Run][P1] Client용 AiRun 진행 상태 SSE 구독 추가 #75 후속 범위Runtime 계약 예시
Agent가 DB 정보를 요청합니다.
{ "outcome": "CONTEXT_REQUIRED", "contextRequirement": { "detectedIntent": "EXPIRY_RENEWAL", "confidence": 0.94, "targetDisplayName": "응웬반안", "extractedSlots": {}, "requiredFieldKeys": [ "worker_id", "stay_expiry_date", "contract_end_date" ] } }Server가 허용된 값만 넣어 재호출합니다.
{ "requestId": "10000000-0000-0000-0000-000000000001", "phase": "ANALYZE", "analysisInput": { "instruction": "응웬반안 체류연장 준비해줘, EXPIRY_RENEWAL", "requestedFieldKeys": [ "worker_id", "stay_expiry_date", "contract_end_date" ], "workers": [ { "workerRef": "worker-uuid", "requestedFields": { "worker_id": "worker-uuid", "stay_expiry_date": "2026-09-30", "contract_end_date": "2026-08-31" } } ] } }Server 작업 범위
1. Slot Resolver
targetDisplayName을 현재companyId안에서 정확히 한 명의 Worker로 확인switch매핑으로 값 조회resolvedFields,missingFieldKeys,forbiddenFieldKeys구분2. Agent 재호출
instruction과requestId유지attemptId를 발급·기록하는 Port 호출CONTEXT_REQUIRED,NEEDS_INFO,REVIEW_REQUIRED결과 구분3. #24와 연결
#74에서는 Attempt 기록 Port와 오케스트레이션 규칙을 먼저 만들고 Fake로 순서를 검증합니다. #24가 V12 저장소를 구현할 때 이 Port를 PostgreSQL AiAttempt 기록으로 연결합니다.
테스트 완료 기준
PLAN → CONTEXT_REQUIRED → ANALYZE에서 Runtime의 requestId는 같고 Server 내부 attemptId는 달라짐instruction이 ANALYZE에도 그대로 유지됨현재 DB에서 조회 가능한 범위
worker_idstay_expiry_datecontract_end_datelegal_name, 여권번호, 외국인등록번호, 전화번호 등은 현재 Worker 운영 테이블에 없으므로 DB에서 임의 생성하지 않습니다. 추후 별도 민감정보 저장 정책과 Schema가 확정되기 전에는 누락 값으로 처리합니다.의존 관계
required_slots.yaml과 활성 Workflow projection범위 밖