@futdevpro/nts-dynamo 1.15.72 → 1.15.74
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/.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/__documentations/plans/BEDROCK-HYPERPLAN.md +95 -0
- package/_specifications/BACKLOG.md +92 -92
- package/_specifications/TODO.md +15 -15
- package/_specifications/agent.md +138 -138
- package/build/_collections/global-settings.const.d.ts.map +1 -1
- package/build/_collections/global-settings.const.js +8 -0
- package/build/_collections/global-settings.const.js.map +1 -1
- package/build/_models/interfaces/global-settings.interface.d.ts +31 -0
- package/build/_models/interfaces/global-settings.interface.d.ts.map +1 -1
- package/build/_services/core/memory-guard.service.d.ts +56 -0
- package/build/_services/core/memory-guard.service.d.ts.map +1 -1
- package/build/_services/core/memory-guard.service.js +178 -6
- package/build/_services/core/memory-guard.service.js.map +1 -1
- package/eslint.config.js +3 -3
- package/nodemon.json +24 -24
- package/package.json +1 -1
- package/pnpm-workspace.yaml +5 -5
- 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 +97 -89
- 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/global-settings.interface.ts +216 -185
- 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 -295
- package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +518 -518
- 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 -68
- 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 -30
- 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 -115
- package/src/_modules/ai/_services/ai-embedding-mock.service.ts +212 -212
- package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -110
- package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +110 -110
- 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 -197
- package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +371 -371
- package/src/_modules/ai/index.ts +23 -23
- 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 -161
- package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +203 -203
- package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -33
- package/src/_modules/data-readers/index.ts +11 -11
- 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 -59
- 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 -198
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +146 -146
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -167
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +106 -106
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +507 -507
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +272 -272
- package/src/_modules/local-vector-search/index.ts +16 -16
- package/src/_modules/logs/index.ts +11 -11
- package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -111
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +142 -142
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +120 -120
- package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +168 -168
- package/src/_modules/mcp/index.ts +13 -13
- 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 -22
- package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +81 -81
- package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +107 -107
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +306 -306
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +295 -295
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +118 -118
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +105 -105
- package/src/_modules/scoped-config/index.ts +17 -17
- package/src/_modules/server/errors/errors.control-service.spec.ts +238 -238
- package/src/_modules/server/errors/errors.control-service.ts +100 -100
- package/src/_modules/server/errors/errors.controller.spec.ts +241 -241
- package/src/_modules/server/errors/errors.controller.ts +489 -489
- package/src/_modules/server/errors/errors.data-service.spec.ts +480 -480
- 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 +292 -292
- package/src/_services/core/global.service.ts +475 -475
- package/src/_services/core/memory-guard.service.spec.ts +245 -165
- package/src/_services/core/memory-guard.service.ts +481 -281
- 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 +1747 -1747
- 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
- package/.dynamo/logs/cicd-pipeline/output.log +0 -2875
- package/.dynamo/logs/cicd-pipeline/status.json +0 -94
|
@@ -1,157 +1,157 @@
|
|
|
1
|
-
import { OpenAI } from 'openai';
|
|
2
|
-
|
|
3
|
-
import { DyFM_AI_Provider, DyFM_AI_Config } from '@futdevpro/fsm-dynamo/ai';
|
|
4
|
-
import { DyFM_AI_UserProviderConfig } from '@futdevpro/fsm-dynamo/ai';
|
|
5
|
-
import { DyFM_OAI_UserProviderConfig } from '@futdevpro/fsm-dynamo/ai/open-ai';
|
|
6
|
-
import { DyFM_Log } from '@futdevpro/fsm-dynamo';
|
|
7
|
-
|
|
8
|
-
import { DyNTS_AI_UserKey_ServiceBase } from '../../../_services/ai-user-key.service-base';
|
|
9
|
-
import { DyNTS_AI_TestGeneration_Result } from '../../../_models/ai-test-generation-result.interface';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* OpenAI-specifikus user API key kezelo service
|
|
13
|
-
*
|
|
14
|
-
* A visszafejtett API kulcsbol OpenAI-specifikus konfigot allit ossze,
|
|
15
|
-
* es teszteli a kapcsolatot az OpenAI API-val.
|
|
16
|
-
*/
|
|
17
|
-
export class DyNTS_OAI_UserKey_ControlService extends DyNTS_AI_UserKey_ServiceBase {
|
|
18
|
-
|
|
19
|
-
static getInstance(): DyNTS_OAI_UserKey_ControlService {
|
|
20
|
-
return DyNTS_OAI_UserKey_ControlService.getSingletonInstance();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
readonly aiProvider: DyFM_AI_Provider = DyFM_AI_Provider.OpenAI;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* OpenAI config osszeallitasa a visszafejtett kulcsbol
|
|
27
|
-
*/
|
|
28
|
-
resolveConfig(
|
|
29
|
-
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
30
|
-
decryptedApiKey: string
|
|
31
|
-
): DyFM_AI_Config {
|
|
32
|
-
const oaiConfig: DyFM_OAI_UserProviderConfig =
|
|
33
|
-
userProviderConfig as DyFM_OAI_UserProviderConfig;
|
|
34
|
-
|
|
35
|
-
return {
|
|
36
|
-
apiKey: decryptedApiKey,
|
|
37
|
-
organization: oaiConfig.organization,
|
|
38
|
-
project: oaiConfig.project,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* OpenAI kapcsolat tesztelese a models.list() hivassal
|
|
44
|
-
*/
|
|
45
|
-
async testConnection(
|
|
46
|
-
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
47
|
-
decryptedApiKey: string
|
|
48
|
-
): Promise<boolean> {
|
|
49
|
-
try {
|
|
50
|
-
const config: DyFM_AI_Config = this.resolveConfig(userProviderConfig, decryptedApiKey);
|
|
51
|
-
const openai: OpenAI = new OpenAI({
|
|
52
|
-
apiKey: config.apiKey,
|
|
53
|
-
organization: config.organization,
|
|
54
|
-
project: config.project,
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
await openai.models.list();
|
|
58
|
-
|
|
59
|
-
return true;
|
|
60
|
-
} catch (error) {
|
|
61
|
-
DyFM_Log.error(
|
|
62
|
-
'DyNTS_OAI_UserKey_ControlService',
|
|
63
|
-
'testConnection',
|
|
64
|
-
'OpenAI connection test failed',
|
|
65
|
-
{ error: error }
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Elerheto OpenAI modellek lekerdezese
|
|
74
|
-
* Szuri a chat/LLM modelleket (nem embedding, nem whisper stb.)
|
|
75
|
-
*/
|
|
76
|
-
async listAvailableModels(
|
|
77
|
-
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
78
|
-
decryptedApiKey: string
|
|
79
|
-
): Promise<string[]> {
|
|
80
|
-
const config: DyFM_AI_Config = this.resolveConfig(userProviderConfig, decryptedApiKey);
|
|
81
|
-
const openai: OpenAI = new OpenAI({
|
|
82
|
-
apiKey: config.apiKey,
|
|
83
|
-
organization: config.organization,
|
|
84
|
-
project: config.project,
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
const models = await openai.models.list();
|
|
88
|
-
|
|
89
|
-
return models.data
|
|
90
|
-
.map((m) => m.id)
|
|
91
|
-
.filter((id: string) => this.isLLMModel(id))
|
|
92
|
-
.sort();
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Teszt generalas az OpenAI API-val
|
|
97
|
-
*/
|
|
98
|
-
async testGeneration(set: {
|
|
99
|
-
userProviderConfig: DyFM_AI_UserProviderConfig;
|
|
100
|
-
decryptedApiKey: string;
|
|
101
|
-
model: string;
|
|
102
|
-
}): Promise<DyNTS_AI_TestGeneration_Result> {
|
|
103
|
-
const startTime: number = Date.now();
|
|
104
|
-
|
|
105
|
-
try {
|
|
106
|
-
const config: DyFM_AI_Config = this.resolveConfig(
|
|
107
|
-
set.userProviderConfig,
|
|
108
|
-
set.decryptedApiKey
|
|
109
|
-
);
|
|
110
|
-
const openai: OpenAI = new OpenAI({
|
|
111
|
-
apiKey: config.apiKey,
|
|
112
|
-
organization: config.organization,
|
|
113
|
-
project: config.project,
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
const response = await openai.chat.completions.create({
|
|
117
|
-
model: set.model,
|
|
118
|
-
messages: [{ role: 'user', content: 'Hello, this is a test. Reply with "OK".' }],
|
|
119
|
-
max_tokens: 10,
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
return {
|
|
123
|
-
success: true,
|
|
124
|
-
response: response.choices[0]?.message?.content,
|
|
125
|
-
model: set.model,
|
|
126
|
-
latencyMs: Date.now() - startTime,
|
|
127
|
-
};
|
|
128
|
-
} catch (error) {
|
|
129
|
-
DyFM_Log.error(
|
|
130
|
-
'DyNTS_OAI_UserKey_ControlService',
|
|
131
|
-
'testGeneration',
|
|
132
|
-
'OpenAI test generation failed',
|
|
133
|
-
{ error: error }
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
return {
|
|
137
|
-
success: false,
|
|
138
|
-
model: set.model,
|
|
139
|
-
latencyMs: Date.now() - startTime,
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* LLM/Chat modell szures -- kiszuri az embedding, whisper, tts stb. modelleket
|
|
146
|
-
*/
|
|
147
|
-
private isLLMModel(modelId: string): boolean {
|
|
148
|
-
const excludePatterns: string[] = [
|
|
149
|
-
'embedding', 'whisper', 'tts', 'dall-e',
|
|
150
|
-
'moderation', 'davinci', 'babbage', 'ada',
|
|
151
|
-
];
|
|
152
|
-
|
|
153
|
-
return !excludePatterns.some(
|
|
154
|
-
(pattern: string) => modelId.includes(pattern)
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
1
|
+
import { OpenAI } from 'openai';
|
|
2
|
+
|
|
3
|
+
import { DyFM_AI_Provider, DyFM_AI_Config } from '@futdevpro/fsm-dynamo/ai';
|
|
4
|
+
import { DyFM_AI_UserProviderConfig } from '@futdevpro/fsm-dynamo/ai';
|
|
5
|
+
import { DyFM_OAI_UserProviderConfig } from '@futdevpro/fsm-dynamo/ai/open-ai';
|
|
6
|
+
import { DyFM_Log } from '@futdevpro/fsm-dynamo';
|
|
7
|
+
|
|
8
|
+
import { DyNTS_AI_UserKey_ServiceBase } from '../../../_services/ai-user-key.service-base';
|
|
9
|
+
import { DyNTS_AI_TestGeneration_Result } from '../../../_models/ai-test-generation-result.interface';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* OpenAI-specifikus user API key kezelo service
|
|
13
|
+
*
|
|
14
|
+
* A visszafejtett API kulcsbol OpenAI-specifikus konfigot allit ossze,
|
|
15
|
+
* es teszteli a kapcsolatot az OpenAI API-val.
|
|
16
|
+
*/
|
|
17
|
+
export class DyNTS_OAI_UserKey_ControlService extends DyNTS_AI_UserKey_ServiceBase {
|
|
18
|
+
|
|
19
|
+
static getInstance(): DyNTS_OAI_UserKey_ControlService {
|
|
20
|
+
return DyNTS_OAI_UserKey_ControlService.getSingletonInstance();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
readonly aiProvider: DyFM_AI_Provider = DyFM_AI_Provider.OpenAI;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* OpenAI config osszeallitasa a visszafejtett kulcsbol
|
|
27
|
+
*/
|
|
28
|
+
resolveConfig(
|
|
29
|
+
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
30
|
+
decryptedApiKey: string
|
|
31
|
+
): DyFM_AI_Config {
|
|
32
|
+
const oaiConfig: DyFM_OAI_UserProviderConfig =
|
|
33
|
+
userProviderConfig as DyFM_OAI_UserProviderConfig;
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
apiKey: decryptedApiKey,
|
|
37
|
+
organization: oaiConfig.organization,
|
|
38
|
+
project: oaiConfig.project,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* OpenAI kapcsolat tesztelese a models.list() hivassal
|
|
44
|
+
*/
|
|
45
|
+
async testConnection(
|
|
46
|
+
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
47
|
+
decryptedApiKey: string
|
|
48
|
+
): Promise<boolean> {
|
|
49
|
+
try {
|
|
50
|
+
const config: DyFM_AI_Config = this.resolveConfig(userProviderConfig, decryptedApiKey);
|
|
51
|
+
const openai: OpenAI = new OpenAI({
|
|
52
|
+
apiKey: config.apiKey,
|
|
53
|
+
organization: config.organization,
|
|
54
|
+
project: config.project,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
await openai.models.list();
|
|
58
|
+
|
|
59
|
+
return true;
|
|
60
|
+
} catch (error) {
|
|
61
|
+
DyFM_Log.error(
|
|
62
|
+
'DyNTS_OAI_UserKey_ControlService',
|
|
63
|
+
'testConnection',
|
|
64
|
+
'OpenAI connection test failed',
|
|
65
|
+
{ error: error }
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Elerheto OpenAI modellek lekerdezese
|
|
74
|
+
* Szuri a chat/LLM modelleket (nem embedding, nem whisper stb.)
|
|
75
|
+
*/
|
|
76
|
+
async listAvailableModels(
|
|
77
|
+
userProviderConfig: DyFM_AI_UserProviderConfig,
|
|
78
|
+
decryptedApiKey: string
|
|
79
|
+
): Promise<string[]> {
|
|
80
|
+
const config: DyFM_AI_Config = this.resolveConfig(userProviderConfig, decryptedApiKey);
|
|
81
|
+
const openai: OpenAI = new OpenAI({
|
|
82
|
+
apiKey: config.apiKey,
|
|
83
|
+
organization: config.organization,
|
|
84
|
+
project: config.project,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const models = await openai.models.list();
|
|
88
|
+
|
|
89
|
+
return models.data
|
|
90
|
+
.map((m) => m.id)
|
|
91
|
+
.filter((id: string) => this.isLLMModel(id))
|
|
92
|
+
.sort();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Teszt generalas az OpenAI API-val
|
|
97
|
+
*/
|
|
98
|
+
async testGeneration(set: {
|
|
99
|
+
userProviderConfig: DyFM_AI_UserProviderConfig;
|
|
100
|
+
decryptedApiKey: string;
|
|
101
|
+
model: string;
|
|
102
|
+
}): Promise<DyNTS_AI_TestGeneration_Result> {
|
|
103
|
+
const startTime: number = Date.now();
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
const config: DyFM_AI_Config = this.resolveConfig(
|
|
107
|
+
set.userProviderConfig,
|
|
108
|
+
set.decryptedApiKey
|
|
109
|
+
);
|
|
110
|
+
const openai: OpenAI = new OpenAI({
|
|
111
|
+
apiKey: config.apiKey,
|
|
112
|
+
organization: config.organization,
|
|
113
|
+
project: config.project,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const response = await openai.chat.completions.create({
|
|
117
|
+
model: set.model,
|
|
118
|
+
messages: [{ role: 'user', content: 'Hello, this is a test. Reply with "OK".' }],
|
|
119
|
+
max_tokens: 10,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
success: true,
|
|
124
|
+
response: response.choices[0]?.message?.content,
|
|
125
|
+
model: set.model,
|
|
126
|
+
latencyMs: Date.now() - startTime,
|
|
127
|
+
};
|
|
128
|
+
} catch (error) {
|
|
129
|
+
DyFM_Log.error(
|
|
130
|
+
'DyNTS_OAI_UserKey_ControlService',
|
|
131
|
+
'testGeneration',
|
|
132
|
+
'OpenAI test generation failed',
|
|
133
|
+
{ error: error }
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
success: false,
|
|
138
|
+
model: set.model,
|
|
139
|
+
latencyMs: Date.now() - startTime,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* LLM/Chat modell szures -- kiszuri az embedding, whisper, tts stb. modelleket
|
|
146
|
+
*/
|
|
147
|
+
private isLLMModel(modelId: string): boolean {
|
|
148
|
+
const excludePatterns: string[] = [
|
|
149
|
+
'embedding', 'whisper', 'tts', 'dall-e',
|
|
150
|
+
'moderation', 'davinci', 'babbage', 'ada',
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
return !excludePatterns.some(
|
|
154
|
+
(pattern: string) => modelId.includes(pattern)
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
import { CreateEmbeddingResponse } from 'openai/resources';
|
|
2
|
-
import { DyFM_AI_Provider } from '@futdevpro/fsm-dynamo/ai';
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
DyNTS_AI_Embedding_MockService,
|
|
6
|
-
DyNTS_AI_MOCK_EMBEDDING_DIMS,
|
|
7
|
-
} from './ai-embedding-mock.service';
|
|
8
|
-
import { DyNTS_AI_CostEvent } from '../_models/interfaces/dynts-ai-cost-event.interface';
|
|
9
|
-
|
|
10
|
-
describe('| DyNTS_AI_Embedding_MockService', () => {
|
|
11
|
-
|
|
12
|
-
const issuer: string = 'test-issuer';
|
|
13
|
-
|
|
14
|
-
describe('| determinism', () => {
|
|
15
|
-
it('| should return the same vector for the same (model, text)', async () => {
|
|
16
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
17
|
-
const first: number[][] = (await service.createEmbeddings({ texts: ['hello'], model: 'm', issuer: issuer })) as number[][];
|
|
18
|
-
const second: number[][] = (await service.createEmbeddings({ texts: ['hello'], model: 'm', issuer: issuer })) as number[][];
|
|
19
|
-
expect(first[0]).toEqual(second[0]);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('| should return different vectors for different texts', async () => {
|
|
23
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
24
|
-
const result: number[][] = (await service.createEmbeddings({ texts: ['hello', 'world'], model: 'm', issuer: issuer })) as number[][];
|
|
25
|
-
expect(result[0]).not.toEqual(result[1]);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('| should return different vectors for different models (re-embed scenario)', async () => {
|
|
29
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
30
|
-
const a: number[][] = (await service.createEmbeddings({ texts: ['hello'], model: 'model-a', issuer: issuer })) as number[][];
|
|
31
|
-
const b: number[][] = (await service.createEmbeddings({ texts: ['hello'], model: 'model-b', issuer: issuer })) as number[][];
|
|
32
|
-
expect(a[0]).not.toEqual(b[0]);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
describe('| dimensions', () => {
|
|
37
|
-
it('| should default to DyNTS_AI_MOCK_EMBEDDING_DIMS', async () => {
|
|
38
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
39
|
-
const result: number[][] = (await service.createEmbeddings({ texts: ['x'], model: 'm', issuer: issuer })) as number[][];
|
|
40
|
-
expect(result[0].length).toBe(DyNTS_AI_MOCK_EMBEDDING_DIMS);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('| should honour a configured dims', async () => {
|
|
44
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService({ dims: 16 });
|
|
45
|
-
const result: number[][] = (await service.createEmbeddings({ texts: ['x'], model: 'm', issuer: issuer })) as number[][];
|
|
46
|
-
expect(result[0].length).toBe(16);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('| should produce an l2-normalized vector (unit length)', async () => {
|
|
50
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService({ dims: 32 });
|
|
51
|
-
const result: number[][] = (await service.createEmbeddings({ texts: ['vector'], model: 'm', issuer: issuer })) as number[][];
|
|
52
|
-
const norm: number = Math.sqrt(result[0].reduce((sum: number, v: number) => sum + v * v, 0));
|
|
53
|
-
expect(norm).toBeCloseTo(1, 6);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
describe('| createEmbedding (single)', () => {
|
|
58
|
-
it('| should match the batch vector for the same text', async () => {
|
|
59
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
60
|
-
const single: number[] = (await service.createEmbedding({ text: 'hi', model: 'm', issuer: issuer })) as number[];
|
|
61
|
-
const batch: number[][] = (await service.createEmbeddings({ texts: ['hi'], model: 'm', issuer: issuer })) as number[][];
|
|
62
|
-
expect(single).toEqual(batch[0]);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('| should return a full OpenAI-shaped response when fullResponse is true', async () => {
|
|
66
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService({ dims: 8 });
|
|
67
|
-
const response: CreateEmbeddingResponse = (await service.createEmbedding({
|
|
68
|
-
text: 'hi',
|
|
69
|
-
model: 'm',
|
|
70
|
-
fullResponse: true,
|
|
71
|
-
issuer: issuer,
|
|
72
|
-
})) as CreateEmbeddingResponse;
|
|
73
|
-
expect(response.object).toBe('list');
|
|
74
|
-
expect(response.data[0].embedding.length).toBe(8);
|
|
75
|
-
expect(response.usage.total_tokens).toBeGreaterThan(0);
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe('| cost-event', () => {
|
|
80
|
-
it('| should emit an embedding-batch cost-event with provider mock', async () => {
|
|
81
|
-
const events: DyNTS_AI_CostEvent[] = [];
|
|
82
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService({
|
|
83
|
-
onCostEvent: (event: DyNTS_AI_CostEvent) => events.push(event),
|
|
84
|
-
});
|
|
85
|
-
await service.createEmbeddings({ texts: ['abcd', 'efgh'], model: 'm', issuer: issuer });
|
|
86
|
-
expect(events.length).toBe(1);
|
|
87
|
-
expect(events[0].callType).toBe('embedding-batch');
|
|
88
|
-
expect(events[0].provider).toBe('mock');
|
|
89
|
-
expect(events[0].estimatedCostUsd).toBe(0);
|
|
90
|
-
expect(events[0].tokensUsed.input).toBeGreaterThan(0);
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it('| should emit an embedding-single cost-event', async () => {
|
|
94
|
-
const events: DyNTS_AI_CostEvent[] = [];
|
|
95
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService({
|
|
96
|
-
onCostEvent: (event: DyNTS_AI_CostEvent) => events.push(event),
|
|
97
|
-
});
|
|
98
|
-
await service.createEmbedding({ text: 'hi', model: 'm', issuer: issuer });
|
|
99
|
-
expect(events[0].callType).toBe('embedding-single');
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
describe('| provider info + availability', () => {
|
|
104
|
-
it('| should report the LocalAI provider', () => {
|
|
105
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
106
|
-
expect(service.aiProvider).toBe(DyFM_AI_Provider.LocalAI);
|
|
107
|
-
expect(service.getEmbeddingInfo('m')).toEqual({ provider: DyFM_AI_Provider.LocalAI, model: 'm' });
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('| should always be available', async () => {
|
|
111
|
-
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
112
|
-
expect(await service.testConnection(issuer)).toBe(true);
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
});
|
|
1
|
+
import { CreateEmbeddingResponse } from 'openai/resources';
|
|
2
|
+
import { DyFM_AI_Provider } from '@futdevpro/fsm-dynamo/ai';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
DyNTS_AI_Embedding_MockService,
|
|
6
|
+
DyNTS_AI_MOCK_EMBEDDING_DIMS,
|
|
7
|
+
} from './ai-embedding-mock.service';
|
|
8
|
+
import { DyNTS_AI_CostEvent } from '../_models/interfaces/dynts-ai-cost-event.interface';
|
|
9
|
+
|
|
10
|
+
describe('| DyNTS_AI_Embedding_MockService', () => {
|
|
11
|
+
|
|
12
|
+
const issuer: string = 'test-issuer';
|
|
13
|
+
|
|
14
|
+
describe('| determinism', () => {
|
|
15
|
+
it('| should return the same vector for the same (model, text)', async () => {
|
|
16
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
17
|
+
const first: number[][] = (await service.createEmbeddings({ texts: ['hello'], model: 'm', issuer: issuer })) as number[][];
|
|
18
|
+
const second: number[][] = (await service.createEmbeddings({ texts: ['hello'], model: 'm', issuer: issuer })) as number[][];
|
|
19
|
+
expect(first[0]).toEqual(second[0]);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('| should return different vectors for different texts', async () => {
|
|
23
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
24
|
+
const result: number[][] = (await service.createEmbeddings({ texts: ['hello', 'world'], model: 'm', issuer: issuer })) as number[][];
|
|
25
|
+
expect(result[0]).not.toEqual(result[1]);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('| should return different vectors for different models (re-embed scenario)', async () => {
|
|
29
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
30
|
+
const a: number[][] = (await service.createEmbeddings({ texts: ['hello'], model: 'model-a', issuer: issuer })) as number[][];
|
|
31
|
+
const b: number[][] = (await service.createEmbeddings({ texts: ['hello'], model: 'model-b', issuer: issuer })) as number[][];
|
|
32
|
+
expect(a[0]).not.toEqual(b[0]);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('| dimensions', () => {
|
|
37
|
+
it('| should default to DyNTS_AI_MOCK_EMBEDDING_DIMS', async () => {
|
|
38
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
39
|
+
const result: number[][] = (await service.createEmbeddings({ texts: ['x'], model: 'm', issuer: issuer })) as number[][];
|
|
40
|
+
expect(result[0].length).toBe(DyNTS_AI_MOCK_EMBEDDING_DIMS);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('| should honour a configured dims', async () => {
|
|
44
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService({ dims: 16 });
|
|
45
|
+
const result: number[][] = (await service.createEmbeddings({ texts: ['x'], model: 'm', issuer: issuer })) as number[][];
|
|
46
|
+
expect(result[0].length).toBe(16);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('| should produce an l2-normalized vector (unit length)', async () => {
|
|
50
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService({ dims: 32 });
|
|
51
|
+
const result: number[][] = (await service.createEmbeddings({ texts: ['vector'], model: 'm', issuer: issuer })) as number[][];
|
|
52
|
+
const norm: number = Math.sqrt(result[0].reduce((sum: number, v: number) => sum + v * v, 0));
|
|
53
|
+
expect(norm).toBeCloseTo(1, 6);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe('| createEmbedding (single)', () => {
|
|
58
|
+
it('| should match the batch vector for the same text', async () => {
|
|
59
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
60
|
+
const single: number[] = (await service.createEmbedding({ text: 'hi', model: 'm', issuer: issuer })) as number[];
|
|
61
|
+
const batch: number[][] = (await service.createEmbeddings({ texts: ['hi'], model: 'm', issuer: issuer })) as number[][];
|
|
62
|
+
expect(single).toEqual(batch[0]);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('| should return a full OpenAI-shaped response when fullResponse is true', async () => {
|
|
66
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService({ dims: 8 });
|
|
67
|
+
const response: CreateEmbeddingResponse = (await service.createEmbedding({
|
|
68
|
+
text: 'hi',
|
|
69
|
+
model: 'm',
|
|
70
|
+
fullResponse: true,
|
|
71
|
+
issuer: issuer,
|
|
72
|
+
})) as CreateEmbeddingResponse;
|
|
73
|
+
expect(response.object).toBe('list');
|
|
74
|
+
expect(response.data[0].embedding.length).toBe(8);
|
|
75
|
+
expect(response.usage.total_tokens).toBeGreaterThan(0);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
describe('| cost-event', () => {
|
|
80
|
+
it('| should emit an embedding-batch cost-event with provider mock', async () => {
|
|
81
|
+
const events: DyNTS_AI_CostEvent[] = [];
|
|
82
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService({
|
|
83
|
+
onCostEvent: (event: DyNTS_AI_CostEvent) => events.push(event),
|
|
84
|
+
});
|
|
85
|
+
await service.createEmbeddings({ texts: ['abcd', 'efgh'], model: 'm', issuer: issuer });
|
|
86
|
+
expect(events.length).toBe(1);
|
|
87
|
+
expect(events[0].callType).toBe('embedding-batch');
|
|
88
|
+
expect(events[0].provider).toBe('mock');
|
|
89
|
+
expect(events[0].estimatedCostUsd).toBe(0);
|
|
90
|
+
expect(events[0].tokensUsed.input).toBeGreaterThan(0);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('| should emit an embedding-single cost-event', async () => {
|
|
94
|
+
const events: DyNTS_AI_CostEvent[] = [];
|
|
95
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService({
|
|
96
|
+
onCostEvent: (event: DyNTS_AI_CostEvent) => events.push(event),
|
|
97
|
+
});
|
|
98
|
+
await service.createEmbedding({ text: 'hi', model: 'm', issuer: issuer });
|
|
99
|
+
expect(events[0].callType).toBe('embedding-single');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
describe('| provider info + availability', () => {
|
|
104
|
+
it('| should report the LocalAI provider', () => {
|
|
105
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
106
|
+
expect(service.aiProvider).toBe(DyFM_AI_Provider.LocalAI);
|
|
107
|
+
expect(service.getEmbeddingInfo('m')).toEqual({ provider: DyFM_AI_Provider.LocalAI, model: 'm' });
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('| should always be available', async () => {
|
|
111
|
+
const service: DyNTS_AI_Embedding_MockService = new DyNTS_AI_Embedding_MockService();
|
|
112
|
+
expect(await service.testConnection(issuer)).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|