@futdevpro/nts-dynamo 1.15.15 → 1.15.17
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/version-bump.config.json +5 -0
- package/.github/workflows/main.yml +426 -393
- package/.husky/pre-commit +1 -0
- package/.vscode/settings.json +10 -10
- package/HOWTO.md +15 -15
- package/LICENSE +21 -21
- package/__documentations/2026-04-28-logs-module.md +49 -0
- package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
- package/_specifications/BACKLOG.md +50 -50
- package/_specifications/TODO.md +15 -15
- package/_specifications/agent.md +138 -138
- package/eslint.config.js +3 -3
- package/nodemon.json +24 -24
- package/package.json +343 -362
- package/pipeline.cicd.config.json +152 -0
- package/pnpm-workspace.yaml +2 -0
- 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/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 +578 -578
- package/src/_models/control-models/endpoint-params.control-model.ts +526 -526
- 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 +108 -108
- 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-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-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 +28 -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 +240 -240
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.ts +98 -98
- 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 +615 -615
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +437 -437
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +833 -833
- package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
- 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 +332 -332
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +79 -79
- package/src/_modules/ai/_services/ai-provider.service-base.ts +29 -29
- package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
- package/src/_modules/ai/index.ts +13 -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/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 +19 -19
- 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 +345 -345
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +330 -330
- 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 +11 -11
- 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/server/errors/errors.control-service.spec.ts +230 -230
- package/src/_modules/server/errors/errors.control-service.ts +69 -69
- package/src/_modules/server/errors/errors.controller.spec.ts +165 -165
- package/src/_modules/server/errors/errors.controller.ts +270 -270
- package/src/_modules/server/errors/errors.data-service.spec.ts +355 -355
- 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 +516 -516
- package/src/_modules/server/server-status/server-status.control-service.ts +336 -336
- package/src/_modules/server/server-status/server-status.controller.spec.ts +156 -156
- package/src/_modules/server/server-status/server-status.controller.ts +131 -131
- 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 +493 -493
- package/src/_services/base/data.service.ts +2525 -2525
- 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/shared.static-service.spec.ts +99 -99
- package/src/_services/shared.static-service.ts +78 -78
- package/src/index.ts +94 -94
- package/tsconfig.app.json +12 -12
- package/tsconfig.json +42 -42
- package/build/_modules/logs/get-logs-routing-module.util.d.ts +0 -19
- package/build/_modules/logs/get-logs-routing-module.util.d.ts.map +0 -1
- package/build/_modules/logs/get-logs-routing-module.util.js +0 -32
- package/build/_modules/logs/get-logs-routing-module.util.js.map +0 -1
- package/build/_modules/logs/index.d.ts +0 -4
- package/build/_modules/logs/index.d.ts.map +0 -1
- package/build/_modules/logs/index.js +0 -10
- package/build/_modules/logs/index.js.map +0 -1
- package/build/_modules/logs/log-buffer.service.d.ts +0 -38
- package/build/_modules/logs/log-buffer.service.d.ts.map +0 -1
- package/build/_modules/logs/log-buffer.service.js +0 -97
- package/build/_modules/logs/log-buffer.service.js.map +0 -1
- package/build/_modules/logs/logs.controller.d.ts +0 -27
- package/build/_modules/logs/logs.controller.d.ts.map +0 -1
- package/build/_modules/logs/logs.controller.js +0 -90
- package/build/_modules/logs/logs.controller.js.map +0 -1
- package/build/_modules/logs/logs.service.d.ts +0 -40
- package/build/_modules/logs/logs.service.d.ts.map +0 -1
- package/build/_modules/logs/logs.service.js +0 -97
- package/build/_modules/logs/logs.service.js.map +0 -1
- package/src/_modules/logs/get-logs-routing-module.util.ts +0 -36
- package/src/_modules/logs/index.ts +0 -3
- package/src/_modules/logs/log-buffer.service.ts +0 -101
- package/src/_modules/logs/logs.controller.ts +0 -109
- package/src/_modules/logs/logs.service.ts +0 -100
|
@@ -1,332 +1,332 @@
|
|
|
1
|
-
import { DyNTS_AI_Provider_ServiceBase } from './ai-provider.service-base';
|
|
2
|
-
import { DyFM_AI_CallSettings, DyFM_AI_Message, DyFM_AI_LLM_Response, DyFM_AI_MessageRole } from '@futdevpro/fsm-dynamo/ai';
|
|
3
|
-
import { DyFM_Error, DyFM_Error_Settings, DyFM_getLocalStackLocation, DyFM_Log, DyFM_Object } from '@futdevpro/fsm-dynamo';
|
|
4
|
-
import {
|
|
5
|
-
DyFM_AI_GenericSelect_Input,
|
|
6
|
-
DyFM_AI_GenericMultiSelect_Input,
|
|
7
|
-
DyFM_AI_JSONKeysDescription_Input,
|
|
8
|
-
DyFM_AI_JSONExactKeys_Input,
|
|
9
|
-
DyFM_AI_Message_Input,
|
|
10
|
-
} from '../_models/ai-input-interfaces';
|
|
11
|
-
import { Items } from 'openai/resources/conversations/items';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Abstract base class for LLM services
|
|
15
|
-
* Defines all methods that must be implemented by AI providers
|
|
16
|
-
*/
|
|
17
|
-
export abstract class DyNTS_AI_LLM_ServiceBase<
|
|
18
|
-
T_AISettings extends DyFM_AI_CallSettings = DyFM_AI_CallSettings
|
|
19
|
-
> extends DyNTS_AI_Provider_ServiceBase {
|
|
20
|
-
/** Default settings for LLM calls */
|
|
21
|
-
abstract readonly defaultSettings: T_AISettings;
|
|
22
|
-
|
|
23
|
-
/** Default model to use for LLM calls */
|
|
24
|
-
/* abstract readonly defaultModel: string; */
|
|
25
|
-
|
|
26
|
-
/** Provider-specific predefined requests */
|
|
27
|
-
abstract readonly predefinedRequests: any;
|
|
28
|
-
|
|
29
|
-
_debugLog: boolean = false;
|
|
30
|
-
get debugLog(): boolean {
|
|
31
|
-
return this.defaultSettings?.debugLog ?? this._debugLog;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
get defaultSystemPrompt(): string {
|
|
35
|
-
return this.defaultSettings.systemPrompt;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
get defaultModel(): string {
|
|
39
|
-
return this.defaultSettings.useModel;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
defaultLogReplacer: string = '...long-context...';
|
|
43
|
-
|
|
44
|
-
// Core abstract methods
|
|
45
|
-
/**
|
|
46
|
-
* Call LLM with system and user messages
|
|
47
|
-
*/
|
|
48
|
-
/* abstract callLLM(
|
|
49
|
-
systemMessage: string,
|
|
50
|
-
userMessage: string,
|
|
51
|
-
settings?: DyFM_AI_CallSettings,
|
|
52
|
-
issuer?: string
|
|
53
|
-
): Promise<string>; */
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Call LLM with message history
|
|
57
|
-
*/
|
|
58
|
-
/* abstract callLLMWithHistory(
|
|
59
|
-
messages: DyFM_AI_Message[],
|
|
60
|
-
settings?: DyFM_AI_CallSettings,
|
|
61
|
-
issuer?: string
|
|
62
|
-
): Promise<string>; */
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Call LLM and return raw response
|
|
66
|
-
*/
|
|
67
|
-
/* abstract callLLMRaw(
|
|
68
|
-
messages: DyFM_AI_Message[],
|
|
69
|
-
settings?: DyFM_AI_CallSettings,
|
|
70
|
-
issuer?: string
|
|
71
|
-
): Promise<DyFM_AI_LLM_Response>; */
|
|
72
|
-
|
|
73
|
-
// Question methods (from OAI_LLM_ServiceBase)
|
|
74
|
-
abstract requestSimpleMessage(set: DyFM_AI_Message_Input<T_AISettings>): Promise<string>;
|
|
75
|
-
abstract requestYesNo(set: DyFM_AI_Message_Input<T_AISettings>): Promise<boolean>;
|
|
76
|
-
abstract requestPercentage(set: DyFM_AI_Message_Input<T_AISettings>): Promise<number>;
|
|
77
|
-
|
|
78
|
-
/* abstract askSelectQuestion(set: DyFM_AI_ListSelect_Input): Promise<string>; */
|
|
79
|
-
abstract requestSelect<T>(
|
|
80
|
-
set: DyFM_AI_GenericSelect_Input<T, T_AISettings>
|
|
81
|
-
): Promise<T | { unparsableResult: string }>;
|
|
82
|
-
/* abstract askMultipleSelectQuestionWithOptions(set: DyFM_AI_MultiSelect_Input): Promise<string[]>; */
|
|
83
|
-
abstract requestMultiselect<T>(
|
|
84
|
-
set: DyFM_AI_GenericMultiSelect_Input<T, T_AISettings>
|
|
85
|
-
): Promise<T[] | { unparsableResult: string }>;
|
|
86
|
-
|
|
87
|
-
abstract requestJSON<T>(set: DyFM_AI_Message_Input<T_AISettings>): Promise<T | { unparsableResult: string }>;
|
|
88
|
-
abstract requestJSONQuestionWithKeysDescription<T>(
|
|
89
|
-
set: DyFM_AI_JSONKeysDescription_Input<T_AISettings>
|
|
90
|
-
): Promise<T | { unparsableResult: string }>;
|
|
91
|
-
/* abstract askJSONQuestionWithExactKeys(set: DyFM_AI_JSONExactKeys_Input): Promise<object>; */
|
|
92
|
-
abstract requestJSONWithExactKeys<T>(
|
|
93
|
-
set: DyFM_AI_JSONExactKeys_Input<T_AISettings>
|
|
94
|
-
): Promise<T | { unparsableResult: string }>;
|
|
95
|
-
/* abstract sendMessage(set: DyFM_AI_SimpleMessage_Input): Promise<string>; */
|
|
96
|
-
|
|
97
|
-
/* abstract requestStringList(set: DyFM_AI_Base_Input<T_AISettings>): Promise<string[] | { unparsableResult: string }>; */
|
|
98
|
-
abstract requestList<T>(set: DyFM_AI_Message_Input<T_AISettings>): Promise<T[] | { unparsableResult: string }>;
|
|
99
|
-
|
|
100
|
-
// Helper methods
|
|
101
|
-
/* protected abstract getDefaultErrorSettings(
|
|
102
|
-
method: string,
|
|
103
|
-
error: any,
|
|
104
|
-
issuer?: string
|
|
105
|
-
): DyFM_Error_Settings; */
|
|
106
|
-
|
|
107
|
-
/* protected abstract getTextListAsText(list: string[]): string; */
|
|
108
|
-
|
|
109
|
-
/* protected abstract logQuestion(set: DyFM_AI_Base_Input<T_AISettings>): void; */
|
|
110
|
-
|
|
111
|
-
protected convertAnswerToBoolean(answer: string): boolean {
|
|
112
|
-
return answer.toUpperCase().includes(this.predefinedRequests.yesNo.upperCaseYes);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
protected convertAnswerToNumber(answer: string, message: string): number {
|
|
116
|
-
if (this.isAnswerValid(answer, message)) {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (isNaN(+answer)) {
|
|
121
|
-
DyFM_Log.T_error(
|
|
122
|
-
'DyNTS_AI_LLMChat_ServiceBase.convertAnswerToNumber got an invalid answer',
|
|
123
|
-
{
|
|
124
|
-
question: message,
|
|
125
|
-
answer: answer,
|
|
126
|
-
}
|
|
127
|
-
);
|
|
128
|
-
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
return +answer;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
protected convertAnswerToSelectOption<T>(answer: string, message: string, options: T[]): T {
|
|
136
|
-
if (this.isAnswerValid(answer, message)) {
|
|
137
|
-
return null;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
answer = answer.toLocaleUpperCase();
|
|
141
|
-
|
|
142
|
-
const stringifiedOptions: string[] = this.stringifySelectOptions(options);
|
|
143
|
-
for (const stringifiedItem of stringifiedOptions) {
|
|
144
|
-
if (answer.includes(stringifiedItem.toLocaleUpperCase())) {
|
|
145
|
-
const parsedItem: T | { unparsableResult: string } = DyFM_Object.safeParseJSON<T>(stringifiedItem);
|
|
146
|
-
|
|
147
|
-
if ((parsedItem as { unparsableResult: string }).unparsableResult) {
|
|
148
|
-
DyFM_Log.T_error(
|
|
149
|
-
'DyNTS_AI_LLMChat_ServiceBase.convertAnswerToSelectOption got an invalid answer',
|
|
150
|
-
{
|
|
151
|
-
question: message,
|
|
152
|
-
answer: answer,
|
|
153
|
-
}
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
return stringifiedItem as T;
|
|
157
|
-
} else {
|
|
158
|
-
return parsedItem as T;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return null;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
protected convertAnswerToSelectOptions<T>(answer: string, message: string, options: T[]): T[] {
|
|
167
|
-
if (this.isAnswerValid(answer, message)) {
|
|
168
|
-
return null;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const enrichedOptions: { stringifiedOption: string, parsedOption: T }[] = options.map(
|
|
172
|
-
(option: T) => ({
|
|
173
|
-
stringifiedOption: this.stringifySelectOption(option),
|
|
174
|
-
parsedOption: option
|
|
175
|
-
})
|
|
176
|
-
);
|
|
177
|
-
const result: T[] = [];
|
|
178
|
-
|
|
179
|
-
for (const item of enrichedOptions) {
|
|
180
|
-
if (answer.includes(item.stringifiedOption)) {
|
|
181
|
-
result.push(item.parsedOption);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return result;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
protected convertAnswerToJSON<T>(answer: string, message: string): T | { unparsableResult: string } {
|
|
189
|
-
if (this.isAnswerValid(answer, message)) {
|
|
190
|
-
return { unparsableResult: answer };
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const parsedItem: T | { unparsableResult: string } = DyFM_Object.safeParseJSON<T>(answer);
|
|
194
|
-
if ((parsedItem as { unparsableResult: string }).unparsableResult) {
|
|
195
|
-
DyFM_Log.T_error(
|
|
196
|
-
'DyNTS_AI_LLMChat_ServiceBase.convertAnswerToJSON got an invalid answer',
|
|
197
|
-
{
|
|
198
|
-
question: message,
|
|
199
|
-
answer: answer,
|
|
200
|
-
}
|
|
201
|
-
);
|
|
202
|
-
|
|
203
|
-
return { unparsableResult: answer };
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return parsedItem as T;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
protected convertAnswerToList<T>(answer: string, message: string): T[] | { unparsableResult: string } {
|
|
210
|
-
if (this.isAnswerValid(answer, message)) {
|
|
211
|
-
return { unparsableResult: answer };
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// Check if safeParseJSON returns unparsableResult before calling safeParseList
|
|
215
|
-
// because safeParseList doesn't properly handle unparsableResult
|
|
216
|
-
const parsedCheck: T[] | { unparsableResult: string } = DyFM_Object.safeParseJSON<T[]>(answer, true);
|
|
217
|
-
if ((parsedCheck as { unparsableResult: string }).unparsableResult) {
|
|
218
|
-
DyFM_Log.T_error(
|
|
219
|
-
'DyNTS_AI_LLMChat_ServiceBase.convertAnswerToList got an invalid answer',
|
|
220
|
-
{
|
|
221
|
-
question: message,
|
|
222
|
-
answer: answer,
|
|
223
|
-
}
|
|
224
|
-
);
|
|
225
|
-
|
|
226
|
-
return { unparsableResult: answer };
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
return DyFM_Object.safeParseList<T[]>(answer);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
protected stringifySelectOptions<T>(options: T[]): string[] {
|
|
233
|
-
return options.map(item => this.stringifySelectOption(item));
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
protected stringifySelectOption<T>(option: T): string {
|
|
237
|
-
return JSON.stringify(option);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
protected isAnswerValid(answer: string, message: string): boolean {
|
|
241
|
-
if (!answer?.trim?.()?.length) {
|
|
242
|
-
DyFM_Log.T_error(
|
|
243
|
-
'DyNTS_AI_LLMChat_ServiceBase.convertAnswerToSelectOption got an invalid answer',
|
|
244
|
-
{
|
|
245
|
-
question: message,
|
|
246
|
-
answer: answer,
|
|
247
|
-
}
|
|
248
|
-
);
|
|
249
|
-
|
|
250
|
-
return true;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return false;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* olvasható mondatszerű-listaszerű formába teszi a listaelemeket
|
|
258
|
-
* pl.: ['a', 'b', 'c'] -> '"a", "b" or "c"'
|
|
259
|
-
*/
|
|
260
|
-
protected getTextListAsText(list: string[]): string {
|
|
261
|
-
list = list.filter(item => item?.trim()).map(item => `"${item}"`);
|
|
262
|
-
|
|
263
|
-
/* list = list.map(item => item.toLocaleLowerCase()); */
|
|
264
|
-
|
|
265
|
-
list.push(list.pop() + ' or ' + list.pop());
|
|
266
|
-
|
|
267
|
-
return list.join(', ');
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
protected logQuestion(
|
|
271
|
-
set: DyFM_AI_Message_Input<T_AISettings>
|
|
272
|
-
): void {
|
|
273
|
-
if (set.settings?.debugLog ?? this._debugLog) {
|
|
274
|
-
console.log('\n - ', set.message);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
protected getDefaultSystemMessage(settings: T_AISettings): DyFM_AI_Message {
|
|
279
|
-
return {
|
|
280
|
-
role: DyFM_AI_MessageRole.system,
|
|
281
|
-
content: settings?.systemPrompt || this.defaultSystemPrompt,
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
protected validateConversation(conversation: DyFM_AI_Message[]): void {
|
|
286
|
-
conversation.forEach((message: DyFM_AI_Message, index: number) => {
|
|
287
|
-
if (!message.role) {
|
|
288
|
-
throw new DyFM_Error({
|
|
289
|
-
message: `Message has no role at index ${index}`,
|
|
290
|
-
additionalContent: {
|
|
291
|
-
invalidMessage: message,
|
|
292
|
-
conversation: conversation,
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
conversation = conversation.filter(message => message.content);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
protected logAnswer(answer: string): void {
|
|
302
|
-
if (this._debugLog) {
|
|
303
|
-
console.log(' - answer: ', answer);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
//////////////////////////////////////////////////////////////////////////////////////////
|
|
310
|
-
// LLM CHAT METHODS //
|
|
311
|
-
//////////////////////////////////////////////////////////////////////////////////////////
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
protected logConversation(
|
|
315
|
-
set: {
|
|
316
|
-
conversation: DyFM_AI_Message[],
|
|
317
|
-
debugLog?: boolean,
|
|
318
|
-
/** this is used to readably replace too long contents to eg '...' in logs */
|
|
319
|
-
replaceThisInLog?: string,
|
|
320
|
-
}
|
|
321
|
-
) {
|
|
322
|
-
if (set.debugLog || this._debugLog) {
|
|
323
|
-
DyFM_Log.info('Conversation log at', DyFM_getLocalStackLocation());
|
|
324
|
-
|
|
325
|
-
set.conversation.forEach(message => {
|
|
326
|
-
console.log(
|
|
327
|
-
` - ${message.role}: ${message.content.replace(set.replaceThisInLog, this.defaultLogReplacer)}`
|
|
328
|
-
);
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
1
|
+
import { DyNTS_AI_Provider_ServiceBase } from './ai-provider.service-base';
|
|
2
|
+
import { DyFM_AI_CallSettings, DyFM_AI_Message, DyFM_AI_LLM_Response, DyFM_AI_MessageRole } from '@futdevpro/fsm-dynamo/ai';
|
|
3
|
+
import { DyFM_Error, DyFM_Error_Settings, DyFM_getLocalStackLocation, DyFM_Log, DyFM_Object } from '@futdevpro/fsm-dynamo';
|
|
4
|
+
import {
|
|
5
|
+
DyFM_AI_GenericSelect_Input,
|
|
6
|
+
DyFM_AI_GenericMultiSelect_Input,
|
|
7
|
+
DyFM_AI_JSONKeysDescription_Input,
|
|
8
|
+
DyFM_AI_JSONExactKeys_Input,
|
|
9
|
+
DyFM_AI_Message_Input,
|
|
10
|
+
} from '../_models/ai-input-interfaces';
|
|
11
|
+
import { Items } from 'openai/resources/conversations/items';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Abstract base class for LLM services
|
|
15
|
+
* Defines all methods that must be implemented by AI providers
|
|
16
|
+
*/
|
|
17
|
+
export abstract class DyNTS_AI_LLM_ServiceBase<
|
|
18
|
+
T_AISettings extends DyFM_AI_CallSettings = DyFM_AI_CallSettings
|
|
19
|
+
> extends DyNTS_AI_Provider_ServiceBase {
|
|
20
|
+
/** Default settings for LLM calls */
|
|
21
|
+
abstract readonly defaultSettings: T_AISettings;
|
|
22
|
+
|
|
23
|
+
/** Default model to use for LLM calls */
|
|
24
|
+
/* abstract readonly defaultModel: string; */
|
|
25
|
+
|
|
26
|
+
/** Provider-specific predefined requests */
|
|
27
|
+
abstract readonly predefinedRequests: any;
|
|
28
|
+
|
|
29
|
+
_debugLog: boolean = false;
|
|
30
|
+
get debugLog(): boolean {
|
|
31
|
+
return this.defaultSettings?.debugLog ?? this._debugLog;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
get defaultSystemPrompt(): string {
|
|
35
|
+
return this.defaultSettings.systemPrompt;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
get defaultModel(): string {
|
|
39
|
+
return this.defaultSettings.useModel;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
defaultLogReplacer: string = '...long-context...';
|
|
43
|
+
|
|
44
|
+
// Core abstract methods
|
|
45
|
+
/**
|
|
46
|
+
* Call LLM with system and user messages
|
|
47
|
+
*/
|
|
48
|
+
/* abstract callLLM(
|
|
49
|
+
systemMessage: string,
|
|
50
|
+
userMessage: string,
|
|
51
|
+
settings?: DyFM_AI_CallSettings,
|
|
52
|
+
issuer?: string
|
|
53
|
+
): Promise<string>; */
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Call LLM with message history
|
|
57
|
+
*/
|
|
58
|
+
/* abstract callLLMWithHistory(
|
|
59
|
+
messages: DyFM_AI_Message[],
|
|
60
|
+
settings?: DyFM_AI_CallSettings,
|
|
61
|
+
issuer?: string
|
|
62
|
+
): Promise<string>; */
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Call LLM and return raw response
|
|
66
|
+
*/
|
|
67
|
+
/* abstract callLLMRaw(
|
|
68
|
+
messages: DyFM_AI_Message[],
|
|
69
|
+
settings?: DyFM_AI_CallSettings,
|
|
70
|
+
issuer?: string
|
|
71
|
+
): Promise<DyFM_AI_LLM_Response>; */
|
|
72
|
+
|
|
73
|
+
// Question methods (from OAI_LLM_ServiceBase)
|
|
74
|
+
abstract requestSimpleMessage(set: DyFM_AI_Message_Input<T_AISettings>): Promise<string>;
|
|
75
|
+
abstract requestYesNo(set: DyFM_AI_Message_Input<T_AISettings>): Promise<boolean>;
|
|
76
|
+
abstract requestPercentage(set: DyFM_AI_Message_Input<T_AISettings>): Promise<number>;
|
|
77
|
+
|
|
78
|
+
/* abstract askSelectQuestion(set: DyFM_AI_ListSelect_Input): Promise<string>; */
|
|
79
|
+
abstract requestSelect<T>(
|
|
80
|
+
set: DyFM_AI_GenericSelect_Input<T, T_AISettings>
|
|
81
|
+
): Promise<T | { unparsableResult: string }>;
|
|
82
|
+
/* abstract askMultipleSelectQuestionWithOptions(set: DyFM_AI_MultiSelect_Input): Promise<string[]>; */
|
|
83
|
+
abstract requestMultiselect<T>(
|
|
84
|
+
set: DyFM_AI_GenericMultiSelect_Input<T, T_AISettings>
|
|
85
|
+
): Promise<T[] | { unparsableResult: string }>;
|
|
86
|
+
|
|
87
|
+
abstract requestJSON<T>(set: DyFM_AI_Message_Input<T_AISettings>): Promise<T | { unparsableResult: string }>;
|
|
88
|
+
abstract requestJSONQuestionWithKeysDescription<T>(
|
|
89
|
+
set: DyFM_AI_JSONKeysDescription_Input<T_AISettings>
|
|
90
|
+
): Promise<T | { unparsableResult: string }>;
|
|
91
|
+
/* abstract askJSONQuestionWithExactKeys(set: DyFM_AI_JSONExactKeys_Input): Promise<object>; */
|
|
92
|
+
abstract requestJSONWithExactKeys<T>(
|
|
93
|
+
set: DyFM_AI_JSONExactKeys_Input<T_AISettings>
|
|
94
|
+
): Promise<T | { unparsableResult: string }>;
|
|
95
|
+
/* abstract sendMessage(set: DyFM_AI_SimpleMessage_Input): Promise<string>; */
|
|
96
|
+
|
|
97
|
+
/* abstract requestStringList(set: DyFM_AI_Base_Input<T_AISettings>): Promise<string[] | { unparsableResult: string }>; */
|
|
98
|
+
abstract requestList<T>(set: DyFM_AI_Message_Input<T_AISettings>): Promise<T[] | { unparsableResult: string }>;
|
|
99
|
+
|
|
100
|
+
// Helper methods
|
|
101
|
+
/* protected abstract getDefaultErrorSettings(
|
|
102
|
+
method: string,
|
|
103
|
+
error: any,
|
|
104
|
+
issuer?: string
|
|
105
|
+
): DyFM_Error_Settings; */
|
|
106
|
+
|
|
107
|
+
/* protected abstract getTextListAsText(list: string[]): string; */
|
|
108
|
+
|
|
109
|
+
/* protected abstract logQuestion(set: DyFM_AI_Base_Input<T_AISettings>): void; */
|
|
110
|
+
|
|
111
|
+
protected convertAnswerToBoolean(answer: string): boolean {
|
|
112
|
+
return answer.toUpperCase().includes(this.predefinedRequests.yesNo.upperCaseYes);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
protected convertAnswerToNumber(answer: string, message: string): number {
|
|
116
|
+
if (this.isAnswerValid(answer, message)) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (isNaN(+answer)) {
|
|
121
|
+
DyFM_Log.T_error(
|
|
122
|
+
'DyNTS_AI_LLMChat_ServiceBase.convertAnswerToNumber got an invalid answer',
|
|
123
|
+
{
|
|
124
|
+
question: message,
|
|
125
|
+
answer: answer,
|
|
126
|
+
}
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return +answer;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
protected convertAnswerToSelectOption<T>(answer: string, message: string, options: T[]): T {
|
|
136
|
+
if (this.isAnswerValid(answer, message)) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
answer = answer.toLocaleUpperCase();
|
|
141
|
+
|
|
142
|
+
const stringifiedOptions: string[] = this.stringifySelectOptions(options);
|
|
143
|
+
for (const stringifiedItem of stringifiedOptions) {
|
|
144
|
+
if (answer.includes(stringifiedItem.toLocaleUpperCase())) {
|
|
145
|
+
const parsedItem: T | { unparsableResult: string } = DyFM_Object.safeParseJSON<T>(stringifiedItem);
|
|
146
|
+
|
|
147
|
+
if ((parsedItem as { unparsableResult: string }).unparsableResult) {
|
|
148
|
+
DyFM_Log.T_error(
|
|
149
|
+
'DyNTS_AI_LLMChat_ServiceBase.convertAnswerToSelectOption got an invalid answer',
|
|
150
|
+
{
|
|
151
|
+
question: message,
|
|
152
|
+
answer: answer,
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
return stringifiedItem as T;
|
|
157
|
+
} else {
|
|
158
|
+
return parsedItem as T;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
protected convertAnswerToSelectOptions<T>(answer: string, message: string, options: T[]): T[] {
|
|
167
|
+
if (this.isAnswerValid(answer, message)) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const enrichedOptions: { stringifiedOption: string, parsedOption: T }[] = options.map(
|
|
172
|
+
(option: T) => ({
|
|
173
|
+
stringifiedOption: this.stringifySelectOption(option),
|
|
174
|
+
parsedOption: option
|
|
175
|
+
})
|
|
176
|
+
);
|
|
177
|
+
const result: T[] = [];
|
|
178
|
+
|
|
179
|
+
for (const item of enrichedOptions) {
|
|
180
|
+
if (answer.includes(item.stringifiedOption)) {
|
|
181
|
+
result.push(item.parsedOption);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
protected convertAnswerToJSON<T>(answer: string, message: string): T | { unparsableResult: string } {
|
|
189
|
+
if (this.isAnswerValid(answer, message)) {
|
|
190
|
+
return { unparsableResult: answer };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const parsedItem: T | { unparsableResult: string } = DyFM_Object.safeParseJSON<T>(answer);
|
|
194
|
+
if ((parsedItem as { unparsableResult: string }).unparsableResult) {
|
|
195
|
+
DyFM_Log.T_error(
|
|
196
|
+
'DyNTS_AI_LLMChat_ServiceBase.convertAnswerToJSON got an invalid answer',
|
|
197
|
+
{
|
|
198
|
+
question: message,
|
|
199
|
+
answer: answer,
|
|
200
|
+
}
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
return { unparsableResult: answer };
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return parsedItem as T;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
protected convertAnswerToList<T>(answer: string, message: string): T[] | { unparsableResult: string } {
|
|
210
|
+
if (this.isAnswerValid(answer, message)) {
|
|
211
|
+
return { unparsableResult: answer };
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Check if safeParseJSON returns unparsableResult before calling safeParseList
|
|
215
|
+
// because safeParseList doesn't properly handle unparsableResult
|
|
216
|
+
const parsedCheck: T[] | { unparsableResult: string } = DyFM_Object.safeParseJSON<T[]>(answer, true);
|
|
217
|
+
if ((parsedCheck as { unparsableResult: string }).unparsableResult) {
|
|
218
|
+
DyFM_Log.T_error(
|
|
219
|
+
'DyNTS_AI_LLMChat_ServiceBase.convertAnswerToList got an invalid answer',
|
|
220
|
+
{
|
|
221
|
+
question: message,
|
|
222
|
+
answer: answer,
|
|
223
|
+
}
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
return { unparsableResult: answer };
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return DyFM_Object.safeParseList<T[]>(answer);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
protected stringifySelectOptions<T>(options: T[]): string[] {
|
|
233
|
+
return options.map(item => this.stringifySelectOption(item));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
protected stringifySelectOption<T>(option: T): string {
|
|
237
|
+
return JSON.stringify(option);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
protected isAnswerValid(answer: string, message: string): boolean {
|
|
241
|
+
if (!answer?.trim?.()?.length) {
|
|
242
|
+
DyFM_Log.T_error(
|
|
243
|
+
'DyNTS_AI_LLMChat_ServiceBase.convertAnswerToSelectOption got an invalid answer',
|
|
244
|
+
{
|
|
245
|
+
question: message,
|
|
246
|
+
answer: answer,
|
|
247
|
+
}
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* olvasható mondatszerű-listaszerű formába teszi a listaelemeket
|
|
258
|
+
* pl.: ['a', 'b', 'c'] -> '"a", "b" or "c"'
|
|
259
|
+
*/
|
|
260
|
+
protected getTextListAsText(list: string[]): string {
|
|
261
|
+
list = list.filter(item => item?.trim()).map(item => `"${item}"`);
|
|
262
|
+
|
|
263
|
+
/* list = list.map(item => item.toLocaleLowerCase()); */
|
|
264
|
+
|
|
265
|
+
list.push(list.pop() + ' or ' + list.pop());
|
|
266
|
+
|
|
267
|
+
return list.join(', ');
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
protected logQuestion(
|
|
271
|
+
set: DyFM_AI_Message_Input<T_AISettings>
|
|
272
|
+
): void {
|
|
273
|
+
if (set.settings?.debugLog ?? this._debugLog) {
|
|
274
|
+
console.log('\n - ', set.message);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
protected getDefaultSystemMessage(settings: T_AISettings): DyFM_AI_Message {
|
|
279
|
+
return {
|
|
280
|
+
role: DyFM_AI_MessageRole.system,
|
|
281
|
+
content: settings?.systemPrompt || this.defaultSystemPrompt,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
protected validateConversation(conversation: DyFM_AI_Message[]): void {
|
|
286
|
+
conversation.forEach((message: DyFM_AI_Message, index: number) => {
|
|
287
|
+
if (!message.role) {
|
|
288
|
+
throw new DyFM_Error({
|
|
289
|
+
message: `Message has no role at index ${index}`,
|
|
290
|
+
additionalContent: {
|
|
291
|
+
invalidMessage: message,
|
|
292
|
+
conversation: conversation,
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
conversation = conversation.filter(message => message.content);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
protected logAnswer(answer: string): void {
|
|
302
|
+
if (this._debugLog) {
|
|
303
|
+
console.log(' - answer: ', answer);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
//////////////////////////////////////////////////////////////////////////////////////////
|
|
310
|
+
// LLM CHAT METHODS //
|
|
311
|
+
//////////////////////////////////////////////////////////////////////////////////////////
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
protected logConversation(
|
|
315
|
+
set: {
|
|
316
|
+
conversation: DyFM_AI_Message[],
|
|
317
|
+
debugLog?: boolean,
|
|
318
|
+
/** this is used to readably replace too long contents to eg '...' in logs */
|
|
319
|
+
replaceThisInLog?: string,
|
|
320
|
+
}
|
|
321
|
+
) {
|
|
322
|
+
if (set.debugLog || this._debugLog) {
|
|
323
|
+
DyFM_Log.info('Conversation log at', DyFM_getLocalStackLocation());
|
|
324
|
+
|
|
325
|
+
set.conversation.forEach(message => {
|
|
326
|
+
console.log(
|
|
327
|
+
` - ${message.role}: ${message.content.replace(set.replaceThisInLog, this.defaultLogReplacer)}`
|
|
328
|
+
);
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|