@debian777/kairos-mcp 3.3.0 → 3.3.1
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/README.md +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/bootstrap.d.ts +2 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +60 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +18 -3
- package/dist/config.js.map +1 -1
- package/dist/embed-docs/mem/00000000-0000-0000-0000-000000002001.md +1 -1
- package/dist/embed-docs/mem/00000000-0000-0000-0000-000000002002.md +1 -1
- package/dist/http/http-api-dump.d.ts.map +1 -1
- package/dist/http/http-api-dump.js +1 -1
- package/dist/http/http-api-dump.js.map +1 -1
- package/dist/http/http-api-mint.d.ts.map +1 -1
- package/dist/http/http-api-mint.js +31 -4
- package/dist/http/http-api-mint.js.map +1 -1
- package/dist/http/http-api-next.d.ts.map +1 -1
- package/dist/http/http-api-next.js +2 -2
- package/dist/http/http-api-next.js.map +1 -1
- package/dist/http/http-api-snapshot.d.ts.map +1 -1
- package/dist/http/http-api-snapshot.js +0 -1
- package/dist/http/http-api-snapshot.js.map +1 -1
- package/dist/http/http-auth-callback.d.ts.map +1 -1
- package/dist/http/http-auth-callback.js +3 -2
- package/dist/http/http-auth-callback.js.map +1 -1
- package/dist/http/http-auth-middleware.d.ts +1 -0
- package/dist/http/http-auth-middleware.d.ts.map +1 -1
- package/dist/http/http-auth-middleware.js +2 -0
- package/dist/http/http-auth-middleware.js.map +1 -1
- package/dist/http/http-error-handlers.d.ts.map +1 -1
- package/dist/http/http-error-handlers.js +12 -1
- package/dist/http/http-error-handlers.js.map +1 -1
- package/dist/http/http-health-routes.d.ts.map +1 -1
- package/dist/http/http-health-routes.js +9 -6
- package/dist/http/http-health-routes.js.map +1 -1
- package/dist/http/http-mcp-handler.d.ts.map +1 -1
- package/dist/http/http-mcp-handler.js +44 -11
- package/dist/http/http-mcp-handler.js.map +1 -1
- package/dist/http/http-server-config.d.ts.map +1 -1
- package/dist/http/http-server-config.js +51 -1
- package/dist/http/http-server-config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -10
- package/dist/index.js.map +1 -1
- package/dist/resources/docs-resources.js +1 -1
- package/dist/resources/docs-resources.js.map +1 -1
- package/dist/resources/prompt-resources.js +1 -1
- package/dist/resources/prompt-resources.js.map +1 -1
- package/dist/services/chain-utils.d.ts +0 -7
- package/dist/services/chain-utils.d.ts.map +1 -1
- package/dist/services/chain-utils.js +0 -6
- package/dist/services/chain-utils.js.map +1 -1
- package/dist/services/embedding/audit.d.ts +35 -0
- package/dist/services/embedding/audit.d.ts.map +1 -0
- package/dist/services/embedding/audit.js +146 -0
- package/dist/services/embedding/audit.js.map +1 -0
- package/dist/services/embedding/config.js +1 -1
- package/dist/services/embedding/config.js.map +1 -1
- package/dist/services/embedding/health.d.ts +5 -0
- package/dist/services/embedding/health.d.ts.map +1 -0
- package/dist/services/embedding/health.js +112 -0
- package/dist/services/embedding/health.js.map +1 -0
- package/dist/services/embedding/providers.d.ts.map +1 -1
- package/dist/services/embedding/providers.js +65 -1
- package/dist/services/embedding/providers.js.map +1 -1
- package/dist/services/embedding/service.d.ts +1 -0
- package/dist/services/embedding/service.d.ts.map +1 -1
- package/dist/services/embedding/service.js +94 -124
- package/dist/services/embedding/service.js.map +1 -1
- package/dist/services/memory/store-chain-default-handler.d.ts.map +1 -1
- package/dist/services/memory/store-chain-default-handler.js +7 -2
- package/dist/services/memory/store-chain-default-handler.js.map +1 -1
- package/dist/services/memory/store-chain-header-handler.d.ts.map +1 -1
- package/dist/services/memory/store-chain-header-handler.js +7 -2
- package/dist/services/memory/store-chain-header-handler.js.map +1 -1
- package/dist/services/memory/store-chain-helpers.js +1 -1
- package/dist/services/memory/store-chain-helpers.js.map +1 -1
- package/dist/services/memory/store-chain.js +1 -1
- package/dist/services/memory/store-chain.js.map +1 -1
- package/dist/services/memory/store-init.js +1 -1
- package/dist/services/memory/store-init.js.map +1 -1
- package/dist/services/memory/store-methods.js +1 -1
- package/dist/services/memory/store-methods.js.map +1 -1
- package/dist/services/memory/store.js +1 -1
- package/dist/services/memory/store.js.map +1 -1
- package/dist/services/memory-store.js +1 -1
- package/dist/services/memory-store.js.map +1 -1
- package/dist/services/metrics/anomaly-metrics.d.ts +3 -0
- package/dist/services/metrics/anomaly-metrics.d.ts.map +1 -0
- package/dist/services/metrics/anomaly-metrics.js +9 -0
- package/dist/services/metrics/anomaly-metrics.js.map +1 -0
- package/dist/services/proof-of-work-store.js +1 -1
- package/dist/services/proof-of-work-store.js.map +1 -1
- package/dist/services/qdrant/attest-propagation.d.ts.map +1 -1
- package/dist/services/qdrant/attest-propagation.js +5 -8
- package/dist/services/qdrant/attest-propagation.js.map +1 -1
- package/dist/services/qdrant/connection.js +1 -1
- package/dist/services/qdrant/connection.js.map +1 -1
- package/dist/services/qdrant/initialization.js +1 -1
- package/dist/services/qdrant/initialization.js.map +1 -1
- package/dist/services/qdrant/listing.js +1 -1
- package/dist/services/qdrant/listing.js.map +1 -1
- package/dist/services/qdrant/memory-retrieval.d.ts +21 -0
- package/dist/services/qdrant/memory-retrieval.d.ts.map +1 -1
- package/dist/services/qdrant/memory-retrieval.js +36 -18
- package/dist/services/qdrant/memory-retrieval.js.map +1 -1
- package/dist/services/qdrant/memory-store.js +1 -1
- package/dist/services/qdrant/memory-store.js.map +1 -1
- package/dist/services/qdrant/memory-updates.d.ts.map +1 -1
- package/dist/services/qdrant/memory-updates.js +35 -37
- package/dist/services/qdrant/memory-updates.js.map +1 -1
- package/dist/services/qdrant/quality.d.ts.map +1 -1
- package/dist/services/qdrant/quality.js +13 -27
- package/dist/services/qdrant/quality.js.map +1 -1
- package/dist/services/qdrant/resources.d.ts.map +1 -1
- package/dist/services/qdrant/resources.js +23 -8
- package/dist/services/qdrant/resources.js.map +1 -1
- package/dist/services/qdrant/search.js +1 -1
- package/dist/services/qdrant/search.js.map +1 -1
- package/dist/services/qdrant/service.js +1 -1
- package/dist/services/qdrant/service.js.map +1 -1
- package/dist/services/qdrant/utils.js +1 -1
- package/dist/services/qdrant/utils.js.map +1 -1
- package/dist/services/redis-cache.js +1 -1
- package/dist/services/redis-cache.js.map +1 -1
- package/dist/services/redis.d.ts +1 -0
- package/dist/services/redis.d.ts.map +1 -1
- package/dist/services/redis.js +20 -6
- package/dist/services/redis.js.map +1 -1
- package/dist/services/stats/model-stats.js +1 -1
- package/dist/services/stats/model-stats.js.map +1 -1
- package/dist/services/stats/protocol.js +1 -1
- package/dist/services/stats/protocol.js.map +1 -1
- package/dist/tools/kairos_attest.js +1 -1
- package/dist/tools/kairos_attest.js.map +1 -1
- package/dist/tools/kairos_mint.js +1 -1
- package/dist/tools/kairos_mint.js.map +1 -1
- package/dist/tools/kairos_search.d.ts.map +1 -1
- package/dist/tools/kairos_search.js +26 -13
- package/dist/tools/kairos_search.js.map +1 -1
- package/dist/ui/assets/{AccountPage-xcULo_Ht.js → AccountPage-kxmPtqQP.js} +1 -1
- package/dist/ui/assets/{ErrorAlert-Bp_BC2t_.js → ErrorAlert-ME7tEJ6X.js} +1 -1
- package/dist/ui/assets/{HomePage-YaKMlhFN.js → HomePage-DxiAsvs-.js} +1 -1
- package/dist/ui/assets/{KairosPage-DgO58pOn.js → KairosPage-BkqYs3-_.js} +1 -1
- package/dist/ui/assets/NotFoundPage-DyfbQ-6G.js +1 -0
- package/dist/ui/assets/{ProtocolDetailPage-D93cKbME.js → ProtocolDetailPage-DKaSVepL.js} +1 -1
- package/dist/ui/assets/{ProtocolEditPage-CCwQy6yl.js → ProtocolEditPage-D-aTavvx.js} +1 -1
- package/dist/ui/assets/{RenderedMarkdown-Dd_bDNwz.js → RenderedMarkdown-DjbuQlBl.js} +1 -1
- package/dist/ui/assets/{RunGuidedPage-CcTlI5HF.js → RunGuidedPage-BUD0MaGh.js} +1 -1
- package/dist/ui/assets/{RunsPage-BjSaeOq_.js → RunsPage-ctnsEF2U.js} +1 -1
- package/dist/ui/assets/{SkillBundlePage-D2cJwwA1.js → SkillBundlePage-CaWW5oGq.js} +1 -1
- package/dist/ui/assets/{index-BE1NYtLh.css → index-BAOM7Ima.css} +1 -1
- package/dist/ui/assets/{index-Dj9XLtnR.js → index-BrTmRWuA.js} +3 -3
- package/dist/ui/assets/{tiptap-BEg0BoNB.js → tiptap-kMFBDujG.js} +2 -2
- package/dist/ui/assets/{useProtocol-D_32bpf9.js → useProtocol-BruWpIzq.js} +1 -1
- package/dist/ui/assets/{useSpaces-DdE67BYD.js → useSpaces-BV6eUjY3.js} +1 -1
- package/dist/ui/assets/vendor-GiUVcjs7.js +33 -0
- package/dist/ui/index.html +4 -4
- package/dist/utils/qdrant-vector-management.js +1 -1
- package/dist/utils/qdrant-vector-management.js.map +1 -1
- package/dist/utils/structured-logger.d.ts +6 -1
- package/dist/utils/structured-logger.d.ts.map +1 -1
- package/dist/utils/structured-logger.js +103 -16
- package/dist/utils/structured-logger.js.map +1 -1
- package/dist/utils/tenant-context.d.ts +7 -0
- package/dist/utils/tenant-context.d.ts.map +1 -1
- package/dist/utils/tenant-context.js +20 -6
- package/dist/utils/tenant-context.js.map +1 -1
- package/package.json +10 -7
- package/dist/ui/assets/NotFoundPage-BnEJbefZ.js +0 -1
- package/dist/ui/assets/vendor-BxD5ItEO.js +0 -33
- package/dist/utils/logger.d.ts +0 -22
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -63
- package/dist/utils/logger.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/services/embedding/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { logger } from '../../utils/logger.js';
|
|
1
|
+
import { logger } from '../../utils/structured-logger.js';
|
|
2
2
|
import { OPENAI_EMBEDDING_MODEL, OPENAI_API_KEY, OPENAI_API_URL, TEI_BASE_URL } from '../../config.js';
|
|
3
3
|
export { OPENAI_EMBEDDING_MODEL };
|
|
4
4
|
export const OPENAI_ENDPOINT = `${OPENAI_API_URL}/v1/embeddings`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/services/embedding/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/services/embedding/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEvG,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,cAAc,gBAAgB,CAAC;AAEjE,gDAAgD;AAChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY;IAC9C,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,gBAAgB;IAC5F,CAAC,CAAC,EAAE,CAAC;AAET,4GAA4G;AAC5G,IAAI,kBAAkB,GAAkB,IAAI,CAAC;AAE7C,+FAA+F;AAC/F,MAAM,UAAU,6BAA6B,CAAC,GAAW;IACrD,IAAI,kBAAkB,KAAK,IAAI,IAAI,kBAAkB,KAAK,GAAG,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,cAAc,kBAAkB,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,kBAAkB,GAAG,GAAG,CAAC;AAC7B,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,6BAA6B;IACzC,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACX,2IAA2I,CAC9I,CAAC;IACN,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC9B,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB;IACjC,OAAO,6BAA6B,EAAE,CAAC;AAC3C,CAAC;AAED,IAAI,CAAC,cAAc,EAAE,CAAC;IAClB,MAAM,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;AAC9G,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/health.ts"],"names":[],"mappings":"AAeA,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAuG9F"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { logger } from '../../utils/structured-logger.js';
|
|
2
|
+
import { EMBEDDING_PROVIDER, OPENAI_API_KEY, TEI_BASE_URL, TEI_MODEL, TEI_API_KEY } from '../../config.js';
|
|
3
|
+
import { OPENAI_EMBEDDING_MODEL, TEI_EMBEDDING_ENDPOINT, setResolvedEmbeddingDimension } from './config.js';
|
|
4
|
+
import { postEmbeddingsOpenAI, postEmbeddingsTEI } from './providers.js';
|
|
5
|
+
export async function runEmbeddingHealthCheck() {
|
|
6
|
+
try {
|
|
7
|
+
const providerPref = EMBEDDING_PROVIDER;
|
|
8
|
+
if (providerPref === 'openai') {
|
|
9
|
+
if (!OPENAI_API_KEY || !OPENAI_EMBEDDING_MODEL) {
|
|
10
|
+
return { healthy: false, message: 'OpenAI requires OPENAI_API_KEY and OPENAI_EMBEDDING_MODEL' };
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const res = await postEmbeddingsOpenAI('health check');
|
|
14
|
+
return { healthy: Array.isArray(res) && res.length > 0, message: 'openai embeddings operational' };
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
18
|
+
if (msg.includes('429'))
|
|
19
|
+
return { healthy: true, message: 'openai is rate-limited (429) - reachable but throttled' };
|
|
20
|
+
if (msg.includes('401') || msg.toLowerCase().includes('authentication'))
|
|
21
|
+
return { healthy: false, message: 'openai authentication failed - check OPENAI_API_KEY' };
|
|
22
|
+
return { healthy: false, message: `openai health check failed: ${msg}` };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (providerPref === 'tei') {
|
|
26
|
+
if (!TEI_BASE_URL || !TEI_MODEL) {
|
|
27
|
+
return { healthy: false, message: 'TEI requires TEI_BASE_URL and TEI_MODEL' };
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const res = await postEmbeddingsTEI('health check');
|
|
31
|
+
return { healthy: Array.isArray(res) && res.length > 0, message: 'TEI embeddings operational' };
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
35
|
+
if (msg.includes('401'))
|
|
36
|
+
return { healthy: false, message: 'TEI authentication failed (401)' };
|
|
37
|
+
if (msg.includes('429'))
|
|
38
|
+
return { healthy: true, message: 'TEI is rate-limited (429) - reachable but throttled' };
|
|
39
|
+
return { healthy: false, message: `TEI health check failed: ${msg}` };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (OPENAI_API_KEY && OPENAI_EMBEDDING_MODEL) {
|
|
43
|
+
try {
|
|
44
|
+
const res = await postEmbeddingsOpenAI('health check');
|
|
45
|
+
return { healthy: Array.isArray(res) && res.length > 0, message: 'openai embeddings operational' };
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
49
|
+
logger.warn(`[EmbeddingService] OpenAI health check failed, trying TEI fallback: ${msg}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (TEI_BASE_URL && TEI_MODEL) {
|
|
53
|
+
try {
|
|
54
|
+
const url = TEI_EMBEDDING_ENDPOINT || TEI_BASE_URL;
|
|
55
|
+
const payload = { model: TEI_MODEL, input: ['health check'] };
|
|
56
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
57
|
+
if (TEI_API_KEY)
|
|
58
|
+
headers['x-api-key'] = TEI_API_KEY;
|
|
59
|
+
const resp = await fetch(url, {
|
|
60
|
+
method: 'POST',
|
|
61
|
+
headers,
|
|
62
|
+
body: JSON.stringify(payload)
|
|
63
|
+
});
|
|
64
|
+
let data = null;
|
|
65
|
+
try {
|
|
66
|
+
data = await resp.json();
|
|
67
|
+
}
|
|
68
|
+
catch (parseErr) {
|
|
69
|
+
logger.warn(`[EmbeddingService] TEI returned non-JSON response: ${String(parseErr)}`);
|
|
70
|
+
}
|
|
71
|
+
if (!resp.ok) {
|
|
72
|
+
if (resp.status === 401) {
|
|
73
|
+
return { healthy: false, message: 'TEI authentication failed (401)' };
|
|
74
|
+
}
|
|
75
|
+
if (resp.status === 429) {
|
|
76
|
+
return { healthy: true, message: 'TEI is rate-limited (429) - reachable but throttled' };
|
|
77
|
+
}
|
|
78
|
+
return { healthy: false, message: `TEI returned HTTP ${resp.status}` };
|
|
79
|
+
}
|
|
80
|
+
let embeddings = null;
|
|
81
|
+
if (Array.isArray(data?.embeddings)) {
|
|
82
|
+
embeddings = data.embeddings;
|
|
83
|
+
}
|
|
84
|
+
else if (Array.isArray(data?.data)) {
|
|
85
|
+
embeddings = data.data.map((d) => d?.embedding ?? d);
|
|
86
|
+
}
|
|
87
|
+
else if (Array.isArray(data?.result)) {
|
|
88
|
+
embeddings = data.result;
|
|
89
|
+
}
|
|
90
|
+
else if (Array.isArray(data)) {
|
|
91
|
+
embeddings = data;
|
|
92
|
+
}
|
|
93
|
+
if (Array.isArray(embeddings) && embeddings.length > 0 && Array.isArray(embeddings[0])) {
|
|
94
|
+
const dim = embeddings[0].length;
|
|
95
|
+
setResolvedEmbeddingDimension(dim);
|
|
96
|
+
return { healthy: true, message: 'TEI embeddings operational' };
|
|
97
|
+
}
|
|
98
|
+
return { healthy: false, message: 'TEI returned unexpected embedding shape or no embeddings' };
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
102
|
+
return { healthy: false, message: `TEI health check error: ${msg}` };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return { healthy: false, message: 'No embedding provider configured (set OPENAI_API_KEY+OPENAI_EMBEDDING_MODEL or TEI_BASE_URL+TEI_MODEL)' };
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
109
|
+
return { healthy: false, message: `Embedding health check error: ${msg}` };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/services/embedding/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/providers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/providers.ts"],"names":[],"mappings":"AAkCA,iBAAe,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CA0EjF;AAED,iBAAe,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAwE9E;AAED,iBAAe,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CA2B3E;AAED,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -1,10 +1,31 @@
|
|
|
1
|
-
import { logger } from '../../utils/logger.js';
|
|
1
|
+
import { logger } from '../../utils/structured-logger.js';
|
|
2
2
|
import { OPENAI_API_KEY, EMBEDDING_PROVIDER, TEI_BASE_URL, TEI_MODEL, TEI_API_KEY } from '../../config.js';
|
|
3
3
|
import { OPENAI_EMBEDDING_MODEL, OPENAI_ENDPOINT, TEI_EMBEDDING_ENDPOINT, setResolvedEmbeddingDimension } from './config.js';
|
|
4
|
+
import { getRequestIdFromStorage, getTenantId } from '../../utils/tenant-context.js';
|
|
5
|
+
import { structuredLogger } from '../../utils/structured-logger.js';
|
|
6
|
+
function auditProviderCall(payload) {
|
|
7
|
+
structuredLogger.info({
|
|
8
|
+
category: 'audit.embedding',
|
|
9
|
+
stage: 'provider',
|
|
10
|
+
provider: payload.provider,
|
|
11
|
+
model: payload.model,
|
|
12
|
+
tenant_id: getTenantId(),
|
|
13
|
+
request_id: getRequestIdFromStorage(),
|
|
14
|
+
status: payload.status,
|
|
15
|
+
input_count: payload.inputCount,
|
|
16
|
+
input_char_length: payload.inputCharLength,
|
|
17
|
+
output_dimension: payload.outputDimension,
|
|
18
|
+
latency_ms: payload.latencyMs,
|
|
19
|
+
...(payload.httpStatus !== undefined && { http_status: payload.httpStatus }),
|
|
20
|
+
...(payload.errorMessage && { error_message: payload.errorMessage })
|
|
21
|
+
}, `Embedding provider ${payload.provider} ${payload.status}`);
|
|
22
|
+
}
|
|
4
23
|
async function postEmbeddingsOpenAI(input) {
|
|
5
24
|
if (!OPENAI_API_KEY || !OPENAI_EMBEDDING_MODEL)
|
|
6
25
|
throw new Error('OpenAI requires OPENAI_API_KEY and OPENAI_EMBEDDING_MODEL to be configured');
|
|
7
26
|
const inputArray = Array.isArray(input) ? input : [input];
|
|
27
|
+
const startedAt = Date.now();
|
|
28
|
+
const inputCharLength = inputArray.reduce((sum, value) => sum + value.length, 0);
|
|
8
29
|
const body = {
|
|
9
30
|
model: OPENAI_EMBEDDING_MODEL,
|
|
10
31
|
input: inputArray,
|
|
@@ -24,6 +45,17 @@ async function postEmbeddingsOpenAI(input) {
|
|
|
24
45
|
});
|
|
25
46
|
if (!res.ok) {
|
|
26
47
|
const errMsg = data?.error?.message || data?.message || `OpenAI embeddings HTTP ${res.status}`;
|
|
48
|
+
auditProviderCall({
|
|
49
|
+
provider: 'openai',
|
|
50
|
+
model: OPENAI_EMBEDDING_MODEL,
|
|
51
|
+
status: 'error',
|
|
52
|
+
inputCount: inputArray.length,
|
|
53
|
+
inputCharLength,
|
|
54
|
+
outputDimension: 0,
|
|
55
|
+
latencyMs: Date.now() - startedAt,
|
|
56
|
+
httpStatus: res.status,
|
|
57
|
+
errorMessage: errMsg
|
|
58
|
+
});
|
|
27
59
|
if (res.status === 401) {
|
|
28
60
|
throw new Error(`OpenAI authentication failed (401). Check OPENAI_API_KEY: ${errMsg}`);
|
|
29
61
|
}
|
|
@@ -46,6 +78,16 @@ async function postEmbeddingsOpenAI(input) {
|
|
|
46
78
|
setResolvedEmbeddingDimension(dim);
|
|
47
79
|
}
|
|
48
80
|
const dim = embeddings.length > 0 && embeddings[0] ? embeddings[0].length : 0;
|
|
81
|
+
auditProviderCall({
|
|
82
|
+
provider: 'openai',
|
|
83
|
+
model: OPENAI_EMBEDDING_MODEL,
|
|
84
|
+
status: 'success',
|
|
85
|
+
inputCount: inputArray.length,
|
|
86
|
+
inputCharLength,
|
|
87
|
+
outputDimension: dim,
|
|
88
|
+
latencyMs: Date.now() - startedAt,
|
|
89
|
+
httpStatus: res.status
|
|
90
|
+
});
|
|
49
91
|
logger.debug(`[EmbeddingService] Received ${embeddings.length} embeddings (dim=${dim}) [provider=openai]`);
|
|
50
92
|
return embeddings;
|
|
51
93
|
}
|
|
@@ -53,6 +95,8 @@ async function postEmbeddingsTEI(input) {
|
|
|
53
95
|
if (!TEI_BASE_URL || !TEI_MODEL)
|
|
54
96
|
throw new Error('TEI requires TEI_BASE_URL and TEI_MODEL to be configured');
|
|
55
97
|
const inputArray = Array.isArray(input) ? input : [input];
|
|
98
|
+
const startedAt = Date.now();
|
|
99
|
+
const inputCharLength = inputArray.reduce((sum, value) => sum + value.length, 0);
|
|
56
100
|
const body = { input: inputArray, model: TEI_MODEL };
|
|
57
101
|
const headers = { 'Content-Type': 'application/json' };
|
|
58
102
|
if (TEI_API_KEY)
|
|
@@ -68,6 +112,16 @@ async function postEmbeddingsTEI(input) {
|
|
|
68
112
|
throw new Error(`TEI embeddings returned non-JSON response (HTTP ${res.status})`);
|
|
69
113
|
});
|
|
70
114
|
if (!res.ok) {
|
|
115
|
+
auditProviderCall({
|
|
116
|
+
provider: 'tei',
|
|
117
|
+
model: TEI_MODEL,
|
|
118
|
+
status: 'error',
|
|
119
|
+
inputCount: inputArray.length,
|
|
120
|
+
inputCharLength,
|
|
121
|
+
outputDimension: 0,
|
|
122
|
+
latencyMs: Date.now() - startedAt,
|
|
123
|
+
httpStatus: res.status
|
|
124
|
+
});
|
|
71
125
|
if (res.status === 401) {
|
|
72
126
|
throw new Error('TEI authentication failed (401)');
|
|
73
127
|
}
|
|
@@ -96,6 +150,16 @@ async function postEmbeddingsTEI(input) {
|
|
|
96
150
|
}
|
|
97
151
|
const dim = embeddings[0].length;
|
|
98
152
|
setResolvedEmbeddingDimension(dim);
|
|
153
|
+
auditProviderCall({
|
|
154
|
+
provider: 'tei',
|
|
155
|
+
model: TEI_MODEL,
|
|
156
|
+
status: 'success',
|
|
157
|
+
inputCount: inputArray.length,
|
|
158
|
+
inputCharLength,
|
|
159
|
+
outputDimension: dim,
|
|
160
|
+
latencyMs: Date.now() - startedAt,
|
|
161
|
+
httpStatus: res.status
|
|
162
|
+
});
|
|
99
163
|
logger.debug(`[EmbeddingService] Received ${embeddings.length} embeddings (dim=${dim}) [provider=tei]`);
|
|
100
164
|
return embeddings;
|
|
101
165
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/services/embedding/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/services/embedding/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import type { EmbeddingResult, BatchEmbeddingResult } from './types.js';
|
|
|
15
15
|
export type { EmbeddingResult, BatchEmbeddingResult } from './types.js';
|
|
16
16
|
export declare class EmbeddingService {
|
|
17
17
|
private get embeddingDimension();
|
|
18
|
+
private getModelName;
|
|
18
19
|
generateEmbedding(text: string): Promise<EmbeddingResult>;
|
|
19
20
|
generateBatchEmbeddings(texts: string[]): Promise<BatchEmbeddingResult>;
|
|
20
21
|
calculateCosineSimilarity(embedding1: number[] | undefined, embedding2: number[] | undefined): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAiBxE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,gBAAgB;IACzB,OAAO,KAAK,kBAAkB,GAE7B;IAED,OAAO,CAAC,YAAY;IAId,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAkFzD,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA8F7E,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM;IAa/F,uBAAuB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAa7D,YAAY,IAAI,MAAM;IAKhB,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAInE,WAAW,IAAI,QAAQ,GAAG,KAAK,GAAG,OAAO;IASzC,SAAS;;;;;;;;CAiBZ;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAEvD,uGAAuG;AACvG,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG/D"}
|
|
@@ -11,28 +11,49 @@
|
|
|
11
11
|
* - If OPENAI_API_KEY is set, OpenAI is used.
|
|
12
12
|
* - Otherwise, TEI_BASE_URL + TEI_MODEL will be used if configured.
|
|
13
13
|
*/
|
|
14
|
-
import { logger } from '../../utils/logger.js';
|
|
15
|
-
import { EMBEDDING_PROVIDER, OPENAI_API_KEY, TEI_BASE_URL, TEI_MODEL
|
|
16
|
-
import { OPENAI_EMBEDDING_MODEL,
|
|
17
|
-
import { postEmbeddings
|
|
14
|
+
import { logger } from '../../utils/structured-logger.js';
|
|
15
|
+
import { EMBEDDING_PROVIDER, OPENAI_API_KEY, TEI_BASE_URL, TEI_MODEL } from '../../config.js';
|
|
16
|
+
import { OPENAI_EMBEDDING_MODEL, getResolvedEmbeddingDimension } from './config.js';
|
|
17
|
+
import { postEmbeddings } from './providers.js';
|
|
18
18
|
import { embeddingRequests, embeddingDuration, embeddingErrors, embeddingVectorSize, embeddingBatchSize } from '../metrics/embedding-metrics.js';
|
|
19
|
-
import { getTenantId } from '../../utils/tenant-context.js';
|
|
19
|
+
import { getRequestIdFromStorage, getTenantId } from '../../utils/tenant-context.js';
|
|
20
|
+
import { detectEmbeddingAnomalies, logEmbeddingAuditError, logEmbeddingAuditSuccess } from './audit.js';
|
|
21
|
+
import { runEmbeddingHealthCheck } from './health.js';
|
|
20
22
|
export class EmbeddingService {
|
|
21
23
|
get embeddingDimension() {
|
|
22
24
|
return getResolvedEmbeddingDimension();
|
|
23
25
|
}
|
|
26
|
+
getModelName(provider) {
|
|
27
|
+
return provider === 'tei' ? TEI_MODEL : OPENAI_EMBEDDING_MODEL;
|
|
28
|
+
}
|
|
24
29
|
async generateEmbedding(text) {
|
|
25
30
|
const tenantId = getTenantId();
|
|
31
|
+
const requestId = getRequestIdFromStorage();
|
|
26
32
|
const provider = this.getProvider();
|
|
33
|
+
const model = this.getModelName(provider);
|
|
27
34
|
const timer = embeddingDuration.startTimer({ provider, tenant_id: tenantId });
|
|
35
|
+
const startedAt = Date.now();
|
|
36
|
+
const normalizedText = text?.trim() || '';
|
|
37
|
+
const inputCharLength = normalizedText.length;
|
|
28
38
|
try {
|
|
29
|
-
if (!
|
|
39
|
+
if (!normalizedText)
|
|
30
40
|
throw new Error('Text cannot be empty for embedding generation');
|
|
31
|
-
const vectors = await postEmbeddings(
|
|
41
|
+
const vectors = await postEmbeddings(normalizedText);
|
|
32
42
|
const embedding = vectors?.[0];
|
|
33
43
|
if (!Array.isArray(embedding))
|
|
34
44
|
throw new Error('OpenAI returned no embedding');
|
|
35
|
-
|
|
45
|
+
const latencyMs = Date.now() - startedAt;
|
|
46
|
+
const anomaly = detectEmbeddingAnomalies({
|
|
47
|
+
tenantId,
|
|
48
|
+
requestId,
|
|
49
|
+
provider,
|
|
50
|
+
model,
|
|
51
|
+
latencyMs,
|
|
52
|
+
expectedDimension: this.embeddingDimension,
|
|
53
|
+
actualDimension: embedding.length,
|
|
54
|
+
sampleEmbedding: embedding
|
|
55
|
+
});
|
|
56
|
+
if (anomaly.hasCritical)
|
|
36
57
|
throw new Error(`Embedding dimension mismatch: got ${embedding.length}, expected ${this.embeddingDimension}`);
|
|
37
58
|
embeddingRequests.inc({
|
|
38
59
|
provider,
|
|
@@ -42,6 +63,16 @@ export class EmbeddingService {
|
|
|
42
63
|
// Track vector size (assuming float32, 4 bytes per float)
|
|
43
64
|
const vectorSize = embedding.length * 4;
|
|
44
65
|
embeddingVectorSize.observe({ provider, tenant_id: tenantId }, vectorSize);
|
|
66
|
+
logEmbeddingAuditSuccess({
|
|
67
|
+
tenantId,
|
|
68
|
+
requestId,
|
|
69
|
+
provider,
|
|
70
|
+
model,
|
|
71
|
+
inputCount: 1,
|
|
72
|
+
inputCharLength,
|
|
73
|
+
outputDimension: embedding.length,
|
|
74
|
+
latencyMs
|
|
75
|
+
});
|
|
45
76
|
timer({ provider, tenant_id: tenantId });
|
|
46
77
|
return {
|
|
47
78
|
embedding,
|
|
@@ -60,27 +91,56 @@ export class EmbeddingService {
|
|
|
60
91
|
status: 'error',
|
|
61
92
|
tenant_id: tenantId
|
|
62
93
|
});
|
|
94
|
+
logEmbeddingAuditError({
|
|
95
|
+
tenantId,
|
|
96
|
+
requestId,
|
|
97
|
+
provider,
|
|
98
|
+
model,
|
|
99
|
+
inputCount: 1,
|
|
100
|
+
inputCharLength,
|
|
101
|
+
outputDimension: 0,
|
|
102
|
+
latencyMs: Date.now() - startedAt,
|
|
103
|
+
errorMessage: error instanceof Error ? error.message : String(error)
|
|
104
|
+
});
|
|
63
105
|
timer({ provider, tenant_id: tenantId });
|
|
64
106
|
throw error;
|
|
65
107
|
}
|
|
66
108
|
}
|
|
67
109
|
async generateBatchEmbeddings(texts) {
|
|
68
110
|
const tenantId = getTenantId();
|
|
111
|
+
const requestId = getRequestIdFromStorage();
|
|
69
112
|
const provider = this.getProvider();
|
|
113
|
+
const model = this.getModelName(provider);
|
|
70
114
|
const timer = embeddingDuration.startTimer({ provider, tenant_id: tenantId });
|
|
115
|
+
const startedAt = Date.now();
|
|
116
|
+
let inputCount = 0;
|
|
117
|
+
let inputCharLength = 0;
|
|
71
118
|
try {
|
|
72
119
|
const valid = texts.filter(t => t && t.trim().length > 0);
|
|
73
120
|
if (valid.length === 0)
|
|
74
121
|
throw new Error('No valid texts provided for batch embedding');
|
|
122
|
+
inputCount = valid.length;
|
|
123
|
+
inputCharLength = valid.reduce((sum, value) => sum + value.trim().length, 0);
|
|
75
124
|
// Track batch size
|
|
76
125
|
embeddingBatchSize.observe({ tenant_id: tenantId }, valid.length);
|
|
77
126
|
const vectors = await postEmbeddings(valid);
|
|
78
|
-
|
|
127
|
+
const outputDimension = Array.isArray(vectors[0]) ? vectors[0].length : 0;
|
|
128
|
+
const latencyMs = Date.now() - startedAt;
|
|
79
129
|
const wrongDim = vectors.some(v => !Array.isArray(v) || v.length !== this.embeddingDimension);
|
|
80
|
-
if (wrongDim)
|
|
130
|
+
if (wrongDim)
|
|
81
131
|
logger.error('[EmbeddingService] One or more embeddings returned with unexpected dimension');
|
|
82
|
-
|
|
83
|
-
|
|
132
|
+
const anomaly = detectEmbeddingAnomalies({
|
|
133
|
+
tenantId,
|
|
134
|
+
requestId,
|
|
135
|
+
provider,
|
|
136
|
+
model,
|
|
137
|
+
latencyMs,
|
|
138
|
+
expectedDimension: this.embeddingDimension,
|
|
139
|
+
actualDimension: wrongDim ? -1 : outputDimension,
|
|
140
|
+
sampleEmbedding: Array.isArray(vectors[0]) ? vectors[0] : []
|
|
141
|
+
});
|
|
142
|
+
if (wrongDim || anomaly.hasCritical)
|
|
143
|
+
throw new Error('One or more embeddings have unexpected dimension from provider');
|
|
84
144
|
embeddingRequests.inc({
|
|
85
145
|
provider,
|
|
86
146
|
status: 'success',
|
|
@@ -93,6 +153,16 @@ export class EmbeddingService {
|
|
|
93
153
|
embeddingVectorSize.observe({ provider, tenant_id: tenantId }, vectorSize);
|
|
94
154
|
}
|
|
95
155
|
}
|
|
156
|
+
logEmbeddingAuditSuccess({
|
|
157
|
+
tenantId,
|
|
158
|
+
requestId,
|
|
159
|
+
provider,
|
|
160
|
+
model,
|
|
161
|
+
inputCount,
|
|
162
|
+
inputCharLength,
|
|
163
|
+
outputDimension,
|
|
164
|
+
latencyMs
|
|
165
|
+
});
|
|
96
166
|
timer({ provider, tenant_id: tenantId });
|
|
97
167
|
return {
|
|
98
168
|
embeddings: vectors,
|
|
@@ -111,6 +181,17 @@ export class EmbeddingService {
|
|
|
111
181
|
status: 'error',
|
|
112
182
|
tenant_id: tenantId
|
|
113
183
|
});
|
|
184
|
+
logEmbeddingAuditError({
|
|
185
|
+
tenantId,
|
|
186
|
+
requestId,
|
|
187
|
+
provider,
|
|
188
|
+
model,
|
|
189
|
+
inputCount,
|
|
190
|
+
inputCharLength,
|
|
191
|
+
outputDimension: 0,
|
|
192
|
+
latencyMs: Date.now() - startedAt,
|
|
193
|
+
errorMessage: error instanceof Error ? error.message : String(error)
|
|
194
|
+
});
|
|
114
195
|
timer({ provider, tenant_id: tenantId });
|
|
115
196
|
throw error;
|
|
116
197
|
}
|
|
@@ -147,118 +228,7 @@ export class EmbeddingService {
|
|
|
147
228
|
return 0;
|
|
148
229
|
}
|
|
149
230
|
async healthCheck() {
|
|
150
|
-
|
|
151
|
-
const providerPref = EMBEDDING_PROVIDER;
|
|
152
|
-
if (providerPref === 'openai') {
|
|
153
|
-
// Explicit OpenAI only - enforce duo
|
|
154
|
-
if (!OPENAI_API_KEY || !OPENAI_EMBEDDING_MODEL) {
|
|
155
|
-
return { healthy: false, message: 'OpenAI requires OPENAI_API_KEY and OPENAI_EMBEDDING_MODEL' };
|
|
156
|
-
}
|
|
157
|
-
try {
|
|
158
|
-
const res = await postEmbeddingsOpenAI('health check');
|
|
159
|
-
return { healthy: Array.isArray(res) && res.length > 0, message: 'openai embeddings operational' };
|
|
160
|
-
}
|
|
161
|
-
catch (err) {
|
|
162
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
163
|
-
if (msg.includes('429'))
|
|
164
|
-
return { healthy: true, message: 'openai is rate-limited (429) - reachable but throttled' };
|
|
165
|
-
if (msg.includes('401') || msg.toLowerCase().includes('authentication'))
|
|
166
|
-
return { healthy: false, message: 'openai authentication failed - check OPENAI_API_KEY' };
|
|
167
|
-
return { healthy: false, message: `openai health check failed: ${msg}` };
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
if (providerPref === 'tei') {
|
|
171
|
-
// Explicit TEI only - enforce duo
|
|
172
|
-
if (!TEI_BASE_URL || !TEI_MODEL) {
|
|
173
|
-
return { healthy: false, message: 'TEI requires TEI_BASE_URL and TEI_MODEL' };
|
|
174
|
-
}
|
|
175
|
-
try {
|
|
176
|
-
const res = await postEmbeddingsTEI('health check');
|
|
177
|
-
return { healthy: Array.isArray(res) && res.length > 0, message: 'TEI embeddings operational' };
|
|
178
|
-
}
|
|
179
|
-
catch (err) {
|
|
180
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
181
|
-
if (msg.includes('401'))
|
|
182
|
-
return { healthy: false, message: 'TEI authentication failed (401)' };
|
|
183
|
-
if (msg.includes('429'))
|
|
184
|
-
return { healthy: true, message: 'TEI is rate-limited (429) - reachable but throttled' };
|
|
185
|
-
return { healthy: false, message: `TEI health check failed: ${msg}` };
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
// Auto mode: prefer OpenAI if both OPENAI vars are present, otherwise TEI
|
|
189
|
-
if (OPENAI_API_KEY && OPENAI_EMBEDDING_MODEL) {
|
|
190
|
-
try {
|
|
191
|
-
const res = await postEmbeddingsOpenAI('health check');
|
|
192
|
-
return { healthy: Array.isArray(res) && res.length > 0, message: 'openai embeddings operational' };
|
|
193
|
-
}
|
|
194
|
-
catch (err) {
|
|
195
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
196
|
-
logger.warn(`[EmbeddingService] OpenAI health check failed, trying TEI fallback: ${msg}`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
if (TEI_BASE_URL && TEI_MODEL) {
|
|
200
|
-
try {
|
|
201
|
-
const url = TEI_EMBEDDING_ENDPOINT || TEI_BASE_URL;
|
|
202
|
-
const payload = { model: TEI_MODEL, input: ['health check'] };
|
|
203
|
-
const headers = { 'Content-Type': 'application/json' };
|
|
204
|
-
if (TEI_API_KEY)
|
|
205
|
-
headers['x-api-key'] = TEI_API_KEY;
|
|
206
|
-
const resp = await fetch(url, {
|
|
207
|
-
method: 'POST',
|
|
208
|
-
headers,
|
|
209
|
-
body: JSON.stringify(payload)
|
|
210
|
-
});
|
|
211
|
-
let data = null;
|
|
212
|
-
try {
|
|
213
|
-
data = await resp.json();
|
|
214
|
-
}
|
|
215
|
-
catch (parseErr) {
|
|
216
|
-
logger.warn(`[EmbeddingService] TEI returned non-JSON response: ${String(parseErr)}`);
|
|
217
|
-
}
|
|
218
|
-
if (!resp.ok) {
|
|
219
|
-
if (resp.status === 401) {
|
|
220
|
-
return { healthy: false, message: 'TEI authentication failed (401)' };
|
|
221
|
-
}
|
|
222
|
-
if (resp.status === 429) {
|
|
223
|
-
return { healthy: true, message: 'TEI is rate-limited (429) - reachable but throttled' };
|
|
224
|
-
}
|
|
225
|
-
return { healthy: false, message: `TEI returned HTTP ${resp.status}` };
|
|
226
|
-
}
|
|
227
|
-
// Accept several TEI response shapes:
|
|
228
|
-
// - { embeddings: [ [..], ... ] }
|
|
229
|
-
// - { data: [ { embedding: [...] }, ... ] }
|
|
230
|
-
// - { result: [ ... ] } (some servers)
|
|
231
|
-
let embeddings = null;
|
|
232
|
-
if (Array.isArray(data?.embeddings)) {
|
|
233
|
-
embeddings = data.embeddings;
|
|
234
|
-
}
|
|
235
|
-
else if (Array.isArray(data?.data)) {
|
|
236
|
-
embeddings = data.data.map((d) => d?.embedding ?? d);
|
|
237
|
-
}
|
|
238
|
-
else if (Array.isArray(data?.result)) {
|
|
239
|
-
embeddings = data.result;
|
|
240
|
-
}
|
|
241
|
-
else if (Array.isArray(data)) {
|
|
242
|
-
embeddings = data;
|
|
243
|
-
}
|
|
244
|
-
if (Array.isArray(embeddings) && embeddings.length > 0 && Array.isArray(embeddings[0])) {
|
|
245
|
-
const dim = embeddings[0].length;
|
|
246
|
-
setResolvedEmbeddingDimension(dim);
|
|
247
|
-
return { healthy: true, message: 'TEI embeddings operational' };
|
|
248
|
-
}
|
|
249
|
-
return { healthy: false, message: 'TEI returned unexpected embedding shape or no embeddings' };
|
|
250
|
-
}
|
|
251
|
-
catch (err) {
|
|
252
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
253
|
-
return { healthy: false, message: `TEI health check error: ${msg}` };
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
return { healthy: false, message: 'No embedding provider configured (set OPENAI_API_KEY+OPENAI_EMBEDDING_MODEL or TEI_BASE_URL+TEI_MODEL)' };
|
|
257
|
-
}
|
|
258
|
-
catch (err) {
|
|
259
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
260
|
-
return { healthy: false, message: `Embedding health check error: ${msg}` };
|
|
261
|
-
}
|
|
231
|
+
return runEmbeddingHealthCheck();
|
|
262
232
|
}
|
|
263
233
|
getProvider() {
|
|
264
234
|
const pref = EMBEDDING_PROVIDER;
|