a2a-memory 0.11.5 → 0.11.6
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/LICENSE +7 -19
- package/README.md +1 -1
- package/dist/a2a/client.js +1 -252
- package/dist/a2a/discovery.js +1 -115
- package/dist/a2a/index.js +1 -8
- package/dist/a2a/types.js +1 -42
- package/dist/adapters/anthropic.js +1 -117
- package/dist/chunking/chunker.js +1 -163
- package/dist/claude/sync.js +1 -298
- package/dist/cli/commands/add.js +1 -80
- package/dist/cli/commands/claude-sync.js +1 -70
- package/dist/cli/commands/cleanup.js +1 -83
- package/dist/cli/commands/config.js +1 -79
- package/dist/cli/commands/edit.js +1 -69
- package/dist/cli/commands/embed.js +1 -92
- package/dist/cli/commands/extract.js +1 -103
- package/dist/cli/commands/health.js +1 -105
- package/dist/cli/commands/list.js +1 -46
- package/dist/cli/commands/migrate-chunks.js +1 -205
- package/dist/cli/commands/migrate-file-refs.js +1 -183
- package/dist/cli/commands/proficiency.js +1 -146
- package/dist/cli/commands/rm.js +1 -64
- package/dist/cli/commands/search.js +1 -90
- package/dist/cli/commands/setup-wizard.js +1 -387
- package/dist/cli/commands/setup.js +1 -170
- package/dist/cli/commands/skill.js +1 -151
- package/dist/cli/commands/status.js +1 -70
- package/dist/cli/commands/sync.js +1 -202
- package/dist/cli/commands/team.js +1 -142
- package/dist/cli/index.js +1 -87
- package/dist/config/manager.js +1 -372
- package/dist/db/database.js +1 -1400
- package/dist/embedding/e5-provider.js +1 -147
- package/dist/embedding/index.js +1 -34
- package/dist/embedding/local-provider.js +1 -157
- package/dist/embedding/openai-provider.js +1 -92
- package/dist/embedding/quantization.js +1 -89
- package/dist/extraction/dedup-manager.js +1 -161
- package/dist/extraction/emotion-filter.js +1 -33
- package/dist/extraction/extractor.js +1 -648
- package/dist/extraction/file-reference.js +1 -77
- package/dist/extraction/filter.js +1 -86
- package/dist/extraction/scorer.js +1 -142
- package/dist/extraction/similarity.js +1 -85
- package/dist/hooks/client-factory.js +1 -44
- package/dist/hooks/post-tool-use.js +1 -518
- package/dist/hooks/pre-compact.js +1 -209
- package/dist/hooks/session-end.js +1 -633
- package/dist/hooks/session-start.js +1 -549
- package/dist/hooks/shared.js +1 -110
- package/dist/hooks/user-prompt-submit.js +1 -316
- package/dist/i18n/index.js +1 -2
- package/dist/i18n/messages.js +1 -150
- package/dist/index.js +1 -43
- package/dist/lifecycle/cleanup-scheduler.js +1 -137
- package/dist/lifecycle/cleanup.js +1 -116
- package/dist/lifecycle/index.js +1 -13
- package/dist/lifecycle/quality-scorer.js +1 -46
- package/dist/lifecycle/tiering.js +1 -246
- package/dist/llm/client.js +1 -226
- package/dist/llm/index.js +1 -5
- package/dist/proficiency/actr-engine.js +1 -106
- package/dist/proficiency/detection.js +1 -77
- package/dist/proficiency/index.js +1 -9
- package/dist/proficiency/tracker.js +1 -173
- package/dist/proficiency/types.js +1 -8
- package/dist/providers/adapters.js +1 -140
- package/dist/providers/detector.js +1 -57
- package/dist/search/adaptive-router.js +1 -93
- package/dist/search/index.js +1 -9
- package/dist/search/ranker.js +1 -171
- package/dist/search/reranker.js +1 -155
- package/dist/session/parser.js +1 -130
- package/dist/skill/evaluator.js +1 -509
- package/dist/skill/index.js +1 -7
- package/dist/skill/types.js +1 -7
- package/dist/sync/client.js +1 -597
- package/dist/sync/encryption.js +1 -203
- package/dist/sync/index.js +1 -12
- package/dist/sync/queue.js +1 -214
- package/dist/sync/scheduler.js +1 -140
- package/dist/sync/synchronizer.js +1 -241
- package/dist/sync/team-synchronizer.js +1 -204
- package/dist/sync/vector-clock.js +1 -70
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +1 -132
- package/dist/utils/keychain.js +1 -170
- package/dist/utils/logger.js +1 -128
- package/package.json +14 -10
- package/dist/a2a/client.d.ts.map +0 -1
- package/dist/a2a/client.js.map +0 -1
- package/dist/a2a/discovery.d.ts.map +0 -1
- package/dist/a2a/discovery.js.map +0 -1
- package/dist/a2a/index.d.ts.map +0 -1
- package/dist/a2a/index.js.map +0 -1
- package/dist/a2a/types.d.ts.map +0 -1
- package/dist/a2a/types.js.map +0 -1
- package/dist/adapters/anthropic.d.ts.map +0 -1
- package/dist/adapters/anthropic.js.map +0 -1
- package/dist/chunking/chunker.d.ts.map +0 -1
- package/dist/chunking/chunker.js.map +0 -1
- package/dist/claude/sync.d.ts.map +0 -1
- package/dist/claude/sync.js.map +0 -1
- package/dist/cli/commands/add.d.ts.map +0 -1
- package/dist/cli/commands/add.js.map +0 -1
- package/dist/cli/commands/claude-sync.d.ts.map +0 -1
- package/dist/cli/commands/claude-sync.js.map +0 -1
- package/dist/cli/commands/cleanup.d.ts.map +0 -1
- package/dist/cli/commands/cleanup.js.map +0 -1
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/edit.d.ts.map +0 -1
- package/dist/cli/commands/edit.js.map +0 -1
- package/dist/cli/commands/embed.d.ts.map +0 -1
- package/dist/cli/commands/embed.js.map +0 -1
- package/dist/cli/commands/extract.d.ts.map +0 -1
- package/dist/cli/commands/extract.js.map +0 -1
- package/dist/cli/commands/health.d.ts.map +0 -1
- package/dist/cli/commands/health.js.map +0 -1
- package/dist/cli/commands/list.d.ts.map +0 -1
- package/dist/cli/commands/list.js.map +0 -1
- package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
- package/dist/cli/commands/migrate-chunks.js.map +0 -1
- package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
- package/dist/cli/commands/migrate-file-refs.js.map +0 -1
- package/dist/cli/commands/proficiency.d.ts.map +0 -1
- package/dist/cli/commands/proficiency.js.map +0 -1
- package/dist/cli/commands/rm.d.ts.map +0 -1
- package/dist/cli/commands/rm.js.map +0 -1
- package/dist/cli/commands/search.d.ts.map +0 -1
- package/dist/cli/commands/search.js.map +0 -1
- package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
- package/dist/cli/commands/setup-wizard.js.map +0 -1
- package/dist/cli/commands/setup.d.ts.map +0 -1
- package/dist/cli/commands/setup.js.map +0 -1
- package/dist/cli/commands/skill.d.ts.map +0 -1
- package/dist/cli/commands/skill.js.map +0 -1
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/sync.js.map +0 -1
- package/dist/cli/commands/team.d.ts.map +0 -1
- package/dist/cli/commands/team.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/config/manager.d.ts.map +0 -1
- package/dist/config/manager.js.map +0 -1
- package/dist/db/database.d.ts.map +0 -1
- package/dist/db/database.js.map +0 -1
- package/dist/embedding/e5-provider.d.ts.map +0 -1
- package/dist/embedding/e5-provider.js.map +0 -1
- package/dist/embedding/index.d.ts.map +0 -1
- package/dist/embedding/index.js.map +0 -1
- package/dist/embedding/local-provider.d.ts.map +0 -1
- package/dist/embedding/local-provider.js.map +0 -1
- package/dist/embedding/openai-provider.d.ts.map +0 -1
- package/dist/embedding/openai-provider.js.map +0 -1
- package/dist/embedding/quantization.d.ts.map +0 -1
- package/dist/embedding/quantization.js.map +0 -1
- package/dist/extraction/dedup-manager.d.ts.map +0 -1
- package/dist/extraction/dedup-manager.js.map +0 -1
- package/dist/extraction/emotion-filter.d.ts.map +0 -1
- package/dist/extraction/emotion-filter.js.map +0 -1
- package/dist/extraction/extractor.d.ts.map +0 -1
- package/dist/extraction/extractor.js.map +0 -1
- package/dist/extraction/file-reference.d.ts.map +0 -1
- package/dist/extraction/file-reference.js.map +0 -1
- package/dist/extraction/filter.d.ts.map +0 -1
- package/dist/extraction/filter.js.map +0 -1
- package/dist/extraction/scorer.d.ts.map +0 -1
- package/dist/extraction/scorer.js.map +0 -1
- package/dist/extraction/similarity.d.ts.map +0 -1
- package/dist/extraction/similarity.js.map +0 -1
- package/dist/hooks/client-factory.d.ts.map +0 -1
- package/dist/hooks/client-factory.js.map +0 -1
- package/dist/hooks/post-tool-use.d.ts.map +0 -1
- package/dist/hooks/post-tool-use.js.map +0 -1
- package/dist/hooks/pre-compact.d.ts.map +0 -1
- package/dist/hooks/pre-compact.js.map +0 -1
- package/dist/hooks/session-end.d.ts.map +0 -1
- package/dist/hooks/session-end.js.map +0 -1
- package/dist/hooks/session-start.d.ts.map +0 -1
- package/dist/hooks/session-start.js.map +0 -1
- package/dist/hooks/shared.d.ts.map +0 -1
- package/dist/hooks/shared.js.map +0 -1
- package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
- package/dist/hooks/user-prompt-submit.js.map +0 -1
- package/dist/i18n/index.d.ts.map +0 -1
- package/dist/i18n/index.js.map +0 -1
- package/dist/i18n/messages.d.ts.map +0 -1
- package/dist/i18n/messages.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
- package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
- package/dist/lifecycle/cleanup.d.ts.map +0 -1
- package/dist/lifecycle/cleanup.js.map +0 -1
- package/dist/lifecycle/index.d.ts.map +0 -1
- package/dist/lifecycle/index.js.map +0 -1
- package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
- package/dist/lifecycle/quality-scorer.js.map +0 -1
- package/dist/lifecycle/tiering.d.ts.map +0 -1
- package/dist/lifecycle/tiering.js.map +0 -1
- package/dist/llm/client.d.ts.map +0 -1
- package/dist/llm/client.js.map +0 -1
- package/dist/llm/index.d.ts.map +0 -1
- package/dist/llm/index.js.map +0 -1
- package/dist/proficiency/actr-engine.d.ts.map +0 -1
- package/dist/proficiency/actr-engine.js.map +0 -1
- package/dist/proficiency/detection.d.ts.map +0 -1
- package/dist/proficiency/detection.js.map +0 -1
- package/dist/proficiency/index.d.ts.map +0 -1
- package/dist/proficiency/index.js.map +0 -1
- package/dist/proficiency/tracker.d.ts.map +0 -1
- package/dist/proficiency/tracker.js.map +0 -1
- package/dist/proficiency/types.d.ts.map +0 -1
- package/dist/proficiency/types.js.map +0 -1
- package/dist/providers/adapters.d.ts.map +0 -1
- package/dist/providers/adapters.js.map +0 -1
- package/dist/providers/detector.d.ts.map +0 -1
- package/dist/providers/detector.js.map +0 -1
- package/dist/search/adaptive-router.d.ts.map +0 -1
- package/dist/search/adaptive-router.js.map +0 -1
- package/dist/search/index.d.ts.map +0 -1
- package/dist/search/index.js.map +0 -1
- package/dist/search/ranker.d.ts.map +0 -1
- package/dist/search/ranker.js.map +0 -1
- package/dist/search/reranker.d.ts.map +0 -1
- package/dist/search/reranker.js.map +0 -1
- package/dist/session/parser.d.ts.map +0 -1
- package/dist/session/parser.js.map +0 -1
- package/dist/skill/evaluator.d.ts.map +0 -1
- package/dist/skill/evaluator.js.map +0 -1
- package/dist/skill/index.d.ts.map +0 -1
- package/dist/skill/index.js.map +0 -1
- package/dist/skill/types.d.ts.map +0 -1
- package/dist/skill/types.js.map +0 -1
- package/dist/sync/client.d.ts.map +0 -1
- package/dist/sync/client.js.map +0 -1
- package/dist/sync/encryption.d.ts.map +0 -1
- package/dist/sync/encryption.js.map +0 -1
- package/dist/sync/index.d.ts.map +0 -1
- package/dist/sync/index.js.map +0 -1
- package/dist/sync/queue.d.ts.map +0 -1
- package/dist/sync/queue.js.map +0 -1
- package/dist/sync/scheduler.d.ts.map +0 -1
- package/dist/sync/scheduler.js.map +0 -1
- package/dist/sync/synchronizer.d.ts.map +0 -1
- package/dist/sync/synchronizer.js.map +0 -1
- package/dist/sync/team-synchronizer.d.ts.map +0 -1
- package/dist/sync/team-synchronizer.js.map +0 -1
- package/dist/sync/vector-clock.d.ts.map +0 -1
- package/dist/sync/vector-clock.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/utils/keychain.d.ts.map +0 -1
- package/dist/utils/keychain.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
|
@@ -1,147 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* E5 Embedding Provider (e5-small-v2, 384d)
|
|
3
|
-
*
|
|
4
|
-
* @huggingface/transformers 기반 로컬 임베딩.
|
|
5
|
-
* TF-IDF 64차원 대비 의미 검색 정확도 비약적 향상.
|
|
6
|
-
*
|
|
7
|
-
* 특징:
|
|
8
|
-
* - 384차원 dense vector
|
|
9
|
-
* - ONNX Runtime 기반 (~16ms/query CPU)
|
|
10
|
-
* - 모델 자동 다운로드 + 캐싱 (~66MB)
|
|
11
|
-
* - 싱글톤 세션 관리
|
|
12
|
-
*
|
|
13
|
-
* 설치: npm install @huggingface/transformers (optional dependency)
|
|
14
|
-
*/
|
|
15
|
-
const MODEL_NAME = 'Xenova/e5-small-v2';
|
|
16
|
-
const DIMENSIONS = 384;
|
|
17
|
-
// 싱글톤 파이프라인
|
|
18
|
-
let _pipeline = null;
|
|
19
|
-
let _loading = null;
|
|
20
|
-
/**
|
|
21
|
-
* transformers 파이프라인을 지연 로드 (최초 1회, ~500ms)
|
|
22
|
-
*/
|
|
23
|
-
async function getPipeline() {
|
|
24
|
-
if (_pipeline)
|
|
25
|
-
return _pipeline;
|
|
26
|
-
if (_loading)
|
|
27
|
-
return _loading;
|
|
28
|
-
_loading = (async () => {
|
|
29
|
-
try {
|
|
30
|
-
// 동적 import로 optional dependency 처리
|
|
31
|
-
// Dynamic import for optional dependency
|
|
32
|
-
const mod = await Function('return import("@huggingface/transformers")')();
|
|
33
|
-
_pipeline = await mod.pipeline('feature-extraction', MODEL_NAME, {
|
|
34
|
-
quantized: true, // 양자화 모델 사용 (더 작고 빠름)
|
|
35
|
-
});
|
|
36
|
-
return _pipeline;
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
_loading = null;
|
|
40
|
-
throw new Error(`E5 embedding provider requires @huggingface/transformers. ` +
|
|
41
|
-
`Install: npm install @huggingface/transformers\n` +
|
|
42
|
-
`Original error: ${err instanceof Error ? err.message : String(err)}`);
|
|
43
|
-
}
|
|
44
|
-
})();
|
|
45
|
-
return _loading;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* L2 정규화
|
|
49
|
-
*/
|
|
50
|
-
function normalize(vector) {
|
|
51
|
-
const norm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
|
|
52
|
-
if (norm === 0)
|
|
53
|
-
return vector;
|
|
54
|
-
return vector.map(val => val / norm);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Mean pooling: 모든 토큰의 임베딩을 평균
|
|
58
|
-
*/
|
|
59
|
-
function meanPool(output) {
|
|
60
|
-
// output shape: [1, seq_len, hidden_size]
|
|
61
|
-
const data = output.data || output;
|
|
62
|
-
if (Array.isArray(data) || ArrayBuffer.isView(data)) {
|
|
63
|
-
// Flat array → reshape + pool
|
|
64
|
-
const arr = Array.from(data);
|
|
65
|
-
const seqLen = arr.length / DIMENSIONS;
|
|
66
|
-
if (seqLen === 0)
|
|
67
|
-
return new Array(DIMENSIONS).fill(0);
|
|
68
|
-
const result = new Array(DIMENSIONS).fill(0);
|
|
69
|
-
for (let i = 0; i < seqLen; i++) {
|
|
70
|
-
for (let j = 0; j < DIMENSIONS; j++) {
|
|
71
|
-
result[j] += arr[i * DIMENSIONS + j];
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
for (let j = 0; j < DIMENSIONS; j++) {
|
|
75
|
-
result[j] /= seqLen;
|
|
76
|
-
}
|
|
77
|
-
return result;
|
|
78
|
-
}
|
|
79
|
-
// 이미 올바른 shape이면 그대로 반환
|
|
80
|
-
return Array.from(data).slice(0, DIMENSIONS);
|
|
81
|
-
}
|
|
82
|
-
export class E5EmbeddingProvider {
|
|
83
|
-
dimensions;
|
|
84
|
-
constructor(dimensions) {
|
|
85
|
-
this.dimensions = dimensions || DIMENSIONS;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* 단일 텍스트 임베딩 생성
|
|
89
|
-
* e5 모델은 "query: " 또는 "passage: " prefix가 필요
|
|
90
|
-
*/
|
|
91
|
-
async embed(text) {
|
|
92
|
-
const pipe = await getPipeline();
|
|
93
|
-
// e5 모델은 query prefix 추가 시 검색 성능 향상
|
|
94
|
-
const prefixedText = text.startsWith('query:') || text.startsWith('passage:')
|
|
95
|
-
? text
|
|
96
|
-
: `query: ${text}`;
|
|
97
|
-
const output = await pipe(prefixedText, {
|
|
98
|
-
pooling: 'mean',
|
|
99
|
-
normalize: true,
|
|
100
|
-
});
|
|
101
|
-
// transformers.js는 pooling+normalize 결과를 직접 반환
|
|
102
|
-
const vector = Array.from(output.data || output);
|
|
103
|
-
// 차원 맞추기
|
|
104
|
-
if (vector.length >= this.dimensions) {
|
|
105
|
-
return vector.slice(0, this.dimensions);
|
|
106
|
-
}
|
|
107
|
-
// mean pooling fallback
|
|
108
|
-
const pooled = meanPool(output);
|
|
109
|
-
return normalize(pooled);
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* 배치 임베딩 생성
|
|
113
|
-
*/
|
|
114
|
-
async embedBatch(texts) {
|
|
115
|
-
const results = [];
|
|
116
|
-
for (const text of texts) {
|
|
117
|
-
results.push(await this.embed(text));
|
|
118
|
-
}
|
|
119
|
-
return results;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* 프로바이더 사용 가능 여부 확인
|
|
123
|
-
*/
|
|
124
|
-
static async isAvailable() {
|
|
125
|
-
try {
|
|
126
|
-
await Function('return import("@huggingface/transformers")')();
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* 차원 수 반환
|
|
135
|
-
*/
|
|
136
|
-
getDimensions() {
|
|
137
|
-
return this.dimensions;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* 싱글톤 파이프라인 리셋 (테스트용)
|
|
142
|
-
*/
|
|
143
|
-
export function resetE5Pipeline() {
|
|
144
|
-
_pipeline = null;
|
|
145
|
-
_loading = null;
|
|
146
|
-
}
|
|
147
|
-
//# sourceMappingURL=e5-provider.js.map
|
|
1
|
+
function _0x16b9(_0xae37a7,_0x593d44){_0xae37a7=_0xae37a7-0x17c;const _0x1f45e4=_0x1f45();let _0x16b94f=_0x1f45e4[_0xae37a7];if(_0x16b9['IQoDfd']===undefined){var _0x4e4c8c=function(_0x638fd3){const _0x2f1020='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x27e55b='',_0x2bb212='';for(let _0x534b16=0x0,_0x3563d3,_0x248aee,_0x4f4ad1=0x0;_0x248aee=_0x638fd3['charAt'](_0x4f4ad1++);~_0x248aee&&(_0x3563d3=_0x534b16%0x4?_0x3563d3*0x40+_0x248aee:_0x248aee,_0x534b16++%0x4)?_0x27e55b+=String['fromCharCode'](0xff&_0x3563d3>>(-0x2*_0x534b16&0x6)):0x0){_0x248aee=_0x2f1020['indexOf'](_0x248aee);}for(let _0x376c7a=0x0,_0x53da6b=_0x27e55b['length'];_0x376c7a<_0x53da6b;_0x376c7a++){_0x2bb212+='%'+('00'+_0x27e55b['charCodeAt'](_0x376c7a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2bb212);};_0x16b9['gPCRtM']=_0x4e4c8c,_0x16b9['CZnFdI']={},_0x16b9['IQoDfd']=!![];}const _0x2704f0=_0x1f45e4[0x0],_0x2646fe=_0xae37a7+_0x2704f0,_0x388b3f=_0x16b9['CZnFdI'][_0x2646fe];return!_0x388b3f?(_0x16b94f=_0x16b9['gPCRtM'](_0x16b94f),_0x16b9['CZnFdI'][_0x2646fe]=_0x16b94f):_0x16b94f=_0x388b3f,_0x16b94f;}(function(_0x8a77f4,_0x42851f){function _0x359d6e(_0x142c51,_0xd4b867){return _0x16b9(_0x142c51- -0xd0,_0xd4b867);}function _0x5e4b63(_0x3a807d,_0x2d2a83){return _0x16b9(_0x3a807d- -0x3a8,_0x2d2a83);}const _0x24e7a0=_0x8a77f4();while(!![]){try{const _0x3bb290=-parseInt(_0x5e4b63(-0x229,-0x223))/0x1+-parseInt(_0x359d6e(0xd5,0xd5))/0x2*(-parseInt(_0x359d6e(0xb4,0xbe))/0x3)+parseInt(_0x5e4b63(-0x1f7,-0x1e0))/0x4+parseInt(_0x5e4b63(-0x228,-0x218))/0x5+parseInt(_0x5e4b63(-0x201,-0x21d))/0x6+-parseInt(_0x5e4b63(-0x1fd,-0x1f6))/0x7*(parseInt(_0x5e4b63(-0x1f0,-0x20f))/0x8)+parseInt(_0x359d6e(0xc2,0xd5))/0x9*(-parseInt(_0x5e4b63(-0x202,-0x207))/0xa);if(_0x3bb290===_0x42851f)break;else _0x24e7a0['push'](_0x24e7a0['shift']());}catch(_0x3c29bf){_0x24e7a0['push'](_0x24e7a0['shift']());}}}(_0x1f45,0x7bb96));const MODEL_NAME=_0x203487(0xc0,0xc4)+_0x1fbbd8(0x21,0x24),DIMENSIONS=0x180;let _pipeline=null,_loading=null;async function getPipeline(){const _0x246ea9={'PuywX':function(_0x4b9931,_0x270833){return _0x4b9931(_0x270833);}};if(_pipeline)return _pipeline;if(_loading)return _loading;return _loading=((async()=>{function _0x391dbf(_0x5cd5ad,_0x20610d){return _0x16b9(_0x5cd5ad-0x317,_0x20610d);}function _0x1c40c1(_0x18cb78,_0x515b47){return _0x16b9(_0x515b47- -0x2ff,_0x18cb78);}try{const _0x13cfc0=await _0x246ea9[_0x1c40c1(-0x160,-0x166)](Function,'return\x20imp'+_0x1c40c1(-0x159,-0x157)+_0x391dbf(0x4b4,0x4aa)+_0x391dbf(0x49d,0x487)+'\x22)')();return _pipeline=await _0x13cfc0[_0x1c40c1(-0x18c,-0x178)](_0x391dbf(0x4bb,0x4b4)+_0x391dbf(0x499,0x4b8),MODEL_NAME,{'quantized':!![]}),_pipeline;}catch(_0x96b12f){_loading=null;throw new Error(_0x391dbf(0x4a0,0x4bb)+_0x391dbf(0x49f,0x484)+_0x1c40c1(-0x189,-0x182)+'\x20@huggingf'+_0x1c40c1(-0x143,-0x149)+_0x1c40c1(-0x14e,-0x161)+('Install:\x20n'+'pm\x20install'+'\x20@huggingf'+_0x391dbf(0x4cd,0x4e3)+_0x391dbf(0x4ac,0x491))+(_0x1c40c1(-0x181,-0x164)+_0x391dbf(0x4ce,0x4e0)+(_0x96b12f instanceof Error?_0x96b12f[_0x1c40c1(-0x156,-0x14b)]:String(_0x96b12f))));}})()),_loading;}function normalize(_0x5dbef1){const _0x327e8c={'oocfl':function(_0x12fd4c,_0x3719e9){return _0x12fd4c===_0x3719e9;}};function _0x277e49(_0x47c29d,_0x46fafe){return _0x1fbbd8(_0x47c29d-0x27c,_0x46fafe);}function _0x379e32(_0x5b77ef,_0x1aa69e){return _0x1fbbd8(_0x5b77ef-0x3bd,_0x1aa69e);}const _0x294aab=Math['sqrt'](_0x5dbef1[_0x379e32(0x3fc,0x3f1)]((_0x4f6a6b,_0x3de01b)=>_0x4f6a6b+_0x3de01b*_0x3de01b,0x0));if(_0x327e8c[_0x277e49(0x2ab,0x2bb)](_0x294aab,0x0))return _0x5dbef1;return _0x5dbef1['map'](_0x2eed44=>_0x2eed44/_0x294aab);}function _0x1f45(){const _0x406d10=['mZy0mtG5nvbNCMvZwa','wMLHBeO','DhjHy3rPB24','wwrXEKW','mJGXndeYCgnxr3vQ','CxvLCNK6','yw5ZzM9YBwvYCW','CgLWzwXPBMu','BMCGChjVDMLKzq','rtuGzw1IzwrKAq','C2XPy2u','AMPTCvq','wwvZqLC','AxnbDMfPBgfIBa','DLjps2G','v0HRtem','CxvLCNK6ia','C21HBgWTDJi','mtuZuuDJq1zo','zgLTzw5ZAw9UCW','tKrmy0i','B3jTzxjZcG','zNjVBq','CMv0DxjUigLTCa','tK91Aw0','uhv5D1G','sML2qKy','t3jPz2LUywWGzq','tfjvrMS','Aw5NzMfJzs90CG','B3jTzxjZlIa','B29JzMW','BgvUz3rO','zMLSBa','BwvHBG','seD1BKS','zMvHDhvYzs1LEa','mtjQChDdvhq','mZa3ntCWuKzuCxrg','nJaYmJaYnLnLzg5jzG','B3j0kcjaAhvNzW','t0j5EKK','C3rHCNrZv2L0Aa','ntCWmti0mwLqEKDPqG','DvD0veK','CgfZC2fNztO','z2v0rgLTzw5ZAq','CMvKDwnL','sLbnELO','mteYntG3nK1truzYsG','AxnwAwv3','B25Z','BwvZC2fNzq','Cgr1vNy','ywnLl3rYyw5ZzG','CNjVCJOG','ogX5rhz5Ba','wgvUB3zHl2u1lq','ChvZAa','zw1IzwrcyxrJAa','CIbYzxf1AxjLCW','r1LwvhK','nZmYmJm3EvLOq2HP'];_0x1f45=function(){return _0x406d10;};return _0x1f45();}function meanPool(_0x531ef7){const _0x3ef826={'NDLcB':function(_0x2317cc,_0x66f6cc){return _0x2317cc/_0x66f6cc;},'pduVv':function(_0x49064e,_0x145d9c){return _0x49064e===_0x145d9c;},'jjmqT':function(_0xd30913,_0x265916){return _0xd30913<_0x265916;},'JivBF':function(_0x1bc156,_0x112f5c){return _0x1bc156+_0x112f5c;},'HGunK':function(_0x102bb8,_0x12b052){return _0x102bb8*_0x12b052;},'dqLXB':function(_0x2b9758,_0x4eb9ed){return _0x2b9758<_0x4eb9ed;}};function _0x52e06d(_0x4164ce,_0x4f6fb1){return _0x203487(_0x4f6fb1,_0x4164ce- -0x1d2);}function _0x59e97f(_0x499e2d,_0x451c40){return _0x203487(_0x451c40,_0x499e2d-0x352);}const _0x58d038=_0x531ef7['data']||_0x531ef7;if(Array['isArray'](_0x58d038)||ArrayBuffer[_0x59e97f(0x40f,0x3f3)](_0x58d038)){const _0x3f115d=Array['from'](_0x58d038),_0x2d7d96=_0x3ef826[_0x52e06d(-0x133,-0x133)](_0x3f115d[_0x59e97f(0x3fd,0x3fd)],DIMENSIONS);if(_0x3ef826[_0x59e97f(0x412,0x404)](_0x2d7d96,0x0))return new Array(DIMENSIONS)[_0x52e06d(-0x126,-0x141)](0x0);const _0x2cdd1f=new Array(DIMENSIONS)[_0x52e06d(-0x126,-0x11d)](0x0);for(let _0x3797e2=0x0;_0x3ef826[_0x59e97f(0x3e8,0x3fc)](_0x3797e2,_0x2d7d96);_0x3797e2++){for(let _0x5c2ec3=0x0;_0x5c2ec3<DIMENSIONS;_0x5c2ec3++){_0x2cdd1f[_0x5c2ec3]+=_0x3f115d[_0x3ef826[_0x59e97f(0x3f7,0x3fd)](_0x3ef826[_0x59e97f(0x400,0x3fa)](_0x3797e2,DIMENSIONS),_0x5c2ec3)];}}for(let _0xc9474=0x0;_0x3ef826['dqLXB'](_0xc9474,DIMENSIONS);_0xc9474++){_0x2cdd1f[_0xc9474]/=_0x2d7d96;}return _0x2cdd1f;}return Array[_0x59e97f(0x3f3,0x3fe)](_0x58d038)[_0x59e97f(0x3e7,0x3ef)](0x0,DIMENSIONS);}function _0x1fbbd8(_0x1dee59,_0x475c7a){return _0x16b9(_0x1dee59- -0x170,_0x475c7a);}function _0x203487(_0x3efb6b,_0x1b6082){return _0x16b9(_0x1b6082- -0xf5,_0x3efb6b);}export class E5EmbeddingProvider{[_0x1fbbd8(0x23,0x36)];constructor(_0x4bbae5){function _0x90fe29(_0x5f3e89,_0x32ac74){return _0x1fbbd8(_0x5f3e89-0x133,_0x32ac74);}function _0x13bb74(_0x1c54c8,_0x5d6d25){return _0x1fbbd8(_0x1c54c8- -0x213,_0x5d6d25);}const _0x117e8a={'vROKh':function(_0x2d8b72,_0x2c21d2){return _0x2d8b72||_0x2c21d2;}};this[_0x90fe29(0x156,0x158)]=_0x117e8a[_0x90fe29(0x151,0x156)](_0x4bbae5,DIMENSIONS);}async['embed'](_0x2f1b2c){const _0x2badf2={'LRUFk':function(_0x365ddb){return _0x365ddb();},'uWtTI':_0x207960(0x113,0x12e),'YdqzL':function(_0x4d60a7,_0x167cf1){return _0x4d60a7(_0x167cf1);}},_0x5819a5=await _0x2badf2[_0x4459d8(0x502,0x4e5)](getPipeline),_0x12dd83=_0x2f1b2c[_0x4459d8(0x50b,0x4f3)](_0x207960(0xeb,0xcf))||_0x2f1b2c[_0x4459d8(0x512,0x4f3)](_0x2badf2[_0x207960(0x112,0x117)])?_0x2f1b2c:_0x4459d8(0x4d0,0x4d9)+_0x2f1b2c,_0x411d56=await _0x5819a5(_0x12dd83,{'pooling':_0x4459d8(0x4f7,0x4eb),'normalize':!![]}),_0x1f8e0e=Array[_0x4459d8(0x4eb,0x4df)](_0x411d56['data']||_0x411d56);function _0x4459d8(_0x135f8d,_0x468141){return _0x203487(_0x135f8d,_0x468141-0x43e);}if(_0x1f8e0e[_0x4459d8(0x4d6,0x4e9)]>=this[_0x207960(0xf9,0x117)])return _0x1f8e0e['slice'](0x0,this['dimensions']);function _0x207960(_0x4dd075,_0x11457e){return _0x203487(_0x11457e,_0x4dd075-0x5b);}const _0x1f9ffb=_0x2badf2['YdqzL'](meanPool,_0x411d56);return _0x2badf2[_0x4459d8(0x4e1,0x4cc)](normalize,_0x1f9ffb);}async[_0x203487(0x68,0x87)](_0x25ed34){const _0xba869={'JPMzZ':function(_0x1ac6f8,_0x5e48fe){return _0x1ac6f8/_0x5e48fe;},'GYVTy':function(_0x431d99,_0x408e99){return _0x431d99<_0x408e99;},'ZialJ':function(_0x21024e,_0x14e8f8){return _0x21024e+_0x14e8f8;},'YesBW':_0x5bc577(0x300,0x2e5)},_0x590361=[];function _0x5bc577(_0x3aa8e2,_0x4c5d6c){return _0x1fbbd8(_0x4c5d6c-0x2bd,_0x3aa8e2);}for(const _0xa113ff of _0x25ed34){if('NOuim'===_0xba869[_0x4939be(0x48,0x4f)])_0x590361[_0x4939be(0x76,0x60)](await this['embed'](_0xa113ff));else{const _0x31baee=_0x264245['from'](_0x9aeaa5),_0x3cdd48=xFxfUY[_0x5bc577(0x2eb,0x2fd)](_0x31baee[_0x5bc577(0x2e3,0x2ed)],_0x544220);if(_0x3cdd48===0x0)return new _0x548112(_0xe37f11)[_0x4939be(0x5d,0x5f)](0x0);const _0x2d51bb=new _0x3dc91e(_0x4e0722)[_0x5bc577(0x2e1,0x2ee)](0x0);for(let _0x298ec0=0x0;_0x298ec0<_0x3cdd48;_0x298ec0++){for(let _0x3fffe9=0x0;xFxfUY[_0x4939be(0x3a,0x1c)](_0x3fffe9,_0x43abf3);_0x3fffe9++){_0x2d51bb[_0x3fffe9]+=_0x31baee[xFxfUY[_0x4939be(0x3d,0x4d)](_0x298ec0*_0x3bc01c,_0x3fffe9)];}}for(let _0x23c5e7=0x0;xFxfUY[_0x4939be(0x3a,0x59)](_0x23c5e7,_0x4cc939);_0x23c5e7++){_0x2d51bb[_0x23c5e7]/=_0x3cdd48;}return _0x2d51bb;}}function _0x4939be(_0x4a7709,_0x47a7a9){return _0x1fbbd8(_0x4a7709-0x2c,_0x47a7a9);}return _0x590361;}static async[_0x1fbbd8(0x1d,0x32)+'e'](){const _0x2d2f4a={'WHkLC':function(_0x1117b7,_0x45491b){return _0x1117b7(_0x45491b);},'OByzI':_0x4407bd(0x156,0x160)+_0x4407bd(0x16d,0x171)+_0x4407bd(0x162,0x166)+'ansformers'+'\x22)'};function _0xea9f0(_0x16bf43,_0x13b0e5){return _0x203487(_0x16bf43,_0x13b0e5-0x18b);}function _0x4407bd(_0x5d40a7,_0x24d2e5){return _0x203487(_0x5d40a7,_0x24d2e5-0xbe);}try{return await _0x2d2f4a[_0xea9f0(0x226,0x225)](Function,_0x2d2f4a[_0x4407bd(0x176,0x172)])(),!![];}catch{return![];}}[_0x1fbbd8(0x3e,0x20)+_0x1fbbd8(0x43,0x46)](){return this['dimensions'];}}export function resetE5Pipeline(){_pipeline=null,_loading=null;}
|
package/dist/embedding/index.js
CHANGED
|
@@ -1,34 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Embedding Module
|
|
3
|
-
*
|
|
4
|
-
* 로컬/OpenAI 임베딩 프로바이더 팩토리.
|
|
5
|
-
*/
|
|
6
|
-
import { LocalEmbeddingProvider } from './local-provider.js';
|
|
7
|
-
import { OpenAIEmbeddingProvider } from './openai-provider.js';
|
|
8
|
-
import { E5EmbeddingProvider } from './e5-provider.js';
|
|
9
|
-
/**
|
|
10
|
-
* 임베딩 프로바이더 생성 팩토리
|
|
11
|
-
*/
|
|
12
|
-
export function createEmbeddingProvider(config, llmConfig) {
|
|
13
|
-
if (config.provider === 'local') {
|
|
14
|
-
return new LocalEmbeddingProvider(config.dimensions);
|
|
15
|
-
}
|
|
16
|
-
if (config.provider === 'e5') {
|
|
17
|
-
return new E5EmbeddingProvider(config.dimensions || 384);
|
|
18
|
-
}
|
|
19
|
-
if (config.provider === 'openai') {
|
|
20
|
-
// OpenAI는 llmConfig에서 apiKey 가져옴
|
|
21
|
-
if (!llmConfig?.apiKey) {
|
|
22
|
-
throw new Error('OpenAI 임베딩에는 LLM API Key가 필요합니다');
|
|
23
|
-
}
|
|
24
|
-
return new OpenAIEmbeddingProvider({
|
|
25
|
-
apiKey: llmConfig.apiKey,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
throw new Error(`Unsupported embedding provider: ${config.provider}`);
|
|
29
|
-
}
|
|
30
|
-
export { LocalEmbeddingProvider } from './local-provider.js';
|
|
31
|
-
export { OpenAIEmbeddingProvider } from './openai-provider.js';
|
|
32
|
-
export { E5EmbeddingProvider, resetE5Pipeline } from './e5-provider.js';
|
|
33
|
-
export { quantizeToFloat32, dequantizeFromFloat32, quantizeToInt8, dequantizeFromInt8, } from './quantization.js';
|
|
34
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
(function(_0x1da6b5,_0x209e8a){var _0x2a2638=_0x1da6b5();function _0x299166(_0x5bd129,_0x494a06){return _0x231c(_0x5bd129- -0x2b2,_0x494a06);}function _0x4c9995(_0x46befc,_0x46981a){return _0x231c(_0x46befc- -0x11d,_0x46981a);}while(!![]){try{var _0x374365=-parseInt(_0x299166(-0xdc,-0xe5))/0x1*(parseInt(_0x299166(-0xe0,-0xeb))/0x2)+-parseInt(_0x299166(-0xed,-0xf0))/0x3+parseInt(_0x299166(-0xe7,-0xe5))/0x4+-parseInt(_0x299166(-0xe3,-0xd9))/0x5*(parseInt(_0x4c9995(0xa5,0xa5))/0x6)+-parseInt(_0x4c9995(0xad,0xb1))/0x7*(-parseInt(_0x4c9995(0xa4,0x98))/0x8)+parseInt(_0x299166(-0xdd,-0xde))/0x9*(parseInt(_0x299166(-0xe2,-0xdd))/0xa)+-parseInt(_0x299166(-0xe6,-0xde))/0xb*(-parseInt(_0x299166(-0xe9,-0xeb))/0xc);if(_0x374365===_0x209e8a)break;else _0x2a2638['push'](_0x2a2638['shift']());}catch(_0xe27cea){_0x2a2638['push'](_0x2a2638['shift']());}}}(_0x12ee,0x90d72));import{LocalEmbeddingProvider}from'./local-provider.js';import{OpenAIEmbeddingProvider}from'./openai-provider.js';import{E5EmbeddingProvider}from'./e5-provider.js';export function createEmbeddingProvider(_0x28164,_0x4685b2){var _0xd81a30={'RMcSN':_0x32de4c(0x3b7,0x3b8),'QQbCf':function(_0x4ffea6,_0x4366ba){return _0x4ffea6===_0x4366ba;}};if(_0x28164[_0x32de4c(0x3b9,0x3b7)]===_0xd81a30[_0x18bc5f(0x316,0x321)])return new LocalEmbeddingProvider(_0x28164[_0x32de4c(0x3b2,0x3ab)]);function _0x18bc5f(_0x18e2c2,_0x137829){return _0x231c(_0x18e2c2-0x145,_0x137829);}if(_0xd81a30[_0x32de4c(0x3b6,0x3b2)](_0x28164[_0x32de4c(0x3ba,0x3b7)],'e5'))return new E5EmbeddingProvider(_0x28164[_0x32de4c(0x3b2,0x3ab)]||0x180);if(_0x28164[_0x32de4c(0x3c2,0x3b7)]===_0x18bc5f(0x312,0x30f)){if(!_0x4685b2?.[_0x18bc5f(0x30d,0x310)])throw new Error('OpenAI\x20임베딩'+_0x32de4c(0x39a,0x3a4)+_0x32de4c(0x3a7,0x3a7)+'다');return new OpenAIEmbeddingProvider({'apiKey':_0x4685b2[_0x32de4c(0x3a0,0x3ac)]});}function _0x32de4c(_0x3a6865,_0x3287d8){return _0x231c(_0x3287d8-0x1e4,_0x3a6865);}throw new Error('Unsupporte'+_0x32de4c(0x3a9,0x3a8)+_0x18bc5f(0x30b,0x314)+':\x20'+_0x28164[_0x18bc5f(0x318,0x31a)]);}export{LocalEmbeddingProvider}from'./local-provider.js';function _0x231c(_0x4c7d6a,_0x21947c){_0x4c7d6a=_0x4c7d6a-0x1c0;var _0x12eeab=_0x12ee();var _0x231c70=_0x12eeab[_0x4c7d6a];if(_0x231c['hyWMIl']===undefined){var _0x5d28a7=function(_0x1e2438){var _0x5c3ef7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x2d3f3f='',_0x2e20fb='';for(var _0xf0b6=0x0,_0x25d0be,_0x1000fd,_0x3dc25d=0x0;_0x1000fd=_0x1e2438['charAt'](_0x3dc25d++);~_0x1000fd&&(_0x25d0be=_0xf0b6%0x4?_0x25d0be*0x40+_0x1000fd:_0x1000fd,_0xf0b6++%0x4)?_0x2d3f3f+=String['fromCharCode'](0xff&_0x25d0be>>(-0x2*_0xf0b6&0x6)):0x0){_0x1000fd=_0x5c3ef7['indexOf'](_0x1000fd);}for(var _0x4fe0dd=0x0,_0x1d1478=_0x2d3f3f['length'];_0x4fe0dd<_0x1d1478;_0x4fe0dd++){_0x2e20fb+='%'+('00'+_0x2d3f3f['charCodeAt'](_0x4fe0dd)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2e20fb);};_0x231c['jQUYQw']=_0x5d28a7,_0x231c['tUunyI']={},_0x231c['hyWMIl']=!![];}var _0xe9f16a=_0x12eeab[0x0],_0xe924b1=_0x4c7d6a+_0xe9f16a,_0x2131ea=_0x231c['tUunyI'][_0xe924b1];return!_0x2131ea?(_0x231c70=_0x231c['jQUYQw'](_0x231c70),_0x231c['tUunyI'][_0xe924b1]=_0x231c70):_0x231c70=_0x2131ea,_0x231c70;}export{OpenAIEmbeddingProvider}from'./openai-provider.js';export{E5EmbeddingProvider,resetE5Pipeline}from'./e5-provider.js';export{quantizeToFloat32,dequantizeFromFloat32,quantizeToInt8,dequantizeFromInt8}from'./quantization.js';function _0x12ee(){var _0x47d1cb=['mJrOELD5D0C','mJm0rLv6qKrn','ieTLEEQWGcdTLytSMPtTLANRI4G','zcbLBwjLzgrPBG','mJmWmta2m3LpBgTysq','zYbWCM92AwrLCG','zgLTzw5ZAw9UCW','yxbPs2v5','mJG0nhvuB2DKtG','mJy3ndG2mvnnwe53tq','mZa4ndCYmgPVtwLIDW','ntK4mdDiDgTbyMW','B3bLBMfP','uvfIq2y','mtq4nZK1yxfSwML6','mtm4otC5me1AB1HmvG','uK1Ju04','ntK0CgT4qLfz','ChjVDMLKzxi','Bg9JywW','mJD6zLLUqvK','mZCXmwrKA2nnEq','7jEq64QuieXmtsbbueK'];_0x12ee=function(){return _0x47d1cb;};return _0x12ee();}
|
|
@@ -1,157 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local Embedding Provider (TF-IDF 기반)
|
|
3
|
-
*
|
|
4
|
-
* 64차원 경량 로컬 임베딩 생성기.
|
|
5
|
-
* 외부 의존성 없이 순수 TypeScript로 구현.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* 간단한 해시 함수 (murmurhash 스타일)
|
|
9
|
-
*/
|
|
10
|
-
function hashString(str, seed = 0) {
|
|
11
|
-
let h = seed;
|
|
12
|
-
for (let i = 0; i < str.length; i++) {
|
|
13
|
-
h = Math.imul(h ^ str.charCodeAt(i), 2654435761);
|
|
14
|
-
}
|
|
15
|
-
return ((h ^ (h >>> 16)) >>> 0) % 0x7fffffff;
|
|
16
|
-
}
|
|
17
|
-
const _hashCache = new Map();
|
|
18
|
-
function cachedHashString(str, seed = 0) {
|
|
19
|
-
const key = `${str}:${seed}`;
|
|
20
|
-
let val = _hashCache.get(key);
|
|
21
|
-
if (val === undefined) {
|
|
22
|
-
val = hashString(str, seed);
|
|
23
|
-
_hashCache.set(key, val);
|
|
24
|
-
}
|
|
25
|
-
return val;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* 한국어/영어 기본 불용어
|
|
29
|
-
*/
|
|
30
|
-
const STOPWORDS = new Set([
|
|
31
|
-
// 영어
|
|
32
|
-
'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
|
|
33
|
-
'of', 'with', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
34
|
-
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'should',
|
|
35
|
-
'can', 'could', 'may', 'might', 'must', 'shall',
|
|
36
|
-
// 한국어
|
|
37
|
-
'이', '그', '저', '것', '수', '등', '및', '또는', '하다',
|
|
38
|
-
'있다', '없다', '되다', '이다', '아니다', '의', '가', '을', '를',
|
|
39
|
-
'에', '에서', '로', '으로', '와', '과', '도', '만', '까지',
|
|
40
|
-
]);
|
|
41
|
-
/**
|
|
42
|
-
* 텍스트를 토큰으로 분리 (공백/구두점 기준)
|
|
43
|
-
*/
|
|
44
|
-
function tokenize(text) {
|
|
45
|
-
return text
|
|
46
|
-
.toLowerCase()
|
|
47
|
-
.split(/[\s\p{P}]+/u)
|
|
48
|
-
.filter((token) => token.length > 1 && !STOPWORDS.has(token));
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Term Frequency 계산
|
|
52
|
-
*/
|
|
53
|
-
function computeTF(tokens) {
|
|
54
|
-
const tf = new Map();
|
|
55
|
-
for (const token of tokens) {
|
|
56
|
-
tf.set(token, (tf.get(token) ?? 0) + 1);
|
|
57
|
-
}
|
|
58
|
-
// 정규화 (전체 토큰 수로 나눔)
|
|
59
|
-
const total = tokens.length;
|
|
60
|
-
if (total > 0) {
|
|
61
|
-
for (const [token, count] of tf.entries()) {
|
|
62
|
-
tf.set(token, count / total);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return tf;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Local Embedding Provider (TF-IDF)
|
|
69
|
-
*/
|
|
70
|
-
export class LocalEmbeddingProvider {
|
|
71
|
-
idfMap = new Map();
|
|
72
|
-
dimensions;
|
|
73
|
-
corpusSize = 0;
|
|
74
|
-
tokenCache = new Map();
|
|
75
|
-
tokenCacheOrder = [];
|
|
76
|
-
TOKEN_CACHE_MAX = 500;
|
|
77
|
-
constructor(dimensions = 64) {
|
|
78
|
-
this.dimensions = dimensions;
|
|
79
|
-
}
|
|
80
|
-
cachedTokenize(text) {
|
|
81
|
-
const cached = this.tokenCache.get(text);
|
|
82
|
-
if (cached)
|
|
83
|
-
return cached;
|
|
84
|
-
const tokens = tokenize(text);
|
|
85
|
-
this.tokenCache.set(text, tokens);
|
|
86
|
-
this.tokenCacheOrder.push(text);
|
|
87
|
-
if (this.tokenCacheOrder.length > this.TOKEN_CACHE_MAX) {
|
|
88
|
-
const oldest = this.tokenCacheOrder.shift();
|
|
89
|
-
this.tokenCache.delete(oldest);
|
|
90
|
-
}
|
|
91
|
-
return tokens;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Corpus 업데이트 (IDF 계산)
|
|
95
|
-
*/
|
|
96
|
-
updateCorpus(documents) {
|
|
97
|
-
this.corpusSize = documents.length;
|
|
98
|
-
if (documents.length === 0)
|
|
99
|
-
return;
|
|
100
|
-
// 각 토큰이 몇 개 문서에 등장하는지 카운트
|
|
101
|
-
const df = new Map();
|
|
102
|
-
for (const doc of documents) {
|
|
103
|
-
const tokens = new Set(tokenize(doc));
|
|
104
|
-
for (const token of tokens) {
|
|
105
|
-
df.set(token, (df.get(token) ?? 0) + 1);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
// IDF 계산: log(N / df)
|
|
109
|
-
this.idfMap.clear();
|
|
110
|
-
for (const [token, docFreq] of df.entries()) {
|
|
111
|
-
this.idfMap.set(token, Math.log(this.corpusSize / docFreq));
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* 단일 텍스트 임베딩 생성
|
|
116
|
-
*/
|
|
117
|
-
embed(text) {
|
|
118
|
-
const tokens = this.cachedTokenize(text);
|
|
119
|
-
if (tokens.length === 0) {
|
|
120
|
-
return new Array(this.dimensions).fill(0);
|
|
121
|
-
}
|
|
122
|
-
const tf = computeTF(tokens);
|
|
123
|
-
const vector = new Array(this.dimensions).fill(0);
|
|
124
|
-
for (const [token, tfValue] of tf.entries()) {
|
|
125
|
-
const idf = this.idfMap.get(token) ?? 1;
|
|
126
|
-
const tfidf = tfValue * idf;
|
|
127
|
-
const index = cachedHashString(token) % this.dimensions;
|
|
128
|
-
vector[index] += tfidf;
|
|
129
|
-
}
|
|
130
|
-
return this.normalize(vector);
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Corpus와 함께 임베딩 생성
|
|
134
|
-
*/
|
|
135
|
-
embedWithCorpus(text, corpusTexts) {
|
|
136
|
-
if (corpusTexts && corpusTexts.length > 0) {
|
|
137
|
-
this.updateCorpus(corpusTexts);
|
|
138
|
-
}
|
|
139
|
-
return this.embed(text);
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* 배치 임베딩 생성
|
|
143
|
-
*/
|
|
144
|
-
embedBatch(texts) {
|
|
145
|
-
return texts.map((text) => this.embed(text));
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* L2 정규화
|
|
149
|
-
*/
|
|
150
|
-
normalize(vector) {
|
|
151
|
-
const norm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
|
|
152
|
-
if (norm === 0)
|
|
153
|
-
return vector;
|
|
154
|
-
return vector.map((val) => val / norm);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
//# sourceMappingURL=local-provider.js.map
|
|
1
|
+
(function(_0x1e3d31,_0x35a763){const _0xe99301=_0x1e3d31();function _0x362370(_0xd4cc93,_0x465477){return _0x2d85(_0x465477- -0x174,_0xd4cc93);}function _0x40c718(_0xc086be,_0x498cbb){return _0x2d85(_0x498cbb-0x2aa,_0xc086be);}while(!![]){try{const _0x5c9cb0=parseInt(_0x362370(0x46,0x4c))/0x1+parseInt(_0x40c718(0x471,0x45e))/0x2*(parseInt(_0x362370(0x31,0x17))/0x3)+parseInt(_0x40c718(0x44d,0x451))/0x4+-parseInt(_0x362370(0x4,0x19))/0x5+-parseInt(_0x362370(-0x3,0x1e))/0x6+-parseInt(_0x362370(0x22,0x2d))/0x7+parseInt(_0x40c718(0x464,0x45c))/0x8;if(_0x5c9cb0===_0x35a763)break;else _0xe99301['push'](_0xe99301['shift']());}catch(_0x509485){_0xe99301['push'](_0xe99301['shift']());}}}(_0x3299,0x518f0));function hashString(_0x333385,_0x41cc54=0x0){const _0x3c59f9={'MUJAQ':function(_0x47c784,_0xa3a36c){return _0x47c784<_0xa3a36c;},'lBLbX':function(_0x5ea497,_0x31f6ff){return _0x5ea497>>>_0x31f6ff;},'LimYQ':function(_0x203684,_0xaf57f3){return _0x203684^_0xaf57f3;}};function _0x1b9c0e(_0x3e4052,_0x256682){return _0x2d85(_0x3e4052-0x257,_0x256682);}function _0xe3cbcb(_0x3c1038,_0xbcd9c8){return _0x2d85(_0xbcd9c8-0x3e0,_0x3c1038);}let _0x92e8d7=_0x41cc54;for(let _0x47cf57=0x0;_0x3c59f9[_0xe3cbcb(0x58c,0x5a8)](_0x47cf57,_0x333385[_0xe3cbcb(0x58d,0x590)]);_0x47cf57++){_0x92e8d7=Math[_0x1b9c0e(0x3f6,0x411)](_0x92e8d7^_0x333385['charCodeAt'](_0x47cf57),0x9e3779b1);}return _0x3c59f9[_0x1b9c0e(0x3f0,0x411)](_0x3c59f9[_0xe3cbcb(0x578,0x578)](_0x92e8d7,_0x3c59f9['lBLbX'](_0x92e8d7,0x10)),0x0)%0x7fffffff;}const _hashCache=new Map();function _0x3299(){const _0x4d4c28=['C2v0','B3jWDxm','yMvLBG','C2HVDwXK','y29YChvZu2L6zq','zw50CMLLCW','tvvkqve','EgTyB3G','BM9YBwfSAxPL','yMvPBMC','yxjL','m3PQy1jpuG','yNv0','mtCZmdi0nxHtsMfeuq','D2LSBa','AhzrC1q','yw5K','Dg9Rzw5dywnOzq','mtm3odaYnK9JCKntuq','zw1Izwq','AwrMtwfW','DxbKyxrLq29YCa','zMLSBa','y291Bgq','tgLTwve','BejmyLG','D2vYzq','zhjKrve','Bg9N','y2fU','t3jKzxi','Aw11Ba','C2HHBgW','mZG2nda4ngTXzw9RzG','7jwe64Ui64UK','D2L0Aa','zgLTzw5ZAw9UCW','zM9Y','BxvZDa','nJq0mJG4qNbPtw9H','z2v0','Bwf5','Dg9mB3DLCKnHCW','zgLK','AgfZ','y2fJAgvKvg9Rzq','ve9lru5Fq0fdsa','u0ziruC','BgvUz3rO','zMLSDgvY','ntGYotqWofLRCu5eCq','Ew1xBMq','otqWodaYzMnOr0jn','BKr2tKy','BwfW','qu5Ry1a','zgvSzxrL','BwLNAhq','BxbSyLa','Agf2zq','DgHL','ufzey1u','shnUvfq','AgfK','mtaXnJq3D3f2D3LX','rv9nqvG'];_0x3299=function(){return _0x4d4c28;};return _0x3299();}function cachedHashString(_0x48306c,_0x1d8256=0x0){const _0x247e40=_0x48306c+':'+_0x1d8256;let _0x1c4f3e=_hashCache['get'](_0x247e40);_0x1c4f3e===undefined&&(_0x1c4f3e=hashString(_0x48306c,_0x1d8256),_hashCache[_0x5526b2(-0xda,-0xb9)](_0x247e40,_0x1c4f3e));function _0x5526b2(_0xd7bb93,_0x31a1c9){return _0x2d85(_0xd7bb93- -0x29c,_0x31a1c9);}return _0x1c4f3e;}function _0x2d85(_0x347240,_0x152ef9){_0x347240=_0x347240-0x18a;const _0x329933=_0x3299();let _0x2d857e=_0x329933[_0x347240];if(_0x2d85['BdyfuW']===undefined){var _0x16d60c=function(_0x496640){const _0x4880bf='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x36bdf1='',_0x5e7cf6='';for(let _0x1c9e66=0x0,_0x5342ed,_0x2c6fc2,_0x3d163b=0x0;_0x2c6fc2=_0x496640['charAt'](_0x3d163b++);~_0x2c6fc2&&(_0x5342ed=_0x1c9e66%0x4?_0x5342ed*0x40+_0x2c6fc2:_0x2c6fc2,_0x1c9e66++%0x4)?_0x36bdf1+=String['fromCharCode'](0xff&_0x5342ed>>(-0x2*_0x1c9e66&0x6)):0x0){_0x2c6fc2=_0x4880bf['indexOf'](_0x2c6fc2);}for(let _0x180087=0x0,_0x4335d2=_0x36bdf1['length'];_0x180087<_0x4335d2;_0x180087++){_0x5e7cf6+='%'+('00'+_0x36bdf1['charCodeAt'](_0x180087)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5e7cf6);};_0x2d85['yYPLMd']=_0x16d60c,_0x2d85['LfiJAy']={},_0x2d85['BdyfuW']=!![];}const _0x282e75=_0x329933[0x0],_0x5c7df6=_0x347240+_0x282e75,_0x543491=_0x2d85['LfiJAy'][_0x5c7df6];return!_0x543491?(_0x2d857e=_0x2d85['yYPLMd'](_0x2d857e),_0x2d85['LfiJAy'][_0x5c7df6]=_0x2d857e):_0x2d857e=_0x543491,_0x2d857e;}function _0x258cdd(_0x4cc027,_0x877677){return _0x2d85(_0x4cc027-0xa5,_0x877677);}const STOPWORDS=new Set([_0x172590(-0xd0,-0xdb),'a','an',_0x172590(-0xfa,-0x107),'or',_0x258cdd(0x231,0x252),'in','on','at','to',_0x258cdd(0x24a,0x233),'of',_0x172590(-0xe5,-0xf4),'is',_0x258cdd(0x22f,0x231),'was',_0x258cdd(0x23f,0x244),'be',_0x258cdd(0x269,0x27a),_0x172590(-0xd7,-0xcc),_0x172590(-0xe9,-0xdc),_0x172590(-0xd3,-0xeb),_0x258cdd(0x264,0x24a),'do','does',_0x172590(-0xf0,-0xec),_0x258cdd(0x233,0x220),'would',_0x172590(-0xe7,-0xd2),_0x172590(-0xff,-0xfa),_0x258cdd(0x23c,0x256),_0x172590(-0xfd,-0xee),_0x258cdd(0x25e,0x243),_0x172590(-0x109,-0xf1),_0x258cdd(0x245,0x227),'이','그','저','것','수','등','및','또는','하다','있다','없다','되다','이다',_0x258cdd(0x247,0x250),'의','가','을','를','에','에서','로','으로','와','과','도','만','까지']);function tokenize(_0x59b061){function _0x24f4d6(_0x44a3ad,_0x451224){return _0x172590(_0x451224,_0x44a3ad- -0xfa);}function _0x1d2eab(_0x2fc09d,_0x31bb55){return _0x172590(_0x31bb55,_0x2fc09d-0x658);}return _0x59b061[_0x24f4d6(-0x1e7,-0x1f4)+'e']()['split'](/[\s\p{P}]+/u)[_0x24f4d6(-0x1e0,-0x1ee)](_0xe895b3=>_0xe895b3[_0x1d2eab(0x571,0x55f)]>0x1&&!STOPWORDS[_0x1d2eab(0x56d,0x58b)](_0xe895b3));}function _0x172590(_0x1c7d5c,_0x60decb){return _0x2d85(_0x60decb- -0x297,_0x1c7d5c);}function computeTF(_0x5e980a){const _0x16ac03=new Map();function _0x57f7f7(_0x3211c3,_0x1b80cd){return _0x172590(_0x3211c3,_0x1b80cd- -0x12);}for(const _0x442352 of _0x5e980a){_0x16ac03['set'](_0x442352,(_0x16ac03[_0x55ad88(-0x140,-0x155)](_0x442352)??0x0)+0x1);}const _0x1bb147=_0x5e980a[_0x57f7f7(-0xf4,-0xf9)];function _0x55ad88(_0x5cade2,_0x3574f3){return _0x172590(_0x3574f3,_0x5cade2- -0x51);}if(_0x1bb147>0x0)for(const [_0x1b5736,_0x2ae7ae]of _0x16ac03[_0x55ad88(-0x121,-0x140)]()){_0x16ac03[_0x55ad88(-0x126,-0x121)](_0x1b5736,_0x2ae7ae/_0x1bb147);}return _0x16ac03;}export class LocalEmbeddingProvider{[_0x172590(-0xe7,-0x103)]=new Map();['dimensions'];['corpusSize']=0x0;[_0x172590(-0x108,-0x106)]=new Map();[_0x172590(-0x124,-0x106)+_0x258cdd(0x243,0x260)]=[];[_0x172590(-0x100,-0xe9)+_0x258cdd(0x266,0x27c)]=0x1f4;constructor(_0x4ada69=0x40){function _0x4f6ef2(_0x424ec7,_0x2b349a){return _0x258cdd(_0x424ec7- -0x1a1,_0x2b349a);}this[_0x4f6ef2(0xa8,0xaa)]=_0x4ada69;}[_0x172590(-0x109,-0xea)+'nize'](_0x1168fe){const _0x5df950={'SaIxb':function(_0x50448e,_0x458b66){return _0x50448e<_0x458b66;},'MVlLB':function(_0x66d585,_0x1e0e3f){return _0x66d585^_0x1e0e3f;},'drdEQ':function(_0x118d55,_0x2a9abe){return _0x118d55(_0x2a9abe);},'ANkcP':function(_0x6c836,_0x12eeeb){return _0x6c836>_0x12eeeb;},'SFHEG':function(_0x4170ea,_0x42593a){return _0x4170ea!==_0x42593a;},'nDvNF':'UwwIU'},_0x1fd1b1=this[_0x536c62(0x3ec,0x3f7)][_0x536c62(0x403,0x408)](_0x1168fe);if(_0x1fd1b1)return _0x1fd1b1;function _0x35f5eb(_0x353184,_0x3d3952){return _0x172590(_0x353184,_0x3d3952-0x406);}const _0x98818=_0x5df950[_0x536c62(0x3f6,0x400)](tokenize,_0x1168fe);this[_0x35f5eb(0x30c,0x300)]['set'](_0x1168fe,_0x98818),this[_0x35f5eb(0x30e,0x300)+_0x35f5eb(0x2ef,0x30d)]['push'](_0x1168fe);function _0x536c62(_0x5b7ba0,_0x50f6b7){return _0x172590(_0x50f6b7,_0x5b7ba0-0x4f2);}if(_0x5df950[_0x35f5eb(0x338,0x326)](this[_0x536c62(0x3ec,0x402)+'Order'][_0x35f5eb(0x312,0x31f)],this[_0x35f5eb(0x328,0x31d)+_0x536c62(0x41c,0x425)])){if(_0x5df950[_0x536c62(0x40a,0x3f9)](_0x5df950[_0x35f5eb(0x31e,0x324)],_0x5df950[_0x536c62(0x410,0x430)])){let _0x57f9ae=_0x2c6fc2;for(let _0x39516e=0x0;nZcwsE['SaIxb'](_0x39516e,_0x5d8918[_0x35f5eb(0x319,0x31f)]);_0x39516e++){_0x57f9ae=_0xe75064[_0x536c62(0x3fa,0x3e4)](nZcwsE['MVlLB'](_0x57f9ae,_0x30eea8['charCodeAt'](_0x39516e)),0x9e3779b1);}return((_0x57f9ae^_0x57f9ae>>>0x10)>>>0x0)%0x7fffffff;}else{const _0x110d75=this[_0x536c62(0x3ec,0x3f5)+_0x35f5eb(0x316,0x30d)]['shift']();this['tokenCache'][_0x35f5eb(0x31c,0x327)](_0x110d75);}}return _0x98818;}[_0x172590(-0x11a,-0x102)+'us'](_0x44b8a3){const _0x1e20fb={'xkXox':function(_0x1769b4,_0x23a2c3){return _0x1769b4(_0x23a2c3);},'HsnTT':function(_0x305884,_0x39e828){return _0x305884/_0x39e828;}};this['corpusSize']=_0x44b8a3[_0x199675(-0x1af,-0x1c3)];if(_0x44b8a3[_0x2fe9ca(0x55d,0x555)]===0x0)return;const _0x2db349=new Map();function _0x2fe9ca(_0x95d2a0,_0xbdeca3){return _0x172590(_0xbdeca3,_0x95d2a0-0x644);}function _0x199675(_0x43db5c,_0x5c968d){return _0x172590(_0x5c968d,_0x43db5c- -0xc8);}for(const _0x5d5774 of _0x44b8a3){const _0x2dce69=new Set(_0x1e20fb[_0x199675(-0x196,-0x1a7)](tokenize,_0x5d5774));for(const _0xbcddbe of _0x2dce69){_0x2db349[_0x2fe9ca(0x56f,0x559)](_0xbcddbe,(_0x2db349['get'](_0xbcddbe)??0x0)+0x1);}}this['idfMap']['clear']();for(const [_0x5f5329,_0x37d0d2]of _0x2db349[_0x2fe9ca(0x574,0x555)]()){this[_0x199675(-0x1cb,-0x1c2)]['set'](_0x5f5329,Math[_0x2fe9ca(0x549,0x554)](_0x1e20fb[_0x2fe9ca(0x56b,0x555)](this[_0x199675(-0x199,-0x1b2)],_0x37d0d2)));}}['embed'](_0x5019ba){const _0xda6e16={'mplbP':function(_0x42c925,_0x1b2ed9){return _0x42c925===_0x1b2ed9;},'QQPbp':function(_0x4af7f0,_0x226bb6){return _0x4af7f0*_0x226bb6;},'ymWnd':function(_0x4a8eff,_0x2981d7){return _0x4a8eff%_0x2981d7;},'JmpoR':function(_0x4159c6,_0x5f4f59){return _0x4159c6(_0x5f4f59);}},_0xd7a344=this[_0x1b7f50(-0x1bd,-0x1c5)+'nize'](_0x5019ba);if(_0xda6e16[_0x1b7f50(-0x1b5,-0x1b8)](_0xd7a344[_0x184b6a(0x222,0x233)],0x0))return new Array(this[_0x184b6a(0x216,0x222)])[_0x184b6a(0x208,0x1e9)](0x0);const _0x1101c5=computeTF(_0xd7a344),_0x22c68d=new Array(this['dimensions'])[_0x184b6a(0x208,0x21d)](0x0);for(const [_0x2a435a,_0x113c70]of _0x1101c5[_0x184b6a(0x239,0x230)]()){const _0x417822=this[_0x1b7f50(-0x1fd,-0x1de)]['get'](_0x2a435a)??0x1,_0x489ab1=_0xda6e16['QQPbp'](_0x113c70,_0x417822),_0xc56c01=_0xda6e16[_0x1b7f50(-0x1d2,-0x1bf)](_0xda6e16['JmpoR'](cachedHashString,_0x2a435a),this['dimensions']);_0x22c68d[_0xc56c01]+=_0x489ab1;}function _0x1b7f50(_0x5a3cfb,_0x365b54){return _0x172590(_0x5a3cfb,_0x365b54- -0xdb);}function _0x184b6a(_0x1d4863,_0x11497e){return _0x172590(_0x11497e,_0x1d4863-0x309);}return this[_0x1b7f50(-0x1bf,-0x1a8)](_0x22c68d);}['embedWithC'+_0x172590(-0xe2,-0xd4)](_0x3a68e1,_0x3b808c){const _0xdbf9fb={'hvQsT':function(_0x47bd5d,_0x3a63e8){return _0x47bd5d>_0x3a63e8;}};_0x3b808c&&_0xdbf9fb[_0x2740e1(0x44,0x55)](_0x3b808c[_0x32b7e1(-0x98,-0xa4)],0x0)&&this['updateCorp'+'us'](_0x3b808c);function _0x2740e1(_0x21eb6a,_0x2be856){return _0x258cdd(_0x21eb6a- -0x1f0,_0x2be856);}function _0x32b7e1(_0x3f7a8f,_0x5ff610){return _0x258cdd(_0x3f7a8f- -0x2ed,_0x5ff610);}return this[_0x2740e1(0x48,0x59)](_0x3a68e1);}['embedBatch'](_0x2d062e){function _0x10566f(_0x1f5519,_0x1bc3af){return _0x258cdd(_0x1bc3af- -0x3f6,_0x1f5519);}function _0xf7d12e(_0x27fa59,_0x275bf7){return _0x258cdd(_0x275bf7- -0x29c,_0x27fa59);}return _0x2d062e[_0x10566f(-0x17b,-0x19b)](_0x58d5e9=>this[_0xf7d12e(-0x6a,-0x64)](_0x58d5e9));}[_0x172590(-0xea,-0xcd)](_0x2a6bb8){const _0x3fa723={'PVDcU':function(_0x43cd0e,_0x533c09){return _0x43cd0e===_0x533c09;}},_0xc5f02a=Math['sqrt'](_0x2a6bb8['reduce']((_0x43d5f4,_0x13f9c4)=>_0x43d5f4+_0x13f9c4*_0x13f9c4,0x0));function _0xbfaf5c(_0x325cf2,_0x30c29f){return _0x258cdd(_0x30c29f-0x2ed,_0x325cf2);}function _0x2e7ffc(_0x4d1e1b,_0x34aee1){return _0x258cdd(_0x34aee1- -0x149,_0x4d1e1b);}if(_0x3fa723[_0x2e7ffc(0x130,0x119)](_0xc5f02a,0x0))return _0x2a6bb8;return _0x2a6bb8[_0x2e7ffc(0x12a,0x112)](_0x50c044=>_0x50c044/_0xc5f02a);}}
|
|
@@ -1,92 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* OpenAI Embedding Provider
|
|
3
|
-
*
|
|
4
|
-
* text-embedding-3-small (1536차원) 사용.
|
|
5
|
-
* Native fetch 사용, 외부 의존성 없음.
|
|
6
|
-
*/
|
|
7
|
-
export class OpenAIEmbeddingProvider {
|
|
8
|
-
apiKey;
|
|
9
|
-
model;
|
|
10
|
-
timeout;
|
|
11
|
-
baseUrl = 'https://api.openai.com/v1';
|
|
12
|
-
constructor(options) {
|
|
13
|
-
this.apiKey = options.apiKey;
|
|
14
|
-
this.model = options.model ?? 'text-embedding-3-small';
|
|
15
|
-
this.timeout = options.timeout ?? 30000;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* 단일 텍스트 임베딩 생성
|
|
19
|
-
*/
|
|
20
|
-
async embed(text) {
|
|
21
|
-
const result = await this.embedBatch([text]);
|
|
22
|
-
return result[0];
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* 배치 임베딩 생성 (최대 2048개)
|
|
26
|
-
*/
|
|
27
|
-
async embedBatch(texts) {
|
|
28
|
-
if (texts.length === 0) {
|
|
29
|
-
return [];
|
|
30
|
-
}
|
|
31
|
-
const controller = new AbortController();
|
|
32
|
-
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
33
|
-
try {
|
|
34
|
-
const response = await fetch(`${this.baseUrl}/embeddings`, {
|
|
35
|
-
method: 'POST',
|
|
36
|
-
headers: {
|
|
37
|
-
'Content-Type': 'application/json',
|
|
38
|
-
'Authorization': `Bearer ${this.apiKey}`,
|
|
39
|
-
},
|
|
40
|
-
body: JSON.stringify({
|
|
41
|
-
input: texts,
|
|
42
|
-
model: this.model,
|
|
43
|
-
}),
|
|
44
|
-
signal: controller.signal,
|
|
45
|
-
});
|
|
46
|
-
clearTimeout(timeoutId);
|
|
47
|
-
if (!response.ok) {
|
|
48
|
-
await this.handleErrorResponse(response);
|
|
49
|
-
}
|
|
50
|
-
const data = await response.json();
|
|
51
|
-
// 응답 순서대로 임베딩 추출
|
|
52
|
-
const embeddings = data.data
|
|
53
|
-
.sort((a, b) => a.index - b.index)
|
|
54
|
-
.map((item) => item.embedding);
|
|
55
|
-
return embeddings;
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
clearTimeout(timeoutId);
|
|
59
|
-
if (error instanceof Error) {
|
|
60
|
-
if (error.name === 'AbortError') {
|
|
61
|
-
throw new Error(`OpenAI 요청 시간 초과: ${this.timeout}ms`);
|
|
62
|
-
}
|
|
63
|
-
throw new Error(`OpenAI API 오류: ${error.message}`);
|
|
64
|
-
}
|
|
65
|
-
throw error;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* 에러 응답 처리
|
|
70
|
-
*/
|
|
71
|
-
async handleErrorResponse(response) {
|
|
72
|
-
const status = response.status;
|
|
73
|
-
if (status === 401) {
|
|
74
|
-
throw new Error('OpenAI 인증 실패: API Key를 확인하세요');
|
|
75
|
-
}
|
|
76
|
-
if (status === 429) {
|
|
77
|
-
throw new Error('OpenAI Rate Limit: 잠시 후 다시 시도하세요');
|
|
78
|
-
}
|
|
79
|
-
let message = `OpenAI HTTP ${status}`;
|
|
80
|
-
try {
|
|
81
|
-
const errorBody = await response.json();
|
|
82
|
-
if (errorBody.error?.message) {
|
|
83
|
-
message += `: ${errorBody.error.message}`;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
// JSON 파싱 실패 시 기본 메시지 사용
|
|
88
|
-
}
|
|
89
|
-
throw new Error(message);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=openai-provider.js.map
|
|
1
|
+
(function(_0x9a446,_0x32a743){const _0x11bcc9=_0x9a446();function _0x5447b6(_0x5c027c,_0x230785){return _0x3ba5(_0x230785- -0x16,_0x5c027c);}function _0x2a75fe(_0x4436e6,_0x328e04){return _0x3ba5(_0x4436e6-0x265,_0x328e04);}while(!![]){try{const _0x4589b1=parseInt(_0x2a75fe(0x45a,0x449))/0x1+-parseInt(_0x5447b6(0x1cf,0x1ec))/0x2+parseInt(_0x5447b6(0x1b3,0x1bd))/0x3*(parseInt(_0x2a75fe(0x437,0x451))/0x4)+parseInt(_0x2a75fe(0x462,0x445))/0x5+parseInt(_0x2a75fe(0x469,0x464))/0x6*(parseInt(_0x2a75fe(0x435,0x43c))/0x7)+parseInt(_0x2a75fe(0x453,0x435))/0x8*(parseInt(_0x5447b6(0x1e5,0x1f0))/0x9)+parseInt(_0x5447b6(0x207,0x1ea))/0xa*(-parseInt(_0x2a75fe(0x45e,0x47c))/0xb);if(_0x4589b1===_0x32a743)break;else _0x11bcc9['push'](_0x11bcc9['shift']());}catch(_0x1ee244){_0x11bcc9['push'](_0x11bcc9['shift']());}}}(_0x3d0c,0x8ecda));function _0x3d0c(){const _0x18136e=['t3bLBKfjiefqsq','7iUK7yYOoIbbueKGs2u','Aw5KzxG','ue9tva','l2vTyMvKzgLUzW','ndu0mZD0qNHlBuu','BMfTzq','mtjysNP0Bhe','otq2ndy3tMHhqNDb','ug1OC3a','EEULVcdTMzxSNBJTLzJSHlJSMPq','zw1IzwrcyxrJAa','A1j3zgm','qMvHCMvYia','CLjLC3bVBNnL','t3bLBKfjieHuva','t3bLBKfjioYDUoYMNsa','ywjVCNq','zxjYB3i','Bw9KzwW','C2LNBMfS','t2TXy1G','zsbmAw1PDdOG7j6G','r3DstNG','yMfZzvvYBa','BwvZC2fNzq','Be9dC2C','t3bLBKfjioYALoYYRsa','zgf0yq','ioYyPoULMdOG','BwfW','qwjVCNrfCNjVCG','AgfUzgXLrxjYBW','yxbWBgLJyxrPBW','yxbPs2v5','mty5ode2wxHju01S','ANnVBG','AKvYCeW','AM5QsNO','C3rHDhvZ','As5VCgvUywKUyW','EunSy0W','nJG2otCYEeTqAxbj','zw1IzwrKAw5N','C29YDa','BgvUz3rO','mtKYnwH2vMP4sG','7iUCio2BHcdRI6tSI5WG7iUC64+e7zwy','7iUC6RceioY0IoQZVdOG','Dgv4Dc1LBwjLza','ntu2ntG5mgjrtMLXua','zw1Izwq','Ahr0Chm6lY9HCa','mtGZnZKWuwLPEM9J','DgLTzw91Da','mta4mJuYmLvkzKPUEG','B20VDJe','mZK2txzVzKHS','zgLUzY0ZlxnTyq','ndK1y3jQr2vL'];_0x3d0c=function(){return _0x18136e;};return _0x3d0c();}function _0x527375(_0x845750,_0x11a6ce){return _0x3ba5(_0x11a6ce- -0x183,_0x845750);}function _0x3ba5(_0x4abbf6,_0x195aad){_0x4abbf6=_0x4abbf6-0x1cd;const _0x3d0c58=_0x3d0c();let _0x3ba5f8=_0x3d0c58[_0x4abbf6];if(_0x3ba5['ttpSju']===undefined){var _0x1ce4d1=function(_0x177698){const _0x36ce21='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x237743='',_0x4d7d5d='';for(let _0x2fbd29=0x0,_0x3d6e32,_0x595331,_0x37a6ee=0x0;_0x595331=_0x177698['charAt'](_0x37a6ee++);~_0x595331&&(_0x3d6e32=_0x2fbd29%0x4?_0x3d6e32*0x40+_0x595331:_0x595331,_0x2fbd29++%0x4)?_0x237743+=String['fromCharCode'](0xff&_0x3d6e32>>(-0x2*_0x2fbd29&0x6)):0x0){_0x595331=_0x36ce21['indexOf'](_0x595331);}for(let _0x57a6c5=0x0,_0x1f7443=_0x237743['length'];_0x57a6c5<_0x1f7443;_0x57a6c5++){_0x4d7d5d+='%'+('00'+_0x237743['charCodeAt'](_0x57a6c5)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4d7d5d);};_0x3ba5['xFkQMC']=_0x1ce4d1,_0x3ba5['oKwWkY']={},_0x3ba5['ttpSju']=!![];}const _0xfe201b=_0x3d0c58[0x0],_0xb9afdb=_0x4abbf6+_0xfe201b,_0x35b111=_0x3ba5['oKwWkY'][_0xb9afdb];return!_0x35b111?(_0x3ba5f8=_0x3ba5['xFkQMC'](_0x3ba5f8),_0x3ba5['oKwWkY'][_0xb9afdb]=_0x3ba5f8):_0x3ba5f8=_0x35b111,_0x3ba5f8;}function _0x5c03dd(_0x5d8d77,_0x2b4e03){return _0x3ba5(_0x2b4e03-0x3d1,_0x5d8d77);}export class OpenAIEmbeddingProvider{[_0x5c03dd(0x5ba,0x5be)];[_0x527375(0x48,0x5b)];[_0x527375(0x93,0x7e)];[_0x527375(0x6c,0x60)]=_0x5c03dd(0x5b5,0x5d0)+_0x527375(0x72,0x70)+_0x527375(0x64,0x80);constructor(_0x586687){function _0x7c34a5(_0x2394b6,_0x5bc9de){return _0x527375(_0x2394b6,_0x5bc9de- -0x24f);}this['apiKey']=_0x586687[_0x4577e5(0x16f,0x18c)],this[_0x4577e5(0x160,0x179)]=_0x586687['model']??_0x4577e5(0x17e,0x181)+_0x7c34a5(-0x1d9,-0x1cd)+'ll';function _0x4577e5(_0x579e20,_0x1247fb){return _0x527375(_0x1247fb,_0x579e20-0x105);}this[_0x4577e5(0x183,0x19e)]=_0x586687['timeout']??0x7530;}async[_0x527375(0x71,0x7b)](_0x1332df){function _0x562411(_0x5d8bd8,_0x261068){return _0x5c03dd(_0x5d8bd8,_0x261068- -0x539);}const _0x3906bc=await this[_0x562411(0x84,0x6e)]([_0x1332df]);return _0x3906bc[0x0];}async[_0x527375(0x4e,0x53)](_0x582749){const _0x45dcfa={'IMXNU':function(_0x43b5e6,_0x1d5a9d){return _0x43b5e6===_0x1d5a9d;},'yClcL':function(_0x3179cf,_0x584315,_0x22978f){return _0x3179cf(_0x584315,_0x22978f);},'lOCsg':_0x37270f(0x200,0x1ed)+'n/json','Pmhsp':function(_0x36a6d6,_0x4c82fe){return _0x36a6d6!==_0x4c82fe;},'jnjJz':_0x37270f(0x1db,0x1e1),'GwRNx':_0x37270f(0x1ea,0x1eb)};function _0x37270f(_0x5cdb93,_0x31a852){return _0x5c03dd(_0x5cdb93,_0x31a852- -0x3d0);}function _0x565ab0(_0x1154e5,_0x2091b9){return _0x5c03dd(_0x1154e5,_0x2091b9- -0x40b);}if(_0x45dcfa['IMXNU'](_0x582749[_0x565ab0(0x1d2,0x1be)],0x0))return[];const _0x3e2261=new AbortController(),_0x428d12=setTimeout(()=>_0x3e2261[_0x565ab0(0x1a7,0x1a2)](),this[_0x565ab0(0x1d8,0x1c7)]);try{const _0x1b7b0d=await _0x45dcfa[_0x565ab0(0x1cd,0x1ba)](fetch,this[_0x565ab0(0x196,0x1a9)]+(_0x565ab0(0x18b,0x195)+'s'),{'method':_0x565ab0(0x198,0x194),'headers':{'Content-Type':_0x45dcfa[_0x565ab0(0x19e,0x1ab)],'Authorization':_0x37270f(0x1ca,0x1d9)+this['apiKey']},'body':JSON['stringify']({'input':_0x582749,'model':this[_0x37270f(0x1f4,0x1df)]}),'signal':_0x3e2261[_0x37270f(0x1cb,0x1e0)]});clearTimeout(_0x428d12);!_0x1b7b0d['ok']&&await this[_0x37270f(0x204,0x1ec)+'rResponse'](_0x1b7b0d);const _0x267137=await _0x1b7b0d['json'](),_0x3cec40=_0x267137[_0x565ab0(0x196,0x1ad)][_0x37270f(0x1f4,0x1f8)]((_0x3ef3ab,_0x20f8f9)=>_0x3ef3ab[_0x37270f(0x1e4,0x1ce)]-_0x20f8f9[_0x37270f(0x1c0,0x1ce)])[_0x565ab0(0x1b2,0x1af)](_0x5b2a23=>_0x5b2a23[_0x565ab0(0x1a3,0x1bc)]);return _0x3cec40;}catch(_0x902c42){if(_0x45dcfa[_0x565ab0(0x1a6,0x19a)](_0x45dcfa['jnjJz'],_0x45dcfa[_0x37270f(0x1e0,0x1f2)]))throw new _0x52bcec(_0x37270f(0x1de,0x1dc)+_0x565ab0(0x1d0,0x1ce)+_0x37270f(0x1ee,0x1d6));else{clearTimeout(_0x428d12);if(_0x902c42 instanceof Error){if(_0x902c42[_0x565ab0(0x1b1,0x197)]===_0x45dcfa[_0x565ab0(0x19c,0x1a8)])throw new Error(_0x37270f(0x1d2,0x1e7)+_0x565ab0(0x1b8,0x1c1)+this[_0x37270f(0x1f6,0x202)]+'ms');throw new Error('OpenAI\x20API'+_0x37270f(0x1ce,0x1e9)+_0x902c42[_0x37270f(0x1d7,0x1e5)]);}throw _0x902c42;}}}async['handleErro'+_0x5c03dd(0x5bf,0x5aa)](_0x3bf5cf){const _0x19d0f7={'jErpL':_0xf5df46(-0x14c,-0x13e),'kRwdc':'kdHcJ','rlqyC':'OpenAI\x20Rat'+_0xf5df46(-0x137,-0x147)+_0x4c533f(0x562,0x55f)+'세요'};function _0x4c533f(_0x981fc0,_0x374dbe){return _0x527375(_0x981fc0,_0x374dbe-0x4e8);}const _0xd18fe6=_0x3bf5cf[_0xf5df46(-0x144,-0x136)];if(_0xd18fe6===0x191)throw new Error(_0x4c533f(0x53a,0x540)+_0xf5df46(-0x125,-0x120)+_0xf5df46(-0x148,-0x153));if(_0xd18fe6===0x1ad){if(_0x19d0f7[_0xf5df46(-0x134,-0x151)]==='kdHcJ')throw new Error(_0x19d0f7['rlqyC']);else{if(_0x30a479['name']===Xiheht[_0xf5df46(-0x121,-0x138)])throw new _0x43ffcd(_0xf5df46(-0x144,-0x142)+_0x4c533f(0x551,0x560)+this[_0xf5df46(-0x111,-0x127)]+'ms');throw new _0x8749b7(_0xf5df46(-0x131,-0x121)+_0x4c533f(0x565,0x54d)+_0x2284c9[_0xf5df46(-0x149,-0x144)]);}}function _0xf5df46(_0x309a5b,_0x4a440e){return _0x527375(_0x309a5b,_0x4a440e- -0x1a5);}let _0x3e89ac=_0x4c533f(0x53c,0x53f)+'P\x20'+_0xd18fe6;try{const _0x1787d2=await _0x3bf5cf[_0xf5df46(-0x134,-0x139)]();_0x1787d2[_0xf5df46(-0x163,-0x14b)]?.[_0x4c533f(0x530,0x549)]&&(_0x3e89ac+=':\x20'+_0x1787d2[_0xf5df46(-0x150,-0x14b)][_0xf5df46(-0x13a,-0x144)]);}catch{}throw new Error(_0x3e89ac);}}
|
|
@@ -1,89 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Vector Quantization Module
|
|
3
|
-
*
|
|
4
|
-
* Scalar Quantization으로 임베딩 저장 공간 절감.
|
|
5
|
-
* - Float32: 50% 절감 (float64 → float32)
|
|
6
|
-
* - Int8: 87.5% 절감 (float64 → int8)
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Float32 양자화 (float64 → float32, 50% 저장 공간 절감)
|
|
10
|
-
*/
|
|
11
|
-
export function quantizeToFloat32(embedding) {
|
|
12
|
-
const float32Array = new Float32Array(embedding);
|
|
13
|
-
return Buffer.from(float32Array.buffer, float32Array.byteOffset, float32Array.byteLength);
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Float32 역양자화 (buffer → number[])
|
|
17
|
-
*/
|
|
18
|
-
export function dequantizeFromFloat32(buffer) {
|
|
19
|
-
const arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
|
|
20
|
-
const float32Array = new Float32Array(arrayBuffer);
|
|
21
|
-
return Array.from(float32Array);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Int8 양자화 (float64 → int8, 87.5% 저장 공간 절감)
|
|
25
|
-
* Min-Max Scaling: value → round((value - min) / (max - min) * 255) - 128
|
|
26
|
-
*/
|
|
27
|
-
export function quantizeToInt8(embedding, stats) {
|
|
28
|
-
if (embedding.length === 0) {
|
|
29
|
-
return {
|
|
30
|
-
buffer: Buffer.alloc(0),
|
|
31
|
-
stats: { min: 0, max: 0, dimensions: 0 },
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
// Stats 계산 (제공되지 않은 경우)
|
|
35
|
-
let min, max;
|
|
36
|
-
if (stats) {
|
|
37
|
-
min = stats.min;
|
|
38
|
-
max = stats.max;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
min = Math.min(...embedding);
|
|
42
|
-
max = Math.max(...embedding);
|
|
43
|
-
}
|
|
44
|
-
const range = max - min;
|
|
45
|
-
const int8Array = new Int8Array(embedding.length);
|
|
46
|
-
// 모든 값이 같은 경우 (range = 0)
|
|
47
|
-
if (range === 0) {
|
|
48
|
-
int8Array.fill(0);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
for (let i = 0; i < embedding.length; i++) {
|
|
52
|
-
const normalized = (embedding[i] - min) / range; // 0~1 범위로 정규화
|
|
53
|
-
const scaled = Math.round(normalized * 255) - 128; // -128~127 범위로 변환
|
|
54
|
-
int8Array[i] = Math.max(-128, Math.min(127, scaled)); // clamp
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
buffer: Buffer.from(int8Array.buffer, int8Array.byteOffset, int8Array.byteLength),
|
|
59
|
-
stats: {
|
|
60
|
-
min,
|
|
61
|
-
max,
|
|
62
|
-
dimensions: embedding.length,
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Int8 역양자화 (buffer + stats → number[])
|
|
68
|
-
*/
|
|
69
|
-
export function dequantizeFromInt8(buffer, stats) {
|
|
70
|
-
if (buffer.length === 0 || stats.dimensions === 0) {
|
|
71
|
-
return [];
|
|
72
|
-
}
|
|
73
|
-
const arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
|
|
74
|
-
const int8Array = new Int8Array(arrayBuffer);
|
|
75
|
-
const range = stats.max - stats.min;
|
|
76
|
-
const result = new Array(stats.dimensions);
|
|
77
|
-
// 모든 값이 같았던 경우 (range = 0)
|
|
78
|
-
if (range === 0) {
|
|
79
|
-
result.fill(stats.min);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
for (let i = 0; i < stats.dimensions; i++) {
|
|
83
|
-
const scaled = (int8Array[i] + 128) / 255; // 0~1 범위로 복원
|
|
84
|
-
result[i] = scaled * range + stats.min; // 원래 범위로 복원
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return result;
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=quantization.js.map
|
|
1
|
+
(function(_0x457d06,_0x196098){function _0x54480e(_0x14b758,_0x3666da){return _0x451b(_0x3666da-0x2de,_0x14b758);}function _0x4e1080(_0x45c589,_0x231cb8){return _0x451b(_0x45c589-0x182,_0x231cb8);}const _0xa9f095=_0x457d06();while(!![]){try{const _0x4d08d8=parseInt(_0x4e1080(0x268,0x260))/0x1+parseInt(_0x4e1080(0x273,0x26b))/0x2*(parseInt(_0x54480e(0x3cf,0x3c8))/0x3)+parseInt(_0x4e1080(0x272,0x26f))/0x4*(-parseInt(_0x4e1080(0x254,0x248))/0x5)+-parseInt(_0x4e1080(0x262,0x263))/0x6*(-parseInt(_0x4e1080(0x25b,0x269))/0x7)+parseInt(_0x4e1080(0x25d,0x252))/0x8+-parseInt(_0x54480e(0x3b4,0x3b4))/0x9*(parseInt(_0x54480e(0x3bf,0x3bf))/0xa)+-parseInt(_0x54480e(0x3c4,0x3b6))/0xb*(-parseInt(_0x4e1080(0x25e,0x252))/0xc);if(_0x4d08d8===_0x196098)break;else _0xa9f095['push'](_0xa9f095['shift']());}catch(_0x205bd5){_0xa9f095['push'](_0xa9f095['shift']());}}}(_0x419f,0x9928f));export function quantizeToFloat32(_0x4aaf89){const _0x60b4c4=new Float32Array(_0x4aaf89);function _0x3b1fb8(_0x1a57d3,_0x1e2260){return _0x451b(_0x1a57d3- -0x204,_0x1e2260);}function _0x5d3223(_0x131ac4,_0x232514){return _0x451b(_0x131ac4-0x2e,_0x232514);}return Buffer[_0x3b1fb8(-0x131,-0x135)](_0x60b4c4[_0x5d3223(0x103,0xfe)],_0x60b4c4['byteOffset'],_0x60b4c4[_0x3b1fb8(-0x11d,-0x126)]);}function _0x451b(_0x30b8bd,_0x535f7f){_0x30b8bd=_0x30b8bd-0xce;const _0x419fff=_0x419f();let _0x451ba5=_0x419fff[_0x30b8bd];if(_0x451b['zZhZqT']===undefined){var _0x30a9c8=function(_0x4ddee0){const _0xce1391='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5d07dc='',_0x5d2610='';for(let _0x2afa12=0x0,_0x452809,_0x5c7e96,_0x23b471=0x0;_0x5c7e96=_0x4ddee0['charAt'](_0x23b471++);~_0x5c7e96&&(_0x452809=_0x2afa12%0x4?_0x452809*0x40+_0x5c7e96:_0x5c7e96,_0x2afa12++%0x4)?_0x5d07dc+=String['fromCharCode'](0xff&_0x452809>>(-0x2*_0x2afa12&0x6)):0x0){_0x5c7e96=_0xce1391['indexOf'](_0x5c7e96);}for(let _0x1ef8c6=0x0,_0x5474b9=_0x5d07dc['length'];_0x1ef8c6<_0x5474b9;_0x1ef8c6++){_0x5d2610+='%'+('00'+_0x5d07dc['charCodeAt'](_0x1ef8c6)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5d2610);};_0x451b['sYaHGm']=_0x30a9c8,_0x451b['mVcHXf']={},_0x451b['zZhZqT']=!![];}const _0x50dd1a=_0x419fff[0x0],_0x211704=_0x30b8bd+_0x50dd1a,_0x1bf83c=_0x451b['mVcHXf'][_0x211704];return!_0x1bf83c?(_0x451ba5=_0x451b['sYaHGm'](_0x451ba5),_0x451b['mVcHXf'][_0x211704]=_0x451ba5):_0x451ba5=_0x1bf83c,_0x451ba5;}function _0x419f(){const _0x544a28=['C0DOAKK','ntiXmZu4nfnKELfJwa','mJrQtgjWzwS','BwLU','BejzuwO','zLfotee','nNfKvLfPra','mtaWmJu2otbNC25My24','D2j1sLq','C2XPy2u','refjtwi','zMLSBa','nZCYntGYtxflEKr1','yNL0zuXLBMD0Aa','Bwf4','zgLTzw5ZAw9UCW','mJuZnZDeA1npwgq','zwr5AxG','ywXSB2m','tgLwshi','D2zhCue','C3LKyvq','odrSz1jJsvy','mNHYwgnzza','zM5breK','yMzHDeO','BgvUz3rO','CM91BMq','mtm4otiWuNPLA2nQ','zNjVBq','yNL0zu9MzNnLDa','yNvMzMvY','owPVAMTqCq','AgPczhe','mtK0nJC4mg5PsLvJrq','mJK4nJCZoxDsqu1otq'];_0x419f=function(){return _0x544a28;};return _0x419f();}export function dequantizeFromFloat32(_0x2bf2e8){const _0x539dde=_0x2bf2e8[_0x188fba(-0x2a,-0x3c)][_0x188fba(-0x1c,-0xa)](_0x2bf2e8['byteOffset'],_0x2bf2e8[_0xac6511(0x14,0x4)]+_0x2bf2e8['byteLength']);function _0xac6511(_0x428805,_0x33c855){return _0x451b(_0x428805- -0xc0,_0x33c855);}const _0x29fdd0=new Float32Array(_0x539dde);function _0x188fba(_0x427619,_0x14d024){return _0x451b(_0x427619- -0xff,_0x14d024);}return Array[_0x188fba(-0x2c,-0x29)](_0x29fdd0);}export function quantizeToInt8(_0x1504ed,_0x4bc03e){function _0x50cb11(_0x1f7b70,_0x18a956){return _0x451b(_0x1f7b70- -0x362,_0x18a956);}const _0x57c966={'sydaT':function(_0x3581d9,_0x51eaaa){return _0x3581d9===_0x51eaaa;},'JNsjz':function(_0x3225c7,_0x1821d0){return _0x3225c7===_0x1821d0;},'wfGqA':_0x50cb11(-0x28b,-0x29d),'edyix':function(_0x5192f7,_0x106a1b){return _0x5192f7!==_0x106a1b;},'fnADI':'INGua','LiVHr':_0x50cb11(-0x288,-0x289),'fQNLA':function(_0x48b96c,_0x41d6e3){return _0x48b96c<_0x41d6e3;},'FEupt':function(_0x293cb,_0x16f53a){return _0x293cb/_0x16f53a;},'bfatJ':function(_0x62af7c,_0x13de72){return _0x62af7c-_0x13de72;}};if(_0x57c966[_0xa04b32(0x468,0x474)](_0x1504ed[_0x50cb11(-0x292,-0x284)],0x0))return{'buffer':Buffer[_0xa04b32(0x47f,0x471)](0x0),'stats':{'min':0x0,'max':0x0,'dimensions':0x0}};function _0xa04b32(_0x13d5c8,_0xea9fd5){return _0x451b(_0xea9fd5-0x385,_0x13d5c8);}let _0x28bb2f,_0x42b68e;if(_0x4bc03e){if(_0x57c966['JNsjz'](_0x57c966[_0x50cb11(-0x274,-0x26a)],_0x57c966[_0x50cb11(-0x274,-0x269)]))_0x28bb2f=_0x4bc03e['min'],_0x42b68e=_0x4bc03e['max'];else return[];}else _0x28bb2f=Math['min'](..._0x1504ed),_0x42b68e=Math[_0x50cb11(-0x27a,-0x26e)](..._0x1504ed);const _0x3b1412=_0x42b68e-_0x28bb2f,_0x3869bd=new Int8Array(_0x1504ed['length']);if(_0x3b1412===0x0){if(_0x57c966[_0x50cb11(-0x277,-0x268)](_0x57c966[_0x50cb11(-0x294,-0x28d)],_0x57c966[_0xa04b32(0x47b,0x472)]))_0x3869bd[_0xa04b32(0x465,0x46a)](0x0);else return{'buffer':_0x20fa2f[_0xa04b32(0x475,0x471)](0x0),'stats':{'min':0x0,'max':0x0,'dimensions':0x0}};}else for(let _0x3ea45e=0x0;_0x57c966[_0x50cb11(-0x283,-0x27f)](_0x3ea45e,_0x1504ed['length']);_0x3ea45e++){const _0x4ff67b=_0x57c966['FEupt'](_0x57c966[_0x50cb11(-0x293,-0x29e)](_0x1504ed[_0x3ea45e],_0x28bb2f),_0x3b1412),_0x2d007d=_0x57c966[_0x50cb11(-0x293,-0x298)](Math[_0x50cb11(-0x291,-0x29c)](_0x4ff67b*0xff),0x80);_0x3869bd[_0x3ea45e]=Math['max'](-0x80,Math[_0xa04b32(0x474,0x462)](0x7f,_0x2d007d));}return{'buffer':Buffer[_0x50cb11(-0x28f,-0x282)](_0x3869bd[_0x50cb11(-0x28d,-0x28e)],_0x3869bd[_0x50cb11(-0x28e,-0x282)],_0x3869bd[_0x50cb11(-0x27b,-0x275)]),'stats':{'min':_0x28bb2f,'max':_0x42b68e,'dimensions':_0x1504ed[_0x50cb11(-0x292,-0x28c)]}};}export function dequantizeFromInt8(_0x455243,_0x2168dc){const _0x1be91d={'wbuJT':function(_0x505da3,_0x17598e){return _0x505da3===_0x17598e;},'DAIMb':function(_0x166a9c,_0x38314){return _0x166a9c+_0x38314;},'zGdwo':function(_0x44451d,_0x58cfca){return _0x44451d-_0x58cfca;},'Geqen':function(_0x1e0fc2,_0x1054b5){return _0x1e0fc2<_0x1054b5;},'lBYQj':function(_0x4bde7f,_0x440a07){return _0x4bde7f*_0x440a07;}};function _0x2bb85c(_0x462b04,_0xe0cb17){return _0x451b(_0xe0cb17- -0x331,_0x462b04);}if(_0x455243[_0x2bb85c(-0x272,-0x261)]===0x0||_0x1be91d[_0x7961a5(0x65,0x58)](_0x2168dc[_0x7961a5(0x4e,0x5f)],0x0))return[];const _0x52a794=_0x455243['buffer'][_0x2bb85c(-0x251,-0x24e)](_0x455243[_0x2bb85c(-0x256,-0x25d)],_0x1be91d[_0x7961a5(0x51,0x5a)](_0x455243[_0x2bb85c(-0x250,-0x25d)],_0x455243['byteLength']));function _0x7961a5(_0x378aaf,_0x26be57){return _0x451b(_0x26be57- -0x8a,_0x378aaf);}const _0x1d3065=new Int8Array(_0x52a794),_0x36fac0=_0x1be91d['zGdwo'](_0x2168dc['max'],_0x2168dc[_0x2bb85c(-0x24e,-0x254)]),_0x3a52ca=new Array(_0x2168dc[_0x2bb85c(-0x241,-0x248)]);if(_0x36fac0===0x0)_0x3a52ca[_0x7961a5(0x49,0x5b)](_0x2168dc['min']);else for(let _0x272f3e=0x0;_0x1be91d['Geqen'](_0x272f3e,_0x2168dc['dimensions']);_0x272f3e++){const _0x4e4cb0=_0x1be91d['DAIMb'](_0x1d3065[_0x272f3e],0x80)/0xff;_0x3a52ca[_0x272f3e]=_0x1be91d[_0x2bb85c(-0x263,-0x253)](_0x4e4cb0,_0x36fac0)+_0x2168dc[_0x2bb85c(-0x24b,-0x254)];}return _0x3a52ca;}
|