@carlonicora/nestjs-neo4jsonapi 1.99.0 → 1.101.0

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 (106) hide show
  1. package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
  2. package/dist/bootstrap/app.module.factory.js +13 -6
  3. package/dist/bootstrap/app.module.factory.js.map +1 -1
  4. package/dist/bootstrap/bootstrap.options.d.ts +11 -0
  5. package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
  6. package/dist/common/filters/http-exception.filter.d.ts.map +1 -1
  7. package/dist/common/filters/http-exception.filter.js +9 -0
  8. package/dist/common/filters/http-exception.filter.js.map +1 -1
  9. package/dist/config/base.config.d.ts.map +1 -1
  10. package/dist/config/base.config.js +29 -0
  11. package/dist/config/base.config.js.map +1 -1
  12. package/dist/config/interfaces/config.ai.interface.d.ts +67 -0
  13. package/dist/config/interfaces/config.ai.interface.d.ts.map +1 -1
  14. package/dist/core/blocknote/services/blocknote.service.d.ts +14 -0
  15. package/dist/core/blocknote/services/blocknote.service.d.ts.map +1 -1
  16. package/dist/core/blocknote/services/blocknote.service.js +89 -0
  17. package/dist/core/blocknote/services/blocknote.service.js.map +1 -1
  18. package/dist/core/core.module.d.ts +2 -0
  19. package/dist/core/core.module.d.ts.map +1 -1
  20. package/dist/core/core.module.js +3 -3
  21. package/dist/core/core.module.js.map +1 -1
  22. package/dist/core/email/services/email.service.d.ts +12 -3
  23. package/dist/core/email/services/email.service.d.ts.map +1 -1
  24. package/dist/core/email/services/email.service.js +67 -32
  25. package/dist/core/email/services/email.service.js.map +1 -1
  26. package/dist/core/jsonapi/services/jsonapi.service.d.ts +1 -1
  27. package/dist/core/jsonapi/services/jsonapi.service.d.ts.map +1 -1
  28. package/dist/core/jsonapi/services/jsonapi.service.js +3 -3
  29. package/dist/core/jsonapi/services/jsonapi.service.js.map +1 -1
  30. package/dist/core/llm/index.d.ts +4 -0
  31. package/dist/core/llm/index.d.ts.map +1 -1
  32. package/dist/core/llm/index.js +4 -0
  33. package/dist/core/llm/index.js.map +1 -1
  34. package/dist/core/llm/llm.module.d.ts.map +1 -1
  35. package/dist/core/llm/llm.module.js +8 -1
  36. package/dist/core/llm/llm.module.js.map +1 -1
  37. package/dist/core/llm/services/document-ai.service.d.ts +35 -0
  38. package/dist/core/llm/services/document-ai.service.d.ts.map +1 -0
  39. package/dist/core/llm/services/document-ai.service.js +100 -0
  40. package/dist/core/llm/services/document-ai.service.js.map +1 -0
  41. package/dist/core/llm/services/embedder-token-bucket.service.d.ts +29 -0
  42. package/dist/core/llm/services/embedder-token-bucket.service.d.ts.map +1 -0
  43. package/dist/core/llm/services/embedder-token-bucket.service.js +127 -0
  44. package/dist/core/llm/services/embedder-token-bucket.service.js.map +1 -0
  45. package/dist/core/llm/services/llm.service.d.ts.map +1 -1
  46. package/dist/core/llm/services/llm.service.js +8 -0
  47. package/dist/core/llm/services/llm.service.js.map +1 -1
  48. package/dist/core/llm/services/model.service.d.ts +42 -2
  49. package/dist/core/llm/services/model.service.d.ts.map +1 -1
  50. package/dist/core/llm/services/model.service.js +108 -3
  51. package/dist/core/llm/services/model.service.js.map +1 -1
  52. package/dist/core/llm/services/rate-limited-embedder.d.ts +31 -0
  53. package/dist/core/llm/services/rate-limited-embedder.d.ts.map +1 -0
  54. package/dist/core/llm/services/rate-limited-embedder.js +194 -0
  55. package/dist/core/llm/services/rate-limited-embedder.js.map +1 -0
  56. package/dist/core/llm/services/vision.llm.service.d.ts +16 -0
  57. package/dist/core/llm/services/vision.llm.service.d.ts.map +1 -1
  58. package/dist/core/llm/services/vision.llm.service.js +46 -5
  59. package/dist/core/llm/services/vision.llm.service.js.map +1 -1
  60. package/dist/core/llm/utils/mock-from-zod.d.ts +3 -0
  61. package/dist/core/llm/utils/mock-from-zod.d.ts.map +1 -0
  62. package/dist/core/llm/utils/mock-from-zod.js +47 -0
  63. package/dist/core/llm/utils/mock-from-zod.js.map +1 -0
  64. package/dist/core/migrator/interfaces/migration.interface.d.ts +21 -1
  65. package/dist/core/migrator/interfaces/migration.interface.d.ts.map +1 -1
  66. package/dist/core/migrator/migrator.module.d.ts.map +1 -1
  67. package/dist/core/migrator/migrator.module.js +5 -1
  68. package/dist/core/migrator/migrator.module.js.map +1 -1
  69. package/dist/core/migrator/services/migrator.service.d.ts +8 -1
  70. package/dist/core/migrator/services/migrator.service.d.ts.map +1 -1
  71. package/dist/core/migrator/services/migrator.service.js +52 -23
  72. package/dist/core/migrator/services/migrator.service.js.map +1 -1
  73. package/dist/core/neo4j/services/neo4j.service.d.ts +1 -0
  74. package/dist/core/neo4j/services/neo4j.service.d.ts.map +1 -1
  75. package/dist/core/neo4j/services/neo4j.service.js +8 -5
  76. package/dist/core/neo4j/services/neo4j.service.js.map +1 -1
  77. package/dist/core/redis/services/redis.client.storage.service.d.ts +14 -0
  78. package/dist/core/redis/services/redis.client.storage.service.d.ts.map +1 -1
  79. package/dist/core/redis/services/redis.client.storage.service.js +28 -0
  80. package/dist/core/redis/services/redis.client.storage.service.js.map +1 -1
  81. package/dist/core/security/services/security.service.d.ts +4 -0
  82. package/dist/core/security/services/security.service.d.ts.map +1 -1
  83. package/dist/core/security/services/security.service.js +15 -3
  84. package/dist/core/security/services/security.service.js.map +1 -1
  85. package/dist/core/websocket/gateways/event.gateway.d.ts.map +1 -1
  86. package/dist/core/websocket/gateways/event.gateway.js +6 -0
  87. package/dist/core/websocket/gateways/event.gateway.js.map +1 -1
  88. package/dist/core/websocket/services/presence.cron.service.d.ts +21 -0
  89. package/dist/core/websocket/services/presence.cron.service.d.ts.map +1 -0
  90. package/dist/core/websocket/services/presence.cron.service.js +83 -0
  91. package/dist/core/websocket/services/presence.cron.service.js.map +1 -0
  92. package/dist/core/websocket/services/presence.service.d.ts +3 -1
  93. package/dist/core/websocket/services/presence.service.d.ts.map +1 -1
  94. package/dist/core/websocket/services/presence.service.js +14 -11
  95. package/dist/core/websocket/services/presence.service.js.map +1 -1
  96. package/dist/core/websocket/services/websocket.service.d.ts +9 -5
  97. package/dist/core/websocket/services/websocket.service.d.ts.map +1 -1
  98. package/dist/core/websocket/services/websocket.service.js +12 -4
  99. package/dist/core/websocket/services/websocket.service.js.map +1 -1
  100. package/dist/core/websocket/websocket.module.d.ts.map +1 -1
  101. package/dist/core/websocket/websocket.module.js +5 -2
  102. package/dist/core/websocket/websocket.module.js.map +1 -1
  103. package/dist/foundations/chunker/services/types/email.service.d.ts +3 -3
  104. package/dist/foundations/chunker/services/types/email.service.d.ts.map +1 -1
  105. package/dist/foundations/chunker/services/types/email.service.js.map +1 -1
  106. package/package.json +1 -1
@@ -41,10 +41,14 @@ var __importStar = (this && this.__importStar) || (function () {
41
41
  var __metadata = (this && this.__metadata) || function (k, v) {
42
42
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
43
  };
44
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
+ return function (target, key) { decorator(target, key, paramIndex); }
46
+ };
44
47
  Object.defineProperty(exports, "__esModule", { value: true });
45
48
  exports.ModelService = void 0;
46
49
  exports.writeGcpCredentials = writeGcpCredentials;
47
50
  exports.validateAiUrl = validateAiUrl;
51
+ const testing_1 = require("@langchain/core/utils/testing");
48
52
  const google_vertexai_1 = require("@langchain/google-vertexai");
49
53
  const openai_1 = require("@langchain/openai");
50
54
  const common_1 = require("@nestjs/common");
@@ -54,8 +58,12 @@ const fs = __importStar(require("fs"));
54
58
  const os = __importStar(require("os"));
55
59
  const path = __importStar(require("path"));
56
60
  const nestjs_cls_1 = require("nestjs-cls");
61
+ const openai_2 = __importStar(require("openai"));
62
+ const logging_service_1 = require("../../logging/services/logging.service");
57
63
  const model_weight_1 = require("../enums/model.weight");
64
+ const embedder_token_bucket_service_1 = require("./embedder-token-bucket.service");
58
65
  const openrouter_fetch_1 = require("./openrouter-fetch");
66
+ const rate_limited_embedder_1 = require("./rate-limited-embedder");
59
67
  /**
60
68
  * Tracks GCP credential temp files written this process so they can be removed
61
69
  * on exit. Each path is UUID-unique (see {@link writeGcpCredentials}).
@@ -136,9 +144,24 @@ function validateAiUrl(url, provider) {
136
144
  }
137
145
  }
138
146
  let ModelService = class ModelService {
139
- constructor(clsService, configService) {
147
+ constructor(clsService, configService, bucket, logger) {
140
148
  this.clsService = clsService;
141
149
  this.configService = configService;
150
+ this.bucket = bucket;
151
+ this.logger = logger;
152
+ }
153
+ /**
154
+ * Fail-closed MOCK_AI safety gate. MOCK_AI returns synthetic data (no provider
155
+ * call) for every model/embedder/structured call — invaluable for local dev and
156
+ * tests, catastrophic in production (it would write fake AI data into the graph).
157
+ * This refuses to start when MOCK_AI is on AND the environment is production.
158
+ * Reads `process.env.ENV` directly on purpose: a fail-closed safety gate must not
159
+ * depend on config wiring being correct.
160
+ */
161
+ onModuleInit() {
162
+ if (this.aiConfig.mock && process.env.ENV === "production") {
163
+ throw new Error("MOCK_AI must never run in production — refusing to start.");
164
+ }
142
165
  }
143
166
  get aiConfig() {
144
167
  return this.configService.get("ai");
@@ -186,6 +209,9 @@ let ModelService = class ModelService {
186
209
  * @throws {Error} If the configured LLM type is not supported
187
210
  */
188
211
  getLLM(params) {
212
+ if (this.aiConfig.mock) {
213
+ return new testing_1.FakeListChatModel({ responses: ["mock summary"] });
214
+ }
189
215
  const temperature = params?.temperature ?? 0.2;
190
216
  const cfg = this.getResolvedConfig(params?.modelWeight);
191
217
  const maxOutputTokens = params?.maxOutputTokens ?? cfg.maxOutputTokens;
@@ -213,8 +239,21 @@ let ModelService = class ModelService {
213
239
  * @throws {Error} If the configured LLM type is not supported
214
240
  */
215
241
  getVisionLLM(params) {
242
+ if (this.aiConfig.mock) {
243
+ return new testing_1.FakeListChatModel({ responses: ["mock summary"] });
244
+ }
216
245
  const temperature = params?.temperature ?? 0.1;
217
- return this.buildChatModel(this.visionConfig, { temperature, credentialFileTag: "vision" });
246
+ const visionConfig = this.visionConfig;
247
+ // Reasoning models (gpt-5 / o-series) accept `reasoning_effort` on the chat-completions
248
+ // call. Lower effort = far fewer reasoning tokens = much faster. Passed via modelKwargs
249
+ // (raw param) because the LangChain `reasoning` object is rejected by Azure chat-completions
250
+ // deployments. Ignored for non-reasoning models.
251
+ const visionModelLower = (visionConfig.model || "").toLowerCase();
252
+ const isReasoningVisionModel = visionModelLower.includes("gpt-5") || /(^|\/)o\d/.test(visionModelLower);
253
+ const modelKwargs = isReasoningVisionModel && visionConfig.reasoningEffort
254
+ ? { reasoning_effort: visionConfig.reasoningEffort }
255
+ : undefined;
256
+ return this.buildChatModel(visionConfig, { temperature, credentialFileTag: "vision", modelKwargs });
218
257
  }
219
258
  /**
220
259
  * Gets a configured LLM instance for audio operations based on the current config.
@@ -245,6 +284,7 @@ let ModelService = class ModelService {
245
284
  configuration: {
246
285
  baseURL: cfg.url || "http://localhost:8033/v1",
247
286
  },
287
+ ...(opts.modelKwargs ? { modelKwargs: opts.modelKwargs } : {}),
248
288
  };
249
289
  switch (cfg.provider) {
250
290
  case "llamacpp": {
@@ -313,6 +353,7 @@ let ModelService = class ModelService {
313
353
  azureOpenAIApiVersion: cfg.apiVersion,
314
354
  temperature,
315
355
  ...(maxOutputTokens ? { maxTokens: maxOutputTokens } : {}),
356
+ ...(llmConfig.modelKwargs ? { modelKwargs: llmConfig.modelKwargs } : {}),
316
357
  };
317
358
  return new openai_1.AzureChatOpenAI(azureParameters);
318
359
  }
@@ -342,7 +383,37 @@ let ModelService = class ModelService {
342
383
  ...(opts.disableThinking ? { modelKwargs: { ...(llmConfig.modelKwargs ?? {}), reasoning_effort: "none" } } : {}),
343
384
  });
344
385
  }
386
+ /**
387
+ * Returns the embedder used for vectorisation. Three layers, all additive over
388
+ * the raw provider embedder:
389
+ * 1. MOCK_AI → a zero-vector embedder (no provider call), sized to
390
+ * `embedder.dimensions` so downstream vector writes still have the right shape.
391
+ * 2. When `embedder.rateLimit` is configured AND the token bucket is wired,
392
+ * the provider embedder is wrapped in a RateLimitedEmbedder (distributed
393
+ * token bucket + local concurrency gate + 429 handling) and CACHED on the
394
+ * instance, so every caller shares one bucket/gate.
395
+ * 3. Otherwise the raw provider embedder is returned unchanged.
396
+ */
345
397
  getEmbedder() {
398
+ if (this.aiConfig.mock) {
399
+ const dim = this.aiConfig.embedder.dimensions;
400
+ const zero = () => new Array(dim).fill(0);
401
+ return {
402
+ embedDocuments: async (texts) => texts.map(zero),
403
+ embedQuery: async () => zero(),
404
+ };
405
+ }
406
+ const rateLimit = this.aiConfig.embedder.rateLimit;
407
+ if (rateLimit && this.bucket && this.logger) {
408
+ if (this.cachedEmbedder)
409
+ return this.cachedEmbedder;
410
+ const inner = this.buildInnerEmbedder();
411
+ this.cachedEmbedder = new rate_limited_embedder_1.RateLimitedEmbedder(inner, this.bucket, rateLimit, this.logger);
412
+ return this.cachedEmbedder;
413
+ }
414
+ return this.buildInnerEmbedder();
415
+ }
416
+ buildInnerEmbedder() {
346
417
  let response;
347
418
  switch (this.aiConfig.embedder.provider) {
348
419
  case "local":
@@ -413,11 +484,45 @@ let ModelService = class ModelService {
413
484
  getEmbedderDimensions() {
414
485
  return this.aiConfig.embedder.dimensions;
415
486
  }
487
+ /**
488
+ * Builds an OpenAI / Azure OpenAI SDK client for audio transcription. This is
489
+ * the SDK-based path (`audio.transcriptions.create`), distinct from
490
+ * AudioLLMService (chat-LLM / OpenAI-style /audio/transcriptions HTTP). Driven
491
+ * by the `transcriber` config block (TRANSCRIBER_* env vars).
492
+ */
493
+ getTranscriber() {
494
+ const transcriber = this.aiConfig.transcriber;
495
+ switch (transcriber.provider) {
496
+ case "openai":
497
+ return new openai_2.default({ apiKey: transcriber.apiKey });
498
+ case "azure":
499
+ return new openai_2.AzureOpenAI({
500
+ apiKey: transcriber.apiKey,
501
+ apiVersion: transcriber.apiVersion,
502
+ endpoint: transcriber.url,
503
+ deployment: transcriber.model,
504
+ });
505
+ default:
506
+ throw new Error(`Unsupported transcriber provider: ${transcriber.provider}`);
507
+ }
508
+ }
509
+ async transcribeAudio(params) {
510
+ return await this.getTranscriber().audio.transcriptions.create({
511
+ file: fs.createReadStream(params.filePath),
512
+ model: this.aiConfig.transcriber.model,
513
+ prompt: params.prompt,
514
+ response_format: "json",
515
+ });
516
+ }
416
517
  };
417
518
  exports.ModelService = ModelService;
418
519
  exports.ModelService = ModelService = __decorate([
419
520
  (0, common_1.Injectable)(),
521
+ __param(2, (0, common_1.Optional)()),
522
+ __param(3, (0, common_1.Optional)()),
420
523
  __metadata("design:paramtypes", [nestjs_cls_1.ClsService,
421
- config_1.ConfigService])
524
+ config_1.ConfigService,
525
+ embedder_token_bucket_service_1.EmbedderTokenBucketService,
526
+ logging_service_1.AppLoggingService])
422
527
  ], ModelService);
423
528
  //# sourceMappingURL=model.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.service.js","sourceRoot":"","sources":["../../../../src/core/llm/services/model.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.service.js","sourceRoot":"","sources":["../../../../src/core/llm/services/model.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { Embeddings } from "@langchain/core/embeddings";
2
+ import { ConfigAiInterface } from "../../../config/interfaces";
3
+ import { AppLoggingService } from "../../logging/services/logging.service";
4
+ import { EmbedderTokenBucketService } from "./embedder-token-bucket.service";
5
+ type RateLimitConfig = NonNullable<ConfigAiInterface["embedder"]["rateLimit"]>;
6
+ export declare class EmbedderBucketStarvedError extends Error {
7
+ readonly estTokens: number;
8
+ readonly waitMs: number;
9
+ constructor(estTokens: number, waitMs: number);
10
+ }
11
+ export declare class RateLimitedEmbedder extends Embeddings {
12
+ private readonly inner;
13
+ private readonly bucket;
14
+ private readonly rateLimit;
15
+ private readonly logger;
16
+ private readonly embedGate;
17
+ constructor(inner: Embeddings, bucket: EmbedderTokenBucketService, rateLimit: RateLimitConfig, logger: AppLoggingService);
18
+ embedQuery(text: string): Promise<number[]>;
19
+ embedDocuments(texts: string[]): Promise<number[][]>;
20
+ private embedSubBatchWithRetry;
21
+ private gatedEmbed;
22
+ private estimateTokens;
23
+ private splitIntoSubBatches;
24
+ private is429;
25
+ private isTokenLimitError;
26
+ private parseRetryAfter;
27
+ private getHeader;
28
+ private sleep;
29
+ }
30
+ export {};
31
+ //# sourceMappingURL=rate-limited-embedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limited-embedder.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/services/rate-limited-embedder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,KAAK,eAAe,GAAG,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AA6B/E,qBAAa,0BAA2B,SAAQ,KAAK;aAEjC,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;gBADd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM;CAKjC;AAED,qBAAa,mBAAoB,SAAQ,UAAU;IAI/C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAGnB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,0BAA0B,EAClC,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,iBAAiB;IAMtC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK3C,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAqB5C,sBAAsB;YA6CtB,UAAU;IASxB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RateLimitedEmbedder = exports.EmbedderBucketStarvedError = void 0;
4
+ const embeddings_1 = require("@langchain/core/embeddings");
5
+ // Caps how many embedding requests hit the provider at once across all jobs sharing
6
+ // this (singleton) embedder, set via EMBEDDER_MAX_CONCURRENT_REQUESTS (rateLimit config).
7
+ // Firing many requests concurrently just queues them server-side and inflates per-call
8
+ // latency; a small concurrency keeps calls fast without lowering overall throughput.
9
+ class Semaphore {
10
+ constructor(max) {
11
+ this.waiters = [];
12
+ this.slots = max;
13
+ }
14
+ async acquire() {
15
+ if (this.slots > 0) {
16
+ this.slots--;
17
+ return;
18
+ }
19
+ await new Promise((resolve) => this.waiters.push(resolve));
20
+ }
21
+ release() {
22
+ const next = this.waiters.shift();
23
+ if (next)
24
+ next();
25
+ else
26
+ this.slots++;
27
+ }
28
+ }
29
+ class EmbedderBucketStarvedError extends Error {
30
+ constructor(estTokens, waitMs) {
31
+ super(`Embedder rate-limit bucket starved: requested=${estTokens} waitMs=${waitMs}`);
32
+ this.estTokens = estTokens;
33
+ this.waitMs = waitMs;
34
+ this.name = "EmbedderBucketStarvedError";
35
+ }
36
+ }
37
+ exports.EmbedderBucketStarvedError = EmbedderBucketStarvedError;
38
+ class RateLimitedEmbedder extends embeddings_1.Embeddings {
39
+ constructor(inner, bucket, rateLimit, logger) {
40
+ super({});
41
+ this.inner = inner;
42
+ this.bucket = bucket;
43
+ this.rateLimit = rateLimit;
44
+ this.logger = logger;
45
+ this.embedGate = new Semaphore(this.rateLimit.maxConcurrentRequests);
46
+ }
47
+ async embedQuery(text) {
48
+ const [result] = await this.embedDocuments([text]);
49
+ return result;
50
+ }
51
+ async embedDocuments(texts) {
52
+ const estPerText = texts.map((t) => this.estimateTokens(t));
53
+ const subBatches = this.splitIntoSubBatches(texts, estPerText, this.rateLimit.maxBatchTokens);
54
+ if (subBatches.length > 1) {
55
+ const totalTokens = estPerText.reduce((a, b) => a + b, 0);
56
+ this.logger.log("embedder.batch_split", undefined, {
57
+ totalTokens,
58
+ subBatchCount: subBatches.length,
59
+ subBatchSizes: subBatches.map((sb) => sb.estTokens),
60
+ });
61
+ }
62
+ const results = new Array(texts.length);
63
+ for (const sb of subBatches) {
64
+ const vectors = await this.embedSubBatchWithRetry(sb.texts, sb.estTokens);
65
+ for (let i = 0; i < sb.indices.length; i++)
66
+ results[sb.indices[i]] = vectors[i];
67
+ }
68
+ return results;
69
+ }
70
+ async embedSubBatchWithRetry(subBatch, estTokens) {
71
+ let attempt = 0;
72
+ while (true) {
73
+ attempt++;
74
+ const consumeResult = await this.bucket.consume(estTokens, this.rateLimit.maxWaitMs);
75
+ if (!consumeResult.granted)
76
+ throw new EmbedderBucketStarvedError(estTokens, consumeResult.waitMs);
77
+ const t0 = Date.now();
78
+ try {
79
+ const result = await this.gatedEmbed(subBatch);
80
+ const lastCallMs = Date.now() - t0;
81
+ this.logger.debug("embedder.success", undefined, {
82
+ tokensConsumed: estTokens,
83
+ responseTimeMs: lastCallMs,
84
+ });
85
+ return result;
86
+ }
87
+ catch (e) {
88
+ if (this.isTokenLimitError(e)) {
89
+ this.logger.warn("embedder.token_limit", undefined, {
90
+ textCount: subBatch.length,
91
+ fallbackPath: "caller",
92
+ });
93
+ throw e;
94
+ }
95
+ if (this.is429(e) && attempt < this.rateLimit.maxAttempts) {
96
+ const retryAfterMs = this.parseRetryAfter(e) ?? 60_000;
97
+ this.logger.warn("embedder.429", undefined, { retryAfterMs, batchTokens: estTokens, attempt });
98
+ await this.bucket.refund(estTokens);
99
+ await this.sleep(retryAfterMs);
100
+ continue;
101
+ }
102
+ if (this.is429(e)) {
103
+ this.logger.error("embedder.429_exhausted", undefined, undefined, {
104
+ finalAttempt: attempt,
105
+ batchTokens: estTokens,
106
+ });
107
+ throw e;
108
+ }
109
+ throw e;
110
+ }
111
+ }
112
+ }
113
+ // Acquire a concurrency slot for the duration of the actual provider call only; retry
114
+ // backoff (in the caller) happens outside the gate so a sleeping retry never holds a slot.
115
+ async gatedEmbed(texts) {
116
+ await this.embedGate.acquire();
117
+ try {
118
+ return await this.inner.embedDocuments(texts);
119
+ }
120
+ finally {
121
+ this.embedGate.release();
122
+ }
123
+ }
124
+ estimateTokens(text) {
125
+ return Math.ceil(text.length / this.rateLimit.charsPerToken);
126
+ }
127
+ splitIntoSubBatches(texts, estPerText, cap) {
128
+ const subBatches = [];
129
+ let current = { texts: [], indices: [], estTokens: 0 };
130
+ for (let i = 0; i < texts.length; i++) {
131
+ const tokens = estPerText[i];
132
+ if (current.estTokens + tokens > cap && current.texts.length > 0) {
133
+ subBatches.push(current);
134
+ current = { texts: [], indices: [], estTokens: 0 };
135
+ }
136
+ current.texts.push(texts[i]);
137
+ current.indices.push(i);
138
+ current.estTokens += tokens;
139
+ }
140
+ if (current.texts.length > 0)
141
+ subBatches.push(current);
142
+ return subBatches;
143
+ }
144
+ is429(e) {
145
+ if (!e)
146
+ return false;
147
+ const status = e.status ?? e.statusCode;
148
+ if (status === 429)
149
+ return true;
150
+ const msg = e instanceof Error ? e.message : String(e);
151
+ return /rate.?limit/i.test(msg) && /tokens?\s*per\s*min/i.test(msg);
152
+ }
153
+ isTokenLimitError(e) {
154
+ const msg = e instanceof Error ? e.message : String(e);
155
+ return /maximum context length/i.test(msg) || /token\s*limit/i.test(msg);
156
+ }
157
+ parseRetryAfter(e) {
158
+ const headers = e.response?.headers;
159
+ if (headers) {
160
+ const ms = this.getHeader(headers, "retry-after-ms");
161
+ if (ms) {
162
+ const n = parseInt(ms, 10);
163
+ if (!isNaN(n))
164
+ return n;
165
+ }
166
+ const sec = this.getHeader(headers, "retry-after");
167
+ if (sec) {
168
+ const n = parseInt(sec, 10);
169
+ if (!isNaN(n))
170
+ return n * 1000;
171
+ }
172
+ }
173
+ const msg = e instanceof Error ? e.message : String(e);
174
+ const m = msg.match(/(?:try again in|retry after)\s+(\d+)\s*(ms|seconds?|s)\b/i);
175
+ if (m) {
176
+ const n = parseInt(m[1], 10);
177
+ const unit = m[2].toLowerCase();
178
+ return unit.startsWith("ms") ? n : n * 1000;
179
+ }
180
+ return null;
181
+ }
182
+ getHeader(headers, key) {
183
+ if (headers instanceof Map)
184
+ return headers.get(key) ?? null;
185
+ if (typeof headers.get === "function")
186
+ return headers.get(key);
187
+ return null;
188
+ }
189
+ sleep(ms) {
190
+ return new Promise((resolve) => setTimeout(resolve, ms));
191
+ }
192
+ }
193
+ exports.RateLimitedEmbedder = RateLimitedEmbedder;
194
+ //# sourceMappingURL=rate-limited-embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limited-embedder.js","sourceRoot":"","sources":["../../../../src/core/llm/services/rate-limited-embedder.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@ export declare class VisionLLMService {
23
23
  private readonly config;
24
24
  private readonly MAX_RETRIES;
25
25
  private readonly INITIAL_DELAY_MS;
26
+ private readonly CALL_TIMEOUT_MS;
26
27
  constructor(modelService: ModelService, config: ConfigService<BaseConfigInterface>);
27
28
  /**
28
29
  * Checks if an error is a rate limit (429) error
@@ -32,6 +33,10 @@ export declare class VisionLLMService {
32
33
  * Sleep for specified milliseconds
33
34
  */
34
35
  private sleep;
36
+ /**
37
+ * Wrap a promise with a timeout
38
+ */
39
+ private withTimeout;
35
40
  /**
36
41
  * Execute a function with exponential backoff retry on rate limit errors
37
42
  */
@@ -46,6 +51,17 @@ export declare class VisionLLMService {
46
51
  * Gemini models require schema sanitization (removal of $schema, $defs, etc.)
47
52
  */
48
53
  private isGeminiVisionModel;
54
+ /**
55
+ * Checks if the configured vision model is an Azure OpenAI model.
56
+ * Azure benefits from pre-converted JSON Schema to avoid Zod-to-OpenAI conversion issues.
57
+ */
58
+ private isAzureVisionModel;
59
+ /**
60
+ * Checks if the configured vision model is a GPT-5 model.
61
+ * GPT-5 models use OpenAI's Responses API and reject legacy parameters
62
+ * like temperature != 1.
63
+ */
64
+ private isGPT5VisionModel;
49
65
  /**
50
66
  * Fallback method to call the LLM without structured output.
51
67
  * Used when structured output parsing fails.
@@ -1 +1 @@
1
- {"version":3,"file":"vision.llm.service.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/services/vision.llm.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAqB,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAIhE;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,UAAU,gBAAgB,CAAC,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBACa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAK;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;gBAGtB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC;IAG7D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;YACW,SAAS;IAyBvB;;;OAGG;YACW,kBAAkB;IAahC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;;;;;;;OAQG;YACW,2BAA2B;IA0CzC;;;;;;;;;;;;;;;;;;;OAmBG;IACG,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG;QAAE,UAAU,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CA2G3G"}
1
+ {"version":3,"file":"vision.llm.service.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/services/vision.llm.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAqB,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAIhE;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,UAAU,gBAAgB,CAAC,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBACa,gBAAgB;IAMzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAK;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;gBAGvB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC;IAG7D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;YACW,SAAS;IAyBvB;;;OAGG;YACW,kBAAkB;IAahC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;;;;;;OAQG;YACW,2BAA2B;IAgDzC;;;;;;;;;;;;;;;;;;;OAmBG;IACG,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG;QAAE,UAAU,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CAyH3G"}
@@ -33,6 +33,7 @@ let VisionLLMService = class VisionLLMService {
33
33
  this.config = config;
34
34
  this.MAX_RETRIES = 5;
35
35
  this.INITIAL_DELAY_MS = 1000;
36
+ this.CALL_TIMEOUT_MS = 120000; // 120 second timeout for vision calls
36
37
  }
37
38
  /**
38
39
  * Checks if an error is a rate limit (429) error
@@ -53,6 +54,15 @@ let VisionLLMService = class VisionLLMService {
53
54
  sleep(ms) {
54
55
  return new Promise((resolve) => setTimeout(resolve, ms));
55
56
  }
57
+ /**
58
+ * Wrap a promise with a timeout
59
+ */
60
+ withTimeout(promise, ms, operation) {
61
+ return Promise.race([
62
+ promise,
63
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`${operation} timed out after ${ms}ms`)), ms)),
64
+ ]);
65
+ }
56
66
  /**
57
67
  * Execute a function with exponential backoff retry on rate limit errors
58
68
  */
@@ -99,6 +109,24 @@ let VisionLLMService = class VisionLLMService {
99
109
  const modelLower = visionConfig.model.toLowerCase();
100
110
  return modelLower.startsWith("gemini") || modelLower.includes("/gemini");
101
111
  }
112
+ /**
113
+ * Checks if the configured vision model is an Azure OpenAI model.
114
+ * Azure benefits from pre-converted JSON Schema to avoid Zod-to-OpenAI conversion issues.
115
+ */
116
+ isAzureVisionModel() {
117
+ const visionConfig = this.config.get("ai").vision;
118
+ return visionConfig.provider === "azure";
119
+ }
120
+ /**
121
+ * Checks if the configured vision model is a GPT-5 model.
122
+ * GPT-5 models use OpenAI's Responses API and reject legacy parameters
123
+ * like temperature != 1.
124
+ */
125
+ isGPT5VisionModel() {
126
+ const visionConfig = this.config.get("ai").vision;
127
+ const modelLower = visionConfig.model.toLowerCase();
128
+ return modelLower.includes("gpt-5");
129
+ }
102
130
  /**
103
131
  * Fallback method to call the LLM without structured output.
104
132
  * Used when structured output parsing fails.
@@ -109,12 +137,14 @@ let VisionLLMService = class VisionLLMService {
109
137
  * @returns Promise with parsed response and raw content
110
138
  */
111
139
  async callWithoutStructuredOutput(params, message) {
140
+ const isGPT5 = this.isGPT5VisionModel();
141
+ const effectiveTemperature = isGPT5 ? 1 : (params.temperature ?? 0.1);
112
142
  const baseModel = this.modelService.getVisionLLM({
113
- temperature: params.temperature ?? 0.1,
143
+ temperature: effectiveTemperature,
114
144
  });
115
145
  try {
116
146
  // Call without structured output - the model will return raw text
117
- const response = await baseModel.invoke([message]);
147
+ const response = await this.withTimeout(baseModel.invoke([message]), this.CALL_TIMEOUT_MS, "Vision LLM fallback call");
118
148
  const rawContent = typeof response.content === "string" ? response.content : JSON.stringify(response.content);
119
149
  // Extract JSON from response (handle markdown code blocks)
120
150
  const jsonMatch = rawContent.match(/```json\n?([\s\S]*?)\n?```/) || rawContent.match(/\{[\s\S]*\}/);
@@ -171,16 +201,20 @@ let VisionLLMService = class VisionLLMService {
171
201
  type: "image_url",
172
202
  image_url: {
173
203
  url: params.image,
204
+ detail: "high",
174
205
  },
175
206
  },
176
207
  ],
177
208
  });
178
209
  try {
210
+ const isGPT5 = this.isGPT5VisionModel();
211
+ const effectiveTemperature = isGPT5 ? 1 : (params.temperature ?? 0.1);
179
212
  const baseModel = this.modelService.getVisionLLM({
180
- temperature: params.temperature ?? 0.1,
213
+ temperature: effectiveTemperature,
181
214
  });
182
- // Check if Gemini model needs schema sanitization (remove $schema, $defs, etc.)
215
+ // Check if provider needs schema conversion/sanitization
183
216
  const needsGeminiSanitization = this.isGeminiVisionModel();
217
+ const isAzure = this.isAzureVisionModel();
184
218
  let structuredLlm;
185
219
  if (needsGeminiSanitization) {
186
220
  const jsonSchema = (0, schema_utils_1.convertZodToJsonSchema)(params.outputSchema);
@@ -189,13 +223,20 @@ let VisionLLMService = class VisionLLMService {
189
223
  includeRaw: true,
190
224
  });
191
225
  }
226
+ else if (isAzure || isGPT5) {
227
+ // Azure/GPT-5: use pre-converted JSON Schema to avoid Zod-to-OpenAI conversion issues
228
+ const jsonSchema = (0, schema_utils_1.convertZodToJsonSchema)(params.outputSchema);
229
+ structuredLlm = baseModel.withStructuredOutput(jsonSchema, {
230
+ includeRaw: true,
231
+ });
232
+ }
192
233
  else {
193
234
  structuredLlm = baseModel.withStructuredOutput(params.outputSchema, {
194
235
  includeRaw: true,
195
236
  });
196
237
  }
197
238
  const response = await this.withRetry(async () => {
198
- return (await structuredLlm.invoke([message]));
239
+ return (await this.withTimeout(structuredLlm.invoke([message]), this.CALL_TIMEOUT_MS, "Vision LLM call"));
199
240
  });
200
241
  // Handle null parsed response with fallback JSON parsing
201
242
  if (!response.parsed) {