@yolo-croket-dev/entity-v2 0.2.141-jun.1 → 0.2.141-jun.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -59,6 +59,7 @@ export * from './cart-second-push-log';
59
59
  export * from './cart-third-push-log';
60
60
  export * from './store-item-naver-feed';
61
61
  export * from './store-item-naver-feed-guard';
62
+ export * from './naver-policy-ai-review';
62
63
  export * from './brand.modules/naver-brand-dictionary';
63
64
  export * from './buyma-item.modules';
64
65
  export * from './campaign-store-item';
package/index.js CHANGED
@@ -75,6 +75,7 @@ __exportStar(require("./cart-second-push-log"), exports);
75
75
  __exportStar(require("./cart-third-push-log"), exports);
76
76
  __exportStar(require("./store-item-naver-feed"), exports);
77
77
  __exportStar(require("./store-item-naver-feed-guard"), exports);
78
+ __exportStar(require("./naver-policy-ai-review"), exports);
78
79
  __exportStar(require("./brand.modules/naver-brand-dictionary"), exports);
79
80
  __exportStar(require("./buyma-item.modules"), exports);
80
81
  __exportStar(require("./campaign-store-item"), exports);
@@ -0,0 +1,66 @@
1
+ import { Types } from 'mongoose';
2
+ import { NaverPolicyAiReviewDecisionEnum, NaverPolicyAiReviewTextSourceTypeEnum } from './enum';
3
+ /** @description 네이버 정책 AI 검수 후보 문장 */
4
+ export interface NaverPolicyAiReviewCandidate {
5
+ /** @description 후보 문장이 추출된 원본 텍스트 종류 */
6
+ sourceType: NaverPolicyAiReviewTextSourceTypeEnum;
7
+ /** @description 텍스트 원본을 식별하기 위한 내부 id 또는 path */
8
+ sourceId?: string;
9
+ /** @description OCR 이미지 후보일 때 원본 이미지를 식별하는 md5sum */
10
+ imageMd5?: string;
11
+ /** @description 후보를 추출한 룰 id */
12
+ ruleId: string;
13
+ /** @description 후보가 속한 정책 위험 카테고리 */
14
+ category: string;
15
+ /** @description 룰에 매칭된 핵심 단어 목록 */
16
+ matchedTerms: string[];
17
+ /** @description 후보 문장 바로 앞 문맥 */
18
+ beforeText?: string;
19
+ /** @description AI 검수 대상이 되는 핵심 후보 문장 */
20
+ exactText: string;
21
+ /** @description 후보 문장 바로 뒤 문맥 */
22
+ afterText?: string;
23
+ /** @description OCR 저신뢰도처럼 후보 해석에 참고할 품질 플래그 */
24
+ qualityFlags?: string[];
25
+ }
26
+ /** @description 네이버 정책 AI 검수 후보별 판정 결과 */
27
+ export interface NaverPolicyAiReviewCandidateResult {
28
+ /** @description candidates 배열에서 해당 후보가 위치한 index */
29
+ candidateIndex: number;
30
+ /** @description 후보 단위 AI 판정 */
31
+ decision: NaverPolicyAiReviewDecisionEnum;
32
+ /** @description 판정 사유를 분류하기 위한 코드 */
33
+ reasonCode: string;
34
+ /** @description 후보 판정 confidence. 0부터 1 사이 값을 기대합니다. */
35
+ confidence: number;
36
+ /** @description 사람이 이해할 수 있는 후보 판정 사유 */
37
+ reason: string;
38
+ /** @description 후보 판정 출처. AI 직접 호출 또는 후보 cache 재사용 여부를 나타냅니다. */
39
+ reviewSource?: 'AI' | 'CACHE';
40
+ /** @description candidate cache를 사용한 후보인지 여부 */
41
+ cacheHit?: boolean;
42
+ /** @description 재사용한 candidate cache 문서 id */
43
+ cacheId?: Types.ObjectId | string;
44
+ /** @description 후보 cache를 조회할 때 사용한 key */
45
+ cacheKey?: string;
46
+ }
47
+ /** @description 네이버 정책 AI 검수 오류 요약 */
48
+ export interface NaverPolicyAiReviewErrorSummary {
49
+ /** @description 오류를 분류하기 위한 코드 */
50
+ code: string;
51
+ /** @description 운영자 또는 개발자가 확인할 오류 메시지 */
52
+ message: string;
53
+ /** @description 오류가 발생한 시각 */
54
+ occurredAt: Date;
55
+ }
56
+ /** @description AI provider가 반환한 토큰 사용량 */
57
+ export interface NaverPolicyAiReviewTokenUsage {
58
+ /** @description provider 요청 입력 토큰 수 */
59
+ promptTokenCount?: number;
60
+ /** @description provider 응답 출력 토큰 수 */
61
+ candidatesTokenCount?: number;
62
+ /** @description 입력과 출력을 합산한 전체 토큰 수 */
63
+ totalTokenCount?: number;
64
+ /** @description Gemini thinking 계열 모델에서 반환될 수 있는 사고 토큰 수 */
65
+ thoughtsTokenCount?: number;
66
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,43 @@
1
+ /** @description 네이버 정책 AI 검수 채널 */
2
+ export declare enum NaverPolicyAiReviewChannelEnum {
3
+ /** @description 네이버 SA/쇼핑 연동 정책 검수 채널 */
4
+ NAVER = "NAVER"
5
+ }
6
+ /** @description 네이버 정책 AI 검수 결과 문서의 처리 상태 */
7
+ export declare enum NaverPolicyAiReviewStatusEnum {
8
+ /** @description 검수 요청은 생성됐지만 아직 AI 검수가 시작되지 않은 상태 */
9
+ WAITING = "waiting",
10
+ /** @description AI 검수 처리 중 실패가 발생해 운영 확인이 필요한 상태 */
11
+ FAIL = "fail",
12
+ /** @description AI 검수 처리가 정상 종료된 상태 */
13
+ SUCCESS = "success"
14
+ }
15
+ /** @description 네이버 정책 AI 검수 최종 판정 */
16
+ export declare enum NaverPolicyAiReviewDecisionEnum {
17
+ /** @description 네이버 연동을 계속 진행해도 되는 상품 */
18
+ ALLOW = "ALLOW",
19
+ /** @description 자동 차단은 하지 않지만 운영자 확인이 필요한 상품 */
20
+ REVIEW = "REVIEW",
21
+ /** @description 네이버 패널티 위험이 높아 운영자 우선 확인과 연동 제외 검토가 필요한 상품 */
22
+ BLOCK = "BLOCK"
23
+ }
24
+ /** @description 네이버 정책 AI 검수 시도 로그의 처리 상태 */
25
+ export declare enum NaverPolicyAiReviewLogStatusEnum {
26
+ /** @description AI 검수 시도가 정상 종료된 로그 */
27
+ SUCCESS = "SUCCESS",
28
+ /** @description AI 검수 시도 중 오류가 발생한 로그 */
29
+ FAILED = "FAILED"
30
+ }
31
+ /** @description 네이버 정책 AI 검수에 사용된 텍스트 출처 */
32
+ export declare enum NaverPolicyAiReviewTextSourceTypeEnum {
33
+ /** @description 상품명에서 추출한 텍스트. v1에서는 예약 값입니다. */
34
+ PRODUCT_NAME = "PRODUCT_NAME",
35
+ /** @description 옵션명 또는 옵션값에서 추출한 텍스트. v1에서는 예약 값입니다. */
36
+ OPTION_NAME = "OPTION_NAME",
37
+ /** @description 상품 상세 설명 텍스트 */
38
+ DETAIL_TEXT = "DETAIL_TEXT",
39
+ /** @description 상품 HTML 상세에서 태그를 제거해 만든 텍스트 */
40
+ DETAIL_HTML_TEXT = "DETAIL_HTML_TEXT",
41
+ /** @description 상품 이미지 OCR 결과 텍스트 */
42
+ IMAGE_OCR = "IMAGE_OCR"
43
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NaverPolicyAiReviewTextSourceTypeEnum = exports.NaverPolicyAiReviewLogStatusEnum = exports.NaverPolicyAiReviewDecisionEnum = exports.NaverPolicyAiReviewStatusEnum = exports.NaverPolicyAiReviewChannelEnum = void 0;
4
+ /** @description 네이버 정책 AI 검수 채널 */
5
+ var NaverPolicyAiReviewChannelEnum;
6
+ (function (NaverPolicyAiReviewChannelEnum) {
7
+ /** @description 네이버 SA/쇼핑 연동 정책 검수 채널 */
8
+ NaverPolicyAiReviewChannelEnum["NAVER"] = "NAVER";
9
+ })(NaverPolicyAiReviewChannelEnum = exports.NaverPolicyAiReviewChannelEnum || (exports.NaverPolicyAiReviewChannelEnum = {}));
10
+ /** @description 네이버 정책 AI 검수 결과 문서의 처리 상태 */
11
+ var NaverPolicyAiReviewStatusEnum;
12
+ (function (NaverPolicyAiReviewStatusEnum) {
13
+ /** @description 검수 요청은 생성됐지만 아직 AI 검수가 시작되지 않은 상태 */
14
+ NaverPolicyAiReviewStatusEnum["WAITING"] = "waiting";
15
+ /** @description AI 검수 처리 중 실패가 발생해 운영 확인이 필요한 상태 */
16
+ NaverPolicyAiReviewStatusEnum["FAIL"] = "fail";
17
+ /** @description AI 검수 처리가 정상 종료된 상태 */
18
+ NaverPolicyAiReviewStatusEnum["SUCCESS"] = "success";
19
+ })(NaverPolicyAiReviewStatusEnum = exports.NaverPolicyAiReviewStatusEnum || (exports.NaverPolicyAiReviewStatusEnum = {}));
20
+ /** @description 네이버 정책 AI 검수 최종 판정 */
21
+ var NaverPolicyAiReviewDecisionEnum;
22
+ (function (NaverPolicyAiReviewDecisionEnum) {
23
+ /** @description 네이버 연동을 계속 진행해도 되는 상품 */
24
+ NaverPolicyAiReviewDecisionEnum["ALLOW"] = "ALLOW";
25
+ /** @description 자동 차단은 하지 않지만 운영자 확인이 필요한 상품 */
26
+ NaverPolicyAiReviewDecisionEnum["REVIEW"] = "REVIEW";
27
+ /** @description 네이버 패널티 위험이 높아 운영자 우선 확인과 연동 제외 검토가 필요한 상품 */
28
+ NaverPolicyAiReviewDecisionEnum["BLOCK"] = "BLOCK";
29
+ })(NaverPolicyAiReviewDecisionEnum = exports.NaverPolicyAiReviewDecisionEnum || (exports.NaverPolicyAiReviewDecisionEnum = {}));
30
+ /** @description 네이버 정책 AI 검수 시도 로그의 처리 상태 */
31
+ var NaverPolicyAiReviewLogStatusEnum;
32
+ (function (NaverPolicyAiReviewLogStatusEnum) {
33
+ /** @description AI 검수 시도가 정상 종료된 로그 */
34
+ NaverPolicyAiReviewLogStatusEnum["SUCCESS"] = "SUCCESS";
35
+ /** @description AI 검수 시도 중 오류가 발생한 로그 */
36
+ NaverPolicyAiReviewLogStatusEnum["FAILED"] = "FAILED";
37
+ })(NaverPolicyAiReviewLogStatusEnum = exports.NaverPolicyAiReviewLogStatusEnum || (exports.NaverPolicyAiReviewLogStatusEnum = {}));
38
+ /** @description 네이버 정책 AI 검수에 사용된 텍스트 출처 */
39
+ var NaverPolicyAiReviewTextSourceTypeEnum;
40
+ (function (NaverPolicyAiReviewTextSourceTypeEnum) {
41
+ /** @description 상품명에서 추출한 텍스트. v1에서는 예약 값입니다. */
42
+ NaverPolicyAiReviewTextSourceTypeEnum["PRODUCT_NAME"] = "PRODUCT_NAME";
43
+ /** @description 옵션명 또는 옵션값에서 추출한 텍스트. v1에서는 예약 값입니다. */
44
+ NaverPolicyAiReviewTextSourceTypeEnum["OPTION_NAME"] = "OPTION_NAME";
45
+ /** @description 상품 상세 설명 텍스트 */
46
+ NaverPolicyAiReviewTextSourceTypeEnum["DETAIL_TEXT"] = "DETAIL_TEXT";
47
+ /** @description 상품 HTML 상세에서 태그를 제거해 만든 텍스트 */
48
+ NaverPolicyAiReviewTextSourceTypeEnum["DETAIL_HTML_TEXT"] = "DETAIL_HTML_TEXT";
49
+ /** @description 상품 이미지 OCR 결과 텍스트 */
50
+ NaverPolicyAiReviewTextSourceTypeEnum["IMAGE_OCR"] = "IMAGE_OCR";
51
+ })(NaverPolicyAiReviewTextSourceTypeEnum = exports.NaverPolicyAiReviewTextSourceTypeEnum || (exports.NaverPolicyAiReviewTextSourceTypeEnum = {}));
@@ -0,0 +1,5 @@
1
+ export * from './common.entity';
2
+ export * from './enum';
3
+ export * from './naver-policy-ai-review-candidate-cache.entity';
4
+ export * from './naver-policy-ai-review-log.entity';
5
+ export * from './naver-policy-ai-review-result.entity';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./common.entity"), exports);
18
+ __exportStar(require("./enum"), exports);
19
+ __exportStar(require("./naver-policy-ai-review-candidate-cache.entity"), exports);
20
+ __exportStar(require("./naver-policy-ai-review-log.entity"), exports);
21
+ __exportStar(require("./naver-policy-ai-review-result.entity"), exports);
@@ -0,0 +1,74 @@
1
+ import { Types } from 'mongoose';
2
+ import { NaverPolicyAiReviewDecisionEnum, NaverPolicyAiReviewTextSourceTypeEnum } from './enum';
3
+ /**
4
+ * @author jun
5
+ * @description 네이버 정책 AI 검수 후보 단위 cache 데이터
6
+ */
7
+ export interface NaverPolicyAiReviewCandidateCacheEntity {
8
+ /** @description cache 문서 id */
9
+ _id: Types.ObjectId | string;
10
+ /** @description 후보 cache를 유일하게 식별하는 hash key */
11
+ cacheKey: string;
12
+ /** @description cache 대상 후보의 텍스트 출처. v1은 IMAGE_OCR만 사용합니다. */
13
+ sourceType: NaverPolicyAiReviewTextSourceTypeEnum;
14
+ /** @description IMAGE_OCR 후보일 때 원본 이미지 md5sum */
15
+ imageMd5: string;
16
+ /** @description OCR 원문 또는 정규화 텍스트의 hash */
17
+ ocrTextHash: string;
18
+ /** @description OCR engine 이름 */
19
+ ocrEngine?: string;
20
+ /** @description OCR engine 버전 */
21
+ ocrEngineVersion?: string;
22
+ /** @description OCR 전처리 버전 */
23
+ preprocessVersion?: string;
24
+ /** @description 네이버 정책 정의 버전 */
25
+ policyVersion: string;
26
+ /** @description 후보 추출 룰셋 버전 */
27
+ ruleSetVersion: string;
28
+ /** @description 후보 추출기 구현 버전 */
29
+ candidateExtractorVersion: string;
30
+ /** @description AI 프롬프트 버전 */
31
+ promptVersion: string;
32
+ /** @description AI provider 이름 */
33
+ modelProvider: string;
34
+ /** @description 호출한 AI 모델명 */
35
+ modelName: string;
36
+ /** @description provider가 제공하는 모델 세부 버전 */
37
+ modelVersion?: string;
38
+ /** @description 후보를 추출한 룰 id */
39
+ ruleId: string;
40
+ /** @description 후보가 속한 정책 위험 카테고리 */
41
+ category: string;
42
+ /** @description exactText, beforeText, afterText, category를 정규화해 만든 hash */
43
+ candidateContextHash: string;
44
+ /** @description AI 검수 대상이 되는 핵심 후보 문장 */
45
+ exactText: string;
46
+ /** @description 후보 문장 바로 앞 문맥 */
47
+ beforeText?: string;
48
+ /** @description 후보 문장 바로 뒤 문맥 */
49
+ afterText?: string;
50
+ /** @description 룰에 매칭된 핵심 단어 목록 */
51
+ matchedTerms: string[];
52
+ /** @description OCR 저신뢰도처럼 후보 해석에 참고할 품질 플래그 */
53
+ qualityFlags?: string[];
54
+ /** @description 후보 단위 AI 판정 */
55
+ decision: NaverPolicyAiReviewDecisionEnum;
56
+ /** @description 후보 판정 confidence */
57
+ confidence: number;
58
+ /** @description 판정 사유를 분류하기 위한 코드 */
59
+ reasonCode: string;
60
+ /** @description 사람이 이해할 수 있는 후보 판정 사유 */
61
+ reason: string;
62
+ /** @description 이 cache row를 최초 생성한 AI 검수 결과 id */
63
+ sourceReviewResultId?: Types.ObjectId | string;
64
+ /** @description 이 cache row를 최초 생성한 AI 검수 로그 id */
65
+ sourceReviewLogId?: Types.ObjectId | string;
66
+ /** @description cache hit 누적 횟수 */
67
+ hitCount: number;
68
+ /** @description 마지막 cache hit 시각 */
69
+ lastHitAt?: Date;
70
+ /** @description 문서 생성 시각 */
71
+ createdAt: Date;
72
+ /** @description 문서 마지막 수정 시각 */
73
+ updatedAt: Date;
74
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,79 @@
1
+ import { Types } from 'mongoose';
2
+ import { NaverPolicyAiReviewCandidate, NaverPolicyAiReviewCandidateResult, NaverPolicyAiReviewErrorSummary, NaverPolicyAiReviewTokenUsage } from './common.entity';
3
+ import { NaverPolicyAiReviewChannelEnum, NaverPolicyAiReviewDecisionEnum, NaverPolicyAiReviewLogStatusEnum } from './enum';
4
+ /** @description 네이버 정책 AI 검수 로그에 저장하는 provider 요청 스냅샷 */
5
+ export interface NaverPolicyAiReviewRequestPayload {
6
+ /** @description AI 검수에 전달한 후보 목록 */
7
+ candidates: NaverPolicyAiReviewCandidate[];
8
+ /** @description 네이버 정책 정의 버전 */
9
+ policyVersion: string;
10
+ /** @description 후보 추출 룰셋 버전 */
11
+ ruleSetVersion: string;
12
+ /** @description 후보 추출기 구현 버전 */
13
+ candidateExtractorVersion: string;
14
+ /** @description AI 프롬프트 버전 */
15
+ promptVersion: string;
16
+ /** @description AI provider 이름 */
17
+ modelProvider: string;
18
+ /** @description 호출한 AI 모델명 */
19
+ modelName: string;
20
+ /** @description provider가 제공하는 모델 세부 버전 */
21
+ modelVersion?: string;
22
+ }
23
+ /** @description 네이버 정책 AI 검수 로그에 저장하는 provider 응답 스냅샷 */
24
+ export interface NaverPolicyAiReviewResponseResult {
25
+ /** @description AI가 반환한 상품 단위 최종 판정 */
26
+ productDecision: NaverPolicyAiReviewDecisionEnum;
27
+ /** @description AI가 반환한 상품 단위 confidence */
28
+ productConfidence: number;
29
+ /** @description AI가 반환한 후보별 판정 결과 */
30
+ candidateResults: NaverPolicyAiReviewCandidateResult[];
31
+ /** @description AI provider가 반환한 토큰 사용량 */
32
+ tokenUsage?: NaverPolicyAiReviewTokenUsage;
33
+ /** @description 후보 cache를 재사용한 후보 수 */
34
+ cacheHitCount?: number;
35
+ /** @description 후보 cache를 재사용하지 못한 후보 수 */
36
+ cacheMissCount?: number;
37
+ /** @description 실제 AI provider에 요청한 후보 수 */
38
+ aiRequestedCandidateCount?: number;
39
+ }
40
+ /**
41
+ * @author jun
42
+ * @description 네이버 정책 AI 검수 시도 로그 데이터
43
+ */
44
+ export interface NaverPolicyAiReviewLogEntity {
45
+ /** @description AI 검수 시도 로그 문서 id */
46
+ _id: Types.ObjectId | string;
47
+ /** @description 이 시도가 연결된 AI 검수 결과 문서 id */
48
+ naverPolicyAiReviewResultId: Types.ObjectId | string;
49
+ /** @description 검수 대상 guard 문서 id */
50
+ guardId: Types.ObjectId | string;
51
+ /** @description 상품 기준 검수일 때 연결되는 상품 id */
52
+ productId?: Types.ObjectId | string;
53
+ /** @description 상품 판매자 id. 운영자 필터와 통계에 사용합니다. */
54
+ sellerId?: Types.ObjectId | string;
55
+ /** @description 검수 채널 */
56
+ channel: NaverPolicyAiReviewChannelEnum;
57
+ /** @description 같은 result 안에서 몇 번째 시도인지 나타내는 번호 */
58
+ attemptNo: number;
59
+ /** @description AI 검수 시도 성공 또는 실패 상태 */
60
+ status: NaverPolicyAiReviewLogStatusEnum;
61
+ /** @description AI provider에 전달한 요청 스냅샷 */
62
+ payload: NaverPolicyAiReviewRequestPayload;
63
+ /** @description AI provider가 반환한 응답 스냅샷 */
64
+ result?: NaverPolicyAiReviewResponseResult;
65
+ /** @description AI 검수 시도 실패 시 저장하는 오류 요약 */
66
+ error?: NaverPolicyAiReviewErrorSummary;
67
+ /** @description AI 검수를 실행한 worker id */
68
+ workerId?: string;
69
+ /** @description AI 검수를 실행한 host 이름 */
70
+ hostname?: string;
71
+ /** @description AI 검수 시도 시작 시각 */
72
+ startedAt: Date;
73
+ /** @description AI 검수 시도 종료 시각 */
74
+ finishedAt?: Date;
75
+ /** @description AI 검수 시도 처리 시간 */
76
+ processingTimeMs?: number;
77
+ /** @description 로그 문서 생성 시각 */
78
+ createdAt: Date;
79
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,69 @@
1
+ import { Types } from 'mongoose';
2
+ import { NaverPolicyAiReviewCandidate, NaverPolicyAiReviewCandidateResult, NaverPolicyAiReviewErrorSummary, NaverPolicyAiReviewTokenUsage } from './common.entity';
3
+ import { NaverPolicyAiReviewChannelEnum, NaverPolicyAiReviewDecisionEnum, NaverPolicyAiReviewStatusEnum } from './enum';
4
+ /**
5
+ * @author jun
6
+ * @description 네이버 정책 AI 검수 결과 데이터
7
+ */
8
+ export interface NaverPolicyAiReviewResultEntity {
9
+ /** @description 검수 결과 문서 id */
10
+ _id: Types.ObjectId | string;
11
+ /** @description 검수 대상 guard 문서 id */
12
+ guardId: Types.ObjectId | string;
13
+ /** @description 상품 기준 검수일 때 연결되는 상품 id */
14
+ productId?: Types.ObjectId | string;
15
+ /** @description 상품 판매자 id. 운영자 필터와 통계에 사용합니다. */
16
+ sellerId?: Types.ObjectId | string;
17
+ /** @description 검수 채널 */
18
+ channel: NaverPolicyAiReviewChannelEnum;
19
+ /** @description AI 검수 결과 문서의 처리 상태 */
20
+ status: NaverPolicyAiReviewStatusEnum;
21
+ /** @description AI 검수 결과의 최종 판정 */
22
+ decision?: NaverPolicyAiReviewDecisionEnum;
23
+ /** @description 네이버 정책 정의 버전 */
24
+ policyVersion: string;
25
+ /** @description 후보 추출 룰셋 버전 */
26
+ ruleSetVersion: string;
27
+ /** @description 후보 추출기 구현 버전 */
28
+ candidateExtractorVersion: string;
29
+ /** @description AI 프롬프트 버전 */
30
+ promptVersion: string;
31
+ /** @description AI provider 이름 */
32
+ modelProvider: string;
33
+ /** @description 호출한 AI 모델명 */
34
+ modelName: string;
35
+ /** @description provider가 제공하는 모델 세부 버전 */
36
+ modelVersion?: string;
37
+ /** @description AI 검수에 사용한 후보 수 */
38
+ candidateCount: number;
39
+ /** @description 운영자 리스트에서 빠르게 볼 후보 요약 */
40
+ candidateSummary?: string;
41
+ /** @description AI가 상품 단위로 반환한 confidence */
42
+ aiConfidence?: number;
43
+ /** @description AI provider가 반환한 토큰 사용량. 요금/사용량 집계에 사용합니다. */
44
+ tokenUsage?: NaverPolicyAiReviewTokenUsage;
45
+ /** @description 후보 cache를 재사용한 후보 수 */
46
+ cacheHitCount?: number;
47
+ /** @description 후보 cache를 재사용하지 못한 후보 수 */
48
+ cacheMissCount?: number;
49
+ /** @description 실제 AI provider에 요청한 후보 수 */
50
+ aiRequestedCandidateCount?: number;
51
+ /** @description 최종 판정에 연결된 사유 코드 목록 */
52
+ reasonCodes: string[];
53
+ /** @description AI 검수에 전달한 후보 문장 스냅샷 */
54
+ candidates: NaverPolicyAiReviewCandidate[];
55
+ /** @description 후보별 AI 판정 결과 */
56
+ candidateResults: NaverPolicyAiReviewCandidateResult[];
57
+ /** @description AI 검수를 시도한 횟수 */
58
+ attempts: number;
59
+ /** @description 마지막 AI 검수 시도 로그 id */
60
+ lastAttemptId?: Types.ObjectId | string;
61
+ /** @description 마지막 실패가 발생했을 때의 오류 요약 */
62
+ lastError?: NaverPolicyAiReviewErrorSummary;
63
+ /** @description AI 검수가 완료된 시각 */
64
+ reviewedAt?: Date;
65
+ /** @description 문서 생성 시각 */
66
+ createdAt: Date;
67
+ /** @description 문서 마지막 수정 시각 */
68
+ updatedAt: Date;
69
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yolo-croket-dev/entity-v2",
3
- "version": "0.2.141-jun.1",
3
+ "version": "0.2.141-jun.11",
4
4
  "main": "index.js",
5
5
  "author": "Yolo Co., Ltd.",
6
6
  "description": "크로켓 nest 용 entity-v3",
@@ -1,4 +1,5 @@
1
1
  import { Types } from 'mongoose';
2
+ import { NaverPolicyAiReviewDecisionEnum } from '../naver-policy-ai-review';
2
3
  /** @description 네이버 연동 상품 검수 종류 */
3
4
  export declare enum StoreItemNaverFeedGuardTypeEnum {
4
5
  /** 네이버 연동 상품 */
@@ -16,8 +17,12 @@ export declare enum StoreItemNaverFeedGuardStatusEnum {
16
17
  WAITING = "WAITING",
17
18
  /** 검수 시작 */
18
19
  STARTED = "STARTED",
20
+ /** 이미지 md5sum 조회 진행중 */
21
+ MD5SUM_CHECKING = "MD5SUM_CHECKING",
19
22
  /** OCR 체크 진행중 */
20
23
  OCR_CHECKING = "OCR_CHECKING",
24
+ /** OCR 체크 완료 */
25
+ OCR_COMPLETED = "OCR_COMPLETED",
21
26
  /** AI 체크 진행중 */
22
27
  AI_CHECKING = "AI_CHECKING",
23
28
  /** 검수 완료 */
@@ -25,6 +30,23 @@ export declare enum StoreItemNaverFeedGuardStatusEnum {
25
30
  /** 에러 발생 */
26
31
  ERROR = "ERROR"
27
32
  }
33
+ /** @description 네이버 연동 상품 검수 오류 종류 */
34
+ export declare enum StoreItemNaverFeedGuardErrorTypeEnum {
35
+ /** 이미지 md5sum 조회 실패 */
36
+ MD5SUM_CHECK_FAILED = "MD5SUM_CHECK_FAILED",
37
+ /** OCR 요청 발행 실패 */
38
+ OCR_REQUEST_FAILED = "OCR_REQUEST_FAILED",
39
+ /** OCR 처리 실패 */
40
+ OCR_PROCESS_FAILED = "OCR_PROCESS_FAILED",
41
+ /** OCR completion이 도착하지 않아 검수 진행 상태가 멈춤 */
42
+ OCR_CHECK_STALLED = "OCR_CHECK_STALLED",
43
+ /** OCR은 완료됐지만 AI 검수 요청 발행이 확인되지 않음 */
44
+ AI_REVIEW_REQUEST_FAILED = "AI_REVIEW_REQUEST_FAILED",
45
+ /** AI 검수 진행 상태가 오래 멈춤 */
46
+ AI_REVIEW_STALLED = "AI_REVIEW_STALLED",
47
+ /** AI 검수 실패 */
48
+ AI_REVIEW_FAILED = "AI_REVIEW_FAILED"
49
+ }
28
50
  /** @description 네이버 연동 상품 검수 이미지 OCR 상태 */
29
51
  export declare enum StoreItemNaverFeedGuardImageOcrStatusEnum {
30
52
  /** OCR 대기 */
@@ -42,6 +64,12 @@ export interface StoreItemNaverFeedGuardImage {
42
64
  url: string;
43
65
  /** @description 이미지 md5sum */
44
66
  md5sum?: string;
67
+ /** @description OCR 대상 이미지가 저장된 R2 object key */
68
+ r2Key?: string;
69
+ /** @description OCR 대상 이미지가 저장된 R2 bucket */
70
+ r2Bucket?: string;
71
+ /** @description OCR 결과 아이디 */
72
+ ocrAttemptResultId?: Types.ObjectId | string;
45
73
  /** @description 이미지 검수 처리 오류 사유 */
46
74
  errorReason?: string;
47
75
  /** @description OCR 상태 */
@@ -118,6 +146,10 @@ export interface StoreItemNaverFeedGuardEntity {
118
146
  type: StoreItemNaverFeedGuardTypeEnum;
119
147
  /** @description 상태값 */
120
148
  status: StoreItemNaverFeedGuardStatusEnum;
149
+ /** @description 오류 사유 */
150
+ errorReason?: string;
151
+ /** @description 통계용 오류 종류 */
152
+ errorType?: StoreItemNaverFeedGuardErrorTypeEnum;
121
153
  /**
122
154
  * @description 유니크 키. 생성 규칙은 `${type}:${sourceId}`
123
155
  *
@@ -137,6 +169,24 @@ export interface StoreItemNaverFeedGuardEntity {
137
169
  storeFixedContent?: StoreItemNaverFeedGuardStoreFixedContent;
138
170
  /** @description 마지막 네이버 정책 AI 검수 결과 아이디 */
139
171
  latestNaverPolicyAiReviewResultId?: Types.ObjectId | string;
172
+ /** @description 최신 네이버 정책 AI 검수 최종 판정값 */
173
+ latestAiReviewDecision?: NaverPolicyAiReviewDecisionEnum;
174
+ /** @description 최신 네이버 정책 AI 검수 완료 일자 */
175
+ latestAiReviewedAt?: Date;
176
+ /** @description 관리자가 REVIEW/BLOCK 판정 건을 확인했는지 여부 */
177
+ isAdminChecked?: boolean;
178
+ /** @description 관리자 확인 일자 */
179
+ adminCheckedAt?: Date;
180
+ /** @description 확인 처리한 관리자 아이디 */
181
+ adminCheckedBy?: Types.ObjectId | string;
182
+ /** @description 관리자 확인 메모 */
183
+ adminCheckMemo?: string;
184
+ /** @description 이미지 md5sum 조회 완료 일자 */
185
+ md5sumCheckedAt?: Date;
186
+ /** @description OCR 체크 완료 일자 */
187
+ ocrCompletedAt?: Date;
188
+ /** @description AI 체크 완료 일자 */
189
+ aiCheckedAt?: Date;
140
190
  /** @description 마지막 업데이트 일자 */
141
191
  lastUpdated: Date;
142
192
  /** @description 등록 일자 */
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StoreItemNaverFeedGuardImageOcrStatusEnum = exports.StoreItemNaverFeedGuardStatusEnum = exports.StoreItemNaverFeedGuardTypeEnum = void 0;
3
+ exports.StoreItemNaverFeedGuardImageOcrStatusEnum = exports.StoreItemNaverFeedGuardErrorTypeEnum = exports.StoreItemNaverFeedGuardStatusEnum = exports.StoreItemNaverFeedGuardTypeEnum = void 0;
4
4
  /** @description 네이버 연동 상품 검수 종류 */
5
5
  var StoreItemNaverFeedGuardTypeEnum;
6
6
  (function (StoreItemNaverFeedGuardTypeEnum) {
@@ -20,8 +20,12 @@ var StoreItemNaverFeedGuardStatusEnum;
20
20
  StoreItemNaverFeedGuardStatusEnum["WAITING"] = "WAITING";
21
21
  /** 검수 시작 */
22
22
  StoreItemNaverFeedGuardStatusEnum["STARTED"] = "STARTED";
23
+ /** 이미지 md5sum 조회 진행중 */
24
+ StoreItemNaverFeedGuardStatusEnum["MD5SUM_CHECKING"] = "MD5SUM_CHECKING";
23
25
  /** OCR 체크 진행중 */
24
26
  StoreItemNaverFeedGuardStatusEnum["OCR_CHECKING"] = "OCR_CHECKING";
27
+ /** OCR 체크 완료 */
28
+ StoreItemNaverFeedGuardStatusEnum["OCR_COMPLETED"] = "OCR_COMPLETED";
25
29
  /** AI 체크 진행중 */
26
30
  StoreItemNaverFeedGuardStatusEnum["AI_CHECKING"] = "AI_CHECKING";
27
31
  /** 검수 완료 */
@@ -29,6 +33,24 @@ var StoreItemNaverFeedGuardStatusEnum;
29
33
  /** 에러 발생 */
30
34
  StoreItemNaverFeedGuardStatusEnum["ERROR"] = "ERROR";
31
35
  })(StoreItemNaverFeedGuardStatusEnum = exports.StoreItemNaverFeedGuardStatusEnum || (exports.StoreItemNaverFeedGuardStatusEnum = {}));
36
+ /** @description 네이버 연동 상품 검수 오류 종류 */
37
+ var StoreItemNaverFeedGuardErrorTypeEnum;
38
+ (function (StoreItemNaverFeedGuardErrorTypeEnum) {
39
+ /** 이미지 md5sum 조회 실패 */
40
+ StoreItemNaverFeedGuardErrorTypeEnum["MD5SUM_CHECK_FAILED"] = "MD5SUM_CHECK_FAILED";
41
+ /** OCR 요청 발행 실패 */
42
+ StoreItemNaverFeedGuardErrorTypeEnum["OCR_REQUEST_FAILED"] = "OCR_REQUEST_FAILED";
43
+ /** OCR 처리 실패 */
44
+ StoreItemNaverFeedGuardErrorTypeEnum["OCR_PROCESS_FAILED"] = "OCR_PROCESS_FAILED";
45
+ /** OCR completion이 도착하지 않아 검수 진행 상태가 멈춤 */
46
+ StoreItemNaverFeedGuardErrorTypeEnum["OCR_CHECK_STALLED"] = "OCR_CHECK_STALLED";
47
+ /** OCR은 완료됐지만 AI 검수 요청 발행이 확인되지 않음 */
48
+ StoreItemNaverFeedGuardErrorTypeEnum["AI_REVIEW_REQUEST_FAILED"] = "AI_REVIEW_REQUEST_FAILED";
49
+ /** AI 검수 진행 상태가 오래 멈춤 */
50
+ StoreItemNaverFeedGuardErrorTypeEnum["AI_REVIEW_STALLED"] = "AI_REVIEW_STALLED";
51
+ /** AI 검수 실패 */
52
+ StoreItemNaverFeedGuardErrorTypeEnum["AI_REVIEW_FAILED"] = "AI_REVIEW_FAILED";
53
+ })(StoreItemNaverFeedGuardErrorTypeEnum = exports.StoreItemNaverFeedGuardErrorTypeEnum || (exports.StoreItemNaverFeedGuardErrorTypeEnum = {}));
32
54
  /** @description 네이버 연동 상품 검수 이미지 OCR 상태 */
33
55
  var StoreItemNaverFeedGuardImageOcrStatusEnum;
34
56
  (function (StoreItemNaverFeedGuardImageOcrStatusEnum) {