create-entity-server 0.0.27 → 0.2.2
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/package.json +1 -1
- package/template/configs/cache.json +2 -1
- package/template/configs/database.json +18 -7
- package/template/entities/README.md +3 -3
- package/template/entities/System/Address/addr_dong.json +10115 -0
- package/template/entities/System/Address/addr_sido.json +39 -0
- package/template/entities/System/Address/addr_sigungu.json +1398 -0
- package/template/entities/System/Auth/account.json +94 -18
- package/template/entities/System/Auth/account_audit.json +11 -3
- package/template/entities/System/Auth/account_device.json +13 -27
- package/template/entities/System/Auth/account_login_log.json +17 -7
- package/template/entities/System/Auth/anon_device.json +56 -0
- package/template/entities/System/Auth/api_keys.json +18 -9
- package/template/entities/System/Auth/license.json +41 -20
- package/template/entities/System/Auth/rbac_roles.json +10 -7
- package/template/entities/System/Backup/backup_log.json +11 -7
- package/template/entities/System/Email/smtp_log.json +9 -5
- package/template/entities/System/Email/smtp_msg.json +5 -5
- package/template/entities/System/Storage/file_backup_log.json +11 -6
- package/template/entities/System/Storage/file_download_log.json +7 -5
- package/template/entities/System/Storage/file_meta.json +20 -7
- package/template/entities/System/system_audit_log.json +38 -34
- package/template/entities/company.json +5 -2
- package/template/entities/goods.json +10 -3
- package/template/entities/todo.json +4 -2
- package/template/samples/entities/01_basic_fields.json +15 -2
- package/template/samples/entities/02_types_and_defaults.json +15 -5
- package/template/samples/entities/03_hash_and_unique.json +18 -3
- package/template/samples/entities/04_fk_and_composite_unique.json +18 -3
- package/template/samples/entities/05_cache.json +15 -9
- package/template/samples/entities/06_history_and_hard_delete.json +19 -6
- package/template/samples/entities/07_license_scope.json +18 -3
- package/template/samples/entities/08_hook_sql.json +24 -5
- package/template/samples/entities/09_hook_entity.json +12 -2
- package/template/samples/entities/10_hook_submit_delete.json +14 -5
- package/template/samples/entities/11_hook_webhook.json +20 -6
- package/template/samples/entities/12_hook_push.json +15 -2
- package/template/samples/entities/13_read_only.json +8 -4
- package/template/samples/entities/14_optimistic_lock.json +13 -2
- package/template/samples/entities/15_reset_defaults.json +7 -1
- package/template/samples/entities/16_isolated_license.json +19 -6
- package/template/scripts/reset-all.sh +130 -3
- package/template/scripts/run.sh +129 -33
- package/template/templates/ocr/business_reg.json +145 -0
- package/template/templates/ocr/career_cert.json +93 -0
- package/template/templates/ocr/driver_license.json +89 -0
- package/template/templates/ocr/facility_card.json +82 -0
- package/template/templates/ocr/id_card.json +55 -0
- package/template/templates/ocr/invoice.json +92 -0
- package/template/templates/ocr/namecard.json +116 -0
- package/template/templates/ocr/prompts/business_reg.json +14 -0
- package/template/templates/ocr/prompts/career_cert.json +16 -0
- package/template/templates/ocr/prompts/driver_license.json +14 -0
- package/template/templates/ocr/prompts/facility_card.json +15 -0
- package/template/templates/ocr/prompts/general.json +13 -0
- package/template/templates/ocr/prompts/id_card.json +11 -0
- package/template/templates/ocr/prompts/invoice.json +17 -0
- package/template/templates/ocr/prompts/namecard.json +15 -0
- package/template/templates/ocr/prompts/receipt.json +14 -0
- package/template/templates/ocr/receipt.json +79 -0
- package/template/configs/auth/identity.json +0 -27
- package/template/configs/auth/oauth.json +0 -40
- package/template/configs/auth/password.json +0 -33
- package/template/configs/auth/privacy_policy.json +0 -28
- package/template/configs/auth/two_factor.json +0 -12
- package/template/configs/extensions/pg.json +0 -37
- package/template/configs/extensions/tax-invoice.json +0 -59
- package/template/configs/keys/apns.p8.example +0 -7
- package/template/configs/keys/firebase.pem.example +0 -7
- package/template/configs/notification/alimtalk.json +0 -75
- package/template/configs/notification/push.json +0 -25
- package/template/configs/notification/sms.json +0 -54
- package/template/entities/System/Auth/account_oauth.json +0 -45
- package/template/entities/System/Auth/identity_verification.json +0 -95
- package/template/entities/System/Auth/password_history.json +0 -20
- package/template/entities/System/Notification/alimtalk_log.json +0 -45
- package/template/entities/System/Notification/alimtalk_msg.json +0 -39
- package/template/entities/System/Notification/friendtalk_log.json +0 -48
- package/template/entities/System/Notification/friendtalk_msg.json +0 -63
- package/template/entities/System/Notification/sms_log.json +0 -26
- package/template/entities/System/Notification/sms_msg.json +0 -52
- package/template/entities/System/Notification/sms_verification.json +0 -40
- package/template/entities/System/Payment/pg_cancel.json +0 -45
- package/template/entities/System/Payment/pg_order.json +0 -88
- package/template/entities/System/Payment/pg_webhook_log.json +0 -37
- package/template/entities/System/Push/push_log.json +0 -71
- package/template/entities/System/Push/push_msg.json +0 -55
- package/template/templates/email/account/dormancy_warning.html +0 -20
- package/template/templates/email/account/password_expiry_warning.html +0 -21
- package/template/templates/email/auth/2fa_disabled.html +0 -23
- package/template/templates/email/auth/2fa_recovery_regenerated.html +0 -31
- package/template/templates/email/auth/2fa_setup_complete.html +0 -43
- package/template/templates/email/auth/email_verification.html +0 -18
- package/template/templates/email/auth/force_reset.html +0 -18
- package/template/templates/email/auth/password_reset.html +0 -19
- package/template/templates/email/auth/verification.html +0 -15
- package/template/templates/email/auth/verification_link.html +0 -25
- package/template/templates/email/auth/welcome.html +0 -18
- package/template/templates/email/order/order_confirmation.html +0 -30
- /package/template/configs/{notification/smtp.json → smtp.json} +0 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "id_card",
|
|
3
|
+
"label": "주민등록증",
|
|
4
|
+
"preprocess": {
|
|
5
|
+
"max_slope": 0.03,
|
|
6
|
+
"y_tolerance": 4,
|
|
7
|
+
"x_tolerance": 8
|
|
8
|
+
},
|
|
9
|
+
"keywords": {
|
|
10
|
+
"name": ["성명", "이름"],
|
|
11
|
+
"id_number": ["주민등록번호", "등록번호"],
|
|
12
|
+
"address": ["주소", "거주지"],
|
|
13
|
+
"issue_date": ["발급일", "발행일"]
|
|
14
|
+
},
|
|
15
|
+
"fields": {
|
|
16
|
+
"name": {
|
|
17
|
+
"mode": "anchor",
|
|
18
|
+
"criteria": [
|
|
19
|
+
{ "keyword": "성명", "direction": "RIGHT" },
|
|
20
|
+
{ "keyword": "이름", "direction": "RIGHT" }
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"id_number": {
|
|
24
|
+
"mode": "anchor",
|
|
25
|
+
"criteria": [
|
|
26
|
+
{ "keyword": "주민등록번호", "direction": "RIGHT" },
|
|
27
|
+
{ "keyword": "등록번호", "direction": "RIGHT" }
|
|
28
|
+
],
|
|
29
|
+
"refine": "id_num"
|
|
30
|
+
},
|
|
31
|
+
"address": {
|
|
32
|
+
"mode": "anchor",
|
|
33
|
+
"criteria": [
|
|
34
|
+
{ "keyword": "주소", "direction": "DOWN" },
|
|
35
|
+
{ "keyword": "주소", "direction": "RIGHT" }
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
"issue_date": {
|
|
39
|
+
"mode": "regex_scan",
|
|
40
|
+
"pattern": "발급일[\\s:]*([0-9]{4}[.\\-/][0-9]{1,2}[.\\-/][0-9]{1,2})",
|
|
41
|
+
"refine": "date"
|
|
42
|
+
},
|
|
43
|
+
"issuer": {
|
|
44
|
+
"mode": "regex_scan",
|
|
45
|
+
"pattern": "(\\S+구청장|\\S+시장|\\S+군수|행정안전부장관|\\S+동장)"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"required_fields": ["name", "id_number"],
|
|
49
|
+
"confidence_weight": {
|
|
50
|
+
"name": 0.25,
|
|
51
|
+
"id_number": 0.45,
|
|
52
|
+
"address": 0.2,
|
|
53
|
+
"issue_date": 0.1
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "invoice",
|
|
3
|
+
"label": "세금계산서",
|
|
4
|
+
|
|
5
|
+
"preprocess": {
|
|
6
|
+
"max_slope": 0.03,
|
|
7
|
+
"y_tolerance": 5,
|
|
8
|
+
"x_tolerance": 10,
|
|
9
|
+
"remove_patterns": ["^\\s*$"]
|
|
10
|
+
},
|
|
11
|
+
|
|
12
|
+
"keywords": {
|
|
13
|
+
"invoice_num": ["일련번호", "승인번호"],
|
|
14
|
+
"issuer_corp_num": ["공급자", "등록번호"],
|
|
15
|
+
"issuer_name": ["공급자", "상호"],
|
|
16
|
+
"receiver_corp_num": ["공급받는자", "등록번호"],
|
|
17
|
+
"receiver_name": ["공급받는자", "상호"],
|
|
18
|
+
"write_date": ["작성일자", "작성 연월일"],
|
|
19
|
+
"amount_total": ["공급가액", "합계금액"],
|
|
20
|
+
"tax_total": ["세액"],
|
|
21
|
+
"total_amount": ["합계금액", "총합계"]
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
"fields": {
|
|
25
|
+
"invoice_num": {
|
|
26
|
+
"output_key": "invoice_num",
|
|
27
|
+
"mode": "regex_scan",
|
|
28
|
+
"pattern": "([0-9]{8}-[0-9]{8})",
|
|
29
|
+
"capture_group": 1
|
|
30
|
+
},
|
|
31
|
+
"write_date": {
|
|
32
|
+
"output_key": "write_date",
|
|
33
|
+
"criteria": [
|
|
34
|
+
{ "keyword": "작성일자", "direction": "RIGHT" },
|
|
35
|
+
{ "keyword": "작성 연월일", "direction": "RIGHT" }
|
|
36
|
+
],
|
|
37
|
+
"refine": "date"
|
|
38
|
+
},
|
|
39
|
+
"amount_total": {
|
|
40
|
+
"output_key": "amount_total",
|
|
41
|
+
"criteria": [
|
|
42
|
+
{ "keyword": "공급가액", "direction": "RIGHT" },
|
|
43
|
+
{ "keyword": "공급가액", "direction": "DOWN" }
|
|
44
|
+
],
|
|
45
|
+
"refine": "number"
|
|
46
|
+
},
|
|
47
|
+
"tax_total": {
|
|
48
|
+
"output_key": "tax_total",
|
|
49
|
+
"criteria": [
|
|
50
|
+
{ "keyword": "세액", "direction": "RIGHT" },
|
|
51
|
+
{ "keyword": "세액", "direction": "DOWN" }
|
|
52
|
+
],
|
|
53
|
+
"refine": "number"
|
|
54
|
+
},
|
|
55
|
+
"total_amount": {
|
|
56
|
+
"output_key": "total_amount",
|
|
57
|
+
"criteria": [
|
|
58
|
+
{ "keyword": "합계금액", "direction": "RIGHT" },
|
|
59
|
+
{ "keyword": "합계금액", "direction": "DOWN" }
|
|
60
|
+
],
|
|
61
|
+
"refine": "number"
|
|
62
|
+
},
|
|
63
|
+
"issuer_name": {
|
|
64
|
+
"output_key": "issuer_name",
|
|
65
|
+
"region": {
|
|
66
|
+
"from": "공급자",
|
|
67
|
+
"to": "공급받는자",
|
|
68
|
+
"direction": "DOWN",
|
|
69
|
+
"x_min_anchor": "상호"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"receiver_name": {
|
|
73
|
+
"output_key": "receiver_name",
|
|
74
|
+
"region": {
|
|
75
|
+
"from": "공급받는자",
|
|
76
|
+
"to": "작성일자",
|
|
77
|
+
"direction": "DOWN",
|
|
78
|
+
"x_min_anchor": "상호"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
"required_fields": ["total_amount"],
|
|
84
|
+
|
|
85
|
+
"confidence_weight": {
|
|
86
|
+
"invoice_num": 0.15,
|
|
87
|
+
"write_date": 0.15,
|
|
88
|
+
"amount_total": 0.25,
|
|
89
|
+
"tax_total": 0.2,
|
|
90
|
+
"total_amount": 0.25
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "namecard",
|
|
3
|
+
"label": "명함",
|
|
4
|
+
"preprocess": {
|
|
5
|
+
"max_slope": 0.05,
|
|
6
|
+
"y_tolerance": 5,
|
|
7
|
+
"x_tolerance": 10
|
|
8
|
+
},
|
|
9
|
+
"keywords": {
|
|
10
|
+
"name": ["성명", "이름"],
|
|
11
|
+
"company": ["주식회사", "(주)", "㈜", "Inc.", "Corp.", "Co.,", "Ltd."],
|
|
12
|
+
"department": ["부서", "팀", "사업부", "본부", "센터", "실", "TF"],
|
|
13
|
+
"title": [
|
|
14
|
+
"대표",
|
|
15
|
+
"이사",
|
|
16
|
+
"부장",
|
|
17
|
+
"차장",
|
|
18
|
+
"과장",
|
|
19
|
+
"팀장",
|
|
20
|
+
"실장",
|
|
21
|
+
"본부장",
|
|
22
|
+
"사원",
|
|
23
|
+
"대리",
|
|
24
|
+
"수석",
|
|
25
|
+
"책임",
|
|
26
|
+
"선임",
|
|
27
|
+
"CEO",
|
|
28
|
+
"CTO",
|
|
29
|
+
"CFO",
|
|
30
|
+
"COO",
|
|
31
|
+
"Director",
|
|
32
|
+
"Manager"
|
|
33
|
+
],
|
|
34
|
+
"address": ["주소", "address", "addr."],
|
|
35
|
+
"phone": ["Tel", "TEL", "전화", "Mobile", "HP", "직통", "Fax", "FAX"],
|
|
36
|
+
"email": ["Email", "E-mail", "이메일", "e-mail"],
|
|
37
|
+
"website": ["www.", "http", "https"]
|
|
38
|
+
},
|
|
39
|
+
"fields": {
|
|
40
|
+
"name": {
|
|
41
|
+
"mode": "anchor",
|
|
42
|
+
"criteria": [
|
|
43
|
+
{ "keyword": "성명", "direction": "RIGHT" },
|
|
44
|
+
{ "keyword": "이름", "direction": "RIGHT" }
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
"company": {
|
|
48
|
+
"mode": "anchor",
|
|
49
|
+
"criteria": [
|
|
50
|
+
{ "keyword": "주식회사", "direction": "RIGHT" },
|
|
51
|
+
{ "keyword": "주식회사", "direction": "LEFT" },
|
|
52
|
+
{ "keyword": "(주)", "direction": "RIGHT" },
|
|
53
|
+
{ "keyword": "㈜", "direction": "RIGHT" }
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"department": {
|
|
57
|
+
"mode": "anchor",
|
|
58
|
+
"criteria": [
|
|
59
|
+
{ "keyword": "부서", "direction": "RIGHT" },
|
|
60
|
+
{ "keyword": "팀", "direction": "LEFT" },
|
|
61
|
+
{ "keyword": "사업부", "direction": "LEFT" },
|
|
62
|
+
{ "keyword": "본부", "direction": "LEFT" },
|
|
63
|
+
{ "keyword": "센터", "direction": "LEFT" }
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"title": {
|
|
67
|
+
"mode": "anchor",
|
|
68
|
+
"criteria": [
|
|
69
|
+
{ "keyword": "대표이사", "direction": "LEFT" },
|
|
70
|
+
{ "keyword": "대표이사", "direction": "RIGHT" },
|
|
71
|
+
{ "keyword": "이사", "direction": "LEFT" },
|
|
72
|
+
{ "keyword": "부장", "direction": "LEFT" },
|
|
73
|
+
{ "keyword": "차장", "direction": "LEFT" },
|
|
74
|
+
{ "keyword": "과장", "direction": "LEFT" },
|
|
75
|
+
{ "keyword": "팀장", "direction": "LEFT" },
|
|
76
|
+
{ "keyword": "본부장", "direction": "LEFT" },
|
|
77
|
+
{ "keyword": "실장", "direction": "LEFT" },
|
|
78
|
+
{ "keyword": "수석", "direction": "LEFT" },
|
|
79
|
+
{ "keyword": "Director", "direction": "LEFT" },
|
|
80
|
+
{ "keyword": "Manager", "direction": "LEFT" },
|
|
81
|
+
{ "keyword": "CEO", "direction": "LEFT" }
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
"phone": {
|
|
85
|
+
"mode": "regex_scan",
|
|
86
|
+
"pattern": "(?:Tel|TEL|전화|Mobile|HP|직통)[\\s.:]*([0-9][0-9\\-\\s]+[0-9])",
|
|
87
|
+
"multi": true,
|
|
88
|
+
"refine": "phone"
|
|
89
|
+
},
|
|
90
|
+
"email": {
|
|
91
|
+
"mode": "regex_scan",
|
|
92
|
+
"pattern": "[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}",
|
|
93
|
+
"multi": true
|
|
94
|
+
},
|
|
95
|
+
"address": {
|
|
96
|
+
"mode": "anchor",
|
|
97
|
+
"criteria": [
|
|
98
|
+
{ "keyword": "주소", "direction": "RIGHT" },
|
|
99
|
+
{ "keyword": "주소", "direction": "DOWN" },
|
|
100
|
+
{ "keyword": "address", "direction": "RIGHT" }
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
"website": {
|
|
104
|
+
"mode": "regex_scan",
|
|
105
|
+
"pattern": "(?:https?://|www\\.)[a-zA-Z0-9.\\-/]+"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"required_fields": [],
|
|
109
|
+
"confidence_weight": {
|
|
110
|
+
"name": 0.3,
|
|
111
|
+
"company": 0.3,
|
|
112
|
+
"phone": 0.2,
|
|
113
|
+
"email": 0.1,
|
|
114
|
+
"title": 0.1
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "business_reg",
|
|
3
|
+
"system_msg": "당신은 OCR 텍스트에서 사업자등록증 정보를 추출하는 AI입니다. 사업자등록번호는 XXX-XX-XXXXX 형식으로 반환하세요. 찾을 수 없는 필드는 빈 문자열로 반환하세요.",
|
|
4
|
+
"user_msg": "아래 OCR 텍스트에서 사업자등록증 정보를 추출하여 다음 JSON 스키마에 맞게 응답하세요.\n\n[OCR 텍스트]\n{{ocr_text}}\n\n[출력 스키마]\n{{schema}}\n\nJSON만 출력하세요.",
|
|
5
|
+
"schema": {
|
|
6
|
+
"corp_num": "string: 사업자등록번호 (XXX-XX-XXXXX)",
|
|
7
|
+
"corp_name": "string: 상호(법인명)",
|
|
8
|
+
"ceo_name": "string: 대표자 성명",
|
|
9
|
+
"address": "string: 사업장 소재지",
|
|
10
|
+
"open_date": "string: 개업연월일 (YYYY-MM-DD)",
|
|
11
|
+
"biz_type": "string: 업태",
|
|
12
|
+
"biz_class": "string: 종목"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "career_cert",
|
|
3
|
+
"system_msg": "당신은 OCR 텍스트에서 경력증명서(재직증명서) 정보를 추출하는 AI입니다. 개인정보 보호를 위해 주민등록번호는 생년월일 6자리와 뒷자리 첫 숫자만 표시하고 나머지는 '*'로 마스킹하세요. 날짜는 YYYY-MM-DD 형식으로 반환하세요. 찾을 수 없는 필드는 빈 문자열로 반환하세요.",
|
|
4
|
+
"user_msg": "아래 OCR 텍스트에서 경력증명서 정보를 추출하여 다음 JSON 스키마에 맞게 응답하세요.\n\n[OCR 텍스트]\n{{ocr_text}}\n\n[출력 스키마]\n{{schema}}\n\nJSON만 출력하세요.",
|
|
5
|
+
"schema": {
|
|
6
|
+
"name": "string: 성명",
|
|
7
|
+
"id_number": "string: 주민등록번호 (마스킹, 예: 900101-1******)",
|
|
8
|
+
"company": "string: 회사(기관)명",
|
|
9
|
+
"department": "string: 부서명",
|
|
10
|
+
"position": "string: 직위 또는 직급",
|
|
11
|
+
"join_date": "string: 입사일 (YYYY-MM-DD)",
|
|
12
|
+
"leave_date": "string: 퇴사일 (YYYY-MM-DD, 재직 중이면 빈 문자열)",
|
|
13
|
+
"issue_date": "string: 증명서 발급일 (YYYY-MM-DD)",
|
|
14
|
+
"issuer": "string: 발급자 (대표이사 성명 또는 기관명)"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "driver_license",
|
|
3
|
+
"system_msg": "당신은 OCR 텍스트에서 운전면허증 데이터를 추출하는 전문 AI입니다. 주민등록번호는 반드시 앞 6자리만 추출하고 뒤 7자리는 *로 마스킹하세요 (예: 901225-*******). 주어진 JSON 스키마에 정확히 맞는 JSON만 출력하세요.",
|
|
4
|
+
"user_msg": "아래 운전면허증 OCR 텍스트에서 필드를 추출하여 다음 JSON 스키마에 맞게 응답하세요.\n\n[OCR 텍스트]\n{{ocr_text}}\n\n[출력 스키마]\n{{schema}}\n\nJSON만 출력하세요.",
|
|
5
|
+
"schema": {
|
|
6
|
+
"name": "string: 성명",
|
|
7
|
+
"id_number": "string: 주민등록번호 (앞 6자리만, 뒤 7자리는 * 마스킹: YYMMDD-*******)",
|
|
8
|
+
"license_num": "string: 면허번호 (XX-XX-XXXXXX-XX 형식)",
|
|
9
|
+
"license_type": "string: 면허종별 (예: 1종보통, 2종보통, 1종대형 등)",
|
|
10
|
+
"issue_date": "string: 발급일자 (YYYY-MM-DD 형식)",
|
|
11
|
+
"expiry_date": "string: 적성검사 만료일 (YYYY-MM-DD 형식)",
|
|
12
|
+
"issuer": "string: 발급 경찰청 이름"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "facility_card",
|
|
3
|
+
"system_msg": "당신은 OCR 텍스트에서 건축물대장(시설물대장) 정보를 추출하는 AI입니다. 면적은 숫자와 단위(㎡)를 포함하여 반환하세요. 찾을 수 없는 필드는 빈 문자열로 반환하세요.",
|
|
4
|
+
"user_msg": "아래 OCR 텍스트에서 건축물대장 정보를 추출하여 다음 JSON 스키마에 맞게 응답하세요.\n\n[OCR 텍스트]\n{{ocr_text}}\n\n[출력 스키마]\n{{schema}}\n\nJSON만 출력하세요.",
|
|
5
|
+
"schema": {
|
|
6
|
+
"building_name": "string: 건물명 또는 건축물명",
|
|
7
|
+
"address": "string: 소재지(대지위치)",
|
|
8
|
+
"building_use": "string: 주용도 (예: 제2종 근린생활시설)",
|
|
9
|
+
"structure": "string: 구조 (예: 철근콘크리트조)",
|
|
10
|
+
"area": "string: 연면적 (예: 1234.56㎡)",
|
|
11
|
+
"floor_count": "string: 층수 (예: 지상 5층 / 지하 1층)",
|
|
12
|
+
"approval_date": "string: 사용승인일 (YYYY-MM-DD)",
|
|
13
|
+
"owner": "string: 소유자(건축주)"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "general",
|
|
3
|
+
"system_msg": "당신은 OCR 텍스트를 분석하여 주요 정보를 추출하는 AI입니다. 주어진 JSON 스키마에 맞게 최대한 정보를 추출하세요. 찾을 수 없는 필드는 빈 문자열로 반환하세요.",
|
|
4
|
+
"user_msg": "아래 OCR 텍스트에서 주요 정보를 추출하여 다음 JSON 스키마에 맞게 응답하세요.\n\n[OCR 텍스트]\n{{ocr_text}}\n\n[출력 스키마]\n{{schema}}\n\nJSON만 출력하세요.",
|
|
5
|
+
"schema": {
|
|
6
|
+
"title": "string: 문서 제목 또는 문서 유형",
|
|
7
|
+
"date": "string: 날짜 (YYYY-MM-DD 형식)",
|
|
8
|
+
"name": "string: 인물 이름 또는 상호명",
|
|
9
|
+
"address": "string: 주소",
|
|
10
|
+
"amount": "string: 금액 (숫자만)",
|
|
11
|
+
"summary": "string: 문서 내용 한 줄 요약"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "id_card",
|
|
3
|
+
"system_msg": "당신은 OCR 텍스트에서 신분증(주민등록증) 정보를 추출하는 AI입니다. 개인정보 보호를 위해 주민등록번호는 반드시 생년월일 6자리와 뒷자리 첫 숫자만 표시하고 나머지는 '*'로 마스킹하세요(예: 900101-1******). 찾을 수 없는 필드는 빈 문자열로 반환하세요.",
|
|
4
|
+
"user_msg": "아래 OCR 텍스트에서 신분증 정보를 추출하여 다음 JSON 스키마에 맞게 응답하세요.\n\n[OCR 텍스트]\n{{ocr_text}}\n\n[출력 스키마]\n{{schema}}\n\nJSON만 출력하세요.",
|
|
5
|
+
"schema": {
|
|
6
|
+
"name": "string: 성명",
|
|
7
|
+
"id_number": "string: 주민등록번호 (YYMMDD-1****** 형식으로 마스킹)",
|
|
8
|
+
"issue_date": "string: 발급일 (YYYY-MM-DD)",
|
|
9
|
+
"issuer": "string: 발급기관 (예: 서대문구청장)"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "invoice",
|
|
3
|
+
"system_msg": "당신은 OCR 텍스트에서 세금계산서(거래명세서) 데이터를 추출하는 AI입니다. 공급자·공급받는자 정보, 날짜, 금액을 정확히 추출하세요. 찾을 수 없는 필드는 빈 문자열로 반환하세요.",
|
|
4
|
+
"user_msg": "아래 OCR 텍스트에서 세금계산서 정보를 추출하여 다음 JSON 스키마에 맞게 응답하세요.\n\n[OCR 텍스트]\n{{ocr_text}}\n\n[출력 스키마]\n{{schema}}\n\nJSON만 출력하세요.",
|
|
5
|
+
"schema": {
|
|
6
|
+
"invoice_num": "string: 세금계산서 번호",
|
|
7
|
+
"write_date": "string: 작성일자 (YYYY-MM-DD)",
|
|
8
|
+
"issuer_name": "string: 공급자 상호",
|
|
9
|
+
"issuer_reg_num": "string: 공급자 사업자등록번호 (XXX-XX-XXXXX)",
|
|
10
|
+
"receiver_name": "string: 공급받는자 상호",
|
|
11
|
+
"receiver_reg_num": "string: 공급받는자 사업자등록번호",
|
|
12
|
+
"supply_amount": "string: 공급가액 (숫자만)",
|
|
13
|
+
"tax_amount": "string: 세액 (숫자만)",
|
|
14
|
+
"total_amount": "string: 합계금액 (숫자만)",
|
|
15
|
+
"items": "array: [{name, qty, unit_price, amount}] 품목 목록"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "namecard",
|
|
3
|
+
"system_msg": "당신은 OCR 텍스트에서 명함 정보를 추출하는 AI입니다. 이름, 직함, 회사, 연락처 등을 정확히 추출하세요. 전화번호·이메일은 복수일 수 있으므로 배열로 반환하세요. 찾을 수 없는 필드는 빈 문자열 또는 빈 배열로 반환하세요.",
|
|
4
|
+
"user_msg": "아래 OCR 텍스트에서 명함 정보를 추출하여 다음 JSON 스키마에 맞게 응답하세요.\n\n[OCR 텍스트]\n{{ocr_text}}\n\n[출력 스키마]\n{{schema}}\n\nJSON만 출력하세요.",
|
|
5
|
+
"schema": {
|
|
6
|
+
"name": "string: 이름",
|
|
7
|
+
"company": "string: 회사(기관)명",
|
|
8
|
+
"department": "string: 부서명",
|
|
9
|
+
"title": "string: 직함(직위)",
|
|
10
|
+
"phone": "array[string]: 전화번호 목록",
|
|
11
|
+
"email": "array[string]: 이메일 주소 목록",
|
|
12
|
+
"address": "string: 주소",
|
|
13
|
+
"website": "string: 웹사이트 URL"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "receipt",
|
|
3
|
+
"system_msg": "당신은 OCR 텍스트에서 영수증 데이터를 추출하는 전문 AI입니다. 주어진 JSON 스키마에 정확히 맞는 JSON만 출력하세요. 값을 찾지 못하면 해당 필드를 빈 문자열로 설정하세요.",
|
|
4
|
+
"user_msg": "아래 영수증 OCR 텍스트에서 필드를 추출하여 다음 JSON 스키마에 맞게 응답하세요.\n\n[OCR 텍스트]\n{{ocr_text}}\n\n[출력 스키마]\n{{schema}}\n\nJSON만 출력하세요.",
|
|
5
|
+
"schema": {
|
|
6
|
+
"store_name": "string: 상호명/가맹점명",
|
|
7
|
+
"store_addr": "string: 주소",
|
|
8
|
+
"corp_num": "string: 사업자등록번호 (XXX-XX-XXXXX 형식)",
|
|
9
|
+
"date": "string: 거래일자 (YYYY-MM-DD 형식)",
|
|
10
|
+
"total_amount": "string: 결제 합계 금액 (숫자만, 콤마 제거)",
|
|
11
|
+
"payment_type": "string: 결제수단 (card/cash/other)",
|
|
12
|
+
"card_number": "string: 카드번호 (마지막 4자리만 또는 마스킹 포함)"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc_type": "receipt",
|
|
3
|
+
"label": "영수증",
|
|
4
|
+
|
|
5
|
+
"preprocess": {
|
|
6
|
+
"max_slope": 0.05,
|
|
7
|
+
"y_tolerance": 5,
|
|
8
|
+
"x_tolerance": 10,
|
|
9
|
+
"remove_patterns": ["^\\s*$"],
|
|
10
|
+
"merge_patterns": ["\\d{1,3}(,\\d{3})+원?"]
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
"keywords": {
|
|
14
|
+
"store_name": ["상호", "가맹점", "점포명"],
|
|
15
|
+
"corp_num": ["사업자번호", "사업자등록번호"],
|
|
16
|
+
"date": ["거래일시", "승인일시", "일시", "날짜"],
|
|
17
|
+
"total_amount": ["합계", "결제금액", "승인금액", "총금액", "금액"],
|
|
18
|
+
"payment_type": ["결제수단", "결제방법"],
|
|
19
|
+
"card_number": ["카드번호", "카드"]
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
"fields": {
|
|
23
|
+
"store_name": {
|
|
24
|
+
"output_key": "store_name",
|
|
25
|
+
"criteria": [
|
|
26
|
+
{ "keyword": "상호", "direction": "RIGHT" },
|
|
27
|
+
{ "keyword": "가맹점", "direction": "RIGHT" },
|
|
28
|
+
{ "keyword": "점포명", "direction": "RIGHT" }
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
"corp_num": {
|
|
32
|
+
"output_key": "corp_num",
|
|
33
|
+
"criteria": [
|
|
34
|
+
{ "keyword": "사업자번호", "direction": "RIGHT" },
|
|
35
|
+
{ "keyword": "사업자등록번호", "direction": "RIGHT" }
|
|
36
|
+
],
|
|
37
|
+
"refine": "biz_num"
|
|
38
|
+
},
|
|
39
|
+
"date": {
|
|
40
|
+
"output_key": "date",
|
|
41
|
+
"mode": "regex_scan",
|
|
42
|
+
"pattern": "(\\d{4}[./-]\\d{2}[./-]\\d{2}(?:[\\s]\\d{2}:\\d{2}(?::\\d{2})?)?)",
|
|
43
|
+
"capture_group": 1,
|
|
44
|
+
"refine": "date"
|
|
45
|
+
},
|
|
46
|
+
"total_amount": {
|
|
47
|
+
"output_key": "total_amount",
|
|
48
|
+
"criteria": [
|
|
49
|
+
{ "keyword": "합계", "direction": "RIGHT" },
|
|
50
|
+
{ "keyword": "합계", "direction": "DOWN" },
|
|
51
|
+
{ "keyword": "결제금액", "direction": "RIGHT" },
|
|
52
|
+
{ "keyword": "승인금액", "direction": "RIGHT" }
|
|
53
|
+
],
|
|
54
|
+
"refine": "number"
|
|
55
|
+
},
|
|
56
|
+
"payment_type": {
|
|
57
|
+
"output_key": "payment_type",
|
|
58
|
+
"criteria": [
|
|
59
|
+
{ "keyword": "결제수단", "direction": "RIGHT" },
|
|
60
|
+
{ "keyword": "결제방법", "direction": "RIGHT" }
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
"card_number": {
|
|
64
|
+
"output_key": "card_number",
|
|
65
|
+
"mode": "regex_scan",
|
|
66
|
+
"pattern": "([0-9*]{4}[-\\s]?[0-9*]{4}[-\\s]?[0-9*]{4}[-\\s]?[0-9*]{4})",
|
|
67
|
+
"capture_group": 1
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
"required_fields": ["total_amount"],
|
|
72
|
+
|
|
73
|
+
"confidence_weight": {
|
|
74
|
+
"store_name": 0.2,
|
|
75
|
+
"corp_num": 0.15,
|
|
76
|
+
"date": 0.25,
|
|
77
|
+
"total_amount": 0.4
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"enabled": false,
|
|
3
|
-
"default": "nice",
|
|
4
|
-
"request_ttl_sec": 300,
|
|
5
|
-
"result_ttl_sec": 600,
|
|
6
|
-
"return_url": "/v1/identity/callback",
|
|
7
|
-
"success_redirect_url": "/identity/complete",
|
|
8
|
-
"failure_redirect_url": "/identity/error",
|
|
9
|
-
"duplicate_ci_check": true,
|
|
10
|
-
"providers": [
|
|
11
|
-
{
|
|
12
|
-
"driver": "nice",
|
|
13
|
-
"site_code": "${NICE_SITE_CODE}",
|
|
14
|
-
"site_password": "${NICE_SITE_PASSWORD}",
|
|
15
|
-
"client_id": "${NICE_CLIENT_ID}",
|
|
16
|
-
"client_secret": "${NICE_CLIENT_SECRET}",
|
|
17
|
-
"product_id": "2101979031",
|
|
18
|
-
"api_url": "https://nice.checkplus.co.kr",
|
|
19
|
-
"token_url": "https://svc.niceapi.co.kr:22001/digital/niceid/oauth/oauth/token",
|
|
20
|
-
"crypto_url": "https://svc.niceapi.co.kr:22001/digital/niceid/api/v1.0/common/crypto/token"
|
|
21
|
-
}
|
|
22
|
-
],
|
|
23
|
-
"rate_limit": {
|
|
24
|
-
"per_ip_per_hour": 10,
|
|
25
|
-
"per_account_per_day": 5
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_comment": "OAuth 2.0 설정 예시. 사용할 프로바이더만 남기고 실제 값으로 교체하세요.",
|
|
3
|
-
"enabled": false,
|
|
4
|
-
|
|
5
|
-
"state_secret": "${OAUTH_STATE_SECRET}",
|
|
6
|
-
"state_ttl_sec": 600,
|
|
7
|
-
"success_redirect_url": "/auth/callback",
|
|
8
|
-
"failure_redirect_url": "/auth/error",
|
|
9
|
-
|
|
10
|
-
"providers": {
|
|
11
|
-
"google": {
|
|
12
|
-
"client_id": "${GOOGLE_CLIENT_ID}",
|
|
13
|
-
"client_secret": "${GOOGLE_CLIENT_SECRET}",
|
|
14
|
-
"redirect_url": "/v1/oauth/google/callback",
|
|
15
|
-
"scopes": ["openid", "email", "profile"]
|
|
16
|
-
},
|
|
17
|
-
"github": {
|
|
18
|
-
"client_id": "${GITHUB_CLIENT_ID}",
|
|
19
|
-
"client_secret": "${GITHUB_CLIENT_SECRET}",
|
|
20
|
-
"redirect_url": "/v1/oauth/github/callback"
|
|
21
|
-
},
|
|
22
|
-
"naver": {
|
|
23
|
-
"client_id": "${NAVER_CLIENT_ID}",
|
|
24
|
-
"client_secret": "${NAVER_CLIENT_SECRET}",
|
|
25
|
-
"redirect_url": "/v1/oauth/naver/callback"
|
|
26
|
-
},
|
|
27
|
-
"kakao": {
|
|
28
|
-
"_comment": "Kakao — 커스텀 엔드포인트 예시",
|
|
29
|
-
"client_id": "${KAKAO_CLIENT_ID}",
|
|
30
|
-
"client_secret": "${KAKAO_CLIENT_SECRET}",
|
|
31
|
-
"redirect_url": "/v1/oauth/kakao/callback",
|
|
32
|
-
"auth_url": "https://kauth.kakao.com/oauth/authorize",
|
|
33
|
-
"token_url": "https://kauth.kakao.com/oauth/token",
|
|
34
|
-
"user_info_url": "https://kapi.kakao.com/v2/user/me",
|
|
35
|
-
"scopes": ["profile_nickname", "account_email"],
|
|
36
|
-
"email_field": "kakao_account.email",
|
|
37
|
-
"name_field": "properties.nickname"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"password_policy": {
|
|
3
|
-
"min_length": 8,
|
|
4
|
-
"require_mixed_case": false,
|
|
5
|
-
"require_number": false,
|
|
6
|
-
"require_special": false,
|
|
7
|
-
"history_count": 5
|
|
8
|
-
},
|
|
9
|
-
"admin_force_reset": {
|
|
10
|
-
"temp_password_length": 12,
|
|
11
|
-
"require_change": true,
|
|
12
|
-
"notify_email": true
|
|
13
|
-
},
|
|
14
|
-
"password_reset": {
|
|
15
|
-
"enabled": false,
|
|
16
|
-
"token_ttl_sec": 300,
|
|
17
|
-
"base_url": "/password-reset",
|
|
18
|
-
"rate_limit": {
|
|
19
|
-
"per_email_per_hour": 5,
|
|
20
|
-
"per_ip_per_minute": 10
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
"email_verification": {
|
|
24
|
-
"enabled": false,
|
|
25
|
-
"required": false,
|
|
26
|
-
"code_length": 6,
|
|
27
|
-
"code_ttl_sec": 300,
|
|
28
|
-
"max_attempts": 5,
|
|
29
|
-
"rate_limit": {
|
|
30
|
-
"per_email_per_hour": 5
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_comment": "개인정보처리방침 설정 예시. 각 모듈은 독립적으로 enabled 설정 가능. 운영 적용 전 docs/security/privacy-policy-guide.md 를 반드시 확인하세요.",
|
|
3
|
-
|
|
4
|
-
"dormancy": {
|
|
5
|
-
"_comment": "휴면 계정 전환 정책. 마지막 로그인 기준으로 dormancy_days 경과 시 휴면 처리.",
|
|
6
|
-
"enabled": false,
|
|
7
|
-
"dormancy_days": 365,
|
|
8
|
-
"warning_days": [30, 7],
|
|
9
|
-
"email_template": "dormancy_warning",
|
|
10
|
-
"check_interval_hours": 24
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
"data_retention": {
|
|
14
|
-
"_comment": "개인정보 보존 기간 정책. action: anonymize(익명화) | delete(삭제).",
|
|
15
|
-
"enabled": false,
|
|
16
|
-
"retention_days": 1095,
|
|
17
|
-
"action": "anonymize",
|
|
18
|
-
"check_interval_hours": 24
|
|
19
|
-
},
|
|
20
|
-
|
|
21
|
-
"password_policy": {
|
|
22
|
-
"_comment": "비밀번호 만료/재사용 금지 정책. 복잡도 규칙은 password.json의 password_policy를 공통 사용.",
|
|
23
|
-
"enabled": false,
|
|
24
|
-
"max_age_days": 180,
|
|
25
|
-
"warning_days": [14, 7],
|
|
26
|
-
"email_template": "account/password_expiry_warning"
|
|
27
|
-
}
|
|
28
|
-
}
|