@loonylabs/llm-middleware 2.21.0 → 2.23.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 (67) hide show
  1. package/README.md +4 -0
  2. package/dist/middleware/services/llm/llm.service.d.ts +9 -3
  3. package/dist/middleware/services/llm/llm.service.d.ts.map +1 -1
  4. package/dist/middleware/services/llm/llm.service.js +2 -2
  5. package/dist/middleware/services/llm/llm.service.js.map +1 -1
  6. package/dist/middleware/services/llm/providers/anthropic-provider.d.ts +2 -1
  7. package/dist/middleware/services/llm/providers/anthropic-provider.d.ts.map +1 -1
  8. package/dist/middleware/services/llm/providers/anthropic-provider.js +23 -5
  9. package/dist/middleware/services/llm/providers/anthropic-provider.js.map +1 -1
  10. package/dist/middleware/services/llm/providers/base-llm-provider.d.ts +3 -2
  11. package/dist/middleware/services/llm/providers/base-llm-provider.d.ts.map +1 -1
  12. package/dist/middleware/services/llm/providers/base-llm-provider.js.map +1 -1
  13. package/dist/middleware/services/llm/providers/gemini/gemini-base.provider.d.ts +6 -2
  14. package/dist/middleware/services/llm/providers/gemini/gemini-base.provider.d.ts.map +1 -1
  15. package/dist/middleware/services/llm/providers/gemini/gemini-base.provider.js +35 -17
  16. package/dist/middleware/services/llm/providers/gemini/gemini-base.provider.js.map +1 -1
  17. package/dist/middleware/services/llm/providers/gemini/index.d.ts +1 -1
  18. package/dist/middleware/services/llm/providers/gemini/index.d.ts.map +1 -1
  19. package/dist/middleware/services/llm/providers/gemini/index.js.map +1 -1
  20. package/dist/middleware/services/llm/providers/gemini/vertex-ai.provider.d.ts +23 -1
  21. package/dist/middleware/services/llm/providers/gemini/vertex-ai.provider.d.ts.map +1 -1
  22. package/dist/middleware/services/llm/providers/gemini/vertex-ai.provider.js +98 -2
  23. package/dist/middleware/services/llm/providers/gemini/vertex-ai.provider.js.map +1 -1
  24. package/dist/middleware/services/llm/providers/ollama-provider.d.ts +4 -3
  25. package/dist/middleware/services/llm/providers/ollama-provider.d.ts.map +1 -1
  26. package/dist/middleware/services/llm/providers/ollama-provider.js +8 -4
  27. package/dist/middleware/services/llm/providers/ollama-provider.js.map +1 -1
  28. package/dist/middleware/services/llm/providers/requesty-provider.d.ts +2 -1
  29. package/dist/middleware/services/llm/providers/requesty-provider.d.ts.map +1 -1
  30. package/dist/middleware/services/llm/providers/requesty-provider.js +23 -5
  31. package/dist/middleware/services/llm/providers/requesty-provider.js.map +1 -1
  32. package/dist/middleware/services/llm/types/anthropic.types.d.ts +21 -2
  33. package/dist/middleware/services/llm/types/anthropic.types.d.ts.map +1 -1
  34. package/dist/middleware/services/llm/types/common.types.d.ts +2 -0
  35. package/dist/middleware/services/llm/types/common.types.d.ts.map +1 -1
  36. package/dist/middleware/services/llm/types/common.types.js.map +1 -1
  37. package/dist/middleware/services/llm/types/gemini.types.d.ts +9 -1
  38. package/dist/middleware/services/llm/types/gemini.types.d.ts.map +1 -1
  39. package/dist/middleware/services/llm/types/index.d.ts +1 -0
  40. package/dist/middleware/services/llm/types/index.d.ts.map +1 -1
  41. package/dist/middleware/services/llm/types/index.js +2 -0
  42. package/dist/middleware/services/llm/types/index.js.map +1 -1
  43. package/dist/middleware/services/llm/types/multimodal.types.d.ts +47 -0
  44. package/dist/middleware/services/llm/types/multimodal.types.d.ts.map +1 -0
  45. package/dist/middleware/services/llm/types/multimodal.types.js +14 -0
  46. package/dist/middleware/services/llm/types/multimodal.types.js.map +1 -0
  47. package/dist/middleware/services/llm/types/requesty.types.d.ts +14 -1
  48. package/dist/middleware/services/llm/types/requesty.types.d.ts.map +1 -1
  49. package/dist/middleware/services/llm/types/vertex-ai.types.d.ts +22 -0
  50. package/dist/middleware/services/llm/types/vertex-ai.types.d.ts.map +1 -1
  51. package/dist/middleware/services/llm/utils/index.d.ts +1 -0
  52. package/dist/middleware/services/llm/utils/index.d.ts.map +1 -1
  53. package/dist/middleware/services/llm/utils/index.js +1 -0
  54. package/dist/middleware/services/llm/utils/index.js.map +1 -1
  55. package/dist/middleware/services/llm/utils/multimodal.utils.d.ts +56 -0
  56. package/dist/middleware/services/llm/utils/multimodal.utils.d.ts.map +1 -0
  57. package/dist/middleware/services/llm/utils/multimodal.utils.js +119 -0
  58. package/dist/middleware/services/llm/utils/multimodal.utils.js.map +1 -0
  59. package/dist/middleware/services/llm/utils/retry.utils.d.ts +7 -1
  60. package/dist/middleware/services/llm/utils/retry.utils.d.ts.map +1 -1
  61. package/dist/middleware/services/llm/utils/retry.utils.js +6 -1
  62. package/dist/middleware/services/llm/utils/retry.utils.js.map +1 -1
  63. package/dist/middleware/usecases/base/base-ai.usecase.d.ts +15 -0
  64. package/dist/middleware/usecases/base/base-ai.usecase.d.ts.map +1 -1
  65. package/dist/middleware/usecases/base/base-ai.usecase.js +36 -9
  66. package/dist/middleware/usecases/base/base-ai.usecase.js.map +1 -1
  67. package/package.json +2 -1
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Multimodal content types for vision/image input support.
3
+ * Enables sending images alongside text to LLM providers.
4
+ *
5
+ * Design decisions:
6
+ * - Base64 only (no URLs) — Gemini doesn't support direct URLs, base64 is universal
7
+ * - type: 'image' (not 'image_url') — follows Vercel AI SDK / Anthropic convention
8
+ * - Explicit mimeType — required by Gemini and Anthropic, safer than inference
9
+ *
10
+ * @since 2.22.0
11
+ */
12
+ /**
13
+ * Text content part for multimodal messages.
14
+ */
15
+ export interface TextContentPart {
16
+ type: 'text';
17
+ text: string;
18
+ }
19
+ /**
20
+ * Image content part for multimodal messages.
21
+ * Uses base64-encoded image data (without data-URI prefix).
22
+ */
23
+ export interface ImageContentPart {
24
+ type: 'image';
25
+ /** Base64-encoded image data (without data: URI prefix) */
26
+ data: string;
27
+ /** MIME type of the image */
28
+ mimeType: 'image/jpeg' | 'image/png' | 'image/webp' | 'image/gif';
29
+ /**
30
+ * Optional resolution/detail hint.
31
+ * - OpenAI: maps to `detail` parameter (low/high/auto)
32
+ * - Gemini: could map to media_resolution (not currently used)
33
+ * - Anthropic: ignored (no equivalent)
34
+ */
35
+ detail?: 'low' | 'high' | 'auto';
36
+ }
37
+ /**
38
+ * Union type for all content part types.
39
+ * Extensible for future content types (audio, video, etc.).
40
+ */
41
+ export type ContentPart = TextContentPart | ImageContentPart;
42
+ /**
43
+ * Multimodal content: either a plain string (backward-compatible) or an array of content parts.
44
+ * When a string is provided, it is internally normalized to [{ type: 'text', text: string }].
45
+ */
46
+ export type MultimodalContent = string | ContentPart[];
47
+ //# sourceMappingURL=multimodal.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multimodal.types.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/types/multimodal.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;IAClE;;;;;OAKG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAE7D;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Multimodal content types for vision/image input support.
4
+ * Enables sending images alongside text to LLM providers.
5
+ *
6
+ * Design decisions:
7
+ * - Base64 only (no URLs) — Gemini doesn't support direct URLs, base64 is universal
8
+ * - type: 'image' (not 'image_url') — follows Vercel AI SDK / Anthropic convention
9
+ * - Explicit mimeType — required by Gemini and Anthropic, safer than inference
10
+ *
11
+ * @since 2.22.0
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ //# sourceMappingURL=multimodal.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multimodal.types.js","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/types/multimodal.types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG"}
@@ -16,6 +16,19 @@ export interface RequestyRequestOptions extends CommonLLMOptions {
16
16
  * extended values ('min', 'max', 'none').
17
17
  */
18
18
  export type RequestyReasoningEffort = 'none' | 'min' | 'low' | 'medium' | 'high' | 'max';
19
+ /**
20
+ * OpenAI-compatible content part for multimodal messages
21
+ */
22
+ export type RequestyContentPart = {
23
+ type: 'text';
24
+ text: string;
25
+ } | {
26
+ type: 'image_url';
27
+ image_url: {
28
+ url: string;
29
+ detail?: 'low' | 'high' | 'auto';
30
+ };
31
+ };
19
32
  /**
20
33
  * OpenAI-compatible request format for Requesty API
21
34
  */
@@ -23,7 +36,7 @@ export interface RequestyAPIRequest {
23
36
  model: string;
24
37
  messages: Array<{
25
38
  role: 'system' | 'user' | 'assistant';
26
- content: string;
39
+ content: string | RequestyContentPart[];
27
40
  }>;
28
41
  temperature?: number;
29
42
  max_tokens?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"requesty.types.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/types/requesty.types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAmB,MAAM,gBAAgB,CAAC;AAEtF;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE;YACP,IAAI,EAAE,WAAW,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,aAAa,EAAE,MAAM,GAAG,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAAC;KAC5D,CAAC,CAAC;IACH,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"requesty.types.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/types/requesty.types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAmB,MAAM,gBAAgB,CAAC;AAEtF;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;QACtC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAAC;KACzC,CAAC,CAAC;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE;YACP,IAAI,EAAE,WAAW,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,aAAa,EAAE,MAAM,GAAG,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAAC;KAC5D,CAAC,CAAC;IACH,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
@@ -36,6 +36,28 @@ export interface VertexAIRequestOptions extends GeminiRequestOptions {
36
36
  /**
37
37
  * Service account JSON structure (partial, key fields only).
38
38
  */
39
+ /**
40
+ * Configuration for region rotation on quota errors (429 / Resource Exhausted).
41
+ *
42
+ * When Vertex AI returns a quota error, the middleware rotates through the
43
+ * configured regions instead of retrying the same region. This is useful
44
+ * when Dynamic Shared Quota is temporarily exhausted in a single region.
45
+ *
46
+ * The total retry budget (from RetryConfig.maxRetries) is shared across
47
+ * all regions — region rotation does NOT multiply the retry count.
48
+ */
49
+ export interface RegionRotationConfig {
50
+ /** Ordered list of regions to try. First entry = primary region. */
51
+ regions: VertexAIRegion[];
52
+ /** Last-resort region after all regions exhausted (typically 'global'). */
53
+ fallback: VertexAIRegion;
54
+ /**
55
+ * If true: when maxRetries is exhausted before reaching the fallback,
56
+ * one final bonus attempt on the fallback region is made.
57
+ * @default true
58
+ */
59
+ alwaysTryFallback?: boolean;
60
+ }
39
61
  export interface ServiceAccountCredentials {
40
62
  type: 'service_account';
41
63
  project_id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"vertex-ai.types.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/types/vertex-ai.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAEtB,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,eAAe,GACf,iBAAiB,GACjB,mBAAmB,GAEnB,aAAa,GACb,UAAU,GAEV,QAAQ,CAAC;AAEb;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;IAExB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B,EAAE,MAAM,CAAC;IACpC,oBAAoB,EAAE,MAAM,CAAC;CAC9B"}
1
+ {"version":3,"file":"vertex-ai.types.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/types/vertex-ai.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAEtB,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,eAAe,GACf,iBAAiB,GACjB,mBAAmB,GAEnB,aAAa,GACb,UAAU,GAEV,QAAQ,CAAC;AAEb;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;IAExB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,OAAO,EAAE,cAAc,EAAE,CAAC;IAE1B,2EAA2E;IAC3E,QAAQ,EAAE,cAAc,CAAC;IAEzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B,EAAE,MAAM,CAAC;IACpC,oBAAoB,EAAE,MAAM,CAAC;CAC9B"}
@@ -1,4 +1,5 @@
1
1
  export * from './debug-llm.utils';
2
2
  export * from './text-analysis.utils';
3
3
  export * from './retry.utils';
4
+ export * from './multimodal.utils';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./debug-llm.utils"), exports);
18
18
  __exportStar(require("./text-analysis.utils"), exports);
19
19
  __exportStar(require("./retry.utils"), exports);
20
+ __exportStar(require("./multimodal.utils"), exports);
20
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,wDAAsC;AACtC,gDAA8B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,wDAAsC;AACtC,gDAA8B;AAC9B,qDAAmC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Utility functions for multimodal content handling.
3
+ * Provides normalization, debug formatting, and inspection helpers.
4
+ *
5
+ * @since 2.22.0
6
+ */
7
+ import { MultimodalContent, ContentPart } from '../types/multimodal.types';
8
+ /**
9
+ * Normalizes MultimodalContent to ContentPart[].
10
+ * Converts a plain string to a single TextContentPart array.
11
+ *
12
+ * @param content - String or ContentPart array
13
+ * @returns Normalized ContentPart array
14
+ */
15
+ export declare function normalizeContent(content: MultimodalContent): ContentPart[];
16
+ /**
17
+ * Extracts the combined text content from MultimodalContent.
18
+ * Only includes text parts, ignores images.
19
+ *
20
+ * @param content - String or ContentPart array
21
+ * @returns Combined text from all text parts
22
+ */
23
+ export declare function extractTextContent(content: MultimodalContent): string;
24
+ /**
25
+ * Creates a debug-safe string representation of MultimodalContent.
26
+ * Images are replaced with placeholder strings showing type and size.
27
+ * This prevents base64 blobs from appearing in logs.
28
+ *
29
+ * @param content - String or ContentPart array
30
+ * @returns Debug-safe string representation
31
+ */
32
+ export declare function contentToDebugString(content: MultimodalContent): string;
33
+ /**
34
+ * Returns the effective "length" of MultimodalContent for metrics/logging.
35
+ * For strings, returns string length. For content parts, returns
36
+ * the debug string length (images counted as placeholder length).
37
+ *
38
+ * @param content - String or ContentPart array
39
+ * @returns Character length suitable for metrics
40
+ */
41
+ export declare function contentLength(content: MultimodalContent): number;
42
+ /**
43
+ * Checks whether MultimodalContent contains any image parts.
44
+ *
45
+ * @param content - String or ContentPart array
46
+ * @returns true if content contains at least one image part
47
+ */
48
+ export declare function hasImages(content: MultimodalContent): boolean;
49
+ /**
50
+ * Counts the number of image parts in MultimodalContent.
51
+ *
52
+ * @param content - String or ContentPart array
53
+ * @returns Number of image parts
54
+ */
55
+ export declare function countImages(content: MultimodalContent): number;
56
+ //# sourceMappingURL=multimodal.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multimodal.utils.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/utils/multimodal.utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAoB,MAAM,2BAA2B,CAAC;AAE7F;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,WAAW,EAAE,CAK1E;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAQrE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAgBvE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAKhE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAK7D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAK9D"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * Utility functions for multimodal content handling.
4
+ * Provides normalization, debug formatting, and inspection helpers.
5
+ *
6
+ * @since 2.22.0
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.normalizeContent = normalizeContent;
10
+ exports.extractTextContent = extractTextContent;
11
+ exports.contentToDebugString = contentToDebugString;
12
+ exports.contentLength = contentLength;
13
+ exports.hasImages = hasImages;
14
+ exports.countImages = countImages;
15
+ /**
16
+ * Normalizes MultimodalContent to ContentPart[].
17
+ * Converts a plain string to a single TextContentPart array.
18
+ *
19
+ * @param content - String or ContentPart array
20
+ * @returns Normalized ContentPart array
21
+ */
22
+ function normalizeContent(content) {
23
+ if (typeof content === 'string') {
24
+ return [{ type: 'text', text: content }];
25
+ }
26
+ return content;
27
+ }
28
+ /**
29
+ * Extracts the combined text content from MultimodalContent.
30
+ * Only includes text parts, ignores images.
31
+ *
32
+ * @param content - String or ContentPart array
33
+ * @returns Combined text from all text parts
34
+ */
35
+ function extractTextContent(content) {
36
+ if (typeof content === 'string') {
37
+ return content;
38
+ }
39
+ return content
40
+ .filter((part) => part.type === 'text')
41
+ .map(part => part.text)
42
+ .join('\n');
43
+ }
44
+ /**
45
+ * Creates a debug-safe string representation of MultimodalContent.
46
+ * Images are replaced with placeholder strings showing type and size.
47
+ * This prevents base64 blobs from appearing in logs.
48
+ *
49
+ * @param content - String or ContentPart array
50
+ * @returns Debug-safe string representation
51
+ */
52
+ function contentToDebugString(content) {
53
+ if (typeof content === 'string') {
54
+ return content;
55
+ }
56
+ return content
57
+ .map(part => {
58
+ if (part.type === 'text') {
59
+ return part.text;
60
+ }
61
+ // Calculate approximate size of base64 data
62
+ const sizeBytes = Math.ceil(part.data.length * 3 / 4);
63
+ const sizeStr = formatByteSize(sizeBytes);
64
+ return `[IMAGE: ${part.mimeType}, ${sizeStr}]`;
65
+ })
66
+ .join('\n');
67
+ }
68
+ /**
69
+ * Returns the effective "length" of MultimodalContent for metrics/logging.
70
+ * For strings, returns string length. For content parts, returns
71
+ * the debug string length (images counted as placeholder length).
72
+ *
73
+ * @param content - String or ContentPart array
74
+ * @returns Character length suitable for metrics
75
+ */
76
+ function contentLength(content) {
77
+ if (typeof content === 'string') {
78
+ return content.length;
79
+ }
80
+ return contentToDebugString(content).length;
81
+ }
82
+ /**
83
+ * Checks whether MultimodalContent contains any image parts.
84
+ *
85
+ * @param content - String or ContentPart array
86
+ * @returns true if content contains at least one image part
87
+ */
88
+ function hasImages(content) {
89
+ if (typeof content === 'string') {
90
+ return false;
91
+ }
92
+ return content.some(part => part.type === 'image');
93
+ }
94
+ /**
95
+ * Counts the number of image parts in MultimodalContent.
96
+ *
97
+ * @param content - String or ContentPart array
98
+ * @returns Number of image parts
99
+ */
100
+ function countImages(content) {
101
+ if (typeof content === 'string') {
102
+ return 0;
103
+ }
104
+ return content.filter(part => part.type === 'image').length;
105
+ }
106
+ /**
107
+ * Formats a byte size into a human-readable string.
108
+ * @internal
109
+ */
110
+ function formatByteSize(bytes) {
111
+ if (bytes < 1024) {
112
+ return `${bytes}B`;
113
+ }
114
+ if (bytes < 1024 * 1024) {
115
+ return `${(bytes / 1024).toFixed(1)}KB`;
116
+ }
117
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
118
+ }
119
+ //# sourceMappingURL=multimodal.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multimodal.utils.js","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/utils/multimodal.utils.ts"],"names":[],"mappings":"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"}
@@ -41,12 +41,18 @@ export declare function isRetryableError(error: any): boolean;
41
41
  * Calculates the delay for a given retry attempt with optional jitter.
42
42
  */
43
43
  export declare function calculateDelay(attempt: number, config: Required<RetryConfig>): number;
44
+ /** Options for retryWithBackoff beyond the retry config. */
45
+ export interface RetryHooks {
46
+ /** Called before each retry. Use to adjust state (e.g., rotate regions on quota errors). */
47
+ onRetry?: (error: any, attempt: number) => void;
48
+ }
44
49
  /**
45
50
  * Executes an async function with exponential backoff retry on transient errors.
46
51
  *
47
52
  * @param fn - The async function to execute (typically an axios call)
48
53
  * @param context - Logging context (e.g. provider class name)
49
54
  * @param config - Retry configuration (merged with defaults)
55
+ * @param hooks - Optional hooks (e.g., onRetry for region rotation)
50
56
  * @returns The result of fn()
51
57
  * @throws The last error if all retries are exhausted
52
58
  *
@@ -59,5 +65,5 @@ export declare function calculateDelay(attempt: number, config: Required<RetryCo
59
65
  * );
60
66
  * ```
61
67
  */
62
- export declare function retryWithBackoff<T>(fn: () => Promise<T>, context: string, config?: RetryConfig): Promise<T>;
68
+ export declare function retryWithBackoff<T>(fn: () => Promise<T>, context: string, config?: RetryConfig, hooks?: RetryHooks): Promise<T>;
63
69
  //# sourceMappingURL=retry.utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry.utils.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/utils/retry.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qEAAqE;AACrE,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,WAAW,CAOtD,CAAC;AAgBF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAoBpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC5B,MAAM,CAUR;AA+CD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC,CAmDZ"}
1
+ {"version":3,"file":"retry.utils.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/utils/retry.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qEAAqE;AACrE,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,WAAW,CAOtD,CAAC;AAgBF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAoBpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC5B,MAAM,CAUR;AA+CD,4DAA4D;AAC5D,MAAM,WAAW,UAAU;IACzB,4FAA4F;IAC5F,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,CAAC,CAAC,CAwDZ"}
@@ -124,6 +124,7 @@ function sleep(ms) {
124
124
  * @param fn - The async function to execute (typically an axios call)
125
125
  * @param context - Logging context (e.g. provider class name)
126
126
  * @param config - Retry configuration (merged with defaults)
127
+ * @param hooks - Optional hooks (e.g., onRetry for region rotation)
127
128
  * @returns The result of fn()
128
129
  * @throws The last error if all retries are exhausted
129
130
  *
@@ -136,7 +137,7 @@ function sleep(ms) {
136
137
  * );
137
138
  * ```
138
139
  */
139
- async function retryWithBackoff(fn, context, config) {
140
+ async function retryWithBackoff(fn, context, config, hooks) {
140
141
  const resolvedConfig = {
141
142
  ...exports.DEFAULT_RETRY_CONFIG,
142
143
  ...config,
@@ -155,6 +156,10 @@ async function retryWithBackoff(fn, context, config) {
155
156
  if (!isRetryableError(error) || attempt === resolvedConfig.maxRetries) {
156
157
  throw error;
157
158
  }
159
+ // Notify consumer before retry (e.g., for region rotation on quota errors)
160
+ if (hooks?.onRetry) {
161
+ hooks.onRetry(error, attempt + 1);
162
+ }
158
163
  const errorInfo = getErrorInfo(error);
159
164
  let delayMs = calculateDelay(attempt, resolvedConfig);
160
165
  // Respect Retry-After header if present (use the larger value)
@@ -1 +1 @@
1
- {"version":3,"file":"retry.utils.js","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/utils/retry.utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"retry.utils.js","sourceRoot":"","sources":["../../../../../src/middleware/services/llm/utils/retry.utils.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { ModelConfigKey, ValidatedLLMModelConfig } from '../../shared/config/mod
3
3
  import { ResponseProcessingOptions } from '../../services/response-processor/types';
4
4
  import { BaseAIRequest, BaseAIResult } from '../../shared/types/base-request.types';
5
5
  import { ModelParameterOverrides } from '../../services/model-parameter-manager/model-parameter-manager.service';
6
+ import { MultimodalContent } from '../../services/llm/types/multimodal.types';
6
7
  /**
7
8
  * Base abstract class for all AI use cases
8
9
  * Provides common functionality and enforces configuration for each use case
@@ -86,6 +87,20 @@ export declare abstract class BaseAIUseCase<TPrompt = string, TRequest extends B
86
87
  * This enforces the message pattern: each use case should have a corresponding message file
87
88
  */
88
89
  protected abstract getUserTemplate(): (formattedPrompt: string) => string;
90
+ /**
91
+ * Optional override for multimodal content.
92
+ * When this method returns non-null, the result is sent directly to the provider,
93
+ * bypassing the text-only path (formatUserMessage + getUserTemplate).
94
+ *
95
+ * Override in child classes that need to send images alongside text.
96
+ *
97
+ * @param prompt - The raw prompt data
98
+ * @param request - The full request object
99
+ * @returns MultimodalContent or null (default: null = text-only path)
100
+ *
101
+ * @since 2.22.0
102
+ */
103
+ protected formatMultimodalContent(prompt: TPrompt, request: TRequest): MultimodalContent | null;
89
104
  /**
90
105
  * Override model parameters for this specific use case
91
106
  * Override this method in child classes to customize parameters
@@ -1 +1 @@
1
- {"version":3,"file":"base-ai.usecase.d.ts","sourceRoot":"","sources":["../../../../src/middleware/usecases/base/base-ai.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAkB,cAAc,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5G,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAEpF,OAAO,EAAgC,uBAAuB,EAAE,MAAM,wEAAwE,CAAC;AAG/I;;;;;;GAMG;AACH,8BAAsB,aAAa,CACjC,OAAO,GAAG,MAAM,EAChB,QAAQ,SAAS,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAChE,OAAO,SAAS,YAAY,GAAG,YAAY;IAE3C;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAElD;;;OAGG;IACH,OAAO,CAAC,eAAe,CAAC,CAAW;IAEnC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM;IAItD;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,cAAc,CAAY;IAE9E;;;OAGG;IACH,SAAS,KAAK,cAAc,IAAI,cAAc,CAE7C;IAED;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,sBAAsB,CAAC,GAAG,EAAE,cAAc,GAAG,uBAAuB;IAI9E;;;OAGG;IACH,SAAS,KAAK,WAAW,IAAI,uBAAuB,CAEnD;IAED;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM;IAShD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM;IAEzE;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,IAAI,uBAAuB;IAI1D;;;;OAIG;IACH,SAAS,CAAC,WAAW,IAAI,WAAW;IAIpC;;;;OAIG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA+JzD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,SAAS,CAAC,4BAA4B,IAAI,yBAAyB;IAKnE;;;;;OAKG;cACa,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAKrG;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAC7B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO;CACX"}
1
+ {"version":3,"file":"base-ai.usecase.d.ts","sourceRoot":"","sources":["../../../../src/middleware/usecases/base/base-ai.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAkB,cAAc,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5G,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAEpF,OAAO,EAAgC,uBAAuB,EAAE,MAAM,wEAAwE,CAAC;AAE/I,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAG9E;;;;;;GAMG;AACH,8BAAsB,aAAa,CACjC,OAAO,GAAG,MAAM,EAChB,QAAQ,SAAS,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAChE,OAAO,SAAS,YAAY,GAAG,YAAY;IAE3C;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAElD;;;OAGG;IACH,OAAO,CAAC,eAAe,CAAC,CAAW;IAEnC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM;IAItD;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,cAAc,CAAY;IAE9E;;;OAGG;IACH,SAAS,KAAK,cAAc,IAAI,cAAc,CAE7C;IAED;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,sBAAsB,CAAC,GAAG,EAAE,cAAc,GAAG,uBAAuB;IAI9E;;;OAGG;IACH,SAAS,KAAK,WAAW,IAAI,uBAAuB,CAEnD;IAED;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM;IAShD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM;IAEzE;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG,iBAAiB,GAAG,IAAI;IAI/F;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,IAAI,uBAAuB;IAI1D;;;;OAIG;IACH,SAAS,CAAC,WAAW,IAAI,WAAW;IAIpC;;;;OAIG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA0KzD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,SAAS,CAAC,4BAA4B,IAAI,yBAAyB;IAKnE;;;;;OAKG;cACa,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAKrG;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAC7B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO;CACX"}
@@ -6,6 +6,7 @@ const models_config_1 = require("../../shared/config/models.config");
6
6
  const response_processor_service_1 = require("../../services/response-processor.service");
7
7
  const model_parameter_manager_service_1 = require("../../services/model-parameter-manager/model-parameter-manager.service");
8
8
  const use_case_metrics_logger_1 = require("../../services/use-case-metrics-logger");
9
+ const multimodal_utils_1 = require("../../services/llm/utils/multimodal.utils");
9
10
  /**
10
11
  * Base abstract class for all AI use cases
11
12
  * Provides common functionality and enforces configuration for each use case
@@ -82,6 +83,22 @@ class BaseAIUseCase {
82
83
  // Basic JSON formatting for complex prompts
83
84
  return JSON.stringify(prompt, null, 2);
84
85
  }
86
+ /**
87
+ * Optional override for multimodal content.
88
+ * When this method returns non-null, the result is sent directly to the provider,
89
+ * bypassing the text-only path (formatUserMessage + getUserTemplate).
90
+ *
91
+ * Override in child classes that need to send images alongside text.
92
+ *
93
+ * @param prompt - The raw prompt data
94
+ * @param request - The full request object
95
+ * @returns MultimodalContent or null (default: null = text-only path)
96
+ *
97
+ * @since 2.22.0
98
+ */
99
+ formatMultimodalContent(prompt, request) {
100
+ return null;
101
+ }
85
102
  /**
86
103
  * Override model parameters for this specific use case
87
104
  * Override this method in child classes to customize parameters
@@ -111,11 +128,19 @@ class BaseAIUseCase {
111
128
  this._currentRequest = request;
112
129
  // Get effective system message (may be dynamic based on request)
113
130
  const effectiveSystemMessage = this.getSystemMessage(request);
114
- // Format the raw prompt using formatUserMessage
115
- const formattedPrompt = this.formatUserMessage(request.prompt);
116
- // Apply the user template to create the final message
117
- const userTemplate = this.getUserTemplate();
118
- const formattedUserMessage = userTemplate(formattedPrompt);
131
+ // Check for multimodal content (opt-in by child classes)
132
+ const multimodalContent = this.formatMultimodalContent(request.prompt, request);
133
+ let formattedUserMessage;
134
+ if (multimodalContent !== null) {
135
+ // Multimodal path: use content directly (bypasses text template)
136
+ formattedUserMessage = multimodalContent;
137
+ }
138
+ else {
139
+ // Standard text-only path (unchanged)
140
+ const formattedPrompt = this.formatUserMessage(request.prompt);
141
+ const userTemplate = this.getUserTemplate();
142
+ formattedUserMessage = userTemplate(formattedPrompt);
143
+ }
119
144
  const startTime = Date.now();
120
145
  let success = false;
121
146
  let errorMessage = '';
@@ -134,7 +159,9 @@ class BaseAIUseCase {
134
159
  const effectiveTemperature = request.temperature ?? validatedParams.temperature;
135
160
  const effectiveReasoningEffort = request.reasoningEffort;
136
161
  // Log the start of execution with metrics
137
- use_case_metrics_logger_1.UseCaseMetricsLoggerService.logStart(this.constructor.name, this.modelConfig.name, formattedUserMessage.length, effectiveTemperature, definedParams);
162
+ const messageLength = (0, multimodal_utils_1.contentLength)(formattedUserMessage);
163
+ const messageDebugString = (0, multimodal_utils_1.contentToDebugString)(formattedUserMessage);
164
+ use_case_metrics_logger_1.UseCaseMetricsLoggerService.logStart(this.constructor.name, this.modelConfig.name, messageLength, effectiveTemperature, definedParams);
138
165
  try {
139
166
  // Get the provider for this use case
140
167
  const provider = this.getProvider();
@@ -177,12 +204,12 @@ class BaseAIUseCase {
177
204
  };
178
205
  }
179
206
  // Calculate and log metrics
180
- const metrics = use_case_metrics_logger_1.UseCaseMetricsLoggerService.calculateMetrics(startTime, effectiveSystemMessage, formattedUserMessage, result.message.content, thinking, this.modelConfig.name, success, errorMessage, definedParams, actualTokens // Pass actual tokens from provider
207
+ const metrics = use_case_metrics_logger_1.UseCaseMetricsLoggerService.calculateMetrics(startTime, effectiveSystemMessage, messageDebugString, result.message.content, thinking, this.modelConfig.name, success, errorMessage, definedParams, actualTokens // Pass actual tokens from provider
181
208
  );
182
209
  // Log completion with metrics
183
210
  use_case_metrics_logger_1.UseCaseMetricsLoggerService.logCompletion(this.constructor.name, metrics);
184
211
  // Create the business result from concrete implementation
185
- const businessResult = this.createResult(processedContent, formattedUserMessage, thinking);
212
+ const businessResult = this.createResult(processedContent, messageDebugString, thinking);
186
213
  // Attach usage metadata to result (library responsibility since 2.13.0)
187
214
  // This ensures consistent token/cost data across all use cases
188
215
  const finalResult = {
@@ -194,7 +221,7 @@ class BaseAIUseCase {
194
221
  catch (error) {
195
222
  errorMessage = error instanceof Error ? error.message : 'Unknown error';
196
223
  // Calculate metrics for failed execution
197
- const metrics = use_case_metrics_logger_1.UseCaseMetricsLoggerService.calculateMetrics(startTime, effectiveSystemMessage, formattedUserMessage, '', thinking, this.modelConfig.name, false, errorMessage, definedParams);
224
+ const metrics = use_case_metrics_logger_1.UseCaseMetricsLoggerService.calculateMetrics(startTime, effectiveSystemMessage, messageDebugString, '', thinking, this.modelConfig.name, false, errorMessage, definedParams);
198
225
  // Log completion with error
199
226
  use_case_metrics_logger_1.UseCaseMetricsLoggerService.logCompletion(this.constructor.name, metrics);
200
227
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"base-ai.usecase.js","sourceRoot":"","sources":["../../../../src/middleware/usecases/base/base-ai.usecase.ts"],"names":[],"mappings":";;;AAAA,4CAA6D;AAC7D,qEAA4G;AAC5G,0FAAqF;AAIrF,4HAA+I;AAC/I,oFAAqF;AAErF;;;;;;GAMG;AACH,MAAsB,aAAa;IAiBjC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACO,gBAAgB,CAAC,OAAkB;QAC3C,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAQD;;;OAGG;IACH,IAAc,cAAc;QAC1B,OAAQ,IAAI,CAAC,WAAoC,CAAC,wBAAwB,CAAC;IAC7E,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACO,sBAAsB,CAAC,GAAmB;QAClD,OAAO,IAAA,8BAAc,EAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAc,WAAW;QACvB,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACO,iBAAiB,CAAC,MAAW;QACrC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,4CAA4C;QAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IASD;;;;OAIG;IACO,qBAAqB;QAC7B,OAAO,EAAE,CAAC,CAAC,wBAAwB;IACrC,CAAC;IAED;;;;OAIG;IACO,WAAW;QACnB,OAAO,iBAAW,CAAC,MAAM,CAAC,CAAC,6CAA6C;IAC1E,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,OAAO,CAAC,OAAiB;QACpC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAE/B,iEAAiE;QACjE,MAAM,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE9D,gDAAgD;QAChD,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE/D,sDAAsD;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,oBAAoB,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,4CAA4C;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE/C,6DAA6D;QAC7D,MAAM,eAAe,GAAG,8DAA4B,CAAC,sBAAsB,CACzE;YACE,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW;SAC1C,EACD,SAAS,CACV,CAAC;QAEF,sBAAsB;QACtB,MAAM,eAAe,GAAG,8DAA4B,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;QACzF,MAAM,aAAa,GAAG,8DAA4B,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;QAEzF,2EAA2E;QAC3E,sDAAsD;QACtD,MAAM,oBAAoB,GAAG,OAAO,CAAC,WAAW,IAAI,eAAe,CAAC,WAAW,CAAC;QAChF,MAAM,wBAAwB,GAAG,OAAO,CAAC,eAAe,CAAC;QAEzD,0CAA0C;QAC1C,qDAA2B,CAAC,QAAQ,CAClC,IAAI,CAAC,WAAW,CAAC,IAAI,EACrB,IAAI,CAAC,WAAW,CAAC,IAAI,EACrB,oBAAoB,CAAC,MAAM,EAC3B,oBAAoB,EACpB,aAAa,CACd,CAAC;QAEF,IAAI,CAAC;YACH,qCAAqC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAEpC,oDAAoD;YACpD,MAAM,MAAM,GAAG,MAAM,gBAAU,CAAC,qBAAqB,CACnD,oBAAoB,EACpB,sBAAsB,EACtB;gBACE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;gBAC5B,WAAW,EAAE,oBAAoB;gBACjC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW;gBACvC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO;gBACjC,QAAQ,EAAE,QAAQ;gBAClB,4EAA4E;gBAC5E,oFAAoF;gBACpF,SAAS,EAAE,eAAe,CAAC,UAAU;gBACrC,2EAA2E;gBAC3E,GAAG,8DAA4B,CAAC,eAAe,CAAC,eAAe,CAAC;gBAChE,wDAAwD;gBACxD,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;gBACnE,gFAAgF;gBAChF,GAAG,CAAC,wBAAwB,IAAI,EAAE,eAAe,EAAE,wBAAwB,EAAE,CAAC;gBAC9E,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;aACpC,CACF,CAAC;YAEF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YAED,4FAA4F;YAC5F,yFAAyF;YACzF,mEAAmE;YACnE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,yBAAyB,EAAE,GAC1E,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAErD,2EAA2E;YAC3E,6EAA6E;YAC7E,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,yBAAyB,CAAC;YAChE,OAAO,GAAG,IAAI,CAAC;YAEf,kEAAkE;YAClE,IAAI,YAAyE,CAAC;YAE9E,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,mDAAmD;gBACnD,YAAY,GAAG;oBACb,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;oBACrC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;iBACxC,CAAC;YACJ,CAAC;YAED,4BAA4B;YAC5B,MAAM,OAAO,GAAG,qDAA2B,CAAC,gBAAgB,CAC1D,SAAS,EACT,sBAAsB,EACtB,oBAAoB,EACpB,MAAM,CAAC,OAAO,CAAC,OAAO,EACtB,QAAQ,EACR,IAAI,CAAC,WAAW,CAAC,IAAI,EACrB,OAAO,EACP,YAAY,EACZ,aAAa,EACb,YAAY,CAAE,mCAAmC;aAClD,CAAC;YAEF,8BAA8B;YAC9B,qDAA2B,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE1E,0DAA0D;YAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CACtC,gBAAgB,EAChB,oBAAoB,EACpB,QAAQ,CACT,CAAC;YAEF,wEAAwE;YACxE,+DAA+D;YAC/D,MAAM,WAAW,GAAG;gBAClB,GAAG,cAAc;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;aACT,CAAC;YAEb,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAExE,yCAAyC;YACzC,MAAM,OAAO,GAAG,qDAA2B,CAAC,gBAAgB,CAC1D,SAAS,EACT,sBAAsB,EACtB,oBAAoB,EACpB,EAAE,EACF,QAAQ,EACR,IAAI,CAAC,WAAW,CAAC,IAAI,EACrB,KAAK,EACL,YAAY,EACZ,aAAa,CACd,CAAC;YAEF,4BAA4B;YAC5B,qDAA2B,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE1E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACO,4BAA4B;QACpC,kDAAkD;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;;OAKG;IACO,KAAK,CAAC,eAAe,CAAC,QAAgB;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpD,OAAO,qDAAwB,CAAC,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;;AAxUH,sCA8VC;AAnTC;;;GAGG;AACuB,sCAAwB,GAAmB,QAAQ,CAAC"}
1
+ {"version":3,"file":"base-ai.usecase.js","sourceRoot":"","sources":["../../../../src/middleware/usecases/base/base-ai.usecase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loonylabs/llm-middleware",
3
- "version": "2.21.0",
3
+ "version": "2.23.0",
4
4
  "description": "Complete middleware infrastructure for LLM-based backends with multi-provider support (Ollama, Anthropic, OpenAI, Google)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -31,6 +31,7 @@
31
31
  "test:live": "LLM_INTEGRATION_TESTS=true jest tests/integration/*.integration.test.ts --testTimeout=120000",
32
32
  "test:reasoning:smoke": "ts-node tests/manual/reasoning-smoke-test.ts",
33
33
  "test:cache:smoke": "ts-node tests/manual/cache-smoke-test.ts",
34
+ "test:vision:smoke": "ts-node tests/manual/vision-smoke-test.ts",
34
35
  "test:ci": "jest --runInBand --ci --coverage",
35
36
  "lint": "eslint src/**/*.ts",
36
37
  "clean": "node -e \"const fs=require('fs');if(fs.existsSync('dist'))fs.rmSync('dist',{recursive:true})\"",