@saltsquareio/nestjs-backend-platform 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -0
  3. package/dist/cli/migrate.d.ts +2 -0
  4. package/dist/cli/migrate.js +34 -0
  5. package/dist/cli/migrate.js.map +1 -0
  6. package/dist/core/ai/ai.module.d.ts +5 -0
  7. package/dist/core/ai/ai.module.js +53 -0
  8. package/dist/core/ai/ai.module.js.map +1 -0
  9. package/dist/core/ai/ai.options.d.ts +33 -0
  10. package/dist/core/ai/ai.options.js +14 -0
  11. package/dist/core/ai/ai.options.js.map +1 -0
  12. package/dist/core/ai/ai.service.d.ts +49 -0
  13. package/dist/core/ai/ai.service.js +381 -0
  14. package/dist/core/ai/ai.service.js.map +1 -0
  15. package/dist/core/ai/ai.types.d.ts +133 -0
  16. package/dist/core/ai/ai.types.js +3 -0
  17. package/dist/core/ai/ai.types.js.map +1 -0
  18. package/dist/core/ai/context/context-formatter.service.d.ts +9 -0
  19. package/dist/core/ai/context/context-formatter.service.js +66 -0
  20. package/dist/core/ai/context/context-formatter.service.js.map +1 -0
  21. package/dist/core/ai/cost/cost-tracking.service.d.ts +12 -0
  22. package/dist/core/ai/cost/cost-tracking.service.js +65 -0
  23. package/dist/core/ai/cost/cost-tracking.service.js.map +1 -0
  24. package/dist/core/ai/entities/ai-invocation-log.entity.d.ts +19 -0
  25. package/dist/core/ai/entities/ai-invocation-log.entity.js +116 -0
  26. package/dist/core/ai/entities/ai-invocation-log.entity.js.map +1 -0
  27. package/dist/core/ai/entities/prompt-template.entity.d.ts +13 -0
  28. package/dist/core/ai/entities/prompt-template.entity.js +75 -0
  29. package/dist/core/ai/entities/prompt-template.entity.js.map +1 -0
  30. package/dist/core/ai/index.d.ts +18 -0
  31. package/dist/core/ai/index.js +36 -0
  32. package/dist/core/ai/index.js.map +1 -0
  33. package/dist/core/ai/llm/dummy-llm-model.d.ts +9 -0
  34. package/dist/core/ai/llm/dummy-llm-model.js +18 -0
  35. package/dist/core/ai/llm/dummy-llm-model.js.map +1 -0
  36. package/dist/core/ai/llm/index.d.ts +2 -0
  37. package/dist/core/ai/llm/index.js +19 -0
  38. package/dist/core/ai/llm/index.js.map +1 -0
  39. package/dist/core/ai/llm/openai-llm-model.d.ts +10 -0
  40. package/dist/core/ai/llm/openai-llm-model.js +46 -0
  41. package/dist/core/ai/llm/openai-llm-model.js.map +1 -0
  42. package/dist/core/ai/llm-model.d.ts +17 -0
  43. package/dist/core/ai/llm-model.js +3 -0
  44. package/dist/core/ai/llm-model.js.map +1 -0
  45. package/dist/core/ai/memory/memory.service.d.ts +18 -0
  46. package/dist/core/ai/memory/memory.service.js +157 -0
  47. package/dist/core/ai/memory/memory.service.js.map +1 -0
  48. package/dist/core/ai/memory/memory.types.d.ts +6 -0
  49. package/dist/core/ai/memory/memory.types.js +3 -0
  50. package/dist/core/ai/memory/memory.types.js.map +1 -0
  51. package/dist/core/ai/memory/memory.utils.d.ts +1 -0
  52. package/dist/core/ai/memory/memory.utils.js +17 -0
  53. package/dist/core/ai/memory/memory.utils.js.map +1 -0
  54. package/dist/core/ai/model-registry.service.d.ts +19 -0
  55. package/dist/core/ai/model-registry.service.js +60 -0
  56. package/dist/core/ai/model-registry.service.js.map +1 -0
  57. package/dist/core/ai/model-resolver.service.d.ts +6 -0
  58. package/dist/core/ai/model-resolver.service.js +28 -0
  59. package/dist/core/ai/model-resolver.service.js.map +1 -0
  60. package/dist/core/ai/prompt-builder.service.d.ts +16 -0
  61. package/dist/core/ai/prompt-builder.service.js +34 -0
  62. package/dist/core/ai/prompt-builder.service.js.map +1 -0
  63. package/dist/core/ai/provider/provider-factory.service.d.ts +18 -0
  64. package/dist/core/ai/provider/provider-factory.service.js +60 -0
  65. package/dist/core/ai/provider/provider-factory.service.js.map +1 -0
  66. package/dist/core/ai/safety/safety-guardrail.service.d.ts +9 -0
  67. package/dist/core/ai/safety/safety-guardrail.service.js +65 -0
  68. package/dist/core/ai/safety/safety-guardrail.service.js.map +1 -0
  69. package/dist/core/ai/summarization/summarization.service.d.ts +24 -0
  70. package/dist/core/ai/summarization/summarization.service.js +66 -0
  71. package/dist/core/ai/summarization/summarization.service.js.map +1 -0
  72. package/dist/core/ai/template/template.service.d.ts +14 -0
  73. package/dist/core/ai/template/template.service.js +88 -0
  74. package/dist/core/ai/template/template.service.js.map +1 -0
  75. package/dist/core/audit-log/audit-log.entity.d.ts +13 -0
  76. package/dist/core/audit-log/audit-log.entity.js +72 -0
  77. package/dist/core/audit-log/audit-log.entity.js.map +1 -0
  78. package/dist/core/audit-log/audit-log.module.d.ts +2 -0
  79. package/dist/core/audit-log/audit-log.module.js +25 -0
  80. package/dist/core/audit-log/audit-log.module.js.map +1 -0
  81. package/dist/core/audit-log/audit-log.service.d.ts +20 -0
  82. package/dist/core/audit-log/audit-log.service.js +59 -0
  83. package/dist/core/audit-log/audit-log.service.js.map +1 -0
  84. package/dist/core/audit-log/index.d.ts +6 -0
  85. package/dist/core/audit-log/index.js +11 -0
  86. package/dist/core/audit-log/index.js.map +1 -0
  87. package/dist/core/auth/auth.provider.d.ts +4 -0
  88. package/dist/core/auth/auth.provider.js +3 -0
  89. package/dist/core/auth/auth.provider.js.map +1 -0
  90. package/dist/core/auth/decorators.d.ts +4 -0
  91. package/dist/core/auth/decorators.js +11 -0
  92. package/dist/core/auth/decorators.js.map +1 -0
  93. package/dist/core/auth/index.d.ts +6 -0
  94. package/dist/core/auth/index.js +23 -0
  95. package/dist/core/auth/index.js.map +1 -0
  96. package/dist/core/auth/params.d.ts +2 -0
  97. package/dist/core/auth/params.js +23 -0
  98. package/dist/core/auth/params.js.map +1 -0
  99. package/dist/core/auth/role.can-activate.d.ts +10 -0
  100. package/dist/core/auth/role.can-activate.js +42 -0
  101. package/dist/core/auth/role.can-activate.js.map +1 -0
  102. package/dist/core/auth/types.d.ts +6 -0
  103. package/dist/core/auth/types.js +3 -0
  104. package/dist/core/auth/types.js.map +1 -0
  105. package/dist/core/auth/utils.d.ts +4 -0
  106. package/dist/core/auth/utils.js +22 -0
  107. package/dist/core/auth/utils.js.map +1 -0
  108. package/dist/core/configuration/coerce.d.ts +2 -0
  109. package/dist/core/configuration/coerce.js +8 -0
  110. package/dist/core/configuration/coerce.js.map +1 -0
  111. package/dist/core/configuration/configuration.module.d.ts +9 -0
  112. package/dist/core/configuration/configuration.module.js +38 -0
  113. package/dist/core/configuration/configuration.module.js.map +1 -0
  114. package/dist/core/configuration/define-config.d.ts +2 -0
  115. package/dist/core/configuration/define-config.js +20 -0
  116. package/dist/core/configuration/define-config.js.map +1 -0
  117. package/dist/core/configuration/env-files.d.ts +1 -0
  118. package/dist/core/configuration/env-files.js +7 -0
  119. package/dist/core/configuration/env-files.js.map +1 -0
  120. package/dist/core/configuration/index.d.ts +5 -0
  121. package/dist/core/configuration/index.js +22 -0
  122. package/dist/core/configuration/index.js.map +1 -0
  123. package/dist/core/configuration/schemas/app.schema.d.ts +16 -0
  124. package/dist/core/configuration/schemas/app.schema.js +23 -0
  125. package/dist/core/configuration/schemas/app.schema.js.map +1 -0
  126. package/dist/core/database/common.d.ts +12 -0
  127. package/dist/core/database/common.js +15 -0
  128. package/dist/core/database/common.js.map +1 -0
  129. package/dist/core/database/custom-snake-case-naming-strategy.d.ts +9 -0
  130. package/dist/core/database/custom-snake-case-naming-strategy.js +28 -0
  131. package/dist/core/database/custom-snake-case-naming-strategy.js.map +1 -0
  132. package/dist/core/database/database.config.d.ts +4 -0
  133. package/dist/core/database/database.config.js +39 -0
  134. package/dist/core/database/database.config.js.map +1 -0
  135. package/dist/core/database/database.module.d.ts +7 -0
  136. package/dist/core/database/database.module.js +58 -0
  137. package/dist/core/database/database.module.js.map +1 -0
  138. package/dist/core/database/database.schema.d.ts +41 -0
  139. package/dist/core/database/database.schema.js +33 -0
  140. package/dist/core/database/database.schema.js.map +1 -0
  141. package/dist/core/database/index.d.ts +5 -0
  142. package/dist/core/database/index.js +22 -0
  143. package/dist/core/database/index.js.map +1 -0
  144. package/dist/core/database/ssl-config.d.ts +3 -0
  145. package/dist/core/database/ssl-config.js +8 -0
  146. package/dist/core/database/ssl-config.js.map +1 -0
  147. package/dist/core/exception/all-exceptions.filter.d.ts +8 -0
  148. package/dist/core/exception/all-exceptions.filter.js +56 -0
  149. package/dist/core/exception/all-exceptions.filter.js.map +1 -0
  150. package/dist/core/exception/index.d.ts +1 -0
  151. package/dist/core/exception/index.js +18 -0
  152. package/dist/core/exception/index.js.map +1 -0
  153. package/dist/core/exception/utils.d.ts +6 -0
  154. package/dist/core/exception/utils.js +15 -0
  155. package/dist/core/exception/utils.js.map +1 -0
  156. package/dist/core/health/health.controller.d.ts +9 -0
  157. package/dist/core/health/health.controller.js +52 -0
  158. package/dist/core/health/health.controller.js.map +1 -0
  159. package/dist/core/health/health.module.d.ts +2 -0
  160. package/dist/core/health/health.module.js +24 -0
  161. package/dist/core/health/health.module.js.map +1 -0
  162. package/dist/core/health/index.d.ts +1 -0
  163. package/dist/core/health/index.js +18 -0
  164. package/dist/core/health/index.js.map +1 -0
  165. package/dist/core/health/shutdown-handler.d.ts +2 -0
  166. package/dist/core/health/shutdown-handler.js +20 -0
  167. package/dist/core/health/shutdown-handler.js.map +1 -0
  168. package/dist/core/health/shutdown.service.d.ts +11 -0
  169. package/dist/core/health/shutdown.service.js +54 -0
  170. package/dist/core/health/shutdown.service.js.map +1 -0
  171. package/dist/core/http/http.circuit-breaker.d.ts +4 -0
  172. package/dist/core/http/http.circuit-breaker.js +25 -0
  173. package/dist/core/http/http.circuit-breaker.js.map +1 -0
  174. package/dist/core/http/http.client.factory.d.ts +3 -0
  175. package/dist/core/http/http.client.factory.js +32 -0
  176. package/dist/core/http/http.client.factory.js.map +1 -0
  177. package/dist/core/http/http.module.d.ts +2 -0
  178. package/dist/core/http/http.module.js +19 -0
  179. package/dist/core/http/http.module.js.map +1 -0
  180. package/dist/core/http/http.open-api.d.ts +8 -0
  181. package/dist/core/http/http.open-api.js +22 -0
  182. package/dist/core/http/http.open-api.js.map +1 -0
  183. package/dist/core/http/http.types.d.ts +6 -0
  184. package/dist/core/http/http.types.js +3 -0
  185. package/dist/core/http/http.types.js.map +1 -0
  186. package/dist/core/http/index.d.ts +4 -0
  187. package/dist/core/http/index.js +21 -0
  188. package/dist/core/http/index.js.map +1 -0
  189. package/dist/core/info/index.d.ts +1 -0
  190. package/dist/core/info/index.js +18 -0
  191. package/dist/core/info/index.js.map +1 -0
  192. package/dist/core/info/info.controller.d.ts +3 -0
  193. package/dist/core/info/info.controller.js +33 -0
  194. package/dist/core/info/info.controller.js.map +1 -0
  195. package/dist/core/info/info.module.d.ts +6 -0
  196. package/dist/core/info/info.module.js +27 -0
  197. package/dist/core/info/info.module.js.map +1 -0
  198. package/dist/core/info/info.utils.d.ts +13 -0
  199. package/dist/core/info/info.utils.js +32 -0
  200. package/dist/core/info/info.utils.js.map +1 -0
  201. package/dist/core/logger/hash-pii.d.ts +1 -0
  202. package/dist/core/logger/hash-pii.js +13 -0
  203. package/dist/core/logger/hash-pii.js.map +1 -0
  204. package/dist/core/logger/index.d.ts +4 -0
  205. package/dist/core/logger/index.js +21 -0
  206. package/dist/core/logger/index.js.map +1 -0
  207. package/dist/core/logger/logger.module.d.ts +2 -0
  208. package/dist/core/logger/logger.module.js +30 -0
  209. package/dist/core/logger/logger.module.js.map +1 -0
  210. package/dist/core/logger/logging.interceptor.d.ts +8 -0
  211. package/dist/core/logger/logging.interceptor.js +51 -0
  212. package/dist/core/logger/logging.interceptor.js.map +1 -0
  213. package/dist/core/logger/pino.config.d.ts +9 -0
  214. package/dist/core/logger/pino.config.js +47 -0
  215. package/dist/core/logger/pino.config.js.map +1 -0
  216. package/dist/core/migrations/create-migration-data-source.d.ts +8 -0
  217. package/dist/core/migrations/create-migration-data-source.js +18 -0
  218. package/dist/core/migrations/create-migration-data-source.js.map +1 -0
  219. package/dist/core/migrations/index.d.ts +3 -0
  220. package/dist/core/migrations/index.js +20 -0
  221. package/dist/core/migrations/index.js.map +1 -0
  222. package/dist/core/migrations/platform-entities.d.ts +2 -0
  223. package/dist/core/migrations/platform-entities.js +10 -0
  224. package/dist/core/migrations/platform-entities.js.map +1 -0
  225. package/dist/core/migrations/run-migrations.d.ts +3 -0
  226. package/dist/core/migrations/run-migrations.js +80 -0
  227. package/dist/core/migrations/run-migrations.js.map +1 -0
  228. package/dist/core/newrelic/index.d.ts +1 -0
  229. package/dist/core/newrelic/index.js +18 -0
  230. package/dist/core/newrelic/index.js.map +1 -0
  231. package/dist/core/newrelic/newrelic.utils.d.ts +2 -0
  232. package/dist/core/newrelic/newrelic.utils.js +31 -0
  233. package/dist/core/newrelic/newrelic.utils.js.map +1 -0
  234. package/dist/core/scheduler/index.d.ts +3 -0
  235. package/dist/core/scheduler/index.js +20 -0
  236. package/dist/core/scheduler/index.js.map +1 -0
  237. package/dist/core/scheduler/scheduled-cron.decorator.d.ts +6 -0
  238. package/dist/core/scheduler/scheduled-cron.decorator.js +31 -0
  239. package/dist/core/scheduler/scheduled-cron.decorator.js.map +1 -0
  240. package/dist/core/scheduler/scheduler-control.service.d.ts +14 -0
  241. package/dist/core/scheduler/scheduler-control.service.js +42 -0
  242. package/dist/core/scheduler/scheduler-control.service.js.map +1 -0
  243. package/dist/core/scheduler/scheduler.module.d.ts +4 -0
  244. package/dist/core/scheduler/scheduler.module.js +27 -0
  245. package/dist/core/scheduler/scheduler.module.js.map +1 -0
  246. package/dist/core/throttler/index.d.ts +7 -0
  247. package/dist/core/throttler/index.js +25 -0
  248. package/dist/core/throttler/index.js.map +1 -0
  249. package/dist/core/throttler/pg-throttler.storage.d.ts +10 -0
  250. package/dist/core/throttler/pg-throttler.storage.js +58 -0
  251. package/dist/core/throttler/pg-throttler.storage.js.map +1 -0
  252. package/dist/core/throttler/rate-limit-hit.entity.d.ts +6 -0
  253. package/dist/core/throttler/rate-limit-hit.entity.js +36 -0
  254. package/dist/core/throttler/rate-limit-hit.entity.js.map +1 -0
  255. package/dist/core/throttler/throttler-cleanup.service.d.ts +7 -0
  256. package/dist/core/throttler/throttler-cleanup.service.js +41 -0
  257. package/dist/core/throttler/throttler-cleanup.service.js.map +1 -0
  258. package/dist/core/throttler/throttler-tracker.d.ts +2 -0
  259. package/dist/core/throttler/throttler-tracker.js +29 -0
  260. package/dist/core/throttler/throttler-tracker.js.map +1 -0
  261. package/dist/core/throttler/throttler.module.d.ts +2 -0
  262. package/dist/core/throttler/throttler.module.js +41 -0
  263. package/dist/core/throttler/throttler.module.js.map +1 -0
  264. package/dist/core/utils/app-initializer.d.ts +5 -0
  265. package/dist/core/utils/app-initializer.js +37 -0
  266. package/dist/core/utils/app-initializer.js.map +1 -0
  267. package/dist/core/utils/feature-flag.d.ts +1 -0
  268. package/dist/core/utils/feature-flag.js +10 -0
  269. package/dist/core/utils/feature-flag.js.map +1 -0
  270. package/dist/core/utils/index.d.ts +5 -0
  271. package/dist/core/utils/index.js +22 -0
  272. package/dist/core/utils/index.js.map +1 -0
  273. package/dist/core/utils/parse-allowed-origins.d.ts +1 -0
  274. package/dist/core/utils/parse-allowed-origins.js +21 -0
  275. package/dist/core/utils/parse-allowed-origins.js.map +1 -0
  276. package/dist/core/utils/security-middleware.d.ts +2 -0
  277. package/dist/core/utils/security-middleware.js +19 -0
  278. package/dist/core/utils/security-middleware.js.map +1 -0
  279. package/dist/core/utils/with-timeout.d.ts +4 -0
  280. package/dist/core/utils/with-timeout.js +23 -0
  281. package/dist/core/utils/with-timeout.js.map +1 -0
  282. package/dist/core/ws/index.d.ts +4 -0
  283. package/dist/core/ws/index.js +23 -0
  284. package/dist/core/ws/index.js.map +1 -0
  285. package/dist/core/ws/validate-ws-dto.d.ts +1 -0
  286. package/dist/core/ws/validate-ws-dto.js +14 -0
  287. package/dist/core/ws/validate-ws-dto.js.map +1 -0
  288. package/dist/core/ws/ws-token.module.d.ts +2 -0
  289. package/dist/core/ws/ws-token.module.js +21 -0
  290. package/dist/core/ws/ws-token.module.js.map +1 -0
  291. package/dist/core/ws/ws-token.service.d.ts +8 -0
  292. package/dist/core/ws/ws-token.service.js +57 -0
  293. package/dist/core/ws/ws-token.service.js.map +1 -0
  294. package/dist/core/ws/ws.constants.d.ts +7 -0
  295. package/dist/core/ws/ws.constants.js +11 -0
  296. package/dist/core/ws/ws.constants.js.map +1 -0
  297. package/dist/index.d.ts +15 -0
  298. package/dist/index.js +32 -0
  299. package/dist/index.js.map +1 -0
  300. package/package.json +167 -0
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var AiService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.AiService = void 0;
17
+ exports.mapMessagesWithCache = mapMessagesWithCache;
18
+ exports.buildSystemParam = buildSystemParam;
19
+ const common_1 = require("@nestjs/common");
20
+ const node_crypto_1 = require("node:crypto");
21
+ const ai_1 = require("ai");
22
+ const with_timeout_1 = require("../utils/with-timeout");
23
+ const ai_options_1 = require("./ai.options");
24
+ const context_formatter_service_1 = require("./context/context-formatter.service");
25
+ const cost_tracking_service_1 = require("./cost/cost-tracking.service");
26
+ const memory_service_1 = require("./memory/memory.service");
27
+ const provider_factory_service_1 = require("./provider/provider-factory.service");
28
+ const safety_guardrail_service_1 = require("./safety/safety-guardrail.service");
29
+ const template_service_1 = require("./template/template.service");
30
+ const DEFAULT_MEMORY_TIMEOUT_MS = 2000;
31
+ const ECHO_RESPONSE = '[echo] No AI provider configured. Choose openai/anthropic via AiModule.forRoot or the invoke options.';
32
+ let AiService = AiService_1 = class AiService {
33
+ constructor(providerFactory, contextFormatter, templateService, safetyService, costService, memoryService, options) {
34
+ this.providerFactory = providerFactory;
35
+ this.contextFormatter = contextFormatter;
36
+ this.templateService = templateService;
37
+ this.safetyService = safetyService;
38
+ this.costService = costService;
39
+ this.memoryService = memoryService;
40
+ this.logger = new common_1.Logger(AiService_1.name);
41
+ this.defaultModel = options.defaultModel ?? ai_options_1.ECHO_MODEL;
42
+ this.memoryFetchTimeoutMs =
43
+ options.memory?.fetchTimeoutMs ?? DEFAULT_MEMORY_TIMEOUT_MS;
44
+ }
45
+ async invoke(options) {
46
+ const modelConfig = options.model ?? this.defaultModel;
47
+ if (modelConfig.provider === 'echo') {
48
+ return {
49
+ success: false,
50
+ error: 'echo provider does not support structured output — configure openai or anthropic',
51
+ metadata: this.echoMetadata(modelConfig),
52
+ };
53
+ }
54
+ const errorParams = this.initialErrorParams(options, modelConfig);
55
+ try {
56
+ const prep = await this.prepareInvocation(options, modelConfig);
57
+ Object.assign(errorParams, prep);
58
+ const model = this.providerFactory.getModel(modelConfig);
59
+ const userContent = prep.contextSections.join('\n\n');
60
+ const result = await (0, ai_1.generateText)({
61
+ model,
62
+ system: buildSystemParam(modelConfig.provider, prep.rawTemplate, []),
63
+ messages: [{ role: 'user', content: userContent }],
64
+ output: ai_1.Output.object({
65
+ schema: options.outputSchema,
66
+ name: prep.templateSlug ?? undefined,
67
+ }),
68
+ maxOutputTokens: modelConfig.maxTokens,
69
+ temperature: modelConfig.temperature,
70
+ abortSignal: options.abortSignal,
71
+ maxRetries: 0,
72
+ });
73
+ const usage = extractUsage(result.usage, result.providerMetadata);
74
+ const safety = this.safetyService.validateOutput(JSON.stringify(result.output), { userId: options.userId });
75
+ const metadata = this.buildMetadata(prep, usage, safety.flags);
76
+ this.logSuccess(prep, usage, options.userId);
77
+ return {
78
+ success: true,
79
+ output: result.output,
80
+ metadata,
81
+ };
82
+ }
83
+ catch (error) {
84
+ return this.handleError(error, errorParams);
85
+ }
86
+ }
87
+ async invokeStream(options) {
88
+ const modelConfig = options.model ?? this.defaultModel;
89
+ if (modelConfig.provider === 'echo') {
90
+ options.onChunk?.(ECHO_RESPONSE);
91
+ return {
92
+ success: true,
93
+ text: ECHO_RESPONSE,
94
+ metadata: this.echoMetadata(modelConfig),
95
+ };
96
+ }
97
+ const errorParams = this.initialErrorParams(options, modelConfig);
98
+ try {
99
+ const prep = await this.prepareInvocation(options, modelConfig);
100
+ Object.assign(errorParams, prep);
101
+ const model = this.providerFactory.getModel(modelConfig);
102
+ const messages = mapMessagesWithCache(options.messages ?? [], modelConfig.provider, options.cacheRecentHistory === true);
103
+ const streamResult = (0, ai_1.streamText)({
104
+ model,
105
+ system: buildSystemParam(modelConfig.provider, prep.rawTemplate, prep.contextSections),
106
+ messages,
107
+ maxOutputTokens: modelConfig.maxTokens,
108
+ temperature: modelConfig.temperature,
109
+ abortSignal: options.abortSignal,
110
+ maxRetries: 1,
111
+ });
112
+ let fullText = '';
113
+ for await (const chunk of streamResult.textStream) {
114
+ fullText += chunk;
115
+ options.onChunk?.(chunk);
116
+ }
117
+ const usage = extractUsage(await streamResult.usage, await streamResult.providerMetadata);
118
+ const safety = this.safetyService.validateOutput(fullText, {
119
+ userId: options.userId,
120
+ });
121
+ const metadata = this.buildMetadata(prep, usage, safety.flags);
122
+ this.logSuccess(prep, usage, options.userId);
123
+ return { success: true, text: fullText, metadata };
124
+ }
125
+ catch (error) {
126
+ return this.handleError(error, errorParams);
127
+ }
128
+ }
129
+ async invokeText(options) {
130
+ const modelConfig = options.model ?? this.defaultModel;
131
+ if (modelConfig.provider === 'echo') {
132
+ return {
133
+ success: true,
134
+ output: ECHO_RESPONSE,
135
+ metadata: this.echoMetadata(modelConfig),
136
+ };
137
+ }
138
+ const errorParams = this.initialErrorParams(options, modelConfig);
139
+ try {
140
+ const prep = await this.prepareInvocation(options, modelConfig);
141
+ Object.assign(errorParams, prep);
142
+ const model = this.providerFactory.getModel(modelConfig);
143
+ const messages = mapMessagesWithCache(options.messages ?? [], modelConfig.provider, options.cacheRecentHistory === true);
144
+ const result = await (0, ai_1.generateText)({
145
+ model,
146
+ system: buildSystemParam(modelConfig.provider, prep.rawTemplate, prep.contextSections),
147
+ messages,
148
+ maxOutputTokens: modelConfig.maxTokens,
149
+ temperature: modelConfig.temperature,
150
+ abortSignal: options.abortSignal,
151
+ maxRetries: 0,
152
+ });
153
+ const usage = extractUsage(result.usage, result.providerMetadata);
154
+ const safety = this.safetyService.validateOutput(result.text, {
155
+ userId: options.userId,
156
+ });
157
+ const metadata = this.buildMetadata(prep, usage, safety.flags);
158
+ this.logSuccess(prep, usage, options.userId);
159
+ return { success: true, output: result.text, metadata };
160
+ }
161
+ catch (error) {
162
+ return this.handleError(error, errorParams);
163
+ }
164
+ }
165
+ initialErrorParams(options, modelConfig) {
166
+ return {
167
+ requestId: (0, node_crypto_1.randomUUID)(),
168
+ startTime: Date.now(),
169
+ templateSlug: options.templateSlug,
170
+ modelConfig,
171
+ contextKeys: Object.keys(options.context ?? {}),
172
+ };
173
+ }
174
+ async prepareInvocation(options, modelConfig) {
175
+ const templateSlug = options.templateSlug ??
176
+ this.templateService.resolveSlug(options.template);
177
+ const rawTemplate = await this.templateService.resolve(options.template);
178
+ const memories = await this.fetchMemories(options.memory);
179
+ const contextSections = this.buildContextSections(options.context, options.contextDefinitions, memories);
180
+ return {
181
+ requestId: (0, node_crypto_1.randomUUID)(),
182
+ startTime: Date.now(),
183
+ modelConfig,
184
+ templateSlug,
185
+ rawTemplate,
186
+ contextSections,
187
+ contextKeys: Object.keys(options.context ?? {}),
188
+ };
189
+ }
190
+ echoMetadata(modelConfig) {
191
+ return {
192
+ requestId: (0, node_crypto_1.randomUUID)(),
193
+ model: modelConfig.name,
194
+ provider: modelConfig.provider,
195
+ latencyMs: 0,
196
+ usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
197
+ contextKeys: [],
198
+ safetyFlags: [],
199
+ };
200
+ }
201
+ buildMetadata(prep, usage, safetyFlags) {
202
+ return {
203
+ requestId: prep.requestId,
204
+ model: prep.modelConfig.name,
205
+ provider: prep.modelConfig.provider,
206
+ latencyMs: Date.now() - prep.startTime,
207
+ usage,
208
+ contextKeys: prep.contextKeys,
209
+ safetyFlags,
210
+ templateSlug: prep.templateSlug,
211
+ };
212
+ }
213
+ logSuccess(prep, usage, userId) {
214
+ this.costService.logInvocation({
215
+ requestId: prep.requestId,
216
+ userId,
217
+ templateSlug: prep.templateSlug,
218
+ modelProvider: prep.modelConfig.provider,
219
+ modelName: prep.modelConfig.name,
220
+ inputTokens: usage.inputTokens,
221
+ outputTokens: usage.outputTokens,
222
+ latencyMs: Date.now() - prep.startTime,
223
+ success: true,
224
+ contextProvided: prep.contextKeys,
225
+ cacheReadInputTokens: usage.cacheReadInputTokens,
226
+ cacheCreation5mInputTokens: usage.cacheCreation5mInputTokens,
227
+ cacheCreation1hInputTokens: usage.cacheCreation1hInputTokens,
228
+ });
229
+ }
230
+ handleError(error, params) {
231
+ const latencyMs = Date.now() - params.startTime;
232
+ const errorMessage = error instanceof Error ? error.message : String(error);
233
+ this.logger.error({
234
+ requestId: params.requestId,
235
+ templateSlug: params.templateSlug,
236
+ error: errorMessage,
237
+ }, 'AiService request failed');
238
+ this.costService.logInvocation({
239
+ requestId: params.requestId,
240
+ userId: params.userId,
241
+ templateSlug: params.templateSlug,
242
+ modelProvider: params.modelConfig.provider,
243
+ modelName: params.modelConfig.name,
244
+ inputTokens: 0,
245
+ outputTokens: 0,
246
+ latencyMs,
247
+ success: false,
248
+ errorCode: errorMessage.slice(0, 200),
249
+ contextProvided: params.contextKeys,
250
+ });
251
+ return {
252
+ success: false,
253
+ error: errorMessage,
254
+ metadata: {
255
+ requestId: params.requestId,
256
+ templateSlug: params.templateSlug,
257
+ model: params.modelConfig.name,
258
+ provider: params.modelConfig.provider,
259
+ latencyMs,
260
+ usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
261
+ contextKeys: params.contextKeys,
262
+ safetyFlags: [],
263
+ },
264
+ };
265
+ }
266
+ async fetchMemories(memoryConfig) {
267
+ if (!memoryConfig || memoryConfig.type === 'none')
268
+ return [];
269
+ if (memoryConfig.type === 'inline')
270
+ return memoryConfig.memories;
271
+ try {
272
+ const { result } = await (0, with_timeout_1.withTimeout)(this.memoryService
273
+ .search(memoryConfig.userId, memoryConfig.query ?? 'user context', memoryConfig.limit ?? 10)
274
+ .then((entries) => entries.map((entry) => entry.content)), this.memoryFetchTimeoutMs, [], () => this.logger.warn(`Memory fetch timed out after ${this.memoryFetchTimeoutMs}ms`));
275
+ return result;
276
+ }
277
+ catch {
278
+ this.logger.warn('Failed to fetch memories, proceeding without');
279
+ return [];
280
+ }
281
+ }
282
+ buildContextSections(context, definitions, memories) {
283
+ const sections = [];
284
+ if (context && definitions) {
285
+ for (const [key, value] of Object.entries(context)) {
286
+ const def = definitions[key];
287
+ if (def) {
288
+ sections.push(this.contextFormatter.format(value, {
289
+ type: def.type,
290
+ label: def.label,
291
+ }));
292
+ }
293
+ }
294
+ }
295
+ else if (context) {
296
+ for (const value of Object.values(context)) {
297
+ sections.push(typeof value === 'string' ? value : JSON.stringify(value, null, 2));
298
+ }
299
+ }
300
+ if (memories && memories.length > 0) {
301
+ sections.push([
302
+ '## User Memories (from past conversations)',
303
+ ...memories.map((m, i) => `${i + 1}. ${m}`),
304
+ ].join('\n'));
305
+ }
306
+ return sections;
307
+ }
308
+ };
309
+ exports.AiService = AiService;
310
+ exports.AiService = AiService = AiService_1 = __decorate([
311
+ (0, common_1.Injectable)(),
312
+ __param(6, (0, common_1.Inject)(ai_options_1.AI_MODULE_OPTIONS)),
313
+ __metadata("design:paramtypes", [provider_factory_service_1.ProviderFactory,
314
+ context_formatter_service_1.ContextFormatterService,
315
+ template_service_1.TemplateService,
316
+ safety_guardrail_service_1.SafetyGuardrailService,
317
+ cost_tracking_service_1.CostTrackingService,
318
+ memory_service_1.MemoryService, Object])
319
+ ], AiService);
320
+ function mapMessagesWithCache(sourceMessages, provider, cacheRecentHistory) {
321
+ const shouldMark = cacheRecentHistory && provider === 'anthropic' && sourceMessages.length > 0;
322
+ const lastIndex = sourceMessages.length - 1;
323
+ return sourceMessages.map((m, i) => shouldMark && i === lastIndex
324
+ ? {
325
+ role: m.role,
326
+ content: m.content,
327
+ providerOptions: {
328
+ anthropic: { cacheControl: { type: 'ephemeral', ttl: '5m' } },
329
+ },
330
+ }
331
+ : { role: m.role, content: m.content });
332
+ }
333
+ function buildSystemParam(provider, rawTemplate, contextSections) {
334
+ if (provider !== 'anthropic') {
335
+ return contextSections.length > 0
336
+ ? `${rawTemplate}\n\n${contextSections.join('\n\n')}`
337
+ : rawTemplate;
338
+ }
339
+ const blocks = [
340
+ {
341
+ role: 'system',
342
+ content: rawTemplate,
343
+ providerOptions: {
344
+ anthropic: { cacheControl: { type: 'ephemeral', ttl: '1h' } },
345
+ },
346
+ },
347
+ ];
348
+ if (contextSections.length > 0) {
349
+ blocks.push({ role: 'system', content: contextSections.join('\n\n') });
350
+ }
351
+ return blocks;
352
+ }
353
+ function extractUsage(usage, providerMetadata) {
354
+ const u = usage;
355
+ const base = {
356
+ inputTokens: u?.inputTokens ?? u?.promptTokens ?? 0,
357
+ outputTokens: u?.outputTokens ?? u?.completionTokens ?? 0,
358
+ totalTokens: u?.totalTokens ?? 0,
359
+ };
360
+ const cacheRead = u?.cachedInputTokens;
361
+ if (typeof cacheRead === 'number')
362
+ base.cacheReadInputTokens = cacheRead;
363
+ const anthropic = providerMetadata
364
+ ?.anthropic;
365
+ if (!anthropic)
366
+ return base;
367
+ const ttl = anthropic.usage?.cache_creation;
368
+ if (typeof ttl?.ephemeral_5m_input_tokens === 'number') {
369
+ base.cacheCreation5mInputTokens = ttl.ephemeral_5m_input_tokens;
370
+ }
371
+ if (typeof ttl?.ephemeral_1h_input_tokens === 'number') {
372
+ base.cacheCreation1hInputTokens = ttl.ephemeral_1h_input_tokens;
373
+ }
374
+ if (base.cacheCreation5mInputTokens === undefined &&
375
+ base.cacheCreation1hInputTokens === undefined &&
376
+ typeof anthropic.cacheCreationInputTokens === 'number') {
377
+ base.cacheCreation5mInputTokens = anthropic.cacheCreationInputTokens;
378
+ }
379
+ return base;
380
+ }
381
+ //# sourceMappingURL=ai.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.service.js","sourceRoot":"","sources":["../../../src/core/ai/ai.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ import { z } from 'zod';
2
+ export type AiServiceProvider = 'anthropic' | 'openai' | 'echo';
3
+ export interface AiServiceModelConfig {
4
+ provider: AiServiceProvider;
5
+ name: string;
6
+ temperature?: number;
7
+ maxTokens?: number;
8
+ }
9
+ export type ContextType = 'messages' | 'json' | 'list' | 'text' | 'structured';
10
+ export interface ContextDefinition {
11
+ type: ContextType;
12
+ label?: string;
13
+ }
14
+ export type MemoryConfig = {
15
+ type: 'mem0';
16
+ userId: string;
17
+ query?: string;
18
+ limit?: number;
19
+ } | {
20
+ type: 'inline';
21
+ memories: string[];
22
+ } | {
23
+ type: 'none';
24
+ };
25
+ export interface TokenUsage {
26
+ inputTokens: number;
27
+ outputTokens: number;
28
+ totalTokens: number;
29
+ cacheReadInputTokens?: number;
30
+ cacheCreation5mInputTokens?: number;
31
+ cacheCreation1hInputTokens?: number;
32
+ }
33
+ export interface SafetyResult {
34
+ safe: boolean;
35
+ flags: string[];
36
+ }
37
+ export interface InvocationMetadata {
38
+ requestId: string;
39
+ model: string;
40
+ provider: string;
41
+ latencyMs: number;
42
+ usage: TokenUsage;
43
+ contextKeys: string[];
44
+ safetyFlags: string[];
45
+ templateSlug?: string;
46
+ }
47
+ export interface InvokeOptions<T extends z.ZodType = z.ZodType> {
48
+ template: string;
49
+ templateSlug?: string;
50
+ model?: AiServiceModelConfig;
51
+ context?: Record<string, unknown>;
52
+ contextDefinitions?: Record<string, ContextDefinition>;
53
+ outputSchema: T;
54
+ memory?: MemoryConfig;
55
+ userId?: string;
56
+ abortSignal?: AbortSignal;
57
+ }
58
+ export interface StreamInvokeOptions {
59
+ template: string;
60
+ templateSlug?: string;
61
+ model?: AiServiceModelConfig;
62
+ context?: Record<string, unknown>;
63
+ contextDefinitions?: Record<string, ContextDefinition>;
64
+ messages?: Array<{
65
+ role: 'user' | 'assistant';
66
+ content: string;
67
+ }>;
68
+ memory?: MemoryConfig;
69
+ userId?: string;
70
+ onChunk?: (chunk: string) => void;
71
+ abortSignal?: AbortSignal;
72
+ streamId?: string;
73
+ cacheRecentHistory?: boolean;
74
+ }
75
+ export interface TextInvokeOptions {
76
+ template: string;
77
+ templateSlug?: string;
78
+ model?: AiServiceModelConfig;
79
+ context?: Record<string, unknown>;
80
+ contextDefinitions?: Record<string, ContextDefinition>;
81
+ messages?: Array<{
82
+ role: 'user' | 'assistant';
83
+ content: string;
84
+ }>;
85
+ memory?: MemoryConfig;
86
+ userId?: string;
87
+ abortSignal?: AbortSignal;
88
+ streamId?: string;
89
+ cacheRecentHistory?: boolean;
90
+ }
91
+ export type GenerationResult<T> = {
92
+ success: true;
93
+ output: T;
94
+ metadata: InvocationMetadata;
95
+ } | {
96
+ success: false;
97
+ error: string;
98
+ metadata?: InvocationMetadata;
99
+ };
100
+ export type StreamGenerationResult = {
101
+ success: true;
102
+ text: string;
103
+ metadata: InvocationMetadata;
104
+ } | {
105
+ success: false;
106
+ error: string;
107
+ metadata?: InvocationMetadata;
108
+ };
109
+ export interface SummarizationConfig {
110
+ targetTokens?: number;
111
+ templateSlug?: string;
112
+ userId?: string;
113
+ }
114
+ export interface SafetyContext {
115
+ userId?: string;
116
+ category?: string;
117
+ }
118
+ export interface CostTrackingMetadata {
119
+ requestId: string;
120
+ userId?: string;
121
+ templateSlug?: string;
122
+ modelProvider: string;
123
+ modelName: string;
124
+ inputTokens: number;
125
+ outputTokens: number;
126
+ latencyMs: number;
127
+ success: boolean;
128
+ errorCode?: string;
129
+ contextProvided: string[];
130
+ cacheReadInputTokens?: number;
131
+ cacheCreation5mInputTokens?: number;
132
+ cacheCreation1hInputTokens?: number;
133
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ai.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.types.js","sourceRoot":"","sources":["../../../src/core/ai/ai.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { ContextDefinition } from '../ai.types';
2
+ export declare class ContextFormatterService {
3
+ format(value: unknown, definition: ContextDefinition): string;
4
+ private formatMessages;
5
+ private formatJson;
6
+ private formatList;
7
+ private formatText;
8
+ private formatStructured;
9
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ContextFormatterService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let ContextFormatterService = class ContextFormatterService {
12
+ format(value, definition) {
13
+ const { type, label } = definition;
14
+ switch (type) {
15
+ case 'messages':
16
+ return this.formatMessages(value, label);
17
+ case 'json':
18
+ return this.formatJson(value, label);
19
+ case 'list':
20
+ return this.formatList(value, label);
21
+ case 'structured':
22
+ return this.formatStructured(value, label);
23
+ case 'text':
24
+ default:
25
+ return this.formatText(value, label);
26
+ }
27
+ }
28
+ formatMessages(value, label) {
29
+ if (!Array.isArray(value))
30
+ return '';
31
+ const messages = value;
32
+ const formatted = messages
33
+ .map((m) => `${m.role === 'assistant' ? 'Assistant' : 'User'}: ${m.content}`)
34
+ .join('\n');
35
+ return label ? `## ${label}\n${formatted}` : formatted;
36
+ }
37
+ formatJson(value, label) {
38
+ const jsonStr = JSON.stringify(value, null, 2);
39
+ return label ? `## ${label}\n${jsonStr}` : jsonStr;
40
+ }
41
+ formatList(value, label) {
42
+ if (!Array.isArray(value))
43
+ return '';
44
+ const formatted = value
45
+ .map((item, i) => `${i + 1}. ${String(item)}`)
46
+ .join('\n');
47
+ return label ? `## ${label}\n${formatted}` : formatted;
48
+ }
49
+ formatText(value, label) {
50
+ const text = typeof value === 'string' ? value : JSON.stringify(value ?? '');
51
+ return label ? `## ${label}\n${text}` : text;
52
+ }
53
+ formatStructured(value, label) {
54
+ if (!value || typeof value !== 'object')
55
+ return '';
56
+ const formatted = Object.entries(value)
57
+ .map(([key, val]) => `**${key}**: ${String(val)}`)
58
+ .join('\n');
59
+ return label ? `## ${label}\n${formatted}` : formatted;
60
+ }
61
+ };
62
+ exports.ContextFormatterService = ContextFormatterService;
63
+ exports.ContextFormatterService = ContextFormatterService = __decorate([
64
+ (0, common_1.Injectable)()
65
+ ], ContextFormatterService);
66
+ //# sourceMappingURL=context-formatter.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-formatter.service.js","sourceRoot":"","sources":["../../../../src/core/ai/context/context-formatter.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Repository } from 'typeorm';
2
+ import { type AiModuleOptions } from '../ai.options';
3
+ import { AiInvocationLog } from '../entities/ai-invocation-log.entity';
4
+ import { CostTrackingMetadata } from '../ai.types';
5
+ export declare class CostTrackingService {
6
+ private readonly logRepository;
7
+ private readonly logger;
8
+ private readonly costRates;
9
+ constructor(logRepository: Repository<AiInvocationLog>, options: AiModuleOptions);
10
+ logInvocation(metadata: CostTrackingMetadata): void;
11
+ estimateCost(modelName: string, inputTokens: number, outputTokens: number): number;
12
+ }