@futdevpro/nts-dynamo 1.15.56 → 1.15.58
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/.c8rc.json +26 -26
- package/.copilot/patterns.json +7 -7
- package/.cursor/rules/__assistant_guide.mdc +30 -30
- package/.cursor/rules/_ag_backend-structure.mdc +85 -85
- package/.cursor/rules/_ag_backend.mdc +16 -16
- package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
- package/.cursor/rules/_ag_frontend.mdc +39 -39
- package/.cursor/rules/_ag_import-rules.mdc +44 -44
- package/.cursor/rules/_ag_naming.mdc +115 -115
- package/.cursor/rules/_ag_should-be.mdc +6 -6
- package/.cursor/rules/ai_development_guide.md +60 -60
- package/.cursor/rules/cursor-rules.md +160 -160
- package/.cursor/rules/default-command.mdc +464 -464
- package/.cursor/rules/error_code_pattern.md +39 -39
- package/.cursor/rules/saved rule mcp server use.md +15 -15
- package/.dynamo/logs/cicd-pipeline/output.log +2844 -0
- package/.dynamo/logs/cicd-pipeline/status.json +94 -0
- package/.github/workflows/main.yml +432 -432
- package/.vscode/settings.json +10 -10
- package/HOWTO.md +15 -15
- package/LICENSE +21 -21
- package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
- package/_specifications/BACKLOG.md +92 -92
- package/_specifications/TODO.md +15 -15
- package/_specifications/agent.md +138 -138
- package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.d.ts +110 -0
- package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.d.ts.map +1 -0
- package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.js +419 -0
- package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.js.map +1 -0
- package/build/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.d.ts +50 -0
- package/build/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.d.ts.map +1 -0
- package/build/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.js +3 -0
- package/build/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.js.map +1 -0
- package/build/_modules/ai/_modules/document-ai/index.d.ts +2 -0
- package/build/_modules/ai/_modules/document-ai/index.d.ts.map +1 -1
- package/build/_modules/ai/_modules/document-ai/index.js +2 -0
- package/build/_modules/ai/_modules/document-ai/index.js.map +1 -1
- package/build/_modules/ai/_services/ai-embedding-mock.service.d.ts +81 -0
- package/build/_modules/ai/_services/ai-embedding-mock.service.d.ts.map +1 -0
- package/build/_modules/ai/_services/ai-embedding-mock.service.js +167 -0
- package/build/_modules/ai/_services/ai-embedding-mock.service.js.map +1 -0
- package/build/_modules/ai/_services/ai-embedding-provider.registry.d.ts +52 -0
- package/build/_modules/ai/_services/ai-embedding-provider.registry.d.ts.map +1 -0
- package/build/_modules/ai/_services/ai-embedding-provider.registry.js +79 -0
- package/build/_modules/ai/_services/ai-embedding-provider.registry.js.map +1 -0
- package/build/_modules/ai/_services/lmstudio-embedding.control-service.d.ts +111 -0
- package/build/_modules/ai/_services/lmstudio-embedding.control-service.d.ts.map +1 -0
- package/build/_modules/ai/_services/lmstudio-embedding.control-service.js +298 -0
- package/build/_modules/ai/_services/lmstudio-embedding.control-service.js.map +1 -0
- package/build/_modules/ai/index.d.ts +3 -0
- package/build/_modules/ai/index.d.ts.map +1 -1
- package/build/_modules/ai/index.js +4 -0
- package/build/_modules/ai/index.js.map +1 -1
- package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.d.ts +59 -0
- package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.d.ts.map +1 -0
- package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.js +169 -0
- package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.js.map +1 -0
- package/build/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.d.ts +32 -0
- package/build/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.d.ts.map +1 -0
- package/build/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.js +8 -0
- package/build/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.js.map +1 -0
- package/build/_modules/data-readers/index.d.ts +3 -0
- package/build/_modules/data-readers/index.d.ts.map +1 -0
- package/build/_modules/data-readers/index.js +11 -0
- package/build/_modules/data-readers/index.js.map +1 -0
- package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.d.ts +36 -0
- package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.d.ts.map +1 -0
- package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.js +54 -0
- package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.js.map +1 -0
- package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.d.ts +70 -0
- package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.d.ts.map +1 -0
- package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.js +123 -0
- package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.js.map +1 -0
- package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.d.ts +43 -0
- package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.d.ts.map +1 -0
- package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.js +72 -0
- package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.js.map +1 -0
- package/build/_modules/local-vector-search/index.d.ts +3 -0
- package/build/_modules/local-vector-search/index.d.ts.map +1 -1
- package/build/_modules/local-vector-search/index.js +4 -0
- package/build/_modules/local-vector-search/index.js.map +1 -1
- package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.d.ts +109 -0
- package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.d.ts.map +1 -0
- package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.js +14 -0
- package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.js.map +1 -0
- package/build/_modules/mcp/_services/dynts-mcp-server.service-base.d.ts +71 -0
- package/build/_modules/mcp/_services/dynts-mcp-server.service-base.d.ts.map +1 -0
- package/build/_modules/mcp/_services/dynts-mcp-server.service-base.js +99 -0
- package/build/_modules/mcp/_services/dynts-mcp-server.service-base.js.map +1 -0
- package/build/_modules/mcp/_services/dynts-mcp.adapter.d.ts +57 -0
- package/build/_modules/mcp/_services/dynts-mcp.adapter.d.ts.map +1 -0
- package/build/_modules/mcp/_services/dynts-mcp.adapter.js +134 -0
- package/build/_modules/mcp/_services/dynts-mcp.adapter.js.map +1 -0
- package/build/_modules/mcp/index.d.ts +4 -0
- package/build/_modules/mcp/index.d.ts.map +1 -0
- package/build/_modules/mcp/index.js +13 -0
- package/build/_modules/mcp/index.js.map +1 -0
- package/build/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.d.ts +19 -0
- package/build/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.d.ts.map +1 -0
- package/build/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.js +23 -0
- package/build/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.js.map +1 -0
- package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.d.ts +44 -0
- package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.d.ts.map +1 -0
- package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.js +68 -0
- package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.js.map +1 -0
- package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.d.ts +89 -0
- package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.d.ts.map +1 -0
- package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.js +3 -0
- package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.js.map +1 -0
- package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.d.ts +84 -0
- package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.d.ts.map +1 -0
- package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.js +220 -0
- package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.js.map +1 -0
- package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.d.ts +54 -0
- package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.d.ts.map +1 -0
- package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.js +76 -0
- package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.js.map +1 -0
- package/build/_modules/scoped-config/index.d.ts +6 -0
- package/build/_modules/scoped-config/index.d.ts.map +1 -0
- package/build/_modules/scoped-config/index.js +15 -0
- package/build/_modules/scoped-config/index.js.map +1 -0
- package/eslint.config.js +3 -3
- package/nodemon.json +24 -24
- package/package.json +58 -2
- package/pnpm-workspace.yaml +5 -4
- package/scripts/run-coverage-tests.js +28 -28
- package/spec/support/helpers/spec-reporter-loader.js +359 -359
- package/spec/support/helpers/ts-node-helper.js +93 -93
- package/spec/support/jasmine.coverage.json +24 -24
- package/spec/support/jasmine.json +24 -24
- package/src/_collections/archive.util.spec.ts +57 -57
- package/src/_collections/archive.util.ts +18 -18
- package/src/_collections/atlas-default-db-options.const.ts +9 -9
- package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
- package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
- package/src/_collections/default-not-found-page.const.spec.ts +19 -19
- package/src/_collections/default-not-found-page.const.ts +22 -22
- package/src/_collections/default-socket-path.const.spec.ts +12 -12
- package/src/_collections/default-socket-path.const.ts +2 -2
- package/src/_collections/get-environment-settings.util.spec.ts +210 -210
- package/src/_collections/get-environment-settings.util.ts +48 -48
- package/src/_collections/global-settings.const.ts +82 -82
- package/src/_collections/sample.env +21 -21
- package/src/_collections/star.controller.spec.ts +224 -224
- package/src/_collections/star.controller.ts +129 -129
- package/src/_enums/data-model-type.enum.ts +14 -14
- package/src/_enums/data-service-function.enum.ts +24 -24
- package/src/_enums/predefined-data-types.enum.ts +16 -16
- package/src/_enums/route-security.enum.ts +12 -12
- package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
- package/src/_models/control-models/api-call-params.control-model.ts +142 -142
- package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
- package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
- package/src/_models/control-models/app-params.control-model.ts +136 -136
- package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
- package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/endpoint-params.control-model.spec.ts +627 -627
- package/src/_models/control-models/endpoint-params.control-model.ts +627 -627
- package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
- package/src/_models/control-models/http-settings.control-model.ts +37 -37
- package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
- package/src/_models/control-models/system-control.control-model.ts +12 -12
- package/src/_models/interfaces/certification-settings.interface.ts +7 -7
- package/src/_models/interfaces/environment-settings.interface.ts +59 -59
- package/src/_models/interfaces/global-log-settings.interface.ts +171 -171
- package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
- package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
- package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
- package/src/_models/interfaces/static-client-settings.interface.ts +28 -28
- package/src/_models/types/db-update.type.ts +100 -100
- package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
- package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
- package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
- package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
- package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.spec.ts +295 -0
- package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +520 -0
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
- package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.ts +68 -0
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
- package/src/_modules/ai/_modules/document-ai/index.ts +30 -28
- package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
- package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
- package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
- package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +332 -332
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +634 -634
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +489 -489
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.tools.spec.ts +173 -173
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +1033 -1033
- package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
- package/src/_modules/ai/_services/ai-embedding-mock.service.spec.ts +115 -0
- package/src/_modules/ai/_services/ai-embedding-mock.service.ts +219 -0
- package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -0
- package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +110 -0
- package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
- package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
- package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
- package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
- package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
- package/src/_modules/ai/_services/ai-llm.service-base.ts +519 -519
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +158 -158
- package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
- package/src/_modules/ai/_services/lmstudio-embedding.control-service.spec.ts +197 -0
- package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +378 -0
- package/src/_modules/ai/index.ts +18 -13
- package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
- package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
- package/src/_modules/assistant/_collections/ass.util.ts +50 -50
- package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
- package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
- package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
- package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
- package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
- package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
- package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
- package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
- package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
- package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
- package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
- package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
- package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
- package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
- package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
- package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
- package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
- package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
- package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
- package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
- package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
- package/src/_modules/custom-data/custom-data.controller.ts +67 -67
- package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
- package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
- package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
- package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
- package/src/_modules/custom-data/index.ts +9 -9
- package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +161 -0
- package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +192 -0
- package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -0
- package/src/_modules/data-readers/index.ts +11 -0
- package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
- package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
- package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
- package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
- package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
- package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
- package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
- package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
- package/src/_modules/defaults/index.ts +17 -17
- package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
- package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
- package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
- package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
- package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
- package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
- package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
- package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
- package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
- package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
- package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
- package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
- package/src/_modules/discord-assistant/index.ts +38 -38
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
- package/src/_modules/discord-assistant-voiced/index.ts +36 -36
- package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
- package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
- package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
- package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
- package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
- package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
- package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
- package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
- package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
- package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
- package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
- package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
- package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
- package/src/_modules/discord-bot/index.ts +36 -36
- package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +35 -35
- package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +59 -0
- package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +480 -480
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +416 -416
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +198 -0
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +146 -0
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -0
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +106 -0
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +393 -393
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +220 -220
- package/src/_modules/local-vector-search/index.ts +17 -12
- package/src/_modules/logs/index.ts +11 -11
- package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -0
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +142 -0
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +120 -0
- package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +157 -0
- package/src/_modules/mcp/index.ts +13 -0
- package/src/_modules/messaging/README.md +354 -354
- package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
- package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
- package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
- package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
- package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
- package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
- package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
- package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
- package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
- package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
- package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
- package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
- package/src/_modules/messaging/index.ts +30 -30
- package/src/_modules/mock/app-extended-server.mock.ts +201 -201
- package/src/_modules/mock/app-integration-test.mock.ts +51 -51
- package/src/_modules/mock/app-params.mock.spec.ts +21 -21
- package/src/_modules/mock/app-params.mock.ts +9 -9
- package/src/_modules/mock/app-server.mock.ts +188 -188
- package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
- package/src/_modules/mock/auth-service.mock.ts +28 -28
- package/src/_modules/mock/controller.mock.spec.ts +26 -26
- package/src/_modules/mock/controller.mock.ts +16 -16
- package/src/_modules/mock/data-model.mock.spec.ts +111 -111
- package/src/_modules/mock/data-model.mock.ts +82 -82
- package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
- package/src/_modules/mock/email-service-collection.mock.ts +15 -15
- package/src/_modules/mock/email-service.mock.spec.ts +17 -17
- package/src/_modules/mock/email-service.mock.ts +20 -20
- package/src/_modules/mock/email-template.mock.html +14 -14
- package/src/_modules/mock/endpoint.mock.ts +91 -91
- package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
- package/src/_modules/mock/socket-client.mock.ts +45 -45
- package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
- package/src/_modules/mock/socket-server.mock.ts +46 -46
- package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
- package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
- package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
- package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
- package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
- package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
- package/src/_modules/oauth2/index.ts +17 -17
- package/src/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.ts +22 -0
- package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +81 -0
- package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +109 -0
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +306 -0
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +295 -0
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +118 -0
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +105 -0
- package/src/_modules/scoped-config/index.ts +17 -0
- package/src/_modules/server/errors/errors.control-service.spec.ts +238 -238
- package/src/_modules/server/errors/errors.control-service.ts +85 -85
- package/src/_modules/server/errors/errors.controller.spec.ts +241 -241
- package/src/_modules/server/errors/errors.controller.ts +431 -431
- package/src/_modules/server/errors/errors.data-service.spec.ts +361 -361
- package/src/_modules/server/index.ts +30 -30
- package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
- package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
- package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
- package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
- package/src/_modules/server/server-status/server-status.control-service.spec.ts +576 -576
- package/src/_modules/server/server-status/server-status.control-service.ts +396 -396
- package/src/_modules/server/server-status/server-status.controller.spec.ts +240 -240
- package/src/_modules/server/server-status/server-status.controller.ts +253 -253
- package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
- package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
- package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
- package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
- package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +46 -46
- package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
- package/src/_modules/socket/_services/socket-client.service.ts +260 -260
- package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
- package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
- package/src/_modules/socket/app-extended.server.ts +630 -630
- package/src/_modules/socket/index.ts +42 -42
- package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
- package/src/_modules/test/get-test-routing-module.util.ts +23 -23
- package/src/_modules/test/index.ts +11 -11
- package/src/_modules/test/test.controller.spec.ts +72 -72
- package/src/_modules/test/test.controller.ts +115 -115
- package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
- package/src/_modules/usage/index.ts +15 -15
- package/src/_modules/usage/usage.controller.spec.ts +81 -81
- package/src/_modules/usage/usage.controller.ts +126 -126
- package/src/_modules/usage/usage.data-service.spec.ts +332 -332
- package/src/_modules/usage/usage.data-service.ts +185 -185
- package/src/_services/base/api.service-base.spec.ts +125 -125
- package/src/_services/base/api.service-base.ts +74 -74
- package/src/_services/base/archive-data.service.spec.ts +196 -196
- package/src/_services/base/archive-data.service.ts +216 -216
- package/src/_services/base/data.service.spec.ts +674 -674
- package/src/_services/base/data.service.ts +2719 -2719
- package/src/_services/base/db.service.spec.ts +73 -73
- package/src/_services/base/db.service.ts +1575 -1575
- package/src/_services/base/singleton.service-base.spec.ts +28 -28
- package/src/_services/base/singleton.service-base.ts +24 -24
- package/src/_services/base/singleton.service.spec.ts +114 -114
- package/src/_services/base/singleton.service.ts +38 -38
- package/src/_services/core/api.service.spec.ts +140 -140
- package/src/_services/core/auth.service.spec.ts +159 -159
- package/src/_services/core/auth.service.ts +174 -174
- package/src/_services/core/email.service.spec.ts +85 -85
- package/src/_services/core/email.service.ts +742 -742
- package/src/_services/core/global.service.spec.ts +275 -275
- package/src/_services/core/global.service.ts +461 -461
- package/src/_services/core/service-collection.service.spec.ts +46 -46
- package/src/_services/core/service-collection.service.ts +6 -6
- package/src/_services/route/controller.service.spec.ts +53 -53
- package/src/_services/route/controller.service.ts +148 -148
- package/src/_services/route/routing-module.service.spec.ts +98 -98
- package/src/_services/route/routing-module.service.ts +330 -330
- package/src/_services/server/app.server.ts +1726 -1726
- package/src/_services/shared.static-service.spec.ts +99 -99
- package/src/_services/shared.static-service.ts +78 -78
- package/src/index.ts +96 -96
- package/tsconfig.app.json +12 -12
- package/tsconfig.json +42 -42
|
@@ -1,158 +1,158 @@
|
|
|
1
|
-
|
|
2
|
-
import { DyNTS_AI_CostEvent } from '../_models/interfaces/dynts-ai-cost-event.interface';
|
|
3
|
-
import { DyNTS_AI_CostEventCallback } from '../_models/interfaces/dynts-ai-cost-event-callback.interface';
|
|
4
|
-
import { DyNTS_AI_Provider_ServiceBase } from './ai-provider.service-base';
|
|
5
|
-
import { DyFM_AI_Provider, DyFM_AI_ProviderCapabilities, DyFM_AI_Config } from '@futdevpro/fsm-dynamo/ai';
|
|
6
|
-
|
|
7
|
-
class TestProviderService extends DyNTS_AI_Provider_ServiceBase {
|
|
8
|
-
readonly aiProvider: DyFM_AI_Provider = DyFM_AI_Provider.OpenAI;
|
|
9
|
-
readonly capabilities: DyFM_AI_ProviderCapabilities = {
|
|
10
|
-
chat: true,
|
|
11
|
-
embeddings: true,
|
|
12
|
-
imageGeneration: false,
|
|
13
|
-
vision: false,
|
|
14
|
-
audioGeneration: false,
|
|
15
|
-
audioAnalysis: false,
|
|
16
|
-
functionCalling: false,
|
|
17
|
-
streaming: false,
|
|
18
|
-
batchOperations: false,
|
|
19
|
-
supportedModelTypes: [],
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
setup = (config: DyFM_AI_Config): void => {
|
|
23
|
-
// Mock implementation
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
testConnection = async (issuer: string): Promise<boolean> => {
|
|
27
|
-
return true;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
/** Test-only helper: ráad egy callback-et a protected onCostEvent fielden át. */
|
|
31
|
-
public setOnCostEventForTest(cb: DyNTS_AI_CostEventCallback | undefined): void {
|
|
32
|
-
this.onCostEvent = cb;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Test-only helper: meghívja a protected emitCostEvent-et (a sub-class amúgy is hívná). */
|
|
36
|
-
public emitForTest(event: DyNTS_AI_CostEvent): void {
|
|
37
|
-
this.emitCostEvent(event);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
static getInstance(): TestProviderService {
|
|
41
|
-
return TestProviderService.getSingletonInstance();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** Helper: minimal valid DyNTS_AI_CostEvent. */
|
|
46
|
-
function makeCostEvent(overrides: Partial<DyNTS_AI_CostEvent> = {}): DyNTS_AI_CostEvent {
|
|
47
|
-
return {
|
|
48
|
-
callType: 'embedding-single',
|
|
49
|
-
provider: 'openai',
|
|
50
|
-
model: 'text-embedding-3-small',
|
|
51
|
-
tokensUsed: { input: 10, total: 10 },
|
|
52
|
-
durationMs: 42,
|
|
53
|
-
issuer: 'test-issuer',
|
|
54
|
-
timestamp: new Date(),
|
|
55
|
-
...overrides,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
describe('| DyNTS_AI_Provider_ServiceBase', () => {
|
|
60
|
-
let service: TestProviderService;
|
|
61
|
-
|
|
62
|
-
beforeEach(() => {
|
|
63
|
-
service = TestProviderService.getInstance();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('| should be a singleton instance', () => {
|
|
67
|
-
const instance1 = TestProviderService.getInstance();
|
|
68
|
-
const instance2 = TestProviderService.getInstance();
|
|
69
|
-
|
|
70
|
-
expect(instance1).toBe(instance2);
|
|
71
|
-
expect(instance1).toBeInstanceOf(TestProviderService);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('| should have aiProvider property', () => {
|
|
75
|
-
expect(service.aiProvider).toBe(DyFM_AI_Provider.OpenAI);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('| should have capabilities property', () => {
|
|
79
|
-
expect(service.capabilities).toBeDefined();
|
|
80
|
-
expect(service.capabilities.chat).toBe(true);
|
|
81
|
-
expect(service.capabilities.embeddings).toBe(true);
|
|
82
|
-
expect(service.capabilities.chat).toBe(true);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
describe('| setup', () => {
|
|
86
|
-
it('| should accept config parameter', () => {
|
|
87
|
-
const config: DyFM_AI_Config = {
|
|
88
|
-
apiKey: 'test-key',
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
expect(() => {
|
|
92
|
-
service.setup(config);
|
|
93
|
-
}).not.toThrow();
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
describe('| testConnection', () => {
|
|
98
|
-
it('| should return true when connection is successful', async () => {
|
|
99
|
-
const result = await service.testConnection('issuer-123');
|
|
100
|
-
|
|
101
|
-
expect(result).toBe(true);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
describe('| emitCostEvent (FR-002 cost-event hook)', () => {
|
|
106
|
-
|
|
107
|
-
afterEach(() => {
|
|
108
|
-
// Reset callback hogy ne szivárogjon át teszt-cases között (singleton service)
|
|
109
|
-
service.setOnCostEventForTest(undefined);
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('| should be no-op when onCostEvent is undefined', () => {
|
|
113
|
-
service.setOnCostEventForTest(undefined);
|
|
114
|
-
|
|
115
|
-
expect(() => {
|
|
116
|
-
service.emitForTest(makeCostEvent());
|
|
117
|
-
}).not.toThrow();
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it('| should invoke the registered callback with the event payload', () => {
|
|
121
|
-
const received: DyNTS_AI_CostEvent[] = [];
|
|
122
|
-
service.setOnCostEventForTest((e: DyNTS_AI_CostEvent) => {
|
|
123
|
-
received.push(e);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
const event: DyNTS_AI_CostEvent = makeCostEvent({
|
|
127
|
-
model: 'gpt-4o-mini',
|
|
128
|
-
callType: 'llm-completion',
|
|
129
|
-
tokensUsed: { input: 100, output: 50, total: 150 },
|
|
130
|
-
});
|
|
131
|
-
service.emitForTest(event);
|
|
132
|
-
|
|
133
|
-
expect(received.length).toBe(1);
|
|
134
|
-
expect(received[0]).toEqual(event);
|
|
135
|
-
expect(received[0].tokensUsed.total).toBe(150);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it('| should NOT throw when the callback itself throws (safe emit)', () => {
|
|
139
|
-
service.setOnCostEventForTest(() => {
|
|
140
|
-
throw new Error('consumer callback failure');
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
expect(() => {
|
|
144
|
-
service.emitForTest(makeCostEvent());
|
|
145
|
-
}).not.toThrow();
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
it('| should leave estimatedCostUsd undefined by default (Dynamo has no pricing registry)', () => {
|
|
149
|
-
const received: DyNTS_AI_CostEvent[] = [];
|
|
150
|
-
service.setOnCostEventForTest((e: DyNTS_AI_CostEvent) => { received.push(e); });
|
|
151
|
-
|
|
152
|
-
service.emitForTest(makeCostEvent());
|
|
153
|
-
|
|
154
|
-
expect(received[0].estimatedCostUsd).toBeUndefined();
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
|
|
1
|
+
|
|
2
|
+
import { DyNTS_AI_CostEvent } from '../_models/interfaces/dynts-ai-cost-event.interface';
|
|
3
|
+
import { DyNTS_AI_CostEventCallback } from '../_models/interfaces/dynts-ai-cost-event-callback.interface';
|
|
4
|
+
import { DyNTS_AI_Provider_ServiceBase } from './ai-provider.service-base';
|
|
5
|
+
import { DyFM_AI_Provider, DyFM_AI_ProviderCapabilities, DyFM_AI_Config } from '@futdevpro/fsm-dynamo/ai';
|
|
6
|
+
|
|
7
|
+
class TestProviderService extends DyNTS_AI_Provider_ServiceBase {
|
|
8
|
+
readonly aiProvider: DyFM_AI_Provider = DyFM_AI_Provider.OpenAI;
|
|
9
|
+
readonly capabilities: DyFM_AI_ProviderCapabilities = {
|
|
10
|
+
chat: true,
|
|
11
|
+
embeddings: true,
|
|
12
|
+
imageGeneration: false,
|
|
13
|
+
vision: false,
|
|
14
|
+
audioGeneration: false,
|
|
15
|
+
audioAnalysis: false,
|
|
16
|
+
functionCalling: false,
|
|
17
|
+
streaming: false,
|
|
18
|
+
batchOperations: false,
|
|
19
|
+
supportedModelTypes: [],
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
setup = (config: DyFM_AI_Config): void => {
|
|
23
|
+
// Mock implementation
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
testConnection = async (issuer: string): Promise<boolean> => {
|
|
27
|
+
return true;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/** Test-only helper: ráad egy callback-et a protected onCostEvent fielden át. */
|
|
31
|
+
public setOnCostEventForTest(cb: DyNTS_AI_CostEventCallback | undefined): void {
|
|
32
|
+
this.onCostEvent = cb;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Test-only helper: meghívja a protected emitCostEvent-et (a sub-class amúgy is hívná). */
|
|
36
|
+
public emitForTest(event: DyNTS_AI_CostEvent): void {
|
|
37
|
+
this.emitCostEvent(event);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static getInstance(): TestProviderService {
|
|
41
|
+
return TestProviderService.getSingletonInstance();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Helper: minimal valid DyNTS_AI_CostEvent. */
|
|
46
|
+
function makeCostEvent(overrides: Partial<DyNTS_AI_CostEvent> = {}): DyNTS_AI_CostEvent {
|
|
47
|
+
return {
|
|
48
|
+
callType: 'embedding-single',
|
|
49
|
+
provider: 'openai',
|
|
50
|
+
model: 'text-embedding-3-small',
|
|
51
|
+
tokensUsed: { input: 10, total: 10 },
|
|
52
|
+
durationMs: 42,
|
|
53
|
+
issuer: 'test-issuer',
|
|
54
|
+
timestamp: new Date(),
|
|
55
|
+
...overrides,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
describe('| DyNTS_AI_Provider_ServiceBase', () => {
|
|
60
|
+
let service: TestProviderService;
|
|
61
|
+
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
service = TestProviderService.getInstance();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('| should be a singleton instance', () => {
|
|
67
|
+
const instance1 = TestProviderService.getInstance();
|
|
68
|
+
const instance2 = TestProviderService.getInstance();
|
|
69
|
+
|
|
70
|
+
expect(instance1).toBe(instance2);
|
|
71
|
+
expect(instance1).toBeInstanceOf(TestProviderService);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('| should have aiProvider property', () => {
|
|
75
|
+
expect(service.aiProvider).toBe(DyFM_AI_Provider.OpenAI);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('| should have capabilities property', () => {
|
|
79
|
+
expect(service.capabilities).toBeDefined();
|
|
80
|
+
expect(service.capabilities.chat).toBe(true);
|
|
81
|
+
expect(service.capabilities.embeddings).toBe(true);
|
|
82
|
+
expect(service.capabilities.chat).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe('| setup', () => {
|
|
86
|
+
it('| should accept config parameter', () => {
|
|
87
|
+
const config: DyFM_AI_Config = {
|
|
88
|
+
apiKey: 'test-key',
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
expect(() => {
|
|
92
|
+
service.setup(config);
|
|
93
|
+
}).not.toThrow();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
describe('| testConnection', () => {
|
|
98
|
+
it('| should return true when connection is successful', async () => {
|
|
99
|
+
const result = await service.testConnection('issuer-123');
|
|
100
|
+
|
|
101
|
+
expect(result).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
describe('| emitCostEvent (FR-002 cost-event hook)', () => {
|
|
106
|
+
|
|
107
|
+
afterEach(() => {
|
|
108
|
+
// Reset callback hogy ne szivárogjon át teszt-cases között (singleton service)
|
|
109
|
+
service.setOnCostEventForTest(undefined);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('| should be no-op when onCostEvent is undefined', () => {
|
|
113
|
+
service.setOnCostEventForTest(undefined);
|
|
114
|
+
|
|
115
|
+
expect(() => {
|
|
116
|
+
service.emitForTest(makeCostEvent());
|
|
117
|
+
}).not.toThrow();
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('| should invoke the registered callback with the event payload', () => {
|
|
121
|
+
const received: DyNTS_AI_CostEvent[] = [];
|
|
122
|
+
service.setOnCostEventForTest((e: DyNTS_AI_CostEvent) => {
|
|
123
|
+
received.push(e);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
const event: DyNTS_AI_CostEvent = makeCostEvent({
|
|
127
|
+
model: 'gpt-4o-mini',
|
|
128
|
+
callType: 'llm-completion',
|
|
129
|
+
tokensUsed: { input: 100, output: 50, total: 150 },
|
|
130
|
+
});
|
|
131
|
+
service.emitForTest(event);
|
|
132
|
+
|
|
133
|
+
expect(received.length).toBe(1);
|
|
134
|
+
expect(received[0]).toEqual(event);
|
|
135
|
+
expect(received[0].tokensUsed.total).toBe(150);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('| should NOT throw when the callback itself throws (safe emit)', () => {
|
|
139
|
+
service.setOnCostEventForTest(() => {
|
|
140
|
+
throw new Error('consumer callback failure');
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
expect(() => {
|
|
144
|
+
service.emitForTest(makeCostEvent());
|
|
145
|
+
}).not.toThrow();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('| should leave estimatedCostUsd undefined by default (Dynamo has no pricing registry)', () => {
|
|
149
|
+
const received: DyNTS_AI_CostEvent[] = [];
|
|
150
|
+
service.setOnCostEventForTest((e: DyNTS_AI_CostEvent) => { received.push(e); });
|
|
151
|
+
|
|
152
|
+
service.emitForTest(makeCostEvent());
|
|
153
|
+
|
|
154
|
+
expect(received[0].estimatedCostUsd).toBeUndefined();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
import { DyFM_AI_Provider, DyFM_AI_Config } from '@futdevpro/fsm-dynamo/ai';
|
|
2
|
-
import { DyFM_AI_UserProviderConfig } from '@futdevpro/fsm-dynamo/ai';
|
|
3
|
-
|
|
4
|
-
import { DyNTS_SingletonService } from '../../../_services/base/singleton.service';
|
|
5
|
-
import { DyNTS_AI_TestGeneration_Result } from '../_models/ai-test-generation-result.interface';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Absztrakt bazis osztaly a user AI provider kulcs kezeleshez
|
|
9
|
-
*
|
|
10
|
-
* A titkositas/visszafejtes NEM itt tortenik -- azt az fdp-auth-service Auth_ControlService-e vegzi.
|
|
11
|
-
* Ezek a service-ek a mar visszafejtett config-ot es API kulcsot kapjak,
|
|
12
|
-
* es abbol allitjak ossze a provider-specifikus konfigot.
|
|
13
|
-
*/
|
|
14
|
-
export abstract class DyNTS_AI_UserKey_ServiceBase extends DyNTS_SingletonService {
|
|
15
|
-
/** melyik provider-hez tartozik ez a service */
|
|
16
|
-
abstract readonly aiProvider: DyFM_AI_Provider;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Visszafejtett user config + kulcs -> provider-specifikus AI config osszeallitas
|
|
20
|
-
* @param userProviderConfig - a user provider konfiguracioja
|
|
21
|
-
* @param decryptedApiKey - a mar visszafejtett API kulcs
|
|
22
|
-
*/
|
|
23
|
-
abstract resolveConfig(
|
|
24
|
-
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
25
|
-
decryptedApiKey: string
|
|
26
|
-
): DyFM_AI_Config;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Kapcsolat tesztelese a provider-rel a visszafejtett kulccsal
|
|
30
|
-
* @param userProviderConfig - a user provider konfiguracioja
|
|
31
|
-
* @param decryptedApiKey - a mar visszafejtett API kulcs
|
|
32
|
-
*/
|
|
33
|
-
abstract testConnection(
|
|
34
|
-
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
35
|
-
decryptedApiKey: string
|
|
36
|
-
): Promise<boolean>;
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Elerheto modellek lekerdezese a provider API-rol
|
|
40
|
-
* @param userProviderConfig - a user provider konfiguracioja
|
|
41
|
-
* @param decryptedApiKey - a mar visszafejtett API kulcs
|
|
42
|
-
*/
|
|
43
|
-
abstract listAvailableModels(
|
|
44
|
-
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
45
|
-
decryptedApiKey: string
|
|
46
|
-
): Promise<string[]>;
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Teszt generalas a provider-rel
|
|
50
|
-
* @param set.userProviderConfig - a user provider konfiguracioja
|
|
51
|
-
* @param set.decryptedApiKey - a mar visszafejtett API kulcs
|
|
52
|
-
* @param set.model - a hasznalando modell
|
|
53
|
-
*/
|
|
54
|
-
abstract testGeneration(set: {
|
|
55
|
-
userProviderConfig: DyFM_AI_UserProviderConfig;
|
|
56
|
-
decryptedApiKey: string;
|
|
57
|
-
model: string;
|
|
58
|
-
}): Promise<DyNTS_AI_TestGeneration_Result>;
|
|
59
|
-
}
|
|
1
|
+
import { DyFM_AI_Provider, DyFM_AI_Config } from '@futdevpro/fsm-dynamo/ai';
|
|
2
|
+
import { DyFM_AI_UserProviderConfig } from '@futdevpro/fsm-dynamo/ai';
|
|
3
|
+
|
|
4
|
+
import { DyNTS_SingletonService } from '../../../_services/base/singleton.service';
|
|
5
|
+
import { DyNTS_AI_TestGeneration_Result } from '../_models/ai-test-generation-result.interface';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Absztrakt bazis osztaly a user AI provider kulcs kezeleshez
|
|
9
|
+
*
|
|
10
|
+
* A titkositas/visszafejtes NEM itt tortenik -- azt az fdp-auth-service Auth_ControlService-e vegzi.
|
|
11
|
+
* Ezek a service-ek a mar visszafejtett config-ot es API kulcsot kapjak,
|
|
12
|
+
* es abbol allitjak ossze a provider-specifikus konfigot.
|
|
13
|
+
*/
|
|
14
|
+
export abstract class DyNTS_AI_UserKey_ServiceBase extends DyNTS_SingletonService {
|
|
15
|
+
/** melyik provider-hez tartozik ez a service */
|
|
16
|
+
abstract readonly aiProvider: DyFM_AI_Provider;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Visszafejtett user config + kulcs -> provider-specifikus AI config osszeallitas
|
|
20
|
+
* @param userProviderConfig - a user provider konfiguracioja
|
|
21
|
+
* @param decryptedApiKey - a mar visszafejtett API kulcs
|
|
22
|
+
*/
|
|
23
|
+
abstract resolveConfig(
|
|
24
|
+
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
25
|
+
decryptedApiKey: string
|
|
26
|
+
): DyFM_AI_Config;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Kapcsolat tesztelese a provider-rel a visszafejtett kulccsal
|
|
30
|
+
* @param userProviderConfig - a user provider konfiguracioja
|
|
31
|
+
* @param decryptedApiKey - a mar visszafejtett API kulcs
|
|
32
|
+
*/
|
|
33
|
+
abstract testConnection(
|
|
34
|
+
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
35
|
+
decryptedApiKey: string
|
|
36
|
+
): Promise<boolean>;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Elerheto modellek lekerdezese a provider API-rol
|
|
40
|
+
* @param userProviderConfig - a user provider konfiguracioja
|
|
41
|
+
* @param decryptedApiKey - a mar visszafejtett API kulcs
|
|
42
|
+
*/
|
|
43
|
+
abstract listAvailableModels(
|
|
44
|
+
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
45
|
+
decryptedApiKey: string
|
|
46
|
+
): Promise<string[]>;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Teszt generalas a provider-rel
|
|
50
|
+
* @param set.userProviderConfig - a user provider konfiguracioja
|
|
51
|
+
* @param set.decryptedApiKey - a mar visszafejtett API kulcs
|
|
52
|
+
* @param set.model - a hasznalando modell
|
|
53
|
+
*/
|
|
54
|
+
abstract testGeneration(set: {
|
|
55
|
+
userProviderConfig: DyFM_AI_UserProviderConfig;
|
|
56
|
+
decryptedApiKey: string;
|
|
57
|
+
model: string;
|
|
58
|
+
}): Promise<DyNTS_AI_TestGeneration_Result>;
|
|
59
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { CreateEmbeddingResponse } from 'openai/resources';
|
|
2
|
+
import { DyFM_AI_Provider } from '@futdevpro/fsm-dynamo/ai';
|
|
3
|
+
import { DyFM_Error } from '@futdevpro/fsm-dynamo';
|
|
4
|
+
|
|
5
|
+
import { DyNTS_LMStudio_Embedding_ControlService } from './lmstudio-embedding.control-service';
|
|
6
|
+
import { DyNTS_AI_CostEvent } from '../_models/interfaces/dynts-ai-cost-event.interface';
|
|
7
|
+
|
|
8
|
+
describe('| DyNTS_LMStudio_Embedding_ControlService', () => {
|
|
9
|
+
|
|
10
|
+
const baseUrl: string = 'http://localhost:1234/v1';
|
|
11
|
+
const issuer: string = 'test-issuer';
|
|
12
|
+
|
|
13
|
+
/** Egy OpenAI-kompatibilis embeddings-válasz JSON-string-é csomagolva, fetch-mockhoz. */
|
|
14
|
+
function okResponse(embeddings: number[][], usage?: { prompt_tokens: number; total_tokens: number }): Response {
|
|
15
|
+
const body: string = JSON.stringify({
|
|
16
|
+
object: 'list',
|
|
17
|
+
data: embeddings.map((embedding, index) => ({ object: 'embedding', embedding: embedding, index: index })),
|
|
18
|
+
usage: usage,
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
ok: true,
|
|
22
|
+
status: 200,
|
|
23
|
+
text: () => Promise.resolve(body),
|
|
24
|
+
} as Response;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Egy hibás (non-2xx) válasz fetch-mockhoz. */
|
|
28
|
+
function errorResponse(status: number, body: string): Response {
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
status: status,
|
|
32
|
+
text: () => Promise.resolve(body),
|
|
33
|
+
} as Response;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let fetchSpy: jasmine.Spy;
|
|
37
|
+
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
fetchSpy = spyOn(globalThis, 'fetch');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe('| constructor', () => {
|
|
43
|
+
it('| should throw a DyFM_Error if baseUrl is empty', () => {
|
|
44
|
+
expect(() => new DyNTS_LMStudio_Embedding_ControlService({ baseUrl: '' })).toThrowMatching(
|
|
45
|
+
(error: unknown) => error instanceof DyFM_Error,
|
|
46
|
+
);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('| should set provider to LocalAI', () => {
|
|
50
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({ baseUrl: baseUrl });
|
|
51
|
+
expect(service.aiProvider).toBe(DyFM_AI_Provider.LocalAI);
|
|
52
|
+
expect(service.capabilities.embeddings).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
describe('| createEmbeddings', () => {
|
|
57
|
+
it('| should POST to ${baseUrl}/embeddings and return vectors in order', async () => {
|
|
58
|
+
fetchSpy.and.returnValue(Promise.resolve(okResponse([[0.1, 0.2], [0.3, 0.4]])));
|
|
59
|
+
|
|
60
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({ baseUrl: baseUrl });
|
|
61
|
+
const result: number[][] | CreateEmbeddingResponse = await service.createEmbeddings({
|
|
62
|
+
texts: ['hello', 'world'],
|
|
63
|
+
model: 'nomic-embed-text-v1.5',
|
|
64
|
+
issuer: issuer,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
expect(result).toEqual([[0.1, 0.2], [0.3, 0.4]]);
|
|
68
|
+
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
69
|
+
const url: string = fetchSpy.calls.mostRecent().args[0] as string;
|
|
70
|
+
expect(url).toBe('http://localhost:1234/v1/embeddings');
|
|
71
|
+
const init: RequestInit = fetchSpy.calls.mostRecent().args[1] as RequestInit;
|
|
72
|
+
expect(init.method).toBe('POST');
|
|
73
|
+
const sentBody: { model: string; input: string[] } = JSON.parse(init.body as string);
|
|
74
|
+
expect(sentBody.model).toBe('nomic-embed-text-v1.5');
|
|
75
|
+
expect(sentBody.input).toEqual(['hello', 'world']);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('| should trim trailing slashes from baseUrl', async () => {
|
|
79
|
+
fetchSpy.and.returnValue(Promise.resolve(okResponse([[0.5]])));
|
|
80
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({
|
|
81
|
+
baseUrl: 'http://localhost:1234/v1///',
|
|
82
|
+
});
|
|
83
|
+
await service.createEmbeddings({ texts: ['x'], model: 'm', issuer: issuer });
|
|
84
|
+
expect(fetchSpy.calls.mostRecent().args[0]).toBe('http://localhost:1234/v1/embeddings');
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('| should add a Bearer header when apiKey is provided', async () => {
|
|
88
|
+
fetchSpy.and.returnValue(Promise.resolve(okResponse([[0.5]])));
|
|
89
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({
|
|
90
|
+
baseUrl: baseUrl,
|
|
91
|
+
apiKey: 'secret-token',
|
|
92
|
+
});
|
|
93
|
+
await service.createEmbeddings({ texts: ['x'], model: 'm', issuer: issuer });
|
|
94
|
+
const init: RequestInit = fetchSpy.calls.mostRecent().args[1] as RequestInit;
|
|
95
|
+
const headers: { [key: string]: string } = init.headers as { [key: string]: string };
|
|
96
|
+
expect(headers.Authorization).toBe('Bearer secret-token');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('| should throw a DyFM_Error on a non-ok HTTP response', async () => {
|
|
100
|
+
fetchSpy.and.returnValue(Promise.resolve(errorResponse(500, 'boom')));
|
|
101
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({ baseUrl: baseUrl });
|
|
102
|
+
|
|
103
|
+
await expectAsync(
|
|
104
|
+
service.createEmbeddings({ texts: ['x'], model: 'm', issuer: issuer }),
|
|
105
|
+
).toBeRejectedWith(jasmine.any(DyFM_Error));
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('| should throw a DyFM_Error if the vector count does not match the text count', async () => {
|
|
109
|
+
fetchSpy.and.returnValue(Promise.resolve(okResponse([[0.1]])));
|
|
110
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({ baseUrl: baseUrl });
|
|
111
|
+
|
|
112
|
+
await expectAsync(
|
|
113
|
+
service.createEmbeddings({ texts: ['a', 'b'], model: 'm', issuer: issuer }),
|
|
114
|
+
).toBeRejectedWith(jasmine.any(DyFM_Error));
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('| should emit an embedding-batch cost-event with provider lm-studio', async () => {
|
|
118
|
+
fetchSpy.and.returnValue(Promise.resolve(okResponse([[0.1], [0.2]], { prompt_tokens: 7, total_tokens: 7 })));
|
|
119
|
+
const events: DyNTS_AI_CostEvent[] = [];
|
|
120
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({
|
|
121
|
+
baseUrl: baseUrl,
|
|
122
|
+
onCostEvent: (event: DyNTS_AI_CostEvent) => events.push(event),
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
await service.createEmbeddings({ texts: ['a', 'b'], model: 'm', issuer: issuer });
|
|
126
|
+
|
|
127
|
+
expect(events.length).toBe(1);
|
|
128
|
+
expect(events[0].callType).toBe('embedding-batch');
|
|
129
|
+
expect(events[0].provider).toBe('lm-studio');
|
|
130
|
+
expect(events[0].model).toBe('m');
|
|
131
|
+
expect(events[0].tokensUsed.input).toBe(7);
|
|
132
|
+
expect(events[0].issuer).toBe(issuer);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('| should estimate tokens when the endpoint provides no usage', async () => {
|
|
136
|
+
fetchSpy.and.returnValue(Promise.resolve(okResponse([[0.1]])));
|
|
137
|
+
const events: DyNTS_AI_CostEvent[] = [];
|
|
138
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({
|
|
139
|
+
baseUrl: baseUrl,
|
|
140
|
+
onCostEvent: (event: DyNTS_AI_CostEvent) => events.push(event),
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
await service.createEmbeddings({ texts: ['abcdefgh'], model: 'm', issuer: issuer });
|
|
144
|
+
|
|
145
|
+
// 8 chars / 4 = 2 estimated tokens.
|
|
146
|
+
expect(events[0].tokensUsed.input).toBe(2);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe('| createEmbedding (single)', () => {
|
|
151
|
+
it('| should emit an embedding-single cost-event and return a single vector', async () => {
|
|
152
|
+
fetchSpy.and.returnValue(Promise.resolve(okResponse([[0.9, 0.8, 0.7]], { prompt_tokens: 3, total_tokens: 3 })));
|
|
153
|
+
const events: DyNTS_AI_CostEvent[] = [];
|
|
154
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({
|
|
155
|
+
baseUrl: baseUrl,
|
|
156
|
+
onCostEvent: (event: DyNTS_AI_CostEvent) => events.push(event),
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const result: number[] | CreateEmbeddingResponse = await service.createEmbedding({
|
|
160
|
+
text: 'one',
|
|
161
|
+
model: 'm',
|
|
162
|
+
issuer: issuer,
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
expect(result).toEqual([0.9, 0.8, 0.7]);
|
|
166
|
+
expect(events[0].callType).toBe('embedding-single');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('| should throw a DyFM_Error if text is empty', async () => {
|
|
170
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({ baseUrl: baseUrl });
|
|
171
|
+
await expectAsync(
|
|
172
|
+
service.createEmbedding({ text: '', model: 'm', issuer: issuer }),
|
|
173
|
+
).toBeRejectedWith(jasmine.any(DyFM_Error));
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
describe('| testConnection', () => {
|
|
178
|
+
it('| should return true when the probe succeeds', async () => {
|
|
179
|
+
fetchSpy.and.returnValue(Promise.resolve(okResponse([[0.1, 0.2]])));
|
|
180
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({ baseUrl: baseUrl });
|
|
181
|
+
expect(await service.testConnection(issuer)).toBe(true);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('| should return false (never throw) when the probe fails', async () => {
|
|
185
|
+
fetchSpy.and.returnValue(Promise.reject(new Error('connection refused')));
|
|
186
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({ baseUrl: baseUrl });
|
|
187
|
+
expect(await service.testConnection(issuer)).toBe(false);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
describe('| getEmbeddingInfo', () => {
|
|
192
|
+
it('| should report the LocalAI provider and the given model', () => {
|
|
193
|
+
const service: DyNTS_LMStudio_Embedding_ControlService = new DyNTS_LMStudio_Embedding_ControlService({ baseUrl: baseUrl });
|
|
194
|
+
expect(service.getEmbeddingInfo('my-model')).toEqual({ provider: DyFM_AI_Provider.LocalAI, model: 'my-model' });
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|