@carlonicora/nestjs-neo4jsonapi 1.30.0 → 1.31.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.
@@ -11,7 +11,21 @@ interface VisionCallParams<T> {
11
11
  }
12
12
  export declare class VisionLLMService {
13
13
  private readonly modelService;
14
+ private readonly MAX_RETRIES;
15
+ private readonly INITIAL_DELAY_MS;
14
16
  constructor(modelService: ModelService);
17
+ /**
18
+ * Checks if an error is a rate limit (429) error
19
+ */
20
+ private isRateLimitError;
21
+ /**
22
+ * Sleep for specified milliseconds
23
+ */
24
+ private sleep;
25
+ /**
26
+ * Execute a function with exponential backoff retry on rate limit errors
27
+ */
28
+ private withRetry;
15
29
  /**
16
30
  * Fetches an image from a URL and converts it to a base64 data URL.
17
31
  * Required because OpenRouter cannot access local/private URLs.
@@ -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,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAE9B;;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;AAgCD,qBACa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAEvD;;;OAGG;YACW,kBAAkB;IAahC;;;;;;;;;;;;;;;;;;OAkBG;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;CA4C3G"}
1
+ {"version":3,"file":"vision.llm.service.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/services/vision.llm.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAE9B;;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;AAgCD,qBACa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,YAAY;IAHzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAK;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;gBAEZ,YAAY,EAAE,YAAY;IAEvD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;YACW,SAAS;IA6BvB;;;OAGG;YACW,kBAAkB;IAahC;;;;;;;;;;;;;;;;;;OAkBG;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;CA8C3G"}
@@ -22,6 +22,51 @@ function isValidRaw(raw) {
22
22
  let VisionLLMService = class VisionLLMService {
23
23
  constructor(modelService) {
24
24
  this.modelService = modelService;
25
+ this.MAX_RETRIES = 5;
26
+ this.INITIAL_DELAY_MS = 1000;
27
+ }
28
+ /**
29
+ * Checks if an error is a rate limit (429) error
30
+ */
31
+ isRateLimitError(error) {
32
+ if (error instanceof Error) {
33
+ const message = error.message.toLowerCase();
34
+ return (message.includes("429") ||
35
+ message.includes("rate limit") ||
36
+ message.includes("resource exhausted") ||
37
+ message.includes("too many requests"));
38
+ }
39
+ return false;
40
+ }
41
+ /**
42
+ * Sleep for specified milliseconds
43
+ */
44
+ sleep(ms) {
45
+ return new Promise((resolve) => setTimeout(resolve, ms));
46
+ }
47
+ /**
48
+ * Execute a function with exponential backoff retry on rate limit errors
49
+ */
50
+ async withRetry(fn) {
51
+ let lastError;
52
+ for (let attempt = 0; attempt < this.MAX_RETRIES; attempt++) {
53
+ try {
54
+ return await fn();
55
+ }
56
+ catch (error) {
57
+ lastError = error instanceof Error ? error : new Error(String(error));
58
+ if (!this.isRateLimitError(error) || attempt === this.MAX_RETRIES - 1) {
59
+ throw lastError;
60
+ }
61
+ // Exponential backoff with jitter: 1s, 2s, 4s, 8s, 16s + random 0-500ms
62
+ const baseDelay = this.INITIAL_DELAY_MS * Math.pow(2, attempt);
63
+ const jitter = Math.random() * 500;
64
+ const delay = baseDelay + jitter;
65
+ console.log(`[VisionLLMService] Rate limited (attempt ${attempt + 1}/${this.MAX_RETRIES}), retrying in ${Math.round(delay)}ms...`);
66
+ await this.sleep(delay);
67
+ }
68
+ }
69
+ throw lastError ?? new Error("Max retries exceeded");
25
70
  }
26
71
  /**
27
72
  * Fetches an image from a URL and converts it to a base64 data URL.
@@ -78,7 +123,9 @@ let VisionLLMService = class VisionLLMService {
78
123
  },
79
124
  ],
80
125
  });
81
- const response = (await structuredLlm.invoke([message]));
126
+ const response = await this.withRetry(async () => {
127
+ return (await structuredLlm.invoke([message]));
128
+ });
82
129
  // Extract token usage with type guard - same pattern as LLMService
83
130
  const raw = isValidRaw(response.raw) ? response.raw : undefined;
84
131
  const input = raw?.usage_metadata?.input_tokens ?? 0;
@@ -1 +1 @@
1
- {"version":3,"file":"vision.llm.service.js","sourceRoot":"","sources":["../../../../src/core/llm/services/vision.llm.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uDAAwD;AACxD,2CAA4C;AAC5C,oEAAgE;AA4BhE;;GAEG;AACH,SAAS,UAAU,CAAC,GAAY;IAC9B,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC;AACjD,CAAC;AAWM,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAE3D;;;OAGG;IACK,KAAK,CAAC,kBAAkB,CAAC,KAAa;QAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC;QACzE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE3D,OAAO,QAAQ,WAAW,WAAW,MAAM,EAAE,CAAC;IAChD,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,IAAI,CAAI,MAA2B;QACvC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;gBACzC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,GAAG;aACvC,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,EAAE;gBACxE,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,uBAAY,CAAC;gBAC/B,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM,CAAC,YAAY;qBAC1B;oBACD;wBACE,IAAI,EAAE,WAAW;wBACjB,SAAS,EAAE;4BACT,GAAG,EAAE,MAAM,CAAC,KAAK;yBAClB;qBACF;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAA2C,CAAC;YAEnG,mEAAmE;YACnE,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,MAAM,KAAK,GAAG,GAAG,EAAE,cAAc,EAAE,YAAY,IAAI,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,GAAG,EAAE,cAAc,EAAE,aAAa,IAAI,CAAC,CAAC;YAEvD,OAAO;gBACL,GAAI,QAAQ,CAAC,MAAY;gBACzB,UAAU,EAAE;oBACV,KAAK;oBACL,MAAM;iBACP;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;CACF,CAAA;AAnFY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCAEgC,4BAAY;GAD5C,gBAAgB,CAmF5B"}
1
+ {"version":3,"file":"vision.llm.service.js","sourceRoot":"","sources":["../../../../src/core/llm/services/vision.llm.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carlonicora/nestjs-neo4jsonapi",
3
- "version": "1.30.0",
3
+ "version": "1.31.0",
4
4
  "description": "NestJS foundation package with JSON:API, Neo4j, Redis, LangChain agents, and common utilities",
5
5
  "author": "Carlo Nicora",
6
6
  "license": "GPL-3.0-or-later",