@futdevpro/nts-dynamo 1.15.57 → 1.15.60

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.
Files changed (134) hide show
  1. package/.dynamo/logs/cicd-pipeline/output.log +1637 -3567
  2. package/.dynamo/logs/cicd-pipeline/status.json +42 -344
  3. package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.d.ts +110 -0
  4. package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.d.ts.map +1 -0
  5. package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.js +419 -0
  6. package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.js.map +1 -0
  7. package/build/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.d.ts +50 -0
  8. package/build/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.d.ts.map +1 -0
  9. package/build/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.js +3 -0
  10. package/build/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.js.map +1 -0
  11. package/build/_modules/ai/_modules/document-ai/index.d.ts +2 -0
  12. package/build/_modules/ai/_modules/document-ai/index.d.ts.map +1 -1
  13. package/build/_modules/ai/_modules/document-ai/index.js +2 -0
  14. package/build/_modules/ai/_modules/document-ai/index.js.map +1 -1
  15. package/build/_modules/ai/_services/ai-embedding-mock.service.d.ts +81 -0
  16. package/build/_modules/ai/_services/ai-embedding-mock.service.d.ts.map +1 -0
  17. package/build/_modules/ai/_services/ai-embedding-mock.service.js +167 -0
  18. package/build/_modules/ai/_services/ai-embedding-mock.service.js.map +1 -0
  19. package/build/_modules/ai/_services/ai-embedding-provider.registry.d.ts +52 -0
  20. package/build/_modules/ai/_services/ai-embedding-provider.registry.d.ts.map +1 -0
  21. package/build/_modules/ai/_services/ai-embedding-provider.registry.js +79 -0
  22. package/build/_modules/ai/_services/ai-embedding-provider.registry.js.map +1 -0
  23. package/build/_modules/ai/_services/lmstudio-embedding.control-service.d.ts +111 -0
  24. package/build/_modules/ai/_services/lmstudio-embedding.control-service.d.ts.map +1 -0
  25. package/build/_modules/ai/_services/lmstudio-embedding.control-service.js +298 -0
  26. package/build/_modules/ai/_services/lmstudio-embedding.control-service.js.map +1 -0
  27. package/build/_modules/ai/index.d.ts +5 -0
  28. package/build/_modules/ai/index.d.ts.map +1 -1
  29. package/build/_modules/ai/index.js +8 -0
  30. package/build/_modules/ai/index.js.map +1 -1
  31. package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.d.ts +59 -0
  32. package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.d.ts.map +1 -0
  33. package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.js +169 -0
  34. package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.js.map +1 -0
  35. package/build/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.d.ts +32 -0
  36. package/build/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.d.ts.map +1 -0
  37. package/build/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.js +8 -0
  38. package/build/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.js.map +1 -0
  39. package/build/_modules/data-readers/index.d.ts +3 -0
  40. package/build/_modules/data-readers/index.d.ts.map +1 -0
  41. package/build/_modules/data-readers/index.js +11 -0
  42. package/build/_modules/data-readers/index.js.map +1 -0
  43. package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.d.ts +36 -0
  44. package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.d.ts.map +1 -0
  45. package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.js +54 -0
  46. package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.js.map +1 -0
  47. package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.d.ts +70 -0
  48. package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.d.ts.map +1 -0
  49. package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.js +123 -0
  50. package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.js.map +1 -0
  51. package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.d.ts +43 -0
  52. package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.d.ts.map +1 -0
  53. package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.js +72 -0
  54. package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.js.map +1 -0
  55. package/build/_modules/local-vector-search/index.d.ts +3 -0
  56. package/build/_modules/local-vector-search/index.d.ts.map +1 -1
  57. package/build/_modules/local-vector-search/index.js +4 -0
  58. package/build/_modules/local-vector-search/index.js.map +1 -1
  59. package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.d.ts +109 -0
  60. package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.d.ts.map +1 -0
  61. package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.js +14 -0
  62. package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.js.map +1 -0
  63. package/build/_modules/mcp/_services/dynts-mcp-server.service-base.d.ts +71 -0
  64. package/build/_modules/mcp/_services/dynts-mcp-server.service-base.d.ts.map +1 -0
  65. package/build/_modules/mcp/_services/dynts-mcp-server.service-base.js +99 -0
  66. package/build/_modules/mcp/_services/dynts-mcp-server.service-base.js.map +1 -0
  67. package/build/_modules/mcp/_services/dynts-mcp.adapter.d.ts +57 -0
  68. package/build/_modules/mcp/_services/dynts-mcp.adapter.d.ts.map +1 -0
  69. package/build/_modules/mcp/_services/dynts-mcp.adapter.js +139 -0
  70. package/build/_modules/mcp/_services/dynts-mcp.adapter.js.map +1 -0
  71. package/build/_modules/mcp/index.d.ts +4 -0
  72. package/build/_modules/mcp/index.d.ts.map +1 -0
  73. package/build/_modules/mcp/index.js +13 -0
  74. package/build/_modules/mcp/index.js.map +1 -0
  75. package/build/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.d.ts +19 -0
  76. package/build/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.d.ts.map +1 -0
  77. package/build/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.js +23 -0
  78. package/build/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.js.map +1 -0
  79. package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.d.ts +44 -0
  80. package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.d.ts.map +1 -0
  81. package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.js +68 -0
  82. package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.js.map +1 -0
  83. package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.d.ts +89 -0
  84. package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.d.ts.map +1 -0
  85. package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.js +12 -0
  86. package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.js.map +1 -0
  87. package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.d.ts +84 -0
  88. package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.d.ts.map +1 -0
  89. package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.js +220 -0
  90. package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.js.map +1 -0
  91. package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.d.ts +54 -0
  92. package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.d.ts.map +1 -0
  93. package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.js +76 -0
  94. package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.js.map +1 -0
  95. package/build/_modules/scoped-config/index.d.ts +6 -0
  96. package/build/_modules/scoped-config/index.d.ts.map +1 -0
  97. package/build/_modules/scoped-config/index.js +15 -0
  98. package/build/_modules/scoped-config/index.js.map +1 -0
  99. package/package.json +58 -2
  100. package/pnpm-workspace.yaml +1 -0
  101. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.spec.ts +295 -0
  102. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +552 -0
  103. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.ts +68 -0
  104. package/src/_modules/ai/_modules/document-ai/index.ts +2 -0
  105. package/src/_modules/ai/_services/ai-embedding-mock.service.spec.ts +115 -0
  106. package/src/_modules/ai/_services/ai-embedding-mock.service.ts +233 -0
  107. package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -0
  108. package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +114 -0
  109. package/src/_modules/ai/_services/lmstudio-embedding.control-service.spec.ts +197 -0
  110. package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +399 -0
  111. package/src/_modules/ai/index.ts +10 -0
  112. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +176 -0
  113. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +203 -0
  114. package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -0
  115. package/src/_modules/data-readers/index.ts +11 -0
  116. package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +60 -0
  117. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +198 -0
  118. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +150 -0
  119. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -0
  120. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +108 -0
  121. package/src/_modules/local-vector-search/index.ts +6 -1
  122. package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -0
  123. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +151 -0
  124. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +125 -0
  125. package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +168 -0
  126. package/src/_modules/mcp/index.ts +13 -0
  127. package/src/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.ts +22 -0
  128. package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +82 -0
  129. package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +107 -0
  130. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +312 -0
  131. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +311 -0
  132. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +123 -0
  133. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +108 -0
  134. package/src/_modules/scoped-config/index.ts +17 -0
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
5
5
  tslib_1.__exportStar(require("@futdevpro/fsm-dynamo/ai/document-ai"), exports);
6
6
  // COLLECTIONS
7
7
  tslib_1.__exportStar(require("./_collections/dai-chunking.util"), exports);
8
+ tslib_1.__exportStar(require("./_collections/dai-code-chunking.util"), exports);
8
9
  tslib_1.__exportStar(require("./_collections/dai-document.util"), exports);
9
10
  // ENUMS
10
11
  //export * from './_enums/dai-validation-error.enum';
@@ -15,6 +16,7 @@ tslib_1.__exportStar(require("./_models/data-models/dai-doc-chunk.data-model"),
15
16
  tslib_1.__exportStar(require("./_models/data-models/dai-document.data-model"), exports);
16
17
  tslib_1.__exportStar(require("./_models/data-models/dai-doc-page.data-model"), exports);
17
18
  // models/INTERFACES
19
+ tslib_1.__exportStar(require("./_models/interfaces/dai-code-chunk.interface"), exports);
18
20
  tslib_1.__exportStar(require("./_models/interfaces/dai-doc-chunk-compare-result.interface"), exports);
19
21
  tslib_1.__exportStar(require("./_models/interfaces/dai-doc-page-compare-result.interface"), exports);
20
22
  tslib_1.__exportStar(require("./_models/interfaces/dai-document-compare-result.interface"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/_modules/ai/_modules/document-ai/index.ts"],"names":[],"mappings":";;;AAAA,qBAAqB;AACrB,+EAAqD;AAErD,cAAc;AACd,2EAAiD;AACjD,2EAAiD;AAEjD,QAAQ;AACR,qDAAqD;AACrD,gFAAsD;AAEtD,SAAS;AACT,qBAAqB;AACrB,yFAA+D;AAC/D,wFAA8D;AAC9D,wFAA8D;AAE9D,oBAAoB;AACpB,sGAA4E;AAC5E,qGAA2E;AAC3E,qGAA2E;AAE3E,yDAAyD;AACzD,+DAA+D;AAE/D,WAAW;AACX,2DAA2D;AAC3D,6DAA6D"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/_modules/ai/_modules/document-ai/index.ts"],"names":[],"mappings":";;;AAAA,qBAAqB;AACrB,+EAAqD;AAErD,cAAc;AACd,2EAAiD;AACjD,gFAAsD;AACtD,2EAAiD;AAEjD,QAAQ;AACR,qDAAqD;AACrD,gFAAsD;AAEtD,SAAS;AACT,qBAAqB;AACrB,yFAA+D;AAC/D,wFAA8D;AAC9D,wFAA8D;AAE9D,oBAAoB;AACpB,wFAA8D;AAC9D,sGAA4E;AAC5E,qGAA2E;AAC3E,qGAA2E;AAE3E,yDAAyD;AACzD,+DAA+D;AAE/D,WAAW;AACX,2DAA2D;AAC3D,6DAA6D"}
@@ -0,0 +1,81 @@
1
+ import { CreateEmbeddingResponse } from 'openai/resources';
2
+ import { DyFM_AI_Provider, DyFM_AI_ProviderCapabilities, DyFM_AI_Config } from '@futdevpro/fsm-dynamo/ai';
3
+ import { DyFM_DAI_EmbeddingInfo } from '@futdevpro/fsm-dynamo/ai/document-ai';
4
+ import { DyNTS_AI_CostEventCallback } from '../_models/interfaces/dynts-ai-cost-event-callback.interface';
5
+ import { DyNTS_AI_Embedding_ServiceBase } from './ai-embedding.service-base';
6
+ /** A mock-embedding default dimenziója (kicsi, hogy a teszt-pool gyors legyen, de elég a koszinuszhoz). */
7
+ export declare const DyNTS_AI_MOCK_EMBEDDING_DIMS: number;
8
+ /**
9
+ * A mock embedding-service config-set-je. A `dims` a generált vektor dimenziója (default
10
+ * `DyNTS_AI_MOCK_EMBEDDING_DIMS`), az `onCostEvent` a per-call cost-event sink (FR-002 / BFR-AM-007).
11
+ */
12
+ export interface DyNTS_AI_Embedding_MockSettings {
13
+ /** A generált vektor dimenziója (default `DyNTS_AI_MOCK_EMBEDDING_DIMS`). */
14
+ dims?: number;
15
+ /** Per-call cost-event callback (FR-002 / BFR-AM-007). Non-breaking: ha undefined, nincs emit. */
16
+ onCostEvent?: DyNTS_AI_CostEventCallback;
17
+ }
18
+ /**
19
+ * `DyNTS_AI_Embedding_MockService` (BFR-AM-008) — determinisztikus, hash-alapú, fix-dimenziós,
20
+ * l2-normalizált pszeudo-vektor a szövegből. Provider- és hálózat-mentes → a tesztek + a tsc-/offline-
21
+ * smoke valódi API-kulcs nélkül futnak. Azonos `(model, text)` → azonos vektor (idempotens), így a
22
+ * koszinusz-keresés determinisztikusan tesztelhető. A FAM `FAM_Mock_EmbeddingProvider` workaround-ját
23
+ * emeli bedrock-szintre, mint újrahasználható test-double.
24
+ *
25
+ * **Cost-event (BFR-AM-007):** minden call után `emitCostEvent`-tel jelez (fake token-fogyasztás,
26
+ * 4 char ≈ 1 token), provider `'mock'`, callType `embedding-single` / `embedding-batch`. Így a
27
+ * cost-aggregáló pipeline mock-providerrel is end-to-end tesztelhető.
28
+ */
29
+ export declare class DyNTS_AI_Embedding_MockService extends DyNTS_AI_Embedding_ServiceBase {
30
+ /** A mock a `LocalAI` provider-enum alá tartozik (nincs külső hívás). */
31
+ readonly aiProvider: DyFM_AI_Provider;
32
+ /** A cost-event provider-string (a `DyNTS_AI_CostEvent.provider` szabad-string mezőjéhez). */
33
+ protected readonly costProvider: string;
34
+ /** Mock capability-k: csak embedding (determinisztikus). */
35
+ readonly capabilities: DyFM_AI_ProviderCapabilities;
36
+ /** A generált vektor dimenziója. */
37
+ protected dims: number;
38
+ /** @param set opcionális dims + onCostEvent. */
39
+ constructor(set?: DyNTS_AI_Embedding_MockSettings);
40
+ /** A mock-nak nincs külső config-ja; a `setup` a dimenzió override-jára szolgál (config.dimensions). */
41
+ setup(config: DyFM_AI_Config): void;
42
+ /**
43
+ * Egy determinisztikus embedding. A `model`-t beleszövi a seed-be, hogy modell-váltás más vektort
44
+ * adjon (re-embed teszteléshez). `fullResponse=true` → OpenAI-alakú válasz-objektum.
45
+ */
46
+ createEmbedding(set: {
47
+ text: string;
48
+ model: string;
49
+ fullResponse?: boolean;
50
+ issuer: string;
51
+ }): Promise<number[] | CreateEmbeddingResponse>;
52
+ /**
53
+ * Determinisztikus batch-embedding: minden szöveghez a `(model, text)` seed-ből generál egy fix-
54
+ * dimenziós, l2-normalizált vektort. A `texts` sorrendje == a visszaadott `number[][]` sorrendje.
55
+ */
56
+ createEmbeddings(set: {
57
+ texts: string[];
58
+ model: string;
59
+ fullResponse?: boolean;
60
+ issuer: string;
61
+ }): Promise<number[][] | CreateEmbeddingResponse>;
62
+ /** Embedding model-info: provider `LocalAI`, model a megadott azonosító. */
63
+ getEmbeddingInfo(model: string): DyFM_DAI_EmbeddingInfo;
64
+ /** A mock mindig elérhető (nincs külső függőség). */
65
+ testConnection(_issuer: string): Promise<boolean>;
66
+ /**
67
+ * Egy determinisztikus, l2-normalizált vektor a seed-ből. A SHA-256 hash bájtjait körkörösen
68
+ * használja a `dims` kitöltésére, [-1, 1) tartományra képzi, majd l2-normalizál (egységhossz a
69
+ * koszinuszhoz). Egy második hash-bájttal kever, hogy a hosszabb dimenziókon ne ismétlődjön a minta.
70
+ */
71
+ protected deterministicVector(seed: string): number[];
72
+ /** L2-normalizálás (egységhossz). Nulla-vektor → változatlan (elkerüli a 0-osztást). */
73
+ protected l2Normalize(vector: number[]): number[];
74
+ /** OpenAI-alakú válasz-objektum a vektorokból (a `fullResponse=true` ághoz). */
75
+ protected toResponse(vectors: number[][], model: string, texts: string[]): CreateEmbeddingResponse;
76
+ /** Cost-event emit (BFR-AM-007) fake tokennel (4 char ≈ 1 token), provider `'mock'`. */
77
+ protected emitMockCostEvent(callType: 'embedding-single' | 'embedding-batch', model: string, texts: string[], durationMs: number, issuer: string): void;
78
+ /** Becsült (fake) token-szám: 4 char ≈ 1 token. */
79
+ protected estimateTokens(texts: string[]): number;
80
+ }
81
+ //# sourceMappingURL=ai-embedding-mock.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-embedding-mock.service.d.ts","sourceRoot":"","sources":["../../../../src/_modules/ai/_services/ai-embedding-mock.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1G,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8DAA8D,CAAC;AAC1G,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAE7E,2GAA2G;AAC3G,eAAO,MAAM,4BAA4B,EAAE,MAAW,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,+BAA+B;IAC9C,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kGAAkG;IAClG,WAAW,CAAC,EAAE,0BAA0B,CAAC;CAC1C;AAED;;;;;;;;;;GAUG;AACH,qBAAa,8BAA+B,SAAQ,8BAA8B;IAEhF,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAA4B;IAEjE,8FAA8F;IAC9F,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAU;IAEjD,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,4BAA4B,CAWjD;IAEF,oCAAoC;IACpC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;IAEvB,gDAAgD;gBACpC,GAAG,CAAC,EAAE,+BAA+B;IASjD,wGAAwG;IACxG,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAQnC;;;OAGG;IACG,eAAe,CACnB,GAAG,EAAE;QACH,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,MAAM,EAAE,GAAG,uBAAuB,CAAC;IAc9C;;;OAGG;IACG,gBAAgB,CACpB,GAAG,EAAE;QACH,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,uBAAuB,CAAC;IAehD,4EAA4E;IAC5E,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB;IAOvD,qDAAqD;IAC/C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQvD;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAerD,wFAAwF;IACxF,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAejD,gFAAgF;IAChF,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,uBAAuB;IAclG,wFAAwF;IACxF,SAAS,CAAC,iBAAiB,CACzB,QAAQ,EAAE,kBAAkB,GAAG,iBAAiB,EAChD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,IAAI;IAkBP,mDAAmD;IACnD,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;CASlD"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyNTS_AI_Embedding_MockService = exports.DyNTS_AI_MOCK_EMBEDDING_DIMS = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const crypto = tslib_1.__importStar(require("crypto"));
6
+ const ai_1 = require("@futdevpro/fsm-dynamo/ai");
7
+ const ai_embedding_service_base_1 = require("./ai-embedding.service-base");
8
+ /** A mock-embedding default dimenziója (kicsi, hogy a teszt-pool gyors legyen, de elég a koszinuszhoz). */
9
+ exports.DyNTS_AI_MOCK_EMBEDDING_DIMS = 64;
10
+ /**
11
+ * `DyNTS_AI_Embedding_MockService` (BFR-AM-008) — determinisztikus, hash-alapú, fix-dimenziós,
12
+ * l2-normalizált pszeudo-vektor a szövegből. Provider- és hálózat-mentes → a tesztek + a tsc-/offline-
13
+ * smoke valódi API-kulcs nélkül futnak. Azonos `(model, text)` → azonos vektor (idempotens), így a
14
+ * koszinusz-keresés determinisztikusan tesztelhető. A FAM `FAM_Mock_EmbeddingProvider` workaround-ját
15
+ * emeli bedrock-szintre, mint újrahasználható test-double.
16
+ *
17
+ * **Cost-event (BFR-AM-007):** minden call után `emitCostEvent`-tel jelez (fake token-fogyasztás,
18
+ * 4 char ≈ 1 token), provider `'mock'`, callType `embedding-single` / `embedding-batch`. Így a
19
+ * cost-aggregáló pipeline mock-providerrel is end-to-end tesztelhető.
20
+ */
21
+ class DyNTS_AI_Embedding_MockService extends ai_embedding_service_base_1.DyNTS_AI_Embedding_ServiceBase {
22
+ /** A mock a `LocalAI` provider-enum alá tartozik (nincs külső hívás). */
23
+ aiProvider = ai_1.DyFM_AI_Provider.LocalAI;
24
+ /** A cost-event provider-string (a `DyNTS_AI_CostEvent.provider` szabad-string mezőjéhez). */
25
+ costProvider = 'mock';
26
+ /** Mock capability-k: csak embedding (determinisztikus). */
27
+ capabilities = {
28
+ chat: false,
29
+ embeddings: true,
30
+ imageGeneration: false,
31
+ vision: false,
32
+ audioGeneration: false,
33
+ audioAnalysis: false,
34
+ functionCalling: false,
35
+ streaming: false,
36
+ batchOperations: true,
37
+ supportedModelTypes: [],
38
+ };
39
+ /** A generált vektor dimenziója. */
40
+ dims;
41
+ /** @param set opcionális dims + onCostEvent. */
42
+ constructor(set) {
43
+ super();
44
+ this.dims = set?.dims && set.dims > 0 ? set.dims : exports.DyNTS_AI_MOCK_EMBEDDING_DIMS;
45
+ if (set?.onCostEvent) {
46
+ this.onCostEvent = set.onCostEvent;
47
+ }
48
+ }
49
+ /** A mock-nak nincs külső config-ja; a `setup` a dimenzió override-jára szolgál (config.dimensions). */
50
+ setup(config) {
51
+ const dims = Reflect.get(config ?? {}, 'dimensions');
52
+ if (typeof dims === 'number' && dims > 0) {
53
+ this.dims = dims;
54
+ }
55
+ }
56
+ /**
57
+ * Egy determinisztikus embedding. A `model`-t beleszövi a seed-be, hogy modell-váltás más vektort
58
+ * adjon (re-embed teszteléshez). `fullResponse=true` → OpenAI-alakú válasz-objektum.
59
+ */
60
+ async createEmbedding(set) {
61
+ const start = Date.now();
62
+ const vector = this.deterministicVector(`${set.model}::${set.text ?? ''}`);
63
+ const durationMs = Date.now() - start;
64
+ this.emitMockCostEvent('embedding-single', set.model, [set.text ?? ''], durationMs, set.issuer);
65
+ if (set.fullResponse) {
66
+ return this.toResponse([vector], set.model, [set.text ?? '']);
67
+ }
68
+ return vector;
69
+ }
70
+ /**
71
+ * Determinisztikus batch-embedding: minden szöveghez a `(model, text)` seed-ből generál egy fix-
72
+ * dimenziós, l2-normalizált vektort. A `texts` sorrendje == a visszaadott `number[][]` sorrendje.
73
+ */
74
+ async createEmbeddings(set) {
75
+ const texts = set.texts ?? [];
76
+ const start = Date.now();
77
+ const vectors = texts.map((text) => this.deterministicVector(`${set.model}::${text}`));
78
+ const durationMs = Date.now() - start;
79
+ this.emitMockCostEvent('embedding-batch', set.model, texts, durationMs, set.issuer);
80
+ if (set.fullResponse) {
81
+ return this.toResponse(vectors, set.model, texts);
82
+ }
83
+ return vectors;
84
+ }
85
+ /** Embedding model-info: provider `LocalAI`, model a megadott azonosító. */
86
+ getEmbeddingInfo(model) {
87
+ return {
88
+ provider: ai_1.DyFM_AI_Provider.LocalAI,
89
+ model: model,
90
+ };
91
+ }
92
+ /** A mock mindig elérhető (nincs külső függőség). */
93
+ async testConnection(_issuer) {
94
+ return true;
95
+ }
96
+ // =========================================================================
97
+ // belső: determinisztikus vektor + cost-event + response-alak
98
+ // =========================================================================
99
+ /**
100
+ * Egy determinisztikus, l2-normalizált vektor a seed-ből. A SHA-256 hash bájtjait körkörösen
101
+ * használja a `dims` kitöltésére, [-1, 1) tartományra képzi, majd l2-normalizál (egységhossz a
102
+ * koszinuszhoz). Egy második hash-bájttal kever, hogy a hosszabb dimenziókon ne ismétlődjön a minta.
103
+ */
104
+ deterministicVector(seed) {
105
+ const hash = crypto.createHash('sha256').update(seed).digest();
106
+ const vector = [];
107
+ for (let i = 0; i < this.dims; i++) {
108
+ const byte = hash[i % hash.length];
109
+ const mix = hash[(i * 7 + 3) % hash.length];
110
+ const combined = (byte ^ mix) & 0xff;
111
+ vector.push((combined / 255) * 2 - 1);
112
+ }
113
+ return this.l2Normalize(vector);
114
+ }
115
+ /** L2-normalizálás (egységhossz). Nulla-vektor → változatlan (elkerüli a 0-osztást). */
116
+ l2Normalize(vector) {
117
+ let sumSq = 0;
118
+ for (const value of vector) {
119
+ sumSq += value * value;
120
+ }
121
+ const norm = Math.sqrt(sumSq);
122
+ if (!norm) {
123
+ return vector;
124
+ }
125
+ return vector.map((value) => value / norm);
126
+ }
127
+ /** OpenAI-alakú válasz-objektum a vektorokból (a `fullResponse=true` ághoz). */
128
+ toResponse(vectors, model, texts) {
129
+ const tokens = this.estimateTokens(texts);
130
+ return {
131
+ object: 'list',
132
+ model: model,
133
+ data: vectors.map((embedding, index) => ({ object: 'embedding', embedding: embedding, index: index })),
134
+ usage: {
135
+ prompt_tokens: tokens,
136
+ total_tokens: tokens,
137
+ },
138
+ };
139
+ }
140
+ /** Cost-event emit (BFR-AM-007) fake tokennel (4 char ≈ 1 token), provider `'mock'`. */
141
+ emitMockCostEvent(callType, model, texts, durationMs, issuer) {
142
+ const tokens = this.estimateTokens(texts);
143
+ this.emitCostEvent({
144
+ callType: callType,
145
+ provider: this.costProvider,
146
+ model: model,
147
+ tokensUsed: {
148
+ input: tokens,
149
+ total: tokens,
150
+ },
151
+ durationMs: durationMs,
152
+ issuer: issuer,
153
+ timestamp: new Date(),
154
+ estimatedCostUsd: 0,
155
+ });
156
+ }
157
+ /** Becsült (fake) token-szám: 4 char ≈ 1 token. */
158
+ estimateTokens(texts) {
159
+ let chars = 0;
160
+ for (const text of texts) {
161
+ chars += (text ?? '').length;
162
+ }
163
+ return Math.max(1, Math.ceil(chars / 4));
164
+ }
165
+ }
166
+ exports.DyNTS_AI_Embedding_MockService = DyNTS_AI_Embedding_MockService;
167
+ //# sourceMappingURL=ai-embedding-mock.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-embedding-mock.service.js","sourceRoot":"","sources":["../../../../src/_modules/ai/_services/ai-embedding-mock.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { DyFM_OAI_Settings } from '@futdevpro/fsm-dynamo/ai/open-ai';
2
+ import { DyNTS_AI_Embedding_ServiceBase } from './ai-embedding.service-base';
3
+ import { DyNTS_LMStudio_Embedding_Settings } from './lmstudio-embedding.control-service';
4
+ import { DyNTS_AI_Embedding_MockSettings } from './ai-embedding-mock.service';
5
+ import { DyNTS_AI_CostEventCallback } from '../_models/interfaces/dynts-ai-cost-event-callback.interface';
6
+ /**
7
+ * Az embedding-provider kulcsa (BFR-AM-002). String-union, NEM enum (a cost-event provider-stringekkel
8
+ * konzisztens): `'openai'` (SDK reuse), `'lmstudio'` (lokális OpenAI-kompatibilis HTTP), `'mock'`
9
+ * (determinisztikus test-double). Az env-feloldás kis-/nagybetűt és a `lm-studio` alias-t is elfogad.
10
+ */
11
+ export type DyNTS_AI_EmbeddingProviderKey = 'openai' | 'lmstudio' | 'mock';
12
+ /**
13
+ * A provider-feloldás opciói. A `provider` explicit kulcsot ad; ha hiányzik, az env-ből oldjuk fel
14
+ * (`AI_EMBEDDING_PROVIDER`, default `openai`). A többi mező a megfelelő provider config-ját adja át.
15
+ */
16
+ export interface DyNTS_AI_EmbeddingResolveOptions {
17
+ /** Explicit provider-kulcs; ha hiányzik → env-feloldás. */
18
+ provider?: DyNTS_AI_EmbeddingProviderKey | string;
19
+ /** Per-call cost-event sink (FR-002 / BFR-AM-007) — mind a 3 providernek átadva. */
20
+ onCostEvent?: DyNTS_AI_CostEventCallback;
21
+ /** OpenAI-specifikus config (apiKey/org/project/defaultSettings) — `openai` providerhez. */
22
+ openAiSettings?: DyFM_OAI_Settings;
23
+ /** LM Studio config (baseUrl/apiKey) — `lmstudio` providerhez; baseUrl hiány → env (`LMSTUDIO_BASE_URL`). */
24
+ lmStudioSettings?: Partial<DyNTS_LMStudio_Embedding_Settings>;
25
+ /** Mock config (dims) — `mock` providerhez. */
26
+ mockSettings?: DyNTS_AI_Embedding_MockSettings;
27
+ }
28
+ /**
29
+ * `DyNTS_AI_EmbeddingProvider_Registry` (BFR-AM-002) — provider-dispatch resolver. A provider-kulcs
30
+ * (`openai` | `lmstudio` | `mock`) alapján a megfelelő `DyNTS_AI_Embedding_ServiceBase` példányt adja
31
+ * vissza, így a hívók egységes embedding-felületet látnak a konkrét provider-impl mögött (a FAM
32
+ * `FAM_Embedding_ControlService.buildProvider` dispatch-ét emeli bedrock-szintre, generikusan).
33
+ *
34
+ * Static util (nincs állapota): minden hívás friss példányt épít (env/secret a hívás-időpontban
35
+ * érvényes — memory: `dynts_dataservice_eager_resolve`-konzisztens, nincs élő singleton-állapot).
36
+ */
37
+ export declare class DyNTS_AI_EmbeddingProvider_Registry {
38
+ /**
39
+ * A megadott (vagy env-ből feloldott) provider-kulcs alapján egy embedding-service példányt épít.
40
+ * - `openai` → `DyNTS_OAI_Embedding_ControlService` (SDK reuse, cost-event sink-kel),
41
+ * - `lmstudio` → `DyNTS_LMStudio_Embedding_ControlService` (HTTP; baseUrl a config vagy env),
42
+ * - `mock` → `DyNTS_AI_Embedding_MockService` (determinisztikus),
43
+ * - ismeretlen → `Error` (provider nincs konfigurálva — nem néma).
44
+ */
45
+ static resolve(options?: DyNTS_AI_EmbeddingResolveOptions): DyNTS_AI_Embedding_ServiceBase;
46
+ /**
47
+ * A provider-kulcs normalizálása: kis-/nagybetű-független, a `lm-studio` / `local-ai` alias-t
48
+ * `lmstudio`-ra képzi. Hiány → env (`AI_EMBEDDING_PROVIDER`) → default `openai`. Ismeretlen → `Error`.
49
+ */
50
+ static normalizeKey(provider?: string): DyNTS_AI_EmbeddingProviderKey;
51
+ }
52
+ //# sourceMappingURL=ai-embedding-provider.registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-embedding-provider.registry.d.ts","sourceRoot":"","sources":["../../../../src/_modules/ai/_services/ai-embedding-provider.registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAE7E,OAAO,EAA2C,iCAAiC,EAAE,MAAM,sCAAsC,CAAC;AAClI,OAAO,EAAkC,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAC9G,OAAO,EAAE,0BAA0B,EAAE,MAAM,8DAA8D,CAAC;AAE1G;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAE3E;;;GAGG;AACH,MAAM,WAAW,gCAAgC;IAC/C,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,6BAA6B,GAAG,MAAM,CAAC;IAClD,oFAAoF;IACpF,WAAW,CAAC,EAAE,0BAA0B,CAAC;IACzC,4FAA4F;IAC5F,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,6GAA6G;IAC7G,gBAAgB,CAAC,EAAE,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAC9D,+CAA+C;IAC/C,YAAY,CAAC,EAAE,+BAA+B,CAAC;CAChD;AAED;;;;;;;;GAQG;AACH,qBAAa,mCAAmC;IAE9C;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,gCAAgC,GAAG,8BAA8B;IAkC1F;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,6BAA6B;CAyBtE"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyNTS_AI_EmbeddingProvider_Registry = void 0;
4
+ const oai_embedding_control_service_1 = require("../_modules/open-ai/_services/oai-embedding.control-service");
5
+ const lmstudio_embedding_control_service_1 = require("./lmstudio-embedding.control-service");
6
+ const ai_embedding_mock_service_1 = require("./ai-embedding-mock.service");
7
+ /**
8
+ * `DyNTS_AI_EmbeddingProvider_Registry` (BFR-AM-002) — provider-dispatch resolver. A provider-kulcs
9
+ * (`openai` | `lmstudio` | `mock`) alapján a megfelelő `DyNTS_AI_Embedding_ServiceBase` példányt adja
10
+ * vissza, így a hívók egységes embedding-felületet látnak a konkrét provider-impl mögött (a FAM
11
+ * `FAM_Embedding_ControlService.buildProvider` dispatch-ét emeli bedrock-szintre, generikusan).
12
+ *
13
+ * Static util (nincs állapota): minden hívás friss példányt épít (env/secret a hívás-időpontban
14
+ * érvényes — memory: `dynts_dataservice_eager_resolve`-konzisztens, nincs élő singleton-állapot).
15
+ */
16
+ class DyNTS_AI_EmbeddingProvider_Registry {
17
+ /**
18
+ * A megadott (vagy env-ből feloldott) provider-kulcs alapján egy embedding-service példányt épít.
19
+ * - `openai` → `DyNTS_OAI_Embedding_ControlService` (SDK reuse, cost-event sink-kel),
20
+ * - `lmstudio` → `DyNTS_LMStudio_Embedding_ControlService` (HTTP; baseUrl a config vagy env),
21
+ * - `mock` → `DyNTS_AI_Embedding_MockService` (determinisztikus),
22
+ * - ismeretlen → `Error` (provider nincs konfigurálva — nem néma).
23
+ */
24
+ static resolve(options) {
25
+ const key = DyNTS_AI_EmbeddingProvider_Registry.normalizeKey(options?.provider);
26
+ const onCostEvent = options?.onCostEvent;
27
+ switch (key) {
28
+ case 'openai':
29
+ return new oai_embedding_control_service_1.DyNTS_OAI_Embedding_ControlService({
30
+ ...(options?.openAiSettings ?? {}),
31
+ onCostEvent: onCostEvent,
32
+ });
33
+ case 'lmstudio': {
34
+ const baseUrl = options?.lmStudioSettings?.baseUrl ?? process.env.LMSTUDIO_BASE_URL;
35
+ if (!baseUrl) {
36
+ throw new Error('DyNTS_AI_EmbeddingProvider_Registry: the lmstudio provider was selected but no baseUrl '
37
+ + 'was provided (set lmStudioSettings.baseUrl or the LMSTUDIO_BASE_URL env var).');
38
+ }
39
+ return new lmstudio_embedding_control_service_1.DyNTS_LMStudio_Embedding_ControlService({
40
+ baseUrl: baseUrl,
41
+ apiKey: options?.lmStudioSettings?.apiKey ?? process.env.LMSTUDIO_API_KEY,
42
+ onCostEvent: onCostEvent,
43
+ });
44
+ }
45
+ case 'mock':
46
+ return new ai_embedding_mock_service_1.DyNTS_AI_Embedding_MockService({
47
+ ...(options?.mockSettings ?? {}),
48
+ onCostEvent: onCostEvent,
49
+ });
50
+ }
51
+ }
52
+ /**
53
+ * A provider-kulcs normalizálása: kis-/nagybetű-független, a `lm-studio` / `local-ai` alias-t
54
+ * `lmstudio`-ra képzi. Hiány → env (`AI_EMBEDDING_PROVIDER`) → default `openai`. Ismeretlen → `Error`.
55
+ */
56
+ static normalizeKey(provider) {
57
+ const raw = (provider ?? process.env.AI_EMBEDDING_PROVIDER ?? 'openai').trim().toLowerCase();
58
+ switch (raw) {
59
+ case 'openai':
60
+ case 'open-ai':
61
+ case 'oai':
62
+ return 'openai';
63
+ case 'lmstudio':
64
+ case 'lm-studio':
65
+ case 'local-ai':
66
+ case 'localai':
67
+ return 'lmstudio';
68
+ case 'mock':
69
+ case 'fake':
70
+ case 'test':
71
+ return 'mock';
72
+ default:
73
+ throw new Error(`DyNTS_AI_EmbeddingProvider_Registry: unknown embedding provider '${raw}'. `
74
+ + `Available: 'openai' | 'lmstudio' | 'mock'.`);
75
+ }
76
+ }
77
+ }
78
+ exports.DyNTS_AI_EmbeddingProvider_Registry = DyNTS_AI_EmbeddingProvider_Registry;
79
+ //# sourceMappingURL=ai-embedding-provider.registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-embedding-provider.registry.js","sourceRoot":"","sources":["../../../../src/_modules/ai/_services/ai-embedding-provider.registry.ts"],"names":[],"mappings":";;;AAGA,+GAAiH;AACjH,6FAAkI;AAClI,2EAA8G;AA2B9G;;;;;;;;GAQG;AACH,MAAa,mCAAmC;IAE9C;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,OAA0C;QACvD,MAAM,GAAG,GAAkC,mCAAmC,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/G,MAAM,WAAW,GAA2C,OAAO,EAAE,WAAW,CAAC;QAEjF,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,QAAQ;gBACX,OAAO,IAAI,kEAAkC,CAAC;oBAC5C,GAAG,CAAC,OAAO,EAAE,cAAc,IAAI,EAAE,CAAC;oBAClC,WAAW,EAAE,WAAW;iBACzB,CAAC,CAAC;YACL,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,OAAO,GAAuB,OAAO,EAAE,gBAAgB,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;gBAExG,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CACb,yFAAyF;0BACvF,+EAA+E,CAClF,CAAC;gBACJ,CAAC;gBAED,OAAO,IAAI,4EAAuC,CAAC;oBACjD,OAAO,EAAE,OAAO;oBAChB,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;oBACzE,WAAW,EAAE,WAAW;iBACzB,CAAC,CAAC;YACL,CAAC;YACD,KAAK,MAAM;gBACT,OAAO,IAAI,0DAA8B,CAAC;oBACxC,GAAG,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;oBAChC,WAAW,EAAE,WAAW;iBACzB,CAAC,CAAC;QACP,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,QAAiB;QACnC,MAAM,GAAG,GAAW,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErG,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS,CAAC;YACf,KAAK,KAAK;gBACR,OAAO,QAAQ,CAAC;YAClB,KAAK,UAAU,CAAC;YAChB,KAAK,WAAW,CAAC;YACjB,KAAK,UAAU,CAAC;YAChB,KAAK,SAAS;gBACZ,OAAO,UAAU,CAAC;YACpB,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM;gBACT,OAAO,MAAM,CAAC;YAEhB;gBACE,MAAM,IAAI,KAAK,CACb,oEAAoE,GAAG,KAAK;sBAC1E,4CAA4C,CAC/C,CAAC;QACN,CAAC;IACH,CAAC;CACF;AAxED,kFAwEC"}
@@ -0,0 +1,111 @@
1
+ import { CreateEmbeddingResponse } from 'openai/resources';
2
+ import { DyFM_AI_Provider, DyFM_AI_ProviderCapabilities, DyFM_AI_Config } from '@futdevpro/fsm-dynamo/ai';
3
+ import { DyFM_DAI_EmbeddingInfo } from '@futdevpro/fsm-dynamo/ai/document-ai';
4
+ import { DyNTS_AI_CostEventCallback } from '../_models/interfaces/dynts-ai-cost-event-callback.interface';
5
+ import { DyNTS_AI_Embedding_ServiceBase } from './ai-embedding.service-base';
6
+ /**
7
+ * Az LM Studio embedding control-service config-set-je. A `baseUrl` az OpenAI-kompatibilis
8
+ * lokális endpoint (pl. `http://localhost:1234/v1`), az `apiKey` opcionális (LM Studio default-
9
+ * ban nem kér Bearer-t). Az `onCostEvent` a per-call cost-event sink (FR-002, BFR-AM-007).
10
+ */
11
+ export interface DyNTS_LMStudio_Embedding_Settings {
12
+ /** OpenAI-kompatibilis lokális embedding-endpoint base URL-je (pl. `http://localhost:1234/v1`). */
13
+ baseUrl: string;
14
+ /** Opcionális Bearer token (LM Studio default-ban nem kér). */
15
+ apiKey?: string;
16
+ /** Per-call cost-event callback (FR-002 / BFR-AM-007). Non-breaking: ha undefined, nincs emit. */
17
+ onCostEvent?: DyNTS_AI_CostEventCallback;
18
+ }
19
+ /**
20
+ * `DyNTS_LMStudio_Embedding_ControlService` (BFR-AM-002) — OpenAI-kompatibilis **lokális** embedding
21
+ * adapter `fetch`-en (Node 20 global `fetch`, így a Dynamo NEM hoz be provider-specifikus SDK-t a
22
+ * lokális path-hoz). A FAM `FAM_LMStudio_EmbeddingProvider` workaround-ját emeli bedrock-szintre.
23
+ *
24
+ * A `baseUrl` + `modelId` config-ot a constructor-on kapja (mint a `DyNTS_OAI_Embedding_ControlService`
25
+ * a `DyFM_OAI_Settings`-et). A `${baseUrl}/embeddings` POST-ra a `{ model, input }` body-t küldi, a
26
+ * `data[].embedding` sorrendje == a `texts` sorrendje.
27
+ *
28
+ * **Cost-event (BFR-AM-007):** minden sikeres call után `emitCostEvent`-tel jelez (callType
29
+ * `embedding-single` / `embedding-batch`, provider `'lm-studio'`). Lokális futás → nincs USD-költség,
30
+ * a token-fogyasztás a `usage`-ből (ha az endpoint adja), különben becsült (4 char ≈ 1 token).
31
+ */
32
+ export declare class DyNTS_LMStudio_Embedding_ControlService extends DyNTS_AI_Embedding_ServiceBase {
33
+ /** A provider-azonosító a `LocalAI` enum-érték (LM Studio = lokális OpenAI-kompatibilis endpoint). */
34
+ readonly aiProvider: DyFM_AI_Provider;
35
+ /** A cost-event provider-string (a `DyNTS_AI_CostEvent.provider` szabad-string mezőjéhez). */
36
+ protected readonly costProvider: string;
37
+ /** LM Studio (OpenAI-kompatibilis lokális) capability-k: csak embedding-et igénylünk innen. */
38
+ readonly capabilities: DyFM_AI_ProviderCapabilities;
39
+ /** Az OpenAI-kompatibilis endpoint base URL-je (trailing slash-mentes). */
40
+ protected baseUrl: string;
41
+ /** Opcionális Bearer token. */
42
+ protected apiKey?: string;
43
+ /**
44
+ * @param set baseUrl + opc. apiKey + opc. onCostEvent. A `baseUrl` kötelező — ha üres, a
45
+ * `DyNTS-LMS-ECS-CFG` hibát dobjuk (lokális endpoint nincs konfigurálva).
46
+ */
47
+ constructor(set: DyNTS_LMStudio_Embedding_Settings);
48
+ /**
49
+ * Az LM Studio client-et nem SDK-val, hanem `fetch`-csel hívjuk; a `setup` a `baseUrl` (és
50
+ * opcionálisan az `apiKey`) átkonfigurálását teszi lehetővé (a base-szerződés egységessége miatt).
51
+ */
52
+ setup(config: DyFM_AI_Config): void;
53
+ /**
54
+ * Egy-szöveg embedding (a `createEmbeddings` egyelemű alakja). `fullResponse=true` esetén a
55
+ * teljes (OpenAI-alakú) válasz-objektumot adja vissza, különben a tiszta `number[]`-t.
56
+ */
57
+ createEmbedding(set: {
58
+ text: string;
59
+ model: string;
60
+ fullResponse?: boolean;
61
+ issuer: string;
62
+ }): Promise<number[] | CreateEmbeddingResponse>;
63
+ /**
64
+ * Batch-embedding az OpenAI-kompatibilis `/embeddings` végpontra. A `texts` sorrendje == a
65
+ * visszaadott `number[][]` sorrendje. `fullResponse=true` esetén a teljes válasz-objektum.
66
+ */
67
+ createEmbeddings(set: {
68
+ texts: string[];
69
+ model: string;
70
+ fullResponse?: boolean;
71
+ issuer: string;
72
+ }): Promise<number[][] | CreateEmbeddingResponse>;
73
+ /**
74
+ * Embedding model-info (a `DyFM_DAI_EmbeddingInfo` szerződés szerint). A provider `LocalAI`, a
75
+ * model a megadott azonosító (a lokális endpoint natív dimenzióját nem ismerjük előre).
76
+ */
77
+ getEmbeddingInfo(model: string): DyFM_DAI_EmbeddingInfo;
78
+ /**
79
+ * Provider-elérhetőség: egy minimál embedding-próba (rövid token). Ha a hívás dob (endpoint down /
80
+ * model hiányzik), `false`. Soha nem propagál hibát (try/catch → false).
81
+ */
82
+ testConnection(issuer: string): Promise<boolean>;
83
+ /**
84
+ * Az OpenAI-kompatibilis `/embeddings` POST-hívás `fetch`-csel. A `input` lehet egyetlen string
85
+ * vagy string-tömb (mindkettőt az OpenAI-spec megengedi). A választ `CreateEmbeddingResponse`-alakra
86
+ * normalizáljuk (a `data[].embedding`-eket kivonatoljuk). HTTP-/parse-hiba deskriptív üzenettel dobódik.
87
+ */
88
+ protected callEmbeddingsEndpoint(model: string, input: string | string[], issuer: string): Promise<CreateEmbeddingResponse>;
89
+ /**
90
+ * A nyers (OpenAI-kompatibilis) választ `CreateEmbeddingResponse`-alakra normalizálja: a `data[]`-ból
91
+ * a `embedding` tömböket emeli ki (csak véges number-eket), a darabszámot ellenőrzi (1:1 a `texts`-szel),
92
+ * és átveszi a `usage`-t ha van (a cost-event token-számához). Hibás/hiányzó mező → deskriptív hiba.
93
+ */
94
+ protected normalizeResponse(json: unknown, expectedCount: number, url: string, modelId: string): CreateEmbeddingResponse;
95
+ /**
96
+ * Cost-event emit (BFR-AM-007). A token a `usage`-ből (ha az endpoint adta), különben becsült
97
+ * (4 char ≈ 1 token, defenzív lokális heurisztika). A provider mindig `'lm-studio'` string.
98
+ */
99
+ protected emitLmStudioCostEvent(callType: 'embedding-single' | 'embedding-batch', model: string, texts: string[], response: CreateEmbeddingResponse, durationMs: number, issuer: string): void;
100
+ /** Becsült token-szám lokális endpoint-hoz (ha nincs `usage`): 4 char ≈ 1 token. */
101
+ protected estimateTokens(texts: string[]): number;
102
+ /** A `testConnection` próba-modellje (env-override-olható, default a FAM-mintára). */
103
+ protected defaultProbeModel(): string;
104
+ /** Trailing `/`-ek levágása (kettős slash elkerülése a `/embeddings` join-nál). */
105
+ protected trimTrailingSlashes(value: string): string;
106
+ /** Rövid, biztonságos válasz-snapshot a hiba-üzenethez (max 300 char). */
107
+ protected snapshot(value: string): string;
108
+ /** Egy number mező típusbiztos kiolvasása egy ismeretlen objektumból (hiány → 0). */
109
+ protected readNumber(obj: unknown, key: string): number;
110
+ }
111
+ //# sourceMappingURL=lmstudio-embedding.control-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lmstudio-embedding.control-service.d.ts","sourceRoot":"","sources":["../../../../src/_modules/ai/_services/lmstudio-embedding.control-service.ts"],"names":[],"mappings":"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"}